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(); } }