예제 #1
0
        /// <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;
                }
            }
        }