diff --git a/Build/Notepad3.ini b/Build/Notepad3.ini index 2f4458018..6773aaf75 100644 --- a/Build/Notepad3.ini +++ b/Build/Notepad3.ini @@ -39,6 +39,7 @@ SettingsVersion=4 ;WebTemplate2=https://en.wikipedia.org/w/index.php?search=%s ;ExtendedWhiteSpaceChars=: ;AutoCompleteWordCharSet= +;AutoCompleteFillUpChars= ;UpdateDelayMarkAllOccurrences=50 ;CurrentLineHorizontalSlop=40 ;CurrentLineVerticalSlop=5 diff --git a/Versions/build.txt b/Versions/build.txt index 075c4f664..37bdb5cae 100644 --- a/Versions/build.txt +++ b/Versions/build.txt @@ -1 +1 @@ -2405 +2406 diff --git a/res/Notepad3.exe.manifest.conf b/res/Notepad3.exe.manifest.conf index c9b83e1bf..c4ec9dfc1 100644 --- a/res/Notepad3.exe.manifest.conf +++ b/res/Notepad3.exe.manifest.conf @@ -3,7 +3,7 @@ Notepad3 BETA diff --git a/src/Config/Config.cpp b/src/Config/Config.cpp index d277afb18..7000585c9 100644 --- a/src/Config/Config.cpp +++ b/src/Config/Config.cpp @@ -728,6 +728,10 @@ void LoadSettings() IniSectionGetString(Settings2_Section, L"AutoCompleteWordCharSet", Defaults2.AutoCompleteWordCharSet, Settings2.AutoCompleteWordCharSet, COUNTOF(Settings2.AutoCompleteWordCharSet)); + Defaults2.AutoCompleteFillUpChars[0] = L'\0'; + IniSectionGetString(Settings2_Section, L"AutoCompleteFillUpChars", Defaults2.AutoCompleteFillUpChars, + Settings2.AutoCompleteFillUpChars, COUNTOF(Settings2.AutoCompleteFillUpChars)); + StringCchCopyW(Defaults2.TimeStamp, COUNTOF(Defaults2.TimeStamp), L"\\$Date:[^\\$]+\\$ | $Date: %Y/%m/%d %H:%M:%S $"); IniSectionGetString(Settings2_Section, L"TimeStamp", Defaults2.TimeStamp, Settings2.TimeStamp, COUNTOF(Settings2.TimeStamp)); @@ -743,7 +747,6 @@ void LoadSettings() StringCchCopyW(Defaults2.WebTemplate2, COUNTOF(Defaults2.WebTemplate2), L"https://en.wikipedia.org/w/index.php?search=%s"); IniSectionGetString(Settings2_Section, L"WebTemplate2", Defaults2.WebTemplate2, Settings2.WebTemplate2, COUNTOF(Settings2.WebTemplate2)); - // -------------------------------------------------------------------------- const WCHAR* const Settings_Section = L"Settings"; // -------------------------------------------------------------------------- diff --git a/src/Edit.c b/src/Edit.c index 543c7a6ed..b26b4d8d2 100644 --- a/src/Edit.c +++ b/src/Edit.c @@ -64,6 +64,9 @@ static char WordCharsAccelerated[ANSI_CHAR_BUFFER] = { '\0' }; static char WhiteSpaceCharsAccelerated[ANSI_CHAR_BUFFER] = { '\0' }; static char PunctuationCharsAccelerated[1] = { '\0' }; // empty! +static char AutoCompleteFillUpChars[64] = { '\0' }; +static bool s_ACFillUpCharsHaveNewLn = false; + // Default Codepage and Character Set #define W_AUTOC_WORD_ANSI1252 L"#$%&@0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyzÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ" static char AutoCompleteWordCharSet[ANSI_CHAR_BUFFER] = { L'\0' }; @@ -255,6 +258,22 @@ void EditInitWordDelimiter(HWND hwnd) StringCchCopyA(DelimCharsAccel, COUNTOF(DelimCharsAccel), WhiteSpaceCharsDefault); StringCchCatA(DelimCharsAccel, COUNTOF(DelimCharsAccel), lineEnds); + if (StrIsNotEmpty(Settings2.AutoCompleteFillUpChars)) + { + WideCharToMultiByte(Encoding_SciCP, 0, Settings2.AutoCompleteFillUpChars, -1, AutoCompleteFillUpChars, COUNTOF(AutoCompleteFillUpChars), NULL, NULL); + UnSlash(AutoCompleteFillUpChars, Encoding_SciCP); + + s_ACFillUpCharsHaveNewLn = false; + int i = 0; + while (AutoCompleteFillUpChars[i]) { + if ((AutoCompleteFillUpChars[i] == '\r') || (AutoCompleteFillUpChars[i] == '\n')) { + s_ACFillUpCharsHaveNewLn = true; + break; + } + ++i; + } + } + if (StrIsNotEmpty(Settings2.AutoCompleteWordCharSet)) { WideCharToMultiByte(Encoding_SciCP, 0, Settings2.AutoCompleteWordCharSet, -1, AutoCompleteWordCharSet, COUNTOF(AutoCompleteWordCharSet), NULL, NULL); @@ -741,8 +760,8 @@ bool EditCopyAppend(HWND hwnd, bool bAppend) HANDLE const hOld = GetClipboardData(CF_UNICODETEXT); const WCHAR* pszOld = GlobalLock(hOld); - int const _eol_mode = SciCall_GetEOLMode(); - const WCHAR *pszSep = ((_eol_mode == SC_EOL_CRLF) ? L"\r\n" : ((_eol_mode == SC_EOL_CR) ? L"\r" : L"\n")); + WCHAR pszSep[3] = { L'\0' }; + Sci_GetCurrentEOL_W(pszSep); size_t cchNewText = cchTextW; if (pszOld && *pszOld) { @@ -3903,14 +3922,8 @@ void EditWrapToColumn(HWND hwnd,DocPos nColumn/*,int nTabWidth*/) return; } - int cchEOL = 2; - WCHAR wszEOL[] = L"\r\n"; - int const cEOLMode = SciCall_GetEOLMode(); - if (cEOLMode == SC_EOL_CR) - cchEOL = 1; - else if (cEOLMode == SC_EOL_LF) { - cchEOL = 1; wszEOL[0] = L'\n'; - } + WCHAR wszEOL[3] = { L'\0' }; + int const cchEOL = Sci_GetCurrentEOL_W(wszEOL); int cchConvW = 0; DocPos iLineLength = 0; @@ -4065,23 +4078,8 @@ void EditJoinLinesEx(HWND hwnd, bool bPreserveParagraphs, bool bCRLF2Space) return; } - char szEOL[] = "\r\n"; - int cchEOL = 2; - switch (SciCall_GetEOLMode()) - { - case SC_EOL_LF: - szEOL[0] = '\n'; - szEOL[1] = '\0'; - cchEOL = 1; - break; - case SC_EOL_CR: - szEOL[1] = '\0'; - cchEOL = 1; - break; - case SC_EOL_CRLF: - default: - break; - } + char szEOL[3] = { '\0' }; + int const cchEOL = Sci_GetCurrentEOL_A(szEOL); for (int i = 0; i < iSelLength; ++i) { @@ -4208,15 +4206,8 @@ void EditSortLines(HWND hwnd, int iSortFlags) DocLn const iLineCount = iLineEnd - iLineStart + 1; - int const cEOLMode = SciCall_GetEOLMode(); - char mszEOL[] = "\r\n"; - if (cEOLMode == SC_EOL_CR) { - mszEOL[1] = '\0'; - } - else if (cEOLMode == SC_EOL_LF) { - mszEOL[0] = '\n'; - mszEOL[1] = '\0'; - } + char mszEOL[3] = { '\0' }; + Sci_GetCurrentEOL_A(mszEOL); int const _iTabWidth = SciCall_GetTabWidth(); @@ -6705,6 +6696,16 @@ void EditMarkAll(HWND hwnd, char* pszFind, int flags, DocPos rangeStart, DocPos } +//============================================================================= +// +// EditCheckNewLineInACFillUps() +// +bool EditCheckNewLineInACFillUps() +{ + return s_ACFillUpCharsHaveNewLn; +} + + //============================================================================= // // EditAutoCompleteWord() @@ -6901,9 +6902,8 @@ bool EditAutoCompleteWord(HWND hwnd, bool autoInsert) SciCall_AutoCSetIgnoreCase(true); //SendMessage(hwnd, SCI_AUTOCSETCASEINSENSITIVEBEHAVIOUR, (WPARAM)SC_CASEINSENSITIVEBEHAVIOUR_IGNORECASE, 0); SciCall_AutoCSetChooseSingle(autoInsert); - //SciCall_AutoCSetOrder(SC_ORDER_PERFORMSORT); // already sorted - SciCall_AutoCSetFillups("\t\n\r"); - //SciCall_AutoCSetFillups(Settings.AccelWordNavigation ? WhiteSpaceCharsDefault : WhiteSpaceCharsAccelerated); + //~SciCall_AutoCSetOrder(SC_ORDER_PERFORMSORT); // already sorted + SciCall_AutoCSetFillups(AutoCompleteFillUpChars); ++iWListSize; // zero termination char* const pList = AllocMem(iWListSize, HEAP_ZERO_MEMORY); diff --git a/src/Edit.h b/src/Edit.h index 0f198d778..c713db237 100644 --- a/src/Edit.h +++ b/src/Edit.h @@ -110,6 +110,7 @@ void EditFinalizeStyling(HWND hwnd, DocPos iEndPos); void EditUpdateIndicators(HWND hwnd, DocPos startPos, DocPos endPos, bool bClearOnly); void EditSetAccelWordNav(HWND hwnd,bool); bool EditAutoCompleteWord(HWND hwnd,bool); +bool EditCheckNewLineInACFillUps(); void EditShowZeroLengthCallTip(HWND hwnd, DocPos iPosition); void EditGetBookmarkList(HWND hwnd,LPWSTR pszBookMarks,int cchLength); void EditSetBookmarkList(HWND hwnd,LPCWSTR pszBookMarks); diff --git a/src/Helpers.h b/src/Helpers.h index eeced1a67..31d5f5b5d 100644 --- a/src/Helpers.h +++ b/src/Helpers.h @@ -347,6 +347,7 @@ bool MRU_MergeSave(LPMRULIST pmru,bool,bool,bool); #define MRU_Count(pmru) MRU_Enum((pmru), 0, NULL, 0) //==== UnSlash Functions ====================================================== +unsigned int UnSlash(char* s, UINT cpEdit); void TransformBackslashes(char* pszInput,bool,UINT cpEdit,int* iReplaceMsg); void TransformMetaChars(char* pszInput,bool,int iEOLMode); diff --git a/src/Notepad3.c b/src/Notepad3.c index 27e1767cc..1f5254f1f 100644 --- a/src/Notepad3.c +++ b/src/Notepad3.c @@ -3091,11 +3091,11 @@ LRESULT MsgInitMenu(HWND hwnd, WPARAM wParam, LPARAM lParam) } CheckMenuRadioItem(hmenu,IDM_ENCODING_ANSI,IDM_ENCODING_UTF8SIGN,i,MF_BYCOMMAND); - int const _eol_mode = SciCall_GetEOLMode(); - if (_eol_mode == SC_EOL_CRLF) { + int const eol_mode = SciCall_GetEOLMode(); + if (eol_mode == SC_EOL_CRLF) { i = IDM_LINEENDINGS_CRLF; } - else if (_eol_mode == SC_EOL_CR) { + else if (eol_mode == SC_EOL_CR) { i = IDM_LINEENDINGS_CR; } else { @@ -6787,8 +6787,8 @@ static void _HandleAutoIndent(int const charAdded) { // TODO: handle indent after '{' and un-indent on '}' in C/C++ ? // in CRLF mode handle LF only... - int const _eol_mode = SciCall_GetEOLMode(); - if (((SC_EOL_CRLF == _eol_mode) && (charAdded != '\r')) || (SC_EOL_CRLF != _eol_mode)) + int const eol_mode = SciCall_GetEOLMode(); + if (((SC_EOL_CRLF == eol_mode) && (charAdded != '\r')) || (SC_EOL_CRLF != eol_mode)) { DocPos const iCurPos = SciCall_GetCurrentPos(); DocLn const iCurLine = SciCall_LineFromPosition(iCurPos); @@ -7015,6 +7015,33 @@ static LRESULT _MsgNotifyFromEdit(HWND hwnd, const LPNMHDR pnmh, const SCNotific case SCN_CALLTIPCLICK: return 0; + case SCN_AUTOCSELECTION: + { + switch (scn->listCompletionMethod) + { + case SC_AC_TAB: + case SC_AC_COMMAND: + case SC_AC_DOUBLECLICK: + // accepted + break; + + case SC_AC_FILLUP: + // see: SciCall_AutoCSetFillups() -> accepted + break; + + case SC_AC_NEWLINE: + if (!EditCheckNewLineInACFillUps()) { + SciCall_AutoCCancel(); // rejected + PostMessage(Globals.hwndEdit, SCI_NEWLINE, 0, 0); + } + break; + + default: + SciCall_AutoCCancel(); // rejected + break; + } + } + break; case SCN_MODIFIED: { @@ -7394,10 +7421,10 @@ LRESULT MsgNotify(HWND hwnd, WPARAM wParam, LPARAM lParam) case STATUS_EOLMODE: { int i; - int const _eol_mode = SciCall_GetEOLMode(); - if (_eol_mode == SC_EOL_CRLF) + int const eol_mode = SciCall_GetEOLMode(); + if (eol_mode == SC_EOL_CRLF) i = IDM_LINEENDINGS_CRLF; - else if (_eol_mode == SC_EOL_CR) + else if (eol_mode == SC_EOL_CR) i = IDM_LINEENDINGS_CR; else i = IDM_LINEENDINGS_LF; @@ -8632,17 +8659,17 @@ static void _UpdateStatusbarDelayed(bool bForceRedraw) if (s_iStatusbarVisible[STATUS_EOLMODE]) { static int s_iEOLMode = -1; - int const _eol_mode = SciCall_GetEOLMode(); + int const eol_mode = SciCall_GetEOLMode(); - if (bForceRedraw || (s_iEOLMode != _eol_mode)) + if (bForceRedraw || (s_iEOLMode != eol_mode)) { static WCHAR tchEOL[16] = { L'\0' }; - if (_eol_mode == SC_EOL_LF) + if (eol_mode == SC_EOL_LF) { StringCchPrintf(tchStatusBar[STATUS_EOLMODE], txtWidth, (Globals.bDocHasInconsistentEOLs ? _LFi_f : _LF_f), s_mxSBPrefix[STATUS_EOLMODE], s_mxSBPostfix[STATUS_EOLMODE]); } - else if (_eol_mode == SC_EOL_CR) + else if (eol_mode == SC_EOL_CR) { StringCchPrintf(tchStatusBar[STATUS_EOLMODE], txtWidth, (Globals.bDocHasInconsistentEOLs ? _CRi_f : _CR_f), s_mxSBPrefix[STATUS_EOLMODE], s_mxSBPostfix[STATUS_EOLMODE]); @@ -8651,7 +8678,7 @@ static void _UpdateStatusbarDelayed(bool bForceRedraw) StringCchPrintf(tchStatusBar[STATUS_EOLMODE], txtWidth, (Globals.bDocHasInconsistentEOLs ? _CRLFi_f : _CRLF_f), s_mxSBPrefix[STATUS_EOLMODE], s_mxSBPostfix[STATUS_EOLMODE]); } - s_iEOLMode = _eol_mode; + s_iEOLMode = eol_mode; bIsUpdateNeeded = true; } } diff --git a/src/SciCall.h b/src/SciCall.h index 9684c9b30..a19bd58a6 100644 --- a/src/SciCall.h +++ b/src/SciCall.h @@ -539,8 +539,6 @@ DeclareSciCallR0(IsSelectionRectangle, SELECTIONISRECTANGLE, bool) #define Sci_HaveUndoRedoHistory() (SciCall_CanUndo() || SciCall_CanRedo()) -#define Sci_GetEOLLen() ((SciCall_GetEOLMode() == SC_EOL_CRLF) ? 2 : 1) - #define Sci_GetCurrentLineNumber() SciCall_LineFromPosition(SciCall_GetCurrentPos()) #define Sci_GetLastDocLineNumber() (SciCall_GetLineCount() - 1) @@ -569,6 +567,46 @@ inline DocPos Sci_GetRangeMaxLineLength(DocLn iBeginLine, DocLn iEndLine) { #define Sci_DisableMouseDWellNotification() SciCall_SetMouseDWellTime(SC_TIME_FOREVER) +// ---------------------------------------------------------------------------- + +#define Sci_GetEOLLen() ((SciCall_GetEOLMode() == SC_EOL_CRLF) ? 2 : 1) + + +inline int Sci_GetCurrentEOL_A(LPCH eol) { + switch (SciCall_GetEOLMode()) { + case SC_EOL_CRLF: + eol[0] = '\r'; eol[1] = '\n'; eol[2] = '\0'; + return 2; + case SC_EOL_CR: + eol[0] = '\r'; eol[1] = '\0'; + return 1; + case SC_EOL_LF: + eol[0] = '\n'; eol[1] = '\0'; + return 1; + default: + return 0; + } +} +// ---------------------------------------------------------------------------- + +inline int Sci_GetCurrentEOL_W(LPWCH eol) { + switch (SciCall_GetEOLMode()) { + case SC_EOL_CRLF: + eol[0] = L'\r'; eol[1] = L'\n'; eol[2] = L'\0'; + return 2; + case SC_EOL_CR: + eol[0] = L'\r'; eol[1] = L'\0'; + return 1; + case SC_EOL_LF: + eol[0] = L'\n'; eol[1] = L'\0'; + return 1; + default: + return 0; + } +} +// ---------------------------------------------------------------------------- + + //============================================================================= #endif //_NP3_SCICALL_H_ diff --git a/src/TypeDefs.h b/src/TypeDefs.h index 79989ee0b..727412935 100644 --- a/src/TypeDefs.h +++ b/src/TypeDefs.h @@ -502,6 +502,7 @@ typedef struct _settings2_t WCHAR FileBrowserPath[MAX_PATH]; WCHAR AppUserModelID[32]; + WCHAR AutoCompleteFillUpChars[64]; WCHAR ExtendedWhiteSpaceChars[ANSI_CHAR_BUFFER + 1]; WCHAR AutoCompleteWordCharSet[ANSI_CHAR_BUFFER + 1]; WCHAR TimeStamp[128]; diff --git a/src/Version.h b/src/Version.h index 34dc5092d..b0f3f6012 100644 --- a/src/Version.h +++ b/src/Version.h @@ -66,10 +66,16 @@ // Compiler specific #if defined(_MSC_VER) - #if (_MSC_VER >= 1920) - #if(_MSC_FULL_VER >= 192127702) + #if (_MSC_VER >= 1922) + #if(_MSC_FULL_VER >= 192227905) + #define VER_CPL MS Visual C++ 2019 v16.2.0 + #endif + #elif (_MSC_VER >= 1921) + #if(_MSC_FULL_VER >= 192127702) #define VER_CPL MS Visual C++ 2019 v16.1.(0-6) - #elif(_MSC_FULL_VER >= 192027508) + #endif + #elif (_MSC_VER >= 1920) + #if(_MSC_FULL_VER >= 192027508) #define VER_CPL MS Visual C++ 2019 v16.0.(0-4) #elif(_MSC_FULL_VER >= 192027027) #define VER_CPL MS Visual C++ 2019 v16.0.Prev(1-4) diff --git a/src/VersionEx.h b/src/VersionEx.h index 2d8b043f8..6a6f47e22 100644 --- a/src/VersionEx.h +++ b/src/VersionEx.h @@ -8,7 +8,7 @@ #define VERSION_MAJOR 5 #define VERSION_MINOR 19 #define VERSION_REV 725 -#define VERSION_BUILD 2405 +#define VERSION_BUILD 2406 #define SCINTILLA_VER 420 #define ONIGURUMA_REGEX_VER 6.9.3 #define VERSION_PATCH BETA