public IMethodPointer CreateMethodPointer(IActionContext action)
        {
            MethodPointer fe = (MethodPointer)this.Clone();

            MemberComponentIdCustom.AdjustHost(fe);
            fe.Action = (IAction)action;
            return(fe);
        }
示例#2
0
        /// <summary>
        /// It can be a ClassPointer, a MemberComponentId, or a TypePointer.
        ///
        /// </summary>
        /// <returns></returns>
        private IClass getActionExecuter()
        {
            IPropertySetter sp = ActionMethod as IPropertySetter;

            if (sp != null)
            {
                MemberComponentIdCustom c = sp.SetProperty.Holder as MemberComponentIdCustom;
                if (c != null)
                {
                    return(c.Pointer);
                }
                return(sp.SetProperty.Holder);
            }
            else
            {
                IObjectIdentity mp = ActionMethod.IdentityOwner;
                IMemberPointer  p  = ActionMethod as IMemberPointer;
                if (p != null)
                {
                    return(p.Holder);
                }
                MemberComponentIdCustom mcc = mp as MemberComponentIdCustom;
                if (mcc != null)
                {
                    return(mcc.Pointer);
                }
                MemberComponentId mmc = mp as MemberComponentId;
                if (mmc != null)
                {
                    return(mmc);
                }
                p = mp as IMemberPointer;
                if (p != null)
                {
                    return(p.Holder);
                }
                IObjectPointer op = mp as IObjectPointer;
                IClass         co = mp as IClass;
                while (co == null && op != null)
                {
                    op = op.Owner;
                    co = op as IClass;
                    p  = op as IMemberPointer;
                    if (p != null)
                    {
                        return(p.Holder);
                    }
                }
                if (co != null)
                {
                    return(co);
                }
                else
                {
                    throw new DesignerException("Cannot find holder for Action [{0}]", ActionId);
                }
            }
        }
示例#3
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
                        {
                        }
                    }
                }
            }
        }
示例#4
0
 public override bool IsActionExecuter(ComponentIconEvent obj)
 {
     if (obj.IsForComponent)
     {
         MemberComponentIdCustom idc = obj.ClassPointer as MemberComponentIdCustom;
         if (idc != null && idc.DefinitionClassId != obj.ClassId)
         {
             return(idc.DefinitionClassId == _property.ClassId);
         }
     }
     else
     {
         ComponentIconProperty cim = obj as ComponentIconProperty;
         if (cim != null)
         {
             return(cim.PropertyId == this.PropertyId);
         }
     }
     return(false);
 }
示例#5
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);
            }
        }
        /// <summary>
        /// check whether the action is executed by the owner of this icon
        /// </summary>
        /// <param name="act"></param>
        /// <param name="root"></param>
        /// <returns></returns>
        public virtual bool IsActionExecuter(IAction act, ClassPointer root)
        {
            FireEventMethod fe = act.ActionMethod as FireEventMethod;

            if (fe != null)
            {
            }
            else if (act.ActionMethod != null)
            {
                DataTypePointer dtp = act.ActionMethod.Owner as DataTypePointer;
                if (dtp != null)
                {
                    return(false);
                }
                ClassPointer cpa = root.GetExternalExecuterClass(act);
                if (cpa != null)
                {
                    MemberComponentIdCustom idc = this.ClassPointer as MemberComponentIdCustom;
                    if (idc != null)
                    {
                        return(act.ExecuterClassId == idc.DefinitionClassId);
                    }
                    return(false);
                }
                CustomMethodPointer cmp = act.ActionMethod as CustomMethodPointer;
                if (cmp != null)
                {
                    //for the same class, ComponentIconMethod is used
                    if (act.ExecuterClassId != this.ClassPointer.ClassId)
                    {
                        MemberComponentIdCustom idc = this.ClassPointer as MemberComponentIdCustom;
                        if (idc != null)
                        {
                            return(act.ExecuterClassId == idc.DefinitionClassId);
                        }
                    }
                    return(false);
                }
                else
                {
                    SetterPointer sp = act.ActionMethod as SetterPointer;
                    if (sp != null)
                    {
                        CustomPropertyPointer cpp = sp.SetProperty as CustomPropertyPointer;
                        if (cpp != null)
                        {
                            //for the same class ComponentIconProperty is used
                            if (act.ExecuterClassId != this.ClassPointer.ClassId)
                            {
                                MemberComponentIdCustom idc = this.ClassPointer as MemberComponentIdCustom;
                                if (idc != null)
                                {
                                    return(act.ExecuterClassId == idc.DefinitionClassId);
                                }
                            }
                            return(false);
                        }
                    }
                    return(act.ExecuterMemberId == this.ClassPointer.MemberId);
                }
            }
            else
            {
                ActionAttachEvent aae = act as ActionAttachEvent;
                if (aae != null)
                {
                    if (aae.ClassId == this.ClassId && aae.ExecuterMemberId == this.ClassPointer.MemberId)
                    {
                        return(true);
                    }
                }
            }
            return(false);
        }