Ejemplo n.º 1
0
        public bool IsUnderContentGroup(PSMElement element, out PSMElement groupElement)
        {
            //Debug.Assert(PSMTreeIterator.ModelsElement(element));
            groupElement = null;
            if (element.ModelsElement() /* && !(element is PSMAttribute) */)
            {
                return(false);
            }
            PSMTreeIterator it = new PSMTreeIterator(element);

            while (it.CanGoToParent())
            {
                it.GoToParent();
                if (IsContentGroupNode(it.CurrentNode))
                {
                    groupElement = it.CurrentNode;
                    return(true);
                }
                if (it.CurrentNodeModelsElement())
                {
                    return(false);
                }
            }
            return(false);
        }
Ejemplo n.º 2
0
        private PSMElement groupingFuncBySignificantNode(EvolutionChange change)
        {
            PSMElement target = (change is ISubelementChange) ? ((ISubelementChange)change).ChangedSubelement : change.Element;

            if (target.ModelsElement())
            {
                return(target);
            }
            else
            {
                return(PSMTreeIterator.GetSignificantAncestorOrSelf(target, IsContentGroupNode));
            }
        }
Ejemplo n.º 3
0
        private Dictionary <PSMElement, List <EvolutionChange> > GroupByTargetSignificantNode()
        {
            Dictionary <PSMElement, List <EvolutionChange> > groupChanges = GroupChanges(groupingFuncBySignificantNode);

            foreach (EvolutionChange change in this)
            {
                List <PSMElement> secondaryTargets = new List <PSMElement>();
                if (change is IDoubleTargetChange)
                {
                    secondaryTargets.Add(((IDoubleTargetChange)change).SecondaryTarget);
                }
                else if (change is ISubelementChange)
                {
                    secondaryTargets.Add(change.Element);
                }


                foreach (PSMElement secondaryTarget in secondaryTargets)
                {
                    if (secondaryTarget == null)
                    {
                        continue;
                    }

                    PSMElement secondaryTargetNV = (PSMElement)secondaryTarget.GetInVersion(change.NewVersion);

                    if (secondaryTargetNV != null)
                    {
                        if (secondaryTargetNV.ModelsElement())
                        {
                            //secondaryTarget = secondaryTarget;
                        }
                        else
                        {
                            secondaryTargetNV = PSMTreeIterator.GetSignificantAncestorOrSelf(secondaryTargetNV, IsContentGroupNode);
                        }

                        if (secondaryTargetNV != null)
                        {
                            if (!groupChanges.ContainsKey(secondaryTargetNV))
                            {
                                groupChanges[secondaryTargetNV] = new List <EvolutionChange>();
                            }
                            if (!groupChanges[secondaryTargetNV].Contains(change))
                            {
                                groupChanges[secondaryTargetNV].Add(change);
                            }
                        }
                    }
                }
            }

            foreach (KeyValuePair <PSMElement, List <EvolutionChange> > kvp in groupChanges.ToDictionary(pair => pair.Key, pair => pair.Value))
            {
                PSMElement             target     = kvp.Key;
                List <EvolutionChange> changeList = kvp.Value;

                if (IsContentGroupNode(target))
                {
                    PSMElement groupParent = PSMTreeIterator.GetSignificantAncestorOrSelf(target);
                    if (groupParent == null)
                    {
                        groupParent = target;
                    }
                    if (!groupChanges.ContainsKey(groupParent))
                    {
                        groupChanges[groupParent] = new List <EvolutionChange>();
                    }
                    foreach (EvolutionChange change in changeList)
                    {
                        if (!groupChanges[groupParent].Contains(change))
                        {
                            groupChanges[groupParent].Add(change);
                        }
                    }
                }
            }

            return(groupChanges);
        }
Ejemplo n.º 4
0
        private static void GetSubtreeContentComponentsInclRoot(PSMElement node, ref List <NodeElementWrapper> e)
        {
            List <NodeElementWrapper> contentList = e;

            bool?group = null;

            if ((node is PSMClass) || (node is PSMContentContainer))
            {
                if (node.ModelsElement())
                {
                    group = false;
                }
                else
                {
                    group = true;
                }
            }

            if (group != null)      // i.e. (node is PSMClass) || (node is PSMContentContainer)
            {
                if (group == false) // not in group
                {
                    contentList.Add(new SimpleNodeElement(node));
                }
                else // in group
                {
                    if (EncompassesContentForParentSignificantNode(node))
                    {
                        ContentGroup cg = new ContentGroup();
                        cg.ContainingClass = (PSMClass)node;

                        if (((PSMClass)node).IsStructuralRepresentative && !node.ModelsElement())
                        {
                            PSMClass representedClass = ((PSMClass)node).RepresentedPSMClass;
                            cg.ContentComponents.Add(new StructuralRepresentativeElements((PSMClass)node, representedClass));
                        }

                        PSMTreeIterator it = new PSMTreeIterator(node);
                        foreach (PSMElement component in it.GetChildNodes())
                        {
                            List <NodeElementWrapper> tmp = new List <NodeElementWrapper>();
                            GetSubtreeContentComponentsInclRoot(component, ref tmp);
                            cg.ContentComponents.AddRange(tmp);
                        }
                        contentList.Add(cg);
                    }
                }
            }
            #region choice and union
            else if (node is PSMAttributeContainer)
            {
                foreach (PSMAttribute psmAttribute in ((PSMAttributeContainer)node).PSMAttributes)
                {
                    contentList.Add(new SimpleNodeElement(psmAttribute));
                }
            }
            else if ((node is PSMContentChoice) || (node is PSMClassUnion))
            {
                PSMTreeIterator            it      = new PSMTreeIterator(node);
                List <ChoiceElementOption> options = new List <ChoiceElementOption>();
                foreach (PSMElement childNode in it.GetChildNodes())
                {
                    List <NodeElementWrapper> items = new List <NodeElementWrapper>();
                    GetSubtreeContentComponentsInclRoot(childNode, ref items);
                    if (items.Count > 0)
                    {
                        ChoiceElementOption option = new ChoiceElementOption();
                        option.Items = items;
                        options.Add(option);
                    }
                }
                if (options.Count > 0)
                {
                    if (node is PSMContentChoice)
                    {
                        ChoiceElements choiceElements = new ChoiceElements((PSMContentChoice)node, options);
                        contentList.Add(choiceElements);
                    }
                    else
                    {
                        UnionElements unionElements = new UnionElements((PSMClassUnion)node, options);
                        contentList.Add(unionElements);
                    }
                }
            }
            #endregion
            else if (node is PSMAssociation)
            {
                GetSubtreeContentComponentsInclRoot(((PSMAssociation)node).Child, ref contentList);
            }
            return;
        }