Beispiel #1
0
        public override bool CanExecute()
        {
            if (!(newClassGuid != Guid.Empty &&
                  Project.VerifyComponentType <PSMClass>(newClassGuid) &&
                  attributeGuid != Guid.Empty &&
                  Project.VerifyComponentType <PSMAttribute>(attributeGuid)))
            {
                ErrorDescription = CommandErrors.CMDERR_INPUT_TYPE_MISMATCH;
                return(false);
            }

            PSMClass newClass = Project.TranslateComponent <PSMClass>(newClassGuid);
            PSMClass oldClass = Project.TranslateComponent <PSMAttribute>(attributeGuid).PSMClass;

            //the two classes connected by an association path across containers (atomic operation)
            if (newClass.NearestParentClass() == oldClass)
            {
                return(true);
            }
            if (oldClass.NearestParentClass() == newClass)
            {
                return(true);
            }

            if (newClass.RepresentedClass == oldClass || oldClass.RepresentedClass == newClass)
            {
                return(true);
            }

            ErrorDescription = CommandErrors.CMDERR_NO_COMMON_ASSOCIATION_OR_REPR;
            return(false);
        }
Beispiel #2
0
        internal override void GenerateSubCommands()
        {
            PSMAttribute attribute   = Project.TranslateComponent <PSMAttribute>(AttributeGuid);
            PSMClass     sourceClass = attribute.PSMClass;
            PSMClass     targetClass = Project.TranslateComponent <PSMClass>(ClassGuid);

            if (sourceClass.GetSRs().Contains(targetClass))
            {
                List <PSMClass> intermediateClasses = new List <PSMClass>();
                PSMClass        current             = sourceClass;

                while (current != targetClass)
                {
                    current = current.RepresentedClass;
                    intermediateClasses.Add(current);
                }

                foreach (PSMClass i in intermediateClasses)
                {
                    Commands.Add(new acmdMovePSMAttribute(Controller, AttributeGuid, i)
                    {
                        Propagate = Propagate
                    });
                }
            }
            else if (targetClass.GetSRs().Contains(sourceClass))
            {
                List <PSMClass> intermediateClasses = new List <PSMClass>();
                PSMClass        current             = targetClass;

                while (current != sourceClass)
                {
                    intermediateClasses.Add(current);
                    current = current.RepresentedClass;
                }

                foreach (PSMClass i in intermediateClasses.Reverse <PSMClass>())
                {
                    Commands.Add(new acmdMovePSMAttribute(Controller, AttributeGuid, i)
                    {
                        Propagate = Propagate
                    });
                }
            }
            else
            {
                List <PSMClass> intermediateClasses = new List <PSMClass>();
                PSMClass        common = sourceClass.GetNearestCommonAncestorClass(targetClass);
                Debug.Assert(common != null, "Common Ancestor Class Null");
                if (common != sourceClass)
                {
                    //move up to common class
                    PSMClass parent = sourceClass.NearestParentClass();
                    while (parent != common)
                    {
                        intermediateClasses.Add(parent);
                        parent = parent.NearestParentClass();
                    }
                    intermediateClasses.Add(common);
                }

                if (common.IsDescendantFrom(targetClass))
                {
                    //move up
                    PSMClass parent = common.NearestParentClass();
                    while (parent != targetClass)
                    {
                        intermediateClasses.Add(parent);
                        parent = parent.NearestParentClass();
                    }
                    intermediateClasses.Add(targetClass);
                }
                else if (targetClass.IsDescendantFrom(common))
                {
                    //move down
                    List <PSMClass> intermediateClasses2 = new List <PSMClass>();
                    intermediateClasses2.Add(targetClass);
                    PSMClass parent = targetClass.NearestParentClass();
                    while (parent != common)
                    {
                        intermediateClasses2.Add(parent);
                        parent = parent.NearestParentClass();
                    }
                    intermediateClasses2.Reverse();
                    intermediateClasses.AddRange(intermediateClasses2);
                }
                else if (targetClass == common)
                {
                    //nothing
                }
                else
                {
                    Debug.Assert(false, "error - common class not reachable?");
                }

                foreach (PSMClass psmClass in intermediateClasses)
                {
                    Commands.Add(new acmdMovePSMAttribute(Controller, AttributeGuid, psmClass)
                    {
                        Propagate = Propagate
                    });
                }
            }
        }