Пример #1
0
        void AddCodonsToExtension(Extension e, XmlElement el, ConditionCollection conditions)
        {
            foreach (object o in el.ChildNodes) {
                if (!(o is XmlElement)) {
                    continue;
                }
                XmlElement curEl = (XmlElement)o;

                switch (curEl.Name) {
                    case "And": // these nodes are silently ignored.
                    case "Or":
                    case "Not":
                    case "Condition":
                        break;
                    case "Conditional":
                        ICondition condition = null;

                        // construct condition
                        if (curEl.Attributes.Count == 0 || (curEl.Attributes.Count == 1 && curEl.Attributes["action"] != null)) {
                            condition = BuildComplexCondition(curEl);

                            // set condition action manually
                            if (curEl.Attributes["action"] != null) {
                                condition.Action = (ConditionFailedAction)Enum.Parse(typeof(ConditionFailedAction), curEl.Attributes["action"].InnerText);
                            }

                            if (condition == null) {
                                throw new AddInTreeFormatException("empty conditional, but no condition definition found.");
                            }
                        } else {
                            condition = AddInTreeSingleton.AddInTree.ConditionFactory.CreateCondition(this, curEl);
                            AutoInitializeAttributes(condition, curEl);
                        }

                        // put the condition at the end of the condition 'stack'
                        conditions.Add(condition);

                        // traverse the subtree
                        AddCodonsToExtension(e, curEl, conditions);

                        // now we are back to the old level, remove the condition
                        // that was applied to the subtree.
                        conditions.RemoveAt(conditions.Count - 1);
                        break;
                    default:
                        ICodon codon = AddInTreeSingleton.AddInTree.CodonFactory.CreateCodon(this, curEl);

                        AutoInitializeAttributes(codon, curEl);

                        // Ensure that the codon is inserted after the codon which is defined
                        // before in the add-in definition.
                        // The codons get topologically sorted and if I don't set the InsertAfter they may
                        // change it's sorting order.
                        e.Conditions[codon.ID] = new ConditionCollection(conditions);
                        if (codon.InsertAfter == null && codon.InsertBefore == null && e.CodonCollection.Count > 0) {
                            codon.InsertAfter = new string[] { ((ICodon)e.CodonCollection[e.CodonCollection.Count - 1]).ID };
                        }

                        e.CodonCollection.Add(codon);
                        if (curEl.ChildNodes.Count > 0) {
                            Extension newExtension = new Extension(e.Path + '/' + codon.ID);
                            AddCodonsToExtension(newExtension, curEl, conditions);
                            extensions.Add(newExtension);
                        }
                        break;
                }
            }
        }