/// <summary> /// Processes selected items (from TreeView) and shows a dialog, where the user /// can choose whether to create a new PSMClass or /// create a Structural Representative and select the PSMClass to represent /// or connect an existing root of a PSM Diagram /// </summary> public void ResolveRepresentants() { List <StructuralRepresentativeSelectorData> List = new List <StructuralRepresentativeSelectorData>(); StructuralRepresentativeSelectorData D; //Look for PSM Classes to represent foreach (TreeClasses T in Selected) { D = new StructuralRepresentativeSelectorData(); D.Representative = false; D.ExistingRootClass = false; D.TreeClass = T; List <PSMClass> possibleRepresented = T.PIMClass.DerivedPSMClasses.Where(PSMClass => PSMClass.Diagram == Controller.Diagram).ToList(); /* also allow to reference classes from referenced diagrams */ foreach (PSMDiagramReference diagramReference in ((PSMDiagram)Controller.Diagram).DiagramReferences) { PSMDiagramReference reference = diagramReference; possibleRepresented.AddRange(T.PIMClass.DerivedPSMClasses.Where(PSMClass => PSMClass.Diagram == reference.ReferencedDiagram)); } D.PossibleRepresented = possibleRepresented; D.PossibleRoots = T.PIMClass.DerivedPSMClasses.Where( PSMClass => PSMClass.Diagram == Controller.Diagram && (Controller.Diagram as PSMDiagram).Roots.Contains(PSMClass) && !PSMClass.SubtreeContains(SourcePSMClass) ).ToList(); D.RootsSelectionEnabled = D.PossibleRoots.Count > 0; if (D.PossibleRepresented.Count > 0) //Add only PSMClasses that are candidates for StructuralRepresentative { //Their corresponding PIM classes already have a PSMClass/Representative derived in current diagram D.SelectedRepresentative = D.PossibleRepresented[0]; if (D.RootsSelectionEnabled) //Candidate for Root to child transition { D.SelectedRootClass = D.PossibleRoots[0]; } List.Add(D); } } if (List.Count > 0) { SelectRepresentantDialog dialog = new SelectRepresentantDialog(); dialog.List.ItemsSource = List; dialog.ShowDialog(); } foreach (StructuralRepresentativeSelectorData data in List) { if (data.Representative) { data.TreeClass.Represented = data.SelectedRepresentative; } if (data.ExistingRootClass) { data.TreeClass.RootClass = data.SelectedRootClass; } } }