From e10375fdcc94f77d955bbb50004c2e3e7bc74891 Mon Sep 17 00:00:00 2001 From: Rainer Kottenhoff Date: Fri, 8 Dec 2017 00:27:12 +0100 Subject: [PATCH] + feature: enhanced URL Hotspot highlighting --- src/Edit.c | 89 +++++++++++++++---------------- src/Edit.h | 4 +- src/Helpers.c | 4 +- src/Notepad3.c | 30 ++++++++--- src/Notepad3.rc | Bin 183960 -> 184140 bytes src/SciCall.h | 3 ++ src/Styles.c | 138 ++++++++++++++++++++++++++++++------------------ src/Styles.h | 4 +- 8 files changed, 161 insertions(+), 111 deletions(-) diff --git a/src/Edit.c b/src/Edit.c index da2cefd8a..34050fa6f 100644 --- a/src/Edit.c +++ b/src/Edit.c @@ -322,7 +322,7 @@ BOOL EditConvertText(HWND hwnd,int encSource,int encDest,BOOL bSetSavePoint) if (!(Encoding_IsValid(encSource) && Encoding_IsValid(encDest))) return(FALSE); - length = (int)SendMessage(hwnd,SCI_GETTEXTLENGTH,0,0); + length = SciCall_GetTextLength(); if (length == 0) { @@ -395,7 +395,7 @@ BOOL EditSetNewEncoding(HWND hwnd,int iNewEncoding,BOOL bNoUI,BOOL bSetSavePoint //return FALSE; // commented out ? : allow conversion between arbitrary encodings //} - if (SendMessage(hwnd, SCI_GETTEXTLENGTH, 0, 0) == 0) { + if (SciCall_GetTextLength() == 0) { BOOL bIsEmptyUndoHistory = (SendMessage(hwnd, SCI_CANUNDO, 0, 0) == 0 && SendMessage(hwnd, SCI_CANREDO, 0, 0) == 0); @@ -625,7 +625,7 @@ BOOL EditCopyAppend(HWND hwnd) } } else { - int cchText = (int)SendMessage(hwnd,SCI_GETTEXTLENGTH,0,0); + int cchText = SciCall_GetTextLength(); pszText = LocalAlloc(LPTR,cchText + 1); SendMessage(hwnd,SCI_GETTEXT,(int)LocalSize(pszText),(LPARAM)pszText); } @@ -1048,7 +1048,7 @@ BOOL EditSaveFile( EditStripTrailingBlanks(hwnd,TRUE); // get text - cbData = (int)SendMessage(hwnd,SCI_GETTEXTLENGTH,0,0); + cbData = SciCall_GetTextLength(); lpData = GlobalAlloc(GPTR, cbData + 4); //fix: +bom SendMessage(hwnd,SCI_GETTEXT,GlobalSize(lpData),(LPARAM)lpData); @@ -2173,8 +2173,7 @@ void EditMoveUp(HWND hwnd) SendMessage(hwnd,SCI_INSERTTEXT,(WPARAM)iLineDestStart,(LPARAM)chaEOL); SendMessage(hwnd,SCI_SETTARGETSTART,(WPARAM) SendMessage(hwnd,SCI_GETLINEENDPOSITION,(WPARAM)iLineDest,0),0); - SendMessage(hwnd,SCI_SETTARGETEND,(WPARAM) - SendMessage(hwnd,SCI_GETTEXTLENGTH,0,0),0); + SendMessage(hwnd,SCI_SETTARGETEND,(WPARAM)SciCall_GetTextLength(),0); SendMessage(hwnd,SCI_REPLACETARGET,0,(LPARAM)""); } @@ -2284,8 +2283,7 @@ void EditMoveDown(HWND hwnd) SendMessage(hwnd,SCI_SETTARGETSTART,(WPARAM) SendMessage(hwnd,SCI_GETLINEENDPOSITION,(WPARAM) SendMessage(hwnd,SCI_GETLINECOUNT,0,0)-2,0),0); - SendMessage(hwnd,SCI_SETTARGETEND,(WPARAM) - SendMessage(hwnd,SCI_GETTEXTLENGTH,0,0),0); + SendMessage(hwnd,SCI_SETTARGETEND,(WPARAM)SciCall_GetTextLength(),0); SendMessage(hwnd,SCI_REPLACETARGET,0,(LPARAM)""); } @@ -2333,7 +2331,7 @@ void EditModifyLines(HWND hwnd,LPCWSTR pwszPrefix,LPCWSTR pwszAppend) //if (iSelStart == iSelEnd) { // iSelStart = 0; - // iSelEnd = SendMessage(hwnd,SCI_GETTEXTLENGTH,0,0); + // iSelEnd = SciCall_GetTextLength(); //} UINT mbcp = Encoding_SciGetCodePage(hwnd); @@ -3187,7 +3185,7 @@ void EditStripFirstCharacter(HWND hwnd) if (iSelStart == iSelEnd) { iSelStart = 0; - iSelEnd = (int)SendMessage(hwnd,SCI_GETTEXTLENGTH,0,0); + iSelEnd = SciCall_GetTextLength(); } if (SC_SEL_RECTANGLE != SendMessage(hwnd,SCI_GETSELECTIONMODE,0,0)) @@ -3234,7 +3232,7 @@ void EditStripLastCharacter(HWND hwnd) if (iSelStart == iSelEnd) { iSelStart = 0; - iSelEnd = (int)SendMessage(hwnd,SCI_GETTEXTLENGTH,0,0); + iSelEnd = SciCall_GetTextLength(); } if (SC_SEL_RECTANGLE != SendMessage(hwnd,SCI_GETSELECTIONMODE,0,0)) @@ -3340,7 +3338,7 @@ void EditCompressSpaces(HWND hwnd) int iAnchorPos = (int)SendMessage(hwnd,SCI_GETANCHOR,0,0); int iLineStart = (int)SendMessage(hwnd,SCI_LINEFROMPOSITION,(WPARAM)iSelStart,0); int iLineEnd = (int)SendMessage(hwnd,SCI_LINEFROMPOSITION,(WPARAM)iSelEnd,0); - int iLength = (int)SendMessage(hwnd,SCI_GETTEXTLENGTH,0,0); + int iLength = SciCall_GetTextLength(); char* pszIn; char* pszOut; @@ -3437,7 +3435,7 @@ void EditRemoveBlankLines(HWND hwnd,BOOL bMerge) if (iSelStart == iSelEnd) { iSelStart = 0; - iSelEnd = (int)SendMessage(hwnd,SCI_GETTEXTLENGTH,0,0); + iSelEnd = SciCall_GetTextLength(); } if (SC_SEL_RECTANGLE != SendMessage(hwnd,SCI_GETSELECTIONMODE,0,0)) @@ -4200,7 +4198,7 @@ void EditSelectEx(HWND hwnd,int iAnchorPos,int iCurrentPos) // void EditFixPositions(HWND hwnd) { - int iMaxPos = (int)SendMessage(hwnd,SCI_GETTEXTLENGTH,0,0); + int iMaxPos = SciCall_GetTextLength(); int iCurrentPos = (int)SendMessage(hwnd,SCI_GETCURRENTPOS,0,0); int iAnchorPos = (int)SendMessage(hwnd,SCI_GETANCHOR,0,0); @@ -4274,7 +4272,7 @@ void EditGetExcerpt(HWND hwnd,LPWSTR lpszExcerpt,DWORD cchExcerpt) tr.chrg.cpMax = min(SendMessage(hwnd,SCI_GETLINEENDPOSITION,(WPARAM)iLine,0),(LONG)(tr.chrg.cpMin + COUNTOF(tch))); }*/ - tr.chrg.cpMax = min((int)SendMessage(hwnd,SCI_GETTEXTLENGTH,0,0),tr.chrg.cpMax); + tr.chrg.cpMax = min(SciCall_GetTextLength(),tr.chrg.cpMax); pszText = LocalAlloc(LPTR,(tr.chrg.cpMax - tr.chrg.cpMin)+2); pszTextW = LocalAlloc(LPTR,((tr.chrg.cpMax - tr.chrg.cpMin)*2)+2); @@ -4486,7 +4484,7 @@ RegExResult_t __fastcall EditFindHasMatch(HWND hwnd, LPCEDITFINDREPLACE lpefr, B int slen = EditGetFindStrg(hwnd, lpefr, szFind, COUNTOF(szFind)); int start = bFirstMatchOnly ? (int)SendMessage(hwnd, SCI_GETSELECTIONNSTART, 0, 0) : 0; - int end = (int)SendMessage(hwnd, SCI_GETTEXTLENGTH, 0, 0); + int end = SciCall_GetTextLength(); int iPos = EditFindInTarget(hwnd, szFind, slen, (int)(lpefr->fuFlags), &start, &end, FALSE); @@ -5242,7 +5240,7 @@ BOOL EditFindNext(HWND hwnd, LPCEDITFINDREPLACE lpefr, BOOL bExtendSelection) { if (slen <= 0) return FALSE; - int iTextLength = (int)SendMessage(hwnd, SCI_GETTEXTLENGTH, 0, 0); + int iTextLength = SciCall_GetTextLength(); int start = (int)SendMessage(hwnd, SCI_GETSELECTIONEND, 0, 0); int end = iTextLength; @@ -5309,7 +5307,7 @@ BOOL EditFindPrev(HWND hwnd, LPCEDITFINDREPLACE lpefr, BOOL bExtendSelection) { if (slen <= 0) return FALSE; - int iTextLength = (int)SendMessage(hwnd, SCI_GETTEXTLENGTH, 0, 0); + int iTextLength = SciCall_GetTextLength(); int start = max(0, (int)SendMessage(hwnd, SCI_GETSELECTIONSTART, 0, 0)); int end = 0; @@ -5403,8 +5401,8 @@ BOOL EditReplace(HWND hwnd, LPCEDITFINDREPLACE lpefr) { // w/o selection, replacement string is put into current position // but this mayby not intended here if ((BOOL)SendMessage(hwnd, SCI_GETSELECTIONEMPTY, 0, 0)) { - int start = (int)SendMessage(hwnd, SCI_GETCURRENTPOS, 0, 0); - int end = (int)SendMessage(hwnd, SCI_GETTEXTLENGTH, start, 0); + int start = SciCall_GetCurrentPos(); + int end = SciCall_GetTextLength(); int _start = start; int iPos = EditFindInTarget(hwnd, lpefr->szFind, StringCchLenA(lpefr->szFind, FNDRPL_BUFFER), @@ -5512,7 +5510,7 @@ int EditReplaceAllInRange(HWND hwnd, LPCEDITFINDREPLACE lpefr, BOOL bShowInfo, i BOOL EditReplaceAll(HWND hwnd,LPCEDITFINDREPLACE lpefr,BOOL bShowInfo) { int start = 0; - int end = (int)SendMessage(hwnd, SCI_GETTEXTLENGTH, 0, 0); + int end = SciCall_GetTextLength(); int token = BeginSelUndoAction(); @@ -5585,7 +5583,7 @@ void EditMarkAll(HWND hwnd, char* pszFind, int flags, BOOL bMatchCase, BOOL bMat { EditClearAllMarks(hwnd); - int iTextLength = (int)SendMessage(hwnd, SCI_GETTEXTLENGTH, 0, 0); + int iTextLength = SciCall_GetTextLength(); int iFindLength = 0; char* pszText = pszFind; @@ -5700,7 +5698,7 @@ void EditCompleteWord(HWND hwnd, BOOL autoInsert) { LocalFree(pLine); int iRootLen = StringCchLenA(pRoot, cnt + 1); - int iTextLength = (int)SendMessage(hwnd, SCI_GETTEXTLENGTH, 0, 0); + int iTextLength = SciCall_GetTextLength(); int start = 0; int end = iTextLength; @@ -5798,7 +5796,7 @@ void EditCompleteWord(HWND hwnd, BOOL autoInsert) { // EditUpdateUrlHotspots() // Find and mark all URL hot-spots // -void EditUpdateUrlHotspots(HWND hwnd, tPos startPos, tPos endPos) +void EditUpdateUrlHotspots(HWND hwnd, int startPos, int endPos) { const char* pszUrlRegEx = "\\b(?:(?:https?|ftp|file)://|www\\.|ftp\\.)" "(?:\\([-A-Z0-9+&@#/%=~_|$?!:,.]*\\)|[-A-Z0-9+&@#/%=~_|$?!:,.])*" @@ -5806,36 +5804,32 @@ void EditUpdateUrlHotspots(HWND hwnd, tPos startPos, tPos endPos) const int iRegExLen = (int)strlen(pszUrlRegEx); - tPos posCurr = (tPos)SendMessage(hwnd, SCI_GETCURRENTPOS, 0, 0); - tPos posTextLength = (tPos)SendMessage(hwnd, SCI_GETTEXTLENGTH, 0, 0); - - if ((startPos < 0) || (startPos >= posTextLength)) - { - tPos cln = (tPos)SendMessage(hwnd, SCI_LINEFROMPOSITION, posCurr, 0); - startPos = (tPos)SendMessage(hwnd, SCI_POSITIONFROMLINE, cln-1, 0); + if (endPos < startPos) { + int tmp = startPos; startPos = endPos; endPos = tmp; // swap } - if ((endPos < 0) || (endPos >= posTextLength)) { - tPos cln = (tPos)SendMessage(hwnd, SCI_LINEFROMPOSITION, posCurr, 0); - endPos = (tPos)SendMessage(hwnd, SCI_GETLINEENDPOSITION, cln+1, 0); + if (startPos < 0) { // current line only + int currPos = SciCall_GetCurrentPos(); + int lineNo = SciCall_LineFromPosition(currPos); + startPos = SciCall_PositionFromLine(lineNo); + endPos = (int)SendMessage(hwnd, SCI_GETLINEENDPOSITION, lineNo, 0); } - int start = (int)startPos; - int end = (int)endPos; - int flags = SCFIND_NP3_REGEX; - + int start = startPos; + int end = endPos; while (TRUE) { - int iPos = EditFindInTarget(hwnd, pszUrlRegEx, iRegExLen, flags, &start, &end, (end == start)); + int iPos = EditFindInTarget(hwnd, pszUrlRegEx, iRegExLen, SCFIND_NP3_REGEX, &start, &end, (end == start)); if (iPos < 0) break; // not found // mark this match SendMessage(hwnd, SCI_STARTSTYLING, iPos, 0); - SendMessage(hwnd, SCI_SETSTYLING, (end - start), STYLE_NP3_ID_HOTSPOT); + SendMessage(hwnd, SCI_SETSTYLING, (end - start), Style_GetHotspotID(hwnd)); + // next occurrence start = end; - end = (int)endPos; + end = endPos; if (start >= end) break; @@ -5884,15 +5878,16 @@ BOOL __fastcall EditHighlightIfBrace(HWND hwnd, int iPos) { // // EditMatchBrace() // -void EditMatchBrace(HWND hwnd) { - int iEndStyled = (int)SendMessage(hwnd, SCI_GETENDSTYLED, 0, 0); - if (iEndStyled < (int)SendMessage(hwnd, SCI_GETTEXTLENGTH, 0, 0)) { - int iLine = (int)SendMessage(hwnd, SCI_LINEFROMPOSITION, iEndStyled, 0); - int iEndStyled2 = (int)SendMessage(hwnd, SCI_POSITIONFROMLINE, iLine, 0); +void EditMatchBrace(HWND hwnd) +{ + int iEndStyled = SciCall_GetEndStyled(); + if (iEndStyled < SciCall_GetTextLength()) { + int iLine = SciCall_LineFromPosition(iEndStyled); + int iEndStyled2 = SciCall_PositionFromLine(iLine); SendMessage(hwnd, SCI_COLOURISE, iEndStyled2, -1); } - int iPos = (int)SendMessage(hwnd, SCI_GETCURRENTPOS, 0, 0); + int iPos = SciCall_GetCurrentPos(); if (!EditHighlightIfBrace(hwnd, iPos)) { // try one before diff --git a/src/Edit.h b/src/Edit.h index e24791d15..322b1f48e 100644 --- a/src/Edit.h +++ b/src/Edit.h @@ -56,8 +56,6 @@ typedef struct _editfindreplace #define INDIC_NP3_MATCH_BRACE 2 #define INDIC_NP3_BAD_BRACE 3 -#define STYLE_NP3_ID_HOTSPOT 222 - HWND EditCreate(HWND); void EditInitWordDelimiter(HWND); @@ -127,7 +125,7 @@ void EditPrintInit(); void EditMatchBrace(HWND); void EditClearAllMarks(HWND); void EditMarkAll(HWND,char*,int,BOOL,BOOL); -void EditUpdateUrlHotspots(HWND, tPos, tPos); +void EditUpdateUrlHotspots(HWND, int, int); void EditSetAccelWordNav(HWND,BOOL); void EditCompleteWord(HWND,BOOL); void EditGetBookmarkList(HWND,LPWSTR,int); diff --git a/src/Helpers.c b/src/Helpers.c index 6fe5995a3..1da2665da 100644 --- a/src/Helpers.c +++ b/src/Helpers.c @@ -6,8 +6,8 @@ * Helpers.c * * General helper functions * * Based on code from Notepad2, (c) Florian Balmer 1996-2011 * -* Parts taken from SciTE, (c) Neil Hodgson * -* MinimizeToTray, (c) 2000 Matthew Ellis * +* Parts taken from SciTE, (c) Neil Hodgson * +* MinimizeToTray, (c) 2000 Matthew Ellis * * * * (c) Rizonesoft 2008-2016 * * https://rizonesoft.com * diff --git a/src/Notepad3.c b/src/Notepad3.c index 276960862..a47d95de5 100644 --- a/src/Notepad3.c +++ b/src/Notepad3.c @@ -4008,6 +4008,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) Style_SelectLexerDlg(hwndEdit); UpdateStatusbar(); UpdateLineNumberWidth(); + EditUpdateUrlHotspots(hwndEdit, 0, SciCall_GetTextLength()); break; @@ -4015,6 +4016,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) Style_ToggleUse2ndDefault(hwndEdit); UpdateStatusbar(); UpdateLineNumberWidth(); + EditUpdateUrlHotspots(hwndEdit, 0, SciCall_GetTextLength()); break; @@ -4022,6 +4024,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) Style_ConfigDlg(hwndEdit); UpdateStatusbar(); UpdateLineNumberWidth(); + EditUpdateUrlHotspots(hwndEdit, 0, SciCall_GetTextLength()); break; @@ -4029,6 +4032,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) Style_SetDefaultFont(hwndEdit); UpdateStatusbar(); UpdateLineNumberWidth(); + EditUpdateUrlHotspots(hwndEdit, 0, SciCall_GetTextLength()); break; @@ -4281,7 +4285,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) case IDM_VIEW_HILITECURRENTLINE: bHiliteCurrentLine = (bHiliteCurrentLine) ? FALSE : TRUE; - Style_SetCurrentLineBackground(hwndEdit); + Style_SetCurrentLineBackground(hwndEdit, bHiliteCurrentLine); break; @@ -5360,11 +5364,11 @@ void OpenHotSpotURL(tPos position) // get right most position of style pos = position; iNewStyle = iStyle; - tPos posTextLength = (tPos)SendMessage(hwndEdit, SCI_GETTEXTLENGTH, 0, 0); + tPos posTextLength = (tPos)SciCall_GetTextLength(); while ((iNewStyle == iStyle) && (++pos < posTextLength)) { iNewStyle = (int)SendMessage(hwndEdit, SCI_GETSTYLEAT, pos, 0); } - tPos lastPos = (pos - 1); + tPos lastPos = pos; tPos length = lastPos - firstPos; @@ -5450,7 +5454,16 @@ LRESULT MsgNotify(HWND hwnd,WPARAM wParam,LPARAM lParam) UpdateToolbar(); UpdateStatusbar(); } - break; + break; // fall-through -> too slow + + case SCN_STYLENEEDED: // needs SCI_SETLEXER(SCLEX_CONTAINER) + { + int startPos = SciCall_GetEndStyled(); + int lineNumber = SciCall_LineFromPosition(startPos); + startPos = SciCall_PositionFromLine(lineNumber); + EditUpdateUrlHotspots(hwndEdit, startPos, (int)scn->position); + } + break; case SCN_CHARADDED: // Auto indent @@ -5602,7 +5615,6 @@ LRESULT MsgNotify(HWND hwnd,WPARAM wParam,LPARAM lParam) } } if (scn->linesAdded != 0) { - EditUpdateUrlHotspots(hwndEdit, -1, -1); UpdateLineNumberWidth(); } bModified = TRUE; @@ -5615,6 +5627,7 @@ LRESULT MsgNotify(HWND hwnd,WPARAM wParam,LPARAM lParam) case SCN_SAVEPOINTREACHED: bModified = FALSE; UpdateToolbar(); + EditUpdateUrlHotspots(hwndEdit, 0, SciCall_GetTextLength()); break; case SCN_MARGINCLICK: @@ -7406,6 +7419,7 @@ BOOL FileLoad(BOOL bDontSave,BOOL bNew,BOOL bReload,BOOL bNoEncDetect,LPCWSTR lp UpdateToolbar(); UpdateStatusbar(); UpdateLineNumberWidth(); + EditUpdateUrlHotspots(hwndEdit, 0, SciCall_GetTextLength()); // Terminate file watching if (bResetFileWatching) @@ -7535,7 +7549,7 @@ BOOL FileLoad(BOOL bDontSave,BOOL bNew,BOOL bReload,BOOL bNoEncDetect,LPCWSTR lp InstallFileWatching(szCurFile); // the .LOG feature ... - if (SendMessage(hwndEdit,SCI_GETTEXTLENGTH,0,0) >= 4) { + if (SciCall_GetTextLength() >= 4) { char tchLog[5] = { '\0' }; SendMessage(hwndEdit,SCI_GETTEXT,5,(LPARAM)tchLog); if (StringCchCompareXA(tchLog,".LOG") == 0) { @@ -7564,8 +7578,7 @@ BOOL FileLoad(BOOL bDontSave,BOOL bNew,BOOL bReload,BOOL bNoEncDetect,LPCWSTR lp UpdateToolbar(); UpdateStatusbar(); UpdateLineNumberWidth(); - - EditUpdateUrlHotspots(hwndEdit, 0, (tPos)SendMessage(hwndEdit, SCI_GETTEXTLENGTH, 0, 0) - 1); + EditUpdateUrlHotspots(hwndEdit, 0, SciCall_GetTextLength()); // consistent settings file handling (if loaded in editor) bEnableSaveSettings = (StringCchCompareINW(szCurFile, COUNTOF(szCurFile), szIniFile, COUNTOF(szIniFile)) == 0) ? FALSE : TRUE; @@ -7733,6 +7746,7 @@ BOOL FileSave(BOOL bSaveAlways,BOOL bAsk,BOOL bSaveAs,BOOL bSaveCopy) Style_SetLexerFromFile(hwndEdit,szCurFile); UpdateStatusbar(); UpdateLineNumberWidth(); + EditUpdateUrlHotspots(hwndEdit, 0, SciCall_GetTextLength()); } else { StringCchCopy(tchLastSaveCopyDir,COUNTOF(tchLastSaveCopyDir),tchFile); diff --git a/src/Notepad3.rc b/src/Notepad3.rc index 29cd5110fd8f555921a7c0b79779d26beab22d30..e67679e5c7e5de65fe4bb4545d68cca6290bcf49 100644 GIT binary patch delta 101 zcmbO+m;1~-?uHh|Elj75P7gTBBrx46mq|-Flp%=0he3hCgCU=xgrS(BfFXbS#6~93 p=?ji9u}n8v$fPyBp_hq66pK2BlIe-3fGVv{Gf8d#bd+fs2LL<|9-;sM delta 24 gcmX>zk9)>k?uHh|Elj75PUos&;@jSHjOhRe0E0dX00000 diff --git a/src/SciCall.h b/src/SciCall.h index 6c1dc2cf4..eff3c7574 100644 --- a/src/SciCall.h +++ b/src/SciCall.h @@ -83,11 +83,14 @@ __forceinline LRESULT SciCall_##fn(type1 var1, type2 var2) { \ // // DeclareSciCallR0(GetLineCount, GETLINECOUNT, int); +DeclareSciCallR0(GetTextLength, GETTEXTLENGTH, int); DeclareSciCallV2(SetSel, SETSEL, int, anchorPos, int, currentPos); DeclareSciCallV1(GotoPos, GOTOPOS, int, position); DeclareSciCallV1(GotoLine, GOTOLINE, int, line); DeclareSciCallR0(GetCurrentPos, GETCURRENTPOS, int); DeclareSciCallR1(LineFromPosition, LINEFROMPOSITION, int, Sci_Position, position); +DeclareSciCallR1(PositionFromLine, POSITIONFROMLINE, int, Sci_Position, line); +DeclareSciCallR0(GetEndStyled, GETENDSTYLED, int); //============================================================================= diff --git a/src/Styles.c b/src/Styles.c index a8b807fe2..97770e931 100644 --- a/src/Styles.c +++ b/src/Styles.c @@ -71,25 +71,26 @@ EDITLEXER lexDefault = { SCLEX_NULL, 63000, L"Default Text", L"txt; text; wtx; /* 11 */ { SCI_SETEXTRAASCENT+SCI_SETEXTRADESCENT, 63111, L"Extra Line Spacing (Size)", L"size:2", L"" }, /* 12 */ { SCI_MARKERSETBACK+SCI_MARKERSETALPHA, 63124, L"Book Marks (Colors)", L"back:#00FF00; alpha:20", L"" }, /* 13 */ { SCI_MARKERSETBACK+SCI_MARKERSETALPHA, 63262, L"Mark Occurrences (Colors)", L"", L"" }, - - /* 14 */ { STYLE_DEFAULT, 63112, L"2nd Default Style", L"font:Courier New; size:10", L"" }, - /* 15 */ { STYLE_LINENUMBER, 63113, L"2nd Margins and Line Numbers", L"font:Tahoma; size:-2; fore:#FF0000", L"" }, - /* 16 */ { STYLE_BRACELIGHT, 63114, L"2nd Matching Braces", L"bold; fore:#FF0000", L"" }, - /* 17 */ { STYLE_BRACEBAD, 63115, L"2nd Matching Braces Error", L"bold; fore:#000080", L"" }, - /* 18 */ { STYLE_CONTROLCHAR, 63116, L"2nd Control Characters (Font)", L"size:-1", L"" }, - /* 19 */ { STYLE_INDENTGUIDE, 63117, L"2nd Indentation Guide (Color)", L"fore:#A0A0A0", L"" }, - /* 20 */ { SCI_SETSELFORE+SCI_SETSELBACK, 63118, L"2nd Selected Text (Colors)", L"eolfilled", L"" }, - /* 21 */ { SCI_SETWHITESPACEFORE+SCI_SETWHITESPACEBACK+SCI_SETWHITESPACESIZE, 63119, L"2nd Whitespace (Colors, Size 0-5)", L"fore:#FF4000", L"" }, - /* 22 */ { SCI_SETCARETLINEBACK, 63120, L"2nd Current Line Background (Color)", L"back:#FFFF00; alpha:50", L"" }, - /* 23 */ { SCI_SETCARETFORE+SCI_SETCARETWIDTH, 63121, L"2nd Caret (Color, Size 1-3)", L"", L"" }, - /* 24 */ { SCI_SETEDGECOLOUR, 63122, L"2nd Long Line Marker (Colors)", L"fore:#FFC000", L"" }, - /* 25 */ { SCI_SETEXTRAASCENT+SCI_SETEXTRADESCENT, 63123, L"2nd Extra Line Spacing (Size)", L"", L"" }, - /* 26 */ { SCI_MARKERSETBACK+SCI_MARKERSETALPHA, 63125, L"2nd Book Marks (Colors)", L"back:#00FF00; alpha:20", L"" }, - /* 27 */ { SCI_MARKERSETBACK+SCI_MARKERSETALPHA, 63263, L"2nd Mark Occurrences (Colors)", L"fore:#0x00FF00; alpha:100; alpha2:100", L"" }, + /* 14 */ { SCI_SETHOTSPOTACTIVEFORE, 63264, L"URL Hotspot", L"italics; fore:#0000FF", L"" }, + + /* 15 */ { STYLE_DEFAULT, 63112, L"2nd Default Style", L"font:Courier New; size:10", L"" }, + /* 16 */ { STYLE_LINENUMBER, 63113, L"2nd Margins and Line Numbers", L"font:Tahoma; size:-2; fore:#FF0000", L"" }, + /* 17 */ { STYLE_BRACELIGHT, 63114, L"2nd Matching Braces", L"bold; fore:#FF0000", L"" }, + /* 18 */ { STYLE_BRACEBAD, 63115, L"2nd Matching Braces Error", L"bold; fore:#000080", L"" }, + /* 19 */ { STYLE_CONTROLCHAR, 63116, L"2nd Control Characters (Font)", L"size:-1", L"" }, + /* 20 */ { STYLE_INDENTGUIDE, 63117, L"2nd Indentation Guide (Color)", L"fore:#A0A0A0", L"" }, + /* 21 */ { SCI_SETSELFORE + SCI_SETSELBACK, 63118, L"2nd Selected Text (Colors)", L"eolfilled", L"" }, + /* 22 */ { SCI_SETWHITESPACEFORE + SCI_SETWHITESPACEBACK + SCI_SETWHITESPACESIZE, 63119, L"2nd Whitespace (Colors, Size 0-5)", L"fore:#FF4000", L"" }, + /* 23 */ { SCI_SETCARETLINEBACK, 63120, L"2nd Current Line Background (Color)", L"back:#FFFF00; alpha:50", L"" }, + /* 24 */ { SCI_SETCARETFORE + SCI_SETCARETWIDTH, 63121, L"2nd Caret (Color, Size 1-3)", L"", L"" }, + /* 25 */ { SCI_SETEDGECOLOUR, 63122, L"2nd Long Line Marker (Colors)", L"fore:#FFC000", L"" }, + /* 26 */ { SCI_SETEXTRAASCENT + SCI_SETEXTRADESCENT, 63123, L"2nd Extra Line Spacing (Size)", L"", L"" }, + /* 27 */ { SCI_MARKERSETBACK+SCI_MARKERSETALPHA, 63125, L"2nd Book Marks (Colors)", L"back:#00FF00; alpha:20", L"" }, + /* 28 */ { SCI_MARKERSETBACK+SCI_MARKERSETALPHA, 63263, L"2nd Mark Occurrences (Colors)", L"fore:#0x00FF00; alpha:100; alpha2:100", L"" }, + /* 29 */ { SCI_SETHOTSPOTACTIVEFORE, 63265, L"2nd URL Hotspot", L"bold; fore:#FF0000", L"" }, { -1, 00000, L"", L"", L"" } } }; - enum LexDefaultStyles { STY_DEFAULT = 0, STY_MARGIN = 1, @@ -105,8 +106,9 @@ enum LexDefaultStyles { STY_X_LN_SPACE = 11, STY_BOOK_MARK = 12, STY_MARK_OCC = 13, + STY_URL_HOTSPOT = 14, - STY_CNT_LAST = 14 // STY_2ND_XXX = STY_XXX + STY_CNT_LAST + STY_CNT_LAST = 15 // STY_2ND_XXX = STY_XXX + STY_CNT_LAST }; @@ -3250,11 +3252,13 @@ void Style_SetLexer(HWND hwnd, PEDITLEXER pLexNew) { SendMessage(hwnd, SCI_INDICSETOUTLINEALPHA, INDIC_NP3_MARK_OCCURANCE, iValue); + // More default values... + if (pLexNew != &lexANSI) Style_SetStyles(hwnd, lexDefault.Styles[STY_CTRL_CHR + iIdx].iStyle, lexDefault.Styles[STY_CTRL_CHR + iIdx].szValue); // control char + Style_SetStyles(hwnd, lexDefault.Styles[STY_INDENT_GUIDE + iIdx].iStyle, lexDefault.Styles[STY_INDENT_GUIDE + iIdx].szValue); // indent guide - // More default values... if (Style_StrGetColor(TRUE, lexDefault.Styles[STY_SEL_TXT + iIdx].szValue, &rgb)) { // selection fore SendMessage(hwnd, SCI_SETSELFORE, TRUE, rgb); SendMessage(hwnd, SCI_SETADDITIONALSELFORE, rgb, 0); @@ -3326,24 +3330,8 @@ void Style_SetLexer(HWND hwnd, PEDITLEXER pLexNew) { } SendMessage(hwnd, SCI_SETWHITESPACESIZE, iValue, 0); - if (bHiliteCurrentLine) { - - if (Style_StrGetColor(FALSE, lexDefault.Styles[STY_CUR_LN_BCK + iIdx].szValue, &rgb)) // caret line back - { - SendMessage(hwnd, SCI_SETCARETLINEVISIBLE, TRUE, 0); - SendMessage(hwnd, SCI_SETCARETLINEBACK, rgb, 0); - - if (Style_StrGetAlpha(lexDefault.Styles[STY_CUR_LN_BCK + iIdx].szValue, &iValue, TRUE)) - SendMessage(hwnd, SCI_SETCARETLINEBACKALPHA, iValue, 0); - else - SendMessage(hwnd, SCI_SETCARETLINEBACKALPHA, SC_ALPHA_NOALPHA, 0); - } - else - SendMessage(hwnd, SCI_SETCARETLINEVISIBLE, FALSE, 0); - } - else - SendMessage(hwnd, SCI_SETCARETLINEVISIBLE, FALSE, 0); - + // current line background + Style_SetCurrentLineBackground(hwnd, bHiliteCurrentLine); // bookmark line or marker Style_SetCurrentMargin(hwnd, bShowSelectionMargin); @@ -3559,16 +3547,7 @@ void Style_SetLexer(HWND hwnd, PEDITLEXER pLexNew) { } } - // Hot Spot settings - SendMessage(hwnd, SCI_STYLESETFORE, STYLE_NP3_ID_HOTSPOT, (LPARAM)RGB(0, 0, 200)); - SendMessage(hwnd, SCI_STYLESETITALIC, STYLE_NP3_ID_HOTSPOT, (LPARAM)TRUE); - //SendMessage(hwnd, SCI_STYLESETUNDERLINE, iHotSpotStyle, (LPARAM)TRUE); - - SendMessage(hwnd, SCI_STYLESETHOTSPOT, STYLE_NP3_ID_HOTSPOT, (LPARAM)TRUE); - SendMessage(hwnd, SCI_SETHOTSPOTACTIVEFORE, TRUE, (LPARAM)RGB(0, 0, 255)); - SendMessage(hwnd, SCI_SETHOTSPOTACTIVEUNDERLINE, TRUE, 0); - SendMessage(hwnd, SCI_SETHOTSPOTSINGLELINE, TRUE, 0); - + Style_SetUrlHotSpot(hwnd, TRUE); SendMessage(hwnd,SCI_COLOURISE,0,(LPARAM)-1); @@ -3577,6 +3556,54 @@ void Style_SetLexer(HWND hwnd, PEDITLEXER pLexNew) { } +//============================================================================= +// +// Style_SetUrlHotSpot() +// +void Style_SetUrlHotSpot(HWND hwnd, BOOL bHotSpot) +{ + // Use 2nd default style ? + int iIdx = (bUse2ndDefaultStyle) ? STY_CNT_LAST : 0; + + // Hot Spot settings + const int iStyleHotSpot = (STY_URL_HOTSPOT + iIdx); + + if (bHotSpot) + { + const WCHAR* lpszStyleHotSpot = lexDefault.Styles[iStyleHotSpot].szValue; + + SendMessage(hwnd, SCI_STYLESETHOTSPOT, iStyleHotSpot, (LPARAM)TRUE); + SendMessage(hwnd, SCI_SETHOTSPOTSINGLELINE, TRUE, 0); + + // Font + Style_SetStyles(hwnd, iStyleHotSpot, lpszStyleHotSpot); + + //if (StrStrI(lpszStyleHotSpot, L"underline") != NULL) + // SendMessage(hwnd, SCI_SETHOTSPOTACTIVEUNDERLINE, TRUE, 0); + //else + // SendMessage(hwnd, SCI_SETHOTSPOTACTIVEUNDERLINE, FALSE, 0); + // Fore + SendMessage(hwnd, SCI_SETHOTSPOTACTIVEUNDERLINE, TRUE, 0); + + int rgb; + + if (Style_StrGetColor(TRUE, lpszStyleHotSpot, &rgb)) { + int inactiveFG = (int)((rgb * 75 + 50) / 100); + SendMessage(hwnd, SCI_STYLESETFORE, iStyleHotSpot, (LPARAM)inactiveFG); + SendMessage(hwnd, SCI_SETHOTSPOTACTIVEFORE, TRUE, (LPARAM)rgb); + } + // Back + if (Style_StrGetColor(FALSE, lpszStyleHotSpot, &rgb)) { + SendMessage(hwnd, SCI_STYLESETBACK, iStyleHotSpot, (LPARAM)rgb); + SendMessage(hwnd, SCI_SETHOTSPOTACTIVEBACK, TRUE, (LPARAM)rgb); + } + } + else + SendMessage(hwnd, SCI_STYLESETHOTSPOT, iStyleHotSpot, (LPARAM)FALSE); + +} + + //============================================================================= // // Style_SetLongLineColors() @@ -3607,12 +3634,13 @@ void Style_SetLongLineColors(HWND hwnd) // // Style_SetCurrentLineBackground() // -void Style_SetCurrentLineBackground(HWND hwnd) +void Style_SetCurrentLineBackground(HWND hwnd, BOOL bHiLitCurrLn) { - // Use 2nd default style - int iIdx = (bUse2ndDefaultStyle) ? STY_CNT_LAST : 0; + if (bHiLitCurrLn) { + + // Use 2nd default style ? + int iIdx = (bUse2ndDefaultStyle) ? STY_CNT_LAST : 0; - if (bHiliteCurrentLine) { int rgb = 0; if (Style_StrGetColor(FALSE,lexDefault.Styles[STY_CUR_LN_BCK + iIdx].szValue,&rgb)) // caret line back { @@ -5595,4 +5623,14 @@ void Style_SelectLexerDlg(HWND hwnd) } +//============================================================================= +// +// Style_GetHotspotID() +// +int Style_GetHotspotID(HWND hwnd) +{ + UNUSED(hwnd); + return (bUse2ndDefaultStyle ? (STY_URL_HOTSPOT + STY_CNT_LAST) : STY_URL_HOTSPOT); +} + // End of Styles.c diff --git a/src/Styles.h b/src/Styles.h index a079bc953..fd580e430 100644 --- a/src/Styles.h +++ b/src/Styles.h @@ -67,8 +67,9 @@ void Style_Save(); BOOL Style_Import(HWND); BOOL Style_Export(HWND); void Style_SetLexer(HWND,PEDITLEXER); +void Style_SetUrlHotSpot(HWND, BOOL); void Style_SetLongLineColors(HWND); -void Style_SetCurrentLineBackground(HWND); +void Style_SetCurrentLineBackground(HWND, BOOL); void Style_SetCurrentMargin(HWND, BOOL); void Style_SetLexerFromFile(HWND,LPCWSTR); void Style_SetLexerFromName(HWND,LPCWSTR,LPCWSTR); @@ -101,6 +102,7 @@ INT_PTR CALLBACK Styles_ConfigDlgProc(HWND,UINT,WPARAM,LPARAM); void Style_ConfigDlg(HWND); INT_PTR CALLBACK Style_SelectLexerDlgProc(HWND,UINT,WPARAM,LPARAM); void Style_SelectLexerDlg(HWND); +int Style_GetHotspotID(HWND); #endif //_NP3_STYLES_H_