private void GotoBraceMatch() { BraceInfo braceInfo = GetCurrentBraceInfo(); if (braceInfo != null) { int bracePosition = _scintillaControl.BraceMatch(braceInfo.Position); if (bracePosition != -1) { if (braceInfo.OpenBrace) { bracePosition++; } _scintillaControl.GotoPosition(bracePosition); } } }
private void codeBox_UpdateUI(object sender, UpdateUIEventArgs e) { const string openBraces = "([{"; const string closeBraces = ")]}"; var caretPos = _codeBox.CurrentPosition; if (caretPos != _lastCaretPos) { int lastLine = _codeBox.LineFromPosition(_lastCaretPos); int currentLine = _codeBox.LineFromPosition(caretPos); _codeBox.MarkerDeleteAll(3); if (_highlightLine) { _codeBox.Lines[currentLine].MarkerAdd(3); } char charBefore = (char)_codeBox.GetCharAt(caretPos - 1); char charAfter = (char)_codeBox.GetCharAt(caretPos); int brace1Pos = Scintilla.InvalidPosition; if (closeBraces.Contains(charBefore)) { brace1Pos = caretPos - 1; } else if (openBraces.Contains(charAfter)) { brace1Pos = caretPos; } if (brace1Pos != Scintilla.InvalidPosition) { int brace2Pos = _codeBox.BraceMatch(brace1Pos); if (brace2Pos != Scintilla.InvalidPosition) { _codeBox.BraceHighlight(brace1Pos, brace2Pos); } else { _codeBox.BraceBadLight(brace1Pos); } } else { _codeBox.BraceHighlight(Scintilla.InvalidPosition, Scintilla.InvalidPosition); } _lastCaretPos = caretPos; } }
private void Scintilla_UpdateUI(object sender, UpdateUIEventArgs e) { var caretPos = Scintilla.CurrentPosition; if (_lastCaretPos == caretPos) { return; } _lastCaretPos = caretPos; var openingBracePos = -1; if (caretPos > 0 && IsBrace(Scintilla.GetCharAt(caretPos - 1))) { openingBracePos = caretPos - 1; } else if (IsBrace(Scintilla.GetCharAt(caretPos))) { openingBracePos = caretPos; } if (openingBracePos != -1) { var closingBracePos = Scintilla.BraceMatch(openingBracePos); if (closingBracePos == Scintilla.InvalidPosition) { Scintilla.BraceBadLight(openingBracePos); Scintilla.HighlightGuide = 0; } else { Scintilla.BraceHighlight(openingBracePos, closingBracePos); Scintilla.HighlightGuide = Scintilla.GetColumn(openingBracePos); } } else { Scintilla.BraceHighlight(Scintilla.InvalidPosition, Scintilla.InvalidPosition); Scintilla.HighlightGuide = 0; } }
public static void Style(Scintilla scintilla, int startPos, int endPos, bool fullDoc = false) { startPos = (fullDoc ? 0 : scintilla.Lines[scintilla.LineFromPosition(startPos)].Position); endPos = (fullDoc ? (scintilla.Lines[scintilla.Lines.Count].EndPosition - 1) : endPos); int style, length = 0, state = STATE_UNKNOWN; bool SINGLE_LINE_COMMENT, MULTI_LINE_COMMENT, VERBATIM = false, PARENTHESIS = false, QUOTED_STRING = false, DBL_OPR; char c = '\0', d = '\0'; void ClearState() { length = state = STATE_UNKNOWN; } void DefaultStyle() => scintilla.SetStyling(1, StyleDefault); int StyleUntilEndOfLine(int inPosition, int inStyle) { int len = (scintilla.Lines[scintilla.LineFromPosition(inPosition)].EndPosition - inPosition); scintilla.SetStyling(len, inStyle); return(--len); //We return the length, cause we'll have to adjust the startPos. } bool ContainsUsingStatement(int inPosition) => (scintilla.GetTextRange(scintilla.Lines[scintilla.LineFromPosition(inPosition)].Position, 5)).Contains("using"); if (MULTI_KEYWORDS.Count > 0) { RegSearchForWordsIn(scintilla.GetTextRange(startPos, (endPos - startPos)), startPos); } scintilla.StartStyling(startPos); { for (; startPos < endPos; startPos++) { c = scintilla.Text[startPos]; if ((state == STATE_UNKNOWN) && c == ' ') { DefaultStyle(); continue; } //Better than allowing it to set all the booleans and trickle down the if/else-if structure? d = (((startPos + 1) < scintilla.Text.Length) ? scintilla.Text[startPos + 1] : '\0'); //d = (char)scintilla.GetCharAt(startPos + 1); if (state == STATE_UNKNOWN) { bool bFormattedVerbatim = ((c == '$') && (d == '@')), bFormatted = ((c == '$') && ((d == '"'))), bNegativeNum = ((c == '-') && (char.IsDigit(d))), bFraction = ((c == '.') && (char.IsDigit(d))), bString = (c == '"'), bQuotedString = (c == '\''); VERBATIM = ((c == '@') && (d == '"')); SINGLE_LINE_COMMENT = ((c == '/') && (d == '/')); MULTI_LINE_COMMENT = ((c == '/') && (d == '*')); //I always want braces to be highlighted if ((c == '{') || (c == '}')) { scintilla.SetStyling(1, ((scintilla.BraceMatch(startPos) > -1) ? StyleBraces : StyleError)); } else if (char.IsLetter(c)) //Indentifier - Keywords, procedures, etc ... { state = (((MULTI_KEYWORDS.Count > 0) && MULTI_DICT.ContainsKey(startPos)) ? STATE_MULTI_IDENTIFIER : STATE_IDENTIFIER); } else if (bString || VERBATIM || bFormatted || bFormattedVerbatim || bQuotedString) //String { int len = ((VERBATIM || bFormatted || bFormattedVerbatim) ? ((bFormattedVerbatim) ? 3 : 2) : 1); QUOTED_STRING = bQuotedString; scintilla.SetStyling(len, (!VERBATIM ? (QUOTED_STRING ? StyleQuotedString : StyleString) : StyleVerbatim)); startPos += (len - 1); state = STATE_STRING; } else if (char.IsDigit(c) || bNegativeNum || bFraction) //Number { state = STATE_NUMBER; } else if (SINGLE_LINE_COMMENT || MULTI_LINE_COMMENT) //Comment { if (SINGLE_LINE_COMMENT) { startPos += StyleUntilEndOfLine(startPos, StyleComment); } else { scintilla.SetStyling(2, StyleComment); startPos += 2; state = STATE_MULTILINE_COMMENT; } } else if (c == '#') //Preprocessor { startPos += StyleUntilEndOfLine(startPos, StylePreprocessor); //continue; } else if ( (char.IsSymbol(c) || OperatorStragglers.Contains(c)) && (Operators.Contains($"{c}" + ((DBL_OPR = (char.IsSymbol(d) || OperatorStragglers.Contains(d))) ? $"{d}" : ""))) ) //Operators { scintilla.SetStyling((DBL_OPR ? 2 : 1), StyleOperator); startPos += (DBL_OPR ? 1 : 0); } else { DefaultStyle(); } continue; } length++; switch (state) { case STATE_IDENTIFIER: string identifier = scintilla.GetWordFromPosition(startPos); style = StyleIdentifier; int s = startPos; startPos += (identifier.Length - 2); d = (((startPos + 1) < scintilla.Text.Length) ? scintilla.Text[startPos + 1] : '\0'); //d = (char)scintilla.GetCharAt(startPos + 1); bool OPEN_PAREN = (d == '('); if (!OPEN_PAREN && KEYWORDS.Contains(identifier)) { style = StyleKeyword; } //Keywords else if (!OPEN_PAREN && CONTEXTUAL_KEYWORDS.Contains(identifier)) { style = StyleContextual; } //Contextual Keywords else if (!OPEN_PAREN && USER_KEYWORDS.Contains(identifier)) { style = StyleUser; } //User Keywords else if (OPEN_PAREN) { style = StyleProcedure; } //Procedures else if (IdentifierMarkers.Contains(d) && !ContainsUsingStatement(startPos)) { style = StyleProcedureContainer; } //Procedure Containers "classes?" else if (((char)scintilla.GetCharAt(s - 2) == '.') && !ContainsUsingStatement(s)) { style = StyleContainerProcedure; } //Container "procedures" ClearState(); scintilla.SetStyling(identifier.Length, style); break; case STATE_MULTI_IDENTIFIER: int value; MULTI_DICT.TryGetValue((startPos - 1), out value); startPos += (value - 2); ClearState(); scintilla.SetStyling(value, StyleMultiIdentifier); break; case STATE_NUMBER: if (!NumberTypes.Contains(c)) { scintilla.SetStyling(length, StyleNumber); ClearState(); startPos--; } break; case STATE_STRING: style = (VERBATIM ? StyleVerbatim : (QUOTED_STRING ? StyleQuotedString : StyleString)); if (QUOTED_STRING) { if (c == '\'') //End of our Quoted string? { QUOTED_STRING = false; scintilla.SetStyling(length, style); ClearState(); } else if (c == '\\') { length++; startPos++; } } else if (PARENTHESIS || ((c == '{') || (d == '}'))) //Formatted strings that are using braces { if (c == '{') { PARENTHESIS = true; } if (c == '}') { PARENTHESIS = false; } } else if (VERBATIM && ((c == '"') && (d == '"'))) //Skip over embedded quotation marks { length++; startPos++; } else if (c == '"') //End of our string? { length = ((length < 1) ? 1 : length); scintilla.SetStyling(length, style); ClearState(); } else { if (!QUOTED_STRING && (c == '\\') && EscapeSequences.Contains(d)) //Escape Sequences { length += ((d == '\\') ? 0 : -1); scintilla.SetStyling(length, style); { startPos++; length = 0; } scintilla.SetStyling(2, StyleEscapeSequence); } } break; case STATE_MULTILINE_COMMENT: if ((c == '*') && (d == '/')) { length += 2; scintilla.SetStyling(length, StyleComment); ClearState(); startPos++; } break; } } } }