UltimateZoneBuilder/Source/Core/Config/ScriptConfiguration.cs
MaxED 0369c969d1 According to dotnetperls.com, "new Dictionary<string, [anything]>(StringComparer.Ordinal)" works 17% faster than "new Dictionary<string, [anything]>()", so let's stick that everywhere and see what happens :)
Draw Curve Mode: added settings panel.
Sectors mode: added "Make Door" button to the toolbar.
Swapped Side panel and Info panel z-order. 
Interface: split toolbar into 3 separate toolbars. All toolbar buttons are now viewable at 1024x768.
Interface: grouped stuff in "Modes" menu a bit better.
Interface: added "Draw [stuff]" buttons to modes toolbar.
Interface: reorganized main menu. Hope it makes more sense now.
API: added General.Interface.AddModesButton() and General.Interface.AddModesMenu(), which can be used to add buttons to specific group in "Modes" toolbar and menu items to specific group in "Modes" menu, so actions, which behave like an editing mode, but are not part of one can be added there.
2014-02-26 14:11:06 +00:00

243 lines
7.5 KiB
C#

#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 CodeImp.DoomBuilder.IO;
#endregion
namespace CodeImp.DoomBuilder.Config
{
internal class ScriptConfiguration : IComparable<ScriptConfiguration>
{
#region ================== Constants
#endregion
#region ================== Variables
// Original configuration
//private Configuration cfg;
// Compiler settings
private CompilerInfo compiler;
private string parameters;
private string resultlump;
// Editor settings
private string description;
private int codepage;
private string[] extensions;
private bool casesensitive;
private int insertcase;
private int lexer;
private string keywordhelp;
private string functionopen;
private string functionclose;
private string argumentdelimiter;
private string terminator;
private string functionregex;
// Collections
private Dictionary<string, string> keywords;
private Dictionary<string, string> lowerkeywords;
private List<string> constants;
private Dictionary<string, string> lowerconstants;
#endregion
#region ================== Properties
// Compiler settings
public CompilerInfo Compiler { get { return compiler; } }
public string Parameters { get { return parameters; } }
public string ResultLump { get { return resultlump; } }
// Editor settings
public string Description { get { return description; } }
public int CodePage { get { return codepage; } }
public string[] Extensions { get { return extensions; } }
public bool CaseSensitive { get { return casesensitive; } }
public int InsertCase { get { return insertcase; } }
public int Lexer { get { return lexer; } }
public string KeywordHelp { get { return keywordhelp; } }
public string FunctionOpen { get { return functionopen; } }
public string FunctionClose { get { return functionclose; } }
public string ArgumentDelimiter { get { return argumentdelimiter; } }
public string Terminator { get { return terminator; } }
public string FunctionRegEx { get { return functionregex; } }
// Collections
public ICollection<string> Keywords { get { return keywords.Keys; } }
public ICollection<string> Constants { get { return constants; } }
#endregion
#region ================== Constructor / Disposer
// This creates the default script configuration
// that is used for documents of unknown type
internal ScriptConfiguration()
{
// Initialize
this.keywords = new Dictionary<string, string>(StringComparer.Ordinal);
this.constants = new List<string>();
this.lowerkeywords = new Dictionary<string, string>(StringComparer.Ordinal);
this.lowerconstants = new Dictionary<string, string>(StringComparer.Ordinal);
// Settings
lexer = 1;
casesensitive = false;
codepage = 65001;
parameters = "";
resultlump = "";
insertcase = 0;
keywordhelp = "";
functionopen = "";
functionclose = "";
argumentdelimiter = "";
terminator = "";
functionregex = "";
description = "Plain text";
extensions = new[] { "txt" };
}
// Constructor
internal ScriptConfiguration(Configuration cfg)
{
// Initialize
this.keywords = new Dictionary<string, string>(StringComparer.Ordinal);
this.constants = new List<string>();
this.lowerkeywords = new Dictionary<string, string>(StringComparer.Ordinal);
this.lowerconstants = new Dictionary<string, string>(StringComparer.Ordinal);
// Read settings
description = cfg.ReadSetting("description", "Untitled script");
codepage = cfg.ReadSetting("codepage", 0);
string extensionsstring = cfg.ReadSetting("extensions", "");
string compilername = cfg.ReadSetting("compiler", "");
parameters = cfg.ReadSetting("parameters", "");
resultlump = cfg.ReadSetting("resultlump", "");
casesensitive = cfg.ReadSetting("casesensitive", true);
insertcase = cfg.ReadSetting("insertcase", 0);
lexer = cfg.ReadSetting("lexer", 0);
keywordhelp = cfg.ReadSetting("keywordhelp", "");
functionopen = cfg.ReadSetting("functionopen", "");
functionclose = cfg.ReadSetting("functionclose", "");
argumentdelimiter = cfg.ReadSetting("argumentdelimiter", "");
terminator = cfg.ReadSetting("terminator", "");
functionregex = cfg.ReadSetting("functionregex", "");
// Make extensions array
extensions = extensionsstring.Split(',');
for(int i = 0; i < extensions.Length; i++) extensions[i] = extensions[i].Trim();
// Load keywords
IDictionary dic = cfg.ReadSetting("keywords", new Hashtable());
foreach(DictionaryEntry de in dic)
{
keywords.Add(de.Key.ToString(), de.Value.ToString());
lowerkeywords.Add(de.Key.ToString().ToLowerInvariant(), de.Key.ToString());
}
// Load constants
dic = cfg.ReadSetting("constants", new Hashtable());
foreach(DictionaryEntry de in dic)
{
constants.Add(de.Key.ToString());
lowerconstants.Add(de.Key.ToString().ToLowerInvariant(), de.Key.ToString());
}
// Compiler specified?
if(compilername.Length > 0)
{
// Find compiler
foreach(CompilerInfo c in General.Compilers)
{
// Compiler name matches?
if(c.Name == compilername)
{
// Apply compiler
this.compiler = c;
break;
}
}
// No compiler found?
if(this.compiler == null) throw new Exception("No such compiler defined: '" + compilername + "'");
}
}
#endregion
#region ================== Methods
// This returns the correct case for a keyword
// Returns the same keyword as the input when it cannot be found
public string GetKeywordCase(string keyword)
{
if(lowerkeywords.ContainsKey(keyword.ToLowerInvariant()))
return lowerkeywords[keyword.ToLowerInvariant()];
else
return keyword;
}
// This returns the correct case for a constant
// Returns the same constant as the input when it cannot be found
public string GetConstantCase(string constant)
{
if(lowerconstants.ContainsKey(constant.ToLowerInvariant()))
return lowerconstants[constant.ToLowerInvariant()];
else
return constant;
}
// This returns true when the given word is a keyword
public bool IsKeyword(string keyword)
{
return lowerkeywords.ContainsKey(keyword.ToLowerInvariant());
}
// This returns true when the given word is a contant
public bool IsConstant(string constant)
{
return lowerconstants.ContainsKey(constant.ToLowerInvariant());
}
// This returns the function definition for a keyword
// Returns null when no function definition exists
// NOTE: The keyword parameter is case-sensitive!
public string GetFunctionDefinition(string keyword)
{
if(keywords.ContainsKey(keyword))
return keywords[keyword];
else
return null;
}
// This sorts by description
public int CompareTo(ScriptConfiguration other)
{
return string.Compare(this.description, other.description, true);
}
#endregion
}
}