/// <summary>
        /// Constructor. This view model constructed with 'bHookUpEvents=true' does react on model changes.
        /// </summary>
        /// <param name="viewModelStore">The store this view model belongs to.</param>
        /// <param name="embeddingDiagramNode">Element represented by this view model.</param>
        public EmbeddingDiagramNodeViewModel(ViewModelStore viewModelStore, EmbeddingDiagramNode embeddingDiagramNode, EmbeddingDiagramNodeViewModel parent)
            : base(viewModelStore, embeddingDiagramNode)
        {
            this.parent = parent;

            this.embeddingNodeVMs = new ObservableCollection<EmbeddingDiagramNodeViewModel>();
            this.embeddingNodeVMsRO = new ReadOnlyObservableCollection<EmbeddingDiagramNodeViewModel>(this.embeddingNodeVMs);

            if (this.EmbeddingDiagramNode != null)
            {
                foreach (EmbeddingDiagramNode node in this.EmbeddingDiagramNode.EmbeddingDiagramNodes)
                    this.AddEmbeddingDiagramNode(node);

                this.EventManager.GetEvent<ModelElementPropertyChangedEvent>().Subscribe(this.EmbeddingDiagramNode.Id, new Action<ElementPropertyChangedEventArgs>(OnElementPropertyChanged));

                this.EventManager.GetEvent<ModelElementLinkAddedEvent>().Subscribe(this.Store.DomainDataDirectory.GetDomainRelationship(EmbeddingDiagramNodeHasEmbeddingDiagramNodes.DomainClassId),
                    true, this.EmbeddingDiagramNode.Id, new Action<ElementAddedEventArgs>(OnEmbeddingDiagramNodeAdded));

                this.EventManager.GetEvent<ModelElementLinkDeletedEvent>().Subscribe(this.Store.DomainDataDirectory.GetDomainRelationship(EmbeddingDiagramNodeHasEmbeddingDiagramNodes.DomainClassId),
                    true, this.EmbeddingDiagramNode.Id, new Action<ElementDeletedEventArgs>(OnEmbeddingDiagramNodeRemoved));

                this.EventManager.GetEvent<ModelRolePlayerMovedEvent>().Subscribe(this.Store.DomainDataDirectory.GetDomainRelationship(EmbeddingDiagramNodeHasEmbeddingDiagramNodes.DomainClassId),
                    this.EmbeddingDiagramNode.Id, new Action<RolePlayerOrderChangedEventArgs>(OnEmbeddingDiagramNodeMoved));

                this.EventManager.GetEvent<ModelRolePlayerChangedEvent>().Subscribe(this.Store.DomainDataDirectory.GetDomainRole(EmbeddingDiagramNodeHasEmbeddingDiagramNodes.SourceEmbeddingDiagramNodeDomainRoleId),
                    new Action<RolePlayerChangedEventArgs>(OnEmbeddingDiagramNodeChanged));
            }

            expandCollapseTreeCommand = new DelegateCommand(ExpandCollapseTreeCommand_Executed);
        }
Пример #2
0
        /// <summary>
        /// Constructor. This view model constructed with 'bHookUpEvents=true' does react on model changes.
        /// </summary>
        /// <param name="viewModelStore">The store this view model belongs to.</param>
        /// <param name="embeddingDiagramNode">Element represented by this view model.</param>
        public EmbeddingDiagramNodeViewModel(ViewModelStore viewModelStore, EmbeddingDiagramNode embeddingDiagramNode, EmbeddingDiagramNodeViewModel parent)
            : base(viewModelStore, embeddingDiagramNode)
        {
            this.parent = parent;

            this.embeddingNodeVMs   = new ObservableCollection <EmbeddingDiagramNodeViewModel>();
            this.embeddingNodeVMsRO = new ReadOnlyObservableCollection <EmbeddingDiagramNodeViewModel>(this.embeddingNodeVMs);

            if (this.EmbeddingDiagramNode != null)
            {
                foreach (EmbeddingDiagramNode node in this.EmbeddingDiagramNode.EmbeddingDiagramNodes)
                {
                    this.AddEmbeddingDiagramNode(node);
                }

                this.EventManager.GetEvent <ModelElementPropertyChangedEvent>().Subscribe(this.EmbeddingDiagramNode.Id, new Action <ElementPropertyChangedEventArgs>(OnElementPropertyChanged));

                this.EventManager.GetEvent <ModelElementLinkAddedEvent>().Subscribe(this.Store.DomainDataDirectory.GetDomainRelationship(EmbeddingDiagramNodeHasEmbeddingDiagramNodes.DomainClassId),
                                                                                    true, this.EmbeddingDiagramNode.Id, new Action <ElementAddedEventArgs>(OnEmbeddingDiagramNodeAdded));

                this.EventManager.GetEvent <ModelElementLinkDeletedEvent>().Subscribe(this.Store.DomainDataDirectory.GetDomainRelationship(EmbeddingDiagramNodeHasEmbeddingDiagramNodes.DomainClassId),
                                                                                      true, this.EmbeddingDiagramNode.Id, new Action <ElementDeletedEventArgs>(OnEmbeddingDiagramNodeRemoved));

                this.EventManager.GetEvent <ModelRolePlayerMovedEvent>().Subscribe(this.Store.DomainDataDirectory.GetDomainRelationship(EmbeddingDiagramNodeHasEmbeddingDiagramNodes.DomainClassId),
                                                                                   this.EmbeddingDiagramNode.Id, new Action <RolePlayerOrderChangedEventArgs>(OnEmbeddingDiagramNodeMoved));

                this.EventManager.GetEvent <ModelRolePlayerChangedEvent>().Subscribe(this.Store.DomainDataDirectory.GetDomainRole(EmbeddingDiagramNodeHasEmbeddingDiagramNodes.SourceEmbeddingDiagramNodeDomainRoleId),
                                                                                     new Action <RolePlayerChangedEventArgs>(OnEmbeddingDiagramNodeChanged));
            }

            expandCollapseTreeCommand = new DelegateCommand(ExpandCollapseTreeCommand_Executed);
        }
Пример #3
0
        public static void UnparentShape(ShapeClass shapeClass)
        {
            EmbeddingDiagramNode node = shapeClass.DiagramTreeNode as EmbeddingDiagramNode;

            if (node == null)
            {
                return;
            }

            if (shapeClass != null)
            {
                shapeClass.Parent.Children.Remove(shapeClass);
                //shapeClass.DiagramTreeNode = null;
            }

            RootDiagramNode rootNode = new RootDiagramNode(shapeClass.Store);

            List <EmbeddingDiagramNode> nodesToMove = new List <EmbeddingDiagramNode>();

            foreach (EmbeddingDiagramNode n in node.EmbeddingDiagramNodes)
            {
                nodesToMove.Add(n);
            }
            foreach (EmbeddingDiagramNode n in nodesToMove)
            {
                n.SourceEmbeddingDiagramNode = rootNode;
            }

            shapeClass.DiagramTreeNode = rootNode;
            shapeClass.DiagramClass.DiagramClassView.RootDiagramNodes.Add(rootNode);
        }
Пример #4
0
        private static void FixUpDiagramView(LibraryModelContext model)
        {
            foreach (DiagramClass diagramClass in model.DiagramClasses)
            {
                DiagramClassView vm = new DiagramClassView(model.Store);
                vm.IsExpanded   = true;
                vm.DiagramClass = diagramClass;

                // add shapes views
                foreach (PresentationElementClass p in diagramClass.PresentationElements)
                {
                    if (p is ShapeClass)
                    {
                        ShapeClass shapeClass = p as ShapeClass;
                        if (shapeClass.Parent == null)
                        {
                            RootDiagramNode node = new RootDiagramNode(p.Store);
                            node.PresentationElementClass = p;

                            vm.RootDiagramNodes.Add(node);
                        }
                        else
                        {
                            EmbeddingDiagramNode newNode = new EmbeddingDiagramNode(model.Store);
                            newNode.PresentationElementClass = p;
                        }
                    }
                    else
                    {
                        RootDiagramNode node = new RootDiagramNode(p.Store);
                        node.PresentationElementClass = p;

                        vm.RootDiagramNodes.Add(node);
                    }
                }

                foreach (PresentationElementClass p in diagramClass.PresentationElements)
                {
                    if (p is ShapeClass)
                    {
                        ShapeClass shapeClass = p as ShapeClass;
                        if (shapeClass.Parent != null)
                        {
                            EmbeddingDiagramNode source = shapeClass.Parent.DiagramTreeNode as EmbeddingDiagramNode;
                            EmbeddingDiagramNode target = p.DiagramTreeNode as EmbeddingDiagramNode;

                            if (source != null && target != null)
                            {
                                new EmbeddingDiagramNodeHasEmbeddingDiagramNodes(source, target);
                            }
                        }
                    }
                }

                model.ViewContext.DiagramView.DiagramClassViews.Add(vm);
            }
        }
Пример #5
0
        /// <summary>
        /// Deletes the view model that is hosting the given node.
        /// </summary>
        /// <param name="node">Node.</param>
        public void DeleteEmbeddingDiagramNode(EmbeddingDiagramNode node)
        {
            for (int i = this.embeddingNodeVMs.Count - 1; i >= 0; i--)
            {
                if (this.embeddingNodeVMs[i].EmbeddingDiagramNode.Id == node.Id)
                {
                    this.embeddingNodeVMs[i].Dispose();
                    this.embeddingNodeVMs.RemoveAt(i);
                }
            }


            foreach (EmbeddingDiagramNodeViewModel vm in this.embeddingNodeVMs)
            {
                vm.UpdateNodePosition();
            }

            OnPropertyChanged("HasEmbeddingNodes");
        }
Пример #6
0
        /// <summary>
        /// Adds a new embedding view model for the given node.
        /// </summary>
        /// <param name="node">Node.</param>
        public void AddEmbeddingDiagramNode(EmbeddingDiagramNode node)
        {
            // verify that node hasnt been added yet
            foreach (EmbeddingDiagramNodeViewModel viewModel in this.embeddingNodeVMs)
            {
                if (viewModel.EmbeddingDiagramNode.Id == node.Id)
                {
                    return;
                }
            }

            EmbeddingDiagramNodeViewModel vm = new EmbeddingDiagramNodeViewModel(this.ViewModelStore, node, this);

            this.embeddingNodeVMs.Add(vm);

            foreach (EmbeddingDiagramNodeViewModel viewModel in this.embeddingNodeVMs)
            {
                viewModel.UpdateNodePosition();
            }

            OnPropertyChanged("HasEmbeddingNodes");
        }
        /// <summary>
        /// ReparentCommand executed.
        /// </summary>
        private void ReparentCommand_Executed()
        {
            if (this.SelectedItems.Count == 0)
                return;

            if (!(this.SelectedItems[0] is EmbeddingDiagramNodeViewModel))
                return;

            EmbeddingDiagramNodeViewModel vm = this.SelectedItems[0] as EmbeddingDiagramNodeViewModel;
            EmbeddingDiagramNode node = vm.EmbeddingDiagramNode;
            ShapeClass shapeClass = node.PresentationElementClass as ShapeClass;
            if (node == null || shapeClass == null)
                return;

            List<ShapeClass> sortedClasses = new List<ShapeClass>();
            foreach (PresentationElementClass p in shapeClass.DiagramClass.PresentationElements)
                if (p is ShapeClass && p != shapeClass)
                {
                    // lets see if this element is child of node.PresentationElementClass
                    if (shapeClass.Parent == p)
                        continue;

                    if (!shapeClass.ContainsChild(p as ShapeClass))
                        sortedClasses.Add(p as ShapeClass);
                }

            sortedClasses.Sort(CompareShapeClassesByName);

            List<SelectableViewModel> vms = new List<SelectableViewModel>();
            foreach (ShapeClass d in sortedClasses)
                    vms.Add(new SelectableViewModel(this.ViewModelStore, d));

            SelectionViewModel selectionVM = new SelectionViewModel(this.ViewModelStore, vms);
            bool? result = this.GlobalServiceProvider.Resolve<IUIVisualizerService>().ShowDialog("TargetSelectorForm", selectionVM);
            if (result == true)
            {
                if (selectionVM.SelectedViewModel != null)
                {
                    ShapeClass selectedShapeClass = selectionVM.SelectedViewModel.Element as ShapeClass;
                    using (Transaction transaction = Store.TransactionManager.BeginTransaction("Unparent"))
                    {
                        // move element
                        shapeClass.Parent = selectedShapeClass;

                        EmbeddingDiagramNode embeddingNode = new EmbeddingDiagramNode(this.Store);

                        List<EmbeddingDiagramNode> nodesToMove = new List<EmbeddingDiagramNode>();
                        foreach (EmbeddingDiagramNode n in node.EmbeddingDiagramNodes)
                            nodesToMove.Add(n);
                        foreach (EmbeddingDiagramNode n in nodesToMove)
                        {
                            n.SourceEmbeddingDiagramNode = embeddingNode;
                        }
                        
                        embeddingNode.SourceEmbeddingDiagramNode = selectedShapeClass.DiagramTreeNode as EmbeddingDiagramNode;
                        shapeClass.DiagramTreeNode = embeddingNode;
                        
                        node.Delete();

                        transaction.Commit();
                    }
                }
            }

            selectionVM.Dispose();
            GC.Collect();

        }
        /// <summary>
        /// AddNewShapeClass command executed.
        /// </summary>
        private void AddNewShapeClassCommand_Executed()
        {
            using (Transaction transaction = Store.TransactionManager.BeginTransaction("Add new shape class"))
            {
                foreach (BaseModelElementViewModel vm in this.SelectedItems)
                    if (vm is DiagramClassViewModel)
                    {
                        ShapeClass shape = DiagramTreeOperations.CreateShapeClass((vm as DiagramClassViewModel).DiagramClassView.DiagramClass);
                        RootDiagramNode node = new RootDiagramNode(this.Store);
                        node.PresentationElementClass = shape;

                        (vm as DiagramClassViewModel).DiagramClassView.RootDiagramNodes.Add(node);
                    }
                    else if (vm is EmbeddingDiagramNodeViewModel)
                    {
                        ShapeClass orgShape = (vm as EmbeddingDiagramNodeViewModel).EmbeddingDiagramNode.PresentationElementClass as ShapeClass;

                        ShapeClass shape = DiagramTreeOperations.CreateShapeClass(orgShape.DiagramClass);
                        EmbeddingDiagramNode newNode = new EmbeddingDiagramNode(this.Store);
                        newNode.PresentationElementClass = shape;

                        orgShape.Children.Add(shape);
                        if (orgShape.DiagramTreeNode is EmbeddingDiagramNode)
                            newNode.SourceEmbeddingDiagramNode = orgShape.DiagramTreeNode as EmbeddingDiagramNode;
                    }
                
                transaction.Commit();
            }
        }
        /// <summary>
        /// Deletes the view model that is hosting the given node.
        /// </summary>
        /// <param name="node">Node.</param>
        public void DeleteEmbeddingDiagramNode(EmbeddingDiagramNode node)
        {
            for (int i = this.embeddingNodeVMs.Count - 1; i >= 0; i--)
                if (this.embeddingNodeVMs[i].EmbeddingDiagramNode.Id == node.Id)
                {
                    this.embeddingNodeVMs[i].Dispose();
                    this.embeddingNodeVMs.RemoveAt(i);
                }


            foreach (EmbeddingDiagramNodeViewModel vm in this.embeddingNodeVMs)
                vm.UpdateNodePosition();

            OnPropertyChanged("HasEmbeddingNodes");
        }
        /// <summary>
        /// Adds a new embedding view model for the given node.
        /// </summary>
        /// <param name="node">Node.</param>
        public void AddEmbeddingDiagramNode(EmbeddingDiagramNode node)
        {
            // verify that node hasnt been added yet
            foreach (EmbeddingDiagramNodeViewModel viewModel in this.embeddingNodeVMs)
                if (viewModel.EmbeddingDiagramNode.Id == node.Id)
                    return;

            EmbeddingDiagramNodeViewModel vm = new EmbeddingDiagramNodeViewModel(this.ViewModelStore, node, this);
            this.embeddingNodeVMs.Add(vm);

            foreach (EmbeddingDiagramNodeViewModel viewModel in this.embeddingNodeVMs)
                viewModel.UpdateNodePosition();

            OnPropertyChanged("HasEmbeddingNodes");
        }
        private static void FixUpDiagramView(LibraryModelContext model)
        {
            foreach (DiagramClass diagramClass in model.DiagramClasses)
            {
                DiagramClassView vm = new DiagramClassView(model.Store);
                vm.IsExpanded = true;
                vm.DiagramClass = diagramClass;

                // add shapes views
                foreach (PresentationElementClass p in diagramClass.PresentationElements)
                {
                    if (p is ShapeClass)
                    {
                        ShapeClass shapeClass = p as ShapeClass;
                        if (shapeClass.Parent == null)
                        {
                            RootDiagramNode node = new RootDiagramNode(p.Store);
                            node.PresentationElementClass = p;

                            vm.RootDiagramNodes.Add(node);
                        }
                        else
                        {
                            EmbeddingDiagramNode newNode = new EmbeddingDiagramNode(model.Store);
                            newNode.PresentationElementClass = p;
                        }
                    }
                    else
                    {
                        RootDiagramNode node = new RootDiagramNode(p.Store);
                        node.PresentationElementClass = p;

                        vm.RootDiagramNodes.Add(node);
                    }
                }

                foreach (PresentationElementClass p in diagramClass.PresentationElements)
                {
                    if (p is ShapeClass)
                    {
                        ShapeClass shapeClass = p as ShapeClass;
                        if (shapeClass.Parent != null)
                        {
                            EmbeddingDiagramNode source = shapeClass.Parent.DiagramTreeNode as EmbeddingDiagramNode;
                            EmbeddingDiagramNode target = p.DiagramTreeNode as EmbeddingDiagramNode;

                            if (source != null && target != null)
                                new EmbeddingDiagramNodeHasEmbeddingDiagramNodes(source, target);
                        }
                    }
                }

                model.ViewContext.DiagramView.DiagramClassViews.Add(vm);
            }
        }