コード例 #1
0
        public static void CopyBehaviorNodes(SceneViewModel viewModel, IList <BehaviorBaseNode> behaviorNodes)
        {
            PastePackage pastePackage = new PastePackage(viewModel);

            using (viewModel.ForceBaseValue())
            {
                foreach (SceneNode childPropertyNode in (IEnumerable <BehaviorBaseNode>)behaviorNodes)
                {
                    if (ProjectNeutralTypes.Behavior.IsAssignableFrom((ITypeId)childPropertyNode.Type))
                    {
                        pastePackage.AddChildPropertyNode(childPropertyNode);
                    }
                    else
                    {
                        BehaviorTriggerActionNode triggerActionNode1      = (BehaviorTriggerActionNode)childPropertyNode;
                        BehaviorTriggerBaseNode   behaviorTriggerBaseNode = (BehaviorTriggerBaseNode)triggerActionNode1.Parent;
                        if (behaviorTriggerBaseNode.Actions.Count > 1)
                        {
                            DocumentNode node1 = triggerActionNode1.DocumentNode.Clone(viewModel.Document.DocumentContext);
                            BehaviorTriggerActionNode triggerActionNode2 = (BehaviorTriggerActionNode)viewModel.GetSceneNode(node1);
                            DocumentNode node2 = behaviorTriggerBaseNode.DocumentNode.Clone(viewModel.Document.DocumentContext);
                            behaviorTriggerBaseNode = (BehaviorTriggerBaseNode)viewModel.GetSceneNode(node2);
                            behaviorTriggerBaseNode.Actions.Clear();
                            behaviorTriggerBaseNode.Actions.Add((SceneNode)triggerActionNode2);
                        }
                        pastePackage.AddChildPropertyNode((SceneNode)behaviorTriggerBaseNode);
                    }
                }
            }
            pastePackage.SendToClipboard();
        }
コード例 #2
0
ファイル: ResourceHelper.cs プロジェクト: radtek/Shopdrawing
        private static void CreateImageReferenceMapHelper(PastePackage pastePackage, SceneViewModel viewModel, Dictionary <DocumentNode, string> candidateNodes, DocumentNode descendant)
        {
            DocumentPrimitiveNode documentPrimitiveNode = descendant as DocumentPrimitiveNode;

            if (documentPrimitiveNode == null)
            {
                return;
            }
            Uri uriValue = documentPrimitiveNode.GetUriValue();

            if (uriValue == (Uri)null)
            {
                return;
            }
            foreach (KeyValuePair <string, KeyValuePair <Uri, string> > keyValuePair in pastePackage.ImageReferences)
            {
                if (keyValuePair.Key == uriValue.OriginalString)
                {
                    Uri          key1 = keyValuePair.Value.Key;
                    DocumentNode key2 = (DocumentNode)viewModel.Document.DocumentContext.CreateNode((ITypeId)documentPrimitiveNode.Type, (IDocumentNodeValue) new DocumentNodeStringValue(key1.OriginalString));
                    if (documentPrimitiveNode.IsProperty)
                    {
                        documentPrimitiveNode.Parent.Properties[(IPropertyId)documentPrimitiveNode.SitePropertyKey] = key2;
                    }
                    else
                    {
                        documentPrimitiveNode.Parent.Children[documentPrimitiveNode.SiteChildIndex] = key2;
                    }
                    candidateNodes.Add(key2, keyValuePair.Key);
                }
            }
        }
コード例 #3
0
        public static void CopyPropertyNodes(SceneViewModel viewModel, IList <SceneNode> nodes)
        {
            if (nodes.Count == 0)
            {
                return;
            }
            PastePackage pastePackage = new PastePackage(viewModel);

            using (viewModel.ForceBaseValue())
                pastePackage.AddChildPropertyNodes(nodes);
            pastePackage.SendToClipboard();
        }
コード例 #4
0
ファイル: ResourceHelper.cs プロジェクト: radtek/Shopdrawing
        internal static bool PasteResources(PastePackage pastePackage, IDictionary <DocumentNode, string> imageMap, ResourceConflictResolution itemsToDisplay, SceneNode destination, int index, bool lastResourceIsPrimary)
        {
            SceneViewModel             viewModel = destination.ViewModel;
            List <DictionaryEntryNode> list1     = new List <DictionaryEntryNode>((IEnumerable <DictionaryEntryNode>)pastePackage.Resources);

            if (list1.Count == 0)
            {
                return(true);
            }
            bool flag = true;
            IList <ResourceEvaluation> list2 = ResourceHelper.EvaluateResources((IList <DictionaryEntryNode>)list1, destination);
            ResourceConflictResolution conflictResolution = ResourceConflictResolution.Undetermined;

            if (ResourceHelper.CheckEvaluationResults(list2, ResourceEvaluationResult.ConflictingResourceExists, ResourceEvaluationResult.ConflictingResourceIsMasked))
            {
                conflictResolution = ResourceHelper.PromptForResourceConflictResolution(itemsToDisplay);
                if (conflictResolution == ResourceConflictResolution.Undetermined)
                {
                    flag = false;
                }
            }
            if (flag)
            {
                foreach (ResourceEvaluation resourceEvaluation in (IEnumerable <ResourceEvaluation>)list2)
                {
                    ResourceHelper.UpdateImageReferences(resourceEvaluation.OriginalResource.Value.DocumentNode, imageMap, pastePackage, viewModel);
                }
                List <SceneNode> list3 = new List <SceneNode>(pastePackage.Elements.Count);
                foreach (SceneElement sceneElement in pastePackage.Elements)
                {
                    list3.Add((SceneNode)sceneElement);
                }
                ResourceEvaluation resourceEvaluation1 = list2[list2.Count - 1];
                if (lastResourceIsPrimary)
                {
                    list2.RemoveAt(list2.Count - 1);
                    int num = ResourceHelper.AddResources(list2, (IList <SceneNode>)list3, conflictResolution, destination, index);
                    if (ResourceHelper.CheckEvaluationResult(resourceEvaluation1, ResourceEvaluationResult.IdenticalResourceExists))
                    {
                        conflictResolution = ResourceConflictResolution.RenameNew;
                    }
                    ResourceHelper.AddPrimaryResource(resourceEvaluation1, (IList <SceneNode>)list3, conflictResolution, destination, index + num);
                }
                else
                {
                    ResourceHelper.AddResources(list2, (IList <SceneNode>)list3, conflictResolution, destination, index);
                }
            }
            return(flag);
        }
コード例 #5
0
        public static void CopyElements(SceneViewModel viewModel, List <SceneElement> elements)
        {
            if (elements.Count == 0 || !CopyCommand.ElementsHaveSameParent((ICollection <SceneElement>)elements))
            {
                return;
            }
            PerformanceUtility.StartPerformanceSequence(PerformanceEvent.CopyElements);
            SceneNode    parent       = elements[0].Parent;
            PastePackage pastePackage = new PastePackage(viewModel);

            using (viewModel.ForceBaseValue())
                pastePackage.AddElements(elements, true);
            pastePackage.SendToClipboard();
            PerformanceUtility.EndPerformanceSequence(PerformanceEvent.CopyElements);
        }
コード例 #6
0
ファイル: ResourcePane.cs プロジェクト: radtek/Shopdrawing
 private bool CopyResourceCore()
 {
     if (this.resourceManager.SelectedResourceContainers.Count == 0 && this.resourceManager.SelectedResourceItems.Count == 1)
     {
         ResourceEntryItem resourceEntryItem = this.resourceManager.SelectedResourceItems[0] as ResourceEntryItem;
         if (resourceEntryItem != null)
         {
             SceneViewModel viewModel    = resourceEntryItem.Container.ViewModel;
             PastePackage   pastePackage = new PastePackage(viewModel);
             pastePackage.AddResource(viewModel.GetSceneNode((DocumentNode)resourceEntryItem.Resource.ResourceNode) as DictionaryEntryNode);
             pastePackage.SendToClipboard();
             return(true);
         }
     }
     return(false);
 }
コード例 #7
0
        public static void CopyKeyframes(SceneViewModel viewModel, SceneElement targetElement, ICollection <KeyFrameSceneNode> keyframes)
        {
            if (keyframes.Count == 0)
            {
                return;
            }
            List <KeyFrameSceneNode> list = new List <KeyFrameSceneNode>(keyframes.Count);

            foreach (KeyFrameSceneNode keyFrameSceneNode in (IEnumerable <KeyFrameSceneNode>)keyframes)
            {
                if (keyFrameSceneNode.KeyFrameAnimation.TargetElement == targetElement)
                {
                    list.Add(keyFrameSceneNode);
                }
            }
            PastePackage pastePackage = new PastePackage(viewModel);

            pastePackage.AddKeyframes((ICollection <KeyFrameSceneNode>)list);
            pastePackage.SendToClipboard();
        }
コード例 #8
0
ファイル: ResourcePane.cs プロジェクト: radtek/Shopdrawing
        private void PasteResource()
        {
            int index = -1;
            ResourceContainer container = (ResourceContainer)null;

            if (this.resourceManager.SelectedResourceContainers.Count == 1)
            {
                container = this.resourceManager.SelectedResourceContainers[0];
                index     = container.ResourceItems.Count;
            }
            else if (this.resourceManager.SelectedResourceItems.Count == 1)
            {
                ResourceItem resourceItem = this.resourceManager.SelectedResourceItems[0];
                container = resourceItem.Container;
                index     = container.ResourceItems.IndexOf(resourceItem) + 1;
            }
            SafeDataObject dataObject = SafeDataObject.FromClipboard();

            if (index < 0)
            {
                return;
            }
            SceneViewModel viewModel    = container.ViewModel;
            PastePackage   pastePackage = PastePackage.FromData(viewModel, dataObject);

            if (pastePackage != null)
            {
                if (pastePackage.Elements.Count > 0)
                {
                    viewModel.DesignerContext.MessageDisplayService.ShowError(StringTable.PasteResourcesFailedElementsFoundDialogMessage);
                }
                else
                {
                    IDictionary <DocumentNode, string> imageMap = (IDictionary <DocumentNode, string>) new Dictionary <DocumentNode, string>();
                    foreach (SceneNode sceneNode in pastePackage.Resources)
                    {
                        foreach (KeyValuePair <DocumentNode, string> keyValuePair in (IEnumerable <KeyValuePair <DocumentNode, string> >)Microsoft.Expression.DesignSurface.Utility.ResourceHelper.CreateImageReferenceMap(sceneNode.DocumentNode, pastePackage, viewModel))
                        {
                            imageMap.Add(keyValuePair);
                        }
                    }
                    using (SceneEditTransaction editTransaction = viewModel.CreateEditTransaction(StringTable.UndoUnitPaste))
                    {
                        Microsoft.Expression.DesignSurface.Utility.ResourceHelper.PasteResources(pastePackage, imageMap, ResourceConflictResolution.RenameNew | ResourceConflictResolution.OverwriteOld, container.Node, index, true);
                        editTransaction.Commit();
                    }
                }
            }
            else if (dataObject.GetDataPresent(DataFormats.FileDrop))
            {
                DesignerContext designerContext        = viewModel.DesignerContext;
                IDocumentType[] supportedDocumentTypes = new IDocumentType[1]
                {
                    designerContext.DocumentTypeManager.DocumentTypes[DocumentTypeNamesHelper.Image]
                };
                string[] supportedFiles = new FileDropUtility(designerContext.ProjectManager, (FrameworkElement)null, supportedDocumentTypes).GetSupportedFiles(ClipboardService.GetDataObject());
                if (supportedFiles.Length > 0)
                {
                    foreach (IProjectItem projectItem in designerContext.ActiveProject.AddItems(Enumerable.Select <string, DocumentCreationInfo>((IEnumerable <string>)supportedFiles, (Func <string, DocumentCreationInfo>)(file => new DocumentCreationInfo()
                    {
                        SourcePath = file
                    }))))
                    {
                        this.CreateImageBrushResource(container, projectItem);
                    }
                }
                else
                {
                    designerContext.MessageDisplayService.ShowError(StringTable.PasteElementsFailedDialogMessage);
                }
            }
            else
            {
                if (!dataObject.GetDataPresent(DataFormats.Bitmap))
                {
                    return;
                }
                IProject project = EnumerableExtensions.SingleOrNull <IProject>(this.projectManager.ItemSelectionSet.SelectedProjects);
                if (project == null)
                {
                    return;
                }
                IProjectItem projectItem = CutBuffer.AddImageDataFromClipboard(this.projectManager, project);
                this.CreateImageBrushResource(container, projectItem);
            }
        }
コード例 #9
0
ファイル: ResourceHelper.cs プロジェクト: radtek/Shopdrawing
 private static IProjectItem CreateItemForImage(SceneViewModel viewModel, DocumentReference localPath, PastePackage pastePackage)
 {
     try
     {
         IProject project           = ResourceHelper.ProjectFromViewModel(viewModel);
         string   directoryName     = Path.GetDirectoryName(ResourceHelper.DocumentContextFromViewModel(viewModel).DocumentUrl.TrimEnd(Path.DirectorySeparatorChar));
         string   availableFilePath = ProjectPathHelper.GetAvailableFilePath(Path.GetFileName(localPath.Path), directoryName, project, true);
         using (Stream stream = pastePackage.ImageStreams[localPath.Path].GetStream())
         {
             using (FileStream fileStream = File.Create(availableFilePath, (int)stream.Length, FileOptions.RandomAccess))
                 Microsoft.Expression.Framework.Clipboard.Container.CopyStream(stream, (Stream)fileStream);
         }
         IDocumentType documentType = project.GetDocumentType(localPath.Path);
         IProjectItem  projectItem  = project.AddItem(new DocumentCreationInfo()
         {
             DocumentType = documentType,
             TargetPath   = availableFilePath,
             TargetFolder = directoryName
         });
         if (projectItem != null)
         {
             viewModel.DesignerContext.ProjectManager.ItemSelectionSet.SetSelection((IDocumentItem)projectItem);
         }
         return(projectItem);
     }
     catch (Exception ex)
     {
         viewModel.DesignerContext.MessageDisplayService.ShowError(string.Format((IFormatProvider)CultureInfo.CurrentCulture, StringTable.PasteElementsParseFailedDialogMessage, new object[1]
         {
             (object)ex.Message
         }));
     }
     return((IProjectItem)null);
 }
コード例 #10
0
ファイル: ResourceHelper.cs プロジェクト: radtek/Shopdrawing
 internal static void UpdateImageReferences(DocumentNode parentNode, IDictionary <DocumentNode, string> imageMap, PastePackage pastePackage, SceneViewModel viewModel)
 {
     foreach (DocumentNode key1 in parentNode.DescendantNodes)
     {
         if (imageMap.ContainsKey(key1))
         {
             string index = imageMap[key1];
             KeyValuePair <Uri, string> keyValuePair = pastePackage.ImageReferences[index];
             Uri key2 = keyValuePair.Key;
             DocumentReference documentReference = DocumentReference.Create(keyValuePair.Value);
             if (!ResourceHelper.IsResourceInSameProject(viewModel, documentReference, key2))
             {
                 IProjectItem itemForImage = ResourceHelper.CreateItemForImage(viewModel, documentReference, pastePackage);
                 if (itemForImage != null)
                 {
                     documentReference = itemForImage.DocumentReference;
                 }
             }
             IDocumentContext referencingDocument = ResourceHelper.DocumentContextFromViewModel(viewModel);
             string           str = (ResourceHelper.MakeResourceReference(referencingDocument, documentReference) ?? key2).OriginalString;
             if (viewModel.Document.ProjectContext.IsCapabilitySet(PlatformCapability.ShouldSanitizeResourceReferences))
             {
                 str = str.Replace(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar);
             }
             DocumentNode documentNode = (DocumentNode)referencingDocument.CreateNode((ITypeId)key1.Type, (IDocumentNodeValue) new DocumentNodeStringValue(str));
             if (key1.IsProperty)
             {
                 key1.Parent.Properties[(IPropertyId)key1.SitePropertyKey] = documentNode;
             }
             else
             {
                 key1.Parent.Children[key1.SiteChildIndex] = documentNode;
             }
         }
     }
 }
コード例 #11
0
ファイル: ResourceHelper.cs プロジェクト: radtek/Shopdrawing
        internal static IDictionary <DocumentNode, string> CreateImageReferenceMap(DocumentNode documentNode, PastePackage pastePackage, SceneViewModel viewModel)
        {
            Dictionary <DocumentNode, string> candidateNodes = new Dictionary <DocumentNode, string>();

            ResourceHelper.CreateImageReferenceMapHelper(pastePackage, viewModel, candidateNodes, documentNode);
            foreach (DocumentNode descendant in documentNode.DescendantNodes)
            {
                ResourceHelper.CreateImageReferenceMapHelper(pastePackage, viewModel, candidateNodes, descendant);
            }
            return((IDictionary <DocumentNode, string>)candidateNodes);
        }
コード例 #12
0
ファイル: PasteCommand.cs プロジェクト: radtek/Shopdrawing
        private static ISceneInsertionPoint ComputeNewInsertionPoint(SceneViewModel viewModel, ISceneInsertionPoint insertionPoint, PastePackage pastePackage)
        {
            if (pastePackage.Elements.Count == 0 || viewModel.ElementSelectionSet.Count == 0 || !viewModel.ElementSelectionSet.PrimarySelection.IsAncestorOf((SceneNode)insertionPoint.SceneElement))
            {
                return(insertionPoint);
            }
            string copyElementToken = pastePackage.ClipboardCopyElementToken;

            if (!string.IsNullOrEmpty(copyElementToken) && copyElementToken.Equals(PastePackage.GlobalCopyElementToken))
            {
                SceneElement parentElement = viewModel.ElementSelectionSet.PrimarySelection.ParentElement;
                if (parentElement != null && parentElement.IsViewObjectValid && (viewModel.ActiveEditingContainer.IsAncestorOf((SceneNode)parentElement) && !ElementUtilities.HasVisualTreeAncestorOfType(parentElement.ViewObject.PlatformSpecificObject as DependencyObject, typeof(Viewport2DVisual3D))))
                {
                    insertionPoint = parentElement.DefaultInsertionPoint;
                }
            }
            return(insertionPoint);
        }
コード例 #13
0
ファイル: PasteCommand.cs プロジェクト: radtek/Shopdrawing
        private static ICollection <SceneNode> PasteData(SceneViewModel viewModel, SafeDataObject dataObject, ISceneInsertionPoint insertionPoint, bool allowInsertionPointChange, out bool canceledPasteOperation)
        {
            PerformanceUtility.MeasurePerformanceUntilRender(PerformanceEvent.PasteElements);
            canceledPasteOperation = false;
            List <SceneNode> list         = new List <SceneNode>();
            PastePackage     pastePackage = PastePackage.FromData(viewModel, dataObject);

            if (pastePackage != null)
            {
                if (allowInsertionPointChange)
                {
                    insertionPoint = PasteCommand.ComputeNewInsertionPoint(viewModel, insertionPoint, pastePackage);
                }
                if (!PasteCommand.CanAddMultipleElements(insertionPoint.SceneElement, pastePackage.Elements.Count))
                {
                    string name = insertionPoint.SceneElement.TargetType.Name;
                    viewModel.DesignerContext.MessageDisplayService.ShowError(string.Format((IFormatProvider)CultureInfo.CurrentCulture, StringTable.PasteMultipleInSingleContainerError, new object[1]
                    {
                        (object)name
                    }));
                }
                else if (pastePackage.Elements.Count == 0 && pastePackage.Storyboards.Count == 0 && pastePackage.Resources.Count > 0)
                {
                    viewModel.DesignerContext.MessageDisplayService.ShowError(StringTable.PasteElementsFailedNoElementsDialogMessage);
                }
                else
                {
                    IDictionary <DocumentNode, string> imageMap = (IDictionary <DocumentNode, string>) new Dictionary <DocumentNode, string>();
                    foreach (SceneNode sceneNode in pastePackage.Elements)
                    {
                        foreach (KeyValuePair <DocumentNode, string> keyValuePair in (IEnumerable <KeyValuePair <DocumentNode, string> >)Microsoft.Expression.DesignSurface.Utility.ResourceHelper.CreateImageReferenceMap(sceneNode.DocumentNode, pastePackage, viewModel))
                        {
                            imageMap.Add(keyValuePair);
                        }
                    }
                    foreach (SceneNode sceneNode in pastePackage.Resources)
                    {
                        foreach (KeyValuePair <DocumentNode, string> keyValuePair in (IEnumerable <KeyValuePair <DocumentNode, string> >)Microsoft.Expression.DesignSurface.Utility.ResourceHelper.CreateImageReferenceMap(sceneNode.DocumentNode, pastePackage, viewModel))
                        {
                            imageMap.Add(keyValuePair);
                        }
                    }
                    int index = 0;
                    ISupportsResources resourcesCollection = ResourceNodeHelper.GetResourcesCollection(viewModel.RootNode.DocumentNode);
                    if (resourcesCollection != null && resourcesCollection.Resources != null && resourcesCollection.Resources.SupportsChildren)
                    {
                        index = resourcesCollection.Resources.Children.Count;
                    }
                    if (Microsoft.Expression.DesignSurface.Utility.ResourceHelper.PasteResources(pastePackage, imageMap, ResourceConflictResolution.UseExisting | ResourceConflictResolution.RenameNew | ResourceConflictResolution.OverwriteOld, viewModel.RootNode, index, false))
                    {
                        ILayoutDesigner designerForParent = viewModel.GetLayoutDesignerForParent(insertionPoint.SceneElement, true);
                        List <PasteCommand.DelayedElementTranslationInfo> elementsToTranslateLater = new List <PasteCommand.DelayedElementTranslationInfo>(pastePackage.Elements.Count);
                        string copyElementToken = pastePackage.ClipboardCopyElementToken;
                        foreach (SceneElement element in pastePackage.Elements)
                        {
                            SceneElement sceneElement = PasteCommand.PasteElement(viewModel, element, elementsToTranslateLater, insertionPoint);
                            if (sceneElement != null)
                            {
                                Microsoft.Expression.DesignSurface.Utility.ResourceHelper.UpdateImageReferences(sceneElement.DocumentNode, imageMap, pastePackage, viewModel);
                                list.Add((SceneNode)sceneElement);
                                sceneElement.ClearValue(DesignTimeProperties.CopyTokenProperty);
                            }
                        }
                        if (copyElementToken != null)
                        {
                            pastePackage.SetGlobalCopyElementToken(copyElementToken);
                            PastePackage.PasteSelectionChangePending = true;
                        }
                        foreach (SceneNode childProperty in pastePackage.ChildPropertyNodes)
                        {
                            PasteCommand.PasteChildProperty(viewModel, childProperty, (IList <SceneNode>)list);
                        }
                        foreach (StoryboardTimelineSceneNode storyboard in pastePackage.Storyboards)
                        {
                            PasteCommand.PasteStoryboard(viewModel, storyboard, (IList <SceneNode>)list);
                        }
                        viewModel.Document.OnUpdatedEditTransaction();
                        viewModel.DefaultView.UpdateLayout();
                        using (viewModel.ForceBaseValue())
                        {
                            Rect empty = Rect.Empty;
                            foreach (PasteCommand.DelayedElementTranslationInfo elementTranslationInfo in elementsToTranslateLater)
                            {
                                empty.Union(elementTranslationInfo.Bounds);
                            }
                            foreach (PasteCommand.DelayedElementTranslationInfo elementTranslationInfo in elementsToTranslateLater)
                            {
                                elementTranslationInfo.UpdateTranslation(designerForParent, empty);
                            }
                        }
                    }
                    else
                    {
                        canceledPasteOperation = true;
                    }
                }
            }
            else if (dataObject.GetDataPresent(DataFormats.FileDrop))
            {
                DesignerContext designerContext = viewModel.DesignerContext;
                string[]        supportedFiles  = FileDropToolBehavior.CreateImageOrMediaDrop(designerContext).GetSupportedFiles(ClipboardService.GetDataObject());
                if (supportedFiles.Length > 0)
                {
                    IEnumerable <IProjectItem> importedItems = designerContext.ActiveProject.AddItems(Enumerable.Select <string, DocumentCreationInfo>((IEnumerable <string>)supportedFiles, (Func <string, DocumentCreationInfo>)(file => new DocumentCreationInfo()
                    {
                        SourcePath = file
                    })));
                    FileDropToolBehavior.AddItemsToDocument(viewModel.DefaultView, importedItems, new Point(0.0, 0.0), viewModel.ActiveSceneInsertionPoint);
                }
                else
                {
                    viewModel.DesignerContext.MessageDisplayService.ShowError(StringTable.PasteElementsFailedDialogMessage);
                }
            }
            else if (dataObject.GetDataPresent(DataFormats.Bitmap))
            {
                DesignerContext designerContext = viewModel.DesignerContext;
                IProjectItem    projectItem     = CutBuffer.AddImageDataFromClipboard(designerContext.ProjectManager, designerContext.ActiveProject);
                if (projectItem != null)
                {
                    FileDropToolBehavior.AddItemsToDocument(viewModel.DefaultView, (IEnumerable <IProjectItem>) new List <IProjectItem>()
                    {
                        projectItem
                    }, new Point(0.0, 0.0), viewModel.ActiveSceneInsertionPoint);
                }
                else
                {
                    viewModel.DesignerContext.MessageDisplayService.ShowError(StringTable.PasteElementsFailedDialogMessage);
                }
            }
            else
            {
                viewModel.DesignerContext.MessageDisplayService.ShowError(StringTable.PasteElementsFailedDialogMessage);
            }
            return((ICollection <SceneNode>)list);
        }
コード例 #14
0
        public override void Execute()
        {
            string               fileName           = "test";
            IProject             activeProject      = this.DesignerContext.ActiveProject;
            TemplateItemHelper   templateItemHelper = new TemplateItemHelper(activeProject, (IList <string>)null, (IServiceProvider)this.DesignerContext.Services);
            IProjectItemTemplate templateItem       = templateItemHelper.FindTemplateItem("UserControl");

            if (templateItem == null)
            {
                this.DesignerContext.MessageDisplayService.ShowError(StringTable.MakeUserControlTemplateNotFound);
            }
            else
            {
                SceneViewModel      activeSceneViewModel = this.DesignerContext.ActiveSceneViewModel;
                List <SceneElement> elements             = new List <SceneElement>();
                elements.AddRange((IEnumerable <SceneElement>)activeSceneViewModel.ElementSelectionSet.Selection);
                elements.Sort((IComparer <SceneElement>) new ZOrderComparer <SceneElement>(activeSceneViewModel.RootNode));
                if (this.ShowUI)
                {
                    string recommendedName = this.GetRecommendedName((IEnumerable <SceneElement>)elements);
                    MakeUserControlDialog userControlDialog = new MakeUserControlDialog(this.DesignerContext, this.DialogTitle, templateItemHelper, recommendedName);
                    bool?nullable = userControlDialog.ShowDialog();
                    if ((!nullable.GetValueOrDefault() ? 1 : (!nullable.HasValue ? true : false)) != 0)
                    {
                        return;
                    }
                    fileName = userControlDialog.ControlName;
                }
                List <IProjectItem>        itemsToOpen  = (List <IProjectItem>)null;
                IProjectItem               projectItem1 = (IProjectItem)null;
                IEnumerable <IProjectItem> source       = (IEnumerable <IProjectItem>)null;
                try
                {
                    source = templateItemHelper.AddProjectItemsForTemplateItem(templateItem, fileName, this.DesignerContext.ProjectManager.TargetFolderForProject(activeProject), CreationOptions.DoNotAllowOverwrites | CreationOptions.DoNotSelectCreatedItems | CreationOptions.DoNotSetDefaultImportPath, out itemsToOpen);
                }
                catch (Exception ex)
                {
                    if (ex is NotSupportedException || ErrorHandling.ShouldHandleExceptions(ex))
                    {
                        this.DesignerContext.MessageDisplayService.ShowError(string.Format((IFormatProvider)CultureInfo.CurrentCulture, StringTable.ProjectNewFileErrorDialogMessage, new object[2]
                        {
                            (object)fileName,
                            (object)ex.Message
                        }));
                    }
                    else
                    {
                        throw;
                    }
                }
                if (source == null || EnumerableExtensions.CountIsLessThan <IProjectItem>(source, 1))
                {
                    return;
                }
                if (itemsToOpen != null && itemsToOpen.Count > 0)
                {
                    projectItem1 = Enumerable.FirstOrDefault <IProjectItem>((IEnumerable <IProjectItem>)itemsToOpen);
                    projectItem1.OpenDocument(false, true);
                }
                if (projectItem1 != null && projectItem1.IsOpen && projectItem1.DocumentType.CanView)
                {
                    Rect empty = Rect.Empty;
                    for (int index = 0; index < elements.Count; ++index)
                    {
                        BaseFrameworkElement child = elements[index] as BaseFrameworkElement;
                        if (child != null)
                        {
                            Rect childRect = child.ViewModel.GetLayoutDesignerForChild((SceneElement)child, true).GetChildRect(child);
                            empty.Union(childRect);
                        }
                    }
                    Rect         rect              = RoundingHelper.RoundRect(empty);
                    SceneElement parentElement     = elements[0].ParentElement;
                    bool         useLayoutRounding = LayoutRoundingHelper.GetUseLayoutRounding(parentElement);
                    DataObject   dataObject        = (DataObject)null;
                    using (activeSceneViewModel.ForceBaseValue())
                    {
                        PastePackage pastePackage = new PastePackage(activeSceneViewModel);
                        pastePackage.CopyStoryboardsReferencingElements = true;
                        pastePackage.AddElements(elements);
                        dataObject = pastePackage.GetPasteDataObject();
                    }
                    SceneView sceneView = projectItem1.OpenView(true) as SceneView;
                    if (sceneView != null)
                    {
                        SceneViewModel     viewModel           = sceneView.ViewModel;
                        ProjectXamlContext projectXamlContext  = ProjectXamlContext.FromProjectContext(viewModel.ViewRoot.ProjectContext);
                        ClassAttributes    rootClassAttributes = viewModel.DocumentRoot.RootClassAttributes;
                        ITypeId            typeId = (ITypeId)null;
                        if (projectXamlContext != null && rootClassAttributes != null)
                        {
                            projectXamlContext.RefreshUnbuiltTypeDescriptions();
                            if (rootClassAttributes != null)
                            {
                                typeId = (ITypeId)projectXamlContext.GetType(projectXamlContext.ProjectAssembly.Name, rootClassAttributes.QualifiedClassName);
                            }
                        }
                        if (typeId != null && this.CheckForCircularReference((IEnumerable <SceneElement>)elements, typeId))
                        {
                            this.DesignerContext.MessageDisplayService.ShowError(StringTable.MakeUserControlCircularReferenceFound);
                            this.CleanupAfterCancel(projectItem1);
                            return;
                        }
                        using (SceneEditTransaction editTransaction = viewModel.CreateEditTransaction(StringTable.UndoUnitMakeUserControl))
                        {
                            if (!rect.IsEmpty)
                            {
                                viewModel.RootNode.SetValue(DesignTimeProperties.DesignWidthProperty, (object)rect.Width);
                                viewModel.RootNode.SetValue(DesignTimeProperties.DesignHeightProperty, (object)rect.Height);
                                if (this.AddToApplicationFlow)
                                {
                                    viewModel.RootNode.SetValue(BaseFrameworkElement.WidthProperty, (object)rect.Width);
                                    viewModel.RootNode.SetValue(BaseFrameworkElement.HeightProperty, (object)rect.Height);
                                }
                            }
                            IProperty property = LayoutRoundingHelper.ResolveUseLayoutRoundingProperty(viewModel.RootNode);
                            if (property != null)
                            {
                                viewModel.RootNode.SetValue((IPropertyId)property, (object)(bool)(useLayoutRounding ? true : false));
                            }
                            ILayoutDesigner         designerForParent = viewModel.GetLayoutDesignerForParent(viewModel.ActiveSceneInsertionPoint.SceneElement, true);
                            bool                    canceledPasteOperation;
                            ICollection <SceneNode> nodes = PasteCommand.PasteData(viewModel, new SafeDataObject((IDataObject)dataObject), viewModel.ActiveSceneInsertionPoint, out canceledPasteOperation);
                            if (canceledPasteOperation)
                            {
                                editTransaction.Cancel();
                                this.CleanupAfterCancel(projectItem1);
                                return;
                            }
                            editTransaction.Update();
                            if (nodes.Count > 0)
                            {
                                viewModel.DefaultView.UpdateLayout();
                                viewModel.SelectNodes(nodes);
                                if (designerForParent != null)
                                {
                                    foreach (SceneNode sceneNode in (IEnumerable <SceneNode>)nodes)
                                    {
                                        BaseFrameworkElement child = sceneNode as BaseFrameworkElement;
                                        if (child != null && child.IsViewObjectValid)
                                        {
                                            Rect childRect = child.ViewModel.GetLayoutDesignerForChild((SceneElement)child, true).GetChildRect(child);
                                            childRect.Location = (Point)(childRect.Location - rect.Location);
                                            designerForParent.SetChildRect(child, childRect);
                                        }
                                    }
                                }
                            }
                            editTransaction.Commit();
                        }
                        if (this.AddToApplicationFlow && this.DesignerContext.PrototypingService != null)
                        {
                            this.DesignerContext.PrototypingService.PromoteToCompositionScreen(projectItem1);
                        }
                        if (typeId != null)
                        {
                            using (activeSceneViewModel.ForceBaseValue())
                            {
                                using (activeSceneViewModel.DisableDrawIntoState())
                                {
                                    using (SceneEditTransaction editTransaction = activeSceneViewModel.CreateEditTransaction(StringTable.UndoUnitMakeUserControl))
                                    {
                                        using (activeSceneViewModel.DisableUpdateChildrenOnAddAndRemove())
                                        {
                                            SceneElement primarySelection = activeSceneViewModel.ElementSelectionSet.PrimarySelection;
                                            IProperty    propertyForChild = parentElement.GetPropertyForChild((SceneNode)primarySelection);
                                            PropertySceneInsertionPoint sceneInsertionPoint = new PropertySceneInsertionPoint(parentElement, propertyForChild);
                                            SceneNode sceneNode = (SceneNode)null;
                                            if (sceneInsertionPoint.CanInsert(typeId))
                                            {
                                                foreach (SceneElement element in elements)
                                                {
                                                    if (element != primarySelection)
                                                    {
                                                        activeSceneViewModel.AnimationEditor.DeleteAllAnimationsInSubtree(element);
                                                        element.Remove();
                                                    }
                                                }
                                                ISceneNodeCollection <SceneNode> collectionForProperty = parentElement.GetCollectionForProperty((IPropertyId)propertyForChild);
                                                int index = collectionForProperty.IndexOf((SceneNode)primarySelection);
                                                activeSceneViewModel.AnimationEditor.DeleteAllAnimationsInSubtree(primarySelection);
                                                primarySelection.Remove();
                                                sceneNode = activeSceneViewModel.CreateSceneNode(typeId);
                                                collectionForProperty.Insert(index, sceneNode);
                                                this.DesignerContext.ViewService.ActiveView = (IView)activeSceneViewModel.DefaultView;
                                                editTransaction.Update();
                                                activeSceneViewModel.DefaultView.UpdateLayout();
                                                BaseFrameworkElement child = sceneNode as BaseFrameworkElement;
                                                if (child != null && child.IsViewObjectValid)
                                                {
                                                    activeSceneViewModel.GetLayoutDesignerForParent(parentElement, true).SetChildRect(child, rect);
                                                }
                                            }
                                            if (this.AddToApplicationFlow)
                                            {
                                                if (sceneNode != null)
                                                {
                                                    sceneNode.SetValue(DesignTimeProperties.IsPrototypingCompositionProperty, (object)true);
                                                }
                                            }
                                        }
                                        editTransaction.Commit();
                                    }
                                }
                            }
                            this.DesignerContext.ViewService.ActiveView = (IView)viewModel.DefaultView;
                        }
                    }
                }
                if (itemsToOpen == null || itemsToOpen.Count <= 1)
                {
                    return;
                }
                foreach (IProjectItem projectItem2 in itemsToOpen)
                {
                    if (projectItem1 != projectItem2)
                    {
                        projectItem2.OpenView(true);
                    }
                }
            }
        }