diff --git a/src/Edit.c b/src/Edit.c index 4189916c7..d83c3796f 100644 --- a/src/Edit.c +++ b/src/Edit.c @@ -55,20 +55,17 @@ static int yFindReplaceDlgSave; extern int xFindReplaceDlg; extern int yFindReplaceDlg; -extern int iDefaultEncoding; extern int iDefaultEOLMode; extern int iLineEndings[3]; extern BOOL bFixLineEndings; extern BOOL bAutoStripBlanks; - // Default Codepage and Character Set +extern int iDefaultEncoding; extern int iDefaultCharSet; extern BOOL bSkipUnicodeDetection; extern BOOL bLoadASCIIasUTF8; extern BOOL bLoadNFOasOEM; -extern int iSrcEncoding; -extern int iWeakSrcEncoding; extern BOOL bAccelWordNavigation; @@ -529,6 +526,8 @@ char* EditGetClipboardText(HWND hwnd) { else { SendMessage(hwndEdit,SCI_SETSEL,iPos,iAnchor); } + EditFixPositions(hwndEdit); + if (Encoding_Current(CPI_GET) != CPI_UTF8) { return(NULL); } @@ -717,14 +716,60 @@ int Encoding_Current(int iEncoding) static int CurrentEncoding = CPI_NONE; if (iEncoding >= 0) { - if (Encoding_IsValid(iEncoding)) { + if (Encoding_IsValid(iEncoding)) CurrentEncoding = iEncoding; - } + else + CurrentEncoding = CPI_UTF8; } return CurrentEncoding; } +int Encoding_Source(int iSrcEncoding) +{ + static int SourceEncoding = CPI_NONE; + + if (iSrcEncoding >= 0) { + if (Encoding_IsValid(iSrcEncoding)) + SourceEncoding = iSrcEncoding; + else + SourceEncoding = CPI_UTF8; + } + else if (iSrcEncoding == CPI_NONE) { + SourceEncoding = CPI_NONE; + } + return SourceEncoding; +} + + +int Encoding_SrcWeak(int iSrcWeakEnc) +{ + static int SourceWeakEncoding = CPI_NONE; + + if (iSrcWeakEnc >= 0) { + if (Encoding_IsValid(iSrcWeakEnc)) + SourceWeakEncoding = iSrcWeakEnc; + else + SourceWeakEncoding = CPI_UTF8; + } + else if (iSrcWeakEnc == CPI_NONE) { + SourceWeakEncoding = CPI_NONE; + } + return SourceWeakEncoding; +} + + +BOOL Encoding_HasChanged(int iOriginalEncoding) +{ + static int OriginalEncoding = CPI_NONE; + + if (iOriginalEncoding >= CPI_NONE) { + OriginalEncoding = iOriginalEncoding; + } + return (BOOL)(OriginalEncoding != Encoding_Current(CPI_GET)); +} + + void Encoding_InitDefaults() { mEncoding[CPI_ANSI_DEFAULT].uCodePage = GetACP(); StringCchPrintf(wchANSI,COUNTOF(wchANSI),L" (%u)",mEncoding[CPI_ANSI_DEFAULT].uCodePage); @@ -1091,8 +1136,28 @@ int Encoding_SciMappedCodePage(int iEncoding) void Encoding_SciSetCodePage(HWND hwnd, int iEncoding) { + int charset = SC_CHARSET_ANSI; int cp = Encoding_SciMappedCodePage(iEncoding); + + switch (cp) { + case 932: + charset = SC_CHARSET_SHIFTJIS; + break; + case 936: + charset = SC_CHARSET_GB2312; + break; + case 949: + charset = SC_CHARSET_HANGUL; + break; + case 950: + charset = SC_CHARSET_CHINESEBIG5; + break; + default: + charset = iDefaultCharSet; + break; + } SendMessage(hwnd,SCI_SETCODEPAGE,(WPARAM)cp,0); + SendMessage(hwnd,SCI_STYLESETCHARACTERSET,(WPARAM)STYLE_DEFAULT,(LPARAM)charset); } @@ -1378,8 +1443,8 @@ BOOL EditLoadFile( dwLastIOError = GetLastError(); if (hFile == INVALID_HANDLE_VALUE) { - iSrcEncoding = CPI_NONE; - iWeakSrcEncoding = CPI_NONE; + Encoding_Source(CPI_NONE); + Encoding_SrcWeak(CPI_NONE); return FALSE; } @@ -1393,8 +1458,8 @@ BOOL EditLoadFile( if (InfoBox(MBYESNO,L"MsgFileSizeWarning",IDS_WARNLOADBIGFILE) != IDYES) { CloseHandle(hFile); *pbFileTooBig = TRUE; - iSrcEncoding = CPI_NONE; - iWeakSrcEncoding = CPI_NONE; + Encoding_Source(CPI_NONE); + Encoding_SrcWeak(CPI_NONE); return FALSE; } } @@ -1406,8 +1471,8 @@ BOOL EditLoadFile( if (!bReadSuccess) { GlobalFree(lpData); - iSrcEncoding = CPI_NONE; - iWeakSrcEncoding = CPI_NONE; + Encoding_Source(CPI_NONE); + Encoding_SrcWeak(CPI_NONE); return FALSE; } @@ -1419,22 +1484,23 @@ BOOL EditLoadFile( } int _iPrefEncoding = (bPreferOEM) ? g_DOSEncoding : iDefaultEncoding; - if (Encoding_IsValid(iWeakSrcEncoding)) - _iPrefEncoding = iWeakSrcEncoding; + if (Encoding_IsValid(Encoding_SrcWeak(CPI_GET))) + _iPrefEncoding = Encoding_SrcWeak(CPI_GET); BOOL bBOM = FALSE; + const int iSrcEnc = Encoding_Source(CPI_GET); if (cbData == 0) { FileVars_Init(NULL,0,&fvCurFile); *iEOLMode = iLineEndings[iDefaultEOLMode]; - if (iSrcEncoding == CPI_NONE) { + if (iSrcEnc == CPI_NONE) { if (bLoadASCIIasUTF8 && !bPreferOEM) *iEncoding = CPI_UTF8; else *iEncoding = _iPrefEncoding; } else - *iEncoding = iSrcEncoding; + *iEncoding = iSrcEnc; Encoding_SciSetCodePage(hwnd,*iEncoding); EditSetNewText(hwnd,"",0); @@ -1442,20 +1508,21 @@ BOOL EditLoadFile( GlobalFree(lpData); } - else if (!bSkipEncodingDetection && (iSrcEncoding == CPI_NONE || iSrcEncoding == CPI_UNICODE || iSrcEncoding == CPI_UNICODEBE) && - (iSrcEncoding == CPI_UNICODE || iSrcEncoding == CPI_UNICODEBE || IsUnicode(lpData,cbData,&bBOM,&bReverse)) && - (iSrcEncoding == CPI_UNICODE || iSrcEncoding == CPI_UNICODEBE || !IsUTF8Signature(lpData))) // check for UTF-8 signature + else if (!bSkipEncodingDetection && + (iSrcEnc == CPI_NONE || iSrcEnc == CPI_UNICODE || iSrcEnc == CPI_UNICODEBE) && + (iSrcEnc == CPI_UNICODE || iSrcEnc == CPI_UNICODEBE || IsUnicode(lpData,cbData,&bBOM,&bReverse)) && + (iSrcEnc == CPI_UNICODE || iSrcEnc == CPI_UNICODEBE || !IsUTF8Signature(lpData))) // check for UTF-8 signature { char* lpDataUTF8; - if (iSrcEncoding == CPI_UNICODE) { + if (iSrcEnc == CPI_UNICODE) { bBOM = (*((UNALIGNED PWCHAR)lpData) == 0xFEFF); bReverse = FALSE; } - else if (iSrcEncoding == CPI_UNICODEBE) + else if (iSrcEnc == CPI_UNICODEBE) bBOM = (*((UNALIGNED PWCHAR)lpData) == 0xFFFE); - if (iSrcEncoding == CPI_UNICODEBE || bReverse) { + if (iSrcEnc == CPI_UNICODEBE || bReverse) { _swab(lpData,lpData,cbData); if (bBOM) *iEncoding = CPI_UNICODEBEBOM; @@ -1468,15 +1535,16 @@ BOOL EditLoadFile( else *iEncoding = CPI_UNICODE; } + Encoding_SciSetCodePage(hwnd,*iEncoding); lpDataUTF8 = GlobalAlloc(GPTR,(cbData * 3) + 2); - cbData = WideCharToMultiByte(CP_UTF8,0,(bBOM) ? (LPWSTR)lpData + 1 : (LPWSTR)lpData, + cbData = WideCharToMultiByte(Encoding_SciGetCodePage(hwnd),0,(bBOM) ? (LPWSTR)lpData + 1 : (LPWSTR)lpData, (bBOM) ? (cbData)/sizeof(WCHAR) : cbData/sizeof(WCHAR) + 1,lpDataUTF8,(int)GlobalSize(lpDataUTF8),NULL,NULL); if (cbData == 0) { + *pbUnicodeErr = TRUE; cbData = WideCharToMultiByte(CP_ACP,0,(bBOM) ? (LPWSTR)lpData + 1 : (LPWSTR)lpData, (-1),lpDataUTF8,(int)GlobalSize(lpDataUTF8),NULL,NULL); - *pbUnicodeErr = TRUE; } GlobalFree(lpData); @@ -1490,10 +1558,10 @@ BOOL EditLoadFile( else { FileVars_Init(lpData,cbData,&fvCurFile); - if (!bSkipEncodingDetection && (iSrcEncoding == CPI_NONE || iSrcEncoding == CPI_UTF8 || iSrcEncoding == CPI_UTF8SIGN) && + if (!bSkipEncodingDetection && (iSrcEnc == CPI_NONE || iSrcEnc == CPI_UTF8 || iSrcEnc == CPI_UTF8SIGN) && ((IsUTF8Signature(lpData) || FileVars_IsUTF8(&fvCurFile) || - (iSrcEncoding == CPI_UTF8 || iSrcEncoding == CPI_UTF8SIGN) || + (iSrcEnc == CPI_UTF8 || iSrcEnc == CPI_UTF8SIGN) || (!bPreferOEM && bLoadASCIIasUTF8) || (IsUTF8(lpData,cbData) && (((UTF8_mbslen_bytes(UTF8StringStart(lpData)) - 1 != @@ -1501,7 +1569,7 @@ BOOL EditLoadFile( (!bPreferOEM && ( mEncoding[_iPrefEncoding].uFlags & NCP_UTF8 )) ))))) && !(FileVars_IsNonUTF8(&fvCurFile) && - (iSrcEncoding != CPI_UTF8 && iSrcEncoding != CPI_UTF8SIGN))) + (iSrcEnc != CPI_UTF8 && iSrcEnc != CPI_UTF8SIGN))) { Encoding_SciSetCodePage(hwnd,CPI_UTF8); EditSetNewText(hwnd,"",0); @@ -1524,17 +1592,17 @@ BOOL EditLoadFile( LPWSTR lpDataWide; int cbDataWide; - if (iSrcEncoding != CPI_NONE) - *iEncoding = iSrcEncoding; + if (iSrcEnc != CPI_NONE) + *iEncoding = iSrcEnc; else { *iEncoding = FileVars_GetEncoding(&fvCurFile); if (*iEncoding == CPI_NONE) { if (fvCurFile.mask & FV_ENCODING) *iEncoding = CPI_ANSI_DEFAULT; else { - if (iWeakSrcEncoding == CPI_NONE) + if (Encoding_SrcWeak(CPI_GET) == CPI_NONE) *iEncoding = _iPrefEncoding; - else if (mEncoding[iWeakSrcEncoding].uFlags & NCP_INTERNAL) + else if (mEncoding[Encoding_SrcWeak(CPI_GET)].uFlags & NCP_INTERNAL) *iEncoding = iDefaultEncoding; else *iEncoding = _iPrefEncoding; @@ -1553,10 +1621,10 @@ BOOL EditLoadFile( GlobalFree(lpData); lpData = GlobalAlloc(GPTR,cbDataWide * 3 + 16); - cbData = WideCharToMultiByte(CP_UTF8,0,lpDataWide,cbDataWide,lpData,(int)GlobalSize(lpData),NULL,NULL); - GlobalFree(lpDataWide); - Encoding_SciSetCodePage(hwnd,*iEncoding); + cbData = WideCharToMultiByte(Encoding_SciGetCodePage(hwnd),0,lpDataWide,cbDataWide,lpData,(int)GlobalSize(lpData),NULL,NULL); + + GlobalFree(lpDataWide); EditSetNewText(hwnd,"",0); EditSetNewText(hwnd,lpData,cbData); *iEOLMode = EditDetectEOLMode(hwnd,lpData,cbData); @@ -1564,7 +1632,7 @@ BOOL EditLoadFile( GlobalFree(lpData); } else { - *iEncoding = Encoding_IsValid(iSrcEncoding) ? iSrcEncoding : iDefaultEncoding; + *iEncoding = Encoding_IsValid(iSrcEnc) ? iSrcEnc : iDefaultEncoding; Encoding_SciSetCodePage(hwnd,*iEncoding); EditSetNewText(hwnd,"",0); EditSetNewText(hwnd,lpData,cbData); @@ -1574,8 +1642,8 @@ BOOL EditLoadFile( } } - iSrcEncoding = CPI_NONE; - iWeakSrcEncoding = CPI_NONE; + Encoding_Source(CPI_NONE); + Encoding_SrcWeak(CPI_NONE); return TRUE; } @@ -1694,7 +1762,7 @@ BOOL EditSaveFile( CopyMemory((char*)lpDataWide, bom, 2); bomoffset = 1; } - cbDataWide = bomoffset + MultiByteToWideChar(CP_UTF8, 0, lpData, cbData, &lpDataWide[bomoffset], (int)GlobalSize(lpDataWide) / sizeof(WCHAR) - bomoffset); + cbDataWide = bomoffset + MultiByteToWideChar(Encoding_SciGetCodePage(hwnd), 0, lpData, cbData, &lpDataWide[bomoffset], (int)GlobalSize(lpDataWide) / sizeof(WCHAR) - bomoffset); if (mEncoding[iEncoding].uFlags & NCP_UNICODE_REVERSE) { _swab((char*)lpDataWide, (char*)lpDataWide, cbDataWide * sizeof(WCHAR)); } @@ -1729,7 +1797,7 @@ BOOL EditSaveFile( UINT uCodePage = mEncoding[iEncoding].uCodePage; LPWSTR lpDataWide = GlobalAlloc(GPTR,cbData * 2 + 16); - int cbDataWide = MultiByteToWideChar(CP_UTF8,0,lpData,cbData,lpDataWide,(int)GlobalSize(lpDataWide)/sizeof(WCHAR)); + int cbDataWide = MultiByteToWideChar(Encoding_SciGetCodePage(hwnd),0,lpData,cbData,lpDataWide,(int)GlobalSize(lpDataWide)/sizeof(WCHAR)); // Special cases: 42, 50220, 50221, 50222, 50225, 50227, 50229, 54936, 57002-11, 65000, 65001 if (uCodePage == CP_UTF7 || uCodePage == 54936) { @@ -4836,8 +4904,8 @@ void EditFixPositions(HWND hwnd) int iAnchorPos = (int)SendMessage(hwnd,SCI_GETANCHOR,0,0); if (iCurrentPos > 0 && iCurrentPos < iMaxPos) { - int iNewPos = (int)SendMessage(hwnd,SCI_POSITIONAFTER,(WPARAM) - (int)SendMessage(hwnd,SCI_POSITIONBEFORE,(WPARAM)iCurrentPos,0),0); + int iNewPos = (int)SendMessage(hwnd,SCI_POSITIONAFTER, + (WPARAM)(int)SendMessage(hwnd,SCI_POSITIONBEFORE,(WPARAM)iCurrentPos,0),0); if (iNewPos != iCurrentPos) { SendMessage(hwnd,SCI_SETCURRENTPOS,(WPARAM)iNewPos,0); iCurrentPos = iNewPos; @@ -5005,6 +5073,7 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA if (lstrcmpA( lpszSelection , "" ) == 0 && bFirstTime ) { char *pClip = EditGetClipboardText(hwndEdit); + int len = lstrlenA(pClip); if( len > 0 && len < FNDRPL_BUFFER) { diff --git a/src/Edit.h b/src/Edit.h index dcec68e60..a2bab3198 100644 --- a/src/Edit.h +++ b/src/Edit.h @@ -168,7 +168,11 @@ typedef struct _np2encoding { WCHAR wchLabel[32]; } NP2ENCODING; -int Encoding_Current(int); // getter/setter +int Encoding_Current(int); // getter/setter +int Encoding_Source(int); // getter/setter +int Encoding_SrcWeak(int); // getter/setter +BOOL Encoding_HasChanged(int); // query/setter + void Encoding_InitDefaults(); int Encoding_MapIniSetting(BOOL,int); void Encoding_GetLabel(int); diff --git a/src/Notepad3.c b/src/Notepad3.c index ff48d8586..86676f630 100644 --- a/src/Notepad3.c +++ b/src/Notepad3.c @@ -236,11 +236,7 @@ FILEVARS fvCurFile; BOOL bModified; BOOL bReadOnly = FALSE; -int iOriginalEncoding; int iDefaultEncoding; -int iSrcEncoding = CPI_NONE; -int iWeakSrcEncoding = CPI_NONE; - int iDefaultCharSet; int iEOLMode; @@ -888,7 +884,7 @@ HWND InitInstance(HINSTANCE hInstance,LPSTR pszCmdLine,int nCmdShow) // Source Encoding if (lpEncodingArg) - iSrcEncoding = Encoding_MatchW(lpEncodingArg); + Encoding_Source(Encoding_MatchW(lpEncodingArg)); // Pathname parameter if (lpFileArg /*&& !flagNewFromClipboard*/) @@ -927,15 +923,15 @@ HWND InitInstance(HINSTANCE hInstance,LPSTR pszCmdLine,int nCmdShow) } else { - if (iSrcEncoding != CPI_NONE) { - Encoding_Current(iSrcEncoding); - iOriginalEncoding = iSrcEncoding; + if (Encoding_Source(CPI_GET) != CPI_NONE) { + Encoding_Current(Encoding_Source(CPI_GET)); + Encoding_HasChanged(Encoding_Source(CPI_GET)); Encoding_SciSetCodePage(hwndEdit,Encoding_Current(CPI_GET)); } } // reset - iSrcEncoding = CPI_NONE; + Encoding_Source(CPI_NONE); flagQuietCreate = 0; fKeepTitleExcerpt = 0; @@ -1014,7 +1010,7 @@ HWND InitInstance(HINSTANCE hInstance,LPSTR pszCmdLine,int nCmdShow) hwndNextCBChain = SetClipboardViewer(hwndMain); uidsAppTitle = IDS_APPTITLE_PASTEBOARD; SetWindowTitle(hwndMain,uidsAppTitle,fIsElevated,IDS_UNTITLED,szCurFile, - iPathNameFormat,bModified || Encoding_Current(CPI_GET) != iOriginalEncoding, + iPathNameFormat,bModified || Encoding_HasChanged(CPI_GET), IDS_READONLY,bReadOnly,szTitleExcerpt); bLastCopyFromMe = FALSE; @@ -1275,7 +1271,7 @@ LRESULT CALLBACK MainWndProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam) if (params->flagFileSpecified) { BOOL bOpened = FALSE; - iSrcEncoding = params->iSrcEncoding; + Encoding_Source(params->iSrcEncoding); if (PathIsDirectory(¶ms->wchData)) { WCHAR tchFile[MAX_PATH] = { L'\0' }; @@ -1332,12 +1328,12 @@ LRESULT CALLBACK MainWndProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam) if (params->flagTitleExcerpt) { StringCchCopyN(szTitleExcerpt,COUNTOF(szTitleExcerpt),StrEnd(¶ms->wchData) + 1,COUNTOF(szTitleExcerpt)); SetWindowTitle(hwnd,uidsAppTitle,fIsElevated,IDS_UNTITLED,szCurFile, - iPathNameFormat,bModified || Encoding_Current(CPI_GET) != iOriginalEncoding, + iPathNameFormat,bModified || Encoding_HasChanged(CPI_GET), IDS_READONLY,bReadOnly,szTitleExcerpt); } } // reset - iSrcEncoding = CPI_NONE; + Encoding_Source(CPI_NONE); } if (params->flagJumpTo) { @@ -1454,12 +1450,12 @@ LRESULT CALLBACK MainWndProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam) case WM_CHANGENOTIFY: - if (iFileWatchingMode == 1 || bModified || Encoding_Current(CPI_GET) != iOriginalEncoding) + if (iFileWatchingMode == 1 || bModified || Encoding_HasChanged(CPI_GET)) SetForegroundWindow(hwnd); if (PathFileExists(szCurFile)) { - if ((iFileWatchingMode == 2 && !bModified && Encoding_Current(CPI_GET) == iOriginalEncoding) || + if ((iFileWatchingMode == 2 && !bModified && !Encoding_HasChanged(CPI_GET)) || MsgBox(MBYESNO,IDS_FILECHANGENOTIFY) == IDYES) { int iCurPos = (int)SendMessage(hwndEdit,SCI_GETCURRENTPOS,0,0); @@ -1469,7 +1465,8 @@ LRESULT CALLBACK MainWndProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam) int iXOffset = (int)SendMessage(hwndEdit,SCI_GETXOFFSET,0,0); BOOL bIsTail = (iCurPos == iAnchorPos) && (iCurPos == SendMessage(hwndEdit,SCI_GETLENGTH,0,0)); - iWeakSrcEncoding = Encoding_Current(CPI_GET); + Encoding_SrcWeak(Encoding_Current(CPI_GET)); + if (FileLoad(TRUE,FALSE,TRUE,FALSE,szCurFile)) { if (bIsTail && iFileWatchingMode == 2) { @@ -2409,12 +2406,13 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) int iDocTopLine = (int)SendMessage(hwndEdit,SCI_DOCLINEFROMVISIBLE,(WPARAM)iVisTopLine,0); int iXOffset = (int)SendMessage(hwndEdit,SCI_GETXOFFSET,0,0); - if ((bModified || Encoding_Current(CPI_GET) != iOriginalEncoding) && MsgBox(MBOKCANCEL,IDS_ASK_REVERT) != IDOK) + if ((bModified || Encoding_HasChanged(CPI_GET)) && MsgBox(MBOKCANCEL,IDS_ASK_REVERT) != IDOK) return(0); StringCchCopy(tchCurFile2,COUNTOF(tchCurFile2),szCurFile); - iWeakSrcEncoding = Encoding_Current(CPI_GET); + Encoding_SrcWeak(Encoding_Current(CPI_GET)); + if (FileLoad(TRUE,FALSE,TRUE,FALSE,tchCurFile2)) { if (SendMessage(hwndEdit,SCI_GETLENGTH,0,0) >= 4) { @@ -2473,7 +2471,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) bReadOnly = (dwFileAttributes & FILE_ATTRIBUTE_READONLY); SetWindowTitle(hwnd,uidsAppTitle,fIsElevated,IDS_UNTITLED,szCurFile, - iPathNameFormat,bModified || Encoding_Current(CPI_GET) != iOriginalEncoding, + iPathNameFormat,bModified || Encoding_HasChanged(CPI_GET), IDS_READONLY,bReadOnly,szTitleExcerpt); } break; @@ -2816,11 +2814,11 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) if (SendMessage(hwndEdit,SCI_GETLENGTH,0,0) == 0) { Encoding_Current(iNewEncoding); - iOriginalEncoding = iNewEncoding; + Encoding_HasChanged(iNewEncoding); } else { if (Encoding_IsANSI(Encoding_Current(CPI_GET)) || Encoding_IsANSI(iNewEncoding)) - iOriginalEncoding = CPI_NONE; + Encoding_HasChanged(CPI_NONE); Encoding_Current(iNewEncoding); } @@ -2828,7 +2826,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) UpdateStatusbar(); SetWindowTitle(hwnd,uidsAppTitle,fIsElevated,IDS_UNTITLED,szCurFile, - iPathNameFormat,bModified || Encoding_Current(CPI_GET) != iOriginalEncoding, + iPathNameFormat,bModified || Encoding_HasChanged(CPI_GET), IDS_READONLY,bReadOnly,szTitleExcerpt); } } @@ -2850,13 +2848,13 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) else if (iNewEncoding == CPI_UNICODEBEBOM) iNewEncoding = CPI_UNICODEBE; - if ((bModified || Encoding_Current(CPI_GET) != iOriginalEncoding) && MsgBox(MBOKCANCEL,IDS_ASK_RECODE) != IDOK) + if ((bModified || Encoding_HasChanged(CPI_GET)) && MsgBox(MBOKCANCEL,IDS_ASK_RECODE) != IDOK) return(0); if (RecodeDlg(hwnd,&iNewEncoding)) { StringCchCopy(tchCurFile2,COUNTOF(tchCurFile2),szCurFile); - iSrcEncoding = iNewEncoding; + Encoding_Source(iNewEncoding); FileLoad(TRUE,FALSE,TRUE,FALSE,tchCurFile2); } } @@ -2881,7 +2879,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) UpdateToolbar(); UpdateStatusbar(); SetWindowTitle(hwnd,uidsAppTitle,fIsElevated,IDS_UNTITLED,szCurFile, - iPathNameFormat,bModified || Encoding_Current(CPI_GET) != iOriginalEncoding, + iPathNameFormat,bModified || Encoding_HasChanged(CPI_GET), IDS_READONLY,bReadOnly,szTitleExcerpt); } break; @@ -2929,39 +2927,52 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) case IDM_EDIT_COPYALL: - if (flagPasteBoard) - bLastCopyFromMe = TRUE; - SendMessage(hwndEdit,SCI_COPYRANGE,0,SendMessage(hwndEdit,SCI_GETLENGTH,0,0)); - UpdateToolbar(); + { + if (flagPasteBoard) + bLastCopyFromMe = TRUE; + + int token = BeginSelUndoAction(); + SendMessage(hwndEdit,SCI_COPYRANGE,0,SendMessage(hwndEdit,SCI_GETLENGTH,0,0)); + EndSelUndoAction(token); + + UpdateToolbar(); + } break; case IDM_EDIT_COPYADD: - if (flagPasteBoard) - bLastCopyFromMe = TRUE; - EditCopyAppend(hwndEdit); - UpdateToolbar(); - break; + { + if (flagPasteBoard) + bLastCopyFromMe = TRUE; + + int token = BeginSelUndoAction(); + EditCopyAppend(hwndEdit); + EndSelUndoAction(token); + UpdateToolbar(); + } + break; case IDM_EDIT_SWAP: bSwapClipBoard = TRUE; case IDM_EDIT_PASTE: { + char *pClip = EditGetClipboardText(hwndEdit); + int iPos = (int)SendMessage(hwndEdit,SCI_GETCURRENTPOS,0,0); int iAnchor = (int)SendMessage(hwndEdit,SCI_GETANCHOR,0,0); - char *pClip = EditGetClipboardText(hwndEdit); - int token = BeginSelUndoAction(); + if (SendMessage(hwndEdit,SCI_GETSELECTIONEMPTY,0,0)) { SendMessage(hwndEdit,SCI_REPLACESEL,(WPARAM)0,(LPARAM)pClip); - int iNewPos = (int)SendMessage(hwndEdit,SCI_GETCURRENTPOS,0,0); - SendMessage(hwndEdit,SCI_SETSEL,iPos,iNewPos); - if (bSwapClipBoard) + if (bSwapClipBoard) { + int iNewPos = (int)SendMessage(hwndEdit,SCI_GETCURRENTPOS,0,0); + SendMessage(hwndEdit,SCI_SETSEL,iPos,iNewPos); SendMessage(hwnd,WM_COMMAND,MAKELONG(IDM_EDIT_CLEARCLIPBOARD,1),0); + } } else { if (flagPasteBoard) @@ -3007,12 +3018,18 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) case IDM_EDIT_SELECTALL: - SendMessage(hwndEdit,SCI_SELECTALL,0,0); + { + int token = BeginSelUndoAction(); + SendMessage(hwndEdit,SCI_SELECTALL,0,0); + EndSelUndoAction(token); + } break; case IDM_EDIT_SELECTWORD: { + int token = BeginSelUndoAction(); + int iPos = (int)SendMessage(hwndEdit,SCI_GETCURRENTPOS,0,0); if (SendMessage(hwndEdit, SCI_GETSELECTIONEMPTY, 0, 0)) { @@ -3053,13 +3070,15 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) int iLineEnd = (int)SendMessage(hwndEdit,SCI_GETLINEENDPOSITION,iLine,0); SendMessage(hwndEdit,SCI_SETSEL,iLineStart,iLineEnd); } + EndSelUndoAction(token); } - break; case IDM_EDIT_SELECTLINE: { + int token = BeginSelUndoAction(); + int iSelStart = (int)SendMessage(hwndEdit,SCI_GETSELECTIONSTART,0,0); int iSelEnd = (int)SendMessage(hwndEdit,SCI_GETSELECTIONEND,0,0); int iLineStart = (int)SendMessage(hwndEdit,SCI_LINEFROMPOSITION,iSelStart,0); @@ -3068,6 +3087,8 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) iSelEnd = (int)SendMessage(hwndEdit,SCI_POSITIONFROMLINE,iLineEnd+1,0); SendMessage(hwndEdit,SCI_SETSEL,iSelStart,iSelEnd); SendMessage(hwndEdit,SCI_CHOOSECARETX,0,0); + + EndSelUndoAction(token); } break; @@ -3120,38 +3141,18 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) case IDM_EDIT_INDENT: { - int iLineSelStart = (int)SendMessage(hwndEdit,SCI_LINEFROMPOSITION, - (int)SendMessage(hwndEdit,SCI_GETSELECTIONSTART,0,0),0); - int iLineSelEnd = (int)SendMessage(hwndEdit,SCI_LINEFROMPOSITION, - (int)SendMessage(hwndEdit,SCI_GETSELECTIONEND,0,0),0); - - SendMessage(hwndEdit,SCI_SETTABINDENTS,TRUE,0); - if (iLineSelStart == iLineSelEnd) { - SendMessage(hwndEdit,SCI_VCHOME,0,0); - SendMessage(hwndEdit,SCI_TAB,0,0); - } - else - SendMessage(hwndEdit,SCI_TAB,0,0); - SendMessage(hwndEdit,SCI_SETTABINDENTS,bTabIndents,0); + int token = BeginSelUndoAction(); + SendMessage(hwndEdit,SCI_TAB,0,0); + EndSelUndoAction(token); } break; case IDM_EDIT_UNINDENT: { - int iLineSelStart = (int)SendMessage(hwndEdit,SCI_LINEFROMPOSITION, - (int)SendMessage(hwndEdit,SCI_GETSELECTIONSTART,0,0),0); - int iLineSelEnd = (int)SendMessage(hwndEdit,SCI_LINEFROMPOSITION, - (int)SendMessage(hwndEdit,SCI_GETSELECTIONEND,0,0),0); - - SendMessage(hwndEdit,SCI_SETTABINDENTS,TRUE,0); - if (iLineSelStart == iLineSelEnd) { - SendMessage(hwndEdit,SCI_VCHOME,0,0); - SendMessage(hwndEdit,SCI_BACKTAB,0,0); - } - else - SendMessage(hwndEdit,SCI_BACKTAB,0,0); - SendMessage(hwndEdit,SCI_SETTABINDENTS,bTabIndents,0); + int token = BeginSelUndoAction(); + SendMessage(hwndEdit,SCI_BACKTAB,0,0); + EndSelUndoAction(token); } break; @@ -3159,7 +3160,9 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) case IDM_EDIT_ENCLOSESELECTION: if (EditEncloseSelectionDlg(hwnd,wchPrefixSelection,wchAppendSelection)) { BeginWaitCursor(); + int token = BeginSelUndoAction(); EditEncloseSelection(hwndEdit,wchPrefixSelection,wchAppendSelection); + EndSelUndoAction(token); EndWaitCursor(); } break; @@ -3335,9 +3338,13 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) case IDM_EDIT_JOINLINESEX: - BeginWaitCursor(); - EditJoinLinesEx(hwndEdit); - EndWaitCursor(); + { + BeginWaitCursor(); + int token = BeginSelUndoAction(); + EditJoinLinesEx(hwndEdit); + EndSelUndoAction(token); + EndWaitCursor(); + } break; @@ -4397,7 +4404,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) iPathNameFormat = 0; StringCchCopy(szTitleExcerpt,COUNTOF(szTitleExcerpt),L""); SetWindowTitle(hwnd,uidsAppTitle,fIsElevated,IDS_UNTITLED,szCurFile, - iPathNameFormat,bModified || Encoding_Current(CPI_GET) != iOriginalEncoding, + iPathNameFormat,bModified || Encoding_HasChanged(CPI_GET), IDS_READONLY,bReadOnly,szTitleExcerpt); break; @@ -4406,7 +4413,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) iPathNameFormat = 1; StringCchCopy(szTitleExcerpt,COUNTOF(szTitleExcerpt),L""); SetWindowTitle(hwnd,uidsAppTitle,fIsElevated,IDS_UNTITLED,szCurFile, - iPathNameFormat,bModified || Encoding_Current(CPI_GET) != iOriginalEncoding, + iPathNameFormat,bModified || Encoding_HasChanged(CPI_GET), IDS_READONLY,bReadOnly,szTitleExcerpt); break; @@ -4415,7 +4422,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) iPathNameFormat = 2; StringCchCopy(szTitleExcerpt,COUNTOF(szTitleExcerpt),L""); SetWindowTitle(hwnd,uidsAppTitle,fIsElevated,IDS_UNTITLED,szCurFile, - iPathNameFormat,bModified || Encoding_Current(CPI_GET) != iOriginalEncoding, + iPathNameFormat,bModified || Encoding_HasChanged(CPI_GET), IDS_READONLY,bReadOnly,szTitleExcerpt); break; @@ -4423,7 +4430,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) case IDM_VIEW_SHOWEXCERPT: EditGetExcerpt(hwndEdit,szTitleExcerpt,COUNTOF(szTitleExcerpt)); SetWindowTitle(hwnd,uidsAppTitle,fIsElevated,IDS_UNTITLED,szCurFile, - iPathNameFormat,bModified || Encoding_Current(CPI_GET) != iOriginalEncoding, + iPathNameFormat,bModified || Encoding_HasChanged(CPI_GET), IDS_READONLY,bReadOnly,szTitleExcerpt); break; @@ -4638,13 +4645,13 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) WCHAR tchCurFile2[MAX_PATH] = { L'\0' }; if (lstrlen(szCurFile)) { if (iDefaultEncoding == CPI_UNICODEBOM) - iSrcEncoding = CPI_UNICODE; + Encoding_Source(CPI_UNICODE); else if (iDefaultEncoding == CPI_UNICODEBEBOM) - iSrcEncoding = CPI_UNICODEBE; + Encoding_Source(CPI_UNICODEBE); else if (iDefaultEncoding == CPI_UTF8SIGN) - iSrcEncoding = CPI_UTF8; + Encoding_Source(CPI_UTF8); else - iSrcEncoding = iDefaultEncoding; + Encoding_Source(iDefaultEncoding); StringCchCopy(tchCurFile2,COUNTOF(tchCurFile2),szCurFile); FileLoad(FALSE,FALSE,TRUE,TRUE,tchCurFile2); } @@ -4656,7 +4663,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) { WCHAR tchCurFile2[MAX_PATH] = { L'\0' }; if (lstrlen(szCurFile)) { - iSrcEncoding = CPI_ANSI_DEFAULT; + Encoding_Source(CPI_ANSI_DEFAULT); StringCchCopy(tchCurFile2,COUNTOF(tchCurFile2),szCurFile); FileLoad(FALSE,FALSE,TRUE,TRUE,tchCurFile2); } @@ -4668,7 +4675,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) { WCHAR tchCurFile2[MAX_PATH] = { L'\0' }; if (lstrlen(szCurFile)) { - iSrcEncoding = CPI_OEM; + Encoding_Source(CPI_OEM); StringCchCopy(tchCurFile2,COUNTOF(tchCurFile2),szCurFile); FileLoad(FALSE,FALSE,TRUE,TRUE,tchCurFile2); } @@ -5003,7 +5010,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) case CMD_TOGGLETITLE: EditGetExcerpt(hwndEdit,szTitleExcerpt,COUNTOF(szTitleExcerpt)); SetWindowTitle(hwnd,uidsAppTitle,fIsElevated,IDS_UNTITLED,szCurFile, - iPathNameFormat,bModified || Encoding_Current(CPI_GET) != iOriginalEncoding, + iPathNameFormat,bModified || Encoding_HasChanged(CPI_GET), IDS_READONLY,bReadOnly,szTitleExcerpt); break; @@ -5552,7 +5559,7 @@ LRESULT MsgNotify(HWND hwnd,WPARAM wParam,LPARAM lParam) case SCN_SAVEPOINTREACHED: bModified = FALSE; SetWindowTitle(hwnd,uidsAppTitle,fIsElevated,IDS_UNTITLED,szCurFile, - iPathNameFormat,bModified || Encoding_Current(CPI_GET) != iOriginalEncoding, + iPathNameFormat,bModified || Encoding_HasChanged(CPI_GET), IDS_READONLY,bReadOnly,szTitleExcerpt); UpdateToolbar(); break; @@ -5570,7 +5577,7 @@ LRESULT MsgNotify(HWND hwnd,WPARAM wParam,LPARAM lParam) case SCN_SAVEPOINTLEFT: bModified = TRUE; SetWindowTitle(hwnd,uidsAppTitle,fIsElevated,IDS_UNTITLED,szCurFile, - iPathNameFormat,bModified || Encoding_Current(CPI_GET) != iOriginalEncoding, + iPathNameFormat,bModified || Encoding_HasChanged(CPI_GET), IDS_READONLY,bReadOnly,szTitleExcerpt); UpdateToolbar(); break; @@ -6060,13 +6067,12 @@ void LoadSettings() // set flag for encoding default mEncoding[iDefaultEncoding].uFlags |= NCP_DEFAULT; - { CHARSETINFO ci; - if (TranslateCharsetInfo((DWORD*)(UINT_PTR)iSciDefaultCodePage, &ci, TCI_SRCCODEPAGE)) - iDefaultCharSet = ci.ciCharset; + if (TranslateCharsetInfo((DWORD*)(UINT_PTR)iSciDefaultCodePage,&ci,TCI_SRCCODEPAGE)) + iDefaultCharSet = ci.ciCharset; // corresponds to SCI: SC_CHARSET_XXX else - iDefaultCharSet = ANSI_CHARSET; + iDefaultCharSet = SC_CHARSET_ANSI; // == GDI:ANSI_CHARSET // DEFAULT_CHARSET; } // Scintilla Styles @@ -6918,7 +6924,7 @@ void UpdateToolbar() EnableTool(IDT_VIEW_TOGGLEFOLDS,i && bShowCodeFolding); EnableTool(IDT_FILE_LAUNCH,i); - EnableTool(IDT_FILE_SAVE, (bModified || (Encoding_Current(CPI_GET) != iOriginalEncoding)) /*&& !bReadOnly*/); + EnableTool(IDT_FILE_SAVE, (bModified || Encoding_HasChanged(CPI_GET)) /*&& !bReadOnly*/); CheckTool(IDT_VIEW_WORDWRAP,fWordWrap); } @@ -7112,14 +7118,18 @@ int BeginSelUndoAction() int token = -1; UndoRedoSelection sel = { -1 }; sel.selMode = (int)SendMessage(hwndEdit,SCI_GETSELECTIONMODE,0,0); - sel.anchorPos_undo = (int)SendMessage(hwndEdit, SCI_GETANCHOR, 0, 0); - sel.currPos_undo = (int)SendMessage(hwndEdit, SCI_GETCURRENTPOS, 0, 0); - if (sel.currPos_undo != sel.anchorPos_undo) { - token = UndoSelectionMap(-1, &sel); - if (token >= 0) { - SendMessage(hwndEdit, SCI_BEGINUNDOACTION, 0, 0); - SendMessage(hwndEdit, SCI_ADDUNDOACTION, (WPARAM)token, 0); - } + if (sel.selMode == SC_SEL_LINES) { + sel.anchorPos_undo = (int)SendMessage(hwndEdit,SCI_GETSELECTIONSTART,0,0); + sel.currPos_undo = (int)SendMessage(hwndEdit,SCI_GETSELECTIONEND,0,0); + } + else { + sel.anchorPos_undo = (int)SendMessage(hwndEdit,SCI_GETANCHOR,0,0); + sel.currPos_undo = (int)SendMessage(hwndEdit,SCI_GETCURRENTPOS,0,0); + } + token = UndoSelectionMap(-1, &sel); + if (token >= 0) { + SendMessage(hwndEdit, SCI_BEGINUNDOACTION, 0, 0); + SendMessage(hwndEdit, SCI_ADDUNDOACTION, (WPARAM)token, 0); } return token; } @@ -7137,8 +7147,14 @@ void EndSelUndoAction(int token) UndoRedoSelection sel = { -1 }; if (UndoSelectionMap(token,&sel) >= 0) { // mode should not have changed ??? - sel.anchorPos_redo = (int)SendMessage(hwndEdit,SCI_GETANCHOR,0,0); - sel.currPos_redo = (int)SendMessage(hwndEdit,SCI_GETCURRENTPOS,0,0); + if (sel.selMode == SC_SEL_LINES) { + sel.anchorPos_redo = (int)SendMessage(hwndEdit,SCI_GETSELECTIONSTART,0,0); + sel.currPos_redo = (int)SendMessage(hwndEdit,SCI_GETSELECTIONEND,0,0); + } + else { + sel.anchorPos_redo = (int)SendMessage(hwndEdit,SCI_GETANCHOR,0,0); + sel.currPos_redo = (int)SendMessage(hwndEdit,SCI_GETCURRENTPOS,0,0); + } } UndoSelectionMap(token,&sel); // set with redo action filled SendMessage(hwndEdit, SCI_ENDUNDOACTION, 0, 0); @@ -7160,15 +7176,18 @@ void RestoreSelectionAction(int token, DoAction doAct) int anchorPos = (doAct == UNDO ? sel.anchorPos_undo : sel.anchorPos_redo); int currPos = (doAct == UNDO ? sel.currPos_undo : sel.currPos_redo); SendMessage(hwndEdit,SCI_SETSELECTIONMODE,(WPARAM)sel.selMode,0); - if (anchorPos != currPos) { - if (sel.selMode == SC_SEL_RECTANGLE) { - PostMessage(hwndEdit,SCI_SETRECTANGULARSELECTIONANCHOR,(WPARAM)anchorPos,0); - PostMessage(hwndEdit,SCI_SETRECTANGULARSELECTIONCARET,(WPARAM)currPos,0); - } - else { - PostMessage(hwndEdit,SCI_SETSELECTION,(WPARAM)currPos,(LPARAM)anchorPos); - } + if (sel.selMode == SC_SEL_LINES) { + PostMessage(hwndEdit,SCI_SETSELECTIONSTART,(WPARAM)anchorPos,0); + PostMessage(hwndEdit,SCI_SETSELECTIONEND,(WPARAM)currPos,0); } + else if (sel.selMode == SC_SEL_RECTANGLE) { + PostMessage(hwndEdit,SCI_SETRECTANGULARSELECTIONANCHOR,(WPARAM)anchorPos,0); + PostMessage(hwndEdit,SCI_SETRECTANGULARSELECTIONCARET,(WPARAM)currPos,0); + } + else { + PostMessage(hwndEdit,SCI_SETSELECTION,(WPARAM)currPos,(LPARAM)anchorPos); + } + PostMessage(hwndEdit,SCI_CANCEL,0,0); } } @@ -7287,11 +7306,11 @@ BOOL FileLoad(BOOL bDontSave,BOOL bNew,BOOL bReload,BOOL bNoEncDetect,LPCWSTR lp iEOLMode = iLineEndings[iDefaultEOLMode]; SendMessage(hwndEdit,SCI_SETEOLMODE,iLineEndings[iDefaultEOLMode],0); Encoding_Current(iDefaultEncoding); - iOriginalEncoding = iDefaultEncoding; + Encoding_HasChanged(iDefaultEncoding); Encoding_SciSetCodePage(hwndEdit,iDefaultEncoding); EditSetNewText(hwndEdit,"",0); SetWindowTitle(hwndMain,uidsAppTitle,fIsElevated,IDS_UNTITLED,szCurFile, - iPathNameFormat,bModified || Encoding_Current(CPI_GET) != iOriginalEncoding, + iPathNameFormat,bModified || Encoding_HasChanged(CPI_GET), IDS_READONLY,bReadOnly,szTitleExcerpt); // Terminate file watching @@ -7345,13 +7364,13 @@ BOOL FileLoad(BOOL bDontSave,BOOL bNew,BOOL bReload,BOOL bNoEncDetect,LPCWSTR lp Style_SetLexer(hwndEdit,NULL); iEOLMode = iLineEndings[iDefaultEOLMode]; SendMessage(hwndEdit,SCI_SETEOLMODE,iLineEndings[iDefaultEOLMode],0); - if (iSrcEncoding != CPI_NONE) { - Encoding_Current(iSrcEncoding); - iOriginalEncoding = iSrcEncoding; + if (Encoding_Source(CPI_GET) != CPI_NONE) { + Encoding_Current(Encoding_Source(CPI_GET)); + Encoding_HasChanged(Encoding_Source(CPI_GET)); } else { Encoding_Current(iDefaultEncoding); - iOriginalEncoding = iDefaultEncoding; + Encoding_HasChanged(iDefaultEncoding); } Encoding_SciSetCodePage(hwndEdit,Encoding_Current(CPI_GET)); bReadOnly = FALSE; @@ -7365,9 +7384,9 @@ BOOL FileLoad(BOOL bDontSave,BOOL bNew,BOOL bReload,BOOL bNoEncDetect,LPCWSTR lp return FALSE; } else { - int fileEncoding; + int fileEncoding = Encoding_Current(CPI_GET); fSuccess = FileIO(TRUE,szFileName,bNoEncDetect,&fileEncoding,&iEOLMode,&bUnicodeErr,&bFileTooBig,NULL,FALSE); - Encoding_Current(fileEncoding); + Encoding_Current(fileEncoding); // load may change encoding } if (fSuccess) { StringCchCopy(szCurFile,COUNTOF(szCurFile),szFileName); @@ -7378,7 +7397,7 @@ BOOL FileLoad(BOOL bDontSave,BOOL bNew,BOOL bReload,BOOL bNoEncDetect,LPCWSTR lp if (!flagLexerSpecified) // flag will be cleared Style_SetLexerFromFile(hwndEdit,szCurFile); UpdateLineNumberWidth(); - iOriginalEncoding = Encoding_Current(CPI_GET); + Encoding_HasChanged(Encoding_Current(CPI_GET)); bModified = FALSE; //bReadOnly = FALSE; SendMessage(hwndEdit,SCI_SETEOLMODE,iEOLMode,0); @@ -7386,7 +7405,7 @@ BOOL FileLoad(BOOL bDontSave,BOOL bNew,BOOL bReload,BOOL bNoEncDetect,LPCWSTR lp if (flagUseSystemMRU == 2) SHAddToRecentDocs(SHARD_PATHW,szFileName); SetWindowTitle(hwndMain,uidsAppTitle,fIsElevated,IDS_UNTITLED,szFileName, - iPathNameFormat,bModified || Encoding_Current(CPI_GET) != iOriginalEncoding, + iPathNameFormat,bModified || Encoding_HasChanged(CPI_GET), IDS_READONLY,bReadOnly,szTitleExcerpt); // Install watching of the current file @@ -7452,7 +7471,7 @@ BOOL FileSave(BOOL bSaveAlways,BOOL bAsk,BOOL bSaveAs,BOOL bSaveCopy) } } - if (!bSaveAlways && (!bModified && (Encoding_Current(CPI_GET) == iOriginalEncoding) || bIsEmptyNewFile) && !bSaveAs) + if (!bSaveAlways && (!bModified && !Encoding_HasChanged(CPI_GET) || bIsEmptyNewFile) && !bSaveAs) return TRUE; if (bAsk) @@ -7480,7 +7499,7 @@ BOOL FileSave(BOOL bSaveAlways,BOOL bAsk,BOOL bSaveAs,BOOL bSaveCopy) bReadOnly = (dwFileAttributes & FILE_ATTRIBUTE_READONLY); if (bReadOnly) { SetWindowTitle(hwndMain,uidsAppTitle,fIsElevated,IDS_UNTITLED,szCurFile, - iPathNameFormat,bModified || Encoding_Current(CPI_GET) != iOriginalEncoding, + iPathNameFormat,bModified || Encoding_HasChanged(CPI_GET), IDS_READONLY,bReadOnly,szTitleExcerpt); if (MsgBox(MBYESNOWARN,IDS_READONLY_SAVE,szCurFile) == IDYES) bSaveAs = TRUE; @@ -7503,9 +7522,9 @@ BOOL FileSave(BOOL bSaveAlways,BOOL bAsk,BOOL bSaveAs,BOOL bSaveCopy) if (SaveFileDlg(hwndMain,tchFile,COUNTOF(tchFile),tchInitialDir)) { - int fileEncoding; + int fileEncoding = Encoding_Current(CPI_GET); fSuccess = FileIO(FALSE, tchFile, FALSE, &fileEncoding, &iEOLMode, NULL, NULL, &bCancelDataLoss, bSaveCopy); - Encoding_Current(fileEncoding); + //~Encoding_Current(fileEncoding); // save should not change encoding if (fSuccess) { if (!bSaveCopy) @@ -7530,21 +7549,21 @@ BOOL FileSave(BOOL bSaveAlways,BOOL bAsk,BOOL bSaveAs,BOOL bSaveCopy) } else { - int fileEncoding; + int fileEncoding = Encoding_Current(CPI_GET); fSuccess = FileIO(FALSE,szCurFile,FALSE,&fileEncoding,&iEOLMode,NULL,NULL,&bCancelDataLoss,FALSE); - Encoding_Current(fileEncoding); + //~Encoding_Current(fileEncoding); // save should not change encoding } if (fSuccess) { if (!bSaveCopy) { bModified = FALSE; - iOriginalEncoding = Encoding_Current(CPI_GET); + Encoding_HasChanged(Encoding_Current(CPI_GET)); MRU_AddFile(pFileMRU,szCurFile,flagRelativeFileMRU,flagPortableMyDocs); if (flagUseSystemMRU == 2) SHAddToRecentDocs(SHARD_PATHW,szCurFile); SetWindowTitle(hwndMain,uidsAppTitle,fIsElevated,IDS_UNTITLED,szCurFile, - iPathNameFormat,bModified || Encoding_Current(CPI_GET) != iOriginalEncoding, + iPathNameFormat,bModified || Encoding_HasChanged(CPI_GET), IDS_READONLY,bReadOnly,szTitleExcerpt); // Install watching of the current file @@ -7560,7 +7579,7 @@ BOOL FileSave(BOOL bSaveAlways,BOOL bAsk,BOOL bSaveAs,BOOL bSaveCopy) StringCchCopy(tchFile,COUNTOF(tchFile),szCurFile); SetWindowTitle(hwndMain,uidsAppTitle,fIsElevated,IDS_UNTITLED,szCurFile, - iPathNameFormat,bModified || Encoding_Current(CPI_GET) != iOriginalEncoding, + iPathNameFormat,bModified || Encoding_HasChanged(CPI_GET), IDS_READONLY,bReadOnly,szTitleExcerpt); MsgBox(MBWARN,IDS_ERR_SAVEFILE,tchFile); @@ -8172,7 +8191,7 @@ void SetNotifyIconTitle(HWND hwnd) else GetString(IDS_UNTITLED,tchTitle,COUNTOF(tchTitle)-4); - if (bModified || Encoding_Current(CPI_GET) != iOriginalEncoding) + if (bModified || Encoding_HasChanged(CPI_GET)) StringCchCopy(nid.szTip,COUNTOF(nid.szTip),L"* "); else StringCchCopy(nid.szTip,COUNTOF(nid.szTip),L""); diff --git a/src/Notepad3.h b/src/Notepad3.h index 850dd6266..d2f8a625a 100644 --- a/src/Notepad3.h +++ b/src/Notepad3.h @@ -41,7 +41,7 @@ typedef struct np3params { } np3params, *LPnp3params; -#define MAX_SELUNDO 512 +#define MAX_SELUNDO 1024 typedef struct _undoSel { int anchorPos_undo; diff --git a/src/Notepad3.rc b/src/Notepad3.rc index b5e3373f3..6547a7497 100644 Binary files a/src/Notepad3.rc and b/src/Notepad3.rc differ