コード例 #1
0
ファイル: TreeList_extension.cs プロジェクト: kevL/GeneralGFF
        /// <summary>
        /// Adds a Struct (an EquippedItem structure) to the "Equip_ItemList" List.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void contextclick_AddEquippedItem(object sender, EventArgs e)
        {
            GffData.Field field;

            _bitslot = 0;
            for (int i = 0; i != SelectedNode.Nodes.Count; ++i)
            {
                field     = (GffData.Field)SelectedNode.Nodes[i].Tag;
                _bitslot |= field.Struct.typeid;
            }

            using (var f = new EquippedItemDialog(_bitslot))
            {
                _bitslot = 0;
                if (f.ShowDialog(this) == DialogResult.OK)
                {
                    BeginUpdate();

                    TreeNode top = TopNode;

                    field               = new GffData.Field();
                    field.type          = FieldTypes.Struct;
                    field.label         = SelectedNode.Nodes.Count.ToString(); // Structs in Lists do not have a Label
                    field.Struct        = new Struct();
                    field.Struct.typeid = _bitslot;                            // <- that's what's in the UTCs I've looked at.

                    string text = GeneralGFF.ConstructNodetext(field);
                    var    node = new Sortable(text, field.label);
                    node.Tag = field;
                    int id = SelectedNode.Nodes.Add(node);


                    field       = new GffData.Field();
                    field.type  = FieldTypes.BYTE;
                    field.label = "Dropable";
                    field.BYTE  = 0;

                    text     = GeneralGFF.ConstructNodetext(field);
                    node     = new Sortable(text, field.label);
                    node.Tag = field;
                    SelectedNode.Nodes[id].Nodes.Add(node);

                    field         = new GffData.Field();
                    field.type    = FieldTypes.CResRef;
                    field.label   = "EquippedRes";
                    field.CResRef = String.Empty;

                    text     = GeneralGFF.ConstructNodetext(field);
                    node     = new Sortable(text, field.label);
                    node.Tag = field;
                    SelectedNode.Nodes[id].Nodes.Add(node);

                    field       = new GffData.Field();
                    field.type  = FieldTypes.BYTE;
                    field.label = "Pickpocketable";
                    field.BYTE  = 0;

                    text     = GeneralGFF.ConstructNodetext(field);
                    node     = new Sortable(text, field.label);
                    node.Tag = field;
                    SelectedNode.Nodes[id].Nodes.Add(node);

                    field       = new GffData.Field();
                    field.type  = FieldTypes.WORD;
                    field.label = "Repos_PosX";
                    field.WORD  = 0;

                    text     = GeneralGFF.ConstructNodetext(field);
                    node     = new Sortable(text, field.label);
                    node.Tag = field;
                    SelectedNode.Nodes[id].Nodes.Add(node);

                    field       = new GffData.Field();
                    field.type  = FieldTypes.WORD;
                    field.label = "Repos_PosY";
                    field.WORD  = 0;

                    text     = GeneralGFF.ConstructNodetext(field);
                    node     = new Sortable(text, field.label);
                    node.Tag = field;
                    SelectedNode.Nodes[id].Nodes.Add(node);


                    // keep the List's nodes in the correct sequence ->
                    // they are arranged by Struct.typeid ascending

                    int i;                     // iterator for the sortables
                    int j;                     // tracker for the node # added

                    // store all the sortable Structs in the List ->
                    // NOTE: This is not an ideal routine. Because it adds all
                    // the nodes to the tree, then removes them, then adds them
                    // all again. It should, rather, just construct the Struct
                    // and its fields, then add the Struct to the tree.

                    var sortables = new List <Sortable>();
                    for (i = 0; i != SelectedNode.Nodes.Count; ++i)
                    {
                        sortables.Add((Sortable)SelectedNode.Nodes[i]);
                    }

                    SelectedNode.Nodes.Clear();                     // NOTE: 'SelectedNode' is the "Equip_ItemList" list-field.


                    // re-add the sortables before the added sortable ->
                    i = j = 0;
                    while (i != sortables.Count)
                    {
                        field = (GffData.Field)sortables[i].Tag;
                        if (field.Struct.typeid < _bitslot)
                        {
                            // NOTE: 'field.label' doesn't need to be changed here
                            sortables[i].Text = GeneralGFF.ConstructNodetextEquipped(field);
                            SelectedNode.Nodes.Add(sortables[i]);
                            j = i;
                        }
                        ++i;
                    }

                    id = ++j;

                    // re-add the last sortable into the sequence ->
                    // replace vals that were set above for the Struct's label and its Sortable's text and label
                    field       = (GffData.Field)sortables[sortables.Count - 1].Tag;
                    field.label = sortables[sortables.Count - 1]._label = j.ToString();
                    sortables[sortables.Count - 1].Text = GeneralGFF.ConstructNodetextEquipped(field);
                    SelectedNode.Nodes.Add(sortables[sortables.Count - 1]);


                    // re-add the sortables that go after the added sortable ->
                    i = 0;
                    while (i != sortables.Count)
                    {
                        field = (GffData.Field)sortables[i].Tag;
                        if (field.Struct.typeid > _bitslot)
                        {
                            field.label       = sortables[i]._label = (++j).ToString();
                            sortables[i].Text = GeneralGFF.ConstructNodetextEquipped(field);
                            SelectedNode.Nodes.Add(sortables[i]);
                        }
                        ++i;
                    }

                    SelectedNode = SelectedNode.Nodes[id];
                    SelectedNode.Expand();

                    TopNode = top;

                    _f.GffData.Changed = true;
                    _f.GffData         = _f.GffData;

                    EndUpdate();

                    node.EnsureVisible();                     // yes those calls are in a specific sequence.
                }
            }
        }