public void OnComponentRemoved(object obj)
        {
            ObjectIDmap          map = null;
            ClassInstancePointer cr  = obj as ClassInstancePointer;

            if (cr != null)
            {
                map = _loader.ObjectMap.GetMap(cr.ObjectInstance);
            }
            else
            {
                map = _loader.ObjectMap.GetMap(obj);
            }
            if (map != null)
            {
                TreeNode node = null;
                if (cr != null)
                {
                    node = _objExplorer.LocateNode(cr);
                }
                else
                {
                    IObjectPointer o = DesignUtil.CreateObjectPointer(map, obj);
                    node = _objExplorer.LocateNode(o);
                }
                if (node != null)
                {
                    node.Remove();
                }
            }
        }
Пример #2
0
        public void OnWriteToXmlNode(IXmlCodeWriter writer0, XmlNode node)
        {
            XmlObjectWriter writer        = (XmlObjectWriter)writer0;
            UInt32          methodClassId = _method.Owner.RootPointer.ClassId;

            XmlUtil.SetAttribute(node, XmlTags.XMLATT_MethodID, MemberId);
            if (methodClassId != writer.ObjectList.ClassId)
            {
                XmlUtil.SetAttribute(node, XmlTags.XMLATT_ownerClassID, methodClassId);
            }
            //_holder:LocalVariable -- inside a methd:MemberId = variable id
            //_holder:ClassPointer -- on the top level
            //_holder:ClassInstancePointer -- member of the parent level, identified by MemberId
            LocalVariable var = Holder as LocalVariable;

            if (var != null)
            {
                XmlUtil.SetAttribute(node, XmlTags.XMLATT_varId, Holder.MemberId);
            }
            else
            {
                ClassInstancePointer cp = _holder as ClassInstancePointer;
                if (cp != null)
                {
                    XmlNode nd = XmlUtil.CreateSingleNewElement(node, XmlTags.XML_ClassInstance);
                    cp.OnPostSerialize(writer.ObjectList, nd, true, writer);
                }
                else
                {
                    MemberComponentIdCustomInstance mcci = this.Holder as MemberComponentIdCustomInstance;
                    if (mcci != null)
                    {
                        XmlUtil.SetAttribute(node, XmlTags.XMLATT_instanceId, mcci.Pointer.MemberId);
                        cp = (ClassInstancePointer)(mcci.Owner);
                        XmlNode nd = XmlUtil.CreateSingleNewElement(node, XmlTags.XML_ClassInstance);
                        cp.OnPostSerialize(writer.ObjectList, nd, true, writer);
                    }
                    else
                    {
                        MemberComponentIdCustom mcc = this.Holder as MemberComponentIdCustom;
                        if (mcc != null)
                        {
                            XmlUtil.SetAttribute(node, XmlTags.XMLATT_instanceId, mcc.Pointer.MemberId);
                        }
                        else
                        {
                        }
                    }
                }
            }
        }
Пример #3
0
 public override void OnPostSerialize(ObjectIDmap objMap, XmlNode objectNode, bool saved, object serializer)
 {
     if (saved)
     {
     }
     else
     {
         if (MemberId == objMap.MemberId)
         {
             ClassPointer = objMap.GetTypedData <ClassPointer>();
         }
         else
         {
             ClassInstancePointer cr = DesignUtil.GetClassRef(WholeId, objMap);
             if (cr != null)
             {
                 ClassPointer = cr;
             }
             else
             {
                 object v = objMap.GetObjectByID(MemberId);
                 if (v == null)
                 {
                     if (objMap.Count == 0)
                     {
                     }
                     else
                     {
                         if (MemberId == 3667767822)
                         {
                             //it is the HtmlElement_body
                         }
                         else
                         {
                             //this time the object may not be available.
                         }
                     }
                 }
                 else
                 {
                     MemberComponentId mc = MemberComponentId.CreateMemberComponentId(objMap.GetTypedData <ClassPointer>(), v, MemberId, null);
                     ClassPointer = mc;
                 }
             }
         }
     }
 }
        public void OnComponentRemoved(object obj)
        {
            ObjectIDmap          map = null;
            ClassInstancePointer cr  = obj as ClassInstancePointer;

            if (cr != null)
            {
                map = _loader.ObjectMap.GetMap(cr.ObjectInstance);
            }
            else
            {
                map = _loader.ObjectMap.GetMap(obj);
                if (map == null)
                {
                    IComponent ic = obj as IComponent;
                    if (ic != null && ic.Site != null)
                    {
                        object key = _loader.ObjectMap.GetObjectByName(ic.Site.Name);
                        if (key != null)
                        {
                            obj = key;
                            map = _loader.ObjectMap;
                        }
                    }
                }
            }
            if (map != null)
            {
                TreeNode node = null;
                if (cr != null)
                {
                    node = _objExplorer.LocateNode(cr);
                }
                else
                {
                    IObjectPointer o = DesignUtil.CreateObjectPointer(map, obj);
                    node = _objExplorer.LocateNode(o);
                }
                if (node != null)
                {
                    node.Remove();
                }
            }
        }
Пример #5
0
        public virtual void OnWriteToXmlNode(IXmlCodeWriter writer0, XmlNode node)
        {
            XmlObjectWriter writer = writer0 as XmlObjectWriter;

            if (writer == null)
            {
                throw new DesignerException("Error writing CustomPropertyPointer. writer0 is not a XmlObjectWriter");
            }
            if (writer.ObjectList == null)
            {
                throw new DesignerException("Error writing CustomPropertyPointer. writer0 does not contain object map");
            }
            if (node == null)
            {
                throw new DesignerException("Error writing CustomPropertyPointer. Target XmlNode is null.");
            }
            XmlUtil.SetAttribute(node, XmlTags.XMLATT_PropId, MemberId);
            if (ClassId != writer.ObjectList.ClassId)
            {
                XmlUtil.SetAttribute(node, XmlTags.XMLATT_ownerClassID, ClassId);
            }
            LocalVariable var = _holder as LocalVariable;

            if (var != null)
            {
                XmlUtil.SetAttribute(node, XmlTags.XMLATT_varId, _holder.MemberId);
            }
            else
            {
                ClassInstancePointer cp = _holder as ClassInstancePointer;
                if (cp != null)
                {
                    XmlNode nd = XmlUtil.CreateSingleNewElement(node, XmlTags.XML_ClassInstance);
                    cp.OnPostSerialize(writer.ObjectList, nd, true, writer);
                }
            }
        }
Пример #6
0
        /// <summary>
        /// called from the holding class
        /// </summary>
        /// <param name="reader"></param>
        /// <param name="node"></param>
        public void OnReadFromXmlNode(IXmlCodeReader reader0, XmlNode node)
        {
            XmlObjectReader reader = (XmlObjectReader)reader0;

            _xmlNode = node;
            //retrieve _holder, _method
            //method id
            UInt32 memberId = XmlUtil.GetAttributeUInt(node, XmlTags.XMLATT_MethodID);

            MemberId = memberId;             //method id
            //
            UInt32 varId = XmlUtil.GetAttributeUInt(node, XmlTags.XMLATT_varId);

            if (varId == 0)
            {
                //try backward compatible
                varId = XmlUtil.GetAttributeUInt(node, XmlTags.XMLATT_ComponentID);
                if (varId != 0)
                {
                    ClassPointer  root0 = reader.ObjectList.GetTypedData <ClassPointer>();
                    LocalVariable lv    = root0.GetLocalVariable(varId);
                    if (lv == null)
                    {
                        varId = 0;
                    }
                    else
                    {
                        _holder = lv;
                        ClassId = lv.ClassType.DefinitionClassId;
                        ClassPointer r = reader.ObjectList.Project.GetTypedData <ClassPointer>(ClassId);
                        _method = r.GetCustomMethodById(memberId);
                    }
                }
            }
            if (varId != 0)
            {
                ClassPointer  root0 = reader.ObjectList.GetTypedData <ClassPointer>();
                LocalVariable lv    = root0.GetLocalVariable(varId);
                _holder = lv;
                ClassId = lv.ClassType.DefinitionClassId;
                ClassPointer r = reader.ObjectList.Project.GetTypedData <ClassPointer>(ClassId);
                _method = r.GetCustomMethodById(memberId);
            }
            else
            {
                XmlNode nd = node.SelectSingleNode(XmlTags.XML_ClassInstance);
                if (nd != null)
                {
                    ClassInstancePointer cp = new ClassInstancePointer();
                    cp.OnPostSerialize(reader.ObjectList, nd, false, reader);
                    if (cp.Definition == null)
                    {
                        cp.ReplaceDeclaringClassPointer(ClassPointer.CreateClassPointer(cp.DefinitionClassId, reader.ObjectList.Project));
                    }
                    _method = cp.Definition.GetCustomMethodById(memberId);
                    _holder = cp;
                    ClassId = cp.DefinitionClassId;
                }
                else
                {
                    UInt32 cid = XmlUtil.GetAttributeUInt(node, XmlTags.XMLATT_ownerClassID);
                    if (cid != 0)
                    {
                        ClassPointer root0 = ClassPointer.CreateClassPointer(cid, reader.ObjectList.Project);
                        varId = XmlUtil.GetAttributeUInt(node, XmlTags.XMLATT_instanceId);
                        if (varId != 0)
                        {
                            ClassPointer root = reader.ObjectList.GetTypedData <ClassPointer>();
                            _holder = new ClassInstancePointer(root, root0, varId);
                            ClassId = root.ClassId;
                        }
                        else
                        {
                            _holder = root0;
                            ClassId = root0.ClassId;
                        }
                        _method = root0.GetCustomMethodById(memberId);
                    }
                    else
                    {
                        if (XmlUtil.GetAttributeUInt(node, XmlTags.XMLATT_ClassID) == 0)
                        {
                            ClassPointer root0 = reader.ObjectList.GetTypedData <ClassPointer>();
                            _holder = root0;
                            ClassId = root0.ClassId;
                            _method = root0.GetCustomMethodById(memberId);
                        }
                    }
                }
            }
            if (_method == null)
            {
                //===backward compatibility========================================
                UInt32 classId = XmlUtil.GetAttributeUInt(node, XmlTags.XMLATT_ClassID);
                ClassId = classId;
                UInt32 instId = XmlUtil.GetAttributeUInt(node, XmlTags.XMLATT_instanceId);
                if (instId != 0)
                {
                    if (classId != 0 && classId != reader.ObjectList.ClassId)
                    {
                        //it is a static instance from another class
                        //for a custom class the holder is a MemberComponentIdCustom
                        //for a library class the holder is a
                        ClassPointer cp0 = ClassPointer.CreateClassPointer(classId, reader.ObjectList.Project);
                        if (cp0 == null)
                        {
                            _error = string.Format(System.Globalization.CultureInfo.InvariantCulture, "Class {0} not found in the project", classId);
                        }
                        else
                        {
                            if (cp0.ObjectList.Count == 0)
                            {
                                //cp0 not loaded. load it now
                                cp0.ObjectList.LoadObjects();
                                if (cp0.ObjectList.Reader.HasErrors)
                                {
                                    MathNode.Log(cp0.ObjectList.Reader.Errors);
                                    cp0.ObjectList.Reader.ResetErrors();
                                }
                            }
                            IClassRef ic = cp0.ObjectList.GetClassRefById(instId);
                            if (ic == null)
                            {
                                _error = string.Format(System.Globalization.CultureInfo.InvariantCulture, "Instance {0} not found in Class {1}", instId, classId);
                            }
                            else
                            {
                                ClassInstancePointer vi = ic as ClassInstancePointer;
                                if (vi == null)
                                {
                                    _error = string.Format(System.Globalization.CultureInfo.InvariantCulture, "Instance {0},{1} in Class {2} is not a class-instance-pointer", instId, ic.GetType(), classId);
                                }
                                else
                                {
                                    MemberComponentIdCustom mc = new MemberComponentIdCustom(cp0, vi, instId);
                                    _holder = mc;
                                    _method = vi.Definition.GetCustomMethodById(memberId);
                                }
                            }
                        }
                    }
                    else
                    {
                        XmlNode nd = node.SelectSingleNode(XmlTags.XML_ClassInstance);
                        if (nd != null)
                        {
                            ClassInstancePointer cp = new ClassInstancePointer();
                            cp.OnPostSerialize(reader.ObjectList, nd, false, reader);
                            ClassInstancePointer            vi   = (ClassInstancePointer)cp.Definition.ObjectList.GetClassRefById(instId);
                            MemberComponentIdCustomInstance mcci = new MemberComponentIdCustomInstance(cp, vi, instId);
                            _holder = mcci;
                            _method = vi.Definition.GetCustomMethodById(memberId);
                            ClassId = vi.ClassId;
                        }
                        else
                        {
                            ClassPointer         root0 = reader.ObjectList.GetTypedData <ClassPointer>();
                            ClassInstancePointer cp    = (ClassInstancePointer)reader.ObjectList.GetClassRefById(instId);
                            if (cp != null)
                            {
                                MemberComponentIdCustom mcc = new MemberComponentIdCustom(root0, cp, instId);
                                _holder = mcc;
                                _method = cp.Definition.GetCustomMethodById(memberId);
                                ClassId = cp.ClassId;
                            }
                            else
                            {
                                //try to fix the error
                                foreach (object o in reader.ObjectList.Keys)
                                {
                                    cp = reader.ObjectList.GetClassRefByObject(o) as ClassInstancePointer;
                                    if (cp != null)
                                    {
                                        _method = cp.Definition.GetCustomMethodById(memberId);
                                        if (_method != null)
                                        {
                                            instId  = reader.ObjectList.GetObjectID(o);
                                            _holder = new MemberComponentIdCustom(root0, cp, instId);
                                            ClassId = cp.ClassId;
                                            //fix the instance id
                                            XmlUtil.SetAttribute(node, XmlTags.XMLATT_instanceId, instId);
                                            break;
                                        }
                                    }
                                }
                                if (_holder == null)
                                {
                                    _error = string.Format(System.Globalization.CultureInfo.InvariantCulture, "Component {0} is not a customer class instance in class {1}", instId, root0.ClassId);
                                }
                            }
                        }
                    }
                }
                else
                {
                    if (classId == 0)
                    {
                        ClassPointer root0 = reader.ObjectList.GetTypedData <ClassPointer>();
                        _holder = root0;
                        _method = root0.GetCustomMethodById(memberId);
                    }
                    else
                    {
                        ClassPointer root0 = ClassPointer.CreateClassPointer(classId, reader.ObjectList.Project);
                        if (root0 != null)
                        {
                            _holder = root0;
                            _method = root0.GetCustomMethodById(memberId);
                        }
                        if (_method == null)
                        {
                            //backward compatibility
                            UInt32       holderMemberId = XmlUtil.GetAttributeUInt(node, XmlTags.XMLATT_ComponentID);
                            ClassPointer root           = reader.ObjectList.GetTypedData <ClassPointer>();
                            UInt32       holderClassId  = XmlUtil.GetAttributeUInt(node.OwnerDocument.DocumentElement, XmlTags.XMLATT_ClassID);
                            if (holderClassId == classId)                             //holder is in the same class
                            {
                                _method = root.GetCustomMethodById(memberId);
                                if (holderMemberId == 0 || holderMemberId == reader.ObjectList.MemberId)                                        //not an instance
                                {
                                    _holder = root;
                                }
                                else
                                {
                                    _holder = (IClass)reader.ObjectList.GetClassRefById(holderMemberId);
                                }
                                if (_holder == null)
                                {
                                    _error = string.Format(System.Globalization.CultureInfo.InvariantCulture, "Invalid method holder Id [{0},{1}] for method [{2}.{3}]", classId, holderMemberId, _method.Owner, _method.Name);
                                }
                            }
                            else                             //holder and declarer are different classes
                            {
                                ClassPointer declarer = ClassPointer.CreateClassPointer(classId, reader.ObjectList.Project);
                                _method = declarer.GetCustomMethodById(memberId);
                                if (_method == null)
                                {
                                    _error = string.Format(System.Globalization.CultureInfo.InvariantCulture, "Method [{0}] not found in class [{1}]", memberId, classId);
                                }
                                else
                                {
                                    //holder an instance?
                                    object v = reader.ObjectList.GetObjectByID(holderMemberId);
                                    if (v != null)
                                    {
                                        if (v == reader.ObjectList.GetRootObject())
                                        {
                                            _holder = reader.ObjectList.GetTypedData <ClassPointer>();
                                        }
                                        else
                                        {
                                            _holder = reader.ObjectList.GetClassRefByObject(v) as IClass;
                                        }
                                    }
                                    if (_holder == null)
                                    {
                                        //holder is a local variable
                                        LocalVariable lv = root.GetLocalVariable(holderMemberId);
                                        _holder = lv;
                                    }
                                    if (_holder == null)
                                    {
                                        _error = string.Format(System.Globalization.CultureInfo.InvariantCulture, "Invalid method holder Id [{0},{1}] for method [{2}.{3}] from declaring class {4}", holderClassId, holderMemberId, _method.Owner, _method.Name, classId);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        /// <summary>
        /// called from the holding class
        /// </summary>
        /// <param name="reader"></param>
        /// <param name="node"></param>
        public void OnReadFromXmlNode(IXmlCodeReader reader0, XmlNode node)
        {
            XmlObjectReader reader = (XmlObjectReader)reader0;
            //retrieve _holder, _event
            UInt32 memberId = XmlUtil.GetAttributeUInt(node, XmlTags.XMLATT_EventId);            //declaring event id

            MemberId = memberId;
            //
            UInt32 varId = XmlUtil.GetAttributeUInt(node, XmlTags.XMLATT_varId);

            if (varId != 0)
            {
                ClassPointer  root0 = reader.ObjectList.GetTypedData <ClassPointer>();
                LocalVariable lv    = root0.GetLocalVariable(varId);
                _holder = lv;
                ClassId = lv.ClassType.DefinitionClassId;
                ClassPointer r = reader.ObjectList.Project.GetTypedData <ClassPointer>(ClassId);
                _event = r.GetCustomEventById(memberId);
            }
            else
            {
                XmlNode nd = node.SelectSingleNode(XmlTags.XML_ClassInstance);
                if (nd != null)
                {
                    ClassInstancePointer cp = new ClassInstancePointer();
                    cp.OnPostSerialize(reader.ObjectList, nd, false, reader);
                    _event  = cp.Definition.GetCustomEventById(memberId);
                    _holder = cp;
                    ClassId = cp.DefinitionClassId;
                }
                else
                {
                    UInt32 cid = XmlUtil.GetAttributeUInt(node, XmlTags.XMLATT_ownerClassID);
                    if (cid != 0)
                    {
                        ClassPointer root0 = ClassPointer.CreateClassPointer(cid, reader.ObjectList.Project);
                        _holder = root0;
                        ClassId = root0.ClassId;
                        _event  = root0.GetCustomEventById(memberId);
                    }
                    else
                    {
                        if (XmlUtil.GetAttributeUInt(node, XmlTags.XMLATT_ClassID) == 0)
                        {
                            ClassPointer root0 = reader.ObjectList.GetTypedData <ClassPointer>();
                            _holder = root0;
                            ClassId = root0.ClassId;
                            _event  = root0.GetCustomEventById(memberId);
                        }
                    }
                }
            }
            if (_event == null)
            {
                //===backward compatibility==================================================
                UInt32 instId = XmlUtil.GetAttributeUInt(node, XmlTags.XMLATT_instanceId);
                if (instId != 0)
                {
                    XmlNode nd = node.SelectSingleNode(XmlTags.XML_ClassInstance);
                    if (nd != null)
                    {
                        ClassInstancePointer cp = new ClassInstancePointer();
                        cp.OnPostSerialize(reader.ObjectList, nd, false, reader);
                        ClassInstancePointer            vi   = (ClassInstancePointer)cp.Definition.ObjectList.GetClassRefById(instId);
                        MemberComponentIdCustomInstance mcci = new MemberComponentIdCustomInstance(cp, vi, instId);
                        _holder = mcci;
                        _event  = vi.Definition.GetCustomEventById(memberId);
                        ClassId = vi.ClassId;
                    }
                    else
                    {
                        ClassPointer            root0 = reader.ObjectList.GetTypedData <ClassPointer>();
                        ClassInstancePointer    cp    = (ClassInstancePointer)reader.ObjectList.GetClassRefById(instId);
                        MemberComponentIdCustom mcc   = new MemberComponentIdCustom(root0, cp, instId);
                        _holder = mcc;
                        _event  = cp.Definition.GetCustomEventById(memberId);
                        ClassId = cp.ClassId;
                    }
                }
                else
                {
                    if (XmlUtil.GetAttributeUInt(node, XmlTags.XMLATT_ClassID) == 0)
                    {
                        ClassPointer root0 = reader.ObjectList.GetTypedData <ClassPointer>();
                        _holder = root0;
                        ClassId = root0.ClassId;
                        _holder = root0;
                        _event  = root0.GetCustomEventById(memberId);
                    }
                    else
                    {
                        //backward compatibility
                        UInt32 classId        = XmlUtil.GetAttributeUInt(node, XmlTags.XMLATT_ClassID);                  //declaring class id
                        UInt32 holderMemberId = XmlUtil.GetAttributeUInt(node, XmlTags.XMLATT_ComponentID);              //holding class member id
                        ClassId  = classId;
                        MemberId = memberId;
                        UInt32       holderClassId = XmlUtil.GetAttributeUInt(node.OwnerDocument.DocumentElement, XmlTags.XMLATT_ClassID);
                        ClassPointer root          = reader.ObjectList.Project.GetTypedData <ClassPointer>(holderClassId);
                        if (holderClassId == classId)                         //holder is in the same class
                        {
                            _event = root.GetCustomEventById(memberId);
                            if (holderMemberId == 0 || holderMemberId == reader.ObjectList.MemberId)                            //not an instance
                            {
                                _holder = ClassPointer.CreateClassPointer(reader.ObjectList);
                            }
                            else
                            {
                                _holder = (IClass)reader.ObjectList.GetClassRefById(holderMemberId);
                            }
                        }
                        else                         //holder and declarer are different classes
                        {
                            ClassPointer baseClass = root.GetBaseClass(classId);
                            if (baseClass != null)
                            {
                                EventClass eb = baseClass.GetCustomEventById(memberId);
                                if (eb == null)
                                {
                                    throw new DesignerException("Error reading custom event pointer: invalid event Id [{0},{1}] in class [{2}]", classId, memberId, holderClassId);
                                }
                                _event = eb.CreateInherited(root);
                            }
                            else
                            {
                                ClassPointer declarer = ClassPointer.CreateClassPointer(classId, reader.ObjectList.Project);
                                _event = declarer.GetCustomEventById(memberId);
                            }
                            //holder an instance?
                            object v = reader.ObjectList.GetObjectByID(holderMemberId);
                            if (v != null)
                            {
                                _holder = reader.ObjectList.GetClassRefByObject(v) as IClass;
                            }
                            if (_holder == null)
                            {
                                //holder is a local variable
                                //ClassPointer root = reader.ObjectList.GetTypedData<ClassPointer>();
                                LocalVariable lv = root.GetLocalVariable(holderMemberId);
                                _holder = lv;
                            }
                        }
                    }
                }
            }
            if (_event == null)
            {
                throw new DesignerException("Error reading custom event pointer: [{0}]", node.InnerXml);
            }
            if (_holder == null)
            {
                throw new DesignerException("Invalid custom event pointer. Holder not found. [{0}]", node.InnerXml);
            }
        }
Пример #8
0
        /// <summary>
        /// called from the holding class
        /// </summary>
        /// <param name="reader"></param>
        /// <param name="node"></param>
        public virtual void OnReadFromXmlNode(IXmlCodeReader reader0, XmlNode node)
        {
            XmlObjectReader reader = (XmlObjectReader)reader0;
            //retrieve _holder, _property
            UInt32 memberId = XmlUtil.GetAttributeUInt(node, XmlTags.XMLATT_PropId); //declaring property id

            MemberId = memberId;                                                     //id PropertyClass
            //
            UInt32 varId = XmlUtil.GetAttributeUInt(node, XmlTags.XMLATT_varId);

            if (varId != 0)
            {
                ClassPointer root0 = reader.ObjectList.GetTypedData <ClassPointer>();
                if (root0 == null)
                {
                    root0 = reader.ObjectList.Project.GetTypedData <ClassPointer>(reader.ObjectList.ClassId);
                    if (root0 == null)
                    {
                        root0 = reader.ObjectList.RootPointer as ClassPointer;
                        if (root0 == null)
                        {
                            MathNode.Log(TraceLogClass.MainForm, new DesignerException("Error reading CustomPropertyPointer. Class Id = {0}. More info:{1}", reader.ObjectList.ClassId, getDebugInfo(reader0, node)));
                        }
                    }
                }
                if (root0 != null)
                {
                    LocalVariable lv = root0.GetLocalVariable(varId);
                    _holder = lv;
                    if (lv.ClassType == null)
                    {
                        MathNode.Log(TraceLogClass.MainForm, new DesignerException("Error reading CustomPropertyPointer. Local variable [{0}]'s data type is null. More info:{1}", lv, getDebugInfo(reader0, node)));
                    }
                    else
                    {
                        ClassId = lv.ClassType.DefinitionClassId;
                        ClassPointer r = reader.ObjectList.Project.GetTypedData <ClassPointer>(ClassId);
                        if (r == null)
                        {
                            MathNode.Log(TraceLogClass.MainForm, new DesignerException("Error reading CustomPropertyPointer. Class ID [{0}] of a local variable [{1}] does not point to a class. More info:{2}", ClassId, lv, getDebugInfo(reader0, node)));
                        }
                        else
                        {
                            _property = r.GetCustomPropertyById(memberId);
                        }
                    }
                }
            }
            else
            {
                XmlNode nd = node.SelectSingleNode(XmlTags.XML_ClassInstance);
                if (nd != null)
                {
                    ClassInstancePointer cp = new ClassInstancePointer();
                    cp.OnPostSerialize(reader.ObjectList, nd, false, reader);
                    if (cp.Definition == null && cp.DefinitionClassId == 0)
                    {
                        MathNode.Log(TraceLogClass.MainForm, new DesignerException("Error reading CustomPropertyPointer: Definition ID is 0. More info:{0}", getDebugInfo(reader0, node)));
                    }
                    else
                    {
                        if (cp.Definition == null)
                        {
                            MathNode.Log(TraceLogClass.MainForm, new DesignerException("Error reading CustomPropertyPointer: Definition class not found. Definition class ID = {0}. If the class was removed from the project then the places using the class should be modified. More info:{1}", cp.DefinitionClassId, getDebugInfo(reader0, node)));
                        }
                        else
                        {
                            _property = cp.Definition.GetCustomPropertyById(memberId);
                        }
                        _holder = cp;
                        ClassId = cp.DefinitionClassId;
                    }
                }
                else
                {
                    UInt32 cid = XmlUtil.GetAttributeUInt(node, XmlTags.XMLATT_ownerClassID);
                    if (cid != 0)
                    {
                        ClassPointer root0 = ClassPointer.CreateClassPointer(cid, reader.ObjectList.Project);
                        _holder = root0;
                        if (root0 == null)
                        {
                            MathNode.Log(TraceLogClass.MainForm, new DesignerException("Error reading CustomPropertyPointer. Owner class ID [{0}] does not point to a class. More info:{1}", cid, getDebugInfo(reader0, node)));
                        }
                        else
                        {
                            ClassId   = root0.ClassId;
                            _property = root0.GetCustomPropertyById(memberId);
                        }
                    }
                    else
                    {
                        if (XmlUtil.GetAttributeUInt(node, XmlTags.XMLATT_ClassID) == 0)
                        {
                            ClassPointer root0 = reader.ObjectList.GetTypedData <ClassPointer>();
                            _holder = root0;
                            if (root0 == null)
                            {
                                root0 = reader.ObjectList.Project.GetTypedData <ClassPointer>(reader.ObjectList.ClassId);
                                if (root0 == null)
                                {
                                    root0 = reader.ObjectList.RootPointer as ClassPointer;
                                    if (root0 == null)
                                    {
                                        MathNode.Log(TraceLogClass.MainForm, new DesignerException("Error reading CustomPropertyPointer. Current class ID [{0}] does not point to a class. More info:{1}", reader.ObjectList.ClassId, getDebugInfo(reader0, node)));
                                    }
                                }
                            }
                            if (root0 != null)
                            {
                                ClassId   = root0.ClassId;
                                _property = root0.GetCustomPropertyById(memberId);
                            }
                        }
                    }
                }
            }
            if (_holder == null)
            {
                //==backward compatibility===========================================================
                UInt32 classId        = XmlUtil.GetAttributeUInt(node, XmlTags.XMLATT_ClassID); //declaring class id
                UInt32 holderMemberId = XmlUtil.GetAttributeUInt(node, XmlTags.XMLATT_ComponentID);
                ClassId = classId;                                                              //definition class
                //root holding class
                ClassPointer root = reader.ObjectList.GetTypedData <ClassPointer>();
                if (root == null)
                {
                    root = reader.ObjectList.Project.GetTypedData <ClassPointer>(reader.ObjectList.ClassId);
                    if (root == null)
                    {
                        root = reader.ObjectList.RootPointer as ClassPointer;
                        if (root == null)
                        {
                            MathNode.Log(TraceLogClass.MainForm, new DesignerException("Error reading CustomPropertyPointer. Holding class, class ID [{0}], does not point to a class. More info:{1}", reader.ObjectList.ClassId, getDebugInfo(reader0, node)));
                        }
                    }
                }
                //
                UInt32 holderClassId = XmlUtil.GetAttributeUInt(node.OwnerDocument.DocumentElement, XmlTags.XMLATT_ClassID);
                if (holderClassId == classId)                 //holder is in the same class
                {
                    //
                    if (root != null)
                    {
                        _property = root.GetCustomPropertyById(MemberId);
                        if (_property != null && _property.IsStatic)
                        {
                            _holder = root;
                        }
                    }
                }
                else                 //holder and declarer are different classes
                {
                    //root is the holding class
                    ClassPointer declarer = ClassPointer.CreateClassPointer(classId, reader.ObjectList.Project);
                    if (declarer == null)
                    {
                        MathNode.Log(TraceLogClass.MainForm, new DesignerException("Error reading CustomPropertyPointer: classId {0} does not point to a class. If the class was removed from the class then please modify places using the class. More info:{1}", classId, getDebugInfo(reader0, node)));
                    }
                    else
                    {
                        _property = declarer.GetCustomPropertyById(memberId);
                        if (_property != null && _property.IsStatic)
                        {
                            _holder = declarer;
                        }
                    }
                }
                if (_property != null && !_property.IsStatic)
                {
                    if (holderMemberId == 0 || holderMemberId == reader.ObjectList.MemberId)                    //not an instance
                    {
                        _holder = root;
                    }
                    else
                    {
                        _holder = (IClass)reader.ObjectList.GetClassRefById(holderMemberId);
                    }
                    if (_holder == null)
                    {
                        //holder is a local variable
                        LocalVariable lv = root.GetLocalVariable(holderMemberId);
                        _holder = lv;
                    }
                    _property.SetHolder(_holder);
                }
            }

            if (_holder == null)
            {
                MathNode.Log(TraceLogClass.MainForm, new DesignerException("Invalid property pointer [{0}]. More info:{1}", node.InnerXml, getDebugInfo(reader0, node)));
            }
        }
Пример #9
0
 public ClassMemberField(CodeMemberField member, ClassInstancePointer classRef)
 {
     _memberField = member;
     _classRef    = classRef;
 }