From 9586c577b2987f29dc82b9b08166b1000a1a8436 Mon Sep 17 00:00:00 2001 From: Volodymyr Kononenko Date: Wed, 23 Oct 2013 22:33:14 +0300 Subject: [PATCH] PairTagHighlighter: changes in highlighting * use scintilla indicator #9 to avoid conflicts with lexers * if matching pair is not found, highlight tag with red * if tag is self-closing, highlight it with yellow --- pairtaghighlighter/src/pair_tag_highlighter.c | 70 +++++++++++++------ 1 file changed, 49 insertions(+), 21 deletions(-) diff --git a/pairtaghighlighter/src/pair_tag_highlighter.c b/pairtaghighlighter/src/pair_tag_highlighter.c index d8473ca5f..98aa34ec0 100644 --- a/pairtaghighlighter/src/pair_tag_highlighter.c +++ b/pairtaghighlighter/src/pair_tag_highlighter.c @@ -14,11 +14,13 @@ #include "Scintilla.h" /* for the SCNotification struct */ #include "SciLexer.h" -/* If to set indicator >8, highlighting will be of grey color. - * Light grey line highlighter covers higher values of indicator. */ -#define INDICATOR_TAGMATCH 0 +#define INDICATOR_TAGMATCH 9 #define MAX_TAG_NAME 64 +#define MATCHING_PAIR_COLOR 0x00ff00 /* green */ +#define NONMATCHING_PAIR_COLOR 0xff0000 /* red */ +#define EMPTY_TAG_COLOR 0xffff00 /* yellow */ + /* These items are set by Geany before plugin_init() is called. */ GeanyPlugin *geany_plugin; GeanyData *geany_data; @@ -82,18 +84,42 @@ static gint findBracket(ScintillaObject *sci, gint position, gint endOfSearchPos } -static void highlight_tag(ScintillaObject *sci, gint openingBracket, gint closingBracket) +static gint rgb2bgr(gint color) +{ + guint r, g, b; + + r = color >> 16; + g = (0x00ff00 & color) >> 8; + b = (0x0000ff & color); + + color = (r | (g << 8) | (b << 16)); + + return color; +} + + +static void highlight_tag(ScintillaObject *sci, gint openingBracket, + gint closingBracket, gint color) { scintilla_send_message(sci, SCI_SETINDICATORCURRENT, INDICATOR_TAGMATCH, 0); scintilla_send_message(sci, SCI_INDICSETSTYLE, INDICATOR_TAGMATCH, INDIC_ROUNDBOX); - scintilla_send_message(sci, SCI_INDICSETFORE, 0, 0x00d000); /* green */ + scintilla_send_message(sci, SCI_INDICSETFORE, INDICATOR_TAGMATCH, rgb2bgr(color)); scintilla_send_message(sci, SCI_INDICSETALPHA, INDICATOR_TAGMATCH, 60); scintilla_send_message(sci, SCI_INDICATORFILLRANGE, openingBracket, closingBracket-openingBracket+1); } +static void highlight_matching_pair(ScintillaObject *sci) +{ + highlight_tag(sci, highlightedBrackets[0], highlightedBrackets[1], + MATCHING_PAIR_COLOR); + highlight_tag(sci, highlightedBrackets[2], highlightedBrackets[3], + MATCHING_PAIR_COLOR); +} + + static void clear_previous_highlighting(ScintillaObject *sci, gint rangeStart, gint rangeEnd) { scintilla_send_message(sci, SCI_SETINDICATORCURRENT, INDICATOR_TAGMATCH, 0); @@ -184,12 +210,14 @@ static void findMatchingOpeningTag(ScintillaObject *sci, gchar *tagName, gint op if(openingTagsCount == closingTagsCount) { /* matching tag is found */ - highlight_tag(sci, matchingOpeningBracket, matchingClosingBracket); highlightedBrackets[2] = matchingOpeningBracket; highlightedBrackets[3] = matchingClosingBracket; - break; + highlight_matching_pair(sci); + return; } } + highlight_tag(sci, highlightedBrackets[0], highlightedBrackets[1], + NONMATCHING_PAIR_COLOR); } @@ -237,12 +265,14 @@ static void findMatchingClosingTag(ScintillaObject *sci, gchar *tagName, gint cl if(openingTagsCount == closingTagsCount) { /* matching tag is found */ - highlight_tag(sci, matchingOpeningBracket, matchingClosingBracket); highlightedBrackets[2] = matchingOpeningBracket; highlightedBrackets[3] = matchingClosingBracket; - break; + highlight_matching_pair(sci); + return; } } + highlight_tag(sci, highlightedBrackets[0], highlightedBrackets[1], + NONMATCHING_PAIR_COLOR); } @@ -250,12 +280,16 @@ static void findMatchingTag(ScintillaObject *sci, gint openingBracket, gint clos { gchar tagName[MAX_TAG_NAME]; gboolean isTagOpening = is_tag_opening(sci, openingBracket); - get_tag_name(sci, openingBracket, closingBracket, tagName, isTagOpening); - if(TRUE == isTagOpening) - findMatchingClosingTag(sci, tagName, closingBracket); - else - findMatchingOpeningTag(sci, tagName, openingBracket); + if(is_tag_self_closing(sci, closingBracket)) { + highlight_tag(sci, openingBracket, closingBracket, EMPTY_TAG_COLOR); + } else { + get_tag_name(sci, openingBracket, closingBracket, tagName, isTagOpening); + if(isTagOpening) + findMatchingClosingTag(sci, tagName, closingBracket); + else + findMatchingOpeningTag(sci, tagName, openingBracket); + } } @@ -290,13 +324,7 @@ static void run_tag_highlighter(ScintillaObject *sci) highlightedBrackets[0] = openingBracket; highlightedBrackets[1] = closingBracket; - /* Highlight current tag. Matching tag will be highlighted from - * findMatchingTag() functiong */ - highlight_tag(sci, openingBracket, closingBracket); - - /* Find matching tag only if a tag is not self-closing */ - if(FALSE == is_tag_self_closing(sci, closingBracket)) - findMatchingTag(sci, openingBracket, closingBracket); + findMatchingTag(sci, openingBracket, closingBracket); }