3232
3333#include < regex>
3434#include < thread>
35+ #include < array>
3536#include < algorithm>
3637#include < utility>
3738#include < memory>
4344
4445static std::string g_findString;
4546std::string g_sHighlightString;
47+ std::array<std::string, 4 > g_sCustomHighlightStrings;
48+ std::array<std::string, 4 > g_sLastCustomHighlightStrings;
4649static Scintilla::FindOption g_searchFlags = Scintilla::FindOption::None;
4750sptr_t g_searchMarkerCount = 0 ;
4851static std::string g_lastSelText;
@@ -2898,43 +2901,86 @@ void CCmdFindReplace::ScintillaNotify(SCNotification* pScn)
28982901 g_lastSelText.clear ();
28992902 g_searchMarkerCount = 0 ;
29002903 DocScrollClear (DOCSCROLLTYPE_SEARCHTEXT);
2901- return ;
29022904 }
2903-
2904- Sci_TextToFind findText = {0 };
2905- findText.chrg .cpMin = static_cast <Sci_PositionCR>(startStylePos);
2906- findText.chrg .cpMax = static_cast <Sci_PositionCR>(endStylePos);
2907- findText.lpstrText = g_sHighlightString.c_str ();
2908- while (Scintilla ().FindText (g_searchFlags, &findText) >= 0 )
2909- {
2910- Scintilla ().IndicatorFillRange (findText.chrgText .cpMin , findText.chrgText .cpMax - findText.chrgText .cpMin );
2911- if (findText.chrg .cpMin >= findText.chrgText .cpMax )
2912- break ;
2913- findText.chrg .cpMin = findText.chrgText .cpMax ;
2914- }
2915-
2916- if (g_lastSelText.empty () || g_lastSelText.compare (g_sHighlightString) || (g_searchFlags != g_lastSearchFlags))
2905+ else
29172906 {
2918- DocScrollClear (DOCSCROLLTYPE_SEARCHTEXT);
2919- g_searchMarkerCount = 0 ;
2920- findText.chrg .cpMin = 0 ;
2921- findText.chrg .cpMax = static_cast <Sci_PositionCR>(Scintilla ().Length ());
2922- findText.lpstrText = g_sHighlightString.c_str ();
2907+ Sci_TextToFind findText = {0 };
2908+ findText.chrg .cpMin = static_cast <Sci_PositionCR>(startStylePos);
2909+ findText.chrg .cpMax = static_cast <Sci_PositionCR>(endStylePos);
2910+ findText.lpstrText = g_sHighlightString.c_str ();
29232911 while (Scintilla ().FindText (g_searchFlags, &findText) >= 0 )
29242912 {
2925- size_t line = Scintilla ().LineFromPosition (findText.chrgText .cpMin );
2926- DocScrollAddLineColor (DOCSCROLLTYPE_SEARCHTEXT, line, RGB (200 , 200 , 0 ));
2927- ++g_searchMarkerCount;
2913+ Scintilla ().IndicatorFillRange (findText.chrgText .cpMin , findText.chrgText .cpMax - findText.chrgText .cpMin );
29282914 if (findText.chrg .cpMin >= findText.chrgText .cpMax )
29292915 break ;
29302916 findText.chrg .cpMin = findText.chrgText .cpMax ;
29312917 }
2918+
2919+ if (g_lastSelText.empty () || g_lastSelText.compare (g_sHighlightString) || (g_searchFlags != g_lastSearchFlags))
2920+ {
2921+ DocScrollClear (DOCSCROLLTYPE_SEARCHTEXT);
2922+ g_searchMarkerCount = 0 ;
2923+ findText.chrg .cpMin = 0 ;
2924+ findText.chrg .cpMax = static_cast <Sci_PositionCR>(Scintilla ().Length ());
2925+ findText.lpstrText = g_sHighlightString.c_str ();
2926+ while (Scintilla ().FindText (g_searchFlags, &findText) >= 0 )
2927+ {
2928+ size_t line = Scintilla ().LineFromPosition (findText.chrgText .cpMin );
2929+ DocScrollAddLineColor (DOCSCROLLTYPE_SEARCHTEXT, line, RGB (200 , 200 , 0 ));
2930+ ++g_searchMarkerCount;
2931+ if (findText.chrg .cpMin >= findText.chrgText .cpMax )
2932+ break ;
2933+ findText.chrg .cpMin = findText.chrgText .cpMax ;
2934+ }
2935+ g_lastSelText = g_sHighlightString;
2936+ g_lastSearchFlags = g_searchFlags;
2937+ DocScrollUpdate ();
2938+ }
29322939 g_lastSelText = g_sHighlightString;
29332940 g_lastSearchFlags = g_searchFlags;
2934- DocScrollUpdate ();
29352941 }
2936- g_lastSelText = g_sHighlightString;
2937- g_lastSearchFlags = g_searchFlags;
2942+ for (uptr_t i = INDIC_CUSTOM_MARK_1; i <= INDIC_CUSTOM_MARK_4; ++i)
2943+ {
2944+ Scintilla ().SetIndicatorCurrent (i);
2945+ Scintilla ().IndicatorClearRange (startStylePos, len);
2946+ Scintilla ().IndicatorClearRange (startStylePos, len - 1 );
2947+
2948+ auto sHighlightString = g_sCustomHighlightStrings[i - INDIC_CUSTOM_MARK_1];
2949+ auto sLastHighlightString = g_sLastCustomHighlightStrings[i - INDIC_CUSTOM_MARK_1];
2950+ Sci_TextToFind findText = {0 };
2951+ findText.chrg .cpMin = static_cast <Sci_PositionCR>(startStylePos);
2952+ findText.chrg .cpMax = static_cast <Sci_PositionCR>(endStylePos);
2953+ findText.lpstrText = sHighlightString .c_str ();
2954+ while (Scintilla ().FindText (Scintilla::FindOption::None, &findText) >= 0 )
2955+ {
2956+ Scintilla ().IndicatorFillRange (findText.chrgText .cpMin , findText.chrgText .cpMax - findText.chrgText .cpMin );
2957+ if (findText.chrg .cpMin >= findText.chrgText .cpMax )
2958+ break ;
2959+ findText.chrg .cpMin = findText.chrgText .cpMax ;
2960+ }
2961+
2962+ if (sLastHighlightString .empty () || sLastHighlightString .compare (sHighlightString ))
2963+ {
2964+ auto docScrollType = DOCSCROLLTYPE_CUSTOMMARK_1 + (i - INDIC_CUSTOM_MARK_1);
2965+ DocScrollClear (docScrollType);
2966+ if (sHighlightString .empty ())
2967+ continue ;
2968+ findText.chrg .cpMin = 0 ;
2969+ findText.chrg .cpMax = static_cast <Sci_PositionCR>(Scintilla ().Length ());
2970+ findText.lpstrText = sHighlightString .c_str ();
2971+ while (Scintilla ().FindText (Scintilla::FindOption::None, &findText) >= 0 )
2972+ {
2973+ size_t line = Scintilla ().LineFromPosition (findText.chrgText .cpMin );
2974+ DocScrollAddLineColor (docScrollType, line,
2975+ CTheme::Instance ().GetThemeColor (customMarkColors[i - INDIC_CUSTOM_MARK_1]));
2976+ if (findText.chrg .cpMin >= findText.chrgText .cpMax )
2977+ break ;
2978+ findText.chrg .cpMin = findText.chrgText .cpMax ;
2979+ }
2980+ g_sLastCustomHighlightStrings[i - INDIC_CUSTOM_MARK_1] = sHighlightString ;
2981+ DocScrollUpdate ();
2982+ }
2983+ }
29382984 }
29392985}
29402986
@@ -2943,6 +2989,8 @@ void CCmdFindReplace::TabNotify(TBHDR* ptbHdr)
29432989 if (ptbHdr->hdr .code == TCN_SELCHANGE)
29442990 {
29452991 g_lastSelText.clear ();
2992+ for (size_t i = 0 ; i < g_sLastCustomHighlightStrings.size (); ++i)
2993+ g_sLastCustomHighlightStrings[i].clear ();
29462994 if (g_pFindReplaceDlg != nullptr )
29472995 {
29482996 bool followTab = IsDlgButtonChecked (*g_pFindReplaceDlg, IDC_SEARCHFOLDERFOLLOWTAB) == BST_CHECKED;
@@ -3139,6 +3187,45 @@ bool CCmdFindFile::Execute()
31393187 return true ;
31403188}
31413189
3190+ bool CCmdCustomMark1::Execute ()
3191+ {
3192+ g_sCustomHighlightStrings[0 ] = GetSelectedText (SelectionHandling::None);
3193+ g_sLastCustomHighlightStrings[0 ].clear ();
3194+ DocScrollUpdate ();
3195+ return true ;
3196+ }
3197+ bool CCmdCustomMark2::Execute ()
3198+ {
3199+ g_sCustomHighlightStrings[1 ] = GetSelectedText (SelectionHandling::None);
3200+ g_sLastCustomHighlightStrings[1 ].clear ();
3201+ DocScrollUpdate ();
3202+ return true ;
3203+ }
3204+ bool CCmdCustomMark3::Execute ()
3205+ {
3206+ g_sCustomHighlightStrings[2 ] = GetSelectedText (SelectionHandling::None);
3207+ g_sLastCustomHighlightStrings[2 ].clear ();
3208+ DocScrollUpdate ();
3209+ return true ;
3210+ }
3211+ bool CCmdCustomMark4::Execute ()
3212+ {
3213+ g_sCustomHighlightStrings[3 ] = GetSelectedText (SelectionHandling::None);
3214+ g_sLastCustomHighlightStrings[3 ].clear ();
3215+ DocScrollUpdate ();
3216+ return true ;
3217+ }
3218+ bool CCmdCustomMarkClearAll::Execute ()
3219+ {
3220+ for (size_t i = 0 ; i < g_sCustomHighlightStrings.size (); ++i)
3221+ {
3222+ g_sCustomHighlightStrings[i].clear ();
3223+ g_sLastCustomHighlightStrings[i].clear ();
3224+ }
3225+ DocScrollUpdate ();
3226+ return true ;
3227+ }
3228+
31423229void findReplaceFinish ()
31433230{
31443231 g_pFindReplaceDlg.reset ();
0 commit comments