From 53f092a570783fef8288a135cf57752b6b391bf3 Mon Sep 17 00:00:00 2001 From: Rainer Kottenhoff Date: Sun, 15 Oct 2017 13:45:32 +0200 Subject: [PATCH] + prepare file history extension (caret position and encoding settings) --- src/Edit.c | 4 +- src/Helpers.c | 140 +++++++++++++++++++++++++++++++++++------------- src/Helpers.h | 14 +++-- src/Notepad3.c | 14 +++-- src/Notepad3.rc | Bin 181900 -> 181908 bytes 5 files changed, 125 insertions(+), 47 deletions(-) diff --git a/src/Edit.c b/src/Edit.c index 7ed12b736..a0822d874 100644 --- a/src/Edit.c +++ b/src/Edit.c @@ -5460,13 +5460,13 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA if (StringCchLenA(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); + MRU_Add(mruFind,tch,0,0); } } if (StringCchLenA(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); + MRU_Add(mruReplace,tch,0,0); } } else diff --git a/src/Helpers.c b/src/Helpers.c index d968c5aaf..fb207d2f8 100644 --- a/src/Helpers.c +++ b/src/Helpers.c @@ -1733,7 +1733,7 @@ BOOL MRU_Destroy(LPMRULIST pmru) } ZeroMemory(pmru,sizeof(MRULIST)); LocalFree(pmru); - return(1); + return TRUE; } int MRU_Compare(LPMRULIST pmru,LPCWSTR psz1,LPCWSTR psz2) @@ -1744,7 +1744,7 @@ int MRU_Compare(LPMRULIST pmru,LPCWSTR psz1,LPCWSTR psz2) return(StringCchCompareX(psz1,psz2)); } -BOOL MRU_Add(LPMRULIST pmru,LPCWSTR pszNew) +BOOL MRU_Add(LPMRULIST pmru,LPCWSTR pszNew, int iEnc, int iPos) { int i; for (i = 0; i < pmru->iSize; i++) { @@ -1754,71 +1754,101 @@ BOOL MRU_Add(LPMRULIST pmru,LPCWSTR pszNew) } } i = min(i,pmru->iSize-1); - for (; i > 0; i--) - pmru->pszItems[i] = pmru->pszItems[i-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[0] = StrDup(pszNew); - return(1); + + pmru->iEncoding[0] = iEnc; + pmru->iCaretPos[0] = iPos; + + return TRUE; } -BOOL MRU_AddFile(LPMRULIST pmru,LPCWSTR pszFile,BOOL bRelativePath,BOOL bUnexpandMyDocs) { - +BOOL MRU_FindFile(LPMRULIST pmru,LPCWSTR pszFile,int* iIndex) { + WCHAR wchItem[MAX_PATH] = { L'\0' }; int i; for (i = 0; i < pmru->iSize; i++) { if (pmru->pszItems[i] == NULL) { - break; + *iIndex = i; + return FALSE; } else if (StringCchCompareIX(pmru->pszItems[i],pszFile) == 0) { - LocalFree(pmru->pszItems[i]); - break; + *iIndex = i; + return TRUE; } else { - WCHAR wchItem[MAX_PATH] = { L'\0' }; PathAbsoluteFromApp(pmru->pszItems[i],wchItem,COUNTOF(wchItem),TRUE); if (StringCchCompareIN(wchItem,COUNTOF(wchItem),pszFile,-1) == 0) { - LocalFree(pmru->pszItems[i]); - break; + *iIndex = i; + return TRUE; } } } - i = min(i,pmru->iSize-1); - for (; i > 0; i--) - pmru->pszItems[i] = pmru->pszItems[i-1]; + *iIndex = i; + return FALSE; +} +BOOL MRU_AddFile(LPMRULIST pmru,LPCWSTR pszFile,BOOL bRelativePath,BOOL bUnexpandMyDocs,int iEnc,int iPos) { + + int i; + if (MRU_FindFile(pmru,pszFile,&i)) { + LocalFree(pmru->pszItems[i]); + } + else { + 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]; + } if (bRelativePath) { WCHAR wchFile[MAX_PATH] = { L'\0' }; PathRelativeToApp((LPWSTR)pszFile,wchFile,COUNTOF(wchFile),TRUE,TRUE,bUnexpandMyDocs); pmru->pszItems[0] = StrDup(wchFile); } - else + else { pmru->pszItems[0] = StrDup(pszFile); + } + pmru->iEncoding[0] = iEnc; + pmru->iCaretPos[0] = iPos; - return(1); + return TRUE; } BOOL MRU_Delete(LPMRULIST pmru,int iIndex) { int i; - if (iIndex < 0 || iIndex > pmru->iSize-1) - return(0); - if (pmru->pszItems[iIndex]) + if (iIndex < 0 || iIndex > pmru->iSize - 1) { + return FALSE; + } + if (pmru->pszItems[iIndex]) { LocalFree(pmru->pszItems[iIndex]); + } for (i = iIndex; i < pmru->iSize-1; i++) { - pmru->pszItems[i] = pmru->pszItems[i+1]; + pmru->pszItems[i] = pmru->pszItems[i + 1]; + pmru->iEncoding[i] = pmru->iEncoding[i + 1]; + pmru->iCaretPos[i] = pmru->iCaretPos[i + 1]; + pmru->pszItems[i+1] = NULL; } - return(1); + return TRUE; } BOOL MRU_DeleteFileFromStore(LPMRULIST pmru,LPCWSTR pszFile) { int i = 0; LPMRULIST pmruStore; - WCHAR wchItem[256] = { L'\0' }; + WCHAR wchItem[MAX_PATH] = { L'\0' }; pmruStore = MRU_Create(pmru->szRegKey,pmru->iFlags,pmru->iSize); MRU_Load(pmruStore); - while (MRU_Enum(pmruStore,i,wchItem,COUNTOF(wchItem)) != -1) { + while (MRU_Enum(pmruStore,i,wchItem,COUNTOF(wchItem)) != -1) + { PathAbsoluteFromApp(wchItem,wchItem,COUNTOF(wchItem),TRUE); if (StringCchCompareIN(wchItem,COUNTOF(wchItem),pszFile,-1) == 0) MRU_Delete(pmruStore,i); @@ -1828,7 +1858,7 @@ BOOL MRU_DeleteFileFromStore(LPMRULIST pmru,LPCWSTR pszFile) { MRU_Save(pmruStore); MRU_Destroy(pmruStore); - return(1); + return TRUE; } BOOL MRU_Empty(LPMRULIST pmru) { @@ -1838,9 +1868,11 @@ BOOL MRU_Empty(LPMRULIST pmru) { if (pmru->pszItems[i]) { LocalFree(pmru->pszItems[i]); pmru->pszItems[i] = NULL; + pmru->iEncoding[i] = 0; + pmru->iCaretPos[i] = 0; } } - return(1); + return TRUE; } int MRU_Enum(LPMRULIST pmru,int iIndex,LPWSTR pszItem,int cchItem) { @@ -1863,7 +1895,6 @@ int MRU_Enum(LPMRULIST pmru,int iIndex,LPWSTR pszItem,int cchItem) { BOOL MRU_Load(LPMRULIST pmru) { - int i,n = 0; WCHAR tchName[32] = { L'\0' }; WCHAR tchItem[1024] = { L'\0' }; WCHAR *pIniSection = LocalAlloc(LPTR,sizeof(WCHAR)*32*1024); @@ -1871,21 +1902,28 @@ BOOL MRU_Load(LPMRULIST pmru) { MRU_Empty(pmru); LoadIniSection(pmru->szRegKey,pIniSection,(int)LocalSize(pIniSection)/sizeof(WCHAR)); - for (i = 0; i < pmru->iSize; i++) { + int n = 0; + for (int i = 0; i < pmru->iSize; i++) { StringCchPrintf(tchName,COUNTOF(tchName),L"%.2i",i+1); if (IniSectionGetString(pIniSection,tchName,L"",tchItem,COUNTOF(tchItem))) { /*if (pmru->iFlags & MRU_UTF8) { WCHAR wchItem[1024]; int cbw = MultiByteToWideCharStrg(CP_UTF7,tchItem,wchItem); WideCharToMultiByte(CP_UTF8,0,wchItem,cbw,tchItem,COUNTOF(tchItem),NULL,NULL); - pmru->pszItems[n++] = StrDup(tchItem); + pmru->pszItems[n] = StrDup(tchItem); } else*/ - pmru->pszItems[n++] = StrDup(tchItem); + pmru->pszItems[n] = StrDup(tchItem); + + StringCchPrintf(tchName,COUNTOF(tchName),L"ENC%.2i",i + 1); + pmru->iEncoding[n] = IniSectionGetInt(pIniSection,tchName,0); + StringCchPrintf(tchName,COUNTOF(tchName),L"POS%.2i",i + 1); + pmru->iCaretPos[n] = IniSectionGetInt(pIniSection,tchName,0); + ++n; } } LocalFree(pIniSection); - return(1); + return TRUE; } BOOL MRU_Save(LPMRULIST pmru) { @@ -1898,7 +1936,7 @@ BOOL MRU_Save(LPMRULIST pmru) { for (i = 0; i < pmru->iSize; i++) { if (pmru->pszItems[i]) { - StringCchPrintf(tchName,COUNTOF(tchName),L"%.2i",i+1); + StringCchPrintf(tchName,COUNTOF(tchName),L"%.2i",i + 1); /*if (pmru->iFlags & MRU_UTF8) { WCHAR tchItem[1024]; WCHAR wchItem[1024]; @@ -1908,11 +1946,20 @@ BOOL MRU_Save(LPMRULIST pmru) { } else*/ IniSectionSetString(pIniSection,tchName,pmru->pszItems[i]); + + if (pmru->iEncoding[i] > 0) { + StringCchPrintf(tchName,COUNTOF(tchName),L"ENC%.2i",i + 1); + IniSectionSetInt(pIniSection,tchName,pmru->iEncoding[i]); + } + if (pmru->iCaretPos[i] > 0) { + StringCchPrintf(tchName,COUNTOF(tchName),L"POS%.2i",i + 1); + IniSectionSetInt(pIniSection,tchName,pmru->iCaretPos[i]); + } } } SaveIniSection(pmru->szRegKey,pIniSection); LocalFree(pIniSection); - return(1); + return TRUE; } @@ -1929,7 +1976,7 @@ 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); + MRU_AddFile(pmruBase,wchItem,bRelativePath,bUnexpandMyDocs,pmru->iEncoding[i],pmru->iCaretPos[i]); } } } @@ -1937,16 +1984,35 @@ BOOL MRU_MergeSave(LPMRULIST pmru,BOOL bAddFiles,BOOL bRelativePath,BOOL bUnexpa else { for (i = pmru->iSize-1; i >= 0; i--) { if (pmru->pszItems[i]) - MRU_Add(pmruBase,pmru->pszItems[i]); + MRU_Add(pmruBase,pmru->pszItems[i],pmru->iEncoding[i],pmru->iCaretPos[i]); } } MRU_Save(pmruBase); MRU_Destroy(pmruBase); - return(1); + return TRUE; } +BOOL MRU_SetEnc(LPMRULIST pmru,int iIndex,int iEnc) { + + if (iIndex < 0 || iIndex > pmru->iSize - 1) + return FALSE; + + pmru->iEncoding[iIndex] = iEnc; + return TRUE; +} + + +BOOL MRU_SetPos(LPMRULIST pmru,int iIndex,int iPos) { + + if (iIndex < 0 || iIndex > pmru->iSize - 1) + return FALSE; + + pmru->iCaretPos[iIndex] = iPos; + return TRUE; +} + /* Themed Dialogs diff --git a/src/Helpers.h b/src/Helpers.h index 1f503e30e..95845b9dd 100644 --- a/src/Helpers.h +++ b/src/Helpers.h @@ -205,16 +205,19 @@ UINT CharSetFromCodePage(UINT); typedef struct _mrulist { WCHAR szRegKey[256]; - int iFlags; - int iSize; + int iFlags; + int iSize; LPWSTR pszItems[MRU_MAXITEMS]; + int iEncoding[MRU_MAXITEMS]; + int iCaretPos[MRU_MAXITEMS]; } MRULIST, *PMRULIST, *LPMRULIST; LPMRULIST MRU_Create(LPCWSTR,int,int); BOOL MRU_Destroy(LPMRULIST); -BOOL MRU_Add(LPMRULIST,LPCWSTR); -BOOL MRU_AddFile(LPMRULIST,LPCWSTR,BOOL,BOOL); +BOOL MRU_Add(LPMRULIST,LPCWSTR,int,int); +BOOL MRU_FindFile(LPMRULIST,LPCWSTR,int*); +BOOL MRU_AddFile(LPMRULIST,LPCWSTR,BOOL,BOOL,int,int); BOOL MRU_Delete(LPMRULIST,int); BOOL MRU_DeleteFileFromStore(LPMRULIST,LPCWSTR); BOOL MRU_Empty(LPMRULIST); @@ -222,6 +225,9 @@ int MRU_Enum(LPMRULIST,int,LPWSTR,int); BOOL MRU_Load(LPMRULIST); BOOL MRU_Save(LPMRULIST); BOOL MRU_MergeSave(LPMRULIST,BOOL,BOOL,BOOL); +BOOL MRU_SetEnc(LPMRULIST,int,int); +BOOL MRU_SetPos(LPMRULIST,int,int); + //==== Themed Dialogs ========================================================= diff --git a/src/Notepad3.c b/src/Notepad3.c index 082d0b5a9..005675d2a 100644 --- a/src/Notepad3.c +++ b/src/Notepad3.c @@ -7605,7 +7605,7 @@ BOOL FileLoad(BOOL bDontSave,BOOL bNew,BOOL bReload,BOOL bNoEncDetect,LPCWSTR lp bModified = FALSE; //bReadOnly = FALSE; SendMessage(hwndEdit,SCI_SETEOLMODE,iEOLMode,0); - MRU_AddFile(pFileMRU,szFileName,flagRelativeFileMRU,flagPortableMyDocs); + MRU_AddFile(pFileMRU,szFileName,flagRelativeFileMRU,flagPortableMyDocs,0,0); if (flagUseSystemMRU == 2) SHAddToRecentDocs(SHARD_PATHW,szFileName); @@ -7761,8 +7761,10 @@ BOOL FileSave(BOOL bSaveAlways,BOOL bAsk,BOOL bSaveAs,BOOL bSaveCopy) if (!bSaveCopy) { bModified = FALSE; - Encoding_HasChanged(Encoding_Current(CPI_GET)); - MRU_AddFile(pFileMRU,szCurFile,flagRelativeFileMRU,flagPortableMyDocs); + int iCurrEnc = Encoding_Current(CPI_GET); + Encoding_HasChanged(iCurrEnc); + int mpEnc = Encoding_MapIniSetting(FALSE,iCurrEnc); + MRU_AddFile(pFileMRU,szCurFile,flagRelativeFileMRU,flagPortableMyDocs,mpEnc,0); if (flagUseSystemMRU == 2) SHAddToRecentDocs(SHARD_PATHW,szCurFile); UpdateToolbar(); @@ -7772,7 +7774,6 @@ BOOL FileSave(BOOL bSaveAlways,BOOL bAsk,BOOL bSaveAs,BOOL bSaveCopy) InstallFileWatching(szCurFile); } } - else if (!bCancelDataLoss) { if (StringCchLen(szCurFile) > 0) { @@ -7788,6 +7789,11 @@ BOOL FileSave(BOOL bSaveAlways,BOOL bAsk,BOOL bSaveAs,BOOL bSaveCopy) if (GetTempPath(MAX_PATH,lpTempPathBuffer) && GetTempFileName(lpTempPathBuffer,TEXT("NP3"),0,szTempFileName)) { int fileEncoding = Encoding_Current(CPI_GET); + int idx; + if (MRU_FindFile(pFileMRU,tchFile,&idx)) { + MRU_SetEnc(pFileMRU,idx,Encoding_MapIniSetting(FALSE,fileEncoding)); + MRU_SetPos(pFileMRU,idx,(int)SendMessage(hwndEdit,SCI_GETCURRENTPOS,0,0)); + } if (FileIO(FALSE,szTempFileName,FALSE,&fileEncoding,&iEOLMode,NULL,NULL,&bCancelDataLoss,TRUE)) { //~Encoding_Current(fileEncoding); // save should not change encoding diff --git a/src/Notepad3.rc b/src/Notepad3.rc index b8989d11b291022c72279c0bcc4a66b56c17cca5..4f6e20c44079daa1c90c67d1ca561be90099b706 100644 GIT binary patch delta 31 ncmeC_<(|^Z-LQr6R{*C1Lk>eGLoq{1`|kk8?Y{$