diff --git a/Documents/fielddatatypes.txt b/Documents/fielddatatypes.txt index 53d0f2a0..3e95958a 100644 --- a/Documents/fielddatatypes.txt +++ b/Documents/fielddatatypes.txt @@ -23,8 +23,9 @@ all supported data types: - Only types indicates with * are usable for standard hexen args - When no type is specified, the default type is 0 (integer) +- Enum types (11, 12 and 16) cannot be used in custom UDMF fields -For types 11, 12 and 16 there must be an "enum" field that +For enum types 11, 12 and 16 there must be an "enum" field that either specifies the values or refers to an existing enum set: enum @@ -37,7 +38,7 @@ either specifies the values or refers to an existing enum set: enum = "yesno"; -Type 16 uses case-sensitive strings for value and can only be +Type 16 uses case-sensitive strings for values and can only be used as an option, not as bit flags: enum diff --git a/Source/Builder.csproj b/Source/Builder.csproj index 914dbe75..bae94b44 100644 --- a/Source/Builder.csproj +++ b/Source/Builder.csproj @@ -45,6 +45,7 @@ --> + @@ -117,6 +118,12 @@ + + + + + + Form diff --git a/Source/Config/ArgumentInfo.cs b/Source/Config/ArgumentInfo.cs new file mode 100644 index 00000000..c9285de7 --- /dev/null +++ b/Source/Config/ArgumentInfo.cs @@ -0,0 +1,109 @@ + +#region ================== Copyright (c) 2007 Pascal vd Heiden + +/* + * Copyright (c) 2007 Pascal vd Heiden, www.codeimp.com + * This program is released under GNU General Public License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#endregion + +#region ================== Namespaces + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Globalization; +using System.Text; +using CodeImp.DoomBuilder.IO; +using CodeImp.DoomBuilder.Data; +using System.IO; +using System.Diagnostics; + +#endregion + +namespace CodeImp.DoomBuilder.Config +{ + public class ArgumentInfo + { + #region ================== Constants + + #endregion + + #region ================== Variables + + private string title; + private bool used; + private int type; + private EnumList enumlist; + + #endregion + + #region ================== Properties + + public string Title { get { return title; } } + public bool Used { get { return false; } } + public int Type { get { return type; } } + public EnumList Enum { get { return enumlist; } } + + #endregion + + #region ================== Constructor / Disposer + + // Constructor for argument info from configuration + internal ArgumentInfo(Configuration cfg, string argspath, int argindex, IDictionary enums) + { + // Read + string istr = argindex.ToString(CultureInfo.InvariantCulture); + this.used = cfg.SettingExists(argspath + ".arg" + istr); + this.title = cfg.ReadSetting(argspath + ".arg" + istr + ".title", "Argument " + (argindex + 1)); + this.type = cfg.ReadSetting(argspath + ".arg" + istr + ".type", 0); + + // Determine enum type + EnumList enumlist = null; + IDictionary argdic = cfg.ReadSetting(argspath + ".arg" + istr, new Hashtable()); + if(argdic.Contains("enum")) + { + // Enum fully specified? + if(argdic["enum"] is IDictionary) + { + // Create anonymous enum + this.enumlist = new EnumList(argdic["enum"] as IDictionary); + } + else + { + // Check if referenced enum exists + if((argdic["enum"].ToString().Length > 0) && enums.ContainsKey(argdic["enum"].ToString())) + { + // Get the enum list + this.enumlist = enums[argdic["enum"].ToString()] as EnumList; + } + else + { + General.WriteLogLine("WARNING: '" + argspath + ".arg" + istr + "' references unknown enumeration '" + argdic["enum"] + "'!"); + } + } + } + } + + #endregion + + #region ================== Methods + + // This gets the description for an argument value + public string GetValueDescription(int value) + { + // TODO: Use the registered type editor to get the description! + + return value.ToString(); + } + + #endregion + } +} diff --git a/Source/Config/EnumItem.cs b/Source/Config/EnumItem.cs index 65e22945..d5e92578 100644 --- a/Source/Config/EnumItem.cs +++ b/Source/Config/EnumItem.cs @@ -31,7 +31,7 @@ using System.Windows.Forms; namespace CodeImp.DoomBuilder.Config { - public class EnumItem : INumberedTitle + public class EnumItem { #region ================== Constants @@ -39,14 +39,14 @@ namespace CodeImp.DoomBuilder.Config #region ================== Variables - private int index; + private string value; private string title; #endregion #region ================== Properties - public int Index { get { return index; } } + public string Value { get { return value; } } public string Title { get { return title; } } #endregion @@ -54,10 +54,10 @@ namespace CodeImp.DoomBuilder.Config #region ================== Constructor // Constructor - public EnumItem(int index, string title) + public EnumItem(string value, string title) { // Initialize - this.index = index; + this.value = value; this.title = title; } @@ -71,6 +71,16 @@ namespace CodeImp.DoomBuilder.Config return title; } + // This returns the value as int + public int GetIntValue() + { + int result; + if(int.TryParse(value, NumberStyles.Integer, CultureInfo.InvariantCulture, out result)) + return result; + else + return 0; + } + #endregion } } diff --git a/Source/Config/EnumList.cs b/Source/Config/EnumList.cs index 895f8d61..6aee13eb 100644 --- a/Source/Config/EnumList.cs +++ b/Source/Config/EnumList.cs @@ -39,43 +39,40 @@ namespace CodeImp.DoomBuilder.Config #region ================== Variables - private string name; - #endregion #region ================== Properties - public string Name { get { return name; } } - #endregion #region ================== Constructor + // Constructor to load from dictionary + internal EnumList(IDictionary dic) + { + int index; + + // Read the dictionary + foreach(DictionaryEntry de in dic) + { + // Add item + EnumItem item = new EnumItem(de.Key.ToString(), de.Value.ToString()); + base.Add(item); + } + } + // Constructor to load from configuration internal EnumList(string name, Configuration cfg) { int index; - // Initialize - this.name = name; - // Read the list from configuration IDictionary dic = cfg.ReadSetting("enums." + name, new Hashtable()); foreach(DictionaryEntry de in dic) { - // Try paring the bit value - if(int.TryParse(de.Key.ToString(), - NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite, - CultureInfo.InvariantCulture, out index)) - { - // Add item - EnumItem item = new EnumItem(index, de.Value.ToString()); - base.Add(item); - } - else - { - General.WriteLogLine("WARNING: Enum structure '" + name + "' contains invalid keys!"); - } + // Add item + EnumItem item = new EnumItem(de.Key.ToString(), de.Value.ToString()); + base.Add(item); } } @@ -83,14 +80,14 @@ namespace CodeImp.DoomBuilder.Config #region ================== Methods - // This gets an item by enum index + // This gets an item by value // Returns null when item could not be found - public EnumItem GetByEnumIndex(int enumindex) + public EnumItem GetByEnumIndex(string value) { // Find the item foreach(EnumItem i in this) { - if(i.Index == enumindex) return i; + if(i.Value == value) return i; } // Nothing found diff --git a/Source/Config/LinedefActionInfo.cs b/Source/Config/LinedefActionInfo.cs index 3a8b6f3f..cd8eb064 100644 --- a/Source/Config/LinedefActionInfo.cs +++ b/Source/Config/LinedefActionInfo.cs @@ -46,10 +46,7 @@ namespace CodeImp.DoomBuilder.Config private string category; private string name; private string title; - private string[] argtitle; - private TagType[] argtagtype; - private bool[] argused; - private string[] argenum; + private ArgumentInfo[] args; #endregion @@ -60,10 +57,7 @@ namespace CodeImp.DoomBuilder.Config public string Category { get { return category; } } public string Name { get { return name; } } public string Title { get { return title; } } - public string[] ArgTitle { get { return argtitle; } } - public TagType[] ArgTagType { get { return argtagtype; } } - public bool[] ArgUsed { get { return argused; } } - public string[] ArgEnum { get { return argenum; } } + public ArgumentInfo[] Args { get { return args; } } #endregion @@ -77,34 +71,17 @@ namespace CodeImp.DoomBuilder.Config // Initialize this.index = index; this.category = categoryname; - this.argtitle = new string[Linedef.NUM_ARGS]; - this.argtagtype = new TagType[Linedef.NUM_ARGS]; - this.argused = new bool[Linedef.NUM_ARGS]; - this.argenum = new string[Linedef.NUM_ARGS]; - + this.args = new ArgumentInfo[Linedef.NUM_ARGS]; + // Read settings this.name = cfg.ReadSetting(actionsetting + ".title", "Unnamed"); this.prefix = cfg.ReadSetting(actionsetting + ".prefix", ""); this.title = this.prefix + " " + this.name; this.title = this.title.Trim(); - // Read the args and marks + // Read the args for(int i = 0; i < Linedef.NUM_ARGS; i++) - { - // Read - string istr = i.ToString(CultureInfo.InvariantCulture); - this.argused[i] = cfg.SettingExists(actionsetting + ".arg" + istr); - this.argtitle[i] = cfg.ReadSetting(actionsetting + ".arg" + istr + ".title", "Argument " + (i + 1)); - this.argtagtype[i] = (TagType)cfg.ReadSetting(actionsetting + ".arg" + istr + ".tag", (int)TagType.None); - this.argenum[i] = cfg.ReadSetting(actionsetting + ".arg" + istr + ".enum", ""); - - // Verify enums - if((this.argenum[i].Length > 0) && !enums.ContainsKey(this.argenum[i])) - { - General.WriteLogLine("WARNING: Linedef type enumeration '" + this.argenum[i] + "' does not exist! (found on linedef type " + index + ")"); - this.argenum[i] = ""; - } - } + this.args[i] = new ArgumentInfo(cfg, actionsetting, i, enums); // We have no destructor GC.SuppressFinalize(this); diff --git a/Source/Controls/ArgumentBox.cs b/Source/Controls/ArgumentBox.cs index d840926f..08e28955 100644 --- a/Source/Controls/ArgumentBox.cs +++ b/Source/Controls/ArgumentBox.cs @@ -70,31 +70,21 @@ namespace CodeImp.DoomBuilder.Controls } // This fills the box with the given enum - public void SetupEnums(string enumslistname) + public void SetupEnums(EnumList enumslist) { - EnumList list; - // Keep old value int value = this.GetResult(0); // Find the enums list - if(General.Map.Config.Enums.ContainsKey(enumslistname)) - { - // Enums found - list = General.Map.Config.Enums[enumslistname]; + if(enumslist != null) this.DropDownStyle = ComboBoxStyle.DropDown; - } else - { - // No enums - list = null; this.DropDownStyle = ComboBoxStyle.Simple; - } // Fill list - this.enums = list; + this.enums = enumslist; this.Items.Clear(); - if(list != null) this.Items.AddRange(list.ToArray()); + if(enumslist != null) this.Items.AddRange(enumslist.ToArray()); // Re-apply value this.Text = value.ToString(); @@ -115,7 +105,7 @@ namespace CodeImp.DoomBuilder.Controls // Enum selected? if(this.SelectedItem != null) { - return (this.SelectedItem as EnumItem).Index; + return (this.SelectedItem as EnumItem).GetIntValue(); } else { @@ -174,7 +164,7 @@ namespace CodeImp.DoomBuilder.Controls { // Try selecting this enum EnumItem item = null; - if(enums != null) item = enums.GetByEnumIndex(num); + if(enums != null) item = enums.GetByEnumIndex(num.ToString()); if(item != null) { // Select enum diff --git a/Source/General/General.cs b/Source/General/General.cs index ebffd0db..57212ac5 100644 --- a/Source/General/General.cs +++ b/Source/General/General.cs @@ -36,6 +36,7 @@ using CodeImp.DoomBuilder.Config; using SlimDX.Direct3D9; using System.Drawing; using CodeImp.DoomBuilder.Plugins; +using CodeImp.DoomBuilder.Types; #endregion @@ -109,6 +110,7 @@ namespace CodeImp.DoomBuilder private static ActionManager actions; private static PluginManager plugins; private static ColorCollection colors; + private static TypesManager types; private static Clock clock; // Configurations @@ -145,6 +147,7 @@ namespace CodeImp.DoomBuilder public static Clock Clock { get { return clock; } } public static bool DebugBuild { get { return debugbuild; } } internal static Triangulator EarClipper { get { return earclipper; } } + internal static TypesManager Types { get { return types; } } #endregion @@ -524,6 +527,10 @@ namespace CodeImp.DoomBuilder General.WriteLogLine("Creating application clock..."); clock = new Clock(); + // Create types manager + General.WriteLogLine("Creating types manager..."); + types = new TypesManager(); + // Run application from the main window General.WriteLogLine("Startup done"); mainwindow.DisplayReady(); @@ -597,6 +604,7 @@ namespace CodeImp.DoomBuilder if(actions != null) actions.Dispose(); if(clock != null) clock.Dispose(); if(plugins != null) plugins.Dispose(); + if(types != null) types.Dispose(); try { Direct3D.Terminate(); } catch(Exception) { } // Application ends here and now diff --git a/Source/Types/EnumOptionHandler.cs b/Source/Types/EnumOptionHandler.cs new file mode 100644 index 00000000..b6075ea7 --- /dev/null +++ b/Source/Types/EnumOptionHandler.cs @@ -0,0 +1,143 @@ + +#region ================== Copyright (c) 2007 Pascal vd Heiden + +/* + * Copyright (c) 2007 Pascal vd Heiden, www.codeimp.com + * This program is released under GNU General Public License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#endregion + +#region ================== Namespaces + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Globalization; +using System.Text; +using CodeImp.DoomBuilder.IO; +using CodeImp.DoomBuilder.Data; +using System.IO; +using System.Diagnostics; +using CodeImp.DoomBuilder.Config; + +#endregion + +namespace CodeImp.DoomBuilder.Types +{ + [TypeHandler(11)] + internal class EnumOptionHandler : TypeHandler + { + #region ================== Constants + + #endregion + + #region ================== Variables + + private EnumList list; + private EnumItem value; + + #endregion + + #region ================== Properties + + public virtual bool IsBrowseable { get { return true; } } + public virtual bool IsEnumerable { get { return true; } } + + #endregion + + #region ================== Constructor + + // When set up for an argument + public override void SetupArgument(ArgumentInfo arginfo) + { + base.SetupArgument(arginfo); + + // Keep enum list reference + list = arginfo.Enum; + } + + #endregion + + #region ================== Methods + + public override void SetValue(object value) + { + this.value = null; + + // First try to match the value against the enum values + foreach(EnumItem item in list) + { + // Matching value? + if(item.Value == value.ToString()) + { + // Set this value + this.value = item; + } + } + + // No match found yet? + if(this.value == null) + { + // Try to match against the titles + foreach(EnumItem item in list) + { + // Matching value? + if(item.Title.ToLowerInvariant() == value.ToString().ToLowerInvariant()) + { + // Set this value + this.value = item; + } + } + } + + // Still no match found? + if(this.value == null) + { + // Make a dummy value + this.value = new EnumItem(value.ToString(), value.ToString()); + } + } + + public override int GetIntValue() + { + if(this.value != null) + { + // Parse the value to integer + int result; + if(int.TryParse(this.value.Value, NumberStyles.Integer, + CultureInfo.InvariantCulture, out result)) + { + return result; + } + else + { + return 0; + } + } + else + { + return 0; + } + } + + public override string GetStringValue() + { + if(this.value != null) return this.value.Title; else return "NULL"; + } + + // This returns an enum list + public override EnumList GetEnumList() + { + return list; + } + + #endregion + } +} diff --git a/Source/Types/IntegerHandler.cs b/Source/Types/IntegerHandler.cs new file mode 100644 index 00000000..e8a836f8 --- /dev/null +++ b/Source/Types/IntegerHandler.cs @@ -0,0 +1,90 @@ + +#region ================== Copyright (c) 2007 Pascal vd Heiden + +/* + * Copyright (c) 2007 Pascal vd Heiden, www.codeimp.com + * This program is released under GNU General Public License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#endregion + +#region ================== Namespaces + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Globalization; +using System.Text; +using CodeImp.DoomBuilder.IO; +using CodeImp.DoomBuilder.Data; +using System.IO; +using System.Diagnostics; + +#endregion + +namespace CodeImp.DoomBuilder.Types +{ + [TypeHandler(0)] + internal class IntegerHandler : TypeHandler + { + #region ================== Constants + + #endregion + + #region ================== Variables + + private int value; + + #endregion + + #region ================== Properties + + public override bool IsCustomType { get { return true; } } + + #endregion + + #region ================== Methods + + public override void SetValue(object value) + { + int result; + + // Already an int or float? + if((value is int) || (value is float)) + { + // Return the same + this.value = (int)value; + } + else + { + // Try parsing as string + if(int.TryParse(value.ToString(), NumberStyles.Integer, CultureInfo.CurrentCulture, out result)) + { + this.value = result; + } + else + { + this.value = 0; + } + } + } + + public override int GetIntValue() + { + return this.value; + } + + public override string GetStringValue() + { + return this.value.ToString(); + } + + #endregion + } +} diff --git a/Source/Types/NullHandler.cs b/Source/Types/NullHandler.cs new file mode 100644 index 00000000..5d2805d3 --- /dev/null +++ b/Source/Types/NullHandler.cs @@ -0,0 +1,63 @@ + +#region ================== Copyright (c) 2007 Pascal vd Heiden + +/* + * Copyright (c) 2007 Pascal vd Heiden, www.codeimp.com + * This program is released under GNU General Public License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#endregion + +#region ================== Namespaces + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Globalization; +using System.Text; +using CodeImp.DoomBuilder.IO; +using CodeImp.DoomBuilder.Data; +using System.IO; +using System.Diagnostics; + +#endregion + +namespace CodeImp.DoomBuilder.Types +{ + internal class NullHandler : TypeHandler + { + #region ================== Constants + + #endregion + + #region ================== Variables + + private object value; + + #endregion + + #region ================== Properties + + #endregion + + #region ================== Methods + + public override void SetValue(object value) + { + this.value = value; + } + + public override string GetStringValue() + { + return this.value.ToString(); + } + + #endregion + } +} diff --git a/Source/Types/TypeHandler.cs b/Source/Types/TypeHandler.cs new file mode 100644 index 00000000..93069739 --- /dev/null +++ b/Source/Types/TypeHandler.cs @@ -0,0 +1,117 @@ + +#region ================== Copyright (c) 2007 Pascal vd Heiden + +/* + * Copyright (c) 2007 Pascal vd Heiden, www.codeimp.com + * This program is released under GNU General Public License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#endregion + +#region ================== Namespaces + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Globalization; +using System.Text; +using CodeImp.DoomBuilder.IO; +using CodeImp.DoomBuilder.Data; +using System.IO; +using System.Diagnostics; +using System.Windows.Forms; +using CodeImp.DoomBuilder.Config; + +#endregion + +namespace CodeImp.DoomBuilder.Types +{ + internal abstract class TypeHandler + { + #region ================== Constants + + #endregion + + #region ================== Variables + + protected int index; + protected ArgumentInfo arginfo; + + #endregion + + #region ================== Properties + + public int Index { get { return index; } } + + public virtual bool IsBrowseable { get { return false; } } + public virtual bool IsEnumerable { get { return false; } } + public virtual bool IsCustomType { get { return false; } } + + #endregion + + #region ================== Constructor + + // Constructor + public TypeHandler() + { + // Get my attributes + object[] attrs = this.GetType().GetCustomAttributes(typeof(TypeHandlerAttribute), false); + TypeHandlerAttribute attr = (attrs[0] as TypeHandlerAttribute); + + // Initialize + this.index = attr.Index; + } + + // This sets up the handler for arguments + public virtual void SetupArgument(ArgumentInfo arginfo) + { + // Setup + this.arginfo = arginfo; + } + + #endregion + + #region ================== Methods + + // This must set the value + // How the value is actually validated and stored is up to the implementation + public abstract void SetValue(object value); + + // This must return the value as integer (for arguments) + public virtual int GetIntValue() + { + throw new NotSupportedException("Override this method to support it as integer for arguments"); + } + + // This must return the value as a string for displaying + public abstract string GetStringValue(); + + // This is called when the user presses the browse button + public virtual object Browse(IWin32Window parent) + { + return null; + } + + // This must returns an enum list when IsEnumerable is true + // When the user chooses an enum from this list, it will be + // set using SetValue with the EnumItem as value. + public virtual EnumList GetEnumList() + { + return null; + } + + // String representation + public override string ToString() + { + return this.GetStringValue(); + } + + #endregion + } +} diff --git a/Source/Types/TypeHandlerAttribute.cs b/Source/Types/TypeHandlerAttribute.cs new file mode 100644 index 00000000..c5b575eb --- /dev/null +++ b/Source/Types/TypeHandlerAttribute.cs @@ -0,0 +1,66 @@ + +#region ================== Copyright (c) 2007 Pascal vd Heiden + +/* + * Copyright (c) 2007 Pascal vd Heiden, www.codeimp.com + * This program is released under GNU General Public License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#endregion + +#region ================== Namespaces + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Globalization; +using System.Text; +using CodeImp.DoomBuilder.IO; +using CodeImp.DoomBuilder.Data; +using System.IO; +using System.Diagnostics; + +#endregion + +namespace CodeImp.DoomBuilder.Types +{ + internal class TypeHandlerAttribute : Attribute + { + #region ================== Constants + + #endregion + + #region ================== Variables + + private int index; + + #endregion + + #region ================== Properties + + public int Index { get { return index; } } + + #endregion + + #region ================== Constructor / Destructor + + // Constructor + public TypeHandlerAttribute(int index) + { + // Initialize + this.index = index; + } + + #endregion + + #region ================== Methods + + #endregion + } +} diff --git a/Source/Types/TypesManager.cs b/Source/Types/TypesManager.cs new file mode 100644 index 00000000..12edbad2 --- /dev/null +++ b/Source/Types/TypesManager.cs @@ -0,0 +1,120 @@ + +#region ================== Copyright (c) 2007 Pascal vd Heiden + +/* + * Copyright (c) 2007 Pascal vd Heiden, www.codeimp.com + * This program is released under GNU General Public License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#endregion + +#region ================== Namespaces + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Globalization; +using System.Text; +using CodeImp.DoomBuilder.IO; +using CodeImp.DoomBuilder.Data; +using System.IO; +using System.Diagnostics; +using CodeImp.DoomBuilder.Config; + +#endregion + +namespace CodeImp.DoomBuilder.Types +{ + internal class TypesManager : IDisposable + { + #region ================== Constants + + #endregion + + #region ================== Variables + + // List of handler types + private Dictionary handlertypes; + + // Disposing + private bool isdisposed = false; + + #endregion + + #region ================== Properties + + public bool IsDisposed { get { return isdisposed; } } + + #endregion + + #region ================== Constructor / Disposer + + // Constructor + public TypesManager() + { + // Initialize + handlertypes = new Dictionary(); + + // Go for all types in this assembly + Type[] types = General.ThisAssembly.GetTypes(); + foreach(Type tp in types) + { + // Check if this type is a class + if(tp.IsClass && !tp.IsAbstract && !tp.IsArray) + { + // Check if class has an TypeHandler attribute + if(Attribute.IsDefined(tp, typeof(TypeHandlerAttribute), false)) + { + // Add the type to the list + object[] attribs = tp.GetCustomAttributes(typeof(TypeHandlerAttribute), false); + TypeHandlerAttribute attr = (attribs[0] as TypeHandlerAttribute); + handlertypes.Add(attr.Index, tp); + } + } + } + + // We have no destructor + GC.SuppressFinalize(this); + } + + // Disposer + public void Dispose() + { + // Not already disposed? + if(!isdisposed) + { + // Clean up + handlertypes.Clear(); + + // Done + isdisposed = true; + } + } + + #endregion + + #region ================== Methods + + // This returns the type handler for the given argument + public TypeHandler GetArgumentHandler(ArgumentInfo arginfo) + { + Type t = typeof(NullHandler); + + // Do we have a handler type for this? + if(handlertypes.ContainsKey(arginfo.Type)) t = handlertypes[arginfo.Type]; + + // Create instance + TypeHandler th = (TypeHandler)General.ThisAssembly.CreateInstance(t.FullName); + th.SetupArgument(arginfo); + return th; + } + + #endregion + } +} diff --git a/Source/Windows/LinedefEditForm.Designer.cs b/Source/Windows/LinedefEditForm.Designer.cs index be9828c3..fb4f670d 100644 --- a/Source/Windows/LinedefEditForm.Designer.cs +++ b/Source/Windows/LinedefEditForm.Designer.cs @@ -378,6 +378,7 @@ namespace CodeImp.DoomBuilder.Windows // // arg4 // + this.arg4.DropDownWidth = 200; this.arg4.FormattingEnabled = true; this.arg4.ImeMode = System.Windows.Forms.ImeMode.Off; this.arg4.Location = new System.Drawing.Point(400, 81); diff --git a/Source/Windows/LinedefEditForm.cs b/Source/Windows/LinedefEditForm.cs index 10af839b..dc07f14f 100644 --- a/Source/Windows/LinedefEditForm.cs +++ b/Source/Windows/LinedefEditForm.cs @@ -352,26 +352,26 @@ namespace CodeImp.DoomBuilder.Windows if(General.Map.Config.LinedefActions.ContainsKey(action.Value)) showaction = action.Value; // Change the argument descriptions - arg0label.Text = General.Map.Config.LinedefActions[showaction].ArgTitle[0] + ":"; - arg1label.Text = General.Map.Config.LinedefActions[showaction].ArgTitle[1] + ":"; - arg2label.Text = General.Map.Config.LinedefActions[showaction].ArgTitle[2] + ":"; - arg3label.Text = General.Map.Config.LinedefActions[showaction].ArgTitle[3] + ":"; - arg4label.Text = General.Map.Config.LinedefActions[showaction].ArgTitle[4] + ":"; - arg0label.Enabled = General.Map.Config.LinedefActions[showaction].ArgUsed[0]; - arg1label.Enabled = General.Map.Config.LinedefActions[showaction].ArgUsed[1]; - arg2label.Enabled = General.Map.Config.LinedefActions[showaction].ArgUsed[2]; - arg3label.Enabled = General.Map.Config.LinedefActions[showaction].ArgUsed[3]; - arg4label.Enabled = General.Map.Config.LinedefActions[showaction].ArgUsed[4]; + arg0label.Text = General.Map.Config.LinedefActions[showaction].Args[0].Title + ":"; + arg1label.Text = General.Map.Config.LinedefActions[showaction].Args[1].Title + ":"; + arg2label.Text = General.Map.Config.LinedefActions[showaction].Args[2].Title + ":"; + arg3label.Text = General.Map.Config.LinedefActions[showaction].Args[3].Title + ":"; + arg4label.Text = General.Map.Config.LinedefActions[showaction].Args[4].Title + ":"; + arg0label.Enabled = General.Map.Config.LinedefActions[showaction].Args[0].Used; + arg1label.Enabled = General.Map.Config.LinedefActions[showaction].Args[1].Used; + arg2label.Enabled = General.Map.Config.LinedefActions[showaction].Args[2].Used; + arg3label.Enabled = General.Map.Config.LinedefActions[showaction].Args[3].Used; + arg4label.Enabled = General.Map.Config.LinedefActions[showaction].Args[4].Used; if(arg0label.Enabled) arg0.ForeColor = SystemColors.WindowText; else arg0.ForeColor = SystemColors.GrayText; if(arg1label.Enabled) arg1.ForeColor = SystemColors.WindowText; else arg1.ForeColor = SystemColors.GrayText; if(arg2label.Enabled) arg2.ForeColor = SystemColors.WindowText; else arg2.ForeColor = SystemColors.GrayText; if(arg3label.Enabled) arg3.ForeColor = SystemColors.WindowText; else arg3.ForeColor = SystemColors.GrayText; if(arg4label.Enabled) arg4.ForeColor = SystemColors.WindowText; else arg4.ForeColor = SystemColors.GrayText; - arg0.SetupEnums(General.Map.Config.LinedefActions[showaction].ArgEnum[0]); - arg1.SetupEnums(General.Map.Config.LinedefActions[showaction].ArgEnum[1]); - arg2.SetupEnums(General.Map.Config.LinedefActions[showaction].ArgEnum[2]); - arg3.SetupEnums(General.Map.Config.LinedefActions[showaction].ArgEnum[3]); - arg4.SetupEnums(General.Map.Config.LinedefActions[showaction].ArgEnum[4]); + arg0.SetupEnums(General.Map.Config.LinedefActions[showaction].Args[0].Enum); + arg1.SetupEnums(General.Map.Config.LinedefActions[showaction].Args[1].Enum); + arg2.SetupEnums(General.Map.Config.LinedefActions[showaction].Args[2].Enum); + arg3.SetupEnums(General.Map.Config.LinedefActions[showaction].Args[3].Enum); + arg4.SetupEnums(General.Map.Config.LinedefActions[showaction].Args[4].Enum); } // Browse Action clicked diff --git a/Source/Windows/ThingEditForm.cs b/Source/Windows/ThingEditForm.cs index 58243952..0530ff26 100644 --- a/Source/Windows/ThingEditForm.cs +++ b/Source/Windows/ThingEditForm.cs @@ -199,26 +199,26 @@ namespace CodeImp.DoomBuilder.Windows if(General.Map.Config.LinedefActions.ContainsKey(action.Value)) showaction = action.Value; // Change the argument descriptions - arg0label.Text = General.Map.Config.LinedefActions[showaction].ArgTitle[0] + ":"; - arg1label.Text = General.Map.Config.LinedefActions[showaction].ArgTitle[1] + ":"; - arg2label.Text = General.Map.Config.LinedefActions[showaction].ArgTitle[2] + ":"; - arg3label.Text = General.Map.Config.LinedefActions[showaction].ArgTitle[3] + ":"; - arg4label.Text = General.Map.Config.LinedefActions[showaction].ArgTitle[4] + ":"; - arg0label.Enabled = General.Map.Config.LinedefActions[showaction].ArgUsed[0]; - arg1label.Enabled = General.Map.Config.LinedefActions[showaction].ArgUsed[1]; - arg2label.Enabled = General.Map.Config.LinedefActions[showaction].ArgUsed[2]; - arg3label.Enabled = General.Map.Config.LinedefActions[showaction].ArgUsed[3]; - arg4label.Enabled = General.Map.Config.LinedefActions[showaction].ArgUsed[4]; + arg0label.Text = General.Map.Config.LinedefActions[showaction].Args[0].Title + ":"; + arg1label.Text = General.Map.Config.LinedefActions[showaction].Args[1].Title + ":"; + arg2label.Text = General.Map.Config.LinedefActions[showaction].Args[2].Title + ":"; + arg3label.Text = General.Map.Config.LinedefActions[showaction].Args[3].Title + ":"; + arg4label.Text = General.Map.Config.LinedefActions[showaction].Args[4].Title + ":"; + arg0label.Enabled = General.Map.Config.LinedefActions[showaction].Args[0].Used; + arg1label.Enabled = General.Map.Config.LinedefActions[showaction].Args[1].Used; + arg2label.Enabled = General.Map.Config.LinedefActions[showaction].Args[2].Used; + arg3label.Enabled = General.Map.Config.LinedefActions[showaction].Args[3].Used; + arg4label.Enabled = General.Map.Config.LinedefActions[showaction].Args[4].Used; if(arg0label.Enabled) arg0.ForeColor = SystemColors.WindowText; else arg0.ForeColor = SystemColors.GrayText; if(arg1label.Enabled) arg1.ForeColor = SystemColors.WindowText; else arg1.ForeColor = SystemColors.GrayText; if(arg2label.Enabled) arg2.ForeColor = SystemColors.WindowText; else arg2.ForeColor = SystemColors.GrayText; if(arg3label.Enabled) arg3.ForeColor = SystemColors.WindowText; else arg3.ForeColor = SystemColors.GrayText; if(arg4label.Enabled) arg4.ForeColor = SystemColors.WindowText; else arg4.ForeColor = SystemColors.GrayText; - arg0.SetupEnums(General.Map.Config.LinedefActions[showaction].ArgEnum[0]); - arg1.SetupEnums(General.Map.Config.LinedefActions[showaction].ArgEnum[1]); - arg2.SetupEnums(General.Map.Config.LinedefActions[showaction].ArgEnum[2]); - arg3.SetupEnums(General.Map.Config.LinedefActions[showaction].ArgEnum[3]); - arg4.SetupEnums(General.Map.Config.LinedefActions[showaction].ArgEnum[4]); + arg0.SetupEnums(General.Map.Config.LinedefActions[showaction].Args[0].Enum); + arg1.SetupEnums(General.Map.Config.LinedefActions[showaction].Args[1].Enum); + arg2.SetupEnums(General.Map.Config.LinedefActions[showaction].Args[2].Enum); + arg3.SetupEnums(General.Map.Config.LinedefActions[showaction].Args[3].Enum); + arg4.SetupEnums(General.Map.Config.LinedefActions[showaction].Args[4].Enum); } // Browse Action clicked