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;
        }
        private StyleConfig getStyleConfigFromElement(XmlReader reader)
        {
            var sc = new StyleConfig();
            if (reader.HasAttributes)
            {
                while (reader.MoveToNextAttribute())
                {
                    string attrName = reader.Name.ToLower();
                    switch (attrName)
                    {
                        case "name":
                            sc.Name = reader.Value;
                            break;
                        case "number":
                            sc.Number = this.getInt(reader.Value);
                            break;
                        case "backcolor":
                            sc.BackColor = this.getColor(reader.Value);
                            break;
                        case "bold":
                            sc.Bold = this.getBool(reader.Value);
                            break;
                        case "case":
                            sc.Case = (StyleCase)Enum.Parse(typeof(StyleCase), reader.Value, true);
                            break;
                        case "characterset":
                            sc.CharacterSet = (CharacterSet)Enum.Parse(typeof(CharacterSet), reader.Value, true);
                            break;
                        case "fontname":
                            sc.FontName = reader.Value;
                            break;
                        case "forecolor":
                            sc.ForeColor = this.getColor(reader.Value);
                            break;
                        case "ischangeable":
                            sc.IsChangeable = this.getBool(reader.Value);
                            break;
                        case "ishotspot":
                            sc.IsHotspot = this.getBool(reader.Value);
                            break;
                        case "isselectioneolfilled":
                            sc.IsSelectionEolFilled = this.getBool(reader.Value);
                            break;
                        case "isvisible":
                            sc.IsVisible = this.getBool(reader.Value);
                            break;
                        case "italic":
                            sc.Italic = this.getBool(reader.Value);
                            break;
                        case "size":
                            sc.Size = this.getInt(reader.Value);
                            break;
                        case "underline":
                            sc.Underline = this.getBool(reader.Value);
                            break;
                        case "inherit":
                            sc.Inherit = this.getBool(reader.Value);
                            break;
                    }
                }
                reader.MoveToElement();
            }

            return sc;
        }
        internal void Configure(List<Configuration> configList)
        {
            //	So here is the general pattern: We go through each of
            //	the configurations in the list (which has been ordered
            //	by terrain). If the configuration has a value we're
            //	looking for it overwrites whatever was before it.
            //	In the _end if the value isn't null, we set the
            //	corresponding Scintilla Value to this.
            bool? b = null;
            int? i = null;
            Color co = Color.Empty;
            char? ch = null;
            string s = null;

            foreach (Configuration c in configList)
            {
                if (c.AutoComplete_AutoHide.HasValue)
                    b = c.AutoComplete_AutoHide;
            }
            if (b.HasValue)
                Scintilla.AutoComplete.AutoHide = b.Value;

            b = null;
            foreach (Configuration c in configList)
            {
                if (c.AutoComplete_AutomaticLengthEntered.HasValue)
                    b = c.AutoComplete_AutomaticLengthEntered;
            }
            if (b.HasValue)
                Scintilla.AutoComplete.AutomaticLengthEntered = b.Value;

            b = null;
            foreach (Configuration c in configList)
            {
                if (c.AutoComplete_CancelAtStart.HasValue)
                    b = c.AutoComplete_CancelAtStart;
            }
            if (b.HasValue)
                Scintilla.AutoComplete.CancelAtStart = b.Value;

            b = null;
            foreach (Configuration c in configList)
            {
                if (c.AutoComplete_DropRestOfWord.HasValue)
                    b = c.AutoComplete_DropRestOfWord;
            }
            if (b.HasValue)
                Scintilla.AutoComplete.DropRestOfWord = b.Value;

            s = null;
            foreach (Configuration c in configList)
            {
                if (c.AutoComplete_FillUpCharacters != null)
                    s = c.AutoComplete_FillUpCharacters;
            }
            if (s != null)
                Scintilla.AutoComplete.FillUpCharacters = s;

            ch = null;
            foreach (Configuration c in configList)
            {
                if (c.AutoComplete_ImageSeperator != null)
                    ch = c.AutoComplete_ImageSeperator;
            }
            if (ch != null)
                Scintilla.AutoComplete.ImageSeparator = ch.Value;

            b = null;
            foreach (Configuration c in configList)
            {
                if (c.AutoComplete_IsCaseSensitive.HasValue)
                    b = c.AutoComplete_IsCaseSensitive;

            }
            if (b.HasValue)
                Scintilla.AutoComplete.IsCaseSensitive = b.Value;

            ch = null;
            foreach (Configuration c in configList)
            {
                if (c.AutoComplete_ListSeperator.HasValue)
                    ch = c.AutoComplete_ListSeperator;

            }
            if (ch.HasValue)
                Scintilla.AutoComplete.ListSeparator = ch.Value;

            string seperator = Scintilla.AutoComplete.ListSeparator.ToString();
            s = null;
            foreach (Configuration c in configList)
            {
                //	Lists tend to have an extra config property of "inherits".
                //	It this flag set to false, the list is cleared before setting
                //	the current config's list. Otherwise the current config adds
                //	to the previous configs'.
                if (c.AutoComplete_List != null)
                {
                    if (!(c.AutoComplete_ListInherits.HasValue && !c.AutoComplete_ListInherits.Value) || string.IsNullOrEmpty(s))
                        s = c.AutoComplete_List;
                    else
                        s += seperator + c.AutoComplete_List;
                }
            }
            if (s != null)
                Scintilla.AutoComplete.ListString = s;

            i = null;
            foreach (Configuration c in configList)
            {
                if (c.AutoComplete_MaxHeight.HasValue)
                    i = c.AutoComplete_MaxHeight;

            }
            if (i.HasValue)
                Scintilla.AutoComplete.MaxHeight = i.Value;

            i = null;
            foreach (Configuration c in configList)
            {
                if (c.AutoComplete_MaxWidth.HasValue)
                    i = c.AutoComplete_MaxWidth;
            }
            if (i.HasValue)
                Scintilla.AutoComplete.MaxWidth = i.Value;

            b = null;
            foreach (Configuration c in configList)
            {
                if (c.AutoComplete_SingleLineAccept.HasValue)
                    b = c.AutoComplete_SingleLineAccept;

            }
            if (b.HasValue)
                Scintilla.AutoComplete.SingleLineAccept = b.Value;

            s = null;
            foreach (Configuration c in configList)
            {
                if (c.AutoComplete_StopCharacters != null)
                    s = c.AutoComplete_StopCharacters;
            }
            if (s != null)
                Scintilla.AutoComplete.StopCharacters = s;

            co = Color.Empty;
            foreach (Configuration c in configList)
            {
                if (c.CallTip_BackColor != Color.Empty)
                    co = c.CallTip_BackColor;

            }
            if (co != Color.Empty)
                Scintilla.CallTip.BackColor = co;

            co = Color.Empty;
            foreach (Configuration c in configList)
            {
                if (c.CallTip_ForeColor != Color.Empty)
                    co = c.CallTip_ForeColor;

            }
            if (co != Color.Empty)
                Scintilla.CallTip.ForeColor = co;

            co = Color.Empty;
            foreach (Configuration c in configList)
            {
                if (c.CallTip_HighlightTextColor != Color.Empty)
                    co = c.CallTip_HighlightTextColor;

            }
            if (co != Color.Empty)
                Scintilla.CallTip.HighlightTextColor = co;

            i = null;
            foreach (Configuration c in configList)
            {
                if (c.Caret_BlinkRate.HasValue)
                    i = c.Caret_BlinkRate;
            }
            if (i.HasValue)
                Scintilla.Caret.BlinkRate = i.Value;

            co = Color.Empty;
            foreach (Configuration c in configList)
            {
                if (c.Caret_Color != Color.Empty)
                    co = c.Caret_Color;

            }
            if (co != Color.Empty)
                Scintilla.Caret.Color = co;

            i = null;
            foreach (Configuration c in configList)
            {
                if (c.Caret_CurrentLineBackgroundAlpha.HasValue)
                    i = c.Caret_CurrentLineBackgroundAlpha;
            }
            if (i.HasValue)
                Scintilla.Caret.CurrentLineBackgroundAlpha = i.Value;

            co = Color.Empty;
            foreach (Configuration c in configList)
            {
                if (c.Caret_CurrentLineBackgroundColor != Color.Empty)
                    co = c.Caret_CurrentLineBackgroundColor;

            }
            if (co != Color.Empty)
                Scintilla.Caret.CurrentLineBackgroundColor = co;

            b = null;
            foreach (Configuration c in configList)
            {
                if (c.Caret_HighlightCurrentLine.HasValue)
                    b = c.Caret_HighlightCurrentLine;

            }
            if (b.HasValue)
                Scintilla.Caret.HighlightCurrentLine = b.Value;

            b = null;
            foreach (Configuration c in configList)
            {
                if (c.Caret_IsSticky.HasValue)
                    b = c.Caret_IsSticky;

            }
            if (b.HasValue)
                Scintilla.Caret.IsSticky = b.Value;

            CaretStyle? caretStyle = null;
            foreach (Configuration c in configList)
            {
                if (c.Caret_Style.HasValue)
                    caretStyle = c.Caret_Style;
            }
            if (caretStyle.HasValue)
                Scintilla.Caret.Style = caretStyle.Value;

            i = null;
            foreach (Configuration c in configList)
            {
                if (c.Caret_Width.HasValue)
                    i = c.Caret_Width;
            }
            if (i.HasValue)
                Scintilla.Caret.Width = i.Value;

            b = null;
            foreach (Configuration c in configList)
            {
                if (c.Clipboard_ConvertLineBreaksOnPaste.HasValue)
                    b = c.Clipboard_ConvertLineBreaksOnPaste;
            }
            if (b.HasValue)
                Scintilla.Clipboard.ConvertLineBreaksOnPaste = b.Value;

            b = null;
            foreach (Configuration c in configList)
            {
                if (c.Commands_KeyBindingList.AllowDuplicateBindings.HasValue)
                    b = c.Commands_KeyBindingList.AllowDuplicateBindings;
            }
            if (b.HasValue)
                Scintilla.Commands.AllowDuplicateBindings = b.Value;

            if (this._clearKeyBindings)
                Scintilla.Commands.RemoveAllBindings();

            var cbcl = new CommandBindingConfigList();
            foreach (Configuration c in configList)
            {
                if (c.Commands_KeyBindingList.Inherit.HasValue && !c.Commands_KeyBindingList.Inherit.Value)
                    cbcl.Clear();

                foreach (CommandBindingConfig cbc in c.Commands_KeyBindingList)
                    cbcl.Add(cbc);
            }

            foreach (CommandBindingConfig cbc in cbcl)
            {
                //	This indicates that we should clear out any
                //	existing commands bound to this key combination
                if (cbc.ReplaceCurrent.HasValue && cbc.ReplaceCurrent.Value)
                    Scintilla.Commands.RemoveBinding(cbc.KeyBinding.KeyCode, cbc.KeyBinding.Modifiers);

                Scintilla.Commands.AddBinding(cbc.KeyBinding.KeyCode, cbc.KeyBinding.Modifiers, cbc.BindableCommand);
            }

            s = null;
            foreach (Configuration c in configList)
            {
                if (c.DropMarkers_SharedStackName != null)
                    s = c.DropMarkers_SharedStackName;
            }
            if (s != null)
                Scintilla.DropMarkers.SharedStackName = s;

            b = null;
            foreach (Configuration c in configList)
            {
                if (c.EndOfLine_IsVisisble.HasValue)
                    b = c.EndOfLine_IsVisisble;
            }
            if (b.HasValue)
                Scintilla.EndOfLine.IsVisible = b.Value;

            EndOfLineMode? endOfLineMode = null;
            foreach (Configuration c in configList)
            {
                if (c.EndOfLine_Mode.HasValue)
                    endOfLineMode = c.EndOfLine_Mode;
            }
            if (endOfLineMode.HasValue)
                Scintilla.EndOfLine.Mode = endOfLineMode.Value;

            FoldFlag? ff = null;
            foreach (Configuration c in configList)
            {
                if (c.Folding_Flags.HasValue)
                    ff = c.Folding_Flags;
            }
            if (ff.HasValue)
                Scintilla.Folding.Flags = ff.Value;

            // FoldMarkerScheme moved to Markers section
            // becuase Markers need to come first as the
            // FoldMarkerScheme really just manipulates
            // Markers.

            b = null;
            foreach (Configuration c in configList)
            {
                if (c.Folding_IsEnabled.HasValue)
                    b = c.Folding_IsEnabled;
            }
            if (b.HasValue)
                Scintilla.Folding.IsEnabled = b.Value;

            b = null;
            foreach (Configuration c in configList)
            {
                if (c.Folding_UseCompactFolding.HasValue)
                    b = c.Folding_UseCompactFolding;
            }
            if (b.HasValue)
                Scintilla.Folding.UseCompactFolding = b.Value;

            co = Color.Empty;
            foreach (Configuration c in configList)
            {
                if (c.Hotspot_ActiveBackColor != Color.Empty)
                    co = c.Hotspot_ActiveBackColor;

            }
            if (co != Color.Empty)
                Scintilla.HotspotStyle.ActiveBackColor = co;

            co = Color.Empty;
            foreach (Configuration c in configList)
            {
                if (c.Hotspot_ActiveForeColor != Color.Empty)
                    co = c.Hotspot_ActiveForeColor;

            }
            if (co != Color.Empty)
                Scintilla.HotspotStyle.ActiveForeColor = co;

            b = null;
            foreach (Configuration c in configList)
            {
                if (c.Hotspot_ActiveUnderline.HasValue)
                    b = c.Hotspot_ActiveUnderline;
            }
            if (b.HasValue)
                Scintilla.HotspotStyle.ActiveUnderline = b.Value;

            b = null;
            foreach (Configuration c in configList)
            {
                if (c.Hotspot_SingleLine.HasValue)
                    b = c.Hotspot_SingleLine;
            }
            if (b.HasValue)
                Scintilla.HotspotStyle.SingleLine = b.Value;

            b = null;
            foreach (Configuration c in configList)
            {
                if (c.Hotspot_UseActiveBackColor.HasValue)
                    b = c.Hotspot_UseActiveBackColor;
            }
            if (b.HasValue)
                Scintilla.HotspotStyle.UseActiveBackColor = b.Value;

            b = null;
            foreach (Configuration c in configList)
            {
                if (c.Hotspot_UseActiveForeColor.HasValue)
                    b = c.Hotspot_UseActiveForeColor;
            }
            if (b.HasValue)
                Scintilla.HotspotStyle.UseActiveForeColor = b.Value;

            b = null;
            foreach (Configuration c in configList)
            {
                if (c.Indentation_BackspaceUnindents.HasValue)
                    b = c.Indentation_BackspaceUnindents;
            }
            if (b.HasValue)
                Scintilla.Indentation.BackspaceUnindents = b.Value;

            i = null;
            foreach (Configuration c in configList)
            {
                if (c.Indentation_IndentWidth.HasValue)
                    i = c.Indentation_IndentWidth;
            }
            if (i.HasValue)
                Scintilla.Indentation.IndentWidth = i.Value;

            b = null;
            foreach (Configuration c in configList)
            {
                if (c.Indentation_ShowGuides.HasValue)
                    b = c.Indentation_ShowGuides;
            }
            if (b.HasValue)
                Scintilla.Indentation.ShowGuides = b.Value;

            b = null;
            foreach (Configuration c in configList)
            {
                if (c.Indentation_TabIndents.HasValue)
                    b = c.Indentation_TabIndents;
            }
            if (b.HasValue)
                Scintilla.Indentation.TabIndents = b.Value;

            i = null;
            foreach (Configuration c in configList)
            {
                if (c.Indentation_TabWidth.HasValue)
                    i = c.Indentation_TabWidth;
            }
            if (i.HasValue)
                Scintilla.Indentation.TabWidth = i.Value;

            b = null;
            foreach (Configuration c in configList)
            {
                if (c.Indentation_UseTabs.HasValue)
                    b = c.Indentation_UseTabs;
            }
            if (b.HasValue)
                Scintilla.Indentation.UseTabs = b.Value;

            SmartIndent? si = null;
            foreach (Configuration c in configList)
            {
                if (c.Indentation_SmartIndentType.HasValue)
                    si = c.Indentation_SmartIndentType;
            }
            if (si.HasValue)
                Scintilla.Indentation.SmartIndentType = si.Value;

            if (this._clearIndicators)
                Scintilla.Indicators.Reset();

            var resolvedIndicators = new IndicatorConfigList();
            foreach (Configuration c in configList)
            {
                if (c.Indicator_List.Inherit.HasValue && !c.Indicator_List.Inherit.Value)
                    resolvedIndicators.Clear();

                foreach (IndicatorConfig ic in c.Indicator_List)
                {
                    if (!resolvedIndicators.Contains(ic.Number) || !(ic.Inherit.HasValue && ic.Inherit.Value))
                    {
                        resolvedIndicators.Remove(ic.Number);
                        resolvedIndicators.Add(ic);
                    }
                    else
                    {
                        IndicatorConfig rc = resolvedIndicators[ic.Number];
                        if (ic.Color != Color.Empty)
                            rc.Color = ic.Color;

                        if (ic.Style.HasValue)
                            rc.Style = ic.Style;

                        if (ic.IsDrawnUnder.HasValue)
                            rc.IsDrawnUnder = ic.IsDrawnUnder;
                    }
                }
            }

            foreach (IndicatorConfig ic in resolvedIndicators)
            {
                Indicator ind = Scintilla.Indicators[ic.Number];
                if (ic.Color != Color.Empty)
                    ind.Color = ic.Color;

                if (ic.IsDrawnUnder.HasValue)
                    ind.IsDrawnUnder = ic.IsDrawnUnder.Value;

                if (ic.Style.HasValue)
                    ind.Style = ic.Style.Value;
            }

            //	Hrm... unfortunately there's no way to clear
            //	Scintilla's Lexing Properties. Guess we'll just
            //	have to live with adding to the existing list
            //	and/or just overriding with new values. This
            //	means that the "Inherit" attribute is really
            //	meaningless. Nevertheless I'm leaving it in
            //	just in case it ever becomes useful.
            foreach (Configuration c in configList)
            {
                foreach (KeyValuePair<string, string> item in c.Lexing_Properties)
                {
                    Scintilla.Lexing.SetProperty(item.Key, item.Value);
                }
            }

            s = null;
            foreach (Configuration c in configList)
            {
                if (c.Lexing_WhitespaceChars != null)
                    s = c.Lexing_WhitespaceChars;
            }
            if (s != null)
                Scintilla.Lexing.WhitespaceChars = s;

            s = null;
            foreach (Configuration c in configList)
            {
                if (c.Lexing_WordChars != null)
                    s = c.Lexing_WordChars;
            }
            if (s != null)
                Scintilla.Lexing.WordChars = s;

            s = null;
            foreach (Configuration c in configList)
            {
                if (c.Lexing_LineCommentPrefix != null)
                    s = c.Lexing_LineCommentPrefix;
            }
            if (s != null)
                Scintilla.Lexing.LineCommentPrefix = s;

            s = null;
            foreach (Configuration c in configList)
            {
                if (c.Lexing_StreamCommentPrefix != null)
                    s = c.Lexing_StreamCommentPrefix;
            }
            if (s != null)
                Scintilla.Lexing.StreamCommentPrefix = s;

            s = null;
            foreach (Configuration c in configList)
            {
                if (c.Lexing_StreamCommentSuffix != null)
                    s = c.Lexing_StreamCommentSuffix;
            }
            if (s != null)
                Scintilla.Lexing.StreamCommentSufix = s;

            s = null;
            foreach (Configuration c in configList)
            {
                if (c.Lexing_Language != null)
                    s = c.Lexing_Language;
            }

            if (s == null)
            {
                //	None of the configs specified a lexer. First let's see if
                //	we have a Language-Lexer map defined:
                if (Scintilla.Lexing.LexerLanguageMap.ContainsKey(this._language))
                {
                    s = Scintilla.Lexing.LexerLanguageMap[this._language];
                }
                else
                {
                    try
                    {
                        Enum.Parse(typeof(Lexer), this._language, true);

                        //	If we made it here, the language matches one of
                        //	the lexer names, just use that.
                        s = this._language;
                    }
                    catch (ArgumentException)
                    {
                        //	No match, oh well. Don't set the lexer.
                    }
                }
            }
            Scintilla.Lexing.LexerName = s;

            // Issue 32402: After some experimentation I found that keywords
            // must be set AFTER the lexer is set.
            foreach (Configuration c in configList)
            {
                foreach (KeyWordConfig kwc in c.Lexing_Keywords)
                {
                    if (kwc.Inherit.HasValue && kwc.Inherit.Value)
                        Scintilla.Lexing.Keywords[kwc.List] += kwc.Value;
                    else
                        Scintilla.Lexing.Keywords[kwc.List] = kwc.Value;
                }
            }

            i = null;
            foreach (Configuration c in configList)
            {
                if (c.LineWrapping_IndentSize.HasValue)
                    i = c.LineWrapping_IndentSize;
            }
            if (i.HasValue)
                Scintilla.LineWrapping.IndentSize = i.Value;

            LineWrappingIndentMode? lwim = null;
            foreach (Configuration c in configList)
            {
                if (c.LineWrapping_IndentMode.HasValue)
                    lwim = c.LineWrapping_IndentMode;
            }
            if (lwim.HasValue)
                Scintilla.LineWrapping.IndentMode = lwim.Value;

            LineWrappingMode? lwm = null;
            foreach (Configuration c in configList)
            {
                if (c.LineWrapping_Mode.HasValue)
                    lwm = c.LineWrapping_Mode;
            }
            if (lwm.HasValue)
                Scintilla.LineWrapping.Mode = lwm.Value;

            LineWrappingVisualFlags? lwvf = null;
            foreach (Configuration c in configList)
            {
                if (c.LineWrapping_VisualFlags.HasValue)
                    lwvf = c.LineWrapping_VisualFlags;
            }
            if (lwvf.HasValue)
                Scintilla.LineWrapping.VisualFlags = lwvf.Value;

            LineWrappingVisualFlagsLocations? lwvfl = null;
            foreach (Configuration c in configList)
            {
                if (c.LineWrapping_VisualFlagsLocations.HasValue)
                    lwvfl = c.LineWrapping_VisualFlagsLocations;
            }
            if (lwvfl.HasValue)
                Scintilla.LineWrapping.VisualFlagsLocations = lwvfl.Value;

            co = Color.Empty;
            foreach (Configuration c in configList)
            {
                if (c.LongLines_EdgeColor != Color.Empty)
                    co = c.LongLines_EdgeColor;

            }
            if (co != Color.Empty)
                Scintilla.LongLines.EdgeColor = co;

            i = null;
            foreach (Configuration c in configList)
            {
                if (c.LongLines_EdgeColumn.HasValue)
                    i = c.LongLines_EdgeColumn;
            }
            if (i.HasValue)
                Scintilla.LongLines.EdgeColumn = i.Value;

            EdgeMode? em = null;
            foreach (Configuration c in configList)
            {
                if (c.LongLines_EdgeMode.HasValue)
                    em = c.LongLines_EdgeMode;

            }
            if (em.HasValue)
                Scintilla.LongLines.EdgeMode = em.Value;

            if (this._clearMargins)
                Scintilla.Margins.Reset();

            var margins = new Dictionary<int, MarginConfig>();
            foreach (Configuration c in configList)
            {
                if (c.Margin_List.Inherit.HasValue && !c.Margin_List.Inherit.Value)
                    margins.Clear();

                foreach (MarginConfig mc in c.Margin_List)
                {

                    if (!margins.ContainsKey(mc.Number) || (mc.Inherit.HasValue && !mc.Inherit.Value))
                    {
                        margins.Remove(mc.Number);
                        margins.Add(mc.Number, mc);
                    }
                    else
                    {
                        MarginConfig m = margins[mc.Number];

                        if (mc.AutoToggleMarkerNumber.HasValue)
                            m.AutoToggleMarkerNumber = mc.AutoToggleMarkerNumber.Value;

                        if (mc.IsClickable.HasValue)
                            m.IsClickable = mc.IsClickable.Value;

                        if (mc.IsFoldMargin.HasValue)
                            m.IsFoldMargin = mc.IsFoldMargin.Value;

                        if (mc.IsMarkerMargin.HasValue)
                            m.IsMarkerMargin = mc.IsMarkerMargin.Value;

                        if (mc.Type.HasValue)
                            m.Type = mc.Type.Value;

                        if (mc.Width.HasValue)
                            m.Width = mc.Width.Value;
                    }
                }
            }

            foreach (MarginConfig mc in margins.Values)
            {
                Margin m = Scintilla.Margins[mc.Number];

                if (mc.AutoToggleMarkerNumber.HasValue)
                    m.AutoToggleMarkerNumber = mc.AutoToggleMarkerNumber.Value;

                if (mc.IsClickable.HasValue)
                    m.IsClickable = mc.IsClickable.Value;

                if (mc.IsFoldMargin.HasValue)
                    m.IsFoldMargin = mc.IsFoldMargin.Value;

                if (mc.IsMarkerMargin.HasValue)
                    m.IsMarkerMargin = mc.IsMarkerMargin.Value;

                if (mc.Type.HasValue)
                    m.Type = mc.Type.Value;

                if (mc.Width.HasValue)
                    m.Width = mc.Width.Value;
            }

            if (this._clearMarkers)
                Scintilla.Markers.Reset();

            var resolvedMarkers = new MarkersConfigList();
            foreach (Configuration c in configList)
            {
                if (c.Markers_List.Inherit.HasValue && !c.Markers_List.Inherit.Value)
                    resolvedMarkers.Clear();

                foreach (MarkersConfig mc in c.Markers_List)
                {
                    if (!resolvedMarkers.Contains(mc.Number.Value) || (mc.Inherit.HasValue && !mc.Inherit.Value))
                    {
                        resolvedMarkers.Remove(mc.Number.Value);
                        resolvedMarkers.Add(mc);
                    }
                    else
                    {
                        if (!mc.Number.HasValue)
                            mc.Number = (int)(MarkerOutline)Enum.Parse(typeof(MarkerOutline), mc.Name, true);

                        MarkersConfig m = resolvedMarkers[mc.Number.Value];
                        if (mc.Alpha.HasValue)
                            m.Alpha = mc.Alpha;

                        if (mc.BackColor != Color.Empty)
                            m.BackColor = mc.BackColor;

                        if (mc.ForeColor != Color.Empty)
                            m.ForeColor = mc.ForeColor;

                        if (mc.Symbol.HasValue)
                            m.Symbol = mc.Symbol;
                    }
                }
            }

            foreach (MarkersConfig mc in resolvedMarkers)
            {
                Marker m = Scintilla.Markers[mc.Number.Value];

                if (mc.Alpha.HasValue)
                    m.Alpha = mc.Alpha.Value;

                if (mc.BackColor != Color.Empty)
                    m.BackColor = mc.BackColor;

                if (mc.ForeColor != Color.Empty)
                    m.ForeColor = mc.ForeColor;

                if (mc.Symbol.HasValue)
                    m.Symbol = mc.Symbol.Value;
            }

            FoldMarkerScheme? fms = null;
            foreach (Configuration c in configList)
            {
                if (c.Folding_MarkerScheme.HasValue)
                    fms = c.Folding_MarkerScheme;
            }
            if (fms.HasValue)
                Scintilla.Folding.MarkerScheme = fms.Value;

            b = null;
            foreach (Configuration c in configList)
            {
                if (c.Scrolling_EndAtLastLine.HasValue)
                    b = c.Scrolling_EndAtLastLine;
            }
            if (b.HasValue)
                Scintilla.Scrolling.EndAtLastLine = b.Value;

            i = null;
            foreach (Configuration c in configList)
            {
                if (c.Scrolling_HorizontalWidth.HasValue)
                    i = c.Scrolling_HorizontalWidth;
            }
            if (i.HasValue)
                Scintilla.Scrolling.HorizontalWidth = i.Value;

            ScrollBars? sb = null;
            foreach (Configuration c in configList)
            {
                if (c.Scrolling_ScrollBars.HasValue)
                    sb = c.Scrolling_ScrollBars;
            }
            if (sb.HasValue)
                Scintilla.Scrolling.ScrollBars = sb.Value;

            i = null;
            foreach (Configuration c in configList)
            {
                if (c.Scrolling_XOffset.HasValue)
                    i = c.Scrolling_XOffset;
            }
            if (i.HasValue)
                Scintilla.Scrolling.XOffset = i.Value;

            co = Color.Empty;
            foreach (Configuration c in configList)
            {
                if (c.Selection_BackColor != Color.Empty)
                    co = c.Selection_BackColor;

            }
            if (co != Color.Empty)
                Scintilla.Selection.BackColor = co;

            co = Color.Empty;
            foreach (Configuration c in configList)
            {
                if (c.Selection_BackColorUnfocused != Color.Empty)
                    co = c.Selection_BackColorUnfocused;

            }
            if (co != Color.Empty)
                Scintilla.Selection.BackColorUnfocused = co;

            co = Color.Empty;
            foreach (Configuration c in configList)
            {
                if (c.Selection_ForeColor != Color.Empty)
                    co = c.Selection_ForeColor;

            }
            if (co != Color.Empty)
                Scintilla.Selection.ForeColor = co;

            co = Color.Empty;
            foreach (Configuration c in configList)
            {
                if (c.Selection_ForeColorUnfocused != Color.Empty)
                    co = c.Selection_ForeColorUnfocused;

            }
            if (co != Color.Empty)
                Scintilla.Selection.ForeColorUnfocused = co;

            b = null;
            foreach (Configuration c in configList)
            {
                if (c.Selection_Hidden.HasValue)
                    b = c.Selection_Hidden;
            }
            if (b.HasValue)
                Scintilla.Selection.Hidden = b.Value;

            b = null;
            foreach (Configuration c in configList)
            {
                if (c.Selection_HideSelection.HasValue)
                    b = c.Selection_HideSelection;
            }
            if (b.HasValue)
                Scintilla.Selection.HideSelection = b.Value;

            SelectionMode? selectionMode = null;
            foreach (Configuration c in configList)
            {
                if (c.Selection_Mode.HasValue)
                    selectionMode = c.Selection_Mode;
            }
            if (selectionMode.HasValue)
                Scintilla.Selection.Mode = selectionMode.Value;

            if (this._clearSnippets)
                Scintilla.Snippets.List.Clear();

            b = null;
            foreach (Configuration c in configList)
            {
                if (c.SnippetsConfigList.IsEnabled.HasValue)
                    b = c.SnippetsConfigList.IsEnabled;
            }
            if (b.HasValue)
                Scintilla.Snippets.IsEnabled = b.Value;

            b = null;
            foreach (Configuration c in configList)
            {
                if (c.SnippetsConfigList.IsOneKeySelectionEmbedEnabled.HasValue)
                    b = c.SnippetsConfigList.IsOneKeySelectionEmbedEnabled;
            }
            if (b.HasValue)
                Scintilla.Snippets.IsOneKeySelectionEmbedEnabled = b.Value;

            char? defaultDelimeter = null;
            foreach (Configuration c in configList)
            {
                if (c.SnippetsConfigList.DefaultDelimeter.HasValue)
                    defaultDelimeter = c.SnippetsConfigList.DefaultDelimeter;

            }
            if (!ch.HasValue)
                Scintilla.Snippets.DefaultDelimeter = '$';

            var snips = new SnippetList(null);
            foreach (Configuration c in configList)
            {
                if (c.SnippetsConfigList.Inherit.HasValue && !c.SnippetsConfigList.Inherit.Value)
                    snips.Clear();

                foreach (SnippetsConfig sc in c.SnippetsConfigList)
                {
                    if (snips.Contains(sc.Shortcut))
                        snips.Remove(sc.Shortcut);

                    Snippet snip;
                    if (sc.Delimeter.HasValue)
                        snip = snips.Add(sc.Shortcut, sc.Code, sc.Delimeter.Value);
                    else
                        snip = snips.Add(sc.Shortcut, sc.Code, Scintilla.Snippets.DefaultDelimeter);

                    if (sc.IsSurroundsWith.HasValue)
                        snip.IsSurroundsWith = sc.IsSurroundsWith.Value;
                }
            }

            SnippetList sl = Scintilla.Snippets.List;
            foreach (Snippet sc in snips)
            {
                if (sl.Contains(sc.Shortcut))
                    sl.Remove(sc.Shortcut);

                sl.Add(sc.Shortcut, sc.Code, Scintilla.Snippets.DefaultDelimeter, sc.IsSurroundsWith);
            }

            sl.Sort();

            co = Color.Empty;
            foreach (Configuration c in configList)
            {
                if (c.SnippetsConfigList.ActiveSnippetColor != Color.Empty)
                    co = c.SnippetsConfigList.ActiveSnippetColor;
            }
            if (co != Color.Empty)
                Scintilla.Snippets.ActiveSnippetColor = co;

            IndicatorStyle? indicatorStyle = null;
            foreach (Configuration c in configList)
            {
                if (c.SnippetsConfigList.ActiveSnippetIndicatorStyle.HasValue)
                    indicatorStyle = c.SnippetsConfigList.ActiveSnippetIndicatorStyle;
            }
            if (indicatorStyle.HasValue)
                Scintilla.Snippets.ActiveSnippetIndicatorStyle = indicatorStyle.Value;

            i = null;
            foreach (Configuration c in configList)
            {
                if (c.SnippetsConfigList.ActiveSnippetIndicator.HasValue)
                    i = c.SnippetsConfigList.ActiveSnippetIndicator;
            }
            if (i.HasValue)
                Scintilla.Snippets.ActiveSnippetIndicator = i.Value;

            co = Color.Empty;
            foreach (Configuration c in configList)
            {
                if (c.SnippetsConfigList.InactiveSnippetColor != Color.Empty)
                    co = c.SnippetsConfigList.InactiveSnippetColor;

            }
            if (co != Color.Empty)
                Scintilla.Snippets.InactiveSnippetColor = co;

            i = null;
            foreach (Configuration c in configList)
            {
                if (c.SnippetsConfigList.InactiveSnippetIndicator.HasValue)
                    i = c.SnippetsConfigList.InactiveSnippetIndicator;
            }
            if (i.HasValue)
                Scintilla.Snippets.InactiveSnippetIndicator = i.Value;

            IndicatorStyle? ics = null;
            foreach (Configuration c in configList)
            {
                if (c.SnippetsConfigList.ActiveSnippetIndicatorStyle.HasValue)
                    ics = c.SnippetsConfigList.ActiveSnippetIndicatorStyle;
            }
            if (ics.HasValue)
                Scintilla.Snippets.ActiveSnippetIndicatorStyle = ics.Value;

            indicatorStyle = null;
            foreach (Configuration c in configList)
            {
                if (c.SnippetsConfigList.InactiveSnippetIndicatorStyle.HasValue)
                    indicatorStyle = c.SnippetsConfigList.InactiveSnippetIndicatorStyle;
            }
            if (indicatorStyle.HasValue)
                Scintilla.Snippets.InactiveSnippetIndicatorStyle = indicatorStyle.Value;

            b = null;
            foreach (Configuration c in configList)
            {
                if (c.UndoRedoIsUndoEnabled.HasValue)
                    b = c.UndoRedoIsUndoEnabled;
            }
            if (b.HasValue)
                Scintilla.UndoRedo.IsUndoEnabled = b.Value;

            co = Color.Empty;
            foreach (Configuration c in configList)
            {
                if (c.Whitespace_BackColor != Color.Empty)
                    co = c.Whitespace_BackColor;

            }
            if (co != Color.Empty)
                Scintilla.Whitespace.BackColor = co;

            co = Color.Empty;
            foreach (Configuration c in configList)
            {
                if (c.Whitespace_ForeColor != Color.Empty)
                    co = c.Whitespace_ForeColor;
            }
            if (co != Color.Empty)
                Scintilla.Whitespace.ForeColor = co;

            WhitespaceMode? wsm = null;
            foreach (Configuration c in configList)
            {
                if (c.Whitespace_Mode.HasValue)
                    wsm = c.Whitespace_Mode;
            }
            if (wsm.HasValue)
                Scintilla.Whitespace.Mode = wsm.Value;

            //	OK so we saved the best for last instead of going in
            //	strict lexical order. Styles! This is really the section
            //	that people care about most in the config, and is also
            //	the most complex.
            if (this._clearStyles)
                Scintilla.Styles.Reset();

            i = null;
            foreach (Configuration c in configList)
            {
                if (c.Styles.Bits.HasValue)
                    i = c.Styles.Bits;
            }

            #pragma warning disable 618
            if (i.HasValue)
                Scintilla.Styles.Bits = i.Value;
            #pragma warning restore 618

            Dictionary<string, int> styleNameMap = Scintilla.Lexing.StyleNameMap;
            var resolvedStyles = new ResolvedStyleList();

            int _unmappedStyleNumber = -1;
            var _unmappedStyleMap = new Dictionary<string, int>();
            foreach (Configuration c in configList)
            {
                if (c.Styles.Inherit.HasValue && !c.Styles.Inherit.Value)
                    resolvedStyles.Clear();

                foreach (StyleConfig sc in c.Styles)
                {
                    i = sc.Number;

                    if (!i.HasValue)
                    {
                        if (!styleNameMap.ContainsKey(sc.Name))
                        {
                            if (_unmappedStyleMap.ContainsKey(sc.Name))
                            {
                                i = _unmappedStyleMap[sc.Name];
                                sc.Number = i;
                            }
                            else
                            {
                                i = _unmappedStyleNumber--;
                                sc.Number = i;

                                _unmappedStyleMap[sc.Name] = sc.Number.Value;
                            }
                        }
                        else
                        {
                            i = styleNameMap[sc.Name];
                            sc.Number = i;
                        }
                    }

                    StyleConfig baseStyleConfig = null;
                    if (!string.IsNullOrEmpty(sc.Name) && sc.Name.Contains("."))
                    {
                        baseStyleConfig = resolvedStyles.FindByName(sc.Name.Substring(sc.Name.IndexOf(".") + 1));
                    }

                    if (!resolvedStyles.ContainsKey(i.Value) || (sc.Inherit.HasValue && !sc.Inherit.Value))
                    {
                        resolvedStyles.Remove(i.Value);
                        resolvedStyles.Add(i.Value, sc);
                    }

                    StyleConfig rs = resolvedStyles[i.Value];

                    if (sc.BackColor != Color.Empty)
                        rs.BackColor = sc.BackColor;
                    else if (baseStyleConfig != null && baseStyleConfig.BackColor != Color.Empty)
                        rs.BackColor = baseStyleConfig.BackColor;

                    if (sc.Bold.HasValue)
                        rs.Bold = sc.Bold.Value;
                    else if (baseStyleConfig != null && baseStyleConfig.Bold.HasValue)
                        rs.Bold = baseStyleConfig.Bold.Value;

                    if (sc.Case.HasValue)
                        rs.Case = sc.Case.Value;
                    else if (baseStyleConfig != null && baseStyleConfig.Case.HasValue)
                        rs.Case = baseStyleConfig.Case.Value;

                    if (sc.CharacterSet.HasValue)
                        rs.CharacterSet = sc.CharacterSet.Value;
                    else if (baseStyleConfig != null && baseStyleConfig.CharacterSet.HasValue)
                        rs.CharacterSet = baseStyleConfig.CharacterSet.Value;

                    if (sc.FontName != null)
                        rs.FontName = sc.FontName;
                    else if (baseStyleConfig != null && baseStyleConfig.FontName != null)
                        rs.FontName = baseStyleConfig.FontName;

                    if (sc.ForeColor != Color.Empty)
                        rs.ForeColor = sc.ForeColor;
                    else if (baseStyleConfig != null && baseStyleConfig.ForeColor != Color.Empty)
                        rs.ForeColor = baseStyleConfig.ForeColor;

                    if (sc.IsChangeable.HasValue)
                        rs.IsChangeable = sc.IsChangeable.Value;
                    else if (baseStyleConfig != null && baseStyleConfig.IsChangeable.HasValue)
                        rs.IsChangeable = baseStyleConfig.IsChangeable.Value;

                    if (sc.IsHotspot.HasValue)
                        rs.IsHotspot = sc.IsHotspot.Value;
                    else if (baseStyleConfig != null && baseStyleConfig.IsHotspot.HasValue)
                        rs.IsHotspot = baseStyleConfig.IsHotspot.Value;

                    if (sc.IsSelectionEolFilled.HasValue)
                        rs.IsSelectionEolFilled = sc.IsSelectionEolFilled.Value;
                    else if (baseStyleConfig != null && baseStyleConfig.IsSelectionEolFilled.HasValue)
                        rs.IsSelectionEolFilled = baseStyleConfig.IsSelectionEolFilled.Value;

                    if (sc.IsVisible.HasValue)
                        rs.IsVisible = sc.IsVisible.Value;
                    else if (baseStyleConfig != null && baseStyleConfig.IsVisible.HasValue)
                        rs.IsVisible = baseStyleConfig.IsVisible.Value;

                    if (sc.Italic.HasValue)
                        rs.Italic = sc.Italic.Value;
                    else if (baseStyleConfig != null && baseStyleConfig.Italic.HasValue)
                        rs.Italic = baseStyleConfig.Italic.Value;

                    if (sc.Size.HasValue)
                        rs.Size = sc.Size.Value;
                    else if (baseStyleConfig != null && baseStyleConfig.Size.HasValue)
                        rs.Size = baseStyleConfig.Size.Value;

                    if (sc.Underline.HasValue)
                        rs.Underline = sc.Underline.Value;
                    else if (baseStyleConfig != null && baseStyleConfig.Underline.HasValue)
                        rs.Underline = baseStyleConfig.Underline.Value;
                }

            }
            //	If a Default styles exist we want them at the top of the list because
            //	it needs to be applied first, then StyleClearAll() called so that all
            //	other styles will "inherit" this style. Then the other styles will
            //	override the default with any defined properties.
            var arr = new StyleConfig[resolvedStyles.Count];
            resolvedStyles.Values.CopyTo(arr, 0);
            Array.Sort(arr, delegate(StyleConfig sc1, StyleConfig sc2)
            {
                int v1 = sc1.Number.Value == Constants.STYLE_DEFAULT ? -1 : sc1.Number.Value;
                int v2 = sc2.Number.Value == Constants.STYLE_DEFAULT ? -1 : sc2.Number.Value;

                if (v1 < v2)
                    return -1;
                else if (v2 < v1)
                    return 1;

                return 0;
            });

            foreach (StyleConfig sc in arr)
            {
                if (sc.Number < 0)
                    continue;

                Style style = Scintilla.Styles[sc.Number.Value];

                if (sc.BackColor != Color.Empty)
                    style.BackColor = sc.BackColor;

                if (sc.Bold.HasValue)
                    style.Bold = sc.Bold.Value;

                if (sc.Case.HasValue)
                    style.Case = sc.Case.Value;

                if (sc.CharacterSet.HasValue)
                    style.CharacterSet = sc.CharacterSet.Value;

                if (sc.FontName != null)
                    style.FontName = sc.FontName;

                if (sc.ForeColor != Color.Empty)
                    style.ForeColor = sc.ForeColor;

                if (sc.IsChangeable.HasValue)
                    style.IsChangeable = sc.IsChangeable.Value;

                if (sc.IsHotspot.HasValue)
                    style.IsHotspot = sc.IsHotspot.Value;

                if (sc.IsSelectionEolFilled.HasValue)
                    style.IsSelectionEolFilled = sc.IsSelectionEolFilled.Value;

                if (sc.IsVisible.HasValue)
                    style.IsVisible = sc.IsVisible.Value;

                if (sc.Italic.HasValue)
                    style.Italic = sc.Italic.Value;

                if (sc.Size.HasValue)
                    style.Size = sc.Size.Value;

                if (sc.Underline.HasValue)
                    style.Underline = sc.Underline.Value;

                if (sc.Number == Constants.STYLE_DEFAULT)
                    Scintilla.Styles.ClearAll();
            }
        }