diff --git a/Build/Changes.txt b/Build/Changes.txt
index 4c2f31ff8..59fec5858 100644
--- a/Build/Changes.txt
+++ b/Build/Changes.txt
@@ -2,6 +2,28 @@
Rizonesoft Notepad3 CHANGES
==================================================
+--------------------------------------------------
+Version 3.18.105.802 (5 January 2018)
+--------------------------------------------------
+- Fix: Custom toolbar images ini settings added.
+- Fix: Add hints for free text style properties in "Customize Schemes...".
+- Fix: Test version numbers for month Jan - Sep (mono digit).
+- Fix: Redundant echo of expected version string.
+- Fix: Toggle line comments were placed at line end.
+- Feature: (Mark Occurences) instant word highligting.
+- Added: Switch to draw all occurrences in visible area only.
+- Opt: Delayed mark all occurrences for better UI response.
+- Enhancement: Async mark all occurrences via timer (UI response).
+- Fix: "Match Current Word" should not highlight partial word matches in other lines.
+- Added: Hyperlink Hotspot Style updates on UpdateUI event (visible area only)
+- Fix: Fetching wrong visible document line number in case of hidden or wrapped lines.
+- Fix: Ignoring queued timer event, if timer has been killed.
+- Performance: Optimizing timer handling to avoid multiple calls of complex methods.
+- Fix: use current lexer's default text font size as base font size for relative sizing of other styles.
+- Performance: Fixed some issuses, which eat up CPU.
+- Fix: mark occurrences counter not updated in time.
+- Minor performance enhancements.
+
--------------------------------------------------
Version 3.17.1228.783 (28 December 2017)
--------------------------------------------------
diff --git a/Readme.md b/Readme.md
index c8e0c2bb4..26aef9b90 100644
--- a/Readme.md
+++ b/Readme.md
@@ -2,7 +2,6 @@
[](https://ci.appveyor.com/project/rizonesoft/notepad3/branch/master)
[](https://opensource.org/licenses/BSD-3-Clause)
-[](https://gratipay.com/Notepad3/)
[](https://www.paypal.me/rizonesoft)
Notepad3 is a fast and light-weight Scintilla-based text editor with syntax highlighting. It has a small memory footprint, but is powerful enough to handle most programming jobs. [Download Notepad3 here](https://www.rizonesoft.com/downloads/notepad3/).
diff --git a/Versions/build.txt b/Versions/build.txt
index 114370ffb..227b54a06 100644
--- a/Versions/build.txt
+++ b/Versions/build.txt
@@ -1 +1 @@
-795
+802
diff --git a/res/Notepad3.exe.manifest.conf b/res/Notepad3.exe.manifest.conf
index ceef685ba..067b6aea3 100644
--- a/res/Notepad3.exe.manifest.conf
+++ b/res/Notepad3.exe.manifest.conf
@@ -3,7 +3,7 @@
Notepad3
diff --git a/src/Edit.c b/src/Edit.c
index 5ae05e59e..62387d3e0 100644
--- a/src/Edit.c
+++ b/src/Edit.c
@@ -87,8 +87,10 @@ extern BOOL bAccelWordNavigation;
extern BOOL bDenyVirtualSpaceAccess;
extern BOOL bHyperlinkHotspot;
-extern int iMarkOccurrences;
-extern int iMarkOccurrencesCount;
+extern int iMarkOccurrences;
+extern int iMarkOccurrencesCount;
+extern int iMarkOccurrencesMaxCount;
+extern BOOL bMarkOccurrencesMatchVisible;
extern NP2ENCODING mEncoding[];
@@ -109,6 +111,13 @@ static char PunctuationCharsAccelerated[1] = { '\0' }; // empty!
//static WCHAR W_WhiteSpaceCharsAccelerated[DELIM_BUFFER] = { L'\0' };
+// Timer bitfield
+static volatile LONG g_lEditTimerBits = 0;
+#define TIMER_BIT_MARK_OCC 1L
+//#define TIMER_BIT_ONOTHER_TIMER 2L
+#define TEST_AND_SET(B) InterlockedBitTestAndSet(&g_lEditTimerBits, B)
+#define TEST_AND_RESET(B) InterlockedBitTestAndReset(&g_lEditTimerBits, B)
+
enum AlignMask {
ALIGN_LEFT = 0,
@@ -2455,18 +2464,6 @@ void EditModifyLines(HWND hwnd,LPCWSTR pwszPrefix,LPCWSTR pwszAppend)
}
SendMessage(hwnd,SCI_ENDUNDOACTION,0,0);
- //// Fix selection
- //if (iSelStart != iSelEnd && SendMessage(hwnd,SCI_GETTARGETEND,0,0) > SendMessage(hwnd,SCI_GETSELECTIONEND,0,0))
- //{
- // int iCurPos = SendMessage(hwnd,SCI_GETCURRENTPOS,0,0);
- // int iAnchorPos = SendMessage(hwnd,SCI_GETANCHOR,0,0);
- // if (iCurPos > iAnchorPos)
- // iCurPos = SendMessage(hwnd,SCI_GETTARGETEND,0,0);
- // else
- // iAnchorPos = SendMessage(hwnd,SCI_GETTARGETEND,0,0);
- // SendMessage(hwnd,SCI_SETSEL,(WPARAM)iAnchorPos,(LPARAM)iCurPos);
- //}
-
// extend selection to start of first line
// the above code is not required when last line has been excluded
if (iSelStart != iSelEnd)
@@ -4289,27 +4286,36 @@ RegExResult_t __fastcall EditFindHasMatch(HWND hwnd, LPCEDITFINDREPLACE lpefr, B
char szFind[FNDRPL_BUFFER];
int slen = EditGetFindStrg(hwnd, lpefr, szFind, COUNTOF(szFind));
- const int iTextLength = SciCall_GetTextLength();
+ const int iStart = bFirstMatchOnly ? SciCall_GetSelectionStart() : 0;
+ const int iTextLength = SciCall_GetTextLength();
- int start = bFirstMatchOnly ? (int)SendMessage(hwnd, SCI_GETSELECTIONNSTART, 0, 0) : 0;
- int end = iTextLength;
-
- int iPos = EditFindInTarget(hwnd, szFind, slen, (int)(lpefr->fuFlags), &start, &end, FALSE);
+ int start = iStart;
+ int end = iTextLength;
+ int iPos = EditFindInTarget(hwnd, szFind, slen, (int)(lpefr->fuFlags), &start, &end, FALSE);
if (!bFirstMatchOnly)
{
if (bMarkAll && (iPos >= 0)) {
+ EditClearAllMarks(hwnd, 0, iTextLength);
EditMarkAll(hwnd, szFind, (int)(lpefr->fuFlags), 0, iTextLength, FALSE, FALSE);
}
- else {
- EditMarkAll(hwnd, "", 0, 0, iTextLength, FALSE, FALSE);
- }
}
return ((iPos >= 0) ? MATCH : ((iPos == -1) ? NO_MATCH : INVALID));
}
+//=============================================================================
+//
+// EditFindReplaceDlgProcW()
+//
+static void __fastcall EditSetTimerMarkAll(HWND hwnd)
+{
+ TEST_AND_SET(TIMER_BIT_MARK_OCC);
+ SetTimer(hwnd, IDT_TIMER_MRKALL, 100, NULL);
+}
+
+
//=============================================================================
//
// EditFindReplaceDlgProcW()
@@ -4331,7 +4337,8 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA
static HBRUSH hBrushGreen;
static HBRUSH hBrushBlue;
- static int iSaveMarkOcc = -1;
+ static int iSaveMarkOcc = -1;
+ static BOOL bSaveOccVisible = FALSE;
switch(umsg)
{
@@ -4346,11 +4353,16 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA
iSaveMarkOcc = iMarkOccurrences;
EnableCmd(GetMenu(g_hwndMain), IDM_VIEW_MARKOCCUR_ONOFF, FALSE);
iMarkOccurrences = 0;
+ bSaveOccVisible = bMarkOccurrencesMatchVisible;
+ EnableCmd(GetMenu(g_hwndMain), IDM_VIEW_MARKOCCUR_VISIBLE, FALSE);
+ bMarkOccurrencesMatchVisible = FALSE;
CheckDlgButton(hwnd, IDC_ALL_OCCURRENCES, BST_CHECKED);
}
else {
iSaveMarkOcc = -1;
+ bSaveOccVisible = bMarkOccurrencesMatchVisible;
CheckDlgButton(hwnd, IDC_ALL_OCCURRENCES, BST_UNCHECKED);
+ EditClearAllMarks(g_hwndEdit, 0, -1);
}
// Get the current code page for Unicode conversion
@@ -4524,7 +4536,7 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA
EditSetSearchFlags(hwnd, lpefr);
bFlagsChanged = TRUE;
- SetTimer(hwnd, IDT_TIMER_MRKALL, 100, NULL);
+ EditSetTimerMarkAll(hwnd);
}
return TRUE;
@@ -4540,6 +4552,9 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA
SendMessage(g_hwndMain, WM_COMMAND, (WPARAM)MAKELONG(IDM_VIEW_MARKOCCUR_ONOFF, 1), 0);
}
}
+ bMarkOccurrencesMatchVisible = bSaveOccVisible;
+ EnableCmd(GetMenu(g_hwndMain), IDM_VIEW_MARKOCCUR_VISIBLE, bMarkOccurrencesMatchVisible);
+
KillTimer(hwnd, IDT_TIMER_MRKALL);
}
return FALSE;
@@ -4549,8 +4564,10 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA
{
if (LOWORD(wParam) == IDT_TIMER_MRKALL)
{
- KillTimer(hwnd, IDT_TIMER_MRKALL);
- PostMessage(hwnd, WM_COMMAND, MAKELONG(IDC_MARKALL_OCC, 1), 0);
+ if (TEST_AND_RESET(TIMER_BIT_MARK_OCC)) {
+ PostMessage(hwnd, WM_COMMAND, MAKELONG(IDC_MARKALL_OCC, 1), 0);
+ KillTimer(hwnd, IDT_TIMER_MRKALL);
+ }
return TRUE;
}
}
@@ -4559,13 +4576,12 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA
case WM_ACTIVATE:
{
+ DialogEnableWindow(hwnd, IDC_REPLACEINSEL, !SciCall_IsSelectionEmpty());
+
lpefr = (LPEDITFINDREPLACE)GetWindowLongPtr(hwnd, DWLP_USER);
if (lpefr->bMarkOccurences) {
bFlagsChanged = TRUE;
- SetTimer(hwnd, IDT_TIMER_MRKALL, 100, NULL);
- }
- else {
- DialogEnableWindow(hwnd, IDC_REPLACEINSEL, !(BOOL)SendMessage(g_hwndEdit, SCI_GETSELECTIONEMPTY, 0, 0));
+ EditSetTimerMarkAll(hwnd);
}
}
return FALSE;
@@ -4601,7 +4617,7 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA
SendDlgItemMessage(hwnd, LOWORD(wParam), CB_SETEDITSEL, 0, MAKELPARAM(lSelEnd, lSelEnd));
}
bFlagsChanged = TRUE;
- SetTimer(hwnd, IDT_TIMER_MRKALL, 200, NULL);
+ EditSetTimerMarkAll(hwnd);
}
break;
@@ -4614,6 +4630,9 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA
iSaveMarkOcc = iMarkOccurrences;
EnableCmd(GetMenu(g_hwndMain), IDM_VIEW_MARKOCCUR_ONOFF, FALSE);
iMarkOccurrences = 0;
+ bSaveOccVisible = bMarkOccurrencesMatchVisible;
+ EnableCmd(GetMenu(g_hwndMain), IDM_VIEW_MARKOCCUR_VISIBLE, FALSE);
+ bMarkOccurrencesMatchVisible = FALSE;
}
else { // switched OFF
lpefr->bMarkOccurences = FALSE;
@@ -4624,10 +4643,14 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA
}
}
iSaveMarkOcc = -1;
+ bMarkOccurrencesMatchVisible = bSaveOccVisible;
+ EnableCmd(GetMenu(g_hwndMain), IDM_VIEW_MARKOCCUR_VISIBLE, bMarkOccurrencesMatchVisible);
+ bSaveOccVisible = FALSE;
+ EditClearAllMarks(g_hwndEdit, 0, -1);
InvalidateRect(GetDlgItem(hwnd, IDC_FINDTEXT), NULL, TRUE);
}
bFlagsChanged = TRUE;
- SetTimer(hwnd, IDT_TIMER_MRKALL, 100, NULL);
+ EditSetTimerMarkAll(hwnd);
}
break;
@@ -4684,7 +4707,7 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA
CheckDlgButton(hwnd, IDC_FINDTRANSFORMBS, (lpefr->bTransformBS) ? BST_CHECKED : BST_UNCHECKED);
}
bFlagsChanged = TRUE;
- SetTimer(hwnd, IDT_TIMER_MRKALL, 100, NULL);
+ EditSetTimerMarkAll(hwnd);
break;
case IDC_DOT_MATCH_ALL:
@@ -4697,7 +4720,7 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA
lpefr->fuFlags &= ~(SCFIND_DOT_MATCH_ALL);
}
bFlagsChanged = TRUE;
- SetTimer(hwnd, IDT_TIMER_MRKALL, 100, NULL);
+ EditSetTimerMarkAll(hwnd);
break;
case IDC_WILDCARDSEARCH:
@@ -4724,7 +4747,7 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA
CheckDlgButton(hwnd, IDC_FINDTRANSFORMBS, (lpefr->bTransformBS) ? BST_CHECKED : BST_UNCHECKED);
}
bFlagsChanged = TRUE;
- SetTimer(hwnd, IDT_TIMER_MRKALL, 100, NULL);
+ EditSetTimerMarkAll(hwnd);
break;
case IDC_FINDTRANSFORMBS:
@@ -4735,22 +4758,22 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA
lpefr->bTransformBS = FALSE;
}
bFlagsChanged = TRUE;
- SetTimer(hwnd, IDT_TIMER_MRKALL, 100, NULL);
+ EditSetTimerMarkAll(hwnd);
break;
case IDC_FINDCASE:
bFlagsChanged = TRUE;
- SetTimer(hwnd, IDT_TIMER_MRKALL, 100, NULL);
+ EditSetTimerMarkAll(hwnd);
break;
case IDC_FINDWORD:
bFlagsChanged = TRUE;
- SetTimer(hwnd, IDT_TIMER_MRKALL, 100, NULL);
+ EditSetTimerMarkAll(hwnd);
break;
case IDC_FINDSTART:
bFlagsChanged = TRUE;
- SetTimer(hwnd, IDT_TIMER_MRKALL, 100, NULL);
+ EditSetTimerMarkAll(hwnd);
break;
@@ -4887,7 +4910,7 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA
}
}
bFlagsChanged = TRUE;
- SetTimer(hwnd, IDT_TIMER_MRKALL, 100, NULL);
+ EditSetTimerMarkAll(hwnd);
break;
@@ -4905,7 +4928,7 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA
SetDlgItemTextW(hwnd, IDC_FINDTEXT, wszRepl);
SetDlgItemTextW(hwnd, IDC_REPLACETEXT, wszFind);
bFlagsChanged = TRUE;
- SetTimer(hwnd, IDT_TIMER_MRKALL, 100, NULL);
+ EditSetTimerMarkAll(hwnd);
}
break;
@@ -5246,16 +5269,17 @@ BOOL EditReplace(HWND hwnd, LPCEDITFINDREPLACE lpefr) {
if (!pszReplace)
return FALSE; // recoding of clipboard canceled
+ // redo find to get group ranges filled
+ int start = (SciCall_IsSelectionEmpty() ? SciCall_GetCurrentPos() : SciCall_GetSelectionStart());
+ int end = SciCall_GetTextLength();
+ int _start = start;
+
+ int iPos = EditFindInTarget(hwnd, lpefr->szFind, StringCchLenA(lpefr->szFind, FNDRPL_BUFFER), (int)(lpefr->fuFlags), &start, &end, FALSE);
+
// 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, 0, 0);
- int _start = start;
- int iPos = EditFindInTarget(hwnd, lpefr->szFind,
- StringCchLenA(lpefr->szFind, FNDRPL_BUFFER),
- (int)(lpefr->fuFlags), &start, &end, FALSE);
- if ((iPos < 0) || (_start != start) || (_start != end)) {
+ if (SciCall_IsSelectionEmpty()) {
+ if ((iPos < 0) || (_start != start) || (_start != end)) {
// empty-replace was not intended
LocalFree(pszReplace);
if (iPos < 0)
@@ -5330,7 +5354,7 @@ int EditReplaceAllInRange(HWND hwnd, LPCEDITFINDREPLACE lpefr, BOOL bShowInfo, i
bShowInfo = FALSE;
}
- // build array of matches for later replacements
+ // === build array of matches for later replacements ===
ReplPos_t posPair = { 0, 0 };
@@ -5355,15 +5379,21 @@ int EditReplaceAllInRange(HWND hwnd, LPCEDITFINDREPLACE lpefr, BOOL bShowInfo, i
if (iCount > 0)
SendMessage(hwnd, SCI_BEGINUNDOACTION, 0, 0);
- // iterate over findings and replace strings
+ // === iterate over findings and replace strings ===
+
int offset = 0;
for (ReplPos_t* pPosPair = (ReplPos_t*)utarray_front(ReplPosUTArray);
pPosPair != NULL;
pPosPair = (ReplPos_t*)utarray_next(ReplPosUTArray, pPosPair)) {
- SciCall_SetTargetRange((pPosPair->beg + offset), (pPosPair->end + offset));
-
- offset += ((int)SendMessage(hwnd, iReplaceMsg, (WPARAM)-1, (LPARAM)pszReplace) - pPosPair->end + pPosPair->beg);
+ // redo find to get group ranges filled
+ start = (pPosPair->beg + offset);
+ end = (pPosPair->end + offset);
+ iPos = EditFindInTarget(hwnd, szFind, slen, (int)(lpefr->fuFlags), &start, &end, FALSE);
+ if (iPos >= 0) {
+ SciCall_SetTargetRange(start, end);
+ offset += ((int)SendMessage(hwnd, iReplaceMsg, (WPARAM)-1, (LPARAM)pszReplace) - pPosPair->end + pPosPair->beg);
+ }
}
EndWaitCursor();
@@ -5421,8 +5451,8 @@ BOOL EditReplaceAllInSelection(HWND hwnd,LPCEDITFINDREPLACE lpefr,BOOL bShowInfo
int token = BeginSelUndoAction();
- int start = SciCall_GetSelectionStart();;
- int end = SciCall_GetSelectionEnd();;
+ int start = SciCall_GetSelectionStart();
+ int end = SciCall_GetSelectionEnd();
int iCount = EditReplaceAllInRange(hwnd, lpefr, bShowInfo, start, end);
@@ -5431,21 +5461,6 @@ BOOL EditReplaceAllInSelection(HWND hwnd,LPCEDITFINDREPLACE lpefr,BOOL bShowInfo
if (iCount <= 0)
return FALSE;
- int iTargetEnd = (int)SendMessage(hwnd, SCI_GETTARGETEND, 0, 0);
-
- if (SciCall_GetSelectionEnd() < iTargetEnd) {
-
- int iAnchorPos = SciCall_GetAnchor();
- int iCurrentPos = SciCall_GetCurrentPos();
-
- if (iAnchorPos > iCurrentPos)
- iAnchorPos = iTargetEnd;
- else
- iCurrentPos = iTargetEnd;
-
- EditSelectEx(hwnd,iAnchorPos,iCurrentPos);
- }
-
return TRUE;
}
@@ -5454,11 +5469,16 @@ BOOL EditReplaceAllInSelection(HWND hwnd,LPCEDITFINDREPLACE lpefr,BOOL bShowInfo
//
// EditClearAllMarks()
//
-void EditClearAllMarks(HWND hwnd)
+void EditClearAllMarks(HWND hwnd, int iRangeStart, int iRangeEnd)
{
+ if (iRangeEnd <= 0) {
+ iRangeEnd = SciCall_GetTextLength();
+ }
+ if (iRangeStart > iRangeEnd) {
+ swapi(&iRangeStart, &iRangeEnd);
+ }
SendMessage(hwnd, SCI_SETINDICATORCURRENT, INDIC_NP3_MARK_OCCURANCE, 0);
- SendMessage(hwnd, SCI_INDICATORCLEARRANGE, 0, SciCall_GetTextLength());
- iMarkOccurrencesCount = -1; // -1 !
+ SendMessage(hwnd, SCI_INDICATORCLEARRANGE, iRangeStart, iRangeEnd);
}
@@ -5479,8 +5499,6 @@ void EditMarkAll(HWND hwnd, char* pszFind, int flags, int rangeStart, int rangeE
else
pszText = txtBuffer;
- EditClearAllMarks(hwnd);
-
if (pszFind == NULL) {
if (SciCall_IsSelectionEmpty()) {
@@ -5547,20 +5565,25 @@ void EditMarkAll(HWND hwnd, char* pszFind, int flags, int rangeStart, int rangeE
int start = rangeStart;
int end = rangeEnd;
- do {
- ++iMarkOccurrencesCount;
- int iPos = EditFindInTarget(hwnd, pszText, iFindLength, flags, &start, &end, (end == start));
+ iMarkOccurrencesCount = 0;
+ SendMessage(hwnd, SCI_SETINDICATORCURRENT, INDIC_NP3_MARK_OCCURANCE, 0);
+
+ int iPos = -1;
+ do {
+
+ iPos = EditFindInTarget(hwnd, pszText, iFindLength, flags, &start, &end, (start == iPos));
if (iPos < 0)
break; // not found
- // mark this match
- SendMessage(hwnd, SCI_INDICATORFILLRANGE, iPos, (end - start));
+ //// mark this match if not done before
+ SciCall_IndicatorFillRange(iPos, (end - start));
+
start = end;
end = rangeEnd;
- } while (start < end); // < iMarkOccurrencesMaxCount
+ } while ((++iMarkOccurrencesCount < iMarkOccurrencesMaxCount) && (start < end));
}
}
@@ -5709,8 +5732,7 @@ void EditUpdateUrlHotspots(HWND hwnd, int startPos, int endPos, BOOL bActiveHots
}
// 1st apply current lexer style
- SciCall_StartStyling(startPos);
- SendMessage(hwnd, SCI_COLOURISE, 0, (LPARAM)-1);
+ EditFinalizeStyling(hwnd);
const char* pszUrlRegEx = "\\b(?:(?:https?|ftp|file)://|www\\.|ftp\\.)"
"(?:\\([-A-Z0-9+&@#/%=~_|$?!:,.]*\\)|[-A-Z0-9+&@#/%=~_|$?!:,.])*"
@@ -5747,15 +5769,11 @@ void EditUpdateUrlHotspots(HWND hwnd, int startPos, int endPos, BOOL bActiveHots
} while (start < end);
+
if (bActiveHotspot)
- {
SciCall_StartStyling(endPos);
- UpdateEditWndUI(); // does not apply lexer style
- }
- else {
+ else
SciCall_StartStyling(startPos);
- SendMessage(hwnd, SCI_COLOURISE, 0, (LPARAM)-1);
- }
}
@@ -5795,6 +5813,32 @@ BOOL __fastcall EditHighlightIfBrace(HWND hwnd, int iPos) {
}
+//=============================================================================
+//
+// EditApplyLexerStyle()
+//
+void EditApplyLexerStyle(HWND hwnd, int iRangeStart, int iRangeEnd)
+{
+ SendMessage(hwnd, SCI_COLOURISE, (WPARAM)iRangeStart, (LPARAM)iRangeEnd);
+}
+
+
+//=============================================================================
+//
+// EditFinalizeStyling()
+//
+void EditFinalizeStyling(HWND hwnd)
+{
+ const int iEndStyled = SciCall_GetEndStyled();
+
+ if (iEndStyled < SciCall_GetTextLength())
+ {
+ const int iLineEndStyled = SciCall_LineFromPosition(iEndStyled);
+ const int iStartStyling = SciCall_PositionFromLine(iLineEndStyled);
+ EditApplyLexerStyle(hwnd, iStartStyling, -1);
+ }
+}
+
//=============================================================================
//
@@ -5802,12 +5846,7 @@ BOOL __fastcall EditHighlightIfBrace(HWND hwnd, int iPos) {
//
void EditMatchBrace(HWND hwnd)
{
- int iEndStyled = SciCall_GetEndStyled();
- if (iEndStyled < SciCall_GetTextLength()) {
- int iLine = SciCall_LineFromPosition(iEndStyled);
- iEndStyled = SciCall_PositionFromLine(iLine);
- SendMessage(hwnd, SCI_COLOURISE, iEndStyled, -1);
- }
+ EditFinalizeStyling(hwnd);
int iPos = SciCall_GetCurrentPos();
diff --git a/src/Edit.h b/src/Edit.h
index d80e82f6a..d6445a704 100644
--- a/src/Edit.h
+++ b/src/Edit.h
@@ -122,13 +122,15 @@ BOOL EditPrint(HWND,LPCWSTR,LPCWSTR);
void EditPrintSetup(HWND);
void EditPrintInit();
void EditMatchBrace(HWND);
-void EditClearAllMarks(HWND);
+void EditClearAllMarks(HWND,int,int);
void EditMarkAll(HWND,char*,int,int,int,BOOL,BOOL);
void EditUpdateUrlHotspots(HWND, int, int, BOOL);
void EditSetAccelWordNav(HWND,BOOL);
void EditCompleteWord(HWND,BOOL);
void EditGetBookmarkList(HWND,LPWSTR,int);
void EditSetBookmarkList(HWND,LPCWSTR);
+void EditApplyLexerStyle(HWND, int, int);
+void EditFinalizeStyling(HWND);
//void SciInitThemes(HWND);
diff --git a/src/Notepad3.c b/src/Notepad3.c
index 9383c6818..f055aa650 100644
--- a/src/Notepad3.c
+++ b/src/Notepad3.c
@@ -150,6 +150,7 @@ BOOL bShowSelectionMargin;
BOOL bShowLineNumbers;
int iMarkOccurrences;
int iMarkOccurrencesCount;
+int iMarkOccurrencesMaxCount;
BOOL bMarkOccurrencesMatchVisible;
BOOL bMarkOccurrencesMatchCase;
BOOL bMarkOccurrencesMatchWords;
@@ -324,6 +325,11 @@ static volatile LONG g_lTimerBits = 0;
#define TEST_AND_SET(B) InterlockedBitTestAndSet(&g_lTimerBits, B)
#define TEST_AND_RESET(B) InterlockedBitTestAndReset(&g_lTimerBits, B)
+
+// SCN_UPDATEUI notification
+#define SC_UPDATE_NP3_INTERNAL_NOTIFY (SC_UPDATE_H_SCROLL << 1)
+
+
//=============================================================================
//
// Flags
@@ -1038,6 +1044,7 @@ HWND InitInstance(HINSTANCE hInstance,LPSTR pszCmdLine,int nCmdShow)
if (flagStartAsTrayIcon)
SetNotifyIconTitle(g_hwndMain);
+ iMarkOccurrencesCount = 0;
UpdateToolbar();
UpdateStatusbar();
UpdateLineNumberWidth();
@@ -1164,7 +1171,8 @@ LRESULT CALLBACK MainWndProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam)
// update Scintilla colors
case WM_SYSCOLORCHANGE:
UpdateLineNumberWidth();
- MarkAllOccurrences();
+ EditClearAllMarks(g_hwndEdit, 0, -1);
+ MarkAllOccurrences(0);
EditUpdateUrlHotspots(g_hwndEdit, 0, SciCall_GetTextLength(), bHyperlinkHotspot);
return DefWindowProc(hwnd,umsg,wParam,lParam);
@@ -1770,7 +1778,8 @@ void MsgThemeChanged(HWND hwnd,WPARAM wParam,LPARAM lParam)
UpdateToolbar();
UpdateStatusbar();
UpdateLineNumberWidth();
- MarkAllOccurrences();
+ EditClearAllMarks(g_hwndEdit, 0, -1);
+ MarkAllOccurrences(0);
EditUpdateUrlHotspots(g_hwndEdit, 0, SciCall_GetTextLength(), bHyperlinkHotspot);
UNUSED(lParam);
@@ -2533,6 +2542,8 @@ void __fastcall MarkAllOccurrencesTimer()
int iPosStart = SciCall_PositionFromLine(iStartLine);
int iPosEnd = SciCall_GetLineEndPosition(iEndLine);
+ // !!! don't clear all marks, else this method is re-called
+ // !!! on UpdateUI notification on drawing indicator mark
EditMarkAll(g_hwndEdit, NULL, bMarkOccurrencesCurrentWord, iPosStart, iPosEnd, bMarkOccurrencesMatchCase, bMarkOccurrencesMatchWords);
}
else {
@@ -4290,27 +4301,28 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam)
case IDM_VIEW_ACCELWORDNAV:
bAccelWordNavigation = (bAccelWordNavigation) ? FALSE : TRUE; // toggle
EditSetAccelWordNav(g_hwndEdit,bAccelWordNavigation);
- MarkAllOccurrences();
+ EditClearAllMarks(g_hwndEdit, 0, -1);
+ MarkAllOccurrences(0);
break;
case IDM_VIEW_MARKOCCUR_ONOFF:
iMarkOccurrences = (iMarkOccurrences == 0) ? max(1, IniGetInt(L"Settings", L"MarkOccurrences", 1)) : 0;
+ EditClearAllMarks(g_hwndEdit, 0, -1);
if (iMarkOccurrences != 0) {
- MarkAllOccurrences();
- }
- else {
- EditClearAllMarks(g_hwndEdit);
+ MarkAllOccurrences(0);
}
break;
case IDM_VIEW_MARKOCCUR_CASE:
bMarkOccurrencesMatchCase = (bMarkOccurrencesMatchCase) ? FALSE : TRUE;
- MarkAllOccurrences();
+ EditClearAllMarks(g_hwndEdit, 0, -1);
+ MarkAllOccurrences(0);
break;
case IDM_VIEW_MARKOCCUR_VISIBLE:
bMarkOccurrencesMatchVisible = (bMarkOccurrencesMatchVisible) ? FALSE : TRUE;
- MarkAllOccurrences();
+ EditClearAllMarks(g_hwndEdit, 0, -1);
+ MarkAllOccurrences(0);
break;
case IDM_VIEW_MARKOCCUR_WORD:
@@ -4318,7 +4330,8 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam)
if (bMarkOccurrencesMatchWords) {
bMarkOccurrencesCurrentWord = FALSE;
}
- MarkAllOccurrences();
+ EditClearAllMarks(g_hwndEdit, 0, -1);
+ MarkAllOccurrences(0);
break;
case IDM_VIEW_MARKOCCUR_CURRENT:
@@ -4326,7 +4339,8 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam)
if (bMarkOccurrencesCurrentWord) {
bMarkOccurrencesMatchWords = FALSE;
}
- MarkAllOccurrences();
+ EditClearAllMarks(g_hwndEdit, 0, -1);
+ MarkAllOccurrences(0);
break;
case IDM_VIEW_FOLDING:
@@ -4382,7 +4396,7 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam)
case IDM_VIEW_MATCHBRACES:
bMatchBraces = (bMatchBraces) ? FALSE : TRUE;
if (bMatchBraces)
- UpdateEditWndUI();
+ EditMatchBrace(g_hwndEdit);
else
SendMessage(g_hwndEdit,SCI_BRACEHIGHLIGHT,(WPARAM)-1,(LPARAM)-1);
break;
@@ -5600,25 +5614,33 @@ LRESULT MsgNotify(HWND hwnd,WPARAM wParam,LPARAM lParam)
case SCN_UPDATEUI:
- if (scn->updated & SC_UPDATE_SELECTION)
+ //if (scn->updated & SC_UPDATE_NP3_INTERNAL_NOTIFY) {
+ // // special case
+ //}
+ //else
+
+ if (scn->updated & (SC_UPDATE_SELECTION | SC_UPDATE_CONTENT))
{
- // !!! SC_UPDATE_CONTENT is triggered too often,
- // even if nothing relevant has been modified
- // relevant modifications are handled in SCN_MODIFIED !!!
-
//~InvalidateSelections(); // fixed in SCI ?
- if (iMarkOccurrences) {
- MarkAllOccurrences();
- }
-
// Brace Match
if (bMatchBraces) {
EditMatchBrace(g_hwndEdit);
}
+ if (iMarkOccurrences) {
+ // clear marks only, if caret/selection changed
+ if (scn->updated & SC_UPDATE_SELECTION) {
+ EditClearAllMarks(g_hwndEdit, 0, -1);
+ MarkAllOccurrences(0);
+ }
+ else {
+ MarkAllOccurrences(50);
+ }
+ }
+
if (bHyperlinkHotspot) {
- UpdateVisibleUrlHotspot();
+ UpdateVisibleUrlHotspot(100);
}
UpdateStatusbar();
@@ -5626,10 +5648,10 @@ LRESULT MsgNotify(HWND hwnd,WPARAM wParam,LPARAM lParam)
else if (scn->updated & SC_UPDATE_V_SCROLL)
{
if (iMarkOccurrences) {
- MarkAllOccurrences();
+ MarkAllOccurrences(100);
}
if (bHyperlinkHotspot) {
- UpdateVisibleUrlHotspot();
+ UpdateVisibleUrlHotspot(100);
}
}
break;
@@ -5655,6 +5677,11 @@ LRESULT MsgNotify(HWND hwnd,WPARAM wParam,LPARAM lParam)
}
UpdateToolbar();
+
+ if (iMarkOccurrences) {
+ EditClearAllMarks(g_hwndEdit, 0, -1);
+ MarkAllOccurrences(0);
+ }
UpdateStatusbar();
bModified = TRUE;
@@ -6206,10 +6233,9 @@ void LoadSettings()
iSciFontQuality = IniSectionGetInt(pIniSection,L"SciFontQuality", FontQuality[3]);
iSciFontQuality = max(min(iSciFontQuality, 3), 0);
- iMarkOccurrencesCount = -1;
- //iMarkOccurrencesMaxCount = IniSectionGetInt(pIniSection,L"MarkOccurrencesMaxCount",2000);
- //iMarkOccurrencesMaxCount = max(min(iMarkOccurrencesMaxCount,100000),2);
-
+ iMarkOccurrencesMaxCount = IniSectionGetInt(pIniSection,L"MarkOccurrencesMaxCount",2000);
+ iMarkOccurrencesMaxCount = (iMarkOccurrencesMaxCount <= 0) ? INT_MAX : iMarkOccurrencesMaxCount;
+
bDenyVirtualSpaceAccess = IniSectionGetBool(pIniSection, L"DenyVirtualSpaceAccess", FALSE);
bUseOldStyleBraceMatching = IniSectionGetBool(pIniSection, L"UseOldStyleBraceMatching", FALSE);
@@ -7121,44 +7147,33 @@ int CreateIniFileEx(LPCWSTR lpszIniFile) {
}
-//=============================================================================
-//
-// UpdateEditWndUI()
-//
-void UpdateEditWndUI()
-{
- struct SCNotification scn;
- scn.nmhdr.hwndFrom = g_hwndEdit;
- scn.nmhdr.idFrom = IDC_EDIT;
- scn.nmhdr.code = SCN_UPDATEUI;
- scn.updated = SC_UPDATE_CONTENT;
- //SendMessage(g_hwndMain, WM_NOTIFY, IDC_EDIT, (LPARAM)&scn);
- PostMessage(g_hwndMain, WM_NOTIFY, IDC_EDIT, (LPARAM)&scn);
- // ---------------------------------------------------------------------------
- // ~~~ don't Send/Post Message(hwnd, SCI_COLOURISE, 0, (LPARAM)-1); here ! ~~~
- // ---------------------------------------------------------------------------
-}
-
-
//=============================================================================
//
// MarkAllOccurrences()
//
-void MarkAllOccurrences()
+void MarkAllOccurrences(int delay)
{
- SetTimer(g_hwndMain, IDT_TIMER_MAIN_MRKALL, 100, NULL);
+ if (delay <= 0) {
+ MarkAllOccurrencesTimer();
+ return;
+ }
TEST_AND_SET(TIMER_BIT_MARK_OCC);
+ SetTimer(g_hwndMain, IDT_TIMER_MAIN_MRKALL, delay, NULL);
}
//=============================================================================
//
// UpdateVisibleUrlHotspot()
//
-void UpdateVisibleUrlHotspot()
+void UpdateVisibleUrlHotspot(int delay)
{
- SetTimer(g_hwndMain, IDT_TIMER_UPDATE_HOTSPOT, 100, NULL);
- TEST_AND_SET(TIMER_BIT_UPDATE_HYPER);
+ if (delay <= 0) {
+ MarkAllOccurrencesTimer();
+ return;
+ }
+ TEST_AND_SET(TIMER_BIT_UPDATE_HYPER);
+ SetTimer(g_hwndMain, IDT_TIMER_UPDATE_HOTSPOT, 100, NULL);
}
@@ -7228,7 +7243,6 @@ void UpdateStatusbar()
static WCHAR tchOcc[32] = { L'\0' };
static WCHAR tchDocPos[256] = { L'\0' };
- int iBytes;
static WCHAR tchBytes[64] = { L'\0' };
static WCHAR tchDocSize[256] = { L'\0' };
@@ -7237,21 +7251,18 @@ void UpdateStatusbar()
static WCHAR tchLexerName[128] = { L'\0' };
static WCHAR tchLinesSelected[32] = { L'\0' };
- if (!bShowStatusbar)
- return;
+ if (!bShowStatusbar) { return; }
- int iPos = (int)SendMessage(g_hwndEdit, SCI_GETCURRENTPOS, 0, 0);
+ const int iPos = SciCall_GetCurrentPos();
- int iLn = (int)SendMessage(g_hwndEdit, SCI_LINEFROMPOSITION, iPos, 0) + 1;
- StringCchPrintf(tchLn, COUNTOF(tchLn), L"%i", iLn);
+ StringCchPrintf(tchLn, COUNTOF(tchLn), L"%i", SciCall_LineFromPosition(iPos) + 1);
FormatNumberStr(tchLn);
StringCchPrintf(tchLines, COUNTOF(tchLines), L"%i", SciCall_GetLineCount());
FormatNumberStr(tchLines);
- int iCol = (int)SendMessage(g_hwndEdit, SCI_GETCOLUMN, iPos, 0) + 1;
+ int iCol = SciCall_GetColumn(iPos) + 1;
iCol += (int)SendMessage(g_hwndEdit, SCI_GETSELECTIONNCARETVIRTUALSPACE, 0, 0);
-
StringCchPrintf(tchCol, COUNTOF(tchCol), L"%i", iCol);
FormatNumberStr(tchCol);
@@ -7260,60 +7271,74 @@ void UpdateStatusbar()
FormatNumberStr(tchCols);
}
- int iSelStart = (int)SendMessage(g_hwndEdit, SCI_GETSELECTIONSTART, 0, 0);
- int iSelEnd = (int)SendMessage(g_hwndEdit, SCI_GETSELECTIONEND, 0, 0);
-
// Print number of selected chars in statusbar
+ const int iSelStart = SciCall_GetSelectionStart();
+ const int iSelEnd = SciCall_GetSelectionEnd();
if (SC_SEL_RECTANGLE != SendMessage(g_hwndEdit, SCI_GETSELECTIONMODE, 0, 0)) {
- int iSel = (int)SendMessage(g_hwndEdit, SCI_COUNTCHARACTERS, iSelStart, iSelEnd);
+ const int iSel = (int)SendMessage(g_hwndEdit, SCI_COUNTCHARACTERS, iSelStart, iSelEnd);
StringCchPrintf(tchSel, COUNTOF(tchSel), L"%i", iSel);
FormatNumberStr(tchSel);
}
- else
+ else {
StringCchCopy(tchSel, COUNTOF(tchSel), L"--");
+ }
-
- if ((iMarkOccurrencesCount > 0) && !bMarkOccurrencesMatchVisible) {
- StringCchPrintf(tchOcc, COUNTOF(tchOcc), L"%i", iMarkOccurrencesCount);
- FormatNumberStr(tchOcc);
+ // Print number of occurrence marks found
+ if ((iMarkOccurrencesCount > 0) && !bMarkOccurrencesMatchVisible)
+ {
+ if ((iMarkOccurrencesMaxCount < 0) || (iMarkOccurrencesCount < iMarkOccurrencesMaxCount))
+ {
+ StringCchPrintf(tchOcc, COUNTOF(tchOcc), L"%i", iMarkOccurrencesCount);
+ FormatNumberStr(tchOcc);
+ }
+ else {
+ StringCchPrintf(tchOcc, COUNTOF(tchOcc), L">= %i", iMarkOccurrencesMaxCount);
+ }
}
else {
StringCchCopy(tchOcc, COUNTOF(tchOcc), L"--");
}
- // Print number of lines selected lines in statusbar
- int iLineStart = (int)SendMessage(g_hwndEdit, SCI_LINEFROMPOSITION, iSelStart, 0);
- int iLineEnd = (int)SendMessage(g_hwndEdit, SCI_LINEFROMPOSITION, iSelEnd, 0);
- int iStartOfLinePos = (int)SendMessage(g_hwndEdit, SCI_POSITIONFROMLINE, iLineEnd, 0);
- int iLinesSelected = iLineEnd - iLineStart;
- if ((iSelStart != iSelEnd) && (iStartOfLinePos != iSelEnd)) iLinesSelected += 1;
+ // Print number of selected lines in statusbar
+ const int iLineStart = SciCall_LineFromPosition(iSelStart);
+ const int iLineEnd = SciCall_LineFromPosition(iSelEnd);
+ const int iStartOfLinePos = SciCall_PositionFromLine(iLineEnd);
+ int iLinesSelected = (iLineEnd - iLineStart);
+ if ((iSelStart != iSelEnd) && (iStartOfLinePos != iSelEnd)) { iLinesSelected += 1; }
StringCchPrintf(tchLinesSelected, COUNTOF(tchLinesSelected), L"%i", iLinesSelected);
FormatNumberStr(tchLinesSelected);
- if (!bMarkLongLines)
+ if (!bMarkLongLines) {
FormatString(tchDocPos, COUNTOF(tchDocPos), IDS_DOCPOS, tchLn, tchLines, tchCol, tchSel, tchLinesSelected, tchOcc);
- else
+ }
+ else {
FormatString(tchDocPos, COUNTOF(tchDocPos), IDS_DOCPOS2, tchLn, tchLines, tchCol, tchCols, tchSel, tchLinesSelected, tchOcc);
-
- iBytes = (int)SendMessage(g_hwndEdit, SCI_GETLENGTH, 0, 0);
+ }
+ const int iBytes = SciCall_GetTextLength();
StrFormatByteSize(iBytes, tchBytes, COUNTOF(tchBytes));
FormatString(tchDocSize, COUNTOF(tchDocSize), IDS_DOCSIZE, tchBytes);
Encoding_GetLabel(Encoding_Current(CPI_GET));
- if (iEOLMode == SC_EOL_CR)
+ if (iEOLMode == SC_EOL_CR)
+ {
StringCchCopy(tchEOLMode, COUNTOF(tchEOLMode), L" CR");
- else if (iEOLMode == SC_EOL_LF)
+ }
+ else if (iEOLMode == SC_EOL_LF)
+ {
StringCchCopy(tchEOLMode, COUNTOF(tchEOLMode), L" LF");
- else
+ }
+ else {
StringCchCopy(tchEOLMode, COUNTOF(tchEOLMode), L" CR+LF");
-
- if (SendMessage(g_hwndEdit, SCI_GETOVERTYPE, 0, 0))
+ }
+ if (SendMessage(g_hwndEdit, SCI_GETOVERTYPE, 0, 0))
+ {
StringCchCopy(tchOvrMode, COUNTOF(tchOvrMode), L" OVR");
- else
+ }
+ else {
StringCchCopy(tchOvrMode, COUNTOF(tchOvrMode), L" INS");
-
+ }
Style_GetCurrentLexerName(tchLexerName, COUNTOF(tchLexerName));
StatusSetText(g_hwndStatus, STATUS_DOCPOS, tchDocPos);
@@ -7367,6 +7392,22 @@ void UpdateSettingsCmds()
}
+//=============================================================================
+//
+// UpdateUI()
+//
+void UpdateUI()
+{
+ struct SCNotification scn;
+ scn.nmhdr.hwndFrom = g_hwndEdit;
+ scn.nmhdr.idFrom = IDC_EDIT;
+ scn.nmhdr.code = SCN_UPDATEUI;
+ scn.updated = (SC_UPDATE_CONTENT | SC_UPDATE_NP3_INTERNAL_NOTIFY);
+ SendMessage(g_hwndMain, WM_NOTIFY, IDC_EDIT, (LPARAM)&scn);
+ //PostMessage(g_hwndMain, WM_NOTIFY, IDC_EDIT, (LPARAM)&scn);
+}
+
+
//=============================================================================
//
// InvalidateSelections()
diff --git a/src/Notepad3.h b/src/Notepad3.h
index 71ca584ab..d08b30324 100644
--- a/src/Notepad3.h
+++ b/src/Notepad3.h
@@ -139,13 +139,13 @@ int CreateIniFile();
int CreateIniFileEx(LPCWSTR);
-void MarkAllOccurrences();
-void UpdateEditWndUI();
+void MarkAllOccurrences(int);
void UpdateToolbar();
void UpdateStatusbar();
void UpdateLineNumberWidth();
void UpdateSettingsCmds();
-void UpdateVisibleUrlHotspot();
+void UpdateVisibleUrlHotspot(int);
+void UpdateUI();
void InvalidateSelections();
diff --git a/src/SciCall.h b/src/SciCall.h
index 5e45a0546..d3dc4f698 100644
--- a/src/SciCall.h
+++ b/src/SciCall.h
@@ -98,6 +98,7 @@ DeclareSciCallV1(GotoPos, GOTOPOS, int, position);
DeclareSciCallV1(GotoLine, GOTOLINE, int, line);
DeclareSciCallR1(PositionBefore, POSITIONBEFORE, int, Sci_Position, position);
DeclareSciCallR1(PositionAfter, POSITIONAFTER, int, Sci_Position, position);
+DeclareSciCallR1(GetCharAt, GETCHARAT, char, Sci_Position, position);
DeclareSciCallR0(GetLineCount, GETLINECOUNT, int);
DeclareSciCallR0(GetTextLength, GETTEXTLENGTH, int);
@@ -105,13 +106,11 @@ DeclareSciCallR1(LineLength, LINELENGTH, int, Sci_Position, line);
DeclareSciCallR1(LineFromPosition, LINEFROMPOSITION, int, Sci_Position, position);
DeclareSciCallR1(PositionFromLine, POSITIONFROMLINE, int, Sci_Position, line);
DeclareSciCallR1(GetLineEndPosition, GETLINEENDPOSITION, int, Sci_Position, line);
-DeclareSciCallR0(GetEndStyled, GETENDSTYLED, int);
DeclareSciCallR1(GetColumn, GETCOLUMN, int, Sci_Position, position);
DeclareSciCallR0(LinesOnScreen, LINESONSCREEN, int);
DeclareSciCallR0(GetFirstVisibleLine, GETFIRSTVISIBLELINE, int);
DeclareSciCallR1(DocLineFromVisible, DOCLINEFROMVISIBLE, int, Sci_Position, line);
-DeclareSciCallR1(GetCharAt, GETCHARAT, char, Sci_Position, position);
//=============================================================================
//
@@ -130,8 +129,9 @@ DeclareSciCallV2(SetYCaretPolicy, SETYCARETPOLICY, int, caretPolicy, int, caretS
//
DeclareSciCallR1(StyleGetFore, STYLEGETFORE, COLORREF, int, styleNumber);
DeclareSciCallR1(StyleGetBack, STYLEGETBACK, COLORREF, int, styleNumber);
-DeclareSciCallV1(StartStyling, STARTSTYLING, Sci_Position, position);
DeclareSciCallV2(SetStyling, SETSTYLING, Sci_PositionCR, length, int, style);
+DeclareSciCallV1(StartStyling, STARTSTYLING, Sci_Position, position);
+DeclareSciCallR0(GetEndStyled, GETENDSTYLED, int);
//=============================================================================
//
@@ -156,6 +156,15 @@ DeclareSciCallV2(MarkerSetFore, MARKERSETFORE, int, markerNumber, COLORREF, colo
DeclareSciCallV2(MarkerSetBack, MARKERSETBACK, int, markerNumber, COLORREF, colour);
+//=============================================================================
+//
+// Indicators
+//
+//
+DeclareSciCallR2(IndicatorValueAt, INDICATORVALUEAT, int, int, indicatorID, Sci_Position, position);
+DeclareSciCallV2(IndicatorFillRange, INDICATORFILLRANGE, Sci_Position, position, Sci_Position, length);
+
+
//=============================================================================
//
// Folding
diff --git a/src/VersionEx.h b/src/VersionEx.h
index 4769b32fa..4c968c78d 100644
--- a/src/VersionEx.h
+++ b/src/VersionEx.h
@@ -5,7 +5,7 @@
// //////////////////////////////////////////////////////////
#define VERSION_MAJOR 3
#define VERSION_MINOR 18
-#define VERSION_REV 0102
-#define VERSION_BUILD 795
+#define VERSION_REV 105
+#define VERSION_BUILD 802
#define SCINTILLA_VER 402
#define ONIGMO_REGEX_VER 6.1.3