Пример #1
0
        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);
                }
            }
        }
Пример #2
0
        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;
            }
        }
Пример #3
0
        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;
            }
        }
Пример #4
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;
                }
            }
        }
    }