/// <summary> /// Sets the selection state of a shape element that represents the modelElement parameter on the given DiagramView /// </summary> /// <param name="diagramView">Object containing the shape element to select</param> /// <param name="modelElement">Model element the shape represents</param> /// <returns>True if the shape is present, visible and now selected, false otherwise</returns> public static bool SelectModelElement(this DiagramView diagramView, ModelElement modelElement) { // Get the shape element that corresponds to the model element ShapeElement shapeElement = modelElement.GetFirstShapeElement(); if (shapeElement != null) { // Make sure the shape element is visible (because connectors can be hidden) if (!shapeElement.IsVisible) { shapeElement.Show(); } // Create a diagram item for this shape element and select it diagramView.Selection.Set(new DiagramItem(shapeElement)); return(true); } // If the model element does not have a shape, try to cast it IModelElementCompartmented if (modelElement is IModelElementInCompartment compartmentedModelElement && compartmentedModelElement.ParentModelElement is ModelElement parentModelElement) { // Get the compartment that stores the model element ElementListCompartment compartment = parentModelElement.GetCompartment(compartmentedModelElement.CompartmentName); if (compartment == null) { throw new InvalidOperationException($"Can't find compartment {compartmentedModelElement.CompartmentName}"); } // Expand the compartment if (!compartment.IsExpanded) { using (Transaction trans = modelElement.Store.TransactionManager.BeginTransaction("IsExpanded")) { compartment.IsExpanded = true; trans.Commit(); } } // Find the model element in the compartment int index = compartment.Items.IndexOf(modelElement); if (index >= 0) { // Create a diagram item and select it diagramView.Selection.Set(new DiagramItem(compartment, compartment.ListField, new ListItemSubField(index))); return(true); } } return(false); }
protected override void OnSelectionChanged(EventArgs e) { base.OnSelectionChanged(e); // select element in tree if (PrimarySelection != null && PrimarySelection is ModelElement element) { using (Transaction t = element.Store.TransactionManager.BeginTransaction("TreeSelectionChanged")) { Diagram diagram = element.GetActiveDiagramView()?.Diagram; switch (PrimarySelection) { case ModelDiagramData modelDiagramData: // user selected a diagram. Open it. EFModelDocData docData = (EFModelDocData)TreeContainer.ModelingDocData; docData.OpenView(Constants.LogicalView, new Mexedge.VisualStudio.Modeling.ViewContext(modelDiagramData.Name, typeof(EFModelDiagram), docData.RootElement)); break; case ModelClass modelClass: // user selected a class. If it's in the current diagram, find it, center it and make it visible ShapeElement primaryShapeElement = PresentationViewsSubject.GetPresentation(modelClass) .OfType <ShapeElement>() .FirstOrDefault(s => s.Diagram == diagram); //if (primaryShapeElement == null || !primaryShapeElement.IsVisible) // break; modelClass.LocateInDiagram(true); // then fix up the compartments since they might need it ModelElement[] classElements = { modelClass }; CompartmentItemAddRule.UpdateCompartments(classElements, typeof(ClassShape), "AttributesCompartment", false); CompartmentItemAddRule.UpdateCompartments(classElements, typeof(ClassShape), "AssociationsCompartment", false); CompartmentItemAddRule.UpdateCompartments(classElements, typeof(ClassShape), "SourcesCompartment", false); // any associations to visible classes on this diagram need to be visible as well foreach (NavigationProperty navigationProperty in modelClass.LocalNavigationProperties()) { ModelClass other = navigationProperty.AssociationObject.Source == modelClass ? navigationProperty.AssociationObject.Target : navigationProperty.AssociationObject.Source; // should never happen if (other == null) { continue; } ShapeElement shapeElement = PresentationViewsSubject.GetPresentation(other) .OfType <ShapeElement>() .FirstOrDefault(s => s.Diagram == diagram); if (shapeElement != null && shapeElement.IsVisible) { ShapeElement connectorElement = PresentationViewsSubject.GetPresentation(navigationProperty.AssociationObject) .OfType <AssociationConnector>() .FirstOrDefault(s => s.Diagram == diagram); connectorElement?.Show(); } } // so do generalizations, as long as both classes are available foreach (Generalization generalization in modelClass.Store.ElementDirectory.AllElements.OfType <Generalization>().Where(g => g.Superclass == modelClass || g.Subclass == modelClass)) { ModelClass other = generalization.Superclass == modelClass ? generalization.Subclass : generalization.Superclass; // should never happen if (other == null) { continue; } ShapeElement shapeElement = PresentationViewsSubject.GetPresentation(other) .OfType <ShapeElement>() .FirstOrDefault(s => s.Diagram == diagram); if (shapeElement != null && shapeElement.IsVisible) { ShapeElement connectorElement = PresentationViewsSubject.GetPresentation(generalization) .OfType <GeneralizationConnector>() .FirstOrDefault(s => s.Diagram == diagram); connectorElement?.Show(); } } FixUpAllDiagrams.FixUp(diagram, modelClass.ModelRoot, modelClass); break; case ModelEnum modelEnum: // user selected an enum. Find it in the current diagram, center it and make it visible modelEnum.LocateInDiagram(true); // then fix up the compartment since it might need it ModelElement[] enumElements = { modelEnum }; CompartmentItemAddRule.UpdateCompartments(enumElements, typeof(EnumShape), "ValuesCompartment", false); FixUpAllDiagrams.FixUp(diagram, modelEnum.ModelRoot, modelEnum); break; } t.Commit(); } } }
public static bool SelectModelElement(this DiagramView diagramView, ModelElement modelElement, bool ensureVisible) { // Get the shape element that corresponds to the model element ShapeElement shapeElement = PresentationViewsSubject.GetPresentation(modelElement) .OfType <ShapeElement>() .FirstOrDefault(s => s.Diagram == diagramView.Diagram); if (shapeElement != null) { // Make sure the shape element is visible (because connectors can be hidden) if (!shapeElement.IsVisible) { shapeElement.Show(); } // Create a diagram item for this shape element and select it diagramView.Selection.Set(new DiagramItem(shapeElement)); if (ensureVisible) { diagramView.Selection.EnsureVisible(DiagramClientView.EnsureVisiblePreferences.ScrollIntoViewCenter); diagramView.ZoomAtViewCenter(1); } shapeElement.Invalidate(); return(true); } // If the model element does not have a shape, try to cast it IModelElementCompartment if (modelElement is IModelElementInCompartment compartmentedModelElement) { // Get the parent IModelElementWithCompartments parentModelElement = compartmentedModelElement.ParentModelElement; if (parentModelElement != null) { // Get the compartment that stores the model element CompartmentShape parentShapeElement = PresentationViewsSubject.GetPresentation((ModelElement)parentModelElement) .OfType <CompartmentShape>() .FirstOrDefault(s => s.Diagram == diagramView.Diagram); ElementListCompartment compartment = parentShapeElement?.GetCompartment(compartmentedModelElement.CompartmentName); if (compartment != null) { if (!compartment.IsExpanded) { using (Transaction trans = modelElement.Store.TransactionManager.BeginTransaction("IsExpanded")) { compartment.IsExpanded = true; trans.Commit(); } } // Find the model element in the compartment int index = compartment.Items.IndexOf(modelElement); if (index >= 0) { // Create a diagram item and select it diagramView.Selection.Set(new DiagramItem(compartment, compartment.ListField, new ListItemSubField(index))); if (ensureVisible) { diagramView.Selection.EnsureVisible(DiagramClientView.EnsureVisiblePreferences.ScrollIntoViewCenter); diagramView.ZoomAtViewCenter(1); } compartment.Invalidate(); return(true); } } } } return(false); }