示例#1
0
		private void readLanguage(XmlReader reader)
		{
			_commands_KeyBindingList = new CommandBindingConfigList();
			_lexing_Properties = new LexerPropertiesConfig();
			_lexing_Keywords = new KeyWordConfigList();
			_margin_List = new MarginConfigList();
			_markers_List = new MarkersConfigList();
			_snippetsConfigList = new SnippetsConfigList();
			_styles = new StyleConfigList();

			reader.Read();
			while (reader.NodeType == XmlNodeType.Element)
			{
				string elName = reader.Name.ToLower();
				switch (elName)
				{
					case "autocomplete":
						readAutoComplete(reader);
						break;
					case "calltip":
						readCallTip(reader);
						break;
					case "caret":
						readCaret(reader);
						break;
					case "clipboard":
						readClipboard(reader);
						break;
					case "commands":
						readCommands(reader);
						break;
					case "endofline":
						readEndOfLine(reader);
						break;
					case "folding":
						readFolding(reader);
						break;
					case "hotspot":
						readHotSpot(reader);
						break;
					case "indentation":
						readIndentation(reader);
						break;
					case "indicators":
						readIndicators(reader);
						break;
					case "lexer":
						readLexer(reader);
						break;
					case "linewrap":
						readLineWrap(reader);
						break;
					case "longlines":
						readLongLines(reader);
						break;
					case "margins":
						readMargins(reader);
						break;
					case "markers":
						readMarkers(reader);
						break;
					case "scrolling":
						readScrolling(reader);
						break;
					case "selection":
						readSelection(reader);
						break;
					case "snippets":
						readSnippets(reader);
						break;
					case "styles":
						readStyles(reader);
						break;
					case "undoredo":
						readUndoRedo(reader);
						break;
					case "whitespace":
						readWhitespace(reader);
						break;
					default:
						reader.Skip();
						break;
				}
				
			}
		}
示例#2
0
		public void Load(XmlDocument configDocument)
		{
			
			XmlNode langNode = configDocument.DocumentElement.SelectSingleNode("./Language[@Name='" + _language + "']");
			if (langNode == null)
				return;

			XmlElement callTipNode = langNode.SelectSingleNode("CallTip") as XmlElement;
			if (callTipNode != null)
			{
				_callTip_BackColor = getColor(callTipNode.GetAttribute("BackColor"));
				_callTip_ForeColor = getColor(callTipNode.GetAttribute("ForeColor"));
				_callTip_HighlightTextColor = getColor(callTipNode.GetAttribute("HighlightTextColor"));
			}
			callTipNode = null;

			XmlElement caretNode = langNode.SelectSingleNode("Caret") as XmlElement;
			if (caretNode != null)
			{
				//	This guy is a bit of an oddball becuase null means "I don't Care"
				//	and we need some way of using the OS value.
				string blinkRate = caretNode.GetAttribute("BlinkRate");
				if (blinkRate.ToLower() == "system")
					_caret_BlinkRate = SystemInformation.CaretBlinkTime;
				else
					_caret_BlinkRate = getInt(blinkRate);

				_caret_Color = getColor(caretNode.GetAttribute("Color"));
				_caret_CurrentLineBackgroundAlpha = getInt(caretNode.GetAttribute("CurrentLineBackgroundAlpha"));
				_caret_CurrentLineBackgroundColor = getColor(caretNode.GetAttribute("CurrentLineBackgroundColor"));
				_caret_HighlightCurrentLine = getBool(caretNode.GetAttribute("HighlightCurrentLine"));
				_caret_IsSticky = getBool(caretNode.GetAttribute("IsSticky"));
				try
				{
					_caret_Style = (CaretStyle)Enum.Parse(typeof(CaretStyle), caretNode.GetAttribute("Style"), true);
				}
				catch (ArgumentException) { }
				_caret_Width = getInt(caretNode.GetAttribute("Width"));
			}
			caretNode = null;

			XmlElement clipboardNode = langNode.SelectSingleNode("Clipboard") as XmlElement;
			if (clipboardNode != null)
			{
				_clipboard_ConvertEndOfLineOnPaste = getBool(clipboardNode.GetAttribute("ConvertEndOfLineOnPaste"));
			}
			clipboardNode = null;

			_commands_KeyBindingList = new CommandBindingConfigList();
			XmlElement commandsNode = langNode.SelectSingleNode("Commands") as XmlElement;
			if (commandsNode != null)
			{
				_commands_KeyBindingList.Inherit = getBool(commandsNode.GetAttribute("Inherit"));
				_commands_KeyBindingList.AllowDuplicateBindings = getBool(commandsNode.GetAttribute("AllowDuplicateBindings"));
				foreach (XmlElement el in commandsNode.SelectNodes("./Binding"))
				{
					KeyBinding kb = new KeyBinding();
					kb.KeyCode = Utilities.GetKeys(el.GetAttribute("Key"));

					string modifiers = el.GetAttribute("Modifier");
					if (modifiers != string.Empty)
					{
						foreach (string modifier in modifiers.Split(' '))
							kb.Modifiers |= (Keys)Enum.Parse(typeof(Keys), modifier.Trim(), true);
					}

					BindableCommand cmd = (BindableCommand)Enum.Parse(typeof(BindableCommand), el.GetAttribute("Command"), true);
					CommandBindingConfig cfg = new CommandBindingConfig(kb, getBool(el.GetAttribute("ReplaceCurrent")), cmd);
					_commands_KeyBindingList.Add(cfg);
				}
			}
			commandsNode = null;

			XmlElement endOfLineNode = langNode.SelectSingleNode("EndOfLine") as XmlElement;
			if (endOfLineNode != null)
			{
				_endOfLine_ConvertOnPaste = getBool(endOfLineNode.GetAttribute("ConvertOnPaste"));
				_endOfLine_IsVisisble = getBool(endOfLineNode.GetAttribute("IsVisible"));

				try
				{
					_endOfLine_Mode = (EndOfLineMode)Enum.Parse(typeof(EndOfLineMode), endOfLineNode.GetAttribute("Mode"), true);
				}
				catch (ArgumentException) { }
			}
			endOfLineNode = null;

			XmlElement hotSpotNode = langNode.SelectSingleNode("HotSpot") as XmlElement;
			if (hotSpotNode != null)
			{
				_hotspot_ActiveBackColor = getColor(hotSpotNode.GetAttribute("ActiveBackColor"));
				_hotspot_ActiveForeColor = getColor(hotSpotNode.GetAttribute("ActiveForeColor"));
				_hotspot_ActiveUnderline = getBool(hotSpotNode.GetAttribute("ActiveUnderline"));
				_hotspot_SingleLine = getBool(hotSpotNode.GetAttribute("SingleLine"));
				_hotspot_UseActiveBackColor = getBool(hotSpotNode.GetAttribute("UseActiveBackColor"));
				_hotspot_UseActiveForeColor = getBool(hotSpotNode.GetAttribute("UseActiveForeColor"));
			}
			hotSpotNode = null;

			XmlElement indentationNode = langNode.SelectSingleNode("Indentation") as XmlElement;
			if (indentationNode != null)
			{
				_indentation_BackspaceUnindents = getBool(indentationNode.GetAttribute("BackspaceUnindents"));
				_indentation_IndentWidth = getInt(indentationNode.GetAttribute("IndentWidth"));
				_indentation_ShowGuides = getBool(indentationNode.GetAttribute("ShowGuides"));
				_indentation_TabIndents = getBool(indentationNode.GetAttribute("TabIndents"));
				_indentation_TabWidth = getInt(indentationNode.GetAttribute("TabWidth"));
				_indentation_UseTabs = getBool(indentationNode.GetAttribute("UseTabs"));

				try
				{
					_indentation_SmartIndentType = (SmartIndent)Enum.Parse(typeof(SmartIndent), indentationNode.GetAttribute("SmartIndentType"), true);
				}
				catch (ArgumentException) { }

			}
			indentationNode = null;

			XmlElement indicatorNode = langNode.SelectSingleNode("Indicators") as XmlElement;
			if (indicatorNode != null)
			{
				_indicator_List.Inherit = getBool(indicatorNode.GetAttribute("Inherit"));
				foreach (XmlElement el in indicatorNode.SelectNodes("Indicator"))
				{
					IndicatorConfig ic = new IndicatorConfig();
					ic.Number = int.Parse(el.GetAttribute("Number"));
					ic.Color = getColor(el.GetAttribute("Color"));
					ic.Inherit = getBool(el.GetAttribute("Inherit"));
					ic.IsDrawnUnder = getBool(el.GetAttribute("IsDrawnUnder"));
					try
					{
						ic.Style = (IndicatorStyle)Enum.Parse(typeof(IndicatorStyle), el.GetAttribute("Style"), true);
					}
					catch (ArgumentException) { }

					_indicator_List.Add(ic);
				}
			}

			_lexing_Properties = new LexerPropertiesConfig();
			_lexing_Keywords = new KeyWordConfigList();
			XmlElement lexerNode = langNode.SelectSingleNode("Lexer") as XmlElement;
			if (lexerNode != null)
			{
				_lexing_WhiteSpaceChars = getString(lexerNode.GetAttributeNode("WhiteSpaceChars"));
				_lexing_WordChars = getString(lexerNode.GetAttributeNode("WordChars"));
				_lexing_Language = getString(lexerNode.GetAttributeNode("LexerName"));
				_lexing_LineCommentPrefix = getString(lexerNode.GetAttributeNode("LineCommentPrefix"));
				_lexing_StreamCommentPrefix = getString(lexerNode.GetAttributeNode("StreamCommentPrefix"));
				_lexing_StreamCommentSuffix = getString(lexerNode.GetAttributeNode("StreamCommentSuffix"));

				XmlElement propNode = lexerNode.SelectSingleNode("Properties") as XmlElement;
				if (propNode != null)
				{
					_lexing_Properties.Inherit = getBool(propNode.GetAttribute("Inherit"));

					foreach (XmlElement el in propNode.SelectNodes("Property"))
						_lexing_Properties.Add(el.GetAttribute("Name"), el.GetAttribute("Value"));
				}

				foreach (XmlElement el in lexerNode.SelectNodes("Keywords"))
					_lexing_Keywords.Add(new KeyWordConfig(getInt(el.GetAttribute("List")).Value, el.InnerText.Trim(), getBool(el.GetAttribute("Inherit"))));

			}
			lexerNode = null;

			XmlElement lineWrapNode = langNode.SelectSingleNode("LineWrap") as XmlElement;
			if (lineWrapNode != null)
			{
				try
				{
					_lineWrap_LayoutCache = (LineCache)Enum.Parse(typeof(LineCache), lineWrapNode.GetAttribute("LayoutCache"), true);
				}
				catch (ArgumentException) { }

				try
				{
					_lineWrap_Mode = (WrapMode)Enum.Parse(typeof(WrapMode), lineWrapNode.GetAttribute("Mode"), true);
				}
				catch (ArgumentException) { }

				_lineWrap_PositionCacheSize = getInt(lineWrapNode.GetAttribute("PositionCacheSize"));
				_lineWrap_StartIndent = getInt(lineWrapNode.GetAttribute("StartIndent"));

				string flags = lineWrapNode.GetAttribute("VisualFlags").Trim();
				if (flags != string.Empty)
				{
					WrapVisualFlag? wvf = null;
					foreach (string flag in flags.Split(' '))
						wvf |= (WrapVisualFlag)Enum.Parse(typeof(WrapVisualFlag), flag.Trim(), true);

					if (wvf.HasValue)
						_lineWrap_VisualFlags = wvf;
				}

				try
				{
					_lineWrap_VisualFlagsLocation = (WrapVisualLocation)Enum.Parse(typeof(WrapVisualLocation), lineWrapNode.GetAttribute("VisualFlagsLocation"), true);
				}
				catch (ArgumentException) { }
			}
			lineWrapNode = null;

			XmlElement longLinesNode = langNode.SelectSingleNode("LongLines") as XmlElement;
			if (longLinesNode != null)
			{
				_longLines_EdgeColor = getColor(longLinesNode.GetAttribute("EdgeColor"));
				_longLines_EdgeColumn = getInt(longLinesNode.GetAttribute("EdgeColumn"));
				try
				{
					_longLines_EdgeMode = (EdgeMode)Enum.Parse(typeof(EdgeMode), longLinesNode.GetAttribute("EdgeMode"), true);
				}
				catch (ArgumentException) { }
			}
			longLinesNode = null;

			_margin_List = new MarginConfigList();
			XmlElement marginNode = langNode.SelectSingleNode("Margins") as XmlElement;
			if (marginNode != null)
			{
				_margin_List.FoldMarginColor = getColor(marginNode.GetAttribute("FoldMarginColor"));
				_margin_List.FoldMarginHighlightColor = getColor(marginNode.GetAttribute("FoldMarginHighlightColor"));
				_margin_List.Left = getInt(marginNode.GetAttribute("Left"));
				_margin_List.Right = getInt(marginNode.GetAttribute("Right"));
				_margin_List.Inherit = getBool(marginNode.GetAttribute("Inherit"));

				foreach (XmlElement el in marginNode.SelectNodes("./Margin"))
				{
					MarginConfig mc = new MarginConfig();
					mc.Number = int.Parse(el.GetAttribute("Number"));
					mc.Inherit = getBool(el.GetAttribute("Inherit"));
					mc.AutoToggleMarkerNumber = getInt(el.GetAttribute("AutoToggleMarkerNumber"));
					mc.IsClickable = getBool(el.GetAttribute("IsClickable"));
					mc.IsFoldMargin = getBool(el.GetAttribute("IsFoldMargin"));
					mc.IsMarkerMargin = getBool(el.GetAttribute("IsMarkerMargin"));
					try
					{
						mc.Type = (MarginType)Enum.Parse(typeof(MarginType), el.GetAttribute("Type"), true);
					}
					catch (ArgumentException) { }

					mc.Width = getInt(el.GetAttribute("Width"));

					_margin_List.Add(mc);
				}
			}
			marginNode = null;

			XmlElement markersNode = langNode.SelectSingleNode("Markers") as XmlElement;
			_markers_List = new MarkersConfigList();
			if (markersNode != null)
			{
				_markers_List.Inherit = getBool(markersNode.GetAttribute("Inherit"));

				foreach (XmlElement el in markersNode.SelectNodes("Marker"))
				{
					MarkersConfig mc = new MarkersConfig();
					mc.Alpha = getInt(el.GetAttribute("Alpha"));
					mc.BackColor = getColor(el.GetAttribute("BackColor"));
					mc.ForeColor = getColor(el.GetAttribute("ForeColor"));
					mc.Name = getString(el.GetAttributeNode("Name"));
					mc.Number = getInt(el.GetAttribute("Number"));
					mc.Inherit = getBool(el.GetAttribute("Inherit"));
					try
					{
						mc.Symbol = (MarkerSymbol)Enum.Parse(typeof(MarkerSymbol), el.GetAttribute("Symbol"), true);
					}
					catch (ArgumentException) { }
					_markers_List.Add(mc);
				}
			}

			XmlElement scrollingNode = langNode.SelectSingleNode("Scrolling") as XmlElement;
			if (scrollingNode != null)
			{
				_scrolling_EndAtLastLine = getBool(scrollingNode.GetAttribute("EndAtLastLine"));
				_scrolling_HorizontalWidth = getInt(scrollingNode.GetAttribute("HorizontalWidth"));

				string flags = scrollingNode.GetAttribute("ScrollBars").Trim();
				if (flags != string.Empty)
				{
					ScrollBars? sb = null;
					foreach (string flag in flags.Split(' '))
						sb |= (ScrollBars)Enum.Parse(typeof(ScrollBars), flag.Trim(), true);

					if (sb.HasValue)
						_scrolling_ScrollBars = sb;
				}

				_scrolling_XOffset = getInt(scrollingNode.GetAttribute("XOffset"));
			}
			scrollingNode = null;


			XmlElement selectionNode = langNode.SelectSingleNode("Selection") as XmlElement;
			if (selectionNode != null)
			{
				_selection_BackColor = getColor(selectionNode.GetAttribute("BackColor"));
				_selection_BackColorUnfocused = getColor(selectionNode.GetAttribute("BackColorUnfocused"));
				_selection_ForeColor = getColor(selectionNode.GetAttribute("ForeColor"));
				_selection_ForeColorUnfocused = getColor(selectionNode.GetAttribute("ForeColorUnfocused"));
				_selection_Hidden = getBool(selectionNode.GetAttribute("Hidden"));
				_selection_HideSelection = getBool(selectionNode.GetAttribute("HideSelection"));
				try
				{
					_selection_Mode = (SelectionMode)Enum.Parse(typeof(SelectionMode), selectionNode.GetAttribute("Mode"), true);
				}
				catch (ArgumentException) { }
			}
			selectionNode = null;

			_styles = new StyleConfigList();
			XmlElement stylesNode = langNode.SelectSingleNode("Styles") as XmlElement;
			if (stylesNode != null)
			{
				_styles.Bits = getInt(stylesNode.GetAttribute("Bits"));
				foreach (XmlElement el in stylesNode.SelectNodes("Style"))
				{
					StyleConfig sc = new StyleConfig();
					sc.Name = el.GetAttribute("Name");
					sc.Number = getInt(el.GetAttribute("Number"));
					sc.BackColor = getColor(el.GetAttribute("BackColor"));
					sc.Bold = getBool(el.GetAttribute("Bold"));
					try
					{
						sc.Case = (StyleCase)Enum.Parse(typeof(StyleCase), el.GetAttribute("Case"), true);
					}
					catch (ArgumentException) { }

					try
					{
						sc.CharacterSet = (CharacterSet)Enum.Parse(typeof(CharacterSet), el.GetAttribute("CharacterSet"), true);
					}
					catch (ArgumentException) { }

					sc.FontName = getString(el.GetAttributeNode("FontName"));
					sc.ForeColor = getColor(el.GetAttribute("ForeColor"));
					sc.IsChangeable = getBool(el.GetAttribute("IsChangeable"));
					sc.IsHotspot = getBool(el.GetAttribute("IsHotspot"));
					sc.IsSelectionEolFilled = getBool(el.GetAttribute("IsSelectionEolFilled"));
					sc.IsVisible = getBool(el.GetAttribute("IsVisible"));
					sc.Italic = getBool(el.GetAttribute("Italic"));
					sc.Size = getInt(el.GetAttribute("Size"));
					sc.Underline = getBool(el.GetAttribute("Underline"));
					sc.Inherit = getBool(el.GetAttribute("Inherit"));
					
					_styles.Add(sc);
				}

				//	This is a nifty added on hack made specifically for HTML.
				//	Normally the style config elements are quite managable as there
				//	are typically less than 10 when you don't count common styles.
				//	
				//	However HTML uses 9 different Sub languages that combined make 
				//	use of all 128 styles (well there are some small gaps). In order
				//	to make this more managable I did added a SubLanguage element that
				//	basically just prepends the Language's name and "." to the Style 
				//	Name definition.
				//
				//	So for example if you had the following
				//	<Styles>
				//		<SubLanguage Name="ASP JavaScript">
				//			<Style Name="Keyword" Bold="True" />
				//		</SubLanguage>
				//	</Styles>
				//	That style's name will get interpreted as "ASP JavaScript.Keyword".
				//	which if you look at the html.txt in LexerStyleNames you'll see it
				//	maps to Style # 62

				//	Yeah I copied and pasted from above. I know. Feel free to refactor
				//	this and check it in since you're so high and mighty.
				foreach (XmlElement subLanguage in stylesNode.SelectNodes("SubLanguage"))
				{
					string subLanguageName = subLanguage.GetAttribute("Name");
					foreach (XmlElement el in subLanguage.SelectNodes("Style"))
					{
						StyleConfig sc = new StyleConfig();
						sc.Name = subLanguageName + "." + el.GetAttribute("Name");
						sc.Number = getInt(el.GetAttribute("Number"));
						sc.BackColor = getColor(el.GetAttribute("BackColor"));
						sc.Bold = getBool(el.GetAttribute("Bold"));
						try
						{
							sc.Case = (StyleCase)Enum.Parse(typeof(StyleCase), el.GetAttribute("Case"), true);
						}
						catch (ArgumentException) { }

						try
						{
							sc.CharacterSet = (CharacterSet)Enum.Parse(typeof(CharacterSet), el.GetAttribute("CharacterSet"), true);
						}
						catch (ArgumentException) { }

						sc.FontName = getString(el.GetAttributeNode("FontName"));
						sc.ForeColor = getColor(el.GetAttribute("ForeColor"));
						sc.IsChangeable = getBool(el.GetAttribute("IsChangeable"));
						sc.IsHotspot = getBool(el.GetAttribute("IsHotspot"));
						sc.IsSelectionEolFilled = getBool(el.GetAttribute("IsSelectionEolFilled"));
						sc.IsVisible = getBool(el.GetAttribute("IsVisible"));
						sc.Italic = getBool(el.GetAttribute("Italic"));
						sc.Size = getInt(el.GetAttribute("Size"));
						sc.Underline = getBool(el.GetAttribute("Underline"));
						sc.Inherit = getBool(el.GetAttribute("Inherit"));

						_styles.Add(sc);
					}
				}
			}
			stylesNode = null;

			XmlElement undoRedoNode = langNode.SelectSingleNode("UndoRedo") as XmlElement;
			if (undoRedoNode != null)
			{
				_undoRedoIsUndoEnabled = getBool(undoRedoNode.GetAttribute("IsUndoEnabled"));
			}
			undoRedoNode = null;


			XmlElement whiteSpaceNode = langNode.SelectSingleNode("WhiteSpace") as XmlElement;
			if (whiteSpaceNode != null)
			{
				_whiteSpace_BackColor = getColor(whiteSpaceNode.GetAttribute("BackColor"));
				_whiteSpace_ForeColor = getColor(whiteSpaceNode.GetAttribute("ForeColor"));
				_whiteSpace_Mode = (WhiteSpaceMode)Enum.Parse(typeof(WhiteSpaceMode), whiteSpaceNode.GetAttribute("Mode"), true);
				_whiteSpace_UseWhiteSpaceBackColor = getBool(whiteSpaceNode.GetAttribute("UseWhiteSpaceBackColor"));
				_whiteSpace_UseWhiteSpaceForeColor = getBool(whiteSpaceNode.GetAttribute("UseWhiteSpaceForeColor"));
			}
			whiteSpaceNode = null;

			configDocument = null;
		}
示例#3
0
        public void Load(XmlDocument configDocument)
        {
            var langNode = configDocument.DocumentElement.SelectSingleNode("./Language[@Name='" + this._language + "']") as XmlElement;
            if (langNode == null)
                return;

            var autoCNode = langNode.SelectSingleNode("AutoComplete") as XmlElement;
            if (autoCNode != null)
            {
                this._autoComplete_AutoHide = this.getBool(autoCNode.GetAttribute("AutoHide"));
                this._autoComplete_AutomaticLengthEntered = this.getBool(autoCNode.GetAttribute("AutomaticLengthEntered"));
                this._autoComplete_cancelAtStart = this.getBool(autoCNode.GetAttribute("CancelAtStart"));
                this._autoComplete_DropRestOfWord = this.getBool(autoCNode.GetAttribute("DropRestOfWord"));
                this._autoComplete_fillUpCharacters = this.getString(autoCNode.GetAttributeNode("FillUpCharacters"));
                this._autoComplete_ImageSeperator = this.getChar(autoCNode.GetAttribute("AutomaticLengthEntered"));
                this._autoComplete_IsCaseSensitive = this.getBool(autoCNode.GetAttribute("IsCaseSensitive"));
                this._autoComplete_ListSeperator = this.getChar(autoCNode.GetAttribute("ListSeperator"));
                this._autoComplete_MaxHeight = this.getInt(autoCNode.GetAttribute("MaxHeight"));
                this._autoComplete_MaxWidth = this.getInt(autoCNode.GetAttribute("MaxWidth"));
                this._autoComplete_singleLineAccept = this.getBool(autoCNode.GetAttribute("SingleLineAccept"));
                this._autoComplete_StopCharacters = this.getString(autoCNode.GetAttributeNode("StopCharacters"));

                var listNode = autoCNode.SelectSingleNode("./List") as XmlElement;
                if (listNode != null)
                {
                    this._autoComplete_ListInherit = this.getBool(listNode.GetAttribute("Inherit"));
                    this._autoComplete_List = new Regex("\\s+").Replace(listNode.InnerText, " ").Trim();

                }
            }
            autoCNode = null;

            var callTipNode = langNode.SelectSingleNode("CallTip") as XmlElement;
            if (callTipNode != null)
            {
                this._callTip_BackColor = this.getColor(callTipNode.GetAttribute("BackColor"));
                this._callTip_ForeColor = this.getColor(callTipNode.GetAttribute("ForeColor"));
                this._callTip_HighlightTextColor = this.getColor(callTipNode.GetAttribute("HighlightTextColor"));
            }
            callTipNode = null;

            var caretNode = langNode.SelectSingleNode("Caret") as XmlElement;
            if (caretNode != null)
            {
                //	This guy is a bit of an oddball becuase null means "I don't Care"
                //	and we need some way of using the OS value.
                string blinkRate = caretNode.GetAttribute("BlinkRate");
                if (blinkRate.ToLower() == "system")
                    this._caret_BlinkRate = SystemInformation.CaretBlinkTime;
                else
                    this._caret_BlinkRate = this.getInt(blinkRate);

                this._caret_Color = this.getColor(caretNode.GetAttribute("Color"));
                this._caret_CurrentLineBackgroundAlpha = this.getInt(caretNode.GetAttribute("CurrentLineBackgroundAlpha"));
                this._caret_CurrentLineBackgroundColor = this.getColor(caretNode.GetAttribute("CurrentLineBackgroundColor"));
                this._caret_HighlightCurrentLine = this.getBool(caretNode.GetAttribute("HighlightCurrentLine"));
                this._caret_IsSticky = this.getBool(caretNode.GetAttribute("IsSticky"));
                try
                {
                    this._caret_Style = (CaretStyle)Enum.Parse(typeof(CaretStyle), caretNode.GetAttribute("Style"), true);
                }
                catch (ArgumentException) { }
                this._caret_Width = this.getInt(caretNode.GetAttribute("Width"));
            }
            caretNode = null;

            var clipboardNode = langNode.SelectSingleNode("Clipboard") as XmlElement;
            if (clipboardNode != null)
            {
                this._clipboard_ConvertLineBreaksOnPaste = this.getBool(clipboardNode.GetAttribute("ConvertLineBreaksOnPaste"));
            }
            clipboardNode = null;

            this._commands_KeyBindingList = new CommandBindingConfigList();
            var commandsNode = langNode.SelectSingleNode("Commands") as XmlElement;
            if (commandsNode != null)
            {
                this._commands_KeyBindingList.Inherit = this.getBool(commandsNode.GetAttribute("Inherit"));
                this._commands_KeyBindingList.AllowDuplicateBindings = this.getBool(commandsNode.GetAttribute("AllowDuplicateBindings"));
                foreach (XmlElement el in commandsNode.SelectNodes("./Binding"))
                {
                    var kb = new KeyBinding
                    {
                        KeyCode = Utilities.GetKeys(el.GetAttribute("Key"))
                    };

                    string modifiers = el.GetAttribute("Modifier");
                    if (modifiers != string.Empty)
                    {
                        foreach (string modifier in modifiers.Split(' '))
                            kb.Modifiers |= (Keys)Enum.Parse(typeof(Keys), modifier.Trim(), true);
                    }

                    var cmd = (BindableCommand)Enum.Parse(typeof(BindableCommand), el.GetAttribute("Command"), true);
                    var cfg = new CommandBindingConfig(kb, this.getBool(el.GetAttribute("ReplaceCurrent")), cmd);
                    this._commands_KeyBindingList.Add(cfg);
                }
            }
            commandsNode = null;

            var endOfLineNode = langNode.SelectSingleNode("EndOfLine") as XmlElement;
            if (endOfLineNode != null)
            {
                this._endOfLine_IsVisisble = this.getBool(endOfLineNode.GetAttribute("IsVisible"));

                try
                {
                    this._endOfLine_Mode = (EndOfLineMode)Enum.Parse(typeof(EndOfLineMode), endOfLineNode.GetAttribute("Mode"), true);
                }
                catch (ArgumentException) { }
            }
            endOfLineNode = null;

            var foldingNode = langNode.SelectSingleNode("Folding") as XmlElement;
            if (foldingNode != null)
            {
                string flags = foldingNode.GetAttribute("Flags").Trim();
                if (flags != string.Empty)
                {
                    FoldFlag? ff = flags.Split(' ').Aggregate<string, FoldFlag?>(null,
                        (current, flag) => current | (FoldFlag)Enum.Parse(typeof(FoldFlag), flag.Trim(), true));

                    if (ff.HasValue)
                        this._folding_Flags = ff;
                }

                this._folding_IsEnabled = this.getBool(foldingNode.GetAttribute("IsEnabled"));
                try
                {
                    this._folding_MarkerScheme = (FoldMarkerScheme)Enum.Parse(typeof(FoldMarkerScheme), foldingNode.GetAttribute("MarkerScheme"), true);
                }
                catch (ArgumentException) { }

                this._folding_UseCompactFolding = this.getBool(foldingNode.GetAttribute("UseCompactFolding"));
            }
            foldingNode = null;

            var hotSpotNode = langNode.SelectSingleNode("Hotspot") as XmlElement;
            if (hotSpotNode != null)
            {
                this._hotspot_ActiveBackColor = this.getColor(hotSpotNode.GetAttribute("ActiveBackColor"));
                this._hotspot_ActiveForeColor = this.getColor(hotSpotNode.GetAttribute("ActiveForeColor"));
                this._hotspot_ActiveUnderline = this.getBool(hotSpotNode.GetAttribute("ActiveUnderline"));
                this._hotspot_SingleLine = this.getBool(hotSpotNode.GetAttribute("SingleLine"));
                this._hotspot_UseActiveBackColor = this.getBool(hotSpotNode.GetAttribute("UseActiveBackColor"));
                this._hotspot_UseActiveForeColor = this.getBool(hotSpotNode.GetAttribute("UseActiveForeColor"));
            }
            hotSpotNode = null;

            var indentationNode = langNode.SelectSingleNode("Indentation") as XmlElement;
            if (indentationNode != null)
            {
                this._indentation_BackspaceUnindents = this.getBool(indentationNode.GetAttribute("BackspaceUnindents"));
                this._indentation_IndentWidth = this.getInt(indentationNode.GetAttribute("IndentWidth"));
                this._indentation_ShowGuides = this.getBool(indentationNode.GetAttribute("ShowGuides"));
                this._indentation_TabIndents = this.getBool(indentationNode.GetAttribute("TabIndents"));
                this._indentation_TabWidth = this.getInt(indentationNode.GetAttribute("TabWidth"));
                this._indentation_UseTabs = this.getBool(indentationNode.GetAttribute("UseTabs"));

                try
                {
                    this._indentation_SmartIndentType = (SmartIndent)Enum.Parse(typeof(SmartIndent), indentationNode.GetAttribute("SmartIndentType"), true);
                }
                catch (ArgumentException) { }

            }
            indentationNode = null;

            var indicatorNode = langNode.SelectSingleNode("Indicators") as XmlElement;
            if (indicatorNode != null)
            {
                this._indicator_List.Inherit = this.getBool(indicatorNode.GetAttribute("Inherit"));
                foreach (XmlElement el in indicatorNode.SelectNodes("Indicator"))
                {
                    var ic = new IndicatorConfig
                    {
                        Number = int.Parse(el.GetAttribute("Number")),
                        Color = this.getColor(el.GetAttribute("Color")),
                        Inherit = this.getBool(el.GetAttribute("Inherit")),
                        IsDrawnUnder = this.getBool(el.GetAttribute("IsDrawnUnder"))
                    };
                    try
                    {
                        ic.Style = (IndicatorStyle)Enum.Parse(typeof(IndicatorStyle), el.GetAttribute("Style"), true);
                    }
                    catch (ArgumentException) { }

                    this._indicator_List.Add(ic);
                }
            }

            this._lexing_Properties = new LexerPropertiesConfig();
            this._lexing_Keywords = new KeyWordConfigList();
            var lexerNode = langNode.SelectSingleNode("Lexer") as XmlElement;
            if (lexerNode != null)
            {
                this._lexing_WhitespaceChars = this.getString(lexerNode.GetAttributeNode("WhitespaceChars"));
                this._lexing_WordChars = this.getString(lexerNode.GetAttributeNode("WordChars"));
                this._lexing_Language = this.getString(lexerNode.GetAttributeNode("LexerName"));
                this._lexing_LineCommentPrefix = this.getString(lexerNode.GetAttributeNode("LineCommentPrefix"));
                this._lexing_StreamCommentPrefix = this.getString(lexerNode.GetAttributeNode("StreamCommentPrefix"));
                this._lexing_StreamCommentSuffix = this.getString(lexerNode.GetAttributeNode("StreamCommentSuffix"));

                var propNode = lexerNode.SelectSingleNode("Properties") as XmlElement;
                if (propNode != null)
                {
                    this._lexing_Properties.Inherit = this.getBool(propNode.GetAttribute("Inherit"));

                    foreach (XmlElement el in propNode.SelectNodes("Property"))
                        this._lexing_Properties.Add(el.GetAttribute("Name"), el.GetAttribute("Value"));
                }

                foreach (XmlElement el in lexerNode.SelectNodes("Keywords"))
                    this._lexing_Keywords.Add(new KeyWordConfig(this.getInt(el.GetAttribute("List")).Value, el.InnerText.Trim(), this.getBool(el.GetAttribute("Inherit"))));

            }
            lexerNode = null;

            var lineWrapNode = langNode.SelectSingleNode("LineWrapping") as XmlElement;
            if (lineWrapNode != null)
            {
                try
                {
                    this._lineWrapping_Mode = (LineWrappingMode)Enum.Parse(typeof(LineWrappingMode), lineWrapNode.GetAttribute("Mode"), true);
                }
                catch (ArgumentException) { }

                this._lineWrapping_IndentSize = this.getInt(lineWrapNode.GetAttribute("IndentSize"));

                try
                {
                    this._lineWrapping_IndentMode = (LineWrappingIndentMode)Enum.Parse(typeof(LineWrappingIndentMode), lineWrapNode.GetAttribute("IndentMode"), true);
                }
                catch (ArgumentException) { }

                string flags = lineWrapNode.GetAttribute("VisualFlags").Trim();
                if (flags != string.Empty)
                {
                    LineWrappingVisualFlags? wvf = null;
                    foreach (string flag in flags.Split(' '))
                        wvf |= (LineWrappingVisualFlags)Enum.Parse(typeof(LineWrappingVisualFlags), flag.Trim(), true);

                    if (wvf.HasValue)
                        this._lineWrapping_VisualFlags = wvf;
                }

                try
                {
                    this._lineWrapping_VisualFlagsLocations = (LineWrappingVisualFlagsLocations)Enum.Parse(typeof(LineWrappingVisualFlagsLocations), lineWrapNode.GetAttribute("VisualFlagsLocations"), true);
                }
                catch (ArgumentException) { }
            }
            lineWrapNode = null;

            var longLinesNode = langNode.SelectSingleNode("LongLines") as XmlElement;
            if (longLinesNode != null)
            {
                this._longLines_EdgeColor = this.getColor(longLinesNode.GetAttribute("EdgeColor"));
                this._longLines_EdgeColumn = this.getInt(longLinesNode.GetAttribute("EdgeColumn"));
                try
                {
                    this._longLines_EdgeMode = (EdgeMode)Enum.Parse(typeof(EdgeMode), longLinesNode.GetAttribute("EdgeMode"), true);
                }
                catch (ArgumentException) { }
            }
            longLinesNode = null;

            this._margin_List = new MarginConfigList();
            var marginNode = langNode.SelectSingleNode("Margins") as XmlElement;
            if (marginNode != null)
            {
                this._margin_List.FoldMarginColor = this.getColor(marginNode.GetAttribute("FoldMarginColor"));
                this._margin_List.FoldMarginHighlightColor = this.getColor(marginNode.GetAttribute("FoldMarginHighlightColor"));
                this._margin_List.Left = this.getInt(marginNode.GetAttribute("Left"));
                this._margin_List.Right = this.getInt(marginNode.GetAttribute("Right"));
                this._margin_List.Inherit = this.getBool(marginNode.GetAttribute("Inherit"));

                foreach (XmlElement el in marginNode.SelectNodes("./Margin"))
                {
                    var mc = new MarginConfig
                    {
                        Number = int.Parse(el.GetAttribute("Number")),
                        Inherit = this.getBool(el.GetAttribute("Inherit")),
                        AutoToggleMarkerNumber = this.getInt(el.GetAttribute("AutoToggleMarkerNumber")),
                        IsClickable = this.getBool(el.GetAttribute("IsClickable")),
                        IsFoldMargin = this.getBool(el.GetAttribute("IsFoldMargin")),
                        IsMarkerMargin = this.getBool(el.GetAttribute("IsMarkerMargin"))
                    };
                    try
                    {
                        mc.Type = (MarginType)Enum.Parse(typeof(MarginType), el.GetAttribute("Type"), true);
                    }
                    catch (ArgumentException) { }

                    mc.Width = this.getInt(el.GetAttribute("Width"));

                    this._margin_List.Add(mc);
                }
            }
            marginNode = null;

            var markersNode = langNode.SelectSingleNode("Markers") as XmlElement;
            this._markers_List = new MarkersConfigList();
            if (markersNode != null)
            {
                this._markers_List.Inherit = this.getBool(markersNode.GetAttribute("Inherit"));

                foreach (XmlElement el in markersNode.SelectNodes("Marker"))
                {
                    var mc = new MarkersConfig
                    {
                        Alpha = this.getInt(el.GetAttribute("Alpha")),
                        BackColor = this.getColor(el.GetAttribute("BackColor")),
                        ForeColor = this.getColor(el.GetAttribute("ForeColor")),
                        Name = this.getString(el.GetAttributeNode("Name")),
                        Number = this.getInt(el.GetAttribute("Number")),
                        Inherit = this.getBool(el.GetAttribute("Inherit"))
                    };
                    try
                    {
                        mc.Symbol = (MarkerSymbol)Enum.Parse(typeof(MarkerSymbol), el.GetAttribute("Symbol"), true);
                    }
                    catch (ArgumentException) { }
                    this._markers_List.Add(mc);
                }
            }

            var scrollingNode = langNode.SelectSingleNode("Scrolling") as XmlElement;
            if (scrollingNode != null)
            {
                this._scrolling_EndAtLastLine = this.getBool(scrollingNode.GetAttribute("EndAtLastLine"));
                this._scrolling_HorizontalWidth = this.getInt(scrollingNode.GetAttribute("HorizontalWidth"));

                string flags = scrollingNode.GetAttribute("ScrollBars").Trim();
                if (flags != string.Empty)
                {
                    ScrollBars? sb = null;
                    foreach (string flag in flags.Split(' '))
                        sb |= (ScrollBars)Enum.Parse(typeof(ScrollBars), flag.Trim(), true);

                    if (sb.HasValue)
                        this._scrolling_ScrollBars = sb;
                }

                this._scrolling_XOffset = this.getInt(scrollingNode.GetAttribute("XOffset"));
            }
            scrollingNode = null;

            var selectionNode = langNode.SelectSingleNode("Selection") as XmlElement;
            if (selectionNode != null)
            {
                this._selection_BackColor = this.getColor(selectionNode.GetAttribute("BackColor"));
                this._selection_BackColorUnfocused = this.getColor(selectionNode.GetAttribute("BackColorUnfocused"));
                this._selection_ForeColor = this.getColor(selectionNode.GetAttribute("ForeColor"));
                this._selection_ForeColorUnfocused = this.getColor(selectionNode.GetAttribute("ForeColorUnfocused"));
                this._selection_Hidden = this.getBool(selectionNode.GetAttribute("Hidden"));
                this._selection_HideSelection = this.getBool(selectionNode.GetAttribute("HideSelection"));
                try
                {
                    this._selection_Mode = (SelectionMode)Enum.Parse(typeof(SelectionMode), selectionNode.GetAttribute("Mode"), true);
                }
                catch (ArgumentException) { }
            }
            selectionNode = null;

            this._snippetsConfigList = new SnippetsConfigList();
            var snippetsNode = langNode.SelectSingleNode("Snippets") as XmlElement;
            if (snippetsNode != null)
            {
                this._snippetsConfigList.ActiveSnippetColor = this.getColor(snippetsNode.GetAttribute("ActiveSnippetColor"));
                this._snippetsConfigList.ActiveSnippetIndicator = this.getInt(snippetsNode.GetAttribute("ActiveSnippetIndicator"));
                this._snippetsConfigList.InactiveSnippetColor = this.getColor(snippetsNode.GetAttribute("InactiveSnippetColor"));
                this._snippetsConfigList.InactiveSnippetIndicator = this.getInt(snippetsNode.GetAttribute("InactiveSnippetIndicator"));

                try
                {
                    this._snippetsConfigList.ActiveSnippetIndicatorStyle = (IndicatorStyle)Enum.Parse(typeof(IndicatorStyle), snippetsNode.GetAttribute("ActiveSnippetIndicatorStyle"), true);
                }
                catch (ArgumentException) { }

                try
                {
                    this._snippetsConfigList.InactiveSnippetIndicatorStyle = (IndicatorStyle)Enum.Parse(typeof(IndicatorStyle), snippetsNode.GetAttribute("InactiveSnippetIndicatorStyle"), true);
                }
                catch (ArgumentException) { }

                this._snippetsConfigList.DefaultDelimeter = this.getChar(snippetsNode.GetAttribute("DefaultDelimeter"));
                this._snippetsConfigList.IsEnabled = this.getBool(snippetsNode.GetAttribute("IsEnabled"));
                this._snippetsConfigList.IsOneKeySelectionEmbedEnabled = this.getBool(snippetsNode.GetAttribute("IsOneKeySelectionEmbedEnabled"));

                foreach (XmlElement el in snippetsNode.SelectNodes("Snippet"))
                {
                    var sc = new SnippetsConfig
                    {
                        Shortcut = el.GetAttribute("Shortcut"),
                        Code = el.InnerText,
                        Delimeter = this.getChar(el.GetAttribute("Delimeter")),
                        IsSurroundsWith = this.getBool(el.GetAttribute("IsSurroundsWith"))
                    };
                    this._snippetsConfigList.Add(sc);
                }
            }
            snippetsNode = null;

            this._styles = new StyleConfigList();
            var stylesNode = langNode.SelectSingleNode("Styles") as XmlElement;
            if (stylesNode != null)
            {
                this._styles.Bits = this.getInt(stylesNode.GetAttribute("Bits"));
                foreach (XmlElement el in stylesNode.SelectNodes("Style"))
                {
                    var sc = new StyleConfig
                    {
                        Name = el.GetAttribute("Name"),
                        Number = this.getInt(el.GetAttribute("Number")),
                        BackColor = this.getColor(el.GetAttribute("BackColor")),
                        Bold = this.getBool(el.GetAttribute("Bold"))
                    };
                    try
                    {
                        sc.Case = (StyleCase)Enum.Parse(typeof(StyleCase), el.GetAttribute("Case"), true);
                    }
                    catch (ArgumentException) { }

                    try
                    {
                        sc.CharacterSet = (CharacterSet)Enum.Parse(typeof(CharacterSet), el.GetAttribute("CharacterSet"), true);
                    }
                    catch (ArgumentException) { }

                    sc.FontName = this.getString(el.GetAttributeNode("FontName"));
                    sc.ForeColor = this.getColor(el.GetAttribute("ForeColor"));
                    sc.IsChangeable = this.getBool(el.GetAttribute("IsChangeable"));
                    sc.IsHotspot = this.getBool(el.GetAttribute("IsHotspot"));
                    sc.IsSelectionEolFilled = this.getBool(el.GetAttribute("IsSelectionEolFilled"));
                    sc.IsVisible = this.getBool(el.GetAttribute("IsVisible"));
                    sc.Italic = this.getBool(el.GetAttribute("Italic"));
                    sc.Size = this.getInt(el.GetAttribute("Size"));
                    sc.Underline = this.getBool(el.GetAttribute("Underline"));
                    sc.Inherit = this.getBool(el.GetAttribute("Inherit"));

                    this._styles.Add(sc);
                }

                //	This is a nifty added on hack made specifically for HTML.
                //	Normally the style config elements are quite managable as there
                //	are typically less than 10 when you don't count common styles.
                //
                //	However HTML uses 9 different Sub languages that combined make
                //	use of all 128 styles (well there are some small gaps). In order
                //	to make this more managable I did added a SubLanguage element that
                //	basically just prepends the Language's name and "." to the Style
                //	Name definition.
                //
                //	So for example if you had the following
                //	<Styles>
                //		<SubLanguage Name="ASP JavaScript">
                //			<Style Name="Keyword" Bold="True" />
                //		</SubLanguage>
                //	</Styles>
                //	That style's name will get interpreted as "ASP JavaScript.Keyword".
                //	which if you look at the html.txt in LexerStyleNames you'll see it
                //	maps to Style # 62

                //	Yeah I copied and pasted from above. I know. Feel free to refactor
                //	this and check it in since you're so high and mighty.
                foreach (XmlElement subLanguage in stylesNode.SelectNodes("SubLanguage"))
                {
                    string subLanguageName = subLanguage.GetAttribute("Name");
                    foreach (XmlElement el in subLanguage.SelectNodes("Style"))
                    {
                        var sc = new StyleConfig
                        {
                            Name = subLanguageName + "." + el.GetAttribute("Name"),
                            Number = this.getInt(el.GetAttribute("Number")),
                            BackColor = this.getColor(el.GetAttribute("BackColor")),
                            Bold = this.getBool(el.GetAttribute("Bold"))
                        };
                        try
                        {
                            sc.Case = (StyleCase)Enum.Parse(typeof(StyleCase), el.GetAttribute("Case"), true);
                        }
                        catch (ArgumentException) { }

                        try
                        {
                            sc.CharacterSet = (CharacterSet)Enum.Parse(typeof(CharacterSet), el.GetAttribute("CharacterSet"), true);
                        }
                        catch (ArgumentException) { }

                        sc.FontName = this.getString(el.GetAttributeNode("FontName"));
                        sc.ForeColor = this.getColor(el.GetAttribute("ForeColor"));
                        sc.IsChangeable = this.getBool(el.GetAttribute("IsChangeable"));
                        sc.IsHotspot = this.getBool(el.GetAttribute("IsHotspot"));
                        sc.IsSelectionEolFilled = this.getBool(el.GetAttribute("IsSelectionEolFilled"));
                        sc.IsVisible = this.getBool(el.GetAttribute("IsVisible"));
                        sc.Italic = this.getBool(el.GetAttribute("Italic"));
                        sc.Size = this.getInt(el.GetAttribute("Size"));
                        sc.Underline = this.getBool(el.GetAttribute("Underline"));
                        sc.Inherit = this.getBool(el.GetAttribute("Inherit"));

                        this._styles.Add(sc);
                    }
                }
            }
            stylesNode = null;

            var undoRedoNode = langNode.SelectSingleNode("UndoRedo") as XmlElement;
            if (undoRedoNode != null)
            {
                this._undoRedoIsUndoEnabled = this.getBool(undoRedoNode.GetAttribute("IsUndoEnabled"));
            }
            undoRedoNode = null;

            var whitespaceNode = langNode.SelectSingleNode("Whitespace") as XmlElement;
            if (whitespaceNode != null)
            {
                this._whitespace_BackColor = this.getColor(whitespaceNode.GetAttribute("BackColor"));
                this._whitespace_ForeColor = this.getColor(whitespaceNode.GetAttribute("ForeColor"));
                this._whitespace_Mode = (WhitespaceMode)Enum.Parse(typeof(WhitespaceMode), whitespaceNode.GetAttribute("Mode"), true);
            }
            whitespaceNode = null;

            configDocument = null;
        }