Exemplo n.º 1
0
            public DependencyFlagCache(ProjectTreeFlags add = default, ProjectTreeFlags remove = default)
            {
                // The 'isResolved' dimension determines whether we start with generic resolved or unresolved dependency flags.
                // We then add (union) and remove (except) any other flags as instructed.

                ProjectTreeFlags resolved   = DependencyTreeFlags.GenericResolvedDependencyFlags.Union(add).Except(remove);
                ProjectTreeFlags unresolved = DependencyTreeFlags.GenericUnresolvedDependencyFlags.Union(add).Except(remove);

                // The 'isImplicit' dimension only enforces, when true, that the dependency cannot be removed.

                _lookup = new ProjectTreeFlags[4];
                _lookup[Index(isResolved: true, isImplicit: false)]  = resolved;
                _lookup[Index(isResolved: true, isImplicit: true)]   = resolved.Except(DependencyTreeFlags.SupportsRemove);
                _lookup[Index(isResolved: false, isImplicit: false)] = unresolved;
                _lookup[Index(isResolved: false, isImplicit: true)]  = unresolved.Except(DependencyTreeFlags.SupportsRemove);
            }
        private static ProjectTreeFlags FilterFlags(
            ProjectTreeFlags flags,
            ProjectTreeFlags?additionalFlags,
            ProjectTreeFlags?excludedFlags)
        {
            if (additionalFlags.HasValue)
            {
                flags = flags.Union(additionalFlags.Value);
            }

            if (excludedFlags.HasValue)
            {
                flags = flags.Except(excludedFlags.Value);
            }

            return(flags);
        }
Exemplo n.º 3
0
        private IProjectTree CreateOrUpdateNode(
            IProjectTree?node,
            IDependencyViewModel viewModel,
            IRule?browseObjectProperties,
            bool isProjectItem,
            ProjectTreeFlags?additionalFlags = null,
            ProjectTreeFlags?excludedFlags   = null)
        {
            if (node != null)
            {
                return(UpdateTreeNode());
            }

            string?filePath = viewModel.OriginalModel != null &&
                              viewModel.OriginalModel.TopLevel &&
                              viewModel.OriginalModel.Resolved
                ? viewModel.OriginalModel.GetTopLevelId()
                : viewModel.FilePath;

            ProjectTreeFlags filteredFlags = FilterFlags(viewModel.Flags);

            return(isProjectItem
                ? CreateProjectItemTreeNode()
                : CreateProjectTreeNode());

            IProjectTree CreateProjectTreeNode()
            {
                // For IProjectTree remove ProjectTreeFlags.Common.Reference flag, otherwise CPS would fail to
                // map this node to graph node and GraphProvider would be never called.
                // Only IProjectItemTree can have this flag
                filteredFlags = filteredFlags.Except(DependencyTreeFlags.BaseReferenceFlags);

                return(_treeServices.CreateTree(
                           caption: viewModel.Caption,
                           filePath,
                           browseObjectProperties: browseObjectProperties,
                           icon: viewModel.Icon.ToProjectSystemType(),
                           expandedIcon: viewModel.ExpandedIcon.ToProjectSystemType(),
                           visible: true,
                           flags: filteredFlags));
            }

            IProjectTree CreateProjectItemTreeNode()
            {
                Assumes.NotNull(filePath);

                var itemContext = ProjectPropertiesContext.GetContext(
                    _commonServices.Project,
                    file: filePath,
                    itemType: viewModel.SchemaItemType,
                    itemName: filePath);

                return(_treeServices.CreateTree(
                           caption: viewModel.Caption,
                           itemContext: itemContext,
                           browseObjectProperties: browseObjectProperties,
                           icon: viewModel.Icon.ToProjectSystemType(),
                           expandedIcon: viewModel.ExpandedIcon.ToProjectSystemType(),
                           visible: true,
                           flags: filteredFlags));
            }

            IProjectTree UpdateTreeNode()
            {
                var updatedNodeParentContext = new ProjectTreeCustomizablePropertyContext
                {
                    ExistsOnDisk    = false,
                    ParentNodeFlags = node !.Parent?.Flags ?? default
                };

                var updatedValues = new ReferencesProjectTreeCustomizablePropertyValues
                {
                    Caption      = viewModel.Caption,
                    Flags        = viewModel.Flags,
                    Icon         = viewModel.Icon.ToProjectSystemType(),
                    ExpandedIcon = viewModel.ExpandedIcon.ToProjectSystemType()
                };

                foreach (Lazy <IProjectTreePropertiesProvider, IOrderPrecedenceMetadataView> provider in _projectTreePropertiesProviders)
                {
                    provider.Value.CalculatePropertyValues(updatedNodeParentContext, updatedValues);
                }

                return(node.SetProperties(
                           caption: updatedValues.Caption,
                           browseObjectProperties: browseObjectProperties,
                           icon: updatedValues.Icon,
                           expandedIcon: updatedValues.ExpandedIcon,
                           flags: updatedValues.Flags));
            }

            ProjectTreeFlags FilterFlags(ProjectTreeFlags flags)
            {
                if (additionalFlags.HasValue)
                {
                    flags = flags.Union(additionalFlags.Value);
                }

                if (excludedFlags.HasValue)
                {
                    flags = flags.Except(excludedFlags.Value);
                }

                return(flags);
            }
        }
Exemplo n.º 4
0
        /// <summary>
        ///     Returns a value indicating whether the specified flags exist.
        /// </summary>
        public static bool Contains(this ProjectTreeFlags source, ProjectTreeFlags flags)
        {
            ProjectTreeFlags newFlags = source.Except(flags);

            return((source.Count - newFlags.Count) == flags.Count);
        }