diff --git a/Build/Notepad3.ini b/Build/Notepad3.ini index 39b7e72a4..a7bcb4053 100644 Binary files a/Build/Notepad3.ini and b/Build/Notepad3.ini differ diff --git a/np3portableapp/Notepad3Portable/App/DefaultData/settings/Notepad3.ini b/np3portableapp/Notepad3Portable/App/DefaultData/settings/Notepad3.ini index 66b8a508b..a7bcb4053 100644 Binary files a/np3portableapp/Notepad3Portable/App/DefaultData/settings/Notepad3.ini and b/np3portableapp/Notepad3Portable/App/DefaultData/settings/Notepad3.ini differ diff --git a/np3portableapp/Notepad3Portable/Data/settings/Notepad3.ini b/np3portableapp/Notepad3Portable/Data/settings/Notepad3.ini deleted file mode 100644 index ea9752cf9..000000000 Binary files a/np3portableapp/Notepad3Portable/Data/settings/Notepad3.ini and /dev/null differ diff --git a/src/Dialogs.c b/src/Dialogs.c index bb60cd1c5..1e0548d2e 100644 --- a/src/Dialogs.c +++ b/src/Dialogs.c @@ -1404,10 +1404,10 @@ BOOL FileMRUDlg(HWND hwnd,LPWSTR lpstrFile) // // ChangeNotifyDlgProc() // -// Controls: 100 Radio Button -// 101 Radio Button -// 102 Radio Button -// 103 Check Box +// Controls: 100 Radio Button (None) +// 101 Radio Button (Display Message) +// 102 Radio Button (Auto-Reload) +// 103 Check Box (Reset on New) // extern int iFileWatchingMode; extern BOOL bResetFileWatching; @@ -1474,7 +1474,7 @@ BOOL ChangeNotifyDlg(HWND hwnd) // // ColumnWrapDlgProc() // -// Controls: 100 Edit +// Controls: Edit IDC_COLUMNWRAP // INT_PTR CALLBACK ColumnWrapDlgProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam) { @@ -1489,8 +1489,8 @@ INT_PTR CALLBACK ColumnWrapDlgProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lPar piNumber = (int*)lParam; - SetDlgItemInt(hwnd,100,*piNumber,FALSE); - SendDlgItemMessage(hwnd,100,EM_LIMITTEXT,15,0); + SetDlgItemInt(hwnd, IDC_COLUMNWRAP,*piNumber,FALSE); + SendDlgItemMessage(hwnd, IDC_COLUMNWRAP,EM_LIMITTEXT,15,0); CenterDlgInParent(hwnd); @@ -1507,7 +1507,7 @@ INT_PTR CALLBACK ColumnWrapDlgProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lPar BOOL fTranslated; - int iNewNumber = GetDlgItemInt(hwnd,100,&fTranslated,FALSE); + int iNewNumber = GetDlgItemInt(hwnd, IDC_COLUMNWRAP,&fTranslated,FALSE); if (fTranslated) { @@ -1517,7 +1517,7 @@ INT_PTR CALLBACK ColumnWrapDlgProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lPar } else - PostMessage(hwnd,WM_NEXTDLGCTL,(WPARAM)(GetDlgItem(hwnd,100)),1); + PostMessage(hwnd,WM_NEXTDLGCTL,(WPARAM)(GetDlgItem(hwnd, IDC_COLUMNWRAP)),1); } break; diff --git a/src/Edit.c b/src/Edit.c index 59215ff1f..c77e4a131 100644 --- a/src/Edit.c +++ b/src/Edit.c @@ -85,8 +85,6 @@ extern BOOL bLoadASCIIasUTF8; extern BOOL bLoadNFOasOEM; extern BOOL bAccelWordNavigation; -extern BOOL bDenyVirtualSpaceAccess; -extern BOOL bHyperlinkHotspot; extern int iMarkOccurrences; extern int iMarkOccurrencesCount; @@ -151,14 +149,21 @@ static volatile LONG g_lTargetTransactionBits = 0; // // EditEnterTargetTransaction(), EditLeaveTargetTransaction() // -BOOL EditEnterTargetTransaction() { - return (BOOL)TEST_AND_SET(BLOCK_BIT_TARGET_TRANSACTION); +void EditEnterTargetTransaction() { + (void)TEST_AND_SET(BLOCK_BIT_TARGET_TRANSACTION); } -BOOL EditLeaveTargetTransaction() { - return (BOOL)TEST_AND_RESET(BLOCK_BIT_TARGET_TRANSACTION); +void EditLeaveTargetTransaction() { + (void)TEST_AND_RESET(BLOCK_BIT_TARGET_TRANSACTION); } +BOOL EditIsInTargetTransaction() { + if (TEST_AND_RESET(BLOCK_BIT_TARGET_TRANSACTION)) { + (void)TEST_AND_SET(BLOCK_BIT_TARGET_TRANSACTION); + return TRUE; + } + return FALSE; +} //============================================================================= // @@ -189,13 +194,13 @@ HWND EditCreate(HWND hwndParent) SendMessage(hwnd,SCI_SETCARETSTICKY,SC_CARETSTICKY_OFF,0); //SendMessage(hwnd,SCI_SETCARETSTICKY,SC_CARETSTICKY_WHITESPACE,0); SendMessage(hwnd,SCI_SETXCARETPOLICY,CARET_SLOP|CARET_EVEN,50); - SendMessage(hwnd,SCI_SETYCARETPOLICY,CARET_EVEN,0); + SendMessage(hwnd,SCI_SETYCARETPOLICY,CARET_SLOP|CARET_EVEN,0); SendMessage(hwnd,SCI_SETMOUSESELECTIONRECTANGULARSWITCH,TRUE,0); SendMessage(hwnd,SCI_SETMULTIPLESELECTION,FALSE,0); SendMessage(hwnd,SCI_SETADDITIONALSELECTIONTYPING,FALSE,0); SendMessage(hwnd,SCI_SETADDITIONALCARETSBLINK,FALSE,0); SendMessage(hwnd,SCI_SETADDITIONALCARETSVISIBLE,FALSE,0); - SendMessage(hwnd,SCI_SETVIRTUALSPACEOPTIONS, (bDenyVirtualSpaceAccess ? SCVS_NONE : SCVS_RECTANGULARSELECTION), 0); + SendMessage(hwnd,SCI_SETVIRTUALSPACEOPTIONS, SCVS_NONE, 0); SendMessage(hwnd,SCI_SETLAYOUTCACHE,SC_CACHE_PAGE,0); @@ -325,7 +330,7 @@ void EditSetNewText(HWND hwnd,char* lpstrText,DWORD cbText) SendMessage(hwnd,SCI_CANCEL,0,0); SendMessage(hwnd,SCI_SETUNDOCOLLECTION,0,0); - UndoRedoSelectionMap(-1,NULL); + UndoRedoActionMap(-1,NULL); SendMessage(hwnd,SCI_CLEARALL,0,0); SendMessage(hwnd,SCI_MARKERDELETEALL,(WPARAM)MARKER_NP3_BOOKMARK,0); SendMessage(hwnd,SCI_SETSCROLLWIDTH, DEFAULT_SCROLL_WIDTH,0); @@ -364,7 +369,7 @@ BOOL EditConvertText(HWND hwnd, int encSource, int encDest, BOOL bSetSavePoint) { SendMessage(hwnd,SCI_CANCEL,0,0); SendMessage(hwnd,SCI_SETUNDOCOLLECTION,0,0); - UndoRedoSelectionMap(-1,NULL); + UndoRedoActionMap(-1,NULL); SendMessage(hwnd,SCI_CLEARALL,0,0); SendMessage(hwnd,SCI_MARKERDELETEALL,(WPARAM)MARKER_NP3_BOOKMARK,0); Encoding_SciSetCodePage(hwnd,encDest); @@ -405,7 +410,7 @@ BOOL EditConvertText(HWND hwnd, int encSource, int encDest, BOOL bSetSavePoint) SendMessage(hwnd,SCI_CANCEL,0,0); SendMessage(hwnd,SCI_SETUNDOCOLLECTION,0,0); - UndoRedoSelectionMap(-1,NULL); + UndoRedoActionMap(-1,NULL); SendMessage(hwnd,SCI_CLEARALL,0,0); SendMessage(hwnd,SCI_MARKERDELETEALL,(WPARAM)MARKER_NP3_BOOKMARK,0); Encoding_SciSetCodePage(hwnd,encDest); @@ -637,8 +642,7 @@ BOOL EditCopyAppend(HWND hwnd) char* pszText = NULL; if (iCurPos != iAnchorPos) { - - if (SC_SEL_RECTANGLE == SendMessage(hwnd, SCI_GETSELECTIONMODE, 0, 0)) { + if (SciCall_IsSelectionRectangle()) { MsgBox(MBWARN, IDS_SELRECT); return(FALSE); } @@ -1220,7 +1224,7 @@ void EditInvertCase(HWND hwnd) if (iCurPos != iAnchorPos) { - if (SC_SEL_RECTANGLE != SendMessage(hwnd,SCI_GETSELECTIONMODE,0,0)) + if (!SciCall_IsSelectionRectangle()) { int iSelStart = (int)SendMessage(hwnd,SCI_GETSELECTIONSTART,0,0); int iSelEnd = (int)SendMessage(hwnd,SCI_GETSELECTIONEND,0,0); @@ -1256,11 +1260,9 @@ void EditInvertCase(HWND hwnd) WideCharToMultiByte(cpEdit,0,pszTextW,cchTextW,pszText,(int)GlobalSize(pszText),NULL,NULL); - SendMessage(hwnd,SCI_BEGINUNDOACTION,0,0); SendMessage(hwnd,SCI_CLEAR,0,0); SendMessage(hwnd,SCI_ADDTEXT,(WPARAM)(iSelEnd - iSelStart),(LPARAM)pszText); SendMessage(hwnd,SCI_SETSEL,(WPARAM)iAnchorPos,(LPARAM)iCurPos); - SendMessage(hwnd,SCI_ENDUNDOACTION,0,0); } GlobalFree(pszText); @@ -1283,7 +1285,7 @@ void EditTitleCase(HWND hwnd) if (iCurPos != iAnchorPos) { - if (SC_SEL_RECTANGLE != SendMessage(hwnd,SCI_GETSELECTIONMODE,0,0)) + if (!SciCall_IsSelectionRectangle()) { int iSelStart = (int)SendMessage(hwnd, SCI_GETSELECTIONSTART, 0, 0); int iSelEnd = (int)SendMessage(hwnd, SCI_GETSELECTIONEND, 0, 0); @@ -1319,11 +1321,9 @@ void EditTitleCase(HWND hwnd) WideCharToMultiByte(cpEdit,0,pszTextW,cchTextW,pszText,(int)GlobalSize(pszText),NULL,NULL); - SendMessage(hwnd,SCI_BEGINUNDOACTION,0,0); SendMessage(hwnd,SCI_CLEAR,0,0); SendMessage(hwnd,SCI_ADDTEXT,(WPARAM)(iSelEnd - iSelStart),(LPARAM)pszText); SendMessage(hwnd,SCI_SETSEL,(WPARAM)iAnchorPos,(LPARAM)iCurPos); - SendMessage(hwnd,SCI_ENDUNDOACTION,0,0); } GlobalFree(pszText); @@ -1346,7 +1346,7 @@ void EditSentenceCase(HWND hwnd) if (iCurPos != iAnchorPos) { - if (SC_SEL_RECTANGLE != SendMessage(hwnd,SCI_GETSELECTIONMODE,0,0)) + if (!SciCall_IsSelectionRectangle()) { int iSelStart = (int)SendMessage(hwnd,SCI_GETSELECTIONSTART,0,0); int iSelEnd = (int)SendMessage(hwnd,SCI_GETSELECTIONEND,0,0); @@ -1395,11 +1395,9 @@ void EditSentenceCase(HWND hwnd) WideCharToMultiByte(cpEdit,0,pszTextW,cchTextW,pszText,(int)GlobalSize(pszText),NULL,NULL); - SendMessage(hwnd,SCI_BEGINUNDOACTION,0,0); SendMessage(hwnd,SCI_CLEAR,0,0); SendMessage(hwnd,SCI_ADDTEXT,(WPARAM)(iSelEnd - iSelStart),(LPARAM)pszText); SendMessage(hwnd,SCI_SETSEL,(WPARAM)iAnchorPos,(LPARAM)iCurPos); - SendMessage(hwnd,SCI_ENDUNDOACTION,0,0); } GlobalFree(pszText); @@ -1426,7 +1424,7 @@ void EditURLEncode(HWND hwnd) if (iCurPos != iAnchorPos) { - if (SC_SEL_RECTANGLE != SendMessage(hwnd,SCI_GETSELECTIONMODE,0,0)) + if (!SciCall_IsSelectionRectangle()) { char* pszText; LPWSTR pszTextW; @@ -1478,11 +1476,9 @@ void EditURLEncode(HWND hwnd) else iCurPos = iAnchorPos + cchEscaped; - SendMessage(hwnd,SCI_BEGINUNDOACTION,0,0); SendMessage(hwnd,SCI_CLEAR,0,0); SendMessage(hwnd,SCI_ADDTEXT,(WPARAM)cchEscaped,(LPARAM)pszEscaped); SendMessage(hwnd,SCI_SETSEL,(WPARAM)iAnchorPos,(LPARAM)iCurPos); - SendMessage(hwnd,SCI_ENDUNDOACTION,0,0); LocalFree(pszText); LocalFree(pszTextW); @@ -1510,7 +1506,7 @@ void EditURLDecode(HWND hwnd) if (iCurPos != iAnchorPos) { - if (SC_SEL_RECTANGLE != SendMessage(hwnd,SCI_GETSELECTIONMODE,0,0)) + if (!SciCall_IsSelectionRectangle()) { char* pszText; LPWSTR pszTextW; @@ -1563,11 +1559,9 @@ void EditURLDecode(HWND hwnd) else iCurPos = iAnchorPos + cchUnescaped; - SendMessage(hwnd,SCI_BEGINUNDOACTION,0,0); SendMessage(hwnd,SCI_CLEAR,0,0); SendMessage(hwnd,SCI_ADDTEXT,(WPARAM)cchUnescaped,(LPARAM)pszUnescaped); SendMessage(hwnd,SCI_SETSEL,(WPARAM)iAnchorPos,(LPARAM)iCurPos); - SendMessage(hwnd,SCI_ENDUNDOACTION,0,0); LocalFree(pszText); LocalFree(pszTextW); @@ -1586,31 +1580,28 @@ void EditURLDecode(HWND hwnd) // void EditEscapeCChars(HWND hwnd) { - if (SendMessage(hwnd,SCI_GETSELECTIONEND,0,0) - SendMessage(hwnd,SCI_GETSELECTIONSTART,0,0)) + if (!SciCall_IsSelectionEmpty()) { - if (SC_SEL_RECTANGLE != SendMessage(hwnd,SCI_GETSELECTIONMODE,0,0)) + if (SciCall_IsSelectionRectangle()) { - EDITFINDREPLACE efr = { "", "", "", "", 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL }; - efr.hwnd = hwnd; - - SendMessage(hwnd,SCI_BEGINUNDOACTION,0,0); - - StringCchCopyA(efr.szFind,FNDRPL_BUFFER,"\\"); - StringCchCopyA(efr.szReplace,FNDRPL_BUFFER,"\\\\"); - EditReplaceAllInSelection(hwnd,&efr,FALSE); - - StringCchCopyA(efr.szFind,FNDRPL_BUFFER,"\""); - StringCchCopyA(efr.szReplace,FNDRPL_BUFFER,"\\\""); - EditReplaceAllInSelection(hwnd,&efr,FALSE); - - StringCchCopyA(efr.szFind,FNDRPL_BUFFER,"\'"); - StringCchCopyA(efr.szReplace,FNDRPL_BUFFER,"\\\'"); - EditReplaceAllInSelection(hwnd,&efr,FALSE); - - SendMessage(hwnd,SCI_ENDUNDOACTION,0,0); + MsgBox(MBWARN, IDS_SELRECT); + return; } - else - MsgBox(MBWARN,IDS_SELRECT); + + EDITFINDREPLACE efr = { "", "", "", "", 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL }; + efr.hwnd = hwnd; + + StringCchCopyA(efr.szFind,FNDRPL_BUFFER,"\\"); + StringCchCopyA(efr.szReplace,FNDRPL_BUFFER,"\\\\"); + EditReplaceAllInSelection(hwnd,&efr,FALSE); + + StringCchCopyA(efr.szFind,FNDRPL_BUFFER,"\""); + StringCchCopyA(efr.szReplace,FNDRPL_BUFFER,"\\\""); + EditReplaceAllInSelection(hwnd,&efr,FALSE); + + StringCchCopyA(efr.szFind,FNDRPL_BUFFER,"\'"); + StringCchCopyA(efr.szReplace,FNDRPL_BUFFER,"\\\'"); + EditReplaceAllInSelection(hwnd,&efr,FALSE); } } @@ -1621,31 +1612,28 @@ void EditEscapeCChars(HWND hwnd) { // void EditUnescapeCChars(HWND hwnd) { - if (SendMessage(hwnd,SCI_GETSELECTIONEND,0,0) - SendMessage(hwnd,SCI_GETSELECTIONSTART,0,0)) + if (!SciCall_IsSelectionEmpty()) { - if (SC_SEL_RECTANGLE != SendMessage(hwnd,SCI_GETSELECTIONMODE,0,0)) + if (SciCall_IsSelectionRectangle()) { - EDITFINDREPLACE efr = { "", "", "", "", 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL }; - efr.hwnd = hwnd; - - SendMessage(hwnd,SCI_BEGINUNDOACTION,0,0); - - StringCchCopyA(efr.szFind,FNDRPL_BUFFER,"\\\\"); - StringCchCopyA(efr.szReplace,FNDRPL_BUFFER,"\\"); - EditReplaceAllInSelection(hwnd,&efr,FALSE); - - StringCchCopyA(efr.szFind,FNDRPL_BUFFER,"\\\""); - StringCchCopyA(efr.szReplace,FNDRPL_BUFFER,"\""); - EditReplaceAllInSelection(hwnd,&efr,FALSE); - - StringCchCopyA(efr.szFind,FNDRPL_BUFFER,"\\\'"); - StringCchCopyA(efr.szReplace,FNDRPL_BUFFER,"\'"); - EditReplaceAllInSelection(hwnd,&efr,FALSE); - - SendMessage(hwnd,SCI_ENDUNDOACTION,0,0); + MsgBox(MBWARN, IDS_SELRECT); + return; } - else - MsgBox(MBWARN,IDS_SELRECT); + + EDITFINDREPLACE efr = { "", "", "", "", 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL }; + efr.hwnd = hwnd; + + StringCchCopyA(efr.szFind,FNDRPL_BUFFER,"\\\\"); + StringCchCopyA(efr.szReplace,FNDRPL_BUFFER,"\\"); + EditReplaceAllInSelection(hwnd,&efr,FALSE); + + StringCchCopyA(efr.szFind,FNDRPL_BUFFER,"\\\""); + StringCchCopyA(efr.szReplace,FNDRPL_BUFFER,"\""); + EditReplaceAllInSelection(hwnd,&efr,FALSE); + + StringCchCopyA(efr.szFind,FNDRPL_BUFFER,"\\\'"); + StringCchCopyA(efr.szReplace,FNDRPL_BUFFER,"\'"); + EditReplaceAllInSelection(hwnd,&efr,FALSE); } } @@ -1658,7 +1646,7 @@ void EditChar2Hex(HWND hwnd) { //TODO: iterate over complete selection? - if (SC_SEL_RECTANGLE == SciCall_GetSelectionMode()) { + if (SciCall_IsSelectionRectangle()) { MsgBox(MBWARN, IDS_SELRECT); return; } @@ -1669,29 +1657,33 @@ void EditChar2Hex(HWND hwnd) { if (iSelStart == iSelEnd) { iSelEnd = (int)SendMessage(hwnd, SCI_POSITIONAFTER, (WPARAM)iSelStart, 0); } - if (iSelStart == iSelEnd) - return; + if (iSelStart == iSelEnd) { return; } char ch[32] = { '\0' }; WCHAR wch[32] = { L'\0' }; - SciCall_SetSel(iSelStart, iSelEnd); - SendMessage(hwnd,SCI_GETSELTEXT,0,(LPARAM)ch); + EditSelectEx(hwnd, iSelStart, iSelEnd); - if (ch[0] == 0) { - StringCchCopyA(ch, COUNTOF(ch), "\\x00"); - } - else { - UINT cp = Encoding_SciGetCodePage(hwnd); - MultiByteToWideCharStrg(cp,ch,wch); - if (wch[0] <= 0xFF) - StringCchPrintfA(ch,COUNTOF(ch),"\\x%02X",wch[0] & 0xFF); - else - StringCchPrintfA(ch,COUNTOF(ch),"\\u%04X",wch[0]); - } + if ((int)SendMessage(hwnd, SCI_GETSELTEXT, 0, 0) <= COUNTOF(ch)) + { - SendMessage(hwnd,SCI_REPLACESEL,0,(LPARAM)ch); - SciCall_SetSel(iSelStart, iSelStart + StringCchLenA(ch, COUNTOF(ch))); + SendMessage(hwnd, SCI_GETSELTEXT, 0, (LPARAM)ch); + + if (ch[0] == '\0') { + StringCchCopyA(ch, COUNTOF(ch), "\\x00"); + } + else { + UINT cp = Encoding_SciGetCodePage(hwnd); + MultiByteToWideCharStrg(cp, ch, wch); + if (wch[0] <= 0xFF) + StringCchPrintfA(ch, COUNTOF(ch), "\\x%02X", wch[0] & 0xFF); + else + StringCchPrintfA(ch, COUNTOF(ch), "\\u%04X", wch[0]); + } + + SendMessage(hwnd, SCI_REPLACESEL, 0, (LPARAM)ch); + EditSelectEx(hwnd, iSelStart, iSelStart + StringCchLenA(ch, COUNTOF(ch))); + } } @@ -1704,7 +1696,7 @@ void EditHex2Char(HWND hwnd) { if (SciCall_IsSelectionEmpty()) return; - if (SC_SEL_RECTANGLE == SciCall_GetSelectionMode()) { + if (SciCall_IsSelectionRectangle()) { MsgBox(MBWARN, IDS_SELRECT); return; } @@ -1716,26 +1708,26 @@ void EditHex2Char(HWND hwnd) { int iSelStart = SciCall_GetSelectionStart(); int iSelEnd = SciCall_GetSelectionEnd(); - if ((int)SendMessage(hwnd,SCI_GETSELTEXT,0,0) <= COUNTOF(ch)) + if ((int)SendMessage(hwnd, SCI_GETSELTEXT, 0, 0) <= COUNTOF(ch)) { - SendMessage(hwnd,SCI_GETSELTEXT,0,(LPARAM)ch); + SendMessage(hwnd, SCI_GETSELTEXT, 0, (LPARAM)ch); ch[31] = '\0'; - if (StrChrIA(ch,' ') || StrChrIA(ch,'\t') || StrChrIA(ch,'\r') || StrChrIA(ch,'\n') || StrChrIA(ch,'-')) + if (StrChrIA(ch, ' ') || StrChrIA(ch, '\t') || StrChrIA(ch, '\r') || StrChrIA(ch, '\n') || StrChrIA(ch, '-')) return; - if (StrCmpNIA(ch,"\\x",2) == 0 || StrCmpNIA(ch,"\\u",2) == 0) { + if (StrCmpNIA(ch, "\\x", 2) == 0 || StrCmpNIA(ch, "\\u", 2) == 0) { ch[0] = '0'; ch[1] = 'x'; } - else if (StrChrIA("xu",ch[0])) { + else if (StrChrIA("xu", ch[0])) { ch[0] = '0'; bTrySelExpand = TRUE; } - if (sscanf_s(ch,"%x",&i) == 1) { + if (sscanf_s(ch, "%x", &i) == 1) { int cch; if (i == 0) { ch[0] = 0; @@ -1744,15 +1736,15 @@ void EditHex2Char(HWND hwnd) { else { UINT cp = Encoding_SciGetCodePage(hwnd); WCHAR wch[4]; - StringCchPrintf(wch,COUNTOF(wch),L"%lc",(WCHAR)i); - cch = WideCharToMultiByteStrg(cp,wch,ch) - 1; - if (bTrySelExpand && (char)SendMessage(hwnd,SCI_GETCHARAT,(WPARAM)iSelStart-1,0) == '\\') { + StringCchPrintf(wch, COUNTOF(wch), L"%lc", (WCHAR)i); + cch = WideCharToMultiByteStrg(cp, wch, ch) - 1; + if (bTrySelExpand && (char)SendMessage(hwnd, SCI_GETCHARAT, (WPARAM)iSelStart - 1, 0) == '\\') { iSelStart--; } } - SciCall_SetSel(iSelStart, iSelEnd); + EditSelectEx(hwnd, iSelStart, iSelEnd); SendMessage(hwnd, SCI_REPLACESEL, 0, (LPARAM)ch); - SciCall_SetSel(iSelStart, iSelStart + cch); + EditSelectEx(hwnd, iSelStart, iSelStart + cch); } } } @@ -1764,68 +1756,68 @@ void EditHex2Char(HWND hwnd) { // void EditModifyNumber(HWND hwnd,BOOL bIncrease) { - if (SC_SEL_RECTANGLE != SendMessage(hwnd,SCI_GETSELECTIONMODE,0,0)) { + if (SciCall_IsSelectionRectangle()) { + MsgBox(MBWARN, IDS_SELRECT); + return; + } - int iSelStart = (int)SendMessage(hwnd,SCI_GETSELECTIONSTART,0,0); - int iSelEnd = (int)SendMessage(hwnd,SCI_GETSELECTIONEND,0,0); + int iSelStart = (int)SendMessage(hwnd,SCI_GETSELECTIONSTART,0,0); + int iSelEnd = (int)SendMessage(hwnd,SCI_GETSELECTIONEND,0,0); - if (iSelEnd - iSelStart) - { - char chNumber[32] = { '\0' }; - if (SendMessage(hwnd,SCI_GETSELTEXT,0,0) <= COUNTOF(chNumber)) { - SendMessage(hwnd,SCI_GETSELTEXT,0,(LPARAM)chNumber); - chNumber[31] = '\0'; + if (iSelEnd - iSelStart) { + char chNumber[32] = { '\0' }; + if (SendMessage(hwnd, SCI_GETSELTEXT, 0, 0) <= COUNTOF(chNumber)) { + SendMessage(hwnd, SCI_GETSELTEXT, 0, (LPARAM)chNumber); + chNumber[31] = '\0'; - if (StrChrIA(chNumber,'-')) - return; + if (StrChrIA(chNumber, '-')) + return; - int iNumber; - int iWidth; - char chFormat[32] = { '\0' }; - if (!StrChrIA(chNumber, 'x') && sscanf_s(chNumber, "%d", &iNumber) == 1) { - iWidth = StringCchLenA(chNumber,COUNTOF(chNumber)); - if (iNumber >= 0) { - if (bIncrease && iNumber < INT_MAX) - iNumber++; - if (!bIncrease && iNumber > 0) - iNumber--; + int iNumber; + int iWidth; + char chFormat[32] = { '\0' }; + if (!StrChrIA(chNumber, 'x') && sscanf_s(chNumber, "%d", &iNumber) == 1) { + iWidth = StringCchLenA(chNumber, COUNTOF(chNumber)); + if (iNumber >= 0) { + if (bIncrease && iNumber < INT_MAX) + iNumber++; + if (!bIncrease && iNumber > 0) + iNumber--; - StringCchPrintfA(chFormat,COUNTOF(chFormat),"%%0%ii",iWidth); - StringCchPrintfA(chNumber,COUNTOF(chNumber),chFormat,iNumber); - SendMessage(hwnd,SCI_REPLACESEL,0,(LPARAM)chNumber); - SendMessage(hwnd,SCI_SETSEL,iSelStart,iSelStart + StringCchLenA(chNumber,COUNTOF(chNumber))); - } + StringCchPrintfA(chFormat, COUNTOF(chFormat), "%%0%ii", iWidth); + StringCchPrintfA(chNumber, COUNTOF(chNumber), chFormat, iNumber); + SendMessage(hwnd, SCI_REPLACESEL, 0, (LPARAM)chNumber); + SendMessage(hwnd, SCI_SETSEL, iSelStart, iSelStart + StringCchLenA(chNumber, COUNTOF(chNumber))); } - else if (sscanf_s(chNumber, "%x", &iNumber) == 1) { - BOOL bUppercase = FALSE; - iWidth = StringCchLenA(chNumber,COUNTOF(chNumber)) - 2; - if (iNumber >= 0) { - if (bIncrease && iNumber < INT_MAX) - iNumber++; - if (!bIncrease && iNumber > 0) - iNumber--; - for (int i = StringCchLenA(chNumber,COUNTOF(chNumber)) -1 ; i >= 0; i--) { - if (IsCharLowerA(chNumber[i])) - break; - else if (IsCharUpper(chNumber[i])) { - bUppercase = TRUE; - break; - } + } + else if (sscanf_s(chNumber, "%x", &iNumber) == 1) { + BOOL bUppercase = FALSE; + iWidth = StringCchLenA(chNumber, COUNTOF(chNumber)) - 2; + if (iNumber >= 0) { + if (bIncrease && iNumber < INT_MAX) + iNumber++; + if (!bIncrease && iNumber > 0) + iNumber--; + for (int i = StringCchLenA(chNumber, COUNTOF(chNumber)) - 1; i >= 0; i--) { + if (IsCharLowerA(chNumber[i])) + break; + else if (IsCharUpper(chNumber[i])) { + bUppercase = TRUE; + break; } - if (bUppercase) - StringCchPrintfA(chFormat,COUNTOF(chFormat),"%%#0%iX",iWidth); - else - StringCchPrintfA(chFormat,COUNTOF(chFormat),"%%#0%ix",iWidth); - StringCchPrintfA(chNumber,COUNTOF(chNumber),chFormat,iNumber); - SendMessage(hwnd,SCI_REPLACESEL,0,(LPARAM)chNumber); - SendMessage(hwnd,SCI_SETSEL,iSelStart,iSelStart+StringCchLenA(chNumber,COUNTOF(chNumber))); } + if (bUppercase) + StringCchPrintfA(chFormat, COUNTOF(chFormat), "%%#0%iX", iWidth); + else + StringCchPrintfA(chFormat, COUNTOF(chFormat), "%%#0%ix", iWidth); + + StringCchPrintfA(chNumber, COUNTOF(chNumber), chFormat, iNumber); + SendMessage(hwnd, SCI_REPLACESEL, 0, (LPARAM)chNumber); + SendMessage(hwnd, SCI_SETSEL, iSelStart, iSelStart + StringCchLenA(chNumber, COUNTOF(chNumber))); } } } } - else - MsgBox(MBWARN,IDS_SELRECT); } @@ -1835,10 +1827,9 @@ void EditModifyNumber(HWND hwnd,BOOL bIncrease) { // void EditTabsToSpaces(HWND hwnd,int nTabWidth,BOOL bOnlyIndentingWS) { - if ((BOOL)SendMessage(hwnd, SCI_GETSELECTIONEMPTY, 0, 0)) - return; // no selection + if (SciCall_IsSelectionEmpty()) { return; } // no selection - if (SC_SEL_RECTANGLE == SendMessage(hwnd,SCI_GETSELECTIONMODE,0,0)) { + if (SciCall_IsSelectionRectangle()) { MsgBox(MBWARN,IDS_SELRECT); return; } @@ -1924,11 +1915,12 @@ void EditTabsToSpaces(HWND hwnd,int nTabWidth,BOOL bOnlyIndentingWS) iCurPos = iSelStart + cchConvM; } - SendMessage(hwnd,SCI_BEGINUNDOACTION,0,0); - SciCall_SetSel(iSelStart, iSelEnd); - SendMessage(hwnd, SCI_REPLACESEL, 0, (LPARAM)pszText); - SciCall_SetSel(iAnchorPos, iCurPos); - SendMessage(hwnd,SCI_ENDUNDOACTION,0,0); + EditEnterTargetTransaction(); + SendMessage(hwnd, SCI_SETTARGETRANGE, iSelStart, iSelEnd); + SendMessage(hwnd, SCI_REPLACETARGET, (WPARAM)cchConvM, (LPARAM)pszText); + EditLeaveTargetTransaction(); + + EditSelectEx(hwnd, iAnchorPos, iCurPos); GlobalFree(pszText); } @@ -1943,11 +1935,10 @@ void EditTabsToSpaces(HWND hwnd,int nTabWidth,BOOL bOnlyIndentingWS) // void EditSpacesToTabs(HWND hwnd,int nTabWidth,BOOL bOnlyIndentingWS) { - if ((BOOL)SendMessage(hwnd, SCI_GETSELECTIONEMPTY, 0, 0)) - return; // no selection + if (SciCall_IsSelectionEmpty()) { return; } // no selection - if (SC_SEL_RECTANGLE == SendMessage(hwnd,SCI_GETSELECTIONMODE,0,0)) { - MsgBox(MBWARN,IDS_SELRECT); + if (SciCall_IsSelectionRectangle()) { + MsgBox(MBWARN, IDS_SELRECT); return; } @@ -2049,11 +2040,12 @@ void EditSpacesToTabs(HWND hwnd,int nTabWidth,BOOL bOnlyIndentingWS) iCurPos = iSelStart + cchConvM; } - SendMessage(hwnd,SCI_BEGINUNDOACTION,0,0); - SciCall_SetSel(iSelStart, iSelEnd); - SendMessage(hwnd, SCI_REPLACESEL, 0, (LPARAM)pszText); - SciCall_SetSel(iAnchorPos, iCurPos); - SendMessage(hwnd, SCI_ENDUNDOACTION, 0, 0); + EditEnterTargetTransaction(); + SendMessage(hwnd, SCI_SETTARGETRANGE, iSelStart, iSelEnd); + SendMessage(hwnd, SCI_REPLACETARGET, (WPARAM)cchConvM, (LPARAM)pszText); + EditLeaveTargetTransaction(); + + EditSelectEx(hwnd, iAnchorPos, iCurPos); GlobalFree(pszText); } @@ -2079,15 +2071,13 @@ void EditMoveUp(HWND hwnd) int iLineCurPos = iCurPos - SciCall_PositionFromLine(iCurLine); int iLineAnchorPos = iAnchorPos - SciCall_PositionFromLine(iAnchorLine); if (iCurLine > 0) { - SendMessage(hwnd,SCI_BEGINUNDOACTION,0,0); SendMessage(hwnd,SCI_LINETRANSPOSE,0,0); SciCall_SetSel(SciCall_PositionFromLine(iAnchorLine - 1) + iLineAnchorPos, SciCall_PositionFromLine(iCurLine - 1) + iLineCurPos); SendMessage(hwnd,SCI_CHOOSECARETX,0,0); - SendMessage(hwnd,SCI_ENDUNDOACTION,0,0); } } - else if (SC_SEL_RECTANGLE != SciCall_GetSelectionMode()) { + else if (!SciCall_IsSelectionRectangle()) { int iLineSrc = min(iCurLine,iAnchorLine) -1; if (iLineSrc >= 0) { @@ -2112,10 +2102,10 @@ void EditMoveUp(HWND hwnd) --iLineDest; } - SendMessage(hwnd,SCI_BEGINUNDOACTION,0,0); + EditEnterTargetTransaction(); - SciCall_SetSel(iLineSrcStart, iLineSrcEnd); - SendMessage(hwnd,SCI_REPLACESEL,0,(LPARAM)""); + SendMessage(hwnd, SCI_SETTARGETRANGE, iLineSrcStart, iLineSrcEnd); + SendMessage(hwnd, SCI_REPLACETARGET, 0, (LPARAM)""); iLineDestStart = SciCall_PositionFromLine(iLineDest); SendMessage(hwnd,SCI_INSERTTEXT,(WPARAM)iLineDestStart,(LPARAM)pLine); @@ -2132,11 +2122,13 @@ void EditMoveUp(HWND hwnd) chaEOL[0] = '\n'; chaEOL[1] = 0; } - SendMessage(hwnd,SCI_INSERTTEXT,(WPARAM)iLineDestStart,(LPARAM)chaEOL); - SciCall_SetSel(SciCall_GetLineEndPosition(iLineDest), SciCall_GetTextLength()); - SendMessage(hwnd, SCI_REPLACESEL,0,(LPARAM)""); + SendMessage(hwnd, SCI_INSERTTEXT, (WPARAM)iLineDestStart, (LPARAM)chaEOL); + SendMessage(hwnd, SCI_SETTARGETRANGE, SciCall_GetLineEndPosition(iLineDest), SciCall_GetTextLength()); + SendMessage(hwnd, SCI_REPLACETARGET, 0, (LPARAM)""); } + EditLeaveTargetTransaction(); + if (iCurPos < iAnchorPos) { iCurPos = SciCall_PositionFromLine(iCurLine - 1); iAnchorPos = SciCall_PositionFromLine(iLineDest); @@ -2145,9 +2137,7 @@ void EditMoveUp(HWND hwnd) iAnchorPos = SciCall_PositionFromLine(iAnchorLine - 1); iCurPos = SciCall_PositionFromLine(iLineDest); } - SciCall_SetSel(iAnchorPos, iCurPos); - - SendMessage(hwnd,SCI_ENDUNDOACTION,0,0); + EditSelectEx(hwnd, iAnchorPos, iCurPos); } } else @@ -2171,16 +2161,14 @@ void EditMoveDown(HWND hwnd) int iLineCurPos = iCurPos - SciCall_PositionFromLine(iCurLine); int iLineAnchorPos = iAnchorPos - SciCall_PositionFromLine(iAnchorLine); if (iCurLine < (SciCall_GetLineCount() - 1)) { - SendMessage(hwnd, SCI_BEGINUNDOACTION, 0, 0); SciCall_GotoLine(iCurLine + 1); SendMessage(hwnd, SCI_LINETRANSPOSE, 0, 0); SciCall_SetSel(SciCall_PositionFromLine(iAnchorLine + 1) + iLineAnchorPos, SciCall_PositionFromLine(iCurLine + 1) + iLineCurPos); SendMessage(hwnd, SCI_CHOOSECARETX, 0, 0); - SendMessage(hwnd, SCI_ENDUNDOACTION, 0, 0); } } - else if (SC_SEL_RECTANGLE != SciCall_GetSelectionMode()) + else if (!SciCall_IsSelectionRectangle()) { int iLineSrc = max(iCurLine,iAnchorLine) +1; if (max(iCurPos,iAnchorPos) <= SciCall_PositionFromLine(iLineSrc - 1)) { @@ -2224,20 +2212,23 @@ void EditMoveDown(HWND hwnd) iLineSrcEnd = SciCall_PositionFromLine(iLineSrc + 1); iLineDest = min(iCurLine,iAnchorLine); - SendMessage(hwnd,SCI_BEGINUNDOACTION,0,0); + EditEnterTargetTransaction(); - SciCall_SetSel(iLineSrcStart, iLineSrcEnd); - SendMessage(hwnd, SCI_REPLACESEL, 0, (LPARAM)""); + SendMessage(hwnd, SCI_SETTARGETRANGE, iLineSrcStart, iLineSrcEnd); + SendMessage(hwnd, SCI_REPLACETARGET, 0, (LPARAM)""); iLineDestStart = SciCall_PositionFromLine(iLineDest); SendMessage(hwnd,SCI_INSERTTEXT,(WPARAM)iLineDestStart,(LPARAM)pLine); if (bLastLine) { - SciCall_SetSel(SciCall_GetLineEndPosition(SciCall_GetLineCount() - 2), - SciCall_GetTextLength()); - SendMessage(hwnd, SCI_REPLACESEL, 0, (LPARAM)""); + SendMessage(hwnd, SCI_SETTARGETRANGE, + SciCall_GetLineEndPosition(SciCall_GetLineCount() - 2), + SciCall_GetTextLength()); + SendMessage(hwnd, SCI_REPLACETARGET, 0, (LPARAM)""); } + EditLeaveTargetTransaction(); + LocalFree(pLine); if (iCurPos < iAnchorPos) { @@ -2248,9 +2239,7 @@ void EditMoveDown(HWND hwnd) iAnchorPos = SciCall_PositionFromLine(iAnchorLine + 1); iCurPos = SciCall_PositionFromLine(iLineSrc + 1); } - SciCall_SetSel(iAnchorPos, iCurPos); - - SendMessage(hwnd, SCI_ENDUNDOACTION, 0, 0); + EditSelectEx(hwnd, iAnchorPos, iCurPos); } } else @@ -2278,7 +2267,7 @@ void EditModifyLines(HWND hwnd,LPCWSTR pwszPrefix,LPCWSTR pwszAppend) if (lstrlen(pwszAppend)) WideCharToMultiByteStrg(mbcp,pwszAppend,mszAppend1); - if (SC_SEL_RECTANGLE != SciCall_GetSelectionMode()) + if (!SciCall_IsSelectionRectangle()) { int iLine; @@ -2443,7 +2432,8 @@ void EditModifyLines(HWND hwnd,LPCWSTR pwszPrefix,LPCWSTR pwszAppend) } } - SendMessage(hwnd,SCI_BEGINUNDOACTION,0,0); + IgnoreNotifyChangeEvent(); + EditEnterTargetTransaction(); for (iLine = iLineStart; iLine <= iLineEnd; iLine++) { @@ -2464,8 +2454,8 @@ void EditModifyLines(HWND hwnd,LPCWSTR pwszPrefix,LPCWSTR pwszAppend) iPrefixNum++; } iPos = SciCall_PositionFromLine(iLine); - SciCall_SetSel(iPos, iPos); - SendMessage(hwnd, SCI_REPLACESEL, 0, (LPARAM)mszInsert); + SendMessage(hwnd, SCI_SETTARGETRANGE, iPos, iPos); + SendMessage(hwnd, SCI_REPLACETARGET, (WPARAM)-1, (LPARAM)mszInsert); } if (lstrlen(pwszAppend)) { @@ -2483,11 +2473,13 @@ void EditModifyLines(HWND hwnd,LPCWSTR pwszPrefix,LPCWSTR pwszAppend) iAppendNum++; } iPos = SciCall_GetLineEndPosition(iLine); - SciCall_SetSel(iPos, iPos); - SendMessage(hwnd, SCI_REPLACESEL, 0, (LPARAM)mszInsert); + SendMessage(hwnd, SCI_SETTARGETRANGE, iPos, iPos); + SendMessage(hwnd, SCI_REPLACETARGET, (WPARAM)-1, (LPARAM)mszInsert); } } - SendMessage(hwnd,SCI_ENDUNDOACTION,0,0); + + EditLeaveTargetTransaction(); + ObserveNotifyChangeEvent(); // extend selection to start of first line // the above code is not required when last line has been excluded @@ -2503,7 +2495,7 @@ void EditModifyLines(HWND hwnd,LPCWSTR pwszPrefix,LPCWSTR pwszAppend) iAnchorPos = SciCall_PositionFromLine(iLineStart); iCurPos = SciCall_PositionFromLine(iLineEnd + 1); } - SciCall_SetSel(iAnchorPos, iCurPos); + EditSelectEx(hwnd, iAnchorPos, iCurPos); } } else @@ -2526,7 +2518,7 @@ void EditAlignText(HWND hwnd,int nMode) int iCurPos = SciCall_GetCurrentPos(); int iAnchorPos = SciCall_GetAnchor(); - if (SC_SEL_RECTANGLE != SciCall_GetSelectionMode()) + if (!SciCall_IsSelectionRectangle()) { int iLine; int iMinIndent = BUFSIZE_ALIGN; @@ -2572,6 +2564,9 @@ void EditAlignText(HWND hwnd,int nMode) if (iMaxLength < BUFSIZE_ALIGN) { + IgnoreNotifyChangeEvent(); + EditEnterTargetTransaction(); + for (iLine = iLineStart; iLine <= iLineEnd; iLine++) { int iEndPos = SciCall_GetLineEndPosition(iLine); @@ -2580,11 +2575,11 @@ void EditAlignText(HWND hwnd,int nMode) if ((iIndentPos == iEndPos) && (iEndPos > 0)) { if (!bModified) { - SendMessage(hwnd,SCI_BEGINUNDOACTION,0,0); + SendMessage(hwnd, SCI_BEGINUNDOACTION, 0, 0); bModified = TRUE; } - SciCall_SetSel(SciCall_PositionFromLine(iLine), iEndPos); - SendMessage(hwnd,SCI_REPLACESEL,0,(LPARAM)""); + SendMessage(hwnd, SCI_SETTARGETRANGE, SciCall_PositionFromLine(iLine), iEndPos); + SendMessage(hwnd, SCI_REPLACETARGET, 0, (LPARAM)""); } else { @@ -2599,7 +2594,7 @@ void EditAlignText(HWND hwnd,int nMode) int cchLine = (int)SendMessage(hwnd,SCI_GETLINE,(WPARAM)iLine,(LPARAM)tchLineBuf); if (!bModified) { - SendMessage(hwnd,SCI_BEGINUNDOACTION,0,0); + SendMessage(hwnd, SCI_BEGINUNDOACTION, 0, 0); bModified = TRUE; } @@ -2667,10 +2662,10 @@ void EditAlignText(HWND hwnd,int nMode) p = StrEnd(p); } - WideCharToMultiByteStrg(mbcp,wchNewLineBuf,tchLineBuf); + int cch = WideCharToMultiByteStrg(mbcp,wchNewLineBuf,tchLineBuf) - 1; - SciCall_SetSel(SciCall_PositionFromLine(iLine), SciCall_GetLineEndPosition(iLine)); - SendMessage(hwnd, SCI_REPLACESEL, 0, (LPARAM)tchLineBuf); + SendMessage(hwnd, SCI_SETTARGETRANGE, SciCall_PositionFromLine(iLine), SciCall_GetLineEndPosition(iLine)); + SendMessage(hwnd, SCI_REPLACETARGET, (WPARAM)cch, (LPARAM)tchLineBuf); SendMessage(hwnd,SCI_SETLINEINDENTATION,(WPARAM)iLine,(LPARAM)iMinIndent); } @@ -2687,10 +2682,10 @@ void EditAlignText(HWND hwnd,int nMode) p = StrEnd(p); } - WideCharToMultiByteStrg(mbcp,wchNewLineBuf,tchLineBuf); + int cch = WideCharToMultiByteStrg(mbcp,wchNewLineBuf,tchLineBuf) - 1; - SciCall_SetSel(SciCall_PositionFromLine(iLine), SciCall_GetLineEndPosition(iLine)); - SendMessage(hwnd, SCI_REPLACESEL, 0, (LPARAM)tchLineBuf); + SendMessage(hwnd, SCI_SETTARGETRANGE, SciCall_PositionFromLine(iLine), SciCall_GetLineEndPosition(iLine)); + SendMessage(hwnd, SCI_REPLACETARGET, (WPARAM)cch, (LPARAM)tchLineBuf); SendMessage(hwnd, SCI_SETLINEINDENTATION, (WPARAM)iLine, (LPARAM)iMinIndent); } @@ -2726,7 +2721,7 @@ void EditAlignText(HWND hwnd,int nMode) p = StrEnd(p); } - WideCharToMultiByteStrg(mbcp,wchNewLineBuf,tchLineBuf); + int cch = WideCharToMultiByteStrg(mbcp,wchNewLineBuf,tchLineBuf) - 1; if (nMode == ALIGN_RIGHT || nMode == ALIGN_CENTER) { SendMessage(hwnd,SCI_SETLINEINDENTATION,(WPARAM)iLine,(LPARAM)iMinIndent); @@ -2735,8 +2730,8 @@ void EditAlignText(HWND hwnd,int nMode) else iPos = SciCall_PositionFromLine(iLine); - SciCall_SetSel(iPos, SciCall_GetLineEndPosition(iLine)); - SendMessage(hwnd, SCI_REPLACESEL, 0, (LPARAM)tchLineBuf); + SendMessage(hwnd, SCI_SETTARGETRANGE, iPos, SciCall_GetLineEndPosition(iLine)); + SendMessage(hwnd, SCI_REPLACETARGET, (WPARAM)cch, (LPARAM)tchLineBuf); if (nMode == ALIGN_LEFT) SendMessage(hwnd,SCI_SETLINEINDENTATION,(WPARAM)iLine,(LPARAM)iMinIndent); @@ -2744,13 +2739,16 @@ void EditAlignText(HWND hwnd,int nMode) } } } - if (bModified) - SendMessage(hwnd,SCI_ENDUNDOACTION,0,0); + EditLeaveTargetTransaction(); + ObserveNotifyChangeEvent(); } else MsgBox(MBINFO,IDS_BUFFERTOOSMALL); - + if (bModified) { + SendMessage(hwnd, SCI_ENDUNDOACTION, 0, 0); + } + if (iCurPos < iAnchorPos) { iCurPos = SciCall_PositionFromLine(iLineStart); iAnchorPos = SciCall_PositionFromLine(iLineEnd + 1); @@ -2759,7 +2757,7 @@ void EditAlignText(HWND hwnd,int nMode) iAnchorPos = SciCall_PositionFromLine(iLineStart); iCurPos = SciCall_PositionFromLine(iLineEnd + 1); } - SciCall_SetSel(iAnchorPos, iCurPos); + EditSelectEx(hwnd, iAnchorPos, iCurPos); } else MsgBox(MBWARN,IDS_SELRECT); @@ -2770,59 +2768,63 @@ void EditAlignText(HWND hwnd,int nMode) // // EditEncloseSelection() // -void EditEncloseSelection(HWND hwnd,LPCWSTR pwszOpen,LPCWSTR pwszClose) +void EditEncloseSelection(HWND hwnd, LPCWSTR pwszOpen, LPCWSTR pwszClose) { - char mszOpen[256*3] = { '\0' }; - char mszClose[256*3] = { '\0' }; + if (SciCall_IsSelectionRectangle()) + { + MsgBox(MBWARN, IDS_SELRECT); + return; + } + + char mszOpen[256 * 3] = { '\0' }; + char mszClose[256 * 3] = { '\0' }; int iSelStart = SciCall_GetSelectionStart(); - int iSelEnd = SciCall_GetSelectionEnd(); + int iSelEnd = SciCall_GetSelectionEnd(); UINT mbcp = Encoding_SciGetCodePage(hwnd); if (lstrlen(pwszOpen)) - WideCharToMultiByteStrg(mbcp,pwszOpen,mszOpen); + WideCharToMultiByteStrg(mbcp, pwszOpen, mszOpen); if (lstrlen(pwszClose)) - WideCharToMultiByteStrg(mbcp,pwszClose,mszClose); + WideCharToMultiByteStrg(mbcp, pwszClose, mszClose); - if (SC_SEL_RECTANGLE != SendMessage(hwnd,SCI_GETSELECTIONMODE,0,0)) - { - SendMessage(hwnd,SCI_BEGINUNDOACTION,0,0); + const int iLenOpen = StringCchLenA(mszOpen, COUNTOF(mszOpen)); + const int iLenClose = StringCchLenA(mszClose, COUNTOF(mszClose)); - if (StringCchLenA(mszOpen,COUNTOF(mszOpen))) { - SciCall_SetSel(iSelStart, iSelStart); - SendMessage(hwnd, SCI_REPLACESEL, 0, (LPARAM)mszOpen); - } + int token = BeginUndoAction(); - if (StringCchLenA(mszClose,COUNTOF(mszClose))) { - SciCall_SetSel(iSelEnd + StringCchLenA(mszOpen, COUNTOF(mszOpen)), - iSelEnd + StringCchLenA(mszOpen, COUNTOF(mszOpen))); - SendMessage(hwnd, SCI_REPLACESEL, 0, (LPARAM)mszClose); - } - - SendMessage(hwnd,SCI_ENDUNDOACTION,0,0); - - // Fix selection - if (iSelStart == iSelEnd) - SciCall_SetSel(iSelStart + StringCchLenA(mszOpen, COUNTOF(mszOpen)), - iSelStart + StringCchLenA(mszOpen, COUNTOF(mszOpen))); - else { - int iCurPos = SciCall_GetCurrentPos(); - int iAnchorPos = SciCall_GetAnchor(); - if (iCurPos < iAnchorPos) { - iCurPos = iSelStart + StringCchLenA(mszOpen,COUNTOF(mszOpen)); - iAnchorPos = iSelEnd + StringCchLenA(mszOpen,COUNTOF(mszOpen)); - } - else { - iAnchorPos = iSelStart + StringCchLenA(mszOpen,COUNTOF(mszOpen)); - iCurPos = iSelEnd + StringCchLenA(mszOpen,COUNTOF(mszOpen)); - } - SciCall_SetSel(iAnchorPos, iCurPos); - } + if (iLenOpen > 0) { + SciCall_SetSel(iSelStart, iSelStart); + SendMessage(hwnd, SCI_REPLACESEL, 0, (LPARAM)mszOpen); } - else - MsgBox(MBWARN,IDS_SELRECT); + + if (iLenClose > 0) { + SciCall_SetSel(iSelEnd + iLenOpen, iSelEnd + iLenOpen); + SendMessage(hwnd, SCI_REPLACESEL, 0, (LPARAM)mszClose); + } + + // Fix selection + if (iSelStart == iSelEnd) { + const int iPos = iSelStart + iLenOpen; + EditSelectEx(hwnd, iPos, iPos); + } + else { + int iCurPos = SciCall_GetCurrentPos(); + int iAnchorPos = SciCall_GetAnchor(); + + if (iCurPos < iAnchorPos) { + iCurPos = iSelStart + iLenOpen; + iAnchorPos = iSelEnd + iLenOpen; + } + else { + iAnchorPos = iSelStart + iLenOpen; + iCurPos = iSelEnd + iLenOpen; + } + EditSelectEx(hwnd, iAnchorPos, iCurPos); + } + EndUndoAction(token); } @@ -2844,7 +2846,7 @@ void EditToggleLineComments(HWND hwnd,LPCWSTR pwszComment,BOOL bInsertAtStart) int cchComment = StringCchLenA(mszComment,COUNTOF(mszComment)); - if ((SC_SEL_RECTANGLE != SciCall_GetSelectionMode()) && (cchComment > 0)) + if ((!SciCall_IsSelectionRectangle()) && (cchComment > 0)) { int iCommentCol = 0; int iLineStart = SciCall_LineFromPosition(iSelStart); @@ -2870,7 +2872,10 @@ void EditToggleLineComments(HWND hwnd,LPCWSTR pwszComment,BOOL bInsertAtStart) } } - SendMessage(hwnd,SCI_BEGINUNDOACTION,0,0); + int token = BeginUndoAction(); + + IgnoreNotifyChangeEvent(); + EditEnterTargetTransaction(); for (int iLine = iLineStart; iLine <= iLineEnd; iLine++) { @@ -2891,8 +2896,8 @@ void EditToggleLineComments(HWND hwnd,LPCWSTR pwszComment,BOOL bInsertAtStart) case 0: iAction = 2; case 2: - SciCall_SetSel(iIndentPos, iIndentPos + cchComment); - SendMessage(hwnd, SCI_REPLACESEL, 0, (LPARAM)""); + SendMessage(hwnd, SCI_SETTARGETRANGE, iIndentPos, iIndentPos + cchComment); + SendMessage(hwnd, SCI_REPLACETARGET, 0, (LPARAM)""); break; case 1: break; @@ -2913,7 +2918,9 @@ void EditToggleLineComments(HWND hwnd,LPCWSTR pwszComment,BOOL bInsertAtStart) } } } - SendMessage(hwnd,SCI_ENDUNDOACTION,0,0); + + EditLeaveTargetTransaction(); + ObserveNotifyChangeEvent(); if (iSelStart != iSelEnd) { @@ -2926,9 +2933,10 @@ void EditToggleLineComments(HWND hwnd,LPCWSTR pwszComment,BOOL bInsertAtStart) iAnchorPos = SciCall_PositionFromLine(iLineStart); iCurPos = SciCall_PositionFromLine(iLineEnd + 1); } - SciCall_SetSel(iAnchorPos, iCurPos); + EditSelectEx(hwnd, iAnchorPos, iCurPos); } + EndUndoAction(token); } else MsgBox(MBWARN,IDS_SELRECT); @@ -2946,6 +2954,7 @@ void EditPadWithSpaces(HWND hwnd,BOOL bSkipEmpty,BOOL bNoUndoGroup) int iLine = 0; BOOL bIsRectangular = FALSE; BOOL bReducedSelection = FALSE; + int token = -1; int iSelStart = 0; int iSelEnd = 0; @@ -2958,7 +2967,7 @@ void EditPadWithSpaces(HWND hwnd,BOOL bSkipEmpty,BOOL bNoUndoGroup) int iRcCurCol = 0; int iRcAnchorCol = 0; - if (SC_SEL_RECTANGLE != SciCall_GetSelectionMode()) { + if (!SciCall_IsSelectionRectangle()) { iSelStart = SciCall_GetSelectionStart(); iSelEnd = SciCall_GetSelectionEnd(); @@ -3019,7 +3028,10 @@ void EditPadWithSpaces(HWND hwnd,BOOL bSkipEmpty,BOOL bNoUndoGroup) pmszPadStr[size] = '\0'; if (!bNoUndoGroup) - SendMessage(hwnd,SCI_BEGINUNDOACTION,0,0); + token = BeginUndoAction(); + + IgnoreNotifyChangeEvent(); + EditEnterTargetTransaction(); for (iLine = iLineStart; iLine <= iLineEnd; iLine++) { @@ -3042,18 +3054,23 @@ void EditPadWithSpaces(HWND hwnd,BOOL bSkipEmpty,BOOL bNoUndoGroup) //iCol += (int)SendMessage(hwnd, SCI_GETSELECTIONNCARETVIRTUALSPACE, 0, 0); iPadLen = iMaxColumn - iCol; pmszPadStr[iPadLen] = '\0'; - SciCall_SetSel(iPos, iPos); - SendMessage(hwnd, SCI_REPLACESEL, 0, (LPARAM)pmszPadStr); + + SendMessage(hwnd, SCI_SETTARGETRANGE, iPos, iPos); + SendMessage(hwnd, SCI_REPLACETARGET, (WPARAM)-1, (LPARAM)pmszPadStr); + pmszPadStr[iPadLen] = ' '; } + EditLeaveTargetTransaction(); + ObserveNotifyChangeEvent(); + if (pmszPadStr) LocalFree(pmszPadStr); - - if (!bNoUndoGroup) - SendMessage(hwnd,SCI_ENDUNDOACTION,0,0); } + if (!bNoUndoGroup && (token >= 0)) + EndUndoAction(token); + if (!bIsRectangular && (SciCall_LineFromPosition(iSelStart) != SciCall_LineFromPosition(iSelEnd))) { int iCurPos = SciCall_GetCurrentPos(); @@ -3072,7 +3089,7 @@ void EditPadWithSpaces(HWND hwnd,BOOL bSkipEmpty,BOOL bNoUndoGroup) else iCurPos = SciCall_PositionFromLine(iLineEnd + 1); } - SciCall_SetSel(iAnchorPos, iCurPos); + EditSelectEx(hwnd, iAnchorPos, iCurPos); } else if (bIsRectangular) { @@ -3084,51 +3101,50 @@ void EditPadWithSpaces(HWND hwnd,BOOL bSkipEmpty,BOOL bNoUndoGroup) } + //============================================================================= // // EditStripFirstCharacter() // void EditStripFirstCharacter(HWND hwnd) { - int iSelStart = SciCall_GetSelectionStart(); - int iSelEnd = SciCall_GetSelectionEnd(); + int iSelStart = 0; + int iSelEnd = 0; + BOOL bIsSelEmpty = SciCall_IsSelectionEmpty(); - if (iSelStart == iSelEnd) { - iSelStart = 0; + if (!bIsSelEmpty) { + if (SciCall_IsSelectionRectangle()) { + MsgBox(MBWARN, IDS_SELRECT); + return; + } + iSelStart = SciCall_GetSelectionStart(); + iSelEnd = SciCall_GetSelectionEnd(); + } + else { iSelEnd = SciCall_GetTextLength(); } - if (SC_SEL_RECTANGLE != SciCall_GetSelectionMode()) - { - int iLineStart = SciCall_LineFromPosition(iSelStart); - int iLineEnd = SciCall_LineFromPosition(iSelEnd); + int iLineStart = SciCall_LineFromPosition(iSelStart); + int iLineEnd = SciCall_LineFromPosition(iSelEnd); - if (iSelStart > SciCall_PositionFromLine(iLineStart)) - ++iLineStart; + if (iSelStart > SciCall_PositionFromLine(iLineStart)) { ++iLineStart; } + if (iSelEnd <= SciCall_PositionFromLine(iLineEnd)) { --iLineEnd; } - if (iSelEnd <= SciCall_PositionFromLine(iLineEnd)) - --iLineEnd; + IgnoreNotifyChangeEvent(); + EditEnterTargetTransaction(); - SendMessage(hwnd,SCI_BEGINUNDOACTION,0,0); - - int chCnt = 0; - for (int iLine = iLineStart; iLine <= iLineEnd; iLine++) - { - int iPos = SciCall_PositionFromLine(iLine); - if ((SciCall_GetLineEndPosition(iLine) - iPos) > 0) - { - SciCall_SetSel(iPos, SciCall_PositionAfter(iPos)); - SendMessage(hwnd, SCI_REPLACESEL, 0, (LPARAM)""); - ++chCnt; - } + int chCnt = 0; + for (int iLine = iLineStart; iLine <= iLineEnd; ++iLine) { + int iPos = SciCall_PositionFromLine(iLine); + if (iPos < SciCall_GetLineEndPosition(iLine)) { + SendMessage(hwnd, SCI_SETTARGETRANGE, (WPARAM)iPos, (LPARAM)SciCall_PositionAfter(iPos)); + SendMessage(hwnd, SCI_REPLACETARGET, 0, (LPARAM)""); + ++chCnt; } - SendMessage(hwnd,SCI_ENDUNDOACTION,0,0); - - if ((iSelStart != 0) || (iSelEnd != SciCall_GetTextLength())) - SciCall_SetSel(iSelStart, (iSelEnd - chCnt)); } - else - MsgBox(MBWARN,IDS_SELRECT); + + EditLeaveTargetTransaction(); + ObserveNotifyChangeEvent(); } @@ -3138,47 +3154,45 @@ void EditStripFirstCharacter(HWND hwnd) // void EditStripLastCharacter(HWND hwnd) { - int iSelStart = SciCall_GetSelectionStart(); - int iSelEnd = SciCall_GetSelectionEnd(); + int iSelStart = 0; + int iSelEnd = 0; + BOOL bIsSelEmpty = SciCall_IsSelectionEmpty(); - if (iSelStart == iSelEnd) { - iSelStart = 0; - iSelEnd = SciCall_GetTextLength(); - } - - if (SC_SEL_RECTANGLE != SciCall_GetSelectionMode()) - { - int iLineStart = SciCall_LineFromPosition(iSelStart); - int iLineEnd = SciCall_LineFromPosition(iSelEnd); - - - if (iSelStart >= SciCall_GetLineEndPosition(iLineStart)) - ++iLineStart; - - if (iSelEnd < SciCall_GetLineEndPosition(iLineEnd)) - iLineEnd--; - - SendMessage(hwnd,SCI_BEGINUNDOACTION,0,0); - - int chCnt = 0; - for (int iLine = iLineStart; iLine <= iLineEnd; iLine++) - { - int iStartPos = SciCall_PositionFromLine(iLine); - int iEndPos = SciCall_GetLineEndPosition(iLine); - if ((iEndPos - iStartPos) > 0) - { - SciCall_SetSel(SciCall_PositionBefore(iEndPos), iEndPos); - SendMessage(hwnd, SCI_REPLACESEL, 0, (LPARAM)""); - ++chCnt; - } + if (!bIsSelEmpty) { + if (SciCall_IsSelectionRectangle()) { + MsgBox(MBWARN, IDS_SELRECT); + return; } - SendMessage(hwnd,SCI_ENDUNDOACTION,0,0); - if ((iSelStart != 0) || (iSelEnd != SciCall_GetTextLength())) - SciCall_SetSel(iSelStart, (iSelEnd - chCnt)); + iSelStart = SciCall_GetSelectionStart(); + iSelEnd = SciCall_GetSelectionEnd(); } - else - MsgBox(MBWARN,IDS_SELRECT); + else { + iSelEnd = SciCall_GetTextLength(); + } + + int iLineStart = SciCall_LineFromPosition(iSelStart); + int iLineEnd = SciCall_LineFromPosition(iSelEnd); + + if (iSelStart >= SciCall_GetLineEndPosition(iLineStart)) { ++iLineStart; } + if (iSelEnd < SciCall_GetLineEndPosition(iLineEnd)) { --iLineEnd; } + + IgnoreNotifyChangeEvent(); + EditEnterTargetTransaction(); + + for (int iLine = iLineStart; iLine <= iLineEnd; ++iLine) + { + int iStartPos = SciCall_PositionFromLine(iLine); + int iEndPos = SciCall_GetLineEndPosition(iLine); + if (iStartPos < iEndPos) + { + SendMessage(hwnd, SCI_SETTARGETRANGE, (WPARAM)SciCall_PositionBefore(iEndPos), (LPARAM)iEndPos); + SendMessage(hwnd, SCI_REPLACETARGET, 0, (LPARAM)""); + } + } + + EditLeaveTargetTransaction(); + ObserveNotifyChangeEvent(); } @@ -3186,46 +3200,54 @@ void EditStripLastCharacter(HWND hwnd) // // EditStripTrailingBlanks() // -void EditStripTrailingBlanks(HWND hwnd,BOOL bIgnoreSelection) +void EditStripTrailingBlanks(HWND hwnd, BOOL bIgnoreSelection) { - // Check if there is any selection... simply use a regular expression replace! - if (!bIgnoreSelection && !SciCall_IsSelectionEmpty()) - { - if (SC_SEL_RECTANGLE != SciCall_GetSelectionMode()) - { - EDITFINDREPLACE efrTrim = { "[ \t]+$", "", "", "", SCFIND_NP3_REGEX, 0, 0, 0, 0, 0, 0, 0, 0, NULL }; - efrTrim.hwnd = hwnd; - EditReplaceAllInSelection(hwnd,&efrTrim,FALSE); - } - else - MsgBox(MBWARN,IDS_SELRECT); - } - // Code from SciTE... - else - { - SendMessage(hwnd,SCI_BEGINUNDOACTION,0,0); - int maxLines = SciCall_GetLineCount(); - for (int line = 0; line < maxLines; line++) - { - int lineStart = SciCall_PositionFromLine(line); - int lineEnd = SciCall_GetLineEndPosition(line); - int i = lineEnd; - char ch = '\0'; - do { - --i; - ch = SciCall_GetCharAt(i); - } - while ((i >= lineStart) && ((ch == ' ') || (ch == '\t'))); + int iSelStart = 0; + int iSelEnd = 0; - if (i < (lineEnd-1)) - { - SciCall_SetSel(i + 1, lineEnd); - SendMessage(hwnd, SCI_REPLACESEL, 0, (LPARAM)""); - } + if (!bIgnoreSelection && !SciCall_IsSelectionEmpty()) { + if (SciCall_IsSelectionRectangle()) { + MsgBox(MBWARN, IDS_SELRECT); + return; } - SendMessage(hwnd,SCI_ENDUNDOACTION,0,0); + + iSelStart = SciCall_GetSelectionStart(); + iSelEnd = SciCall_GetSelectionEnd(); } + else { + iSelEnd = SciCall_GetTextLength(); + } + + int iLineStart = SciCall_LineFromPosition(iSelStart); + int iLineEnd = SciCall_LineFromPosition(iSelEnd); + + if (iSelStart >= SciCall_GetLineEndPosition(iLineStart)) { ++iLineStart; } + if (iSelEnd < SciCall_GetLineEndPosition(iLineEnd)) { --iLineEnd; } + + + IgnoreNotifyChangeEvent(); + EditEnterTargetTransaction(); + + for (int iLine = iLineStart; iLine <= iLineEnd; ++iLine) + { + int iStartPos = SciCall_PositionFromLine(iLine); + int iEndPos = SciCall_GetLineEndPosition(iLine); + + int i = iEndPos; + char ch = '\0'; + do { + ch = SciCall_GetCharAt(--i); + } while ((i >= iStartPos) && ((ch == ' ') || (ch == '\t'))); + + if ((i + 1) < iEndPos) { + SendMessage(hwnd, SCI_SETTARGETRANGE, (WPARAM)(i + 1), (LPARAM)iEndPos); + SendMessage(hwnd, SCI_REPLACETARGET, 0, (LPARAM)""); + } + } + + EditLeaveTargetTransaction(); + ObserveNotifyChangeEvent(); } //============================================================================= @@ -3234,95 +3256,93 @@ void EditStripTrailingBlanks(HWND hwnd,BOOL bIgnoreSelection) // void EditCompressSpaces(HWND hwnd) { - if (SC_SEL_RECTANGLE != SciCall_GetSelectionMode()) - { - int iSelStart = SciCall_GetSelectionStart(); - int iSelEnd = SciCall_GetSelectionEnd(); - int iCurPos = SciCall_GetCurrentPos(); - int iAnchorPos = SciCall_GetAnchor(); - int iLineStart = SciCall_LineFromPosition(iSelStart); - int iLineEnd = SciCall_LineFromPosition(iSelEnd); - int iLength = SciCall_GetTextLength(); - - char* pszIn; - char* pszOut; - BOOL bIsLineStart, bIsLineEnd; - BOOL bModified = FALSE; - - if (iSelStart != iSelEnd) { - int cch = (int)SendMessage(hwnd,SCI_GETSELTEXT,0,0); - pszIn = LocalAlloc(LPTR,cch); - pszOut = LocalAlloc(LPTR,cch); - SendMessage(hwnd,SCI_GETSELTEXT,0,(LPARAM)pszIn); - bIsLineStart = (iSelStart == SciCall_PositionFromLine(iLineStart)); - bIsLineEnd = (iSelEnd == SciCall_GetLineEndPosition(iLineEnd)); - } - else { - int cch = iLength + 1; - pszIn = LocalAlloc(GPTR,cch); - pszOut = LocalAlloc(GPTR,cch); - SendMessage(hwnd,SCI_GETTEXT,(WPARAM)cch,(LPARAM)pszIn); - bIsLineStart = TRUE; - bIsLineEnd = TRUE; - } - - if (pszIn && pszOut) { - char *ci, *co = pszOut; - for (ci = pszIn; *ci; ci++) { - if (*ci == ' ' || *ci == '\t') { - if (*ci == '\t') - bModified = TRUE; - while (*(ci+1) == ' ' || *(ci+1) == '\t') { - ci++; - bModified = TRUE; - } - if (!bIsLineStart && (*(ci+1) != '\n' && *(ci+1) != '\r')) - *co++ = ' '; - else - bModified = TRUE; - } - else { - if (*ci == '\n' || *ci == '\r') - bIsLineStart = TRUE; - else - bIsLineStart = FALSE; - *co++ = *ci; - } - } - if (bIsLineEnd && co > pszOut && *(co-1) == ' ') { - *--co = 0; - bModified = TRUE; - } - - if (bModified) { - if (iSelStart != iSelEnd) { - SciCall_SetSel(iSelStart, iSelEnd); - } - else { - SciCall_SetSel(0, iLength); - } - SendMessage(hwnd,SCI_BEGINUNDOACTION,0,0); - SendMessage(hwnd, SCI_REPLACESEL, 0, (LPARAM)pszOut); - - if (iCurPos > iAnchorPos) { - iCurPos = SciCall_GetCurrentPos(); - iAnchorPos = iSelStart; - } - else if (iCurPos < iAnchorPos) { - iCurPos = iSelStart; - iAnchorPos = SciCall_GetCurrentPos(); - } - SciCall_SetSel(iAnchorPos, iCurPos); - SendMessage(hwnd,SCI_ENDUNDOACTION,0,0); - } - } - if (pszIn) - LocalFree(pszIn); - if (pszOut) - LocalFree(pszOut); + if (SciCall_IsSelectionRectangle()) { + MsgBox(MBWARN, IDS_SELRECT); + return; } - else - MsgBox(MBWARN,IDS_SELRECT); + + const int iCurPos = SciCall_GetCurrentPos(); + const int iAnchorPos = SciCall_GetAnchor(); + const int iLineStart = SciCall_LineFromPosition(min(iCurPos, iAnchorPos)); + const int iLineEnd = SciCall_LineFromPosition(max(iCurPos, iAnchorPos)); + const int iTxtLength = SciCall_GetTextLength(); + + const char* pszIn = NULL; + char* pszOut = NULL; + BOOL bIsLineStart = TRUE; + BOOL bIsLineEnd = TRUE; + BOOL bModified = FALSE; + + int cch = 0; + if (SciCall_IsSelectionEmpty()) { + pszIn = (const char*)SciCall_GetCharacterPointer(); + cch = iTxtLength + 1; + pszOut = LocalAlloc(GPTR, cch); + } + else { + pszIn = (const char*)SciCall_GetRangePointer(min(iCurPos, iAnchorPos), abs(iCurPos - iAnchorPos)); + cch = (int)SendMessage(hwnd, SCI_GETSELTEXT, 0, 0); + pszOut = LocalAlloc(LPTR,cch); + bIsLineStart = (min(iCurPos, iAnchorPos) == SciCall_PositionFromLine(iLineStart)); + bIsLineEnd = (max(iCurPos, iAnchorPos) == SciCall_GetLineEndPosition(iLineEnd)); + } + + if (pszIn && pszOut) { + char* co = (char*)pszOut; + for (int i = 0; i < cch; ++i) { + if (pszIn[i] == ' ' || pszIn[i] == '\t') { + if (pszIn[i] == '\t') + bModified = TRUE; + while (pszIn[i+1] == ' ' || pszIn[i+1] == '\t') { + ++i; + bModified = TRUE; + } + if (!bIsLineStart && (pszIn[i+1] != '\n' && pszIn[i+1] != '\r')) + *co++ = ' '; + else + bModified = TRUE; + } + else { + if (pszIn[i] == '\n' || pszIn[i] == '\r') + bIsLineStart = TRUE; + else + bIsLineStart = FALSE; + *co++ = pszIn[i]; + } + } + if (bIsLineEnd && (co > pszOut) && (*(co-1) == ' ')) { + *--co = '\0'; + bModified = TRUE; + } + + if (bModified) { + + EditEnterTargetTransaction(); + + if (!SciCall_IsSelectionEmpty()) { + SendMessage(hwnd, SCI_TARGETFROMSELECTION, 0, 0); + } + else { + SendMessage(hwnd, SCI_SETTARGETRANGE, 0, iTxtLength); + } + SendMessage(hwnd, SCI_REPLACETARGET, (WPARAM)-1, (LPARAM)pszOut); + + EditLeaveTargetTransaction(); + + const int iNewLen = StringCchLenA(pszOut, LocalSize(pszOut)); + + if (iCurPos > iAnchorPos) { + EditSelectEx(hwnd, iAnchorPos, iAnchorPos + iNewLen); + } + else if (iCurPos < iAnchorPos) { + EditSelectEx(hwnd, iCurPos, iCurPos + iNewLen); + } + else { + EditSelectEx(hwnd, iAnchorPos, iCurPos); + } + } + } + if (pszOut) { LocalFree(pszOut); } } @@ -3340,41 +3360,43 @@ void EditRemoveBlankLines(HWND hwnd,BOOL bMerge) iSelEnd = SciCall_GetTextLength(); } - if (SC_SEL_RECTANGLE != SciCall_GetSelectionMode()) - { - int iLineStart = SciCall_LineFromPosition(iSelStart); - int iLineEnd = SciCall_LineFromPosition(iSelEnd); - - if (iSelStart > SciCall_PositionFromLine(iLineStart)) - ++iLineStart; - - if ((iSelEnd <= SciCall_PositionFromLine(iLineEnd)) && (iLineEnd != SciCall_GetLineCount() - 1)) - --iLineEnd; - - SendMessage(hwnd,SCI_BEGINUNDOACTION,0,0); - - for (int iLine = iLineStart; iLine <= iLineEnd; ) - { - int nBlanks = 0; - while (((iLine + nBlanks) <= iLineEnd) && - (SciCall_PositionFromLine(iLine + nBlanks) == SciCall_GetLineEndPosition(iLine + nBlanks))) { - ++nBlanks; - } - if ((nBlanks == 0) || ((nBlanks == 1) && bMerge)) { - iLine += (nBlanks + 1); - } - else { - if (bMerge) { --nBlanks; } - SciCall_SetSel(SciCall_PositionFromLine(iLine), SciCall_PositionFromLine(iLine + nBlanks)); - SendMessage(hwnd, SCI_REPLACESEL, 0, (LPARAM)""); - if (bMerge) { ++iLine; } - iLineEnd -= nBlanks; - } - } - SendMessage(hwnd,SCI_ENDUNDOACTION,0,0); + if (SciCall_IsSelectionRectangle()) { + MsgBox(MBWARN, IDS_SELRECT); + return; } - else - MsgBox(MBWARN,IDS_SELRECT); + + int iLineStart = SciCall_LineFromPosition(iSelStart); + int iLineEnd = SciCall_LineFromPosition(iSelEnd); + + if (iSelStart > SciCall_PositionFromLine(iLineStart)) { ++iLineStart; } + if ((iSelEnd <= SciCall_PositionFromLine(iLineEnd)) && (iLineEnd != SciCall_GetLineCount() - 1)) { --iLineEnd; } + + IgnoreNotifyChangeEvent(); + EditEnterTargetTransaction(); + + for (int iLine = iLineStart; iLine <= iLineEnd; ) + { + int nBlanks = 0; + while (((iLine + nBlanks) <= iLineEnd) && + (SciCall_PositionFromLine(iLine + nBlanks) == SciCall_GetLineEndPosition(iLine + nBlanks))) { + ++nBlanks; + } + if ((nBlanks == 0) || ((nBlanks == 1) && bMerge)) { + iLine += (nBlanks + 1); + } + else { + if (bMerge) { --nBlanks; } + + SendMessage(hwnd, SCI_SETTARGETRANGE, SciCall_PositionFromLine(iLine), SciCall_PositionFromLine(iLine + nBlanks)); + SendMessage(hwnd, SCI_REPLACETARGET, 0, (LPARAM)""); + + if (bMerge) { ++iLine; } + iLineEnd -= nBlanks; + } + } + + EditLeaveTargetTransaction(); + ObserveNotifyChangeEvent(); } @@ -3389,7 +3411,7 @@ void EditWrapToColumn(HWND hwnd,int nColumn/*,int nTabWidth*/) if (SciCall_IsSelectionEmpty()) return; - if (SC_SEL_RECTANGLE == SciCall_GetSelectionMode()) { + if (SciCall_IsSelectionRectangle()) { MsgBox(MBWARN,IDS_SELRECT); return; } @@ -3558,11 +3580,12 @@ void EditWrapToColumn(HWND hwnd,int nColumn/*,int nTabWidth*/) iCurPos = iSelStart + cchConvM; } - SendMessage(hwnd,SCI_BEGINUNDOACTION,0,0); - SciCall_SetSel(iSelStart, iSelEnd); - SendMessage(hwnd, SCI_REPLACESEL, 0, (LPARAM)pszText); - SciCall_SetSel(iAnchorPos, iCurPos); - SendMessage(hwnd,SCI_ENDUNDOACTION,0,0); + EditEnterTargetTransaction(); + SendMessage(hwnd, SCI_SETTARGETRANGE, iSelStart, iSelEnd); + SendMessage(hwnd, SCI_REPLACETARGET, (WPARAM)cchConvM, (LPARAM)pszText); + EditLeaveTargetTransaction(); + + EditSelectEx(hwnd, iAnchorPos, iCurPos); GlobalFree(pszText); } @@ -3589,7 +3612,7 @@ void EditJoinLinesEx(HWND hwnd, BOOL bPreserveParagraphs, BOOL bCRLF2Space) if (SciCall_IsSelectionEmpty()) return; - if (SC_SEL_RECTANGLE == SendMessage(hwnd,SCI_GETSELECTIONMODE,0,0)) { + if (SciCall_IsSelectionRectangle()) { MsgBox(MBWARN,IDS_SELRECT); return; } @@ -3654,24 +3677,25 @@ void EditJoinLinesEx(HWND hwnd, BOOL bPreserveParagraphs, BOOL bCRLF2Space) pszJoin[++cchJoin] = pszText[i]; // copy char } } + ++cchJoin; // start at -1 if (bModified) { if (iAnchorPos > iCurPos) { iCurPos = iSelStart; - iAnchorPos = iSelStart + cchJoin + 1; + iAnchorPos = iSelStart + cchJoin; } else { iAnchorPos = iSelStart; - iCurPos = iSelStart + cchJoin + 1; + iCurPos = iSelStart + cchJoin; } - SendMessage(hwnd,SCI_BEGINUNDOACTION,0,0); - SciCall_SetSel(iSelStart, iSelEnd); - SendMessage(hwnd, SCI_REPLACESEL, 0, (LPARAM)pszJoin); - SciCall_SetSel(iAnchorPos, iCurPos); - SendMessage(hwnd,SCI_ENDUNDOACTION,0,0); - } + EditEnterTargetTransaction(); + SendMessage(hwnd, SCI_SETTARGETRANGE, iSelStart, iSelEnd); + SendMessage(hwnd, SCI_REPLACETARGET, (WPARAM)cchJoin, (LPARAM)pszJoin); + EditLeaveTargetTransaction(); + EditSelectEx(hwnd, iAnchorPos, iCurPos); + } LocalFree(pszJoin); } @@ -3722,6 +3746,7 @@ int CmpLogicalRev(const void *s1, const void *s2) { } } + void EditSortLines(HWND hwnd, int iSortFlags) { BOOL bIsRectangular = FALSE; @@ -3759,7 +3784,7 @@ void EditSortLines(HWND hwnd, int iSortFlags) pfnStrCmpLogicalW = GetProcAddress(GetModuleHandle(L"shlwapi"), "StrCmpLogicalW"); pfnStrCmp = (iSortFlags & SORT_NOCASE) ? StrCmpIW : StrCmpW; - if (SC_SEL_RECTANGLE == SendMessage(hwnd, SCI_GETSELECTIONMODE, 0, 0)) { + if (SciCall_IsSelectionRectangle()) { bIsRectangular = TRUE; @@ -3817,7 +3842,6 @@ void EditSortLines(HWND hwnd, int iSortFlags) iTabWidth = (UINT)SendMessage(hwnd, SCI_GETTABWIDTH, 0, 0); - SendMessage(hwnd, SCI_BEGINUNDOACTION, 0, 0); if (bIsRectangular) EditPadWithSpaces(hwnd, !(iSortFlags & SORT_SHUFFLE), TRUE); @@ -3937,22 +3961,23 @@ void EditSortLines(HWND hwnd, int iSortFlags) } LocalFree(pLines); - + int iResultLength = StringCchLenA(pmszResult, lenRes); if (!bIsRectangular) { if (iAnchorPos > iCurPos) { iCurPos = iSelStart; - iAnchorPos = iSelStart + StringCchLenA(pmszResult, lenRes); + iAnchorPos = iSelStart + iResultLength; } else { iAnchorPos = iSelStart; - iCurPos = iSelStart + StringCchLenA(pmszResult, lenRes); + iCurPos = iSelStart + iResultLength; } } + EditEnterTargetTransaction(); - SendMessage(hwnd, SCI_SETSEL, SciCall_PositionFromLine(iLineStart), SciCall_PositionFromLine(iLineEnd + 1)); - SendMessage(hwnd, SCI_REPLACESEL, 0, (LPARAM)pmszResult); + SendMessage(hwnd, SCI_SETTARGETRANGE, SciCall_PositionFromLine(iLineStart), SciCall_PositionFromLine(iLineEnd + 1)); + SendMessage(hwnd, SCI_REPLACETARGET, (WPARAM)-1, (LPARAM)pmszResult); - SendMessage(hwnd, SCI_ENDUNDOACTION, 0, 0); + EditLeaveTargetTransaction(); LocalFree(pmszResult); @@ -3963,8 +3988,9 @@ void EditSortLines(HWND hwnd, int iSortFlags) SendMessage(hwnd, SCI_SETRECTANGULARSELECTIONCARETVIRTUALSPACE, (WPARAM)iCurPosVS, 0); } else { - SendMessage(hwnd, SCI_SETSEL, (WPARAM)iAnchorPos, (LPARAM)iCurPos); + EditSelectEx(hwnd, iAnchorPos, iCurPos); } + } @@ -3974,6 +4000,13 @@ void EditSortLines(HWND hwnd, int iSortFlags) // void EditSelectEx(HWND hwnd, int iAnchorPos, int iCurrentPos) { + if (iAnchorPos < 0) { + iAnchorPos = ((iCurrentPos >= 0) ? iCurrentPos : 0); + } + if (iCurrentPos < 0) { + iCurrentPos = ((iAnchorPos >= 0) ? iAnchorPos : 0); + } + int iNewLine = SciCall_LineFromPosition(iCurrentPos); int iAnchorLine = SciCall_LineFromPosition(iAnchorPos); @@ -3983,11 +4016,14 @@ void EditSelectEx(HWND hwnd, int iAnchorPos, int iCurrentPos) if (iAnchorLine != iNewLine) { SciCall_EnsureVisible(iNewLine); } - SendMessage(hwnd, SCI_SETXCARETPOLICY, CARET_SLOP | CARET_STRICT | CARET_EVEN, 50); - SendMessage(hwnd, SCI_SETYCARETPOLICY, CARET_SLOP | CARET_STRICT | CARET_EVEN, 5); - SendMessage(hwnd, SCI_SETSEL, iAnchorPos, iCurrentPos); - SendMessage(hwnd, SCI_SETXCARETPOLICY, CARET_SLOP | CARET_EVEN, 50); - SendMessage(hwnd, SCI_SETYCARETPOLICY, CARET_EVEN, 0); + + SciCall_SetSel(iAnchorPos, iCurrentPos); + SciCall_ScrollRange(iAnchorPos, iCurrentPos); + + // remember x-pos for moving caret vertically + SendMessage(hwnd, SCI_CHOOSECARETX, 0, 0); + + UpdateStatusbar(); } @@ -3997,7 +4033,7 @@ void EditSelectEx(HWND hwnd, int iAnchorPos, int iCurrentPos) // void EditJumpTo(HWND hwnd,int iNewLine,int iNewCol) { - // Jumpt to end with line set to -1 + // jump to end with line set to -1 if (iNewLine < 0) { SendMessage(hwnd, SCI_DOCUMENTEND, 0, 0); return; @@ -4014,10 +4050,8 @@ void EditJumpTo(HWND hwnd,int iNewLine,int iNewCol) const int iNewPos = (int)SendMessage(hwnd, SCI_FINDCOLUMN, (WPARAM)iNewLine, (LPARAM)iNewCol); - EditSelectEx(hwnd, -1, iNewPos); // SCI_GOTOPOS(pos) is equivalent to SCI_SETSEL(-1, pos) + EditSelectEx(hwnd, iNewPos, iNewPos); // <= SCI_GOTOPOS(pos) - // remember x-pos for moving caret vertivally - SendMessage(hwnd, SCI_CHOOSECARETX, 0, 0); } @@ -4036,7 +4070,7 @@ void EditFixPositions(HWND hwnd) int iNewPos = SciCall_PositionAfter( SciCall_PositionBefore(iCurrentPos) ); if (iNewPos != iCurrentPos) { - SendMessage(hwnd,SCI_SETCURRENTPOS,(WPARAM)iNewPos,0); + SciCall_SetCurrentPos(iNewPos); iCurrentPos = iNewPos; } } @@ -4044,10 +4078,11 @@ void EditFixPositions(HWND hwnd) if ((iAnchorPos != iCurrentPos) && (iAnchorPos > 0) && (iAnchorPos < iMaxPos)) { int iNewPos = SciCall_PositionAfter(SciCall_PositionBefore(iAnchorPos)); - - if (iNewPos != iAnchorPos) - SendMessage(hwnd,SCI_SETANCHOR,(WPARAM)iNewPos,0); + if (iNewPos != iAnchorPos) { + SciCall_SetAnchor(iNewPos); + } } + UNUSED(hwnd); } @@ -4057,15 +4092,10 @@ void EditFixPositions(HWND hwnd) // void EditEnsureSelectionVisible(HWND hwnd) { - int iAnchorPos = (int)SendMessage(hwnd,SCI_GETANCHOR,0,0); - int iCurrentPos = (int)SendMessage(hwnd,SCI_GETCURRENTPOS,0,0); - SendMessage(hwnd,SCI_ENSUREVISIBLE, - (WPARAM)SendMessage(hwnd,SCI_LINEFROMPOSITION,(WPARAM)iAnchorPos,0),0); - if (iAnchorPos != iCurrentPos) { - SendMessage(hwnd,SCI_ENSUREVISIBLE, - (WPARAM)SendMessage(hwnd,SCI_LINEFROMPOSITION,(WPARAM)iCurrentPos,0),0); - } - EditSelectEx(hwnd,iAnchorPos,iCurrentPos); + int iAnchorPos = SciCall_GetAnchor(); + int iCurrentPos = SciCall_GetCurrentPos(); + EditSelectEx(hwnd, iAnchorPos, iCurrentPos); + UNUSED(hwnd); } @@ -4078,14 +4108,14 @@ void EditGetExcerpt(HWND hwnd,LPWSTR lpszExcerpt,DWORD cchExcerpt) int iCurPos = (int)SendMessage(hwnd,SCI_GETCURRENTPOS,0,0); int iAnchorPos = (int)SendMessage(hwnd,SCI_GETANCHOR,0,0); - if (iCurPos == iAnchorPos || SC_SEL_RECTANGLE == SendMessage(hwnd,SCI_GETSELECTIONMODE,0,0)) { + if (iCurPos == iAnchorPos || SciCall_IsSelectionRectangle()) { StringCchCopy(lpszExcerpt,cchExcerpt,L""); return; } WCHAR tch[256] = { L'\0' }; struct Sci_TextRange tr = { { 0, 0 }, NULL }; - /*if (iCurPos != iAnchorPos && SC_SEL_RECTANGLE != SendMessage(hwnd,SCI_GETSELECTIONMODE,0,0)) {*/ + /*if (iCurPos != iAnchorPos && !SciCall_IsSelectionRectangle()) {*/ tr.chrg.cpMin = (int)SendMessage(hwnd,SCI_GETSELECTIONSTART,0,0); tr.chrg.cpMax = min((int)SendMessage(hwnd,SCI_GETSELECTIONEND,0,0),(LONG)(tr.chrg.cpMin + COUNTOF(tch))); /*} @@ -5198,8 +5228,8 @@ BOOL EditFindNext(HWND hwnd, LPCEDITFINDREPLACE lpefr, BOOL bExtendSelection) { } if (bExtendSelection) { - int iSelPos = (int)SendMessage(hwnd, SCI_GETCURRENTPOS, 0, 0); - int iSelAnchor = (int)SendMessage(hwnd, SCI_GETANCHOR, 0, 0); + int iSelPos = SciCall_GetCurrentPos(); + int iSelAnchor = SciCall_GetAnchor(); EditSelectEx(hwnd, min(iSelAnchor, iSelPos), end); } else { @@ -5266,8 +5296,8 @@ BOOL EditFindPrev(HWND hwnd, LPCEDITFINDREPLACE lpefr, BOOL bExtendSelection) { } if (bExtendSelection) { - int iSelPos = (int)SendMessage(hwnd, SCI_GETCURRENTPOS, 0, 0); - int iSelAnchor = (int)SendMessage(hwnd, SCI_GETANCHOR, 0, 0); + int iSelPos = SciCall_GetCurrentPos(); + int iSelAnchor = SciCall_GetAnchor(); EditSelectEx(hwnd, max(iSelPos, iSelAnchor), start); } else { @@ -5286,7 +5316,7 @@ void EditMarkAllOccurrences() { if (iMarkOccurrences != 0) { - if (EditEnterTargetTransaction()) { return; } // do not block, next event occurs for sure + if (EditIsInTargetTransaction()) { return; } // do not block, next event occurs for sure if (bMarkOccurrencesMatchVisible) { @@ -5315,13 +5345,13 @@ void EditMarkAllOccurrences() //============================================================================= // -// EditUpdateVisibleUrlHotspotr() +// EditUpdateVisibleUrlHotspot() // -void EditUpdateVisibleUrlHotspot() +void EditUpdateVisibleUrlHotspot(BOOL bEnabled) { - if (bHyperlinkHotspot) + if (bEnabled) { - if (EditEnterTargetTransaction()) { return; } // do not block, next event occurs for sure + if (EditIsInTargetTransaction()) { return; } // do not block, next event occurs for sure // get visible lines for update int iFirstVisibleLine = SciCall_DocLineFromVisible(SciCall_GetFirstVisibleLine()); @@ -5332,7 +5362,7 @@ void EditUpdateVisibleUrlHotspot() int iPosStart = SciCall_PositionFromLine(iStartLine); int iPosEnd = SciCall_GetLineEndPosition(iEndLine); - EditUpdateUrlHotspots(g_hwndEdit, iPosStart, iPosEnd, bHyperlinkHotspot); + EditUpdateUrlHotspots(g_hwndEdit, iPosStart, iPosEnd, bEnabled); EditLeaveTargetTransaction(); } @@ -5487,9 +5517,6 @@ int EditReplaceAllInRange(HWND hwnd, LPCEDITFINDREPLACE lpefr, BOOL bShowInfo, i int iCount = utarray_len(ReplPosUTArray); - if (iCount > 0) - SendMessage(hwnd, SCI_BEGINUNDOACTION, 0, 0); - // === iterate over findings and replace strings === int offset = 0; @@ -5522,9 +5549,6 @@ int EditReplaceAllInRange(HWND hwnd, LPCEDITFINDREPLACE lpefr, BOOL bShowInfo, i utarray_free(ReplPosUTArray); LocalFree(pszReplace); - if (iCount > 0) - SendMessage(hwnd, SCI_ENDUNDOACTION, 0, 0); - if (bShowInfo) { if (iCount > 0) InfoBox(0, L"MsgReplaceCount", IDS_REPLCOUNT, iCount); @@ -5545,11 +5569,11 @@ BOOL EditReplaceAll(HWND hwnd,LPCEDITFINDREPLACE lpefr,BOOL bShowInfo) int start = 0; int end = SciCall_GetTextLength(); - int token = BeginSelUndoAction(); + int token = BeginUndoAction(); int iCount = EditReplaceAllInRange(hwnd, lpefr, bShowInfo, start, end); - EndSelUndoAction(token); + EndUndoAction(token); return (iCount > 0) ? TRUE : FALSE; } @@ -5561,19 +5585,19 @@ BOOL EditReplaceAll(HWND hwnd,LPCEDITFINDREPLACE lpefr,BOOL bShowInfo) // BOOL EditReplaceAllInSelection(HWND hwnd,LPCEDITFINDREPLACE lpefr,BOOL bShowInfo) { - if (SC_SEL_RECTANGLE == SciCall_GetSelectionMode()) { + if (SciCall_IsSelectionRectangle()) { MsgBox(MBWARN, IDS_SELRECT); return FALSE; } - int token = BeginSelUndoAction(); - int start = SciCall_GetSelectionStart(); int end = SciCall_GetSelectionEnd(); + int token = BeginUndoAction(); + int iCount = EditReplaceAllInRange(hwnd, lpefr, bShowInfo, start, end); - EndSelUndoAction(token); + EndUndoAction(token); if (iCount <= 0) return FALSE; @@ -5995,16 +6019,14 @@ INT_PTR CALLBACK EditLinenumDlgProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lPa case WM_INITDIALOG: { - int iCurLine = (int)SendMessage(g_hwndEdit,SCI_LINEFROMPOSITION, - SendMessage(g_hwndEdit,SCI_GETCURRENTPOS,0,0),0)+1; + int iCurLine = SciCall_LineFromPosition(SciCall_GetCurrentPos())+1; + int iCurColumn = SciCall_GetColumn(SciCall_GetCurrentPos()) + 1; SetDlgItemInt(hwnd,IDC_LINENUM,iCurLine,FALSE); + SetDlgItemInt(hwnd, IDC_COLNUM, iCurColumn, FALSE); SendDlgItemMessage(hwnd,IDC_LINENUM,EM_LIMITTEXT,15,0); - SendDlgItemMessage(hwnd,IDC_COLNUM,EM_LIMITTEXT,15,0); - CenterDlgInParent(hwnd); - } return TRUE; @@ -6037,14 +6059,13 @@ INT_PTR CALLBACK EditLinenumDlgProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lPa return TRUE; } - if (iNewLine > 0 && iNewLine <= iMaxLine && iNewCol > 0) + if ((iNewLine > 0) && (iNewLine <= iMaxLine) && (iNewCol > 0)) { EditJumpTo(g_hwndEdit,iNewLine,iNewCol); EndDialog(hwnd,IDOK); } - else - PostMessage(hwnd,WM_NEXTDLGCTL,(WPARAM)(GetDlgItem(hwnd,(!(iNewLine > 0 && iNewLine <= iMaxLine)) ? IDC_LINENUM : IDC_COLNUM)),1); + PostMessage(hwnd,WM_NEXTDLGCTL,(WPARAM)(GetDlgItem(hwnd,(!((iNewLine > 0) && (iNewLine <= iMaxLine))) ? IDC_LINENUM : IDC_COLNUM)),1); } break; @@ -6609,7 +6630,7 @@ INT_PTR CALLBACK EditSortDlgProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam DialogEnableWindow(hwnd,107,FALSE); bEnableLogicalSort = FALSE; } - if (SC_SEL_RECTANGLE != SendMessage(g_hwndEdit,SCI_GETSELECTIONMODE,0,0)) { + if (!SciCall_IsSelectionRectangle()) { *piSortFlags &= ~SORT_COLUMN; DialogEnableWindow(hwnd,108,FALSE); } diff --git a/src/Edit.h b/src/Edit.h index bbc57b239..6874f5c36 100644 --- a/src/Edit.h +++ b/src/Edit.h @@ -133,10 +133,11 @@ void EditApplyLexerStyle(HWND, int, int); void EditFinalizeStyling(HWND,int); void EditMarkAllOccurrences(); -void EditUpdateVisibleUrlHotspot(); +void EditUpdateVisibleUrlHotspot(BOOL); -BOOL EditEnterTargetTransaction(); -BOOL EditLeaveTargetTransaction(); +void EditEnterTargetTransaction(); +void EditLeaveTargetTransaction(); +BOOL EditIsInTargetTransaction(); //void SciInitThemes(HWND); //LRESULT CALLBACK SciThemedWndProc(HWND,UINT,WPARAM,LPARAM); diff --git a/src/Notepad3.c b/src/Notepad3.c index fb29b7640..d5474bb50 100644 --- a/src/Notepad3.c +++ b/src/Notepad3.c @@ -190,6 +190,7 @@ int iSciFontQuality; int iHighDpiToolBar; int iUpdateDelayHyperlinkStyling; int iUpdateDelayMarkAllCoccurrences; +int iCurrentLineVerticalSlop = 5; const int DirectWriteTechnology[4] = { SC_TECHNOLOGY_DEFAULT @@ -251,7 +252,6 @@ LPMRULIST mruReplace; DWORD dwLastIOError; WCHAR szCurFile[FILE_ARG_BUF] = { L'\0' }; FILEVARS fvCurFile; -BOOL bModified; BOOL bReadOnly = FALSE; int iDefaultEncoding; @@ -305,8 +305,9 @@ int iAlignMode = 0; BOOL flagIsElevated = FALSE; WCHAR wchWndClass[16] = WC_NOTEPAD3; -HINSTANCE g_hInstance; -HANDLE g_hScintilla; + +HINSTANCE g_hInstance = NULL; +HANDLE g_hScintilla = NULL; WCHAR g_wchAppUserModelID[32] = { L'\0' }; WCHAR g_wchWorkingDirectory[MAX_PATH+2] = { L'\0' }; @@ -321,13 +322,34 @@ static PDROPTARGET pDropTarget = NULL; static DWORD DropFilesProc(CLIPFORMAT cf, HGLOBAL hData, HWND hWnd, DWORD dwKeyState, POINTL pt, void *pUserData); // Timer bitfield -static volatile LONG g_lTimerBits = 0; +static volatile LONG g_lInterlockBits = 0; #define TIMER_BIT_MARK_OCC 1L #define TIMER_BIT_UPDATE_HYPER 2L -#define TEST_AND_SET(B) InterlockedBitTestAndSet(&g_lTimerBits, B) -#define TEST_AND_RESET(B) InterlockedBitTestAndReset(&g_lTimerBits, B) +#define LOCK_NOTIFY_CHANGE 4L +#define TEST_AND_SET(B) InterlockedBitTestAndSet(&g_lInterlockBits, B) +#define TEST_AND_RESET(B) InterlockedBitTestAndReset(&g_lInterlockBits, B) +//============================================================================= +// +// IgnoreNotifyChangeEvent(), ObserveNotifyChangeEvent(), CheckNotifyChangeEvent() +// +void IgnoreNotifyChangeEvent() { + (void)TEST_AND_SET(LOCK_NOTIFY_CHANGE); +} + +void ObserveNotifyChangeEvent() { + (void)TEST_AND_RESET(LOCK_NOTIFY_CHANGE); +} + +BOOL CheckNotifyChangeEvent() { + if (TEST_AND_RESET(LOCK_NOTIFY_CHANGE)) { + (void)TEST_AND_SET(LOCK_NOTIFY_CHANGE); + return FALSE; + } + return TRUE; +} + // SCN_UPDATEUI notification #define SC_UPDATE_NP3_INTERNAL_NOTIFY (SC_UPDATE_H_SCROLL << 1) @@ -368,6 +390,22 @@ int flagPrintFileAndLeave = 0; int flagBufferFile = 0; +//============================================================================== +// +// Document Modified Flag +// +// +static BOOL IsDocumentModified = FALSE; + +void __fastcall SetDocumentModified(BOOL bModified) +{ + if (IsDocumentModified != bModified) { + IsDocumentModified = bModified; + UpdateToolbar(); + } +} + + //============================================================================== // // Folding Functions @@ -683,6 +721,7 @@ int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR lpCmdLine,int n hAccFindReplace = LoadAccelerators(hInstance,MAKEINTRESOURCE(IDR_ACCFINDREPLACE)); UpdateLineNumberWidth(); + ObserveNotifyChangeEvent(); while (GetMessage(&msg,NULL,0,0)) { @@ -899,8 +938,8 @@ HWND InitInstance(HINSTANCE hInstance,LPSTR pszCmdLine,int nCmdShow) if (!flagLexerSpecified) Style_SetLexerFromFile(g_hwndEdit,szCurFile); - bModified = TRUE; - UpdateToolbar(); + + SetDocumentModified(TRUE); UpdateLineNumberWidth(); // check for temp file and delete @@ -910,7 +949,6 @@ HWND InitInstance(HINSTANCE hInstance,LPSTR pszCmdLine,int nCmdShow) } if (flagJumpTo) { // Jump to position EditJumpTo(g_hwndEdit,iInitialLine,iInitialColumn); - EditEnsureSelectionVisible(g_hwndEdit); } } } @@ -953,20 +991,22 @@ HWND InitInstance(HINSTANCE hInstance,LPSTR pszCmdLine,int nCmdShow) // Check for /c [if no file is specified] -- even if a file is specified /*else */if (flagNewFromClipboard) { - if (SendMessage(g_hwndEdit,SCI_CANPASTE,0,0)) { + if (SendMessage(g_hwndEdit, SCI_CANPASTE, 0, 0)) { BOOL bAutoIndent2 = bAutoIndent; bAutoIndent = 0; - EditJumpTo(g_hwndEdit,-1,0); - SendMessage(g_hwndEdit,SCI_BEGINUNDOACTION,0,0); - if (SendMessage(g_hwndEdit,SCI_GETLENGTH,0,0) > 0) - SendMessage(g_hwndEdit,SCI_NEWLINE,0,0); - SendMessage(g_hwndEdit,SCI_PASTE,0,0); - SendMessage(g_hwndEdit,SCI_NEWLINE,0,0); - SendMessage(g_hwndEdit,SCI_ENDUNDOACTION,0,0); + EditJumpTo(g_hwndEdit, -1, 0); + SendMessage(g_hwndEdit, SCI_BEGINUNDOACTION, 0, 0); + if (SendMessage(g_hwndEdit, SCI_GETLENGTH, 0, 0) > 0) { + SendMessage(g_hwndEdit, SCI_NEWLINE, 0, 0); + } + SendMessage(g_hwndEdit, SCI_PASTE, 0, 0); + SendMessage(g_hwndEdit, SCI_NEWLINE, 0, 0); + SendMessage(g_hwndEdit, SCI_ENDUNDOACTION, 0, 0); bAutoIndent = bAutoIndent2; if (flagJumpTo) - EditJumpTo(g_hwndEdit,iInitialLine,iInitialColumn); - EditEnsureSelectionVisible(g_hwndEdit); + EditJumpTo(g_hwndEdit, iInitialLine, iInitialColumn); + else + EditEnsureSelectionVisible(g_hwndEdit); } } @@ -1000,19 +1040,17 @@ HWND InitInstance(HINSTANCE hInstance,LPSTR pszCmdLine,int nCmdShow) cpLastFind = cp; if (flagMatchText & 4) - g_efrData.fuFlags |= SCFIND_REGEXP | SCFIND_POSIX; + g_efrData.fuFlags |= (SCFIND_REGEXP | SCFIND_POSIX); else if (flagMatchText & 8) g_efrData.bTransformBS = TRUE; if (flagMatchText & 2) { - if (!flagJumpTo) - EditJumpTo(g_hwndEdit,-1,0); + if (!flagJumpTo) { SendMessage(g_hwndEdit, SCI_DOCUMENTEND, 0, 0); } EditFindPrev(g_hwndEdit,&g_efrData,FALSE); EditEnsureSelectionVisible(g_hwndEdit); } else { - if (!flagJumpTo) - SendMessage(g_hwndEdit,SCI_DOCUMENTSTART,0,0); + if (!flagJumpTo) { SendMessage(g_hwndEdit, SCI_DOCUMENTSTART, 0, 0); } EditFindNext(g_hwndEdit,&g_efrData,FALSE); EditEnsureSelectionVisible(g_hwndEdit); } @@ -1294,6 +1332,10 @@ LRESULT MsgCreate(HWND hwnd,WPARAM wParam,LPARAM lParam) g_hwndEdit = EditCreate(hwnd); InitScintillaHandle(g_hwndEdit); + // Properties + SendMessage(g_hwndEdit, SCI_SETYCARETPOLICY, CARET_SLOP | CARET_EVEN | CARET_STRICT, iCurrentLineVerticalSlop); + SendMessage(g_hwndEdit, SCI_SETVIRTUALSPACEOPTIONS, (bDenyVirtualSpaceAccess ? SCVS_NONE : SCVS_RECTANGULARSELECTION), 0); + // Tabs SendMessage(g_hwndEdit,SCI_SETUSETABS,!bTabsAsSpaces,0); SendMessage(g_hwndEdit,SCI_SETTABINDENTS,bTabIndents,0); @@ -2052,7 +2094,6 @@ LRESULT MsgCopyData(HWND hwnd, WPARAM wParam, LPARAM lParam) if (params->iInitialLine == 0) params->iInitialLine = 1; EditJumpTo(g_hwndEdit, params->iInitialLine, params->iInitialColumn); - EditEnsureSelectionVisible(g_hwndEdit); } flagLexerSpecified = 0; @@ -2101,7 +2142,7 @@ LRESULT MsgContextMenu(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam) ptc.x = pt.x; ptc.y = pt.y; ScreenToClient(g_hwndEdit, &ptc); iNewPos = (int)SendMessage(g_hwndEdit, SCI_POSITIONFROMPOINT, (WPARAM)ptc.x, (LPARAM)ptc.y); - SendMessage(g_hwndEdit, SCI_GOTOPOS, (WPARAM)iNewPos, 0); + EditSelectEx(g_hwndEdit, iNewPos, iNewPos); } if (pt.x == -1 && pt.y == -1) { @@ -2139,11 +2180,11 @@ LRESULT MsgContextMenu(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam) // void MsgChangeNotify(HWND hwnd, WPARAM wParam, LPARAM lParam) { - if (iFileWatchingMode == 1 || bModified || Encoding_HasChanged(CPI_GET)) + if (iFileWatchingMode == 1 || IsDocumentModified || Encoding_HasChanged(CPI_GET)) SetForegroundWindow(hwnd); if (PathFileExists(szCurFile)) { - if ((iFileWatchingMode == 2 && !bModified && !Encoding_HasChanged(CPI_GET)) || + if ((iFileWatchingMode == 2 && !IsDocumentModified && !Encoding_HasChanged(CPI_GET)) || MsgBox(MBYESNO,IDS_FILECHANGENOTIFY) == IDYES) { FileRevert(szCurFile); @@ -2560,7 +2601,7 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) break; case IDC_CALL_UPDATE_HOTSPOT: - EditUpdateVisibleUrlHotspot(); + EditUpdateVisibleUrlHotspot(bHyperlinkHotspot); break; case IDM_FILE_NEW: @@ -2574,7 +2615,7 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) case IDM_FILE_REVERT: - if ((bModified || Encoding_HasChanged(CPI_GET)) && MsgBox(MBOKCANCEL,IDS_ASK_REVERT) != IDOK) { + if ((IsDocumentModified || Encoding_HasChanged(CPI_GET)) && MsgBox(MBOKCANCEL,IDS_ASK_REVERT) != IDOK) { return(0); } FileRevert(szCurFile); @@ -2969,7 +3010,7 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) int iNewEncoding = Encoding_MapUnicode(Encoding_Current(CPI_GET)); - if ((bModified || Encoding_HasChanged(CPI_GET)) && MsgBox(MBOKCANCEL,IDS_ASK_RECODE) != IDOK) + if ((IsDocumentModified || Encoding_HasChanged(CPI_GET)) && MsgBox(MBOKCANCEL,IDS_ASK_RECODE) != IDOK) return(0); if (RecodeDlg(hwnd,&iNewEncoding)) @@ -3009,12 +3050,16 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) case IDM_EDIT_UNDO: - SendMessage(g_hwndEdit, SCI_UNDO, 0, 0); + IgnoreNotifyChangeEvent(); + SendMessage(g_hwndEdit, SCI_UNDO, 0, 0); + ObserveNotifyChangeEvent(); break; case IDM_EDIT_REDO: - SendMessage(g_hwndEdit, SCI_REDO, 0, 0); + IgnoreNotifyChangeEvent(); + SendMessage(g_hwndEdit, SCI_REDO, 0, 0); + ObserveNotifyChangeEvent(); break; @@ -3023,7 +3068,7 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) if (flagPasteBoard) bLastCopyFromMe = TRUE; - int token = BeginSelUndoAction(); + int token = BeginUndoAction(); if (!SendMessage(g_hwndEdit, SCI_GETSELECTIONEMPTY, 0, 0)) { SendMessage(g_hwndEdit, SCI_CUT, 0, 0); @@ -3032,7 +3077,7 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) SendMessage(g_hwndEdit, SCI_COPYALLOWLINE, 0, 0); SendMessage(g_hwndEdit, SCI_LINEDELETE, 0, 0); } - EndSelUndoAction(token); + EndUndoAction(token); UpdateToolbar(); } break; @@ -3081,7 +3126,7 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) int iCurrPos = (int)SendMessage(g_hwndEdit, SCI_GETCURRENTPOS, 0, 0); int iAnchor = iCurrPos; - int token = BeginSelUndoAction(); + int token = BeginUndoAction(); if (SendMessage(g_hwndEdit,SCI_GETSELECTIONEMPTY,0,0)) { @@ -3112,7 +3157,7 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) SendMessage(g_hwndEdit, SCI_SETSEL, iCurrPos + lstrlenA(pClip), iCurrPos); } - EndSelUndoAction(token); + EndUndoAction(token); LocalFree(pClip); @@ -3196,12 +3241,20 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) case IDM_EDIT_MOVELINEUP: - EditMoveUp(g_hwndEdit); + { + int token = BeginUndoAction(); + EditMoveUp(g_hwndEdit); + EndUndoAction(token); + } break; case IDM_EDIT_MOVELINEDOWN: - EditMoveDown(g_hwndEdit); + { + int token = BeginUndoAction(); + EditMoveDown(g_hwndEdit); + EndUndoAction(token); + } break; @@ -3214,10 +3267,10 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) { if (flagPasteBoard) bLastCopyFromMe = TRUE; - int token = BeginSelUndoAction(); + int token = BeginUndoAction(); SendMessage(g_hwndEdit,SCI_LINECUT,0,0); UpdateToolbar(); - EndSelUndoAction(token); + EndUndoAction(token); } break; @@ -3232,45 +3285,45 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) case IDM_EDIT_DELETELINE: { - int token = BeginSelUndoAction(); + int token = BeginUndoAction(); SendMessage(g_hwndEdit, SCI_LINEDELETE, 0, 0); - EndSelUndoAction(token); + EndUndoAction(token); } break; case IDM_EDIT_DELETELINELEFT: { - int token = BeginSelUndoAction(); + int token = BeginUndoAction(); SendMessage(g_hwndEdit, SCI_DELLINELEFT, 0, 0); - EndSelUndoAction(token); + EndUndoAction(token); } break; case IDM_EDIT_DELETELINERIGHT: { - int token = BeginSelUndoAction(); + int token = BeginUndoAction(); SendMessage(g_hwndEdit, SCI_DELLINERIGHT, 0, 0); - EndSelUndoAction(token); + EndUndoAction(token); } break; case IDM_EDIT_INDENT: { - int token = BeginSelUndoAction(); + int token = BeginUndoAction(); SendMessage(g_hwndEdit,SCI_TAB,0,0); - EndSelUndoAction(token); + EndUndoAction(token); } break; case IDM_EDIT_UNINDENT: { - int token = BeginSelUndoAction(); + int token = BeginUndoAction(); SendMessage(g_hwndEdit,SCI_BACKTAB,0,0); - EndSelUndoAction(token); + EndUndoAction(token); } break; @@ -3278,9 +3331,7 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) case IDM_EDIT_ENCLOSESELECTION: if (EditEncloseSelectionDlg(hwnd,wchPrefixSelection,wchAppendSelection)) { BeginWaitCursor(NULL); - int token = BeginSelUndoAction(); EditEncloseSelection(g_hwndEdit,wchPrefixSelection,wchAppendSelection); - EndSelUndoAction(token); EndWaitCursor(); } break; @@ -3289,9 +3340,9 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) case IDM_EDIT_SELECTIONDUPLICATE: { BeginWaitCursor(NULL); - int token = BeginSelUndoAction(); + int token = BeginUndoAction(); SendMessage(g_hwndEdit,SCI_SELECTIONDUPLICATE,0,0); - EndSelUndoAction(token); + EndUndoAction(token); EndWaitCursor(); } break; @@ -3300,9 +3351,7 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) case IDM_EDIT_PADWITHSPACES: { BeginWaitCursor(NULL); - int token = BeginSelUndoAction(); EditPadWithSpaces(g_hwndEdit,FALSE,FALSE); - EndSelUndoAction(token); EndWaitCursor(); } break; @@ -3311,9 +3360,9 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) case IDM_EDIT_STRIP1STCHAR: { BeginWaitCursor(NULL); - int token = BeginSelUndoAction(); + int token = BeginUndoAction(); EditStripFirstCharacter(g_hwndEdit); - EndSelUndoAction(token); + EndUndoAction(token); EndWaitCursor(); } break; @@ -3322,27 +3371,31 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) case IDM_EDIT_STRIPLASTCHAR: { BeginWaitCursor(NULL); - int token = BeginSelUndoAction(); + int token = BeginUndoAction(); EditStripLastCharacter(g_hwndEdit); - EndSelUndoAction(token); + EndUndoAction(token); EndWaitCursor(); } break; case IDM_EDIT_TRIMLINES: - BeginWaitCursor(NULL); - EditStripTrailingBlanks(g_hwndEdit,FALSE); - EndWaitCursor(); + { + BeginWaitCursor(NULL); + int token = BeginUndoAction(); + EditStripTrailingBlanks(g_hwndEdit, FALSE); + EndUndoAction(token); + EndWaitCursor(); + } break; case IDM_EDIT_COMPRESSWS: { BeginWaitCursor(NULL); - int token = BeginSelUndoAction(); + int token = BeginUndoAction(); EditCompressSpaces(g_hwndEdit); - EndSelUndoAction(token); + EndUndoAction(token); EndWaitCursor(); } break; @@ -3351,9 +3404,9 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) case IDM_EDIT_MERGEBLANKLINES: { BeginWaitCursor(NULL); - int token = BeginSelUndoAction(); + int token = BeginUndoAction(); EditRemoveBlankLines(g_hwndEdit,TRUE); - EndSelUndoAction(token); + EndUndoAction(token); EndWaitCursor(); } break; @@ -3362,9 +3415,9 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) case IDM_EDIT_REMOVEBLANKLINES: { BeginWaitCursor(NULL); - int token = BeginSelUndoAction(); + int token = BeginUndoAction(); EditRemoveBlankLines(g_hwndEdit,FALSE); - EndSelUndoAction(token); + EndUndoAction(token); EndWaitCursor(); } break; @@ -3374,9 +3427,9 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) { if (EditModifyLinesDlg(hwnd,wchPrefixLines,wchAppendLines)) { BeginWaitCursor(NULL); - int token = BeginSelUndoAction(); + int token = BeginUndoAction(); EditModifyLines(g_hwndEdit,wchPrefixLines,wchAppendLines); - EndSelUndoAction(token); + EndUndoAction(token); EndWaitCursor(); } } @@ -3387,9 +3440,9 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) { if (EditAlignDlg(hwnd,&iAlignMode)) { BeginWaitCursor(NULL); - int token = BeginSelUndoAction(); + int token = BeginUndoAction(); EditAlignText(g_hwndEdit,iAlignMode); - EndSelUndoAction(token); + EndUndoAction(token); EndWaitCursor(); } } @@ -3400,9 +3453,9 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) { if (EditSortDlg(hwnd,&iSortOptions)) { BeginWaitCursor(NULL); - int token = BeginSelUndoAction(); + int token = BeginUndoAction(); EditSortLines(g_hwndEdit,iSortOptions); - EndSelUndoAction(token); + EndUndoAction(token); EndWaitCursor(); } } @@ -3418,9 +3471,9 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) { iWrapCol = max(min(iWrapCol,512),1); BeginWaitCursor(NULL); - int token = BeginSelUndoAction(); + int token = BeginUndoAction(); EditWrapToColumn(g_hwndEdit,iWrapCol); - EndSelUndoAction(token); + EndUndoAction(token); EndWaitCursor(); } } @@ -3430,12 +3483,12 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) case IDM_EDIT_SPLITLINES: { BeginWaitCursor(NULL); - int token = BeginSelUndoAction(); + int token = BeginUndoAction(); EditEnterTargetTransaction(); SciCall_TargetFromSelection(); SendMessage(g_hwndEdit,SCI_LINESSPLIT,0,0); EditLeaveTargetTransaction(); - EndSelUndoAction(token); + EndUndoAction(token); EndWaitCursor(); } break; @@ -3444,9 +3497,9 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) case IDM_EDIT_JOINLINES: { BeginWaitCursor(NULL); - int token = BeginSelUndoAction(); + int token = BeginUndoAction(); EditJoinLinesEx(g_hwndEdit, FALSE, TRUE); - EndSelUndoAction(token); + EndUndoAction(token); EndWaitCursor(); } break; @@ -3454,9 +3507,9 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) case IDM_EDIT_JOINLN_NOSP: { BeginWaitCursor(NULL); - int token = BeginSelUndoAction(); + int token = BeginUndoAction(); EditJoinLinesEx(g_hwndEdit, FALSE, FALSE); - EndSelUndoAction(token); + EndUndoAction(token); EndWaitCursor(); } break; @@ -3464,9 +3517,9 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) case IDM_EDIT_JOINLINES_PARA: { BeginWaitCursor(NULL); - int token = BeginSelUndoAction(); + int token = BeginUndoAction(); EditJoinLinesEx(g_hwndEdit, TRUE, TRUE); - EndSelUndoAction(token); + EndUndoAction(token); EndWaitCursor(); } break; @@ -3475,9 +3528,9 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) case IDM_EDIT_CONVERTUPPERCASE: { BeginWaitCursor(NULL); - int token = BeginSelUndoAction(); + int token = BeginUndoAction(); SendMessage(g_hwndEdit,SCI_UPPERCASE,0,0); - EndSelUndoAction(token); + EndUndoAction(token); EndWaitCursor(); } break; @@ -3486,9 +3539,9 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) case IDM_EDIT_CONVERTLOWERCASE: { BeginWaitCursor(NULL); - int token = BeginSelUndoAction(); + int token = BeginUndoAction(); SendMessage(g_hwndEdit,SCI_LOWERCASE,0,0); - EndSelUndoAction(token); + EndUndoAction(token); EndWaitCursor(); } break; @@ -3497,9 +3550,9 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) case IDM_EDIT_INVERTCASE: { BeginWaitCursor(NULL); - int token = BeginSelUndoAction(); + int token = BeginUndoAction(); EditInvertCase(g_hwndEdit); - EndSelUndoAction(token); + EndUndoAction(token); EndWaitCursor(); } break; @@ -3508,9 +3561,9 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) case IDM_EDIT_TITLECASE: { BeginWaitCursor(NULL); - int token = BeginSelUndoAction(); + int token = BeginUndoAction(); EditTitleCase(g_hwndEdit); - EndSelUndoAction(token); + EndUndoAction(token); EndWaitCursor(); } break; @@ -3519,9 +3572,9 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) case IDM_EDIT_SENTENCECASE: { BeginWaitCursor(NULL); - int token = BeginSelUndoAction(); + int token = BeginUndoAction(); EditSentenceCase(g_hwndEdit); - EndSelUndoAction(token); + EndUndoAction(token); EndWaitCursor(); } break; @@ -3530,9 +3583,9 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) case IDM_EDIT_CONVERTTABS: { BeginWaitCursor(NULL); - int token = BeginSelUndoAction(); + int token = BeginUndoAction(); EditTabsToSpaces(g_hwndEdit, iTabWidth, FALSE); - EndSelUndoAction(token); + EndUndoAction(token); EndWaitCursor(); } break; @@ -3541,9 +3594,9 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) case IDM_EDIT_CONVERTSPACES: { BeginWaitCursor(NULL); - int token = BeginSelUndoAction(); + int token = BeginUndoAction(); EditSpacesToTabs(g_hwndEdit, iTabWidth, FALSE); - EndSelUndoAction(token); + EndUndoAction(token); EndWaitCursor(); } break; @@ -3552,9 +3605,9 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) case IDM_EDIT_CONVERTTABS2: { BeginWaitCursor(NULL); - int token = BeginSelUndoAction(); + int token = BeginUndoAction(); EditTabsToSpaces(g_hwndEdit, iTabWidth, TRUE); - EndSelUndoAction(token); + EndUndoAction(token); EndWaitCursor(); } break; @@ -3563,9 +3616,9 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) case IDM_EDIT_CONVERTSPACES2: { BeginWaitCursor(NULL); - int token = BeginSelUndoAction(); + int token = BeginUndoAction(); EditSpacesToTabs(g_hwndEdit, iTabWidth, TRUE); - EndSelUndoAction(token); + EndUndoAction(token); EndWaitCursor(); } break; @@ -3590,9 +3643,9 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) char *p = StrChrA(msz, ','); if (p) *p = 0; - int token = BeginSelUndoAction(); + int token = BeginUndoAction(); SendMessage(g_hwndEdit,SCI_REPLACESEL,0,(LPARAM)msz); - EndSelUndoAction(token); + EndUndoAction(token); } } break; @@ -3637,9 +3690,9 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) UINT uCP = Encoding_SciGetCodePage(g_hwndEdit); WideCharToMultiByteStrg(uCP,tchDateTime,mszBuf); - int token = BeginSelUndoAction(); + int token = BeginUndoAction(); SendMessage(g_hwndEdit,SCI_REPLACESEL,0,(LPARAM)mszBuf); - EndSelUndoAction(token); + EndUndoAction(token); } break; @@ -3669,9 +3722,9 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) UINT uCP = Encoding_SciGetCodePage(g_hwndEdit); WideCharToMultiByteStrg(uCP,pszInsert,mszBuf); - int token = BeginSelUndoAction(); + int token = BeginUndoAction(); SendMessage(g_hwndEdit,SCI_REPLACESEL,0,(LPARAM)mszBuf); - EndSelUndoAction(token); + EndUndoAction(token); } break; @@ -3687,9 +3740,9 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) UINT uCP = Encoding_SciGetCodePage(g_hwndEdit); char mszGuid[40 * 4]; // UTF-8 max of 4 bytes per char if (WideCharToMultiByteStrg(uCP,pwszGuid,mszGuid)) { - int token = BeginSelUndoAction(); + int token = BeginUndoAction(); SendMessage(g_hwndEdit,SCI_REPLACESEL,0,(LPARAM)mszGuid); - EndSelUndoAction(token); + EndUndoAction(token); } } } @@ -3827,30 +3880,46 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) case IDM_EDIT_URLENCODE: - BeginWaitCursor(NULL); - EditURLEncode(g_hwndEdit); - EndWaitCursor(); + { + BeginWaitCursor(NULL); + int token = BeginUndoAction(); + EditURLEncode(g_hwndEdit); + EndUndoAction(token); + EndWaitCursor(); + } break; case IDM_EDIT_URLDECODE: - BeginWaitCursor(NULL); - EditURLDecode(g_hwndEdit); - EndWaitCursor(); + { + BeginWaitCursor(NULL); + int token = BeginUndoAction(); + EditURLDecode(g_hwndEdit); + EndUndoAction(token); + EndWaitCursor(); + } break; case IDM_EDIT_ESCAPECCHARS: - BeginWaitCursor(NULL); - EditEscapeCChars(g_hwndEdit); - EndWaitCursor(); + { + BeginWaitCursor(NULL); + int token = BeginUndoAction(); + EditEscapeCChars(g_hwndEdit); + EndUndoAction(token); + EndWaitCursor(); + } break; case IDM_EDIT_UNESCAPECCHARS: - BeginWaitCursor(NULL); - EditUnescapeCChars(g_hwndEdit); - EndWaitCursor(); + { + BeginWaitCursor(NULL); + int token = BeginUndoAction(); + EditUnescapeCChars(g_hwndEdit); + EndUndoAction(token); + EndWaitCursor(); + } break; @@ -4648,8 +4717,7 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) case IDM_SETPASS: if (GetFileKey(g_hwndEdit)) { - bModified = TRUE; - UpdateToolbar(); + SetDocumentModified(TRUE); } break; @@ -4676,7 +4744,7 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) case CMD_CTRLENTER: { - int token = BeginSelUndoAction(); + int token = BeginUndoAction(); int iPos = (int)SendMessage(g_hwndEdit,SCI_GETCURRENTPOS,0,0); int iLine = (int)SendMessage(g_hwndEdit,SCI_LINEFROMPOSITION,(WPARAM)iPos,0); if (iLine <= 0) { @@ -4689,7 +4757,7 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) SendMessage(g_hwndEdit,SCI_GETLINEENDPOSITION,(WPARAM)(iLine - 1),0),0); SendMessage(g_hwndEdit,SCI_NEWLINE,0,0); } - EndSelUndoAction(token); + EndUndoAction(token); } break; @@ -4709,12 +4777,12 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) SendMessage(g_hwndEdit, SCI_CLEAR, 0, 0); } else { - int token = BeginSelUndoAction(); + int token = BeginUndoAction(); SendMessage(g_hwndEdit, SCI_CLEAR, 0, 0); // possible unexpected behavior on Virtual Space Access, so: const int iPos = SciCall_GetCurrentPos(); - SendMessage(g_hwndEdit, SCI_SETSELECTION, iPos, iPos); - EndSelUndoAction(token); + SendMessage(g_hwndEdit, SCI_SETSEL, iPos, iPos); + EndUndoAction(token); } } break; @@ -4724,9 +4792,9 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) if ((BOOL)SendMessage(g_hwndEdit, SCI_GETSELECTIONEMPTY, 0, 0)) SendMessage(g_hwndEdit, SCI_DELETEBACK, 0, 0); else { - int token = BeginSelUndoAction(); + int token = BeginUndoAction(); SendMessage(g_hwndEdit, SCI_DELETEBACK, 0, 0); - EndSelUndoAction(token); + EndUndoAction(token); } break; @@ -4750,9 +4818,9 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) int iIndentPos = (int)SendMessage(g_hwndEdit,SCI_GETLINEINDENTPOSITION,(WPARAM)iLine,0); if (iPos != iAnchor) { - int token = BeginSelUndoAction(); + int token = BeginUndoAction(); SendMessage(g_hwndEdit,SCI_SETSEL,(WPARAM)iPos,(LPARAM)iPos); - EndSelUndoAction(token); + EndUndoAction(token); } else { if (iPos == iStartPos) @@ -4775,9 +4843,9 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) int iEndPos = (int)SendMessage(g_hwndEdit,SCI_GETLINEENDPOSITION,(WPARAM)iLine,0); if (iPos != iAnchor) { - int token = BeginSelUndoAction(); + int token = BeginUndoAction(); SendMessage(g_hwndEdit, SCI_SETSEL, (WPARAM)iPos, (LPARAM)iPos); - EndSelUndoAction(token); + EndUndoAction(token); } else { if (iStartPos != iEndPos) @@ -4791,13 +4859,13 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) case CMD_CTRLTAB: { - int token = ((BOOL)SendMessage(g_hwndEdit, SCI_GETSELECTIONEMPTY, 0, 0)) ? -1 : BeginSelUndoAction(); + int token = SciCall_IsSelectionEmpty() ? -1 : BeginUndoAction(); SendMessage(g_hwndEdit,SCI_SETTABINDENTS,FALSE,0); SendMessage(g_hwndEdit,SCI_SETUSETABS,TRUE,0); SendMessage(g_hwndEdit,SCI_TAB,0,0); SendMessage(g_hwndEdit,SCI_SETUSETABS,!bTabsAsSpaces,0); SendMessage(g_hwndEdit,SCI_SETTABINDENTS,bTabIndents,0); - if (token >= 0) EndSelUndoAction(token); + if (token >= 0) EndUndoAction(token); } break; @@ -5092,56 +5160,32 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) case CMD_STRINGIFY: - { - int token = BeginSelUndoAction(); - EditEncloseSelection(g_hwndEdit,L"'",L"'"); - EndSelUndoAction(token); - } + EditEncloseSelection(g_hwndEdit,L"'",L"'"); break; case CMD_STRINGIFY2: - { - int token = BeginSelUndoAction(); - EditEncloseSelection(g_hwndEdit,L"\"",L"\""); - EndSelUndoAction(token); - } + EditEncloseSelection(g_hwndEdit,L"\"",L"\""); break; case CMD_EMBRACE: - { - int token = BeginSelUndoAction(); - EditEncloseSelection(g_hwndEdit,L"(",L")"); - EndSelUndoAction(token); - } + EditEncloseSelection(g_hwndEdit,L"(",L")"); break; case CMD_EMBRACE2: - { - int token = BeginSelUndoAction(); - EditEncloseSelection(g_hwndEdit,L"[",L"]"); - EndSelUndoAction(token); - } + EditEncloseSelection(g_hwndEdit,L"[",L"]"); break; case CMD_EMBRACE3: - { - int token = BeginSelUndoAction(); - EditEncloseSelection(g_hwndEdit,L"{",L"}"); - EndSelUndoAction(token); - } + EditEncloseSelection(g_hwndEdit,L"{",L"}"); break; case CMD_EMBRACE4: - { - int token = BeginSelUndoAction(); - EditEncloseSelection(g_hwndEdit,L"`",L"`"); - EndSelUndoAction(token); - } + EditEncloseSelection(g_hwndEdit,L"`",L"`"); break; @@ -5162,7 +5206,7 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) case CMD_JUMP2SELSTART: - if (SC_SEL_RECTANGLE != SendMessage(hwnd,SCI_GETSELECTIONMODE,0,0)) { + if (!SciCall_IsSelectionRectangle()) { int iAnchorPos = (int)SendMessage(g_hwndEdit,SCI_GETANCHOR,0,0); int iCursorPos = (int)SendMessage(g_hwndEdit,SCI_GETCURRENTPOS,0,0); if (iCursorPos > iAnchorPos) { @@ -5174,7 +5218,7 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) case CMD_JUMP2SELEND: - if (SC_SEL_RECTANGLE != SendMessage(hwnd,SCI_GETSELECTIONMODE,0,0)) { + if (!SciCall_IsSelectionRectangle()) { int iAnchorPos = (int)SendMessage(g_hwndEdit,SCI_GETANCHOR,0,0); int iCursorPos = (int)SendMessage(g_hwndEdit,SCI_GETCURRENTPOS,0,0); if (iCursorPos < iAnchorPos) { @@ -5571,9 +5615,37 @@ LRESULT MsgNotify(HWND hwnd,WPARAM wParam,LPARAM lParam) LPNMHDR pnmh = (LPNMHDR)lParam; struct SCNotification* scn = (struct SCNotification*)lParam; + if (!CheckNotifyChangeEvent()) + { + // --- check only mandatory events (must be fast !!!) --- + if (pnmh->idFrom == IDC_EDIT) { + if (pnmh->code == SCN_MODIFIED) { + // check for ADDUNDOACTION step + if (scn->modificationType & SC_MOD_CONTAINER) { + if (scn->modificationType & SC_PERFORMED_UNDO) { + RestoreAction(scn->token, UNDO); + } + else if (scn->modificationType & SC_PERFORMED_REDO) { + RestoreAction(scn->token, REDO); + } + } + SetDocumentModified(TRUE); + return TRUE; + } + else if (pnmh->code == SCN_SAVEPOINTREACHED) { + SetDocumentModified(FALSE); + return TRUE; + } + else if (pnmh->code == SCN_SAVEPOINTLEFT) { + SetDocumentModified(TRUE); + return TRUE; + } + } + return FALSE; + } + switch(pnmh->idFrom) { - case IDC_EDIT: switch (pnmh->code) @@ -5649,10 +5721,10 @@ LRESULT MsgNotify(HWND hwnd,WPARAM wParam,LPARAM lParam) // check for ADDUNDOACTION step if (scn->modificationType & SC_MOD_CONTAINER) { if (scn->modificationType & SC_PERFORMED_UNDO) { - RestoreSelectionAction(scn->token, UNDO); + RestoreAction(scn->token, UNDO); } else if (scn->modificationType & SC_PERFORMED_REDO) { - RestoreSelectionAction(scn->token, REDO); + RestoreAction(scn->token, REDO); } } else if (scn->modificationType & SC_MOD_CHANGESTYLE) { @@ -5664,11 +5736,12 @@ LRESULT MsgNotify(HWND hwnd,WPARAM wParam,LPARAM lParam) MarkAllOccurrences(iUpdateDelayMarkAllCoccurrences); } - bModified = TRUE; if (scn->linesAdded != 0) { UpdateLineNumberWidth(); } - UpdateToolbar(); + + SetDocumentModified(TRUE); + UpdateStatusbar(); } break; @@ -5781,10 +5854,10 @@ LRESULT MsgNotify(HWND hwnd,WPARAM wParam,LPARAM lParam) StringCchCompareINA(tchIns, COUNTOF(tchIns), "", -1) && StringCchCompareINA(tchIns, COUNTOF(tchIns), "", -1)) { - int token = BeginSelUndoAction(); + int token = BeginUndoAction(); SendMessage(g_hwndEdit, SCI_REPLACESEL, 0, (LPARAM)tchIns); SendMessage(g_hwndEdit, SCI_SETSEL, iCurPos, iCurPos); - EndSelUndoAction(token); + EndUndoAction(token); } } } @@ -5802,12 +5875,6 @@ LRESULT MsgNotify(HWND hwnd,WPARAM wParam,LPARAM lParam) break; - case SCN_SAVEPOINTREACHED: - bModified = FALSE; - UpdateToolbar(); - break; - - case SCN_MARGINCLICK: if (scn->margin == MARGIN_FOLD_INDEX) FoldClick(SciCall_LineFromPosition(scn->position), scn->modifiers); @@ -5820,9 +5887,13 @@ LRESULT MsgNotify(HWND hwnd,WPARAM wParam,LPARAM lParam) break; + case SCN_SAVEPOINTREACHED: + SetDocumentModified(FALSE); + break; + + case SCN_SAVEPOINTLEFT: - bModified = TRUE; - UpdateToolbar(); + SetDocumentModified(TRUE); break; default: @@ -6234,6 +6305,8 @@ void LoadSettings() bDenyVirtualSpaceAccess = IniSectionGetBool(pIniSection, L"DenyVirtualSpaceAccess", FALSE); bUseOldStyleBraceMatching = IniSectionGetBool(pIniSection, L"UseOldStyleBraceMatching", FALSE); + iCurrentLineVerticalSlop = IniSectionGetInt(pIniSection, L"CurrentLineVerticalSlop", 5); + iCurrentLineVerticalSlop = max(min(iCurrentLineVerticalSlop, 80), 0); LoadIniSection(L"Toolbar Images",pIniSection,cchIniSection); @@ -7164,7 +7237,7 @@ void MarkAllOccurrences(int delay) void UpdateVisibleUrlHotspot(int delay) { if (delay < USER_TIMER_MINIMUM) { - EditUpdateVisibleUrlHotspot(); + EditUpdateVisibleUrlHotspot(bHyperlinkHotspot); return; } TEST_AND_SET(TIMER_BIT_UPDATE_HYPER); @@ -7185,7 +7258,7 @@ void UpdateVisibleUrlHotspot(int delay) void UpdateToolbar() { SetWindowTitle(g_hwndMain, uidsAppTitle, flagIsElevated, IDS_UNTITLED, szCurFile, - iPathNameFormat, bModified || Encoding_HasChanged(CPI_GET), + iPathNameFormat, IsDocumentModified || Encoding_HasChanged(CPI_GET), IDS_READONLY, bReadOnly, szTitleExcerpt); if (!bShowToolbar) @@ -7216,7 +7289,7 @@ void UpdateToolbar() EnableTool(IDT_VIEW_TOGGLEFOLDS,i2 && bShowCodeFolding); EnableTool(IDT_FILE_LAUNCH,i2); - EnableTool(IDT_FILE_SAVE, (bModified || Encoding_HasChanged(CPI_GET)) /*&& !bReadOnly*/); + EnableTool(IDT_FILE_SAVE, (IsDocumentModified || Encoding_HasChanged(CPI_GET)) /*&& !bReadOnly*/); CheckTool(IDT_VIEW_WORDWRAP,bWordWrap); @@ -7276,7 +7349,7 @@ void UpdateStatusbar() const int iSelStart = (bIsSelEmpty ? 0 : SciCall_GetSelectionStart()); const int iSelEnd = (bIsSelEmpty ? 0 : SciCall_GetSelectionEnd()); - if (!bIsSelEmpty && (SC_SEL_RECTANGLE != SendMessage(g_hwndEdit, SCI_GETSELECTIONMODE, 0, 0))) + if (!bIsSelEmpty && !SciCall_IsSelectionRectangle()) { const int iSel = (int)SendMessage(g_hwndEdit, SCI_COUNTCHARACTERS, iSelStart, iSelEnd); StringCchPrintf(tchSel, COUNTOF(tchSel), L"%i", iSel); @@ -7439,45 +7512,45 @@ void InvalidateSelections() { // Invalidate invalid selections // #pragma message("TODO: Remove check for invalid selections once fixed in Scintilla") - if (SendMessage(g_hwndEdit, SCI_GETSELECTIONS, 0, 0) > 1 && - SendMessage(g_hwndEdit, SCI_GETSELECTIONMODE, 0, 0) != SC_SEL_RECTANGLE) { + if (SendMessage(g_hwndEdit, SCI_GETSELECTIONS, 0, 0) > 1 && !SciCall_IsSelectionRectangle()) { int iCurPos = (int)SendMessage(g_hwndEdit, SCI_GETCURRENTPOS, 0, 0); SendMessage(g_hwndEdit, WM_CANCELMODE, 0, 0); SendMessage(g_hwndEdit, SCI_CLEARSELECTIONS, 0, 0); - SendMessage(g_hwndEdit, SCI_SETSELECTION, (WPARAM)iCurPos, (LPARAM)iCurPos); + SendMessage(g_hwndEdit, SCI_SETSEL, iCurPos, iCurPos); } } //============================================================================= // -// BeginSelUndoAction() +// BeginUndoAction() // // -int BeginSelUndoAction() +int BeginUndoAction() { int token = -1; UndoRedoSelection_t sel = { -1, -1, -1, -1, -1, 0, 0, 0, 0, 0 }; sel.selMode = (int)SendMessage(g_hwndEdit,SCI_GETSELECTIONMODE,0,0); sel.rectSelVS = (int)SendMessage(g_hwndEdit,SCI_GETVIRTUALSPACEOPTIONS,0,0); - if (sel.selMode == SC_SEL_LINES) { - sel.anchorPos_undo = (int)SendMessage(g_hwndEdit,SCI_GETSELECTIONSTART,0,0); - sel.currPos_undo = (int)SendMessage(g_hwndEdit,SCI_GETSELECTIONEND,0,0); - } - else if (sel.selMode == SC_SEL_RECTANGLE) { - sel.anchorPos_undo = (int)SendMessage(g_hwndEdit, SCI_GETRECTANGULARSELECTIONANCHOR, 0, 0); - sel.currPos_undo = (int)SendMessage(g_hwndEdit, SCI_GETRECTANGULARSELECTIONCARET, 0, 0); - if ((sel.rectSelVS & SCVS_RECTANGULARSELECTION) != 0) { - sel.anchorVS_undo = (int)SendMessage(g_hwndEdit, SCI_GETRECTANGULARSELECTIONANCHORVIRTUALSPACE, 0, 0); - sel.currVS_undo = (int)SendMessage(g_hwndEdit, SCI_GETRECTANGULARSELECTIONCARETVIRTUALSPACE, 0, 0); + + sel.anchorPos_undo = (int)SendMessage(g_hwndEdit, SCI_GETANCHOR, 0, 0); + sel.currPos_undo = (int)SendMessage(g_hwndEdit, SCI_GETCURRENTPOS, 0, 0); + + if (!(BOOL)SendMessage(g_hwndEdit, SCI_GETSELECTIONEMPTY, 0, 0)) { + if (sel.selMode == SC_SEL_LINES) { + sel.anchorPos_undo = (int)SendMessage(g_hwndEdit, SCI_GETSELECTIONSTART, 0, 0); + sel.currPos_undo = (int)SendMessage(g_hwndEdit, SCI_GETSELECTIONEND, 0, 0); + } + else if (sel.selMode == SC_SEL_RECTANGLE) { + sel.anchorPos_undo = (int)SendMessage(g_hwndEdit, SCI_GETRECTANGULARSELECTIONANCHOR, 0, 0); + sel.currPos_undo = (int)SendMessage(g_hwndEdit, SCI_GETRECTANGULARSELECTIONCARET, 0, 0); + if ((sel.rectSelVS & SCVS_RECTANGULARSELECTION) != 0) { + sel.anchorVS_undo = (int)SendMessage(g_hwndEdit, SCI_GETRECTANGULARSELECTIONANCHORVIRTUALSPACE, 0, 0); + sel.currVS_undo = (int)SendMessage(g_hwndEdit, SCI_GETRECTANGULARSELECTIONCARETVIRTUALSPACE, 0, 0); + } } } - else - { - sel.anchorPos_undo = (int)SendMessage(g_hwndEdit,SCI_GETANCHOR,0,0); - sel.currPos_undo = (int)SendMessage(g_hwndEdit,SCI_GETCURRENTPOS,0,0); - } - token = UndoRedoSelectionMap(-1, &sel); + token = UndoRedoActionMap(-1, &sel); if (token >= 0) { SendMessage(g_hwndEdit, SCI_BEGINUNDOACTION, 0, 0); SendMessage(g_hwndEdit, SCI_ADDUNDOACTION, (WPARAM)token, 0); @@ -7489,33 +7562,35 @@ int BeginSelUndoAction() //============================================================================= // -// EndSelUndoAction() +// EndUndoAction() // // -void EndSelUndoAction(int token) +void EndUndoAction(int token) { if (token >= 0) { UndoRedoSelection_t sel = { -1, -1, -1, -1, -1, 0, 0, 0, 0, 0 }; - if (UndoRedoSelectionMap(token,&sel) >= 0) { + if (UndoRedoActionMap(token,&sel) >= 0) { // mode and type should not have changed - if (sel.selMode == SC_SEL_LINES) { - sel.anchorPos_redo = (int)SendMessage(g_hwndEdit,SCI_GETSELECTIONSTART,0,0); - sel.currPos_redo = (int)SendMessage(g_hwndEdit,SCI_GETSELECTIONEND,0,0); - } - else if (sel.selMode == SC_SEL_RECTANGLE) { - sel.anchorPos_redo = (int)SendMessage(g_hwndEdit, SCI_GETRECTANGULARSELECTIONANCHOR, 0, 0); - sel.currPos_redo = (int)SendMessage(g_hwndEdit, SCI_GETRECTANGULARSELECTIONCARET, 0, 0); - if ((sel.rectSelVS & SCVS_RECTANGULARSELECTION) != 0) { - sel.anchorVS_redo = (int)SendMessage(g_hwndEdit, SCI_GETRECTANGULARSELECTIONANCHORVIRTUALSPACE, 0, 0); - sel.currVS_redo = (int)SendMessage(g_hwndEdit, SCI_GETRECTANGULARSELECTIONCARETVIRTUALSPACE, 0, 0); + + sel.anchorPos_redo = (int)SendMessage(g_hwndEdit, SCI_GETANCHOR, 0, 0); + sel.currPos_redo = (int)SendMessage(g_hwndEdit, SCI_GETCURRENTPOS, 0, 0); + + if (!(BOOL)SendMessage(g_hwndEdit, SCI_GETSELECTIONEMPTY, 0, 0)) { + if (sel.selMode == SC_SEL_LINES) { + sel.anchorPos_redo = (int)SendMessage(g_hwndEdit, SCI_GETSELECTIONSTART, 0, 0); + sel.currPos_redo = (int)SendMessage(g_hwndEdit, SCI_GETSELECTIONEND, 0, 0); + } + else if (sel.selMode == SC_SEL_RECTANGLE) { + sel.anchorPos_redo = (int)SendMessage(g_hwndEdit, SCI_GETRECTANGULARSELECTIONANCHOR, 0, 0); + sel.currPos_redo = (int)SendMessage(g_hwndEdit, SCI_GETRECTANGULARSELECTIONCARET, 0, 0); + if ((sel.rectSelVS & SCVS_RECTANGULARSELECTION) != 0) { + sel.anchorVS_redo = (int)SendMessage(g_hwndEdit, SCI_GETRECTANGULARSELECTIONANCHORVIRTUALSPACE, 0, 0); + sel.currVS_redo = (int)SendMessage(g_hwndEdit, SCI_GETRECTANGULARSELECTIONCARETVIRTUALSPACE, 0, 0); + } } } - else { - sel.anchorPos_redo = (int)SendMessage(g_hwndEdit,SCI_GETANCHOR,0,0); - sel.currPos_redo = (int)SendMessage(g_hwndEdit,SCI_GETCURRENTPOS,0,0); - } } - UndoRedoSelectionMap(token,&sel); // set with redo action filled + UndoRedoActionMap(token,&sel); // set with redo action filled SendMessage(g_hwndEdit, SCI_ENDUNDOACTION, 0, 0); } } @@ -7523,16 +7598,24 @@ void EndSelUndoAction(int token) //============================================================================= // -// RestoreSelectionAction() +// RestoreAction() // // -void RestoreSelectionAction(int token, DoAction doAct) +void RestoreAction(int token, DoAction doAct) { UndoRedoSelection_t sel = { -1, -1, -1, -1, -1, 0, 0, 0, 0, 0 }; - if (UndoRedoSelectionMap(token,&sel) >= 0) { + if (UndoRedoActionMap(token,&sel) >= 0) { // we are inside undo/redo transaction, so do delayed PostMessage() instead of SendMessage() int anchorPos = (doAct == UNDO ? sel.anchorPos_undo : sel.anchorPos_redo); int currPos = (doAct == UNDO ? sel.currPos_undo : sel.currPos_redo); + int anchorPosLine = (int)SendMessage(g_hwndEdit, SCI_LINEFROMPOSITION, anchorPos, 0); + int currPosLine = (int)SendMessage(g_hwndEdit, SCI_LINEFROMPOSITION, currPos, 0); + // Ensure that the first and last lines of a selection are always unfolded + // This needs to be done _before_ the SCI_SETSEL message + SendMessage(g_hwndEdit, SCI_ENSUREVISIBLE, anchorPosLine, 0); + if (anchorPosLine != currPosLine) { + SendMessage(g_hwndEdit, SCI_ENSUREVISIBLE, currPosLine, 0); + } int currRectType = (int)SendMessage(g_hwndEdit,SCI_GETVIRTUALSPACEOPTIONS,0,0); PostMessage(g_hwndEdit,SCI_SETSELECTIONMODE,(WPARAM)sel.selMode,0); PostMessage(g_hwndEdit,SCI_SETVIRTUALSPACEOPTIONS,(WPARAM)sel.rectSelVS,0); @@ -7544,14 +7627,15 @@ void RestoreSelectionAction(int token, DoAction doAct) PostMessage(g_hwndEdit, SCI_SETRECTANGULARSELECTIONANCHOR, (WPARAM)anchorPos, 0); PostMessage(g_hwndEdit, SCI_SETRECTANGULARSELECTIONCARET, (WPARAM)currPos, 0); if ((sel.rectSelVS & SCVS_RECTANGULARSELECTION) != 0) { - int anchorVS = (doAct == UNDO ? sel.anchorVS_undo : sel.anchorVS_redo); - int currVS = (doAct == UNDO ? sel.currVS_undo : sel.currVS_redo); - PostMessage(g_hwndEdit, SCI_SETRECTANGULARSELECTIONANCHORVIRTUALSPACE, (WPARAM)anchorVS, 0); - PostMessage(g_hwndEdit, SCI_SETRECTANGULARSELECTIONCARETVIRTUALSPACE, (WPARAM)currVS, 0); + int anchorVS = (doAct == UNDO ? sel.anchorVS_undo : sel.anchorVS_redo); + int currVS = (doAct == UNDO ? sel.currVS_undo : sel.currVS_redo); + PostMessage(g_hwndEdit, SCI_SETRECTANGULARSELECTIONANCHORVIRTUALSPACE, (WPARAM)anchorVS, 0); + PostMessage(g_hwndEdit, SCI_SETRECTANGULARSELECTIONCARETVIRTUALSPACE, (WPARAM)currVS, 0); } } else { - PostMessage(g_hwndEdit,SCI_SETSELECTION,(WPARAM)currPos,(LPARAM)anchorPos); + PostMessage(g_hwndEdit, SCI_SETSEL, (LPARAM)anchorPos, (WPARAM)currPos); + PostMessage(g_hwndEdit, SCI_SCROLLRANGE, (LPARAM)anchorPos, (WPARAM)currPos); } PostMessage(g_hwndEdit,SCI_SETVIRTUALSPACEOPTIONS,(WPARAM)currRectType,0); PostMessage(g_hwndEdit, SCI_CANCEL, 0, 0); @@ -7565,7 +7649,7 @@ void RestoreSelectionAction(int token, DoAction doAct) // // -int UndoRedoSelectionMap(int token, UndoRedoSelection_t* selection) +int UndoRedoActionMap(int token, UndoRedoSelection_t* selection) { if (UndoRedoSelectionUTArray == NULL) return -1; @@ -7685,8 +7769,7 @@ BOOL FileLoad(BOOL bDontSave,BOOL bNew,BOOL bReload,BOOL bNoEncDetect,LPCWSTR lp FileVars_Init(NULL,0,&fvCurFile); EditSetNewText(g_hwndEdit,"",0); Style_SetLexer(g_hwndEdit,NULL); - bModified = FALSE; - bReadOnly = FALSE; + iEOLMode = iLineEndings[iDefaultEOLMode]; SendMessage(g_hwndEdit,SCI_SETEOLMODE,iLineEndings[iDefaultEOLMode],0); Encoding_Current(iDefaultEncoding); @@ -7694,7 +7777,8 @@ BOOL FileLoad(BOOL bDontSave,BOOL bNew,BOOL bReload,BOOL bNoEncDetect,LPCWSTR lp Encoding_SciSetCodePage(g_hwndEdit,iDefaultEncoding); EditSetNewText(g_hwndEdit,"",0); - UpdateToolbar(); + bReadOnly = FALSE; + SetDocumentModified(FALSE); UpdateStatusbar(); UpdateLineNumberWidth(); @@ -7802,8 +7886,6 @@ BOOL FileLoad(BOOL bDontSave,BOOL bNew,BOOL bReload,BOOL bNoEncDetect,LPCWSTR lp if (!flagLexerSpecified) // flag will be cleared Style_SetLexerFromFile(g_hwndEdit,szCurFile); - bModified = FALSE; - //bReadOnly = FALSE; SendMessage(g_hwndEdit,SCI_SETEOLMODE,iEOLMode,0); fileEncoding = Encoding_Current(CPI_GET); Encoding_HasChanged(fileEncoding); @@ -7837,7 +7919,7 @@ BOOL FileLoad(BOOL bDontSave,BOOL bNew,BOOL bReload,BOOL bNoEncDetect,LPCWSTR lp EditJumpTo(g_hwndEdit,-1,0); SendMessage(g_hwndEdit,SCI_NEWLINE,0,0); SendMessage(g_hwndEdit,SCI_ENDUNDOACTION,0,0); - EditJumpTo(g_hwndEdit,-1,0); + SendMessage(g_hwndEdit, SCI_DOCUMENTEND, 0, 0); EditEnsureSelectionVisible(g_hwndEdit); } // set historic caret pos @@ -7852,7 +7934,8 @@ BOOL FileLoad(BOOL bDontSave,BOOL bNew,BOOL bReload,BOOL bNoEncDetect,LPCWSTR lp } } - UpdateToolbar(); + //bReadOnly = FALSE; + SetDocumentModified(FALSE); UpdateStatusbar(); UpdateLineNumberWidth(); UpdateVisibleUrlHotspot(0); @@ -7900,7 +7983,7 @@ BOOL FileRevert(LPCWSTR szFileName) if (FileLoad(TRUE,FALSE,TRUE,FALSE,tchFileName2)) { if (bIsTail && iFileWatchingMode == 2) { - EditJumpTo(g_hwndEdit, -1, 0); + SendMessage(g_hwndEdit, SCI_DOCUMENTEND, 0, 0); EditEnsureSelectionVisible(g_hwndEdit); } else if (SendMessage(g_hwndEdit,SCI_GETLENGTH,0,0) >= 4) { @@ -7948,7 +8031,7 @@ BOOL FileSave(BOOL bSaveAlways,BOOL bAsk,BOOL bSaveAs,BOOL bSaveCopy) } } - if (!bSaveAlways && (!bModified && !Encoding_HasChanged(CPI_GET) || bIsEmptyNewFile) && !bSaveAs) { + if (!bSaveAlways && (!IsDocumentModified && !Encoding_HasChanged(CPI_GET) || bIsEmptyNewFile) && !bSaveAs) { int idx; if (MRU_FindFile(pFileMRU,szCurFile,&idx)) { pFileMRU->iEncoding[idx] = Encoding_Current(CPI_GET); @@ -8043,7 +8126,6 @@ BOOL FileSave(BOOL bSaveAlways,BOOL bAsk,BOOL bSaveAs,BOOL bSaveCopy) { if (!bSaveCopy) { - bModified = FALSE; int iCurrEnc = Encoding_Current(CPI_GET); Encoding_HasChanged(iCurrEnc); int iCaretPos = (int)SendMessage(g_hwndEdit, SCI_GETCURRENTPOS, 0, 0); @@ -8052,7 +8134,8 @@ BOOL FileSave(BOOL bSaveAlways,BOOL bAsk,BOOL bSaveAs,BOOL bSaveCopy) MRU_AddFile(pFileMRU,szCurFile,flagRelativeFileMRU,flagPortableMyDocs,iCurrEnc,iCaretPos,wchBookMarks); if (flagUseSystemMRU == 2) SHAddToRecentDocs(SHARD_PATHW,szCurFile); - UpdateToolbar(); + + SetDocumentModified(FALSE); // Install watching of the current file if (bSaveAs && bResetFileWatching) iFileWatchingMode = 0; @@ -8099,7 +8182,7 @@ BOOL FileSave(BOOL bSaveAlways,BOOL bAsk,BOOL bSaveAs,BOOL bSaveCopy) LocalFree(lpArgs); // set no change and quit Encoding_HasChanged(Encoding_Current(CPI_GET)); - bModified = FALSE; + SetDocumentModified(FALSE); PostMessage(g_hwndMain,WM_CLOSE,0,0); } else { @@ -8733,7 +8816,7 @@ void SetNotifyIconTitle(HWND hwnd) else GetString(IDS_UNTITLED,tchTitle,COUNTOF(tchTitle)-4); - if (bModified || Encoding_HasChanged(CPI_GET)) + if (IsDocumentModified || Encoding_HasChanged(CPI_GET)) StringCchCopy(nid.szTip,COUNTOF(nid.szTip),L"* "); else StringCchCopy(nid.szTip,COUNTOF(nid.szTip),L""); @@ -8882,7 +8965,7 @@ void CALLBACK WatchTimerProc(HWND hwnd,UINT uMsg,UINT_PTR idEvent,DWORD dwTime) // void CALLBACK PasteBoardTimer(HWND hwnd,UINT uMsg,UINT_PTR idEvent,DWORD dwTime) { - if (dwLastCopyTime > 0 && GetTickCount() - dwLastCopyTime > 200) { + if ((dwLastCopyTime > 0) && ((GetTickCount() - dwLastCopyTime) > 200)) { if (SendMessage(g_hwndEdit,SCI_CANPASTE,0,0)) { @@ -8890,15 +8973,15 @@ void CALLBACK PasteBoardTimer(HWND hwnd,UINT uMsg,UINT_PTR idEvent,DWORD dwTime) bAutoIndent = 0; EditJumpTo(g_hwndEdit,-1,0); SendMessage(g_hwndEdit,SCI_BEGINUNDOACTION,0,0); - if (SendMessage(g_hwndEdit,SCI_GETLENGTH,0,0) > 0) - SendMessage(g_hwndEdit,SCI_NEWLINE,0,0); + if (SendMessage(g_hwndEdit, SCI_GETLENGTH, 0, 0) > 0) { + SendMessage(g_hwndEdit, SCI_NEWLINE, 0, 0); + } SendMessage(g_hwndEdit,SCI_PASTE,0,0); SendMessage(g_hwndEdit,SCI_NEWLINE,0,0); SendMessage(g_hwndEdit,SCI_ENDUNDOACTION,0,0); EditEnsureSelectionVisible(g_hwndEdit); bAutoIndent = bAutoIndent2; } - dwLastCopyTime = 0; } diff --git a/src/Notepad3.h b/src/Notepad3.h index a378200b6..6f03336a1 100644 --- a/src/Notepad3.h +++ b/src/Notepad3.h @@ -150,10 +150,10 @@ void UpdateUI(); void InvalidateSelections(); -int BeginSelUndoAction(); -void EndSelUndoAction(int); -void RestoreSelectionAction(int,DoAction); -int UndoRedoSelectionMap(int,UndoRedoSelection_t*); +int BeginUndoAction(); +void EndUndoAction(int); +void RestoreAction(int,DoAction); +int UndoRedoActionMap(int,UndoRedoSelection_t*); void OpenHotSpotURL(int, BOOL); @@ -181,6 +181,9 @@ LRESULT MsgSysCommand(HWND, UINT, WPARAM, LPARAM); LRESULT MsgCommand(HWND, WPARAM, LPARAM); LRESULT MsgNotify(HWND, WPARAM, LPARAM); +void IgnoreNotifyChangeEvent(); +void ObserveNotifyChangeEvent(); +BOOL CheckNotifyChangeEvent(); #endif //_NP3_NOTEPAD3_H_ /// End of Notepad3.h \\\ diff --git a/src/Notepad3.rc b/src/Notepad3.rc index 27cc9bb14..e7b4e9d6d 100644 --- a/src/Notepad3.rc +++ b/src/Notepad3.rc @@ -1832,7 +1832,7 @@ BEGIN 63192 "XML Comment" 63193 "XML Entity" 63194 "Tag-Class" - 63195 "Tag-Id" + 63195 "Tag-ID" 63196 "Tag-Attribute" 63197 "Pseudo-Class" 63198 "Unknown Pseudo-Class" @@ -1924,6 +1924,8 @@ BEGIN 63264 "Hyperlink Hotspots" 63265 "2nd Hyperlink Hotspots" 63266 "2nd Default Text" + 63267 "Variable within String" + 63268 "Ordered List" END #endif // Englisch (USA) resources diff --git a/src/Notepad3.vcxproj b/src/Notepad3.vcxproj index 1735a0f83..a5edf2131 100644 --- a/src/Notepad3.vcxproj +++ b/src/Notepad3.vcxproj @@ -327,6 +327,7 @@ + diff --git a/src/Notepad3.vcxproj.filters b/src/Notepad3.vcxproj.filters index 330b76499..76ae07fab 100644 --- a/src/Notepad3.vcxproj.filters +++ b/src/Notepad3.vcxproj.filters @@ -136,6 +136,9 @@ templates + + Resource Files + diff --git a/src/SciCall.h b/src/SciCall.h index f036c37f1..69522157e 100644 --- a/src/SciCall.h +++ b/src/SciCall.h @@ -82,21 +82,27 @@ __forceinline LRESULT SciCall_##fn(type1 var1, type2 var2) { \ // Selection, positions and information // // +DeclareSciCallR0(IsDocModified, GETMODIFY, BOOL); +DeclareSciCallR0(IsSelectionEmpty, GETSELECTIONEMPTY, BOOL); +DeclareSciCallR0(IsSelectionRectangle, SELECTIONISRECTANGLE, BOOL); DeclareSciCallR0(GetCurrentPos, GETCURRENTPOS, int); DeclareSciCallR0(GetAnchor, GETANCHOR, int); -DeclareSciCallR0(IsSelectionEmpty, GETSELECTIONEMPTY, BOOL); DeclareSciCallR0(GetSelectionMode, GETSELECTIONMODE, int); DeclareSciCallR0(GetSelectionStart, GETSELECTIONSTART, int); DeclareSciCallR0(GetSelectionEnd, GETSELECTIONEND, int); DeclareSciCallR1(GetLineSelStartPosition, GETLINESELSTARTPOSITION, int, Sci_Position, line); DeclareSciCallR1(GetLineSelEndPosition, GETLINESELENDPOSITION, int, Sci_Position, line); -DeclareSciCallV2(SetSel, SETSEL, int, anchorPos, int, currentPos); +DeclareSciCallV2(SetSel, SETSEL, Sci_Position, anchorPos, Sci_Position, currentPos); +DeclareSciCallV2(ScrollRange, SCROLLRANGE, Sci_Position, secondaryPos, Sci_Position, primaryPos); +DeclareSciCallV0(Clear, CLEAR); DeclareSciCallV2(SetTargetRange, SETTARGETRANGE, int, start, int, end); DeclareSciCallV0(TargetFromSelection, TARGETFROMSELECTION); -DeclareSciCallV1(GotoPos, GOTOPOS, int, position); -DeclareSciCallV1(GotoLine, GOTOLINE, int, line); +DeclareSciCallV1(SetAnchor, SETANCHOR, Sci_Position, position); +DeclareSciCallV1(SetCurrentPos, SETCURRENTPOS, Sci_Position, position); +DeclareSciCallV1(GotoPos, GOTOPOS, Sci_Position, position); +DeclareSciCallV1(GotoLine, GOTOLINE, Sci_Position, line); DeclareSciCallR1(PositionBefore, POSITIONBEFORE, int, Sci_Position, position); DeclareSciCallR1(PositionAfter, POSITIONAFTER, int, Sci_Position, position); DeclareSciCallR1(GetCharAt, GETCHARAT, char, Sci_Position, position); @@ -113,7 +119,7 @@ DeclareSciCallR0(GetFirstVisibleLine, GETFIRSTVISIBLELINE, int); DeclareSciCallR1(DocLineFromVisible, DOCLINEFROMVISIBLE, int, Sci_Position, line); DeclareSciCallR2(GetRangePointer, GETRANGEPOINTER, LPCCH, Sci_Position, start, Sci_Position, length); - +DeclareSciCallR0(GetCharacterPointer, GETCHARACTERPOINTER, LPCCH); //============================================================================= // diff --git a/src/Styles.c b/src/Styles.c index eb61fb751..70695a30d 100644 --- a/src/Styles.c +++ b/src/Styles.c @@ -349,7 +349,7 @@ EDITLEXER lexCSS = { SCLEX_CSS, 63003, L"CSS Style Sheets", L"css; less; sass; s { SCE_CSS_COMMENT, 63127, L"Comment", L"fore:#646464", L"" }, { SCE_CSS_TAG, 63136, L"HTML Tag", L"bold; fore:#0A246A", L"" }, { SCE_CSS_CLASS, 63194, L"Tag-Class", L"fore:#648000", L"" }, - { SCE_CSS_ID, 63195, L"Tag-Id", L"fore:#648000", L"" }, + { SCE_CSS_ID, 63195, L"Tag-ID", L"fore:#648000", L"" }, { SCE_CSS_ATTRIBUTE, 63196, L"Tag-Attribute", L"italic; fore:#648000", L"" }, { MULTI_STYLE(SCE_CSS_PSEUDOCLASS,SCE_CSS_EXTENDED_PSEUDOCLASS,0,0), 63197, L"Pseudo-Class", L"fore:#B000B0", L"" }, { MULTI_STYLE(SCE_CSS_PSEUDOELEMENT,SCE_CSS_EXTENDED_PSEUDOELEMENT,0,0), 63361, L"Pseudo-Element", L"fore:#B00050", L"" }, @@ -2429,7 +2429,7 @@ EDITLEXER lexCmake = { SCLEX_CMAKE, 63038, L"Cmake Script", L"cmake; ctest", L"" { SCE_CMAKE_FOREACHDEF, 63326, L"For Each Def", L"fore:#00007F", L"" }, { SCE_CMAKE_IFDEFINEDEF, 63327, L"If Def", L"fore:#00007F", L"" }, { SCE_CMAKE_MACRODEF, 63328, L"Macro Def", L"fore:#00007F", L"" }, - { SCE_CMAKE_STRINGVAR, 63329, L"Variable within string", L"back:#EEEEEE; fore:#CC3300", L"" }, + { SCE_CMAKE_STRINGVAR, 63267, L"Variable within String", L"back:#EEEEEE; fore:#CC3300", L"" }, { SCE_CMAKE_NUMBER, 63130, L"Number", L"fore:#008080", L"" }, //{ SCE_CMAKE_USERDEFINED, 63106, L"User Defined", L"fore:#800020", L"" }, { -1, 00000, L"", L"", L"" } } }; @@ -2544,7 +2544,7 @@ EDITLEXER lexMARKDOWN = { SCLEX_MARKDOWN, 63040, L"Markdown", L"md; markdown; md { SCE_MARKDOWN_HEADER6, 63346, L"Header 6", L"fore:#FF0088; bold", L"" }, { SCE_MARKDOWN_PRECHAR, 63347, L"Pre Char", L"fore:#00007F", L"" }, { SCE_MARKDOWN_ULIST_ITEM, 63348, L"Unordered List", L"fore:#0080FF; bold", L"" }, - { SCE_MARKDOWN_OLIST_ITEM, 63349, L"Ordered list", L"fore:#0080FF; bold", L"" }, + { SCE_MARKDOWN_OLIST_ITEM, 63268, L"Ordered List", L"fore:#0080FF; bold", L"" }, { SCE_MARKDOWN_BLOCKQUOTE, 63350, L"Block Quote", L"fore:#00007F", L"" }, { SCE_MARKDOWN_STRIKEOUT, 63351, L"Strikeout", L"", L"" }, { SCE_MARKDOWN_HRULE, 63352, L"Horizontal Rule", L"bold", L"" }, diff --git a/test/TestAhkNotepad3.ahk b/test/TestAhkNotepad3.ahk index 807978292..333ee0b51 100644 --- a/test/TestAhkNotepad3.ahk +++ b/test/TestAhkNotepad3.ahk @@ -84,7 +84,10 @@ Return CHECK_ABOUT_BOX: ; check About DlgBox WinActivate, ahk_pid %v_Notepad3_PID% -Send {F1} + +; This will select File->Open in Notepad: +WinMenuSelectItem, ahk_pid %v_Notepad3_PID%, , ?, About... + WinWait, About %v_NP3Name%, , 1 v_ErrLevel = %ErrorLevel% if (v_ErrLevel != 0) diff --git a/test/TestAhkNotepad3.cmd b/test/TestAhkNotepad3.cmd index 69e253ffb..c9eb1ec18 100644 --- a/test/TestAhkNotepad3.cmd +++ b/test/TestAhkNotepad3.cmd @@ -34,7 +34,7 @@ for %%i in (*.ahk) do ( echo +++ Run Testsuite %%~nxi +++ >> "%TEST_LOG%" start "testing" /B /Wait "%AHK_EXE%" /ErrorStdOut "%%~nxi" >> "%TEST_LOG%" 2>&1 if errorlevel 1 ( - set EXITCODE=%ERRORLEVEL% + set EXITCODE=1 echo *** Testsuite %%~nxi failed! *** echo *** ERROR: Testsuite %%~nxi failed! *** >> "%TEST_LOG%" ) else (