/// <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. } } }