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); }
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); } }
/// <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); }