/// <summary> /// Looks for a shape that represents a model element /// </summary> /// <param name="modelElement">a model element that is represented by a compartment shape</param> /// <returns>the shape</returns> private static ICompartmentMouseActionTrackable GetFirstCompartmentShapeForModelElement(ModelElement modelElement) { LinkedElementCollection <PresentationElement> presentations = PresentationViewsSubject.GetPresentation(modelElement); foreach (PresentationElement element in presentations) { ICompartmentMouseActionTrackable shape = element as ICompartmentMouseActionTrackable; if (shape != null) { return(shape); } } return(null); }
/// <summary> /// Test whether a given model element is acceptable to this ConnectionBuilder as the source of a connection. /// </summary> /// <param name="candidate">The model element to test.</param> /// <param name="forSourceAndTarget">false: this method is called to query only the source of a new connection, true: after this call the <see cref="CanAcceptAsSourceAndTarget"/> method will be called.</param> /// <returns>Whether the element can be used as the source of a connection.</returns> private bool CanAcceptAsSource(SOURCE_ELEMENT candidate, bool forSourceAndTarget) { ICompartmentMouseActionTrackable candidateShape = GetFirstCompartmentShapeForModelElement(candidate); if (candidateShape == null) // must be a regular shap { rememberedSourceShape = candidate; rememberedSourceEntry = new SelectedCompartmentPart() { IsRegularShape = true }; return(CanAcceptAsCompartmentSource(rememberedSourceShape, SelectedCompartmentPartType.None, null)); } else { rememberedSourceShape = candidate; SelectedCompartmentPart entry = (forSourceAndTarget ? candidateShape.MouseTrack.entryBelowMouseDown : candidateShape.MouseTrack.entryNowHoveringAbove).Clone(); // the Compartment Title is never valid as a source if (entry.Element is ElementListCompartment) { return(false); } if (entry.Type == SelectedCompartmentPartType.None || (entry.Type == SelectedCompartmentPartType.Head && !allowHeadAsSource) || (entry.Type == SelectedCompartmentPartType.Element && !(entry.Element is SOURCE_COMPARTMENT_ENTRY))) { return(false); } if (!forSourceAndTarget) { rememberedSourceEntry = entry; // everything fine for me. now ask the user to decide return(CanAcceptAsCompartmentSource(rememberedSourceShape, rememberedSourceEntry.Type, rememberedSourceEntry.Element as SOURCE_COMPARTMENT_ENTRY)); } return(true); } }
/// <summary> /// Test whether a given pair of model elements are acceptable to this ConnectionBuilder as the source and target of a connection /// </summary> /// <param name="candidateSource">The model element to test as a source</param> /// <param name="candidateTarget">The model element to test as a target</param> /// <returns>Whether the elements can be used as the source and target of a connection</returns> private bool CanAcceptAsSourceAndTarget(SOURCE_ELEMENT candidateSource, TARGET_ELEMENT candidateTarget) { if (!allowSelfReference && candidateSource == candidateTarget) { return(false); } if (candidateSource != rememberedSourceShape) { return(false); } ICompartmentMouseActionTrackable targetShape = GetFirstCompartmentShapeForModelElement(candidateTarget); if (targetShape == null) // it is a regular shape { rememberedTargetShape = candidateTarget; rememberedTargetEntry = new SelectedCompartmentPart() { IsRegularShape = true }; return(CanAcceptAsCompartmentTarget(rememberedTargetShape, SelectedCompartmentPartType.None, null) && CanAcceptAsCompartmentSourceAndTarget(rememberedSourceShape, rememberedSourceEntry.Type, rememberedSourceEntry.Element as SOURCE_COMPARTMENT_ENTRY, rememberedTargetShape, SelectedCompartmentPartType.None, null)); } else { rememberedTargetShape = candidateTarget; rememberedTargetEntry = targetShape.MouseTrack.entryNowHoveringAbove.Clone(); // the Compartment Title is never valid as a target if (rememberedTargetEntry.Element is ElementListCompartment) { return(false); } if (rememberedTargetEntry.Type == SelectedCompartmentPartType.None || (rememberedTargetEntry.Type == SelectedCompartmentPartType.Head && !allowHeadAsTarget) || (rememberedTargetEntry.Type == SelectedCompartmentPartType.Element && !(rememberedTargetEntry.Element is TARGET_COMPARTMENT_ENTRY))) { return(false); } // check some standart cases for source is compartment shape if (!rememberedSourceEntry.IsRegularShape) { if (rememberedSourceEntry.Type == SelectedCompartmentPartType.None || (rememberedSourceEntry.Type == SelectedCompartmentPartType.Head && !allowHeadAsSource) || (rememberedSourceEntry.Type == SelectedCompartmentPartType.Element && !(rememberedSourceEntry.Element is SOURCE_COMPARTMENT_ENTRY))) { return(false); } } // everything fine for me. now ask the user to decide if (!CanAcceptAsCompartmentTarget(rememberedTargetShape, rememberedTargetEntry.Type, rememberedTargetEntry.Element as TARGET_COMPARTMENT_ENTRY)) { return(false); } if (rememberedSourceEntry.IsRegularShape) { return(CanAcceptAsCompartmentSourceAndTarget(rememberedSourceShape, SelectedCompartmentPartType.None, null, rememberedTargetShape, rememberedTargetEntry.Type, rememberedTargetEntry.Element as TARGET_COMPARTMENT_ENTRY)); } else { return(CanAcceptAsCompartmentSourceAndTarget(rememberedSourceShape, rememberedSourceEntry.Type, rememberedSourceEntry.Element as SOURCE_COMPARTMENT_ENTRY, rememberedTargetShape, rememberedTargetEntry.Type, rememberedTargetEntry.Element as TARGET_COMPARTMENT_ENTRY)); } } }