From 727b650de0d03e802cf24e7342ff3b172741cea8 Mon Sep 17 00:00:00 2001 From: Rainer Kottenhoff Date: Sat, 4 Nov 2017 13:13:43 +0100 Subject: [PATCH] + feature: auto remember bookmarks in recent file history --- src/Edit.c | 59 ++++++++++++++++++++++++++++++--- src/Edit.h | 4 ++- src/Helpers.c | 89 ++++++++++++++++++++++++++++++++------------------ src/Helpers.h | 6 ++-- src/Notepad3.c | 30 +++++++++++++---- src/Styles.c | 2 +- 6 files changed, 143 insertions(+), 47 deletions(-) diff --git a/src/Edit.c b/src/Edit.c index 7c86326ae..40de6fa30 100644 --- a/src/Edit.c +++ b/src/Edit.c @@ -4610,13 +4610,13 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA if (StringCchLenA(lpefr->szFind,COUNTOF(lpefr->szFind))) { if (GetDlgItemTextA2W(CP_UTF8,hwnd,IDC_FINDTEXT,lpefr->szFindUTF8,COUNTOF(lpefr->szFindUTF8))) { GetDlgItemText(hwnd,IDC_FINDTEXT,tch,COUNTOF(tch)); - MRU_Add(mruFind,tch,0,0); + MRU_Add(mruFind,tch,0,0,NULL); } } if (StringCchLenA(lpefr->szReplace,COUNTOF(lpefr->szReplace))) { if (GetDlgItemTextA2W(CP_UTF8,hwnd,IDC_REPLACETEXT,lpefr->szReplaceUTF8,COUNTOF(lpefr->szReplaceUTF8))) { GetDlgItemText(hwnd,IDC_REPLACETEXT,tch,COUNTOF(tch)); - MRU_Add(mruReplace,tch,0,0); + MRU_Add(mruReplace,tch,0,0,NULL); } } else @@ -5329,7 +5329,7 @@ void EditMarkAll(HWND hwnd, BOOL bMarkOccurrencesMatchCase, BOOL bMarkOccurrence //============================================================================= // -// CompleteWord() +// EditCompleteWord() // Auto-complete words (by Aleksandar Lekov) // struct WLIST { @@ -5337,7 +5337,7 @@ struct WLIST { struct WLIST* next; }; -void CompleteWord(HWND hwnd, BOOL autoInsert) { +void EditCompleteWord(HWND hwnd, BOOL autoInsert) { const char* NON_WORD = bAccelWordNavigation ? DelimCharsAccel : DelimChars; int iCurrentPos = (int)SendMessage(hwnd, SCI_GETCURRENTPOS, 0, 0); @@ -6235,7 +6235,6 @@ BOOL EditSortDlg(HWND hwnd,int *piSortFlags) } - //============================================================================= // // EditSortDlg() @@ -6254,6 +6253,56 @@ void EditSetAccelWordNav(HWND hwnd,BOOL bAccelWordNav) } +//============================================================================= +// +// EditGetBookmarkList() +// +void EditGetBookmarkList(HWND hwnd, LPWSTR pszBookMarks, int cchLength) +{ + WCHAR tchLine[32]; + StringCchCopyW(pszBookMarks, cchLength, L""); + int bitmask = (1 << MARKER_NP3_BOOKMARK); + int iLine = -1; + do { + iLine = (int)SendMessage(hwnd, SCI_MARKERNEXT, iLine + 1, bitmask); + if (iLine >= 0) { + StringCchPrintfW(tchLine, COUNTOF(tchLine), L"%i;", iLine); + StringCchCatW(pszBookMarks, cchLength, tchLine); + } + } while (iLine >= 0); + + StrTrimW(pszBookMarks, L";"); +} + + +//============================================================================= +// +// EditSetBookmarkList() +// +void EditSetBookmarkList(HWND hwnd, LPCWSTR pszBookMarks) +{ + WCHAR lnNum[32]; + const WCHAR* p1 = pszBookMarks; + if (!p1) return; + + int iLineMax = (int)SendMessage(hwnd, SCI_GETLINECOUNT, 0, 0) - 1; + + while (*p1) { + const WCHAR* p2 = StrChr(p1, L';'); + if (!p2) + p2 = StrEnd(p1); + StringCchCopyNW(lnNum, COUNTOF(lnNum), p1, min((int)(p2 - p1), 16)); + int iLine = 0; + if (swscanf_s(lnNum, L"%i", &iLine) == 1) { + if (iLine <= iLineMax) { + SendMessage(hwnd, SCI_MARKERADD, iLine, MARKER_NP3_BOOKMARK); + } + } + p1 = (*p2) ? (p2 + 1) : p2; + } +} + + //============================================================================= // // FileVars_Init() diff --git a/src/Edit.h b/src/Edit.h index 2b4677981..cdd06718c 100644 --- a/src/Edit.h +++ b/src/Edit.h @@ -118,7 +118,9 @@ void EditPrintInit(); void EditMatchBrace(HWND); void EditMarkAll(HWND,BOOL,BOOL); void EditSetAccelWordNav(HWND,BOOL); -void CompleteWord(HWND,BOOL); +void EditCompleteWord(HWND,BOOL); +void EditGetBookmarkList(HWND,LPWSTR,int); +void EditSetBookmarkList(HWND,LPCWSTR); //void SciInitThemes(HWND); diff --git a/src/Helpers.c b/src/Helpers.c index 2c4cd6247..7f8313b93 100644 --- a/src/Helpers.c +++ b/src/Helpers.c @@ -1793,7 +1793,9 @@ BOOL MRU_Destroy(LPMRULIST pmru) for (i = 0; i < pmru->iSize; i++) { if (pmru->pszItems[i]) LocalFree(pmru->pszItems[i]); - } + if (pmru->pszBookMarks[i]) + LocalFree(pmru->pszBookMarks[i]); + } ZeroMemory(pmru,sizeof(MRULIST)); LocalFree(pmru); return TRUE; @@ -1807,7 +1809,7 @@ int MRU_Compare(LPMRULIST pmru,LPCWSTR psz1,LPCWSTR psz2) return(StringCchCompareX(psz1,psz2)); } -BOOL MRU_Add(LPMRULIST pmru,LPCWSTR pszNew, int iEnc, int iPos) +BOOL MRU_Add(LPMRULIST pmru,LPCWSTR pszNew, int iEnc, int iPos, LPCWSTR pszBookMarks) { int i; for (i = 0; i < pmru->iSize; i++) { @@ -1821,12 +1823,18 @@ BOOL MRU_Add(LPMRULIST pmru,LPCWSTR pszNew, int iEnc, int iPos) pmru->pszItems[i] = pmru->pszItems[i - 1]; pmru->iEncoding[i] = pmru->iEncoding[i - 1]; pmru->iCaretPos[i] = pmru->iCaretPos[i - 1]; + pmru->pszBookMarks[i] = pmru->pszBookMarks[i - 1]; } pmru->pszItems[0] = StrDup(pszNew); pmru->iEncoding[0] = iEnc; pmru->iCaretPos[0] = (bPreserveCaretPos) ? iPos : 0; + if (pszBookMarks) + pmru->pszBookMarks[0] = StrDup(pszBookMarks); + else + pmru->pszBookMarks[0] = NULL; + return TRUE; } @@ -1854,7 +1862,7 @@ BOOL MRU_FindFile(LPMRULIST pmru,LPCWSTR pszFile,int* iIndex) { return FALSE; } -BOOL MRU_AddFile(LPMRULIST pmru,LPCWSTR pszFile,BOOL bRelativePath,BOOL bUnexpandMyDocs,int iEnc,int iPos) { +BOOL MRU_AddFile(LPMRULIST pmru,LPCWSTR pszFile,BOOL bRelativePath,BOOL bUnexpandMyDocs,int iEnc,int iPos, LPCWSTR pszBookMarks) { int i; if (MRU_FindFile(pmru,pszFile,&i)) { @@ -1864,9 +1872,10 @@ BOOL MRU_AddFile(LPMRULIST pmru,LPCWSTR pszFile,BOOL bRelativePath,BOOL bUnexpan i = (i < pmru->iSize) ? i : (pmru->iSize - 1); } for (; i > 0; i--) { - pmru->pszItems[i] = pmru->pszItems[i - 1]; - pmru->iEncoding[i] = pmru->iEncoding[i - 1]; - pmru->iCaretPos[i] = pmru->iCaretPos[i - 1]; + pmru->pszItems[i] = pmru->pszItems[i-1]; + pmru->iEncoding[i] = pmru->iEncoding[i-1]; + pmru->iCaretPos[i] = pmru->iCaretPos[i-1]; + pmru->pszBookMarks[i] = pmru->pszBookMarks[i-1]; } if (bRelativePath) { WCHAR wchFile[MAX_PATH] = { L'\0' }; @@ -1879,6 +1888,11 @@ BOOL MRU_AddFile(LPMRULIST pmru,LPCWSTR pszFile,BOOL bRelativePath,BOOL bUnexpan pmru->iEncoding[0] = iEnc; pmru->iCaretPos[0] = (bPreserveCaretPos) ? iPos : 0; + if (pszBookMarks) + pmru->pszBookMarks[0] = StrDup(pszBookMarks); + else + pmru->pszBookMarks[0] = StrDup(L""); + return TRUE; } @@ -1891,14 +1905,19 @@ BOOL MRU_Delete(LPMRULIST pmru,int iIndex) { if (pmru->pszItems[iIndex]) { LocalFree(pmru->pszItems[iIndex]); } + if (pmru->pszBookMarks[iIndex]) { + LocalFree(pmru->pszBookMarks[iIndex]); + } for (i = iIndex; i < pmru->iSize-1; i++) { - pmru->pszItems[i] = pmru->pszItems[i + 1]; - pmru->iEncoding[i] = pmru->iEncoding[i + 1]; - pmru->iCaretPos[i] = pmru->iCaretPos[i + 1]; + pmru->pszItems[i] = pmru->pszItems[i+1]; + pmru->iEncoding[i] = pmru->iEncoding[i+1]; + pmru->iCaretPos[i] = pmru->iCaretPos[i+1]; + pmru->pszBookMarks[i] = pmru->pszBookMarks[i+1]; pmru->pszItems[i+1] = NULL; pmru->iEncoding[i+1] = 0; pmru->iCaretPos[i+1] = 0; + pmru->pszBookMarks[i+1] = NULL; } return TRUE; } @@ -1920,28 +1939,29 @@ BOOL MRU_DeleteFileFromStore(LPMRULIST pmru,LPCWSTR pszFile) { else i++; } - MRU_Save(pmruStore); MRU_Destroy(pmruStore); return TRUE; } -BOOL MRU_Empty(LPMRULIST pmru) { - - int i; - for (i = 0; i < pmru->iSize; i++) { +BOOL MRU_Empty(LPMRULIST pmru) +{ + for (int i = 0; i < pmru->iSize; i++) { if (pmru->pszItems[i]) { LocalFree(pmru->pszItems[i]); pmru->pszItems[i] = NULL; pmru->iEncoding[i] = 0; pmru->iCaretPos[i] = 0; + if (pmru->pszBookMarks[i]) + LocalFree(pmru->pszBookMarks[i]); + pmru->pszBookMarks[i] = NULL; } } return TRUE; } -int MRU_Enum(LPMRULIST pmru,int iIndex,LPWSTR pszItem,int cchItem) { - +int MRU_Enum(LPMRULIST pmru,int iIndex,LPWSTR pszItem,int cchItem) +{ if (pszItem == NULL || cchItem == 0) { int i = 0; while (i < pmru->iSize && pmru->pszItems[i]) @@ -1958,10 +1978,11 @@ int MRU_Enum(LPMRULIST pmru,int iIndex,LPWSTR pszItem,int cchItem) { } } -BOOL MRU_Load(LPMRULIST pmru) { - +BOOL MRU_Load(LPMRULIST pmru) +{ WCHAR tchName[32] = { L'\0' }; WCHAR tchItem[1024] = { L'\0' }; + WCHAR wchBookMarks[MRU_BMRK_SIZE] = { L'\0' }; WCHAR *pIniSection = LocalAlloc(LPTR,sizeof(WCHAR)*32*1024); MRU_Empty(pmru); @@ -1985,6 +2006,9 @@ BOOL MRU_Load(LPMRULIST pmru) { pmru->iEncoding[n] = Encoding_MapIniSetting(TRUE,iCP); StringCchPrintf(tchName,COUNTOF(tchName),L"POS%.2i",i + 1); pmru->iCaretPos[n] = (bPreserveCaretPos) ? IniSectionGetInt(pIniSection,tchName,0) : 0; + StringCchPrintf(tchName, COUNTOF(tchName), L"BMRK%.2i", i + 1); + IniSectionGetString(pIniSection, tchName, L"", wchBookMarks, COUNTOF(wchBookMarks)); + pmru->pszBookMarks[n] = StrDup(wchBookMarks); ++n; } } @@ -2011,17 +2035,21 @@ BOOL MRU_Save(LPMRULIST pmru) { IniSectionSetString(pIniSection,tchName,tchItem); } else*/ - IniSectionSetString(pIniSection,tchName,pmru->pszItems[i]); + IniSectionSetString(pIniSection,tchName,pmru->pszItems[i]); - if (pmru->iEncoding[i] > 0) { - StringCchPrintf(tchName,COUNTOF(tchName),L"ENC%.2i",i + 1); - int iCP = Encoding_MapIniSetting(FALSE,pmru->iEncoding[i]); - IniSectionSetInt(pIniSection,tchName,iCP); - } - if (pmru->iCaretPos[i] > 0) { - StringCchPrintf(tchName,COUNTOF(tchName),L"POS%.2i",i + 1); - IniSectionSetInt(pIniSection,tchName,pmru->iCaretPos[i]); - } + if (pmru->iEncoding[i] > 0) { + StringCchPrintf(tchName,COUNTOF(tchName),L"ENC%.2i",i + 1); + int iCP = Encoding_MapIniSetting(FALSE,pmru->iEncoding[i]); + IniSectionSetInt(pIniSection,tchName,iCP); + } + if (pmru->iCaretPos[i] > 0) { + StringCchPrintf(tchName,COUNTOF(tchName),L"POS%.2i",i + 1); + IniSectionSetInt(pIniSection,tchName,pmru->iCaretPos[i]); + } + if (pmru->pszBookMarks[i] && (StringCchLenW(pmru->pszBookMarks[i], MRU_BMRK_SIZE) > 0)) { + StringCchPrintf(tchName, COUNTOF(tchName), L"BMRK%.2i", i + 1); + IniSectionSetString(pIniSection, tchName, pmru->pszBookMarks[i]); + } } } SaveIniSection(pmru->szRegKey,pIniSection); @@ -2043,15 +2071,14 @@ BOOL MRU_MergeSave(LPMRULIST pmru,BOOL bAddFiles,BOOL bRelativePath,BOOL bUnexpa if (pmru->pszItems[i]) { WCHAR wchItem[MAX_PATH] = { L'\0' }; PathAbsoluteFromApp(pmru->pszItems[i],wchItem,COUNTOF(wchItem),TRUE); - MRU_AddFile(pmruBase,wchItem,bRelativePath,bUnexpandMyDocs,pmru->iEncoding[i],pmru->iCaretPos[i]); + MRU_AddFile(pmruBase,wchItem,bRelativePath,bUnexpandMyDocs,pmru->iEncoding[i],pmru->iCaretPos[i],pmru->pszBookMarks[i]); } } } - else { for (i = pmru->iSize-1; i >= 0; i--) { if (pmru->pszItems[i]) - MRU_Add(pmruBase,pmru->pszItems[i],pmru->iEncoding[i],pmru->iCaretPos[i]); + MRU_Add(pmruBase,pmru->pszItems[i],pmru->iEncoding[i],pmru->iCaretPos[i],pmru->pszBookMarks[i]); } } diff --git a/src/Helpers.h b/src/Helpers.h index 5f92b5911..996a57957 100644 --- a/src/Helpers.h +++ b/src/Helpers.h @@ -215,6 +215,7 @@ UINT CharSetFromCodePage(UINT); #define MRU_MAXITEMS 24 #define MRU_NOCASE 1 #define MRU_UTF8 2 +#define MRU_BMRK_SIZE 1024 typedef struct _mrulist { @@ -224,14 +225,15 @@ typedef struct _mrulist { LPWSTR pszItems[MRU_MAXITEMS]; int iEncoding[MRU_MAXITEMS]; int iCaretPos[MRU_MAXITEMS]; + LPWSTR pszBookMarks[MRU_MAXITEMS]; } MRULIST, *PMRULIST, *LPMRULIST; LPMRULIST MRU_Create(LPCWSTR,int,int); BOOL MRU_Destroy(LPMRULIST); -BOOL MRU_Add(LPMRULIST,LPCWSTR,int,int); +BOOL MRU_Add(LPMRULIST,LPCWSTR,int,int,LPCWSTR); BOOL MRU_FindFile(LPMRULIST,LPCWSTR,int*); -BOOL MRU_AddFile(LPMRULIST,LPCWSTR,BOOL,BOOL,int,int); +BOOL MRU_AddFile(LPMRULIST,LPCWSTR,BOOL,BOOL,int,int,LPCWSTR); BOOL MRU_Delete(LPMRULIST,int); BOOL MRU_DeleteFileFromStore(LPMRULIST,LPCWSTR); BOOL MRU_Empty(LPMRULIST); diff --git a/src/Notepad3.c b/src/Notepad3.c index c4a739495..8c09d04a3 100644 --- a/src/Notepad3.c +++ b/src/Notepad3.c @@ -3800,7 +3800,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) int iPos = (int)SendMessage( hwndEdit , SCI_GETCURRENTPOS , 0 , 0); int iLine = (int)SendMessage( hwndEdit , SCI_LINEFROMPOSITION , iPos , 0 ); - int bitmask = 1; + int bitmask = (1 << MARKER_NP3_BOOKMARK); int iNextLine = (int)SendMessage( hwndEdit , SCI_MARKERNEXT , iLine+1 , bitmask ); if( iNextLine == -1 ) { @@ -3849,7 +3849,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) int iLine = (int)SendMessage(hwndEdit, SCI_LINEFROMPOSITION, iPos, 0); int bitmask = (int)SendMessage(hwndEdit, SCI_MARKERGET, iLine, MARKER_NP3_BOOKMARK); - if (bitmask & 1) { + if (bitmask & (1 << MARKER_NP3_BOOKMARK)) { // unset SendMessage(hwndEdit, SCI_MARKERDELETE, iLine, MARKER_NP3_BOOKMARK); } @@ -3933,7 +3933,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) break; case IDM_EDIT_COMPLETEWORD: - CompleteWord(hwndEdit, TRUE); + EditCompleteWord(hwndEdit, TRUE); break; @@ -5322,7 +5322,7 @@ LRESULT MsgNotify(HWND hwnd,WPARAM wParam,LPARAM lParam) if( iPrevLineLength == 0 ) { int bitmask = (int)SendMessage( hwndEdit , SCI_MARKERGET , iCurLine-1 , 0 ); - if( bitmask & 1 ) + if( bitmask & (1 << MARKER_NP3_BOOKMARK)) { SendMessage( hwndEdit , SCI_MARKERDELETE , iCurLine-1 , MARKER_NP3_BOOKMARK); SendMessage( hwndEdit , SCI_MARKERADD , iCurLine , MARKER_NP3_BOOKMARK); @@ -5434,7 +5434,7 @@ LRESULT MsgNotify(HWND hwnd,WPARAM wParam,LPARAM lParam) } } else if (bAutoCompleteWords && !SendMessage(hwndEdit, SCI_AUTOCACTIVE, 0, 0)) - CompleteWord(hwndEdit, FALSE); + EditCompleteWord(hwndEdit, FALSE); break; case SCN_MODIFIED: @@ -7180,6 +7180,11 @@ BOOL FileIO(BOOL fLoad,LPCWSTR pszFileName,BOOL bNoEncDetect,int *ienc,int *ieol if (MRU_FindFile(pFileMRU,pszFileName,&idx)) { pFileMRU->iEncoding[idx] = *ienc; pFileMRU->iCaretPos[idx] = (bPreserveCaretPos) ? (int)SendMessage(hwndEdit,SCI_GETCURRENTPOS,0,0) : 0; + WCHAR wchBookMarks[MRU_BMRK_SIZE] = { L'\0' }; + EditGetBookmarkList(hwndEdit, wchBookMarks, COUNTOF(wchBookMarks)); + if (pFileMRU->pszBookMarks[idx]) + LocalFree(pFileMRU->pszBookMarks[idx]); + pFileMRU->pszBookMarks[idx] = StrDup(wchBookMarks); } fSuccess = EditSaveFile(hwndEdit,pszFileName,*ienc,pbCancelDataLoss,bSaveCopy); } @@ -7346,11 +7351,15 @@ BOOL FileLoad(BOOL bDontSave,BOOL bNew,BOOL bReload,BOOL bNoEncDetect,LPCWSTR lp fileEncoding = Encoding_Current(CPI_GET); Encoding_HasChanged(fileEncoding); int idx, iCaretPos = 0; + LPCWSTR pszBookMarks = L""; if (!bReload && MRU_FindFile(pFileMRU,szFileName,&idx)) { iCaretPos = pFileMRU->iCaretPos[idx]; + pszBookMarks = pFileMRU->pszBookMarks[idx]; } - MRU_AddFile(pFileMRU,szFileName,flagRelativeFileMRU,flagPortableMyDocs,fileEncoding,iCaretPos); + MRU_AddFile(pFileMRU,szFileName,flagRelativeFileMRU,flagPortableMyDocs,fileEncoding,iCaretPos,pszBookMarks); + EditSetBookmarkList(hwndEdit, pszBookMarks); + if (flagUseSystemMRU == 2) SHAddToRecentDocs(SHARD_PATHW,szFileName); @@ -7483,6 +7492,11 @@ BOOL FileSave(BOOL bSaveAlways,BOOL bAsk,BOOL bSaveAs,BOOL bSaveCopy) if (MRU_FindFile(pFileMRU,szCurFile,&idx)) { pFileMRU->iEncoding[idx] = Encoding_Current(CPI_GET); pFileMRU->iCaretPos[idx] = (bPreserveCaretPos) ? (int)SendMessage(hwndEdit,SCI_GETCURRENTPOS,0,0) : 0; + WCHAR wchBookMarks[MRU_BMRK_SIZE] = { L'\0' }; + EditGetBookmarkList(hwndEdit, wchBookMarks, COUNTOF(wchBookMarks)); + if (pFileMRU->pszBookMarks[idx]) + LocalFree(pFileMRU->pszBookMarks[idx]); + pFileMRU->pszBookMarks[idx] = StrDup(wchBookMarks); } return TRUE; } @@ -7572,7 +7586,9 @@ BOOL FileSave(BOOL bSaveAlways,BOOL bAsk,BOOL bSaveAs,BOOL bSaveCopy) int iCurrEnc = Encoding_Current(CPI_GET); Encoding_HasChanged(iCurrEnc); int iCaretPos = (int)SendMessage(hwndEdit, SCI_GETCURRENTPOS, 0, 0); - MRU_AddFile(pFileMRU,szCurFile,flagRelativeFileMRU,flagPortableMyDocs,iCurrEnc,iCaretPos); + WCHAR wchBookMarks[MRU_BMRK_SIZE] = { L'\0' }; + EditGetBookmarkList(hwndEdit, wchBookMarks, COUNTOF(wchBookMarks)); + MRU_AddFile(pFileMRU,szCurFile,flagRelativeFileMRU,flagPortableMyDocs,iCurrEnc,iCaretPos,wchBookMarks); if (flagUseSystemMRU == 2) SHAddToRecentDocs(SHARD_PATHW,szCurFile); UpdateToolbar(); diff --git a/src/Styles.c b/src/Styles.c index d72b3d102..c2b5c2b34 100644 --- a/src/Styles.c +++ b/src/Styles.c @@ -4193,7 +4193,7 @@ BOOL Style_StrGetAlpha(LPCWSTR lpszStyle, int *i) { *i = min(max(SC_ALPHA_TRANSPARENT, iValue), SC_ALPHA_OPAQUE); return TRUE; } - } + } return FALSE; }