public override bool CanExecute() { PSMAttribute att = Project.TranslateComponent <PSMAttribute>(AttributeGuid); PSMClass target = Project.TranslateComponent <PSMClass>(ClassGuid); PSMClass source = att.PSMClass; if (source.GetSRs().Contains(target) || target.GetSRs().Contains(source)) { return(true); } if (source.GetNearestCommonAncestorClass(target) == null) { ErrorDescription = CommandErrors.CMDERR_NO_COMMON_ANCESTOR_CLASS; return(false); } return(true); }
public override bool CanExecute() { if (!(representant != Guid.Empty && Project.VerifyComponentType <PSMClass>(representant))) { ErrorDescription = CommandErrors.CMDERR_INPUT_TYPE_MISMATCH; return(false); } if (represented == Guid.Empty) { return(true); } PSMClass representantClass = Project.TranslateComponent <PSMClass>(representant); PSMClass representedClass = Project.TranslateComponent <PSMClass>(represented); if (representantClass.Interpretation != representedClass.Interpretation) { ErrorDescription = CommandErrors.CMDERR_NOT_SAME_INTERPRETATION; return(false); } if (representedClass.RepresentedClass == representantClass || representedClass == representantClass || representedClass.GetSRs().Contains(representantClass)) { ErrorDescription = CommandErrors.CMDERR_CYCLIC_REPR; return(false); } PSMClass representedNIC = representedClass.NearestInterpretedClass(); PSMClass representantNIC = representantClass.NearestInterpretedClass(); if (representedNIC == null && representantNIC == null) { return(true); } if (representedNIC == null || representantNIC == null) { ErrorDescription = CommandErrors.CMDERR_REPR_DIFFERENT_CONTEXT; return(false); } if (representedNIC.Interpretation == representantNIC.Interpretation) { return(true); } else { ErrorDescription = CommandErrors.CMDERR_REPR_DIFFERENT_CONTEXT; return(false); } }
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 }); } } }