コード例 #1
0
        /// <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);
        }
コード例 #2
0
        /// <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);
            }
        }
コード例 #3
0
        /// <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));
                }
            }
        }