This class represents a part of a compartment shape.
This part can be the head or an compartment element
Esempio n. 1
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);
            }
        }
Esempio n. 2
0
 /// <summary>
 /// Eventhandler
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void Shape_MouseDown(object sender, DiagramMouseEventArgs e)
 {
     entryBelowMouseDown = entryNowHoveringAbove.Clone();
 }
Esempio n. 3
0
        public ElementLink Connect(ModelElement source, ModelElement target)
        {
            if (source == null)
            {
                throw new ArgumentNullException("source");
            }
            if (target == null)
            {
                throw new ArgumentNullException("target");
            }

            // TODO bei fehler mit base in svn vergleichen ;)
            if (source != rememberedSourceShape || target != rememberedTargetShape)
            {
                Debug.Fail("Cannot create Connection for other then the rememberd ones.");
                throw new InvalidOperationException();
            }

            if (CanAcceptSourceAndTarget(source, target))
            {
                if (source is SOURCE_ELEMENT)
                {
                    if (target is TARGET_ELEMENT)
                    {
                        SOURCE_ELEMENT sourceAccepted = (SOURCE_ELEMENT)source;
                        TARGET_ELEMENT targetAccepted = (TARGET_ELEMENT)target;

                        ElementLink result;
                        if (rememberedSourceEntry.IsRegularShape)
                        {
                            result = CreateElementLink(sourceAccepted,
                                                       SelectedCompartmentPartType.None,
                                                       null,
                                                       targetAccepted,
                                                       rememberedTargetEntry.Type,
                                                       rememberedTargetEntry.Element as TARGET_COMPARTMENT_ENTRY);
                        }
                        else if (rememberedTargetEntry.IsRegularShape)
                        {
                            result = CreateElementLink(sourceAccepted,
                                                       rememberedSourceEntry.Type,
                                                       rememberedSourceEntry.Element as SOURCE_COMPARTMENT_ENTRY,
                                                       targetAccepted,
                                                       SelectedCompartmentPartType.None,
                                                       null);
                        }
                        else
                        {
                            result = CreateElementLink(sourceAccepted,
                                                       rememberedSourceEntry.Type,
                                                       rememberedSourceEntry.Element as SOURCE_COMPARTMENT_ENTRY,
                                                       targetAccepted,
                                                       rememberedTargetEntry.Type,
                                                       rememberedTargetEntry.Element as TARGET_COMPARTMENT_ENTRY);
                        }

                        if (DomainClassInfo.HasNameProperty(result))
                        {
                            DomainClassInfo.SetUniqueName(result);
                        }

                        rememberedSourceEntry = null;
                        rememberedTargetEntry = null;
                        rememberedSourceShape = null;
                        rememberedTargetShape = null;

                        return(result);
                    }
                }
            }
            Debug.Fail("Having agreed that the connection can be accepted we should never fail to make one.");
            throw new InvalidOperationException();
        }
Esempio n. 4
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));
                }
            }
        }