示例#1
0
        /// <summary>
        /// DeleteRule: typeof(DiagramDisplayHasDiagramOrder), FireTime=LocalCommit, Priority=FrameworkDomainModel.BeforeDelayValidateRulePriority;
        /// Make sure that deletion of a diagram order results in a reorder
        /// </summary>
        private static void DiagramOrderDeletedRule(ElementDeletedEventArgs e)
        {
            DiagramDisplayHasDiagramOrder link = (DiagramDisplayHasDiagramOrder)e.ModelElement;
            Diagram diagram = link.Diagram;

            if (!diagram.IsDeleted)
            {
                Store store = diagram.Store;
                if (diagram.Partition == store.DefaultPartition)                 // This should never happen, but it is easy to check
                {
                    if (null == DiagramDisplayHasDiagramOrder.GetDiagramDisplay(diagram))
                    {
                        DiagramDisplay displayContainer = link.DiagramDisplay;
                        if (displayContainer.IsDeleted)
                        {
                            ReadOnlyCollection <DiagramDisplay> displays = store.ElementDirectory.FindElements <DiagramDisplay>(false);
                            displayContainer = (displays.Count != 0) ? displays[0] : new DiagramDisplay(store);
                        }
                        new DiagramDisplayHasDiagramOrder(displayContainer, diagram);
                    }
                }
            }
            else
            {
                DiagramDisplay displayContainer = link.DiagramDisplay;
                if (!displayContainer.IsDeleted && displayContainer.OrderedDiagramCollection.Count == 0)
                {
                    // No more diagrams, don't need the container
                    displayContainer.Delete();
                }
            }
        }
示例#2
0
        /// <summary>
        /// Display the diagram order dialog with the specified diagram order and update
        /// the diagram order as specified by the user.
        /// </summary>
        /// <param name="serviceProvider">A <see cref="IServiceProvider"/> used to parent the dialog</param>
        /// <param name="docData">The owning <see cref="ModelingDocData"/> of the diagrams being reordered</param>
        /// <param name="diagrams">A list of <see cref="Diagram"/> elements to reorder</param>
        /// <param name="selectedDiagram">A <see cref="Diagram"/> to select when the dialog is initially displayed.</param>
        /// <param name="images">The diagram images to display. Images are keyed off the Guid of the diagram type (format "N")</param>
        public static void ShowDialog(IServiceProvider serviceProvider, ModelingDocData docData, IList <Diagram> diagrams, Diagram selectedDiagram, ImageList images)
        {
            DiagramOrderDialog orderDialog = new DiagramOrderDialog(diagrams, selectedDiagram, images);

            if (orderDialog.ShowDialog(Utility.GetDialogOwnerWindow(serviceProvider)) == DialogResult.OK)
            {
                DiagramDisplay.UpdateDiagramDisplayOrder(docData.Store, orderDialog.myDiagramOrder);
            }
        }
示例#3
0
 /// <summary>
 /// Make this the active view for the display
 /// </summary>
 public void Activate()
 {
     if (!myIsActive)
     {
         DiagramDisplay container = DiagramDisplay;
         foreach (DiagramDisplayHasDiagramOrder link in DiagramDisplayHasDiagramOrder.GetLinksToOrderedDiagramCollection(DiagramDisplay))
         {
             link.myIsActive = false;                     // Doesn't matter if we set ours
         }
         myIsActive = true;
     }
 }
示例#4
0
            public static PropertyDescriptor CreateDescriptor(ModelElement contextElement)
            {
                Store store = contextElement.Store;
                IList <DiagramDisplay> containers = store.ElementDirectory.FindElements <DiagramDisplay>();

                if (containers.Count != 0)
                {
                    DiagramDisplay     container  = containers[0];
                    PropertyDescriptor descriptor = DomainTypeDescriptor.CreatePropertyDescriptor(container, store.DomainDataDirectory.GetDomainProperty(DiagramDisplay.SaveDiagramPositionDomainPropertyId));
                    return(new DiagramContextDescriptor(container, descriptor));
                }
                return(null);
            }
示例#5
0
        /// <summary>
        /// AddRule: typeof(Microsoft.VisualStudio.Modeling.Diagrams.Diagram), FireTime=LocalCommit, Priority=FrameworkDomainModel.BeforeDelayValidateRulePriority;
        /// Make sure a diagram is included in the ordered list
        /// </summary>
        private static void DiagramAddedRule(ElementAddedEventArgs e)
        {
            Diagram diagram = (Diagram)e.ModelElement;

            if (!diagram.IsDeleted)
            {
                Store store = diagram.Store;
                if (diagram.Partition == store.DefaultPartition)
                {
                    DiagramDisplay displayContainer = DiagramDisplayHasDiagramOrder.GetDiagramDisplay(diagram);
                    if (displayContainer == null)
                    {
                        ReadOnlyCollection <DiagramDisplay> displays = store.ElementDirectory.FindElements <DiagramDisplay>(false);
                        displayContainer = (displays.Count != 0) ? displays[0] : new DiagramDisplay(store);
                        new DiagramDisplayHasDiagramOrder(displayContainer, diagram);
                    }
                }
            }
        }
 public override void ElementDeleted(Microsoft.VisualStudio.Modeling.ElementDeletedEventArgs e)
 {
     ORMSolutions.ORMArchitect.Framework.Diagnostics.TraceUtility.TraceRuleStart(e.ModelElement.Store, "ORMSolutions.ORMArchitect.Framework.Shell.DiagramDisplay.DiagramOrderDeletedRule");
     DiagramDisplay.DiagramOrderDeletedRule(e);
     ORMSolutions.ORMArchitect.Framework.Diagnostics.TraceUtility.TraceRuleEnd(e.ModelElement.Store, "ORMSolutions.ORMArchitect.Framework.Shell.DiagramDisplay.DiagramOrderDeletedRule");
 }
 /// <summary>
 /// Constructor
 /// Creates a DiagramDisplayHasDiagramOrder link in the same Partition as the given DiagramDisplay
 /// </summary>
 /// <param name="source">DiagramDisplay to use as the source of the relationship.</param>
 /// <param name="target">Diagram to use as the target of the relationship.</param>
 public DiagramDisplayHasDiagramOrder(DiagramDisplay source, global::Microsoft.VisualStudio.Modeling.Diagrams.Diagram target)
     : base((source != null ? source.Partition : null), new DslModeling::RoleAssignment[] { new DslModeling::RoleAssignment(DiagramDisplayHasDiagramOrder.DiagramDisplayDomainRoleId, source), new DslModeling::RoleAssignment(DiagramDisplayHasDiagramOrder.DiagramDomainRoleId, target) }, null)
 {
 }
 public static DslModeling::LinkedElementCollection <global::Microsoft.VisualStudio.Modeling.Diagrams.Diagram> GetOrderedDiagramCollection(DiagramDisplay element)
 {
     return(GetRoleCollection <DslModeling::LinkedElementCollection <global::Microsoft.VisualStudio.Modeling.Diagrams.Diagram>, global::Microsoft.VisualStudio.Modeling.Diagrams.Diagram>(element, DiagramDisplayDomainRoleId));
 }
 public static void SetDiagramDisplay(global::Microsoft.VisualStudio.Modeling.Diagrams.Diagram element, DiagramDisplay newDiagramDisplay)
 {
     DslModeling::DomainRoleInfo.SetLinkedElement(element, DiagramDomainRoleId, newDiagramDisplay);
 }
示例#10
0
            /// <summary>
            /// Process diagram items to make sure they have a current ordering representation
            /// </summary>
            protected sealed override void ProcessElement(Diagram element, Store store, INotifyElementAdded notifyAdded)
            {
                DiagramDisplayHasDiagramOrder link = DiagramDisplayHasDiagramOrder.GetLinkToDiagramDisplay(element);
                DiagramDisplay container           = myDiagramDisplay;

                if (container == null)
                {
                    if (link != null)
                    {
                        container = link.DiagramDisplay;
                    }

                    // Make sure we only have one container, use the one we've already grabbed
                    ReadOnlyCollection <DiagramDisplay> containers = store.ElementDirectory.FindElements <DiagramDisplay>(false);
                    int containerCount = containers.Count;
                    for (int i = containerCount - 1; i >= 0; --i)
                    {
                        DiagramDisplay testContainer = containers[i];
                        if (container != null)
                        {
                            if (testContainer != container)
                            {
                                testContainer.Delete();
                            }
                        }
                        else if (i == 0)
                        {
                            container = testContainer;
                        }
                        else
                        {
                            testContainer.Delete();
                        }
                    }
                    if (container == null)
                    {
                        container = new DiagramDisplay(store);
                        notifyAdded.ElementAdded(container, false);
                    }
                    myDiagramDisplay = container;
                    if (link != null)
                    {
                        // There is nothing else to do, the element has been validated
                        if (link.IsActiveDiagram)
                        {
                            if (mySeenActive)
                            {
                                link.IsActiveDiagram = false;
                            }
                            else
                            {
                                mySeenActive = true;
                            }
                        }
                        return;
                    }
                }
                if (link == null)
                {
                    // This will add to the end of the existing collection
                    link = new DiagramDisplayHasDiagramOrder(container, element);
                    notifyAdded.ElementAdded(link, false);
                }
                else
                {
                    if (link.DiagramDisplay != container)
                    {
                        link.DiagramDisplay = container;
                    }
                    if (link.IsActiveDiagram)
                    {
                        if (mySeenActive)
                        {
                            link.IsActiveDiagram = false;
                        }
                        else
                        {
                            mySeenActive = true;
                        }
                    }
                }
            }
示例#11
0
            public DiagramTabPage(MultiDiagramDocViewControl docViewControl, DiagramView designer)
            {
                myDocViewControl = docViewControl;
                Designer         = designer;
                base.SuspendLayout();
                base.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint | ControlStyles.SupportsTransparentBackColor, true);
                base.UseVisualStyleBackColor = false;
                Diagram diagram = designer.Diagram;

                base.Text = base.Name = diagram.Name;
                base.Controls.Add(designer);
                // Find the correct tab location for this diagram, depending on the diagram order and the
                // pages that have already been added
                TabControl.TabPageCollection pages = docViewControl.TabPages;
                bool  inserted          = false;
                Store store             = diagram.Store;
                bool  useDiagramDisplay = store.FindDomainModel(DiagramDisplayDomainModel.DomainModelId) != null;

                if (useDiagramDisplay)
                {
                    DiagramDisplay display = DiagramDisplayHasDiagramOrder.GetDiagramDisplay(diagram);
                    if (display != null)
                    {
                        // Walk the existing pages and match up the expected display order. Note that
                        // there is no guarantee that all of the preceding diagrams have tab pages already.
                        // If the previous pages are out of order, then we will get a reorder event later on
                        // that puts them in the correct order. This will add them in an unpredictable order
                        // if the sequences are different.
                        IList <Diagram> orderedDiagrams  = display.OrderedDiagramCollection;
                        int             diagramCount     = orderedDiagrams.Count;
                        int             nextDiagramIndex = 0;
                        Diagram         nextDiagram      = orderedDiagrams[nextDiagramIndex];
                        int             pageCount        = pages.Count;
                        if (nextDiagram == diagram)
                        {
                            if (pageCount != 0)
                            {
                                // The new diagram is first, insert at the beginning
                                pages.Insert(0, this);
                                inserted = true;
                            }
                        }
                        else
                        {
                            for (int pageIndex = 0; pageIndex < pageCount && !inserted; ++pageIndex)
                            {
                                DiagramTabPage page           = (DiagramTabPage)pages[pageIndex];
                                Diagram        pageDiagram    = page.Diagram;
                                bool           getNextDiagram = false;
                                if (pageDiagram == nextDiagram)
                                {
                                    getNextDiagram = true;
                                }
                                else
                                {
                                    // Keep walking diagrams until we get a match
                                    while (nextDiagramIndex < diagramCount)
                                    {
                                        nextDiagram = orderedDiagrams[++nextDiagramIndex];
                                        if (pageDiagram == nextDiagram)
                                        {
                                            getNextDiagram = true;
                                        }
                                        else if (nextDiagram == diagram)
                                        {
                                            if ((pageIndex + 1) < pageCount)
                                            {
                                                pages.Insert(pageIndex + 1, this);
                                                inserted = true;
                                                break;
                                            }
                                        }
                                    }
                                }
                                if (getNextDiagram)
                                {
                                    if (nextDiagramIndex < diagramCount)
                                    {
                                        nextDiagram = orderedDiagrams[++nextDiagramIndex];
                                        if (nextDiagram == diagram)
                                        {
                                            // Insert immediately after the current page
                                            if ((pageIndex + 1) < pageCount)
                                            {
                                                pages.Insert(pageIndex + 1, this);
                                                inserted = true;
                                            }
                                            break;
                                        }
                                    }
                                    else
                                    {
                                        break;
                                    }
                                }
                            }
                        }
                    }
                }
                if (!inserted)
                {
                    pages.Add(this);
                }
                // If the image key is set before the page is inserted then the tab size is incorrect
                // and nothing draws property. I have no idea why.
                base.ImageKey = diagram.GetType().GUID.ToString("N", null);
                base.ResumeLayout(false);
                store.EventManagerDirectory.ElementPropertyChanged.Add(diagram.GetDomainClass().NameDomainProperty, diagram.Id, (EventHandler <ElementPropertyChangedEventArgs>)DiagramNameChanged);
                if (useDiagramDisplay)
                {
                    designer.DiagramClientView.GotFocus += new EventHandler(ViewGotFocus);
                    designer.DiagramClientView.Resize   += new EventHandler(InitialViewResize);
                    myTurnOffResizeEventInFocusEvent     = true;
                }
                designer.DiagramClientView.DiagramDisassociating += DiagramDisassociating;
            }
示例#12
0
		/// <summary>
		/// Update the diagram display order
		/// </summary>
		/// <param name="store">The current <see cref="Store"/></param>
		/// <param name="orderedDiagrams">An ordered list of diagrams</param>
		public static void UpdateDiagramDisplayOrder(Store store, IList<Diagram> orderedDiagrams)
		{
			DiagramDisplay container = null;
			IList<DiagramDisplay> containers = store.ElementDirectory.FindElements<DiagramDisplay>(false);
			if (containers.Count != 0)
			{
				container = containers[0];
			}
			using (Transaction t = store.TransactionManager.BeginTransaction(FrameworkResourceStrings.DiagramDisplayReorderDiagramsTransactionName))
			{
				int orderCount = orderedDiagrams.Count;
				if (orderCount == 0)
				{
					if (container != null)
					{
						container.OrderedDiagramCollection.Clear();
					}
					return;
				}
				else if (container == null)
				{
					container = new DiagramDisplay(store);
				}
				LinkedElementCollection<Diagram> existingDiagrams = container.OrderedDiagramCollection;
				int existingDiagramCount = existingDiagrams.Count;
				for (int i = existingDiagramCount - 1; i >= 0; --i)
				{
					Diagram testDiagram = existingDiagrams[i];
					if (!orderedDiagrams.Contains(testDiagram))
					{
						existingDiagrams.RemoveAt(i);
						--existingDiagramCount;
					}
				}
				for (int i = 0; i < orderCount; ++i)
				{
					Diagram orderedDiagram = orderedDiagrams[i];
					int existingIndex = existingDiagrams.IndexOf(orderedDiagram);
					if (existingIndex == -1)
					{
						if (i < existingDiagramCount)
						{
							existingDiagrams.Insert(i, orderedDiagram);
						}
						else if (!existingDiagrams.Contains(orderedDiagram))
						{
							existingDiagrams.Add(orderedDiagram);
						}
						++existingDiagramCount;
					}
					else if (existingIndex != i)
					{
						existingDiagrams.Move(existingIndex, i);
					}
				}
				if (t.HasPendingChanges)
				{
					t.Commit();
				}
			}
		}
示例#13
0
			private DiagramContextDescriptor(DiagramDisplay contextElement, PropertyDescriptor descriptor)
				: base(descriptor.Name, null)
			{
				myInnerElement = contextElement;
				myInnerDescriptor = descriptor;
			}
示例#14
0
        /// <summary>
        /// Update the diagram display order
        /// </summary>
        /// <param name="store">The current <see cref="Store"/></param>
        /// <param name="orderedDiagrams">An ordered list of diagrams</param>
        public static void UpdateDiagramDisplayOrder(Store store, IList <Diagram> orderedDiagrams)
        {
            DiagramDisplay         container  = null;
            IList <DiagramDisplay> containers = store.ElementDirectory.FindElements <DiagramDisplay>(false);

            if (containers.Count != 0)
            {
                container = containers[0];
            }
            using (Transaction t = store.TransactionManager.BeginTransaction(FrameworkResourceStrings.DiagramDisplayReorderDiagramsTransactionName))
            {
                int orderCount = orderedDiagrams.Count;
                if (orderCount == 0)
                {
                    if (container != null)
                    {
                        container.OrderedDiagramCollection.Clear();
                    }
                    return;
                }
                else if (container == null)
                {
                    container = new DiagramDisplay(store);
                }
                LinkedElementCollection <Diagram> existingDiagrams = container.OrderedDiagramCollection;
                int existingDiagramCount = existingDiagrams.Count;
                for (int i = existingDiagramCount - 1; i >= 0; --i)
                {
                    Diagram testDiagram = existingDiagrams[i];
                    if (!orderedDiagrams.Contains(testDiagram))
                    {
                        existingDiagrams.RemoveAt(i);
                        --existingDiagramCount;
                    }
                }
                for (int i = 0; i < orderCount; ++i)
                {
                    Diagram orderedDiagram = orderedDiagrams[i];
                    int     existingIndex  = existingDiagrams.IndexOf(orderedDiagram);
                    if (existingIndex == -1)
                    {
                        if (i < existingDiagramCount)
                        {
                            existingDiagrams.Insert(i, orderedDiagram);
                        }
                        else if (!existingDiagrams.Contains(orderedDiagram))
                        {
                            existingDiagrams.Add(orderedDiagram);
                        }
                        ++existingDiagramCount;
                    }
                    else if (existingIndex != i)
                    {
                        existingDiagrams.Move(existingIndex, i);
                    }
                }
                if (t.HasPendingChanges)
                {
                    t.Commit();
                }
            }
        }
示例#15
0
 private DiagramContextDescriptor(DiagramDisplay contextElement, PropertyDescriptor descriptor)
     : base(descriptor.Name, null)
 {
     myInnerElement    = contextElement;
     myInnerDescriptor = descriptor;
 }