public ClassDefinition(SchemeNode parent, string name, bool copyExtensions, ClassDefinition[] extensions, params SlotDefinition[] slots)
            : base(parent)
        {
            if (parent == null)
                InnerIsSchemeEditable = false;

            CopyExtensions = copyExtensions;

            InnerName = name;
            InnerFullName = Version.ToString("D");

            if (extensions != null && extensions.Length > 0)
                foreach (ClassDefinition ext in extensions)
                    if (!InnerInheritanceList.Contains(ext.Name))
                        InnerExtend(ext, false, true);

            InnerInheritanceList[KeyName] = this;
                // Если в InheritanceList-е будут FullName, то потом сложно производить
                // диспач для бихейверов.
                // всущности, фул-нейм нужен, что бы сигнализировать о наличии "динамических" классов всписке
                // но не понятно, зачем это нужно!

            // XXX был Add, поменял на [] (Pilya)
            //KeyName,
            //	this);

            if (slots != null && slots.Length > 0)
                foreach (SlotDefinition slot in slots)
                    if (slot != null)
                        InnerAddSlot(slot, true, true);

            if (CopyExtensions)
                InnerBehavior = new BehaviorDispatcher(this);
            else
                ;// ?? надо думать!
        }
 public ClassDefinition(SchemeNode parent, string name, ClassDefinition[] extensions, params SlotDefinition[] slots)
     : this(parent, name, true, extensions, slots)
 {
 }
Exemple #3
0
 /// <summary>”станавливает обработчики событий на родительскую ноду</summary>
 protected virtual void AttachParent(SchemeNode pnode)
 {
     if (pnode == null) return;
     pnode.AfterParentChanged += ParentChangedEventHandler;
     pnode.AfterRootChanged += RootChangedEventHandler;
 }
Exemple #4
0
 public SchemeNode(SchemeNode parentNode)
 {
     InnerParentNode = parentNode;
     InnerRootNode = (InnerParentNode != null) ? InnerParentNode.RootNode : null;
 }
Exemple #5
0
        protected virtual void RootChangedEventHandler(object sender, EventArgs args)
        {
            // XXX код дублируетс¤ с InnerSetParentNode с отличием в вызове OnParentChanged...

            SchemeNode sn = InnerRootNode;
            InnerRootNode = (InnerParentNode != null && InnerRootNode != InnerParentNode.RootNode)
                        ? InnerParentNode.RootNode : null;

            if (sn != InnerRootNode) // не ма¤чим зазр¤ сменой рута, если небыло фактической смены!
                OnAfterRootChanged();
        }
Exemple #6
0
        //...............................................................................
        protected virtual SchemeNode InnerSetParentNode(SchemeNode node)
        {
            lock (this) {
                if (!CheckReadOnlyScheme()) {
                    DetachParent();

                    InnerParentNode = node;
                    SchemeNode sn = InnerRootNode;
                    InnerRootNode = (InnerParentNode != null && InnerRootNode != InnerParentNode.RootNode)
                                ? InnerParentNode.RootNode : null;

                    AttachParent(node);

                    OnAfterParentChanged();

                    if (sn != InnerRootNode) // не ма¤чим зазр¤ сменой рута, если небыло фактической смены!
                        OnAfterRootChanged();
                }
            }
            return InnerParentNode;
        }
Exemple #7
0
 public MetaInfo()
 {
     InnerRootNode = new SchemeNode();
 }