Example #1
0
 public Element(
     int atomicNumber, string symbol, string name,
     double atomicMass, string colorHex, ElectronConfiguration electronConfiguration,
     string electronegativity, string atomicRadius, string ionizationEnergy,
     string electronAffinity, string oxidationStates, PhysicalState standardState,
     string meltingPoint, string boilingPoint, string density,
     ElementType groupBlock, int yearDiscovered, ElementStructure structure)
 {
     AtomicNumber          = atomicNumber;
     Symbol                = symbol;
     Name                  = name;
     AtomicMass            = atomicMass;
     ColorHex              = colorHex;
     ElectronConfiguration = electronConfiguration;
     Electronegativity     = electronegativity;
     AtomicRadius          = atomicRadius;
     IonizationEnergy      = ionizationEnergy;
     ElectronAffinity      = electronAffinity;
     OxidationStates       = oxidationStates;
     StandardState         = standardState;
     MeltingPoint          = meltingPoint;
     BoilingPoint          = boilingPoint;
     Density               = density;
     GroupBlock            = groupBlock;
     YearDiscovered        = yearDiscovered;
     Structure             = structure;
 }
Example #2
0
 internal Element(ElementStructure es, ElementValueType vt, ArraySegment <byte> data, Tuple <ElementBase, int>[] indices)
 {
     this.Structure = es;
     this.Data      = data;
     this.type      = vt;
     this.Indices   = indices;
 }
Example #3
0
        static void Main(string[] args)
        {
            // Setup structure
            ElementStructure structure = new ElementStructure();

            structure.Attach(new Employee {
                Name = "Risto Reipas", Salary = 3000, VacationDays = 20
            });
            structure.Attach(new Employee {
                Name = "Erno Perälä", Salary = 3200, VacationDays = 40
            });
            structure.Attach(new Employee {
                Name = "Sauli Niinistö", Salary = 13000, VacationDays = 2
            });

            // Create visitor objects
            IVisitor salaryFairy   = new SalaryVisitor();
            IVisitor vacationFairy = new VacationVisitor();

            // Structure accepting visitors
            structure.Accept(salaryFairy);
            structure.Accept(vacationFairy);

            // Wait for user
            Console.ReadLine();
        }
        public ElementStructure FilterElements(ElementStructure elStruct)
        {
            List <ElementStructure> elStructList = new List <ElementStructure>();

            elStructList.Add(elStruct);

            var filteredElStruct = FilterElements(elStructList);

            return(filteredElStruct.FirstOrDefault());
        }
Example #5
0
        /// <summary>
        /// 构建功能组件
        /// </summary>
        /// <returns> 功能组件 </returns>
        public AndroidEntityWidget Widget(ElementStructure elementStructure)
        {
            try
            {
                return(new AndroidEntityWidget(AndroidDriver, elementStructure));
            }

            catch (Exception err)
            {
                LogServe.Error($"Error:: 构建功能组件异常:: { err.Message }");

                throw new AndroidcConstructorsModuleException();
            }
        }
        public PropertiesCollectorForm(ElementStructure elementStructureList, Form parentForm)
        {
            InitializeComponent();
            elStructureList = elementStructureList;
            enableFilter    = chckBoxApplyFilters.Checked;
            winFormHandler  = new PropertiesCollectorFormHandler();
            this.Size       = new Size(655, 870);

            InitializeGrid(dgElementParams);
            InitializeGrid(dgElementTypeParams);

            InitBehaviour();
            InitializeLanguage();

            parentForm.Closed += (s, e) => this.Close();
        }
Example #7
0
        static void Main(string[] args)
        {
            // Setup structure
            ElementStructure structure = new ElementStructure();
            structure.Attach(new Employee { Name = "Risto Reipas", Salary = 3000, VacationDays = 20 });
            structure.Attach(new Employee { Name = "Erno Perälä", Salary = 3200, VacationDays = 40 });
            structure.Attach(new Employee { Name = "Sauli Niinistö", Salary = 13000, VacationDays = 2 });

            // Create visitor objects
            IVisitor salaryFairy = new SalaryVisitor();
            IVisitor vacationFairy = new VacationVisitor();

            // Structure accepting visitors
            structure.Accept(salaryFairy);
            structure.Accept(vacationFairy);

            // Wait for user
            Console.ReadLine();
        }
 /// <summary>
 /// 实例化功能组件实现类
 /// </summary>
 public AndroidEntityWidget(AndroidDriver <AndroidElement> androidDriver, ElementStructure elementStructure)
 {
     AndroidDriver    = androidDriver;
     ElementStructure = elementStructure;
 }
Example #9
0
 internal Element(ElementStructure es, byte[] data, int offset, int count, Tuple <ElementBase, int>[] indices)
     : this(es, new ArraySegment <byte>(data, offset, count), indices)
 {
 }
Example #10
0
        internal static Element CreateElement(ElementStructure es, byte[] data, ref int offset, bool rawData, Tuple <ElementBase, int>[] indices)
        {
            int     maxlen = data.Length - offset;
            Element elem   = null;

            try
            {
                int len;
                switch (es.type)
                {
                case ElementValueType.Int:
                    len     = maxlen >= sizeof(int) ? sizeof(int) : maxlen;
                    elem    = new Element(es, ElementValueType.Int, new ArraySegment <byte>(data, offset, len), indices);
                    offset += len;
                    break;

                case ElementValueType.UInt:
                case ElementValueType.FormID:
                    len     = maxlen >= sizeof(uint) ? sizeof(uint) : maxlen;
                    elem    = new Element(es, ElementValueType.UInt, new ArraySegment <byte>(data, offset, len), indices);
                    offset += len;
                    break;

                case ElementValueType.Float:
                    len     = maxlen >= sizeof(float) ? sizeof(float) : maxlen;
                    elem    = new Element(es, ElementValueType.Float, new ArraySegment <byte>(data, offset, len), indices);
                    offset += len;
                    break;

                case ElementValueType.Short:
                    len     = maxlen >= sizeof(short) ? sizeof(short) : maxlen;
                    elem    = new Element(es, ElementValueType.Short, new ArraySegment <byte>(data, offset, len), indices);
                    offset += len;
                    break;

                case ElementValueType.UShort:
                    len     = maxlen >= sizeof(ushort) ? sizeof(ushort) : maxlen;
                    elem    = new Element(es, ElementValueType.UShort, new ArraySegment <byte>(data, offset, len), indices);
                    offset += len;
                    break;

                case ElementValueType.SByte:
                    len     = maxlen >= sizeof(sbyte) ? sizeof(sbyte) : maxlen;
                    elem    = new Element(es, ElementValueType.SByte, new ArraySegment <byte>(data, offset, len), indices);
                    offset += len;
                    break;

                case ElementValueType.Byte:
                    len     = maxlen >= sizeof(byte) ? sizeof(byte) : maxlen;
                    elem    = new Element(es, ElementValueType.Byte, new ArraySegment <byte>(data, offset, len), indices);
                    offset += len;
                    break;

                case ElementValueType.String:
                    len = 0;
                    for (int i = offset; i < data.Length && data[i] != 0; ++i, ++len)
                    {
                        ;
                    }

                    if (rawData)
                    {
                        // raw form includes the zero termination byte
                        len     = len == 0 ? 0 : len + 1;
                        elem    = new Element(es, ElementValueType.String, new ArraySegment <byte>(data, offset, len), indices);
                        offset += len;
                    }
                    else
                    {
                        elem    = new Element(es, ElementValueType.String, new ArraySegment <byte>(data, offset, len), indices);
                        offset += len == 0 ? 0 : len + 1;
                    }

                    break;

                case ElementValueType.BString:
                    if (maxlen >= sizeof(ushort))
                    {
                        len = TypeConverter.h2s(data[offset], data[offset + 1]);
                        len = (len < maxlen - 2) ? len : maxlen - 2;
                        if (rawData)
                        {
                            // raw data includes short prefix
                            elem    = new Element(es, ElementValueType.BString, new ArraySegment <byte>(data, offset, len + 2), indices);
                            offset += len + 2;
                        }
                        else
                        {
                            elem    = new Element(es, ElementValueType.String, new ArraySegment <byte>(data, offset + 2, len), indices);
                            offset += len + 2;
                        }
                    }
                    else
                    {
                        if (rawData)
                        {
                            elem = new Element(es, ElementValueType.BString, new ArraySegment <byte>(new byte[2] {
                                0, 0
                            }), indices);
                        }
                        else
                        {
                            elem = new Element(es, ElementValueType.String, new ArraySegment <byte>(new byte[0]), indices);
                        }

                        offset += maxlen;
                    }

                    break;

                case ElementValueType.IString:
                    if (maxlen >= sizeof(int))
                    {
                        len = TypeConverter.h2si(data[offset], data[offset + 1], data[offset + 2], data[offset + 3]);
                        len = (len < maxlen - 4) ? len : maxlen - 4;
                        if (rawData)
                        {
                            // raw data includes int prefix
                            elem    = new Element(es, ElementValueType.IString, new ArraySegment <byte>(data, offset, len + 4), indices);
                            offset += len + 4;
                        }
                        else
                        {
                            elem    = new Element(es, ElementValueType.String, new ArraySegment <byte>(data, offset + 4, len), indices);
                            offset += len + 4;
                        }
                    }
                    else
                    {
                        if (rawData)
                        {
                            elem = new Element(es, ElementValueType.IString, new ArraySegment <byte>(new byte[4] {
                                0, 0, 0, 0
                            }), indices);
                        }
                        else
                        {
                            elem = new Element(es, ElementValueType.String, new ArraySegment <byte>(new byte[0]), indices);
                        }

                        offset += maxlen;
                    }

                    break;

                case ElementValueType.Str4:
                    len = maxlen >= 4 ? 4 : maxlen;
                    if (rawData)
                    {
                        elem = new Element(es, ElementValueType.Str4, new ArraySegment <byte>(data, offset, len), indices);
                    }
                    else
                    {
                        elem = new Element(es, ElementValueType.String, new ArraySegment <byte>(data, offset, len), indices);
                    }

                    offset += len;
                    break;

                case ElementValueType.LString:
                    if (maxlen < sizeof(int))
                    {
                        elem    = new Element(es, ElementValueType.String, new ArraySegment <byte>(data, offset, maxlen), indices);
                        offset += maxlen;
                    }
                    else
                    {
                        len = maxlen;
                        var  blob     = new ArraySegment <byte>(data, offset, len);
                        bool isString = TypeConverter.IsLikelyString(blob);
                        if (!isString)
                        {
                            elem    = new Element(es, ElementValueType.UInt, new ArraySegment <byte>(data, offset, len), indices);
                            offset += 4;
                        }
                        else
                        {
                            len = 0;
                            for (int i = offset; i < data.Length && data[i] != 0; ++i, ++len)
                            {
                                ;
                            }

                            if (rawData)
                            {
                                // lstring as raw string includes the terminating null
                                len     = len == 0 ? 0 : len + 1;
                                elem    = new Element(es, ElementValueType.LString, new ArraySegment <byte>(data, offset, len), indices);
                                offset += len;
                            }
                            else
                            {
                                elem    = new Element(es, ElementValueType.String, new ArraySegment <byte>(data, offset, len), indices);
                                offset += len == 0 ? 0 : len + 1;
                            }
                        }
                    }

                    break;

                default:
                    elem    = new Element(es, ElementValueType.Blob, new ArraySegment <byte>(data, offset, maxlen), indices);
                    offset += maxlen;
                    break;
                }
            }
            catch
            {
            }
            finally
            {
                if (offset > data.Length)
                {
                    offset = data.Length;
                }
            }

            return(elem);
        }
 /// <summary>
 /// Given a Revit element, returns its family Type
 /// </summary>
 /// <param name="el"></param>
 /// <returns></returns>
 public static string GetFamilyType(ElementStructure el)
 {
     return(el.ElementTypeSingleParameters.SingleOrDefault(p => p.ParameterName == "SYMBOL_FAMILY_AND_TYPE_NAMES_PARAM").ParameterValue);
 }
 private void AddElement(ElementStructure es)
 {
     int a = -1, b = 0, c = 0;
     this.AddElement(es, ref a, null, ref b, ref c);
 }
Example #13
0
 public Element(ElementStructure es, ElementValueType vt, ArraySegment <byte> data)
 {
     this.Structure = es;
     this.Data      = data;
     this.type      = vt;
 }
Example #14
0
 public Element(ElementStructure es, ArraySegment <byte> data)
 {
     this.Structure = es;
     this.Data      = data;
 }
Example #15
0
 public Element(ElementStructure es, byte[] data, int offset, int count)
     : this(es, new ArraySegment <byte>(data, offset, count))
 {
 }
        private void AddElement(ElementStructure es, ref int offset, byte[] data, ref int groupOffset, ref int CurrentGroup)
        {
            var panel1 = new Panel();

            panel1.AutoSize = true;
            panel1.Width    = this.fpanel1.Width - 10;
            panel1.Height   = 1;
            panel1.Anchor   = AnchorStyles.Top | AnchorStyles.Right | AnchorStyles.Left | AnchorStyles.Bottom;
            int  ypos      = 0;
            uint flagValue = 0; // value if flags is set
            byte flagSize  = 4;
            bool hasFlags  = es.options.Length == 0 && es.flags.Length > 1;

            var tb = new TextBox();

            this.boxes.Add(tb);
            if (es.group != 0)
            {
                var cb = new CheckBox();
                cb.Text = "Use this value?";
                panel1.Controls.Add(cb);
                cb.Location = new Point(10, ypos);
                ypos       += 24;
                cb.Tag      = new cbTag(es.group, tb);
                if (CurrentGroup != es.group)
                {
                    cb.Checked = true;
                }
                else
                {
                    tb.Enabled = false;
                }

                cb.CheckedChanged += this.CheckBox_CheckedChanged;
            }

            if (es.optional || es.repeat > 0 && this.repeatcount > 0)
            {
                var cb = new CheckBox();
                cb.Text = "Use this value?";
                panel1.Controls.Add(cb);
                cb.Location = new Point(10, ypos);
                ypos       += 24;
                cb.Tag      = new repeatCbTag(tb, this.elements.Count);
                if (data == null)
                {
                    tb.Enabled = false;
                }
                else
                {
                    cb.Checked = true;
                }

                cb.CheckedChanged += this.RepeatCheckBox_CheckedChanged;
            }

            if ((CurrentGroup == 0 && es.group != 0) || (CurrentGroup != 0 && es.group != 0 && CurrentGroup != es.group))
            {
                CurrentGroup = es.group;
                groupOffset  = offset;
            }
            else if (CurrentGroup != 0 && es.group == 0)
            {
                CurrentGroup = 0;
            }
            else if (CurrentGroup != 0 && CurrentGroup == es.group)
            {
                offset = groupOffset;
            }

            this.valueTypes.Add(es.type);
            if (data != null)
            {
                switch (es.type)
                {
                case ElementValueType.UInt:
                {
                    var v = TypeConverter.h2i(data[offset], data[offset + 1], data[offset + 2], data[offset + 3]);
                    flagValue = v;
                    flagSize  = 4;
                    tb.Text   = hasFlags || es.hexview ? "0x" + v.ToString("X8") : v.ToString();
                    offset   += 4;
                }

                break;

                case ElementValueType.Int:
                {
                    var v = TypeConverter.h2si(data[offset], data[offset + 1], data[offset + 2], data[offset + 3]);
                    flagValue = (uint)v;
                    flagSize  = 4;
                    tb.Text   = hasFlags || es.hexview ? "0x" + v.ToString("X8") : v.ToString();
                    offset   += 4;
                }

                break;

                case ElementValueType.FormID:
                    tb.Text = TypeConverter.h2i(data[offset], data[offset + 1], data[offset + 2], data[offset + 3]).ToString("X8");
                    offset += 4;
                    break;

                case ElementValueType.Float:
                    tb.Text = TypeConverter.h2f(data[offset], data[offset + 1], data[offset + 2], data[offset + 3]).ToString();
                    offset += 4;
                    break;

                case ElementValueType.UShort:
                {
                    var v = TypeConverter.h2s(data[offset], data[offset + 1]);
                    flagValue = v;
                    flagSize  = 2;
                    tb.Text   = hasFlags || es.hexview ? "0x" + v.ToString("X4") : v.ToString();
                    offset   += 2;
                }

                break;

                case ElementValueType.Short:
                {
                    var v = TypeConverter.h2ss(data[offset], data[offset + 1]);
                    flagValue = (uint)v;
                    flagSize  = 2;
                    tb.Text   = hasFlags || es.hexview ? "0x" + v.ToString("X4") : v.ToString();
                    offset   += 2;
                }

                break;

                case ElementValueType.Byte:
                {
                    var v = data[offset];
                    flagValue = v;
                    flagSize  = 1;
                    tb.Text   = hasFlags || es.hexview ? "0x" + v.ToString("X2") : v.ToString();
                    offset++;
                }

                break;

                case ElementValueType.SByte:
                {
                    var v = (sbyte)data[offset];
                    flagValue = (uint)v;
                    flagSize  = 1;
                    tb.Text   = hasFlags || es.hexview ? "0x" + v.ToString("X2") : v.ToString();
                    offset++;
                }

                break;

                case ElementValueType.String:
                {
                    string s = string.Empty;
                    while (data[offset] != 0)
                    {
                        s += (char)data[offset++];
                    }

                    offset++;
                    tb.Text   = s;
                    tb.Width += 200;
                }

                break;

                case ElementValueType.BString:
                {
                    int    len = TypeConverter.h2s(data[offset], data[offset + 1]);
                    string s   = Encoding.Instance.GetString(data, offset + 2, len);
                    offset    = offset + (2 + len);
                    tb.Text   = s;
                    tb.Width += 200;
                }

                break;

                case ElementValueType.IString:
                {
                    int    len = TypeConverter.h2si(data[offset], data[offset + 1], data[offset + 2], data[offset + 3]);
                    string s   = Encoding.Instance.GetString(data, offset + 4, len);
                    offset    = offset + (4 + len);
                    tb.Text   = s;
                    tb.Width += 200;
                }

                break;

                case ElementValueType.LString:
                {
                    int    left      = data.Length - offset;
                    uint   id        = (left < 4) ? 0 : TypeConverter.h2i(data[offset], data[offset + 1], data[offset + 2], data[offset + 3]);
                    bool   isString  = TypeConverter.IsLikelyString(new ArraySegment <byte>(data, offset, left));
                    int    strOffset = offset;
                    string s         = null;
                    if (isString)
                    {
                        s       = TypeConverter.GetString(new ArraySegment <byte>(data, offset, data.Length - offset));
                        tb.Text = 0.ToString("X8");
                        offset += s.Length;
                    }
                    else
                    {
                        offset += 4;
                        tb.Text = id.ToString("X8");
                        if (this.strIDLookup != null)
                        {
                            s = this.strIDLookup(id);
                        }
                    }

                    tb.Tag = new lTag(tb, s, data, strOffset, isString);
                }

                break;

                case ElementValueType.Str4:
                {
                    string s = Encoding.Instance.GetString(data, offset, 4);
                    offset      += 4;
                    tb.MaxLength = 4;
                    tb.Text      = s;
                }

                break;

                default:
                    throw new ApplicationException();
                }
            }
            else
            {
                if (es.type == ElementValueType.String || es.type == ElementValueType.BString || es.type == ElementValueType.LString || es.type == ElementValueType.IString)
                {
                    tb.Width += 200;
                }

                if (this.removedStrings.ContainsKey(this.boxes.Count - 1))
                {
                    tb.Text = this.removedStrings[this.boxes.Count - 1];
                }
            }

            var l = new Label();

            l.AutoSize = true;
            string tmp = es.type.ToString();

            l.Text = tmp + ": " + es.name + (!string.IsNullOrEmpty(es.desc) ? (" (" + es.desc + ")") : string.Empty);
            panel1.Controls.Add(tb);
            tb.Location = new Point(10, ypos);
            if (es.multiline)
            {
                tb.Multiline = true;
                ypos        += tb.Height * 5;
                tb.Height   *= 6;
            }

            panel1.Controls.Add(l);
            l.Location = new Point(tb.Right + 10, ypos + 3);
            string[] options = null;
            if (es.type == ElementValueType.FormID)
            {
                ypos += 28;
                var b = new Button();
                b.Text   = "FormID lookup";
                b.Click += this.LookupFormID_Click;
                panel1.Controls.Add(b);
                b.Location = new Point(20, ypos);
                var tb2 = new TextBox();
                tb2.Width   += 200;
                tb2.ReadOnly = true;
                panel1.Controls.Add(tb2);
                tb2.Location = new Point(b.Right + 10, ypos);
                b.Tag        = new bTag(tb, tb2);
                if (es.FormIDType != null)
                {
                    if (this.cachedFormIDs.ContainsKey(es.FormIDType))
                    {
                        options = this.cachedFormIDs[es.FormIDType];
                    }
                    else
                    {
                        options = this.formIDScan(es.FormIDType);
                        this.cachedFormIDs[es.FormIDType] = options;
                    }
                }
            }
            else if (es.type == ElementValueType.LString)
            {
                ypos += 24;
                var ltag = tb.Tag as lTag;

                ltag.cb         = new CheckBox();
                ltag.cb.Width   = ltag.cb.Height;
                ltag.cb.Checked = ltag.isString;
                panel1.Controls.Add(ltag.cb);
                ltag.cb.Location = new Point(8, ypos);

                ltag.str = new TextBox();

                // ltag.str.Font = this.baseFont;
                ltag.str.Width += 200 - ltag.cb.Width + 8;
                panel1.Controls.Add(ltag.str);
                ltag.str.Location = new Point(ltag.cb.Location.X + ltag.cb.Width + 8, ypos);
                ltag.str.Text     = string.IsNullOrEmpty(ltag.disp) ? string.Empty : ltag.disp;

                ypos += 24;
            }
            else if (es.options != null)
            {
                options = es.options;
            }

            if (options != null && options.Length > 0)
            {
                ypos += 28;
                var cmb = new ComboBox();
                cmb.Tag    = tb;
                cmb.Width += 200;
                for (int j = 0; j < options.Length; j += 2)
                {
                    cmb.Items.Add(new comboBoxItem(options[j], options[j + 1]));
                }

                cmb.KeyPress             += this.cb_KeyPress;
                cmb.ContextMenu           = new ContextMenu();
                cmb.SelectedIndexChanged += this.cb_SelectedIndexChanged;
                panel1.Controls.Add(cmb);
                cmb.Location = new Point(20, ypos);
            }

            if (hasFlags)
            {
                // add flags combo box to the side
                var ccb = new FlagComboBox();
                ccb.Tag = tb;
                ccb.SetItems(es.flags, flagSize);
                ccb.SetState(flagValue);
                ccb.TextChanged += delegate {
                    uint value = ccb.GetState();
                    var  text  = ccb.Tag as TextBox;
                    text.Text = "0x" + value.ToString("X");
                };
                ccb.Location = new Point(l.Location.X + l.Width + 10, tb.Top);
                ccb.Width    = Math.Max(ccb.Width, Width - 50 - ccb.Location.X);
                ccb.Anchor   = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right;
                panel1.Controls.Add(ccb);
            }

            this.fpanel1.Controls.Add(panel1);
            this.elements.Add(panel1);
        }
        private void AddElement(ElementStructure es)
        {
            int a = -1, b = 0, c = 0;

            this.AddElement(es, ref a, null, ref b, ref c);
        }
Example #18
0
        /// <summary>
        /// Execute a script function
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="elemt"></param>
        /// <param name="value"></param>
        /// <param name="funcOp"></param>
        /// <returns></returns>
        public static T ExecuteFunction <T>(ElementStructure elemt, object value, FunctionOperation funcOp) where T : struct
        {
            if (funcOp == FunctionOperation.ForReading)
            {
                if (string.IsNullOrWhiteSpace(elemt.funcr))
                {
                    var changeType = Convert.ChangeType(value, Type.GetTypeCode(typeof(T)));
                    if (changeType != null)
                    {
                        return((T)changeType);
                    }
                }
            }

            if (funcOp == FunctionOperation.ForWriting)
            {
                if (string.IsNullOrWhiteSpace(elemt.funcw))
                {
                    var type = Convert.ChangeType(value, Type.GetTypeCode(typeof(T)));
                    if (type != null)
                    {
                        return((T)type);
                    }
                }
            }

            switch (elemt.type)
            {
            case ElementValueType.Float:
            case ElementValueType.Int:
            case ElementValueType.Short:
            case ElementValueType.UInt:
            case ElementValueType.UShort:
                break;

            default:
                var changeType = Convert.ChangeType(value, Type.GetTypeCode(typeof(T)));
                if (changeType != null)
                {
                    return((T)changeType);
                }
                break;
            }

            // Parse function name ElementValueType
            string func = elemt.funcr;

            if (funcOp == FunctionOperation.ForWriting)
            {
                func = elemt.funcw;
            }
            string[] s1       = func.Split('(');
            string   funcName = s1[0];

            PyFunctionDefinition pyFunc;

            if (!_pyDictionary.TryGetValue(funcName, out pyFunc))
            {
                string msg = "ExecuteWritingFunction: The '" + funcName + "' function doesn't exist !!!";
                MessageBox.Show(msg, @"TESSnip Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                var changeType = Convert.ChangeType(value, Type.GetTypeCode(typeof(T)));
                if (changeType != null)
                {
                    return((T)changeType);
                }
            }

            object function = _objOps.GetMember(_snipClassObj, funcName); // get function

            // Parse parameters
            string p     = s1[1].Replace("(", "").Replace(")", "").Trim();
            var    param = new object[0];

            if (!string.IsNullOrWhiteSpace(p))
            {
                string[] parameters = p.Split(',');
                param = new object[parameters.Length];
                for (int i = 0; i < parameters.Length; i++)
                {
                    // management of the decimal separator
                    parameters[i] = parameters[i].Trim();
                    parameters[i] = parameters[i].Replace(".", _ni.CurrencyDecimalSeparator);
                    parameters[i] = parameters[i].Replace(",", _ni.CurrencyDecimalSeparator);
                }

                try
                {
                    for (int i = 0; i < parameters.Length; i++)
                    {
                        if (pyFunc != null)
                        {
                            switch (pyFunc.Parameters[i + 3]) //+2 jump self, element and value parameter
                            {
                            case "float":
                                param[i] = float.Parse(parameters[i], _ni);
                                break;

                            case "int":
                                param[i] = int.Parse(parameters[i], _ni);
                                break;

                            case "short":
                                param[i] = short.Parse(parameters[i], _ni);
                                break;

                            case "uint":
                                param[i] = uint.Parse(parameters[i], _ni);
                                break;

                            case "ushort":
                                param[i] = ushort.Parse(parameters[i], _ni);
                                break;
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(string.Format(@"ExecuteWritingFunction: {0}", ex.Message), @"TESSnip Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    throw;
                }
            }

            var result = value;

            try
            {
                var el = new PyElement
                {
                    Name       = elemt.name,
                    Desc       = elemt.desc,
                    CondId     = elemt.CondID,
                    FormIdType = elemt.FormIDType,
                    Flags      = elemt.flags,
                    Group      = elemt.@group,
                    Multiline  = elemt.multiline,
                    NotInInfo  = elemt.notininfo,
                    Optional   = elemt.optional,
                    Options    = elemt.options,
                    Repeat     = elemt.repeat,
                    FuncRead   = elemt.funcr,
                    FuncWrite  = elemt.funcw,
                    ValueType  = elemt.type
                };

                switch (elemt.type)
                {
                case ElementValueType.Float:
                    result = _objOps.Invoke(function, el, (float)value, param);
                    break;

                case ElementValueType.Int:
                    result = _objOps.Invoke(function, el, (int)value, param);
                    break;

                case ElementValueType.Short:
                    result = _objOps.Invoke(function, el, (short)value, param);
                    break;

                case ElementValueType.UInt:
                    result = _objOps.Invoke(function, el, (uint)value, param);
                    break;

                case ElementValueType.UShort:
                    result = _objOps.Invoke(function, el, (ushort)value, param);
                    break;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(string.Format("ExecuteWritingFunction: {0}", ex.Message), @"TESSnip Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                throw;
            }

            return((T)Convert.ChangeType(result, Type.GetTypeCode(typeof(T))));
        }
        private void AddElement(ElementStructure es, ref int offset, byte[] data, ref int groupOffset, ref int CurrentGroup)
        {
            var panel1 = new Panel();
            panel1.AutoSize = true;
            panel1.Width = this.fpanel1.Width - 10;
            panel1.Height = 1;
            panel1.Anchor = AnchorStyles.Top | AnchorStyles.Right | AnchorStyles.Left | AnchorStyles.Bottom;
            int ypos = 0;
            uint flagValue = 0; // value if flags is set
            byte flagSize = 4;
            bool hasFlags = es.options.Length == 0 && es.flags.Length > 1;

            var tb = new TextBox();
            this.boxes.Add(tb);
            if (es.group != 0)
            {
                var cb = new CheckBox();
                cb.Text = "Use this value?";
                panel1.Controls.Add(cb);
                cb.Location = new Point(10, ypos);
                ypos += 24;
                cb.Tag = new cbTag(es.group, tb);
                if (CurrentGroup != es.group)
                {
                    cb.Checked = true;
                }
                else
                {
                    tb.Enabled = false;
                }

                cb.CheckedChanged += this.CheckBox_CheckedChanged;
            }

            if (es.optional > 0 || es.repeat > 0 && this.repeatcount > 0)
            {
                var cb = new CheckBox();
                cb.Text = "Use this value?";
                panel1.Controls.Add(cb);
                cb.Location = new Point(10, ypos);
                ypos += 24;
                cb.Tag = new repeatCbTag(tb, this.elements.Count);
                if (data == null)
                {
                    tb.Enabled = false;
                }
                else
                {
                    cb.Checked = true;
                }

                cb.CheckedChanged += this.RepeatCheckBox_CheckedChanged;
            }

            if ((CurrentGroup == 0 && es.group != 0) || (CurrentGroup != 0 && es.group != 0 && CurrentGroup != es.group))
            {
                CurrentGroup = es.group;
                groupOffset = offset;
            }
            else if (CurrentGroup != 0 && es.group == 0)
            {
                CurrentGroup = 0;
            }
            else if (CurrentGroup != 0 && CurrentGroup == es.group)
            {
                offset = groupOffset;
            }

            this.valueTypes.Add(es.type);
            if (data != null)
            {
                switch (es.type)
                {
                    case ElementValueType.UInt:
                        {
                            var v = TypeConverter.h2i(data[offset], data[offset + 1], data[offset + 2], data[offset + 3]);
                            flagValue = v;
                            flagSize = 4;
                            tb.Text = hasFlags || es.hexview ? "0x" + v.ToString("X8") : v.ToString();
                            offset += 4;
                        }

                        break;
                    case ElementValueType.Int:
                        {
                            var v = TypeConverter.h2si(data[offset], data[offset + 1], data[offset + 2], data[offset + 3]);
                            flagValue = (uint)v;
                            flagSize = 4;
                            tb.Text = hasFlags || es.hexview ? "0x" + v.ToString("X8") : v.ToString();
                            offset += 4;
                        }

                        break;
                    case ElementValueType.FormID:
                        tb.Text = TypeConverter.h2i(data[offset], data[offset + 1], data[offset + 2], data[offset + 3]).ToString("X8");
                        offset += 4;
                        break;
                    case ElementValueType.Float:
                        tb.Text = TypeConverter.h2f(data[offset], data[offset + 1], data[offset + 2], data[offset + 3]).ToString();
                        offset += 4;
                        break;
                    case ElementValueType.UShort:
                        {
                            var v = TypeConverter.h2s(data[offset], data[offset + 1]);
                            flagValue = v;
                            flagSize = 2;
                            tb.Text = hasFlags || es.hexview ? "0x" + v.ToString("X4") : v.ToString();
                            offset += 2;
                        }

                        break;
                    case ElementValueType.Short:
                        {
                            var v = TypeConverter.h2ss(data[offset], data[offset + 1]);
                            flagValue = (uint)v;
                            flagSize = 2;
                            tb.Text = hasFlags || es.hexview ? "0x" + v.ToString("X4") : v.ToString();
                            offset += 2;
                        }

                        break;
                    case ElementValueType.Byte:
                        {
                            var v = data[offset];
                            flagValue = v;
                            flagSize = 1;
                            tb.Text = hasFlags || es.hexview ? "0x" + v.ToString("X2") : v.ToString();
                            offset++;
                        }

                        break;
                    case ElementValueType.SByte:
                        {
                            var v = (sbyte)data[offset];
                            flagValue = (uint)v;
                            flagSize = 1;
                            tb.Text = hasFlags || es.hexview ? "0x" + v.ToString("X2") : v.ToString();
                            offset++;
                        }

                        break;
                    case ElementValueType.String:
                        {
                            string s = string.Empty;
                            while (data[offset] != 0)
                            {
                                s += (char)data[offset++];
                            }

                            offset++;
                            tb.Text = s;
                            tb.Width += 200;
                        }

                        break;
                    case ElementValueType.BString:
                        {
                            int len = TypeConverter.h2s(data[offset], data[offset + 1]);
                            string s = Encoding.Instance.GetString(data, offset + 2, len);
                            offset = offset + (2 + len);
                            tb.Text = s;
                            tb.Width += 200;
                        }

                        break;
                    case ElementValueType.IString:
                        {
                            int len = TypeConverter.h2si(data[offset], data[offset + 1], data[offset + 2], data[offset + 3]);
                            string s = Encoding.Instance.GetString(data, offset + 4, len);
                            offset = offset + (4 + len);
                            tb.Text = s;
                            tb.Width += 200;
                        }

                        break;
                    case ElementValueType.LString:
                        {
                            int left = data.Length - offset;
                            uint id = (left < 4) ? 0 : TypeConverter.h2i(data[offset], data[offset + 1], data[offset + 2], data[offset + 3]);
                            bool isString = TypeConverter.IsLikelyString(new ArraySegment<byte>(data, offset, left));
                            int strOffset = offset;
                            string s = null;
                            if (isString)
                            {
                                s = TypeConverter.GetString(new ArraySegment<byte>(data, offset, data.Length - offset));
                                tb.Text = 0.ToString("X8");
                                offset += s.Length;
                            }
                            else
                            {
                                offset += 4;
                                tb.Text = id.ToString("X8");
                                if (this.strIDLookup != null)
                                {
                                    s = this.strIDLookup(id);
                                }
                            }

                            tb.Tag = new lTag(tb, s, data, strOffset, isString);
                        }

                        break;
                    case ElementValueType.Str4:
                        {
                            string s = Encoding.Instance.GetString(data, offset, 4);
                            offset += 4;
                            tb.MaxLength = 4;
                            tb.Text = s;
                        }

                        break;
                    default:
                        throw new ApplicationException();
                }
            }
            else
            {
                if (es.type == ElementValueType.String || es.type == ElementValueType.BString || es.type == ElementValueType.LString || es.type == ElementValueType.IString)
                {
                    tb.Width += 200;
                }

                if (this.removedStrings.ContainsKey(this.boxes.Count - 1))
                {
                    tb.Text = this.removedStrings[this.boxes.Count - 1];
                }
            }

            var l = new Label();
            l.AutoSize = true;
            string tmp = es.type.ToString();
            l.Text = tmp + ": " + es.name + (!string.IsNullOrEmpty(es.desc) ? (" (" + es.desc + ")") : string.Empty);
            panel1.Controls.Add(tb);
            tb.Location = new Point(10, ypos);
            if (es.multiline)
            {
                tb.Multiline = true;
                ypos += tb.Height * 5;
                tb.Height *= 6;
            }

            panel1.Controls.Add(l);
            l.Location = new Point(tb.Right + 10, ypos + 3);
            string[] options = null;
            if (es.type == ElementValueType.FormID)
            {
                ypos += 28;
                var b = new Button();
                b.Text = "FormID lookup";
                b.Click += this.LookupFormID_Click;
                panel1.Controls.Add(b);
                b.Location = new Point(20, ypos);
                var tb2 = new TextBox();
                tb2.Width += 200;
                tb2.ReadOnly = true;
                panel1.Controls.Add(tb2);
                tb2.Location = new Point(b.Right + 10, ypos);
                b.Tag = new bTag(tb, tb2);
                if (es.FormIDType != null)
                {
                    if (this.cachedFormIDs.ContainsKey(es.FormIDType))
                    {
                        options = this.cachedFormIDs[es.FormIDType];
                    }
                    else
                    {
                        options = this.formIDScan(es.FormIDType);
                        this.cachedFormIDs[es.FormIDType] = options;
                    }
                }
            }
            else if (es.type == ElementValueType.LString)
            {
                ypos += 24;
                var ltag = tb.Tag as lTag;

                ltag.cb = new CheckBox();
                ltag.cb.Width = ltag.cb.Height;
                ltag.cb.Checked = ltag.isString;
                panel1.Controls.Add(ltag.cb);
                ltag.cb.Location = new Point(8, ypos);

                ltag.str = new TextBox();

                // ltag.str.Font = this.baseFont;
                ltag.str.Width += 200 - ltag.cb.Width + 8;
                panel1.Controls.Add(ltag.str);
                ltag.str.Location = new Point(ltag.cb.Location.X + ltag.cb.Width + 8, ypos);
                ltag.str.Text = string.IsNullOrEmpty(ltag.disp) ? string.Empty : ltag.disp;

                ypos += 24;
            }
            else if (es.options != null)
            {
                options = es.options;
            }

            if (options != null && options.Length > 0)
            {
                ypos += 28;
                var cmb = new ComboBox();
                cmb.Tag = tb;
                cmb.Width += 200;
                for (int j = 0; j < options.Length; j += 2)
                {
                    cmb.Items.Add(new comboBoxItem(options[j], options[j + 1]));
                }

                cmb.KeyPress += this.cb_KeyPress;
                cmb.ContextMenu = new ContextMenu();
                cmb.SelectedIndexChanged += this.cb_SelectedIndexChanged;
                panel1.Controls.Add(cmb);
                cmb.Location = new Point(20, ypos);
            }

            if (hasFlags)
            {
                // add flags combo box to the side
                var ccb = new FlagComboBox();
                ccb.Tag = tb;
                ccb.SetItems(es.flags, flagSize);
                ccb.SetState(flagValue);
                ccb.TextChanged += delegate {
                    uint value = ccb.GetState();
                    var text = ccb.Tag as TextBox;
                    text.Text = "0x" + value.ToString("X");
                };
                ccb.Location = new Point(l.Location.X + l.Width + 10, tb.Top);
                ccb.Width = Math.Max(ccb.Width, Width - 50 - ccb.Location.X);
                ccb.Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right;
                panel1.Controls.Add(ccb);
            }

            this.fpanel1.Controls.Add(panel1);
            this.elements.Add(panel1);
        }
        //  create the datasource for Grid
        public Dictionary <string, List <PropertiesDataGridSourceData> > GetParametersDataGridSource(ElementStructure el, bool checkEnabled)
        {
            var ret = new Dictionary <string, List <PropertiesDataGridSourceData> >();
            var filteredElements      = new List <ElementOrderedParameter>();
            var filteredElementsTypes = new List <ElementOrderedParameter>();

            //  Add properties to datasource based on filter
            if (checkEnabled)
            {
                filteredElements      = el.ElementOrderedParameters.Where(l => l.TransferParam == true).ToList();
                filteredElementsTypes = el.ElementTypeOrderedParameters.Where(l => l.TransferParam == true).ToList();
            }
            else
            {
                filteredElements      = el.ElementOrderedParameters;
                filteredElementsTypes = el.ElementTypeOrderedParameters;
            }

            var elementParamList     = ShowParameters(filteredElements);
            var elementTypeParamList = ShowParameters(filteredElementsTypes);

            ret.Add("ElementParameters", elementParamList);
            ret.Add("ElementTypeParameters", elementTypeParamList);

            return(ret);
        }
 /// <summary>
 /// 实例化功能组件实现类
 /// </summary>
 public BrowserEntityWidget(IWebDriver browserDriver, ElementStructure elementStructure)
 {
     BrowserDriver    = browserDriver;
     ElementStructure = elementStructure;
 }
 public static string GetFilterOnPropFile(ElementStructure el)
 {
     return(Utility.GetStringForFolderName(GetFamilyType(el)));
 }