private void UpdateLinks(ComboBox comboBox) { BaseTemplate item = myTemplate.get_Items(int.Parse(comboBox.Tag.ToString())); if (item.GetType() == typeof(DefTypeTemplate)) { DefTypeTemplate defItem = item as DefTypeTemplate; foreach (KeyValuePair <int, ComboBox> kvp in myComboBoxes) { if (kvp.Key != defItem.ID) { BaseTemplate tmpItem = myTemplate.get_Items( int.Parse(kvp.Value.Tag.ToString())); if (tmpItem.LinkTo == item) { if (tmpItem.GetType() == typeof(DefTypeTemplate)) { DefTypeTemplate defTmpItem = tmpItem as DefTypeTemplate; string id = GetCDefDataID( comboBox.SelectedItem.ToString(), defTmpItem.Type); if (id != null) { // Notice that this causes another event. kvp.Value.Enabled = true; kvp.Value.SelectedIndex = kvp.Value.Items.IndexOf(id); } } else { AssetTemplate assetItem = tmpItem as AssetTemplate; string id = GetAssetLink( comboBox.SelectedItem.ToString(), assetItem.ControlID, assetItem.Element); if (id != null) { kvp.Value.Enabled = true; kvp.Value.SelectedIndex = kvp.Value.Items.IndexOf(id); } } } } } } }
private void comboBoxTemplate_DropDownClosed(object sender, EventArgs e) { if (comboBoxTemplate.SelectedIndex < 0) { panelTemplate.Visible = false; buttonCreate.Enabled = false; return; } BINEntry entry = myGameBin.GetEntryByName( comboBoxTemplate.SelectedItem.ToString()); myTemplate.Build(entry); panelProgress.Visible = true; panelProgress.Update(); panelTemplate.Visible = false; panelTemplate.Controls.Clear(); panelTemplate.SuspendLayout(); myComboBoxes.Clear(); myRefCheckBoxes.Clear(); int x = labelTemplate.Left; int y = 5; int width = 0; int height = 0; int yspace = 10; CheckBox objCheckBox = new CheckBox(); // This should be the main object type. myComboBoxes.Add( myTemplate.get_Items(0).ID, comboBoxTemplate); myRefCheckBoxes.Add( myTemplate.get_Items(0).ID, objCheckBox); comboBoxTemplate.Tag = 0; // Start from the child items... for (int i = 1; i < myTemplate.ItemCount; ++i) { Label lbl = new Label(); lbl.AutoSize = true; lbl.Text = myTemplate.get_Items(i).Name + ":"; panelTemplate.Controls.Add(lbl); lbl.Left = x; lbl.Top = y; y += lbl.Height + yspace; if (lbl.Width > width) { width = lbl.Width; } if (lbl.Height > height) { height = lbl.Height; } } y = 5; int right = panelTop.Width - comboBoxDefs.Right; progressBar.Value = 0; progressBar.Maximum = myTemplate.ItemCount; progressBar.Update(); for (int i = 1; i < myTemplate.ItemCount; ++i) { BaseTemplate item = myTemplate.get_Items(i); ComboBox comboBox = NewComboBox(item.Name); panelTemplate.Controls.Add(comboBox); comboBox.Left = width + x + 5; comboBox.Top = y; comboBox.Width = comboBoxDefs.Right - comboBox.Left - 80; comboBox.Anchor |= AnchorStyles.Right; comboBox.DropDownStyle = ComboBoxStyle.DropDownList; comboBox.AutoCompleteSource = AutoCompleteSource.ListItems; comboBox.AutoCompleteMode = AutoCompleteMode.SuggestAppend; comboBox.Tag = i; comboBox.Sorted = true; //comboBox.Enabled = string.IsNullOrEmpty(item.LinkTo); if (item.GetType() == typeof(DefTypeTemplate)) { DefTypeTemplate def = item as DefTypeTemplate; if (comboBox.Items.Count == 0) { // Fill it up. BINEntry[] entries = myGameBin.GetEntriesByDefinition(def.Type); foreach (BINEntry ent in entries) { comboBox.Items.Add((ent.Name.Length > 0) ? ent.Name : ent.ID.ToString()); } } } else { if (comboBox.Items.Count == 0) { // New combobox. AssetFill(comboBox, (AssetTemplate)item); } } if (comboBox.Items.Count > 0) { comboBox.SelectedIndex = 0; } comboBox.SelectedIndexChanged += new EventHandler(itemComboBox_SelectedIndexChanged); y += height + yspace; // We need to access this later. myComboBoxes.Add(item.ID, comboBox); progressBar.Value++; progressBar.Update(); } // Add ref checkboxes... for (int i = 1; i < myTemplate.ItemCount; ++i) { BaseTemplate item = myTemplate.get_Items(i); CheckBox checkBox = new CheckBox(); panelTemplate.Controls.Add(checkBox); checkBox.Left = myComboBoxes[item.ID].Right + 5; checkBox.Top = myComboBoxes[item.ID].Top; checkBox.Text = "Ref"; checkBox.Checked = item.Ref; checkBox.Anchor = AnchorStyles.Top | AnchorStyles.Right; toolTip.SetToolTip( checkBox, "Use this object as a reference"); // We need to access this later. myRefCheckBoxes.Add(item.ID, checkBox); } // Add the boxes to the pool, so we can use them later. for (int i = 1; i < myTemplate.ItemCount; ++i) { BaseTemplate item = myTemplate.get_Items(i); AddToPool(item.Name, myComboBoxes[item.ID]); } UpdateLinks(comboBoxTemplate); panelTemplate.ResumeLayout(); panelTemplate.Visible = true; panelTemplate.Visible = true; buttonCreate.Enabled = true; panelProgress.Visible = false; panelProgress.Update(); }
private void buttonOk_Click(object sender, EventArgs e) { if (textBoxName.Text.Length == 0) { FormMain.Instance.ErrorMessage( "Invalid base name. It can not be empty."); return; } string name = textBoxName.Text; Dictionary <int, BINEntry> binEntries = new Dictionary <int, BINEntry>(); Dictionary <int, AssetEntry> assetEntries = new Dictionary <int, AssetEntry>(); // Build the objects... StringBuilder sb = new StringBuilder(); sb.AppendLine("Created objects:"); for (int i = 0; i < myTemplate.ItemCount; ++i) { BaseTemplate item = myTemplate.get_Items(i); bool isRef = myRefCheckBoxes[item.ID].Checked; object selItem = myComboBoxes[item.ID].SelectedItem; if (selItem == null) { continue; } if (item.GetType() == typeof(DefTypeTemplate)) { DefTypeTemplate defItem = item as DefTypeTemplate; BINEntry defEntry = GetBINEntry(selItem.ToString()); if (defEntry != null) { string objName = defItem.Type + "_" + name; if (!checkBoxNamed.Checked) { // Not on, so check the item flag. if (!item.Named) { objName = ""; } } BINEntry entry = null; if (isRef) { entry = defEntry; } else { entry = myGameBin.AddEntry( objName, defItem.Type, defEntry.Data); entry.Modified = true; if (!string.IsNullOrEmpty(entry.Name)) { sb.AppendFormat(" {0}", entry.Name); } else { sb.AppendFormat(" {0}:{1}", entry.Definition, entry.ID); } sb.AppendLine(""); } binEntries.Add(item.ID, entry); } else { FormMain.Instance.ErrorMessage("Entry not found"); } } else { AssetEntry defEntry = ((AssetComboBoxItem)selItem).Entry; if (defEntry != null) { AssetEntry entry; if (isRef) { entry = defEntry; } else { AssetTemplate assetItem = item as AssetTemplate; entry = defEntry.Bank.NewEntry( GetAssetName( defEntry.Bank, assetItem.Prefix + "_" + name), defEntry.Type); entry.SubHeader = defEntry.SubHeader; entry.Data = defEntry.Data; sb.AppendFormat(" {0}", entry.DevSymbolName); sb.AppendLine(""); } assetEntries.Add(item.ID, entry); } } } // Link objects! for (int i = 0; i < myTemplate.ItemCount; ++i) { BaseTemplate item = myTemplate.get_Items(i); if (item.LinkTo == null) { continue; } DefTypeTemplate defLink = item.LinkTo; if (item.GetType() == typeof(DefTypeTemplate)) { DefTypeLink( binEntries[defLink.ID], binEntries[item.ID], item.Name); } else { AssetEntry assetEntry = null; if (assetEntries.TryGetValue(item.ID, out assetEntry)) { AssetLink( binEntries[defLink.ID], (AssetTemplate)item, assetEntry.ID); } } } DefTypeTemplate baseItem = (DefTypeTemplate)myTemplate.get_Items(0); FixMainEntry(binEntries[baseItem.ID], baseItem.OriginalID); binEntries = null; assetEntries = null; FormMain.Instance.InfoMessage(sb.ToString()); }