private DocumentCompositeNode GetResourceNode(RegroupToResourceCommand.ConvertibleBrushReference brushReference)
        {
            ResourceItem resourceItem = this.FindResourceItem(brushReference);

            if (resourceItem != null)
            {
                return((DocumentCompositeNode)resourceItem.DocumentNode);
            }
            ResourceContainer resourceContainer = this.designerContext.ResourceManager.FindResourceContainer(brushReference.DocumentUrl);

            resourceContainer.EnsureEditable();
            CreateResourceModel createResourceModel = new CreateResourceModel(resourceContainer.ViewModel, resourceContainer.ViewModel.DesignerContext.ResourceManager, typeof(DrawingBrush), (Type)null, (string)null, (SceneElement)null, (SceneNode)null, CreateResourceModel.ContextFlags.None);

            createResourceModel.SelectedLocation = (object)resourceContainer.ViewModel.Document;
            createResourceModel.KeyString        = brushReference.Key;
            DocumentCompositeNode documentCompositeNode = (DocumentCompositeNode)null;

            createResourceModel.SelectedExternalResourceDictionaryFile = resourceContainer;
            using (SceneEditTransaction editTransaction = resourceContainer.ViewModel.CreateEditTransaction(StringTable.CreateResourceDialogTitle))
            {
                documentCompositeNode = resourceContainer.ViewModel.Document.DocumentContext.CreateNode(typeof(DrawingBrush));
                documentCompositeNode = createResourceModel.CreateResource((DocumentNode)documentCompositeNode, (IPropertyId)null, -1);
                editTransaction.Commit();
            }
            return(documentCompositeNode);
        }
        public override void Execute()
        {
            SceneElement closestValidCanvas = this.FindClosestValidCanvas(this.designerContext.SelectionManager.ElementSelectionSet.Selection);

            if (closestValidCanvas == null)
            {
                return;
            }
            RegroupToResourceCommand.ConvertibleBrushReference brushReference = new RegroupToResourceCommand.ConvertibleBrushReference(closestValidCanvas);
            ResourceContainer resourceContainer = this.designerContext.ResourceManager.FindResourceContainer(brushReference.DocumentUrl);

            using (SceneEditTransaction editTransaction1 = this.designerContext.ActiveSceneViewModel.CreateEditTransaction(this.UndoUnitString))
            {
                using (SceneEditTransaction editTransaction2 = resourceContainer.ViewModel.CreateEditTransaction(this.UndoUnitString))
                {
                    DocumentCompositeNode resourceNode = this.GetResourceNode(brushReference);
                    DocumentNode          documentNode = resourceNode.Properties[DictionaryEntryNode.ValueProperty];
                    this.designerContext.SelectionManager.ElementSelectionSet.SetSelection(closestValidCanvas);
                    if (!typeof(DrawingBrush).IsAssignableFrom(documentNode.TargetType))
                    {
                        throw new NotSupportedException("Regroup to resource not enabled on non-DrawingBrush types.");
                    }
                    new RegroupToResourceCommand.ReplaceDrawingBrushCommand(this.designerContext.ActiveSceneViewModel, resourceNode).Execute();
                    this.PostProcess(closestValidCanvas);
                    editTransaction2.Commit();
                    editTransaction1.Commit();
                }
            }
        }
        private bool CanUseBrushReference(RegroupToResourceCommand.ConvertibleBrushReference brushReference)
        {
            if (!brushReference.HasReferenceInfo)
            {
                return(false);
            }
            ResourceEntryItem resourceEntryItem = this.FindResourceItem(brushReference) as ResourceEntryItem;

            if (resourceEntryItem != null)
            {
                return(RegroupToResourceCommand.IsTypeSupported(resourceEntryItem.Resource.ValueNode.TargetType));
            }
            return(this.designerContext.ResourceManager.FindResourceContainer(brushReference.DocumentUrl) != null);
        }
        private ResourceItem FindResourceItem(RegroupToResourceCommand.ConvertibleBrushReference brushReference)
        {
            ResourceContainer resourceContainer = this.designerContext.ResourceManager.FindResourceContainer(brushReference.DocumentUrl);

            if (resourceContainer != null)
            {
                foreach (ResourceItem resourceItem in (Collection <ResourceItem>)resourceContainer.ResourceItems)
                {
                    ResourceEntryItem resourceEntryItem = resourceItem as ResourceEntryItem;
                    if (resourceEntryItem != null && DocumentPrimitiveNode.GetValueAsString(resourceEntryItem.Resource.KeyNode) == brushReference.Key)
                    {
                        return((ResourceItem)resourceEntryItem);
                    }
                }
            }
            return((ResourceItem)null);
        }