Merge pull request #4922 from RaiKoHoff/Dev_Master

Fix recoding for UTF-16
This commit is contained in:
Pairi Daiza 2023-07-10 07:59:47 +02:00 committed by GitHub
commit a75bdaa904
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 84 additions and 117 deletions

View File

@ -3830,53 +3830,29 @@ CASE_WM_CTLCOLOR_SET:
//
// SelectEncodingDlg()
//
bool SelectEncodingDlg(HWND hwnd, cpi_enc_t* pidREncoding)
bool SelectEncodingDlg(HWND hwnd, cpi_enc_t* pidREncoding, bool bRecode)
{
ENCODEDLG dd = { 0 };
dd.bRecodeOnly = false;
dd.bRecodeOnly = bRecode;
dd.idEncoding = *pidREncoding;
dd.cxDlg = Settings.EncodingDlgSizeX;
dd.cyDlg = Settings.EncodingDlgSizeY;
dd.cxDlg = bRecode ? Settings.RecodeDlgSizeX : Settings.EncodingDlgSizeX;
dd.cyDlg = bRecode ? Settings.RecodeDlgSizeY : Settings.EncodingDlgSizeY;
INT_PTR const iResult = ThemedDialogBoxParam(
Globals.hLngResContainer,
MAKEINTRESOURCE(IDD_MUI_ENCODING),
MAKEINTRESOURCE(bRecode ? IDD_MUI_RECODE : IDD_MUI_ENCODING),
hwnd,
SelectEncodingDlgProc,
(LPARAM)&dd);
Settings.EncodingDlgSizeX = dd.cxDlg;
Settings.EncodingDlgSizeY = dd.cyDlg;
if (IsYesOkay(iResult)) {
*pidREncoding = dd.idEncoding;
return TRUE;
if (bRecode) {
Settings.RecodeDlgSizeX = dd.cxDlg;
Settings.RecodeDlgSizeY = dd.cyDlg;
}
else {
Settings.EncodingDlgSizeX = dd.cxDlg;
Settings.EncodingDlgSizeY = dd.cyDlg;
}
return FALSE;
}
//=============================================================================
//
// RecodeDlg()
//
bool RecodeDlg(HWND hwnd, cpi_enc_t* pidREncoding)
{
ENCODEDLG dd = { 0 };
dd.bRecodeOnly = true;
dd.idEncoding = *pidREncoding;
dd.cxDlg = Settings.RecodeDlgSizeX;
dd.cyDlg = Settings.RecodeDlgSizeY;
INT_PTR const iResult = ThemedDialogBoxParam(
Globals.hLngResContainer,
MAKEINTRESOURCE(IDD_MUI_RECODE),
hwnd,
SelectEncodingDlgProc,
(LPARAM)&dd);
Settings.RecodeDlgSizeX = dd.cxDlg;
Settings.RecodeDlgSizeY = dd.cyDlg;
if (IsYesOkay(iResult)) {
*pidREncoding = dd.idEncoding;

View File

@ -57,8 +57,7 @@ bool WordWrapSettingsDlg(HWND hwnd,UINT uidDlg,int * iNumber);
bool LongLineSettingsDlg(HWND hwnd,UINT uidDlg, LPWSTR pColList);
bool TabSettingsDlg(HWND hwnd,UINT uidDlg,int * iNumber);
bool SelectDefEncodingDlg(HWND hwnd, cpi_enc_t* pidREncoding);
bool SelectEncodingDlg(HWND hwnd, cpi_enc_t* pidREncoding);
bool RecodeDlg(HWND hwnd, cpi_enc_t* pidREncoding);
bool SelectEncodingDlg(HWND hwnd, cpi_enc_t* pidREncoding, bool bRecode);
bool SelectDefLineEndingDlg(HWND hwnd,LPARAM piOption);
bool WarnLineEndingDlg(HWND hwnd, EditFileIOStatus* fioStatus);
bool WarnIndentationDlg(HWND hwnd, EditFileIOStatus* fioStatus);

View File

@ -1430,14 +1430,12 @@ bool EditLoadFile(
EditDetectEOLMode(lpData, cbData, status);
FreeMem(lpDataWide);
} else {
Encoding_Forced(CPI_NONE);
FreeMem(lpDataWide);
FreeMem(lpData);
bReadSuccess = false;
goto observe;
}
} else {
Encoding_Forced(CPI_NONE);
FreeMem(lpDataWide);
FreeMem(lpData);
bReadSuccess = false;
@ -1452,14 +1450,12 @@ bool EditLoadFile(
SciCall_SetCharacterCategoryOptimization(Encoding_IsCJK(encDetection.analyzedEncoding) ? 0x10000 : 0x1000);
Encoding_Forced(CPI_NONE);
FreeMem(lpData);
observe:
Encoding_Forced(CPI_NONE);
EndWaitCursor();
return bReadSuccess;
}
@ -1945,7 +1941,7 @@ void EditURLEncode(const bool isPathConvert)
SciCall_TargetFromSelection();
Sci_ReplaceTargetTestChgHist(cchEscapedEnc, pszEscaped);
EditSetAndScrollSelection(iSelStart, iSelStart + cchEscapedEnc, bStraightSel);
Sci_SetStreamSelection(iSelStart, iSelStart + cchEscapedEnc, bStraightSel);
EndUndoTransAction();
@ -2022,7 +2018,7 @@ void EditURLDecode(const bool isPathConvert)
SciCall_TargetFromSelection();
Sci_ReplaceTargetTestChgHist(cchUnescapedDec, pszUnescaped);
EditSetAndScrollSelection(iSelStart, iSelStart + cchUnescapedDec, bStraightSel);
Sci_SetStreamSelection(iSelStart, iSelStart + cchUnescapedDec, bStraightSel);
EndUndoTransAction();
}
@ -2077,7 +2073,7 @@ void EditReplaceAllChr(const WCHAR chSearch, const WCHAR chReplace) {
SciCall_TargetFromSelection();
Sci_ReplaceTargetTestChgHist(cchRepl, pchReplace);
EditSetAndScrollSelection(iSelStart, iSelEnd, bStraightSel);
Sci_SetStreamSelection(iSelStart, iSelEnd, bStraightSel);
EndUndoTransAction();
@ -2151,10 +2147,9 @@ void EditBase64Code(HWND hwnd, const bool bEncode, cpi_enc_t cpi) {
DocPos const len = (base64Size ? Sci_ReplaceTargetTestChgHist(base64Size, pBase64CodedTxt) : SciCall_ReplaceTarget(0, ""));
FreeMem(pBase64CodedTxt);
EditSetAndScrollSelection(iSelStart, iSelStart + len, bStraightSel);
Sci_SetStreamSelection(iSelStart, iSelStart + len, bStraightSel);
EndUndoTransAction();
}
@ -2378,7 +2373,6 @@ void EditFindMatchingBrace()
if (iMatchingBracePos != (DocPos)-1) {
iMatchingBracePos = bIsAfter ? iMatchingBracePos : SciCall_PositionAfter(iMatchingBracePos);
Sci_GotoPosChooseCaret(iMatchingBracePos);
Sci_ScrollSelectionToView();
}
}
@ -3714,7 +3708,7 @@ void EditEncloseSelection(LPCWSTR pszOpen, LPCWSTR pszClose) {
}
// Move selection
EditSetAndScrollSelection(iSelStart + iLenOpen, iSelEnd + iLenOpen, bStraightSel);
Sci_SetStreamSelection(iSelStart + iLenOpen, iSelEnd + iLenOpen, bStraightSel);
EndUndoTransAction();
@ -3835,10 +3829,9 @@ void EditToggleLineCommentsSimple(LPCWSTR pwszComment, bool bInsertAtStart, LnCm
}
}
EditSetAndScrollSelection(iSelStart + iSelStartOffset, iSelEnd + iSelEndOffset, bStraightSel);
Sci_SetStreamSelection(iSelStart + iSelStartOffset, iSelEnd + iSelEndOffset, bStraightSel);
EndUndoTransAction();
}
@ -5358,21 +5351,6 @@ void EditSortLines(HWND hwnd, int iSortFlags)
}
//=============================================================================
//
// EditSetAndScrollSelection()
//
void EditSetAndScrollSelection(DocPos iSelStart, DocPos iSelEnd, bool bStraightSel)
{
SciCall_SetSelectionStart(iSelStart);
SciCall_SetSelectionEnd(iSelEnd);
if (!bStraightSel) {
SciCall_SwapMainAnchorCaret();
}
Sci_ScrollSelectionToView();
}
//=============================================================================
//
// EditSetSelectionEx()
@ -5452,7 +5430,6 @@ void EditJumpTo(DocLn iNewLine, DocPos iNewCol)
iNewCol = clampp((iNewCol - colOffset), 0, iLineEndPos);
Sci_GotoPosChooseCaret(SciCall_FindColumn(iNewLine, iNewCol));
Sci_ScrollSelectionToView();
}

View File

@ -93,7 +93,6 @@ void EditJoinLinesEx(bool,bool);
void EditSortLines(HWND hwnd,int iSortFlags);
void EditJumpTo(DocLn iNewLine, DocPos iNewCol);
void EditSetAndScrollSelection(DocPos iSelStart, DocPos iSelEnd, bool bStraightSel);
void EditSetSelectionEx(DocPos iAnchorPos, DocPos iCurrentPos, DocPos vSpcAnchor, DocPos vSpcCurrent);
void EditFixPositions();
void EditEnsureConsistentLineEndings(HWND hwnd);

View File

@ -90,7 +90,7 @@ cpi_enc_t Encoding_Forced(cpi_enc_t iEncoding)
if (Encoding_IsValid(iEncoding)) {
SourceEncoding = iEncoding;
} else {
SourceEncoding = CPI_ANSI_DEFAULT;
SourceEncoding = Settings.DefaultEncoding;
}
} else if (iEncoding == CPI_NONE) {
SourceEncoding = CPI_NONE;
@ -108,7 +108,7 @@ cpi_enc_t Encoding_SrcWeak(cpi_enc_t iSrcWeakEnc)
if (Encoding_IsValid(iSrcWeakEnc)) {
SourceWeakEncoding = iSrcWeakEnc;
} else {
SourceWeakEncoding = CPI_ANSI_DEFAULT;
SourceWeakEncoding = Settings.DefaultEncoding;
}
} else if (iSrcWeakEnc == CPI_NONE) {
SourceWeakEncoding = CPI_NONE;
@ -204,7 +204,7 @@ int Encoding_MapIniSetting(bool bLoad, int iSetting)
return (int)i;
}
}
return CPI_ANSI_DEFAULT;
return Settings.DefaultEncoding;
}
}
} else {
@ -233,7 +233,7 @@ int Encoding_MapIniSetting(bool bLoad, int iSetting)
if (Encoding_IsValid((cpi_enc_t)iSetting)) {
return (int)g_Encodings[iSetting].uCodePage;
}
return CPI_ANSI_DEFAULT;
return Settings.DefaultEncoding;
}
}
}

View File

@ -1279,11 +1279,6 @@ extern "C" ENC_DET_T Encoding_DetectEncoding(const HPATHL hpath, const char* lpD
encDetRes.forcedEncoding = (Settings.LoadNFOasOEM && bNfoDizDetected) ? Globals.DOSEncoding : Encoding_Forced(CPI_GET);
encDetRes.bHasBOM = (bBOM_LE || bBOM_BE);
encDetRes.bIsReverse = bBOM_BE;
encDetRes.bIsUTF8Sig = ((cbData >= 3) ? IsUTF8Signature(lpData) : false);
encDetRes.bValidUTF8 = IsValidUTF8(lpData, cbData);
if (!IS_ENC_ENFORCED()) {
// force file vars ?
encDetRes.fileVarEncoding = (FileVars_IsValidEncoding(&Globals.fvCurFile)) ? FileVars_GetEncoding(&Globals.fvCurFile) : CPI_NONE;
@ -1292,6 +1287,11 @@ extern "C" ENC_DET_T Encoding_DetectEncoding(const HPATHL hpath, const char* lpD
}
}
encDetRes.bHasBOM = (bBOM_LE || bBOM_BE) || (IS_ENC_ENFORCED() && (g_Encodings[encDetRes.forcedEncoding].uFlags & NCP_UNICODE_BOM));
encDetRes.bIsReverse = bBOM_BE || (IS_ENC_ENFORCED() && (g_Encodings[encDetRes.forcedEncoding].uFlags & NCP_UNICODE_REVERSE));
encDetRes.bIsUTF8Sig = ((cbData >= 3) ? IsUTF8Signature(lpData) : false) || (IS_ENC_ENFORCED() && (g_Encodings[encDetRes.forcedEncoding].uFlags & NCP_UTF8_SIGN));
encDetRes.bValidUTF8 = IsValidUTF8(lpData, cbData);
// --- 2nd Use Encoding Analysis if applicable
size_t const cbNbytes4Analysis = min_s(cbData, 200000LL);

View File

@ -5014,7 +5014,7 @@ LRESULT MsgCommand(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam)
(cpi_enc_t)(HIWORD(wParam) - IDM_ENCODING_SELECT) : Encoding_GetCurrent();
if (iLoWParam == IDM_ENCODING_SELECT) {
if ((HIWORD(wParam) < IDM_ENCODING_SELECT) && !SelectEncodingDlg(hwnd, &iNewEncoding)) {
if ((HIWORD(wParam) < IDM_ENCODING_SELECT) && !SelectEncodingDlg(hwnd, &iNewEncoding, false)) {
break; // no change
}
} else {
@ -5033,7 +5033,6 @@ LRESULT MsgCommand(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam)
break;
case IDM_ENCODING_ANSI:
iNewEncoding = CPI_ANSI_DEFAULT;
break;
}
}
BeginWaitCursorUID(Flags.bHugeFileLoadState, IDS_MUI_SB_RECODING_DOC);
@ -5056,7 +5055,7 @@ LRESULT MsgCommand(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam)
break;
}
}
if (RecodeDlg(hwnd,&iNewEncoding)) {
if (SelectEncodingDlg(hwnd, &iNewEncoding, true)) {
Encoding_Forced(iNewEncoding);
FileLoadFlags const fLoadFlags = FLF_DontSave | FLF_Reload | FLF_SkipUnicodeDetect | FLF_SkipANSICPDetection;
FileLoad(Paths.CurrentFile, fLoadFlags);
@ -5667,7 +5666,7 @@ LRESULT MsgCommand(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam)
case IDM_EDIT_B64DECODESEL: {
cpi_enc_t iEncoding = Encoding_GetCurrent();
if (!SelectEncodingDlg(hwnd, &iEncoding)) {
if (!SelectEncodingDlg(hwnd, &iEncoding, false)) {
break; // no selection
}
EditBase64Code(Globals.hwndEdit, false, iEncoding);
@ -6736,7 +6735,6 @@ LRESULT MsgCommand(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam)
if ((!SciCall_IsSelectionEmpty() || Sci_IsMultiOrRectangleSelection()) && (skipLevel == Settings2.ExitOnESCSkipLevel)) {
Sci_GotoPosChooseCaret(iCurPos);
Sci_ScrollSelectionToView();
skipLevel -= Default_ExitOnESCSkipLevel;
}
@ -6752,7 +6750,6 @@ LRESULT MsgCommand(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam)
default:
Sci_GotoPosChooseCaret(iCurPos);
Sci_ScrollSelectionToView();
break;
}
}
@ -11391,7 +11388,7 @@ bool FileLoad(const HPATHL hfile_pth, const FileLoadFlags fLoadFlags)
EditFileIOStatus fioStatus = INIT_FILEIO_STATUS;
fioStatus.iEOLMode = Settings.DefaultEOLMode;
fioStatus.iEncoding = CPI_ANSI_DEFAULT;
fioStatus.iEncoding = Settings.DefaultEncoding;
if (!(fLoadFlags & FLF_DontSave)) {
if (!FileSave(FSF_Ask)) {
@ -11626,7 +11623,8 @@ bool FileLoad(const HPATHL hfile_pth, const FileLoadFlags fLoadFlags)
// set historic caret/selection pos
if (!FileWatching.MonitoringLog && (s_flagChangeNotify != FWM_AUTORELOAD)) {
if ((iCaretPos >= 0) && (iAnchorPos >= 0)) {
EditSetAndScrollSelection(iAnchorPos, iCaretPos, true);
Sci_SetStreamSelection(iAnchorPos, iCaretPos, true);
Sci_ScrollSelectionToView();
}
else {
Sci_GotoPosChooseCaret(0);
@ -11642,7 +11640,7 @@ bool FileLoad(const HPATHL hfile_pth, const FileLoadFlags fLoadFlags)
Globals.bDocHasInconsistentEOLs = fioStatus.bInconsistentEOLs;
bool const bCheckFile = !Globals.CmdLnFlag_PrintFileAndLeave && !fioStatus.bEncryptedRaw && !(fioStatus.bUnknownExt && bUnknownLexer) && !bReloadFile;
//&& (fioStatus.iEncoding == CPI_ANSI_DEFAULT) ???
//&& (fioStatus.iEncoding == Settings.DefaultEncoding) ???
bool const bCheckEOL = bCheckFile && Globals.bDocHasInconsistentEOLs && Settings.WarnInconsistEOLs;
@ -12748,7 +12746,6 @@ LRESULT MsgFileChangeNotify(HWND hwnd, WPARAM wParam, LPARAM lParam)
}
else {
Sci_GotoPosChooseCaret(iCurPos);
Sci_ScrollSelectionToView();
}
}
}

View File

@ -804,6 +804,7 @@ __forceinline bool Sci_IsValidPos(DocPos pos, bool fwd)
{
return (pos == ((pos > 0) ? (fwd ? SciCall_PositionAfter(SciCall_PositionBefore(pos)) : SciCall_PositionBefore(SciCall_PositionAfter(pos))) : pos));
}
// ----------------------------------------------------------------------------
// max. line length in range (incl. line-breaks)
inline DocPos Sci_GetRangeMaxLineLength(DocLn iBeginLine, DocLn iEndLine)
@ -817,32 +818,7 @@ inline DocPos Sci_GetRangeMaxLineLength(DocLn iBeginLine, DocLn iEndLine)
}
return iMaxLineLen;
}
// respect VSlop settings
__forceinline void Sci_GotoPosChooseCaret(const DocPos pos)
{
SciCall_GotoPos(pos);
SciCall_ChooseCaretX();
}
__forceinline void Sci_ScrollChooseCaret()
{
SciCall_ScrollCaret();
SciCall_ChooseCaretX();
}
inline void Sci_ScrollToLine(const DocLn line)
{
if (!SciCall_GetLineVisible(line)) {
SciCall_EnsureVisible(line);
}
SciCall_ScrollRange(SciCall_GetLineEndPosition(line), SciCall_PositionFromLine(line));
}
__forceinline void Sci_ScrollToCurrentLine()
{
Sci_ScrollToLine(Sci_GetCurrentLineNumber());
}
// ----------------------------------------------------------------------------
inline bool Sci_EnsureVisibleSelection()
{
@ -864,8 +840,9 @@ inline bool Sci_EnsureVisibleSelection()
}
return bMoveViewToCaret;
}
// ----------------------------------------------------------------------------
__forceinline void Sci_ScrollSelectionToView()
inline void Sci_ScrollSelectionToView()
{
if (Sci_EnsureVisibleSelection()) {
SciCall_ScrollToEnd(); // (!) jump at top-slope not bottom-slope
@ -873,6 +850,47 @@ __forceinline void Sci_ScrollSelectionToView()
//~SciCall_ScrollRange(SciCall_GetAnchor(), SciCall_GetCurrentPos());
SciCall_ScrollRange(SciCall_GetCurrentPos(), SciCall_GetAnchor());
}
// ----------------------------------------------------------------------------
// respect VSlop settings
inline void Sci_GotoPosChooseCaret(const DocPos pos)
{
SciCall_GotoPos(pos);
Sci_ScrollSelectionToView();
SciCall_ChooseCaretX();
}
// ----------------------------------------------------------------------------
__forceinline void Sci_ScrollChooseCaret()
{
SciCall_ScrollCaret();
SciCall_ChooseCaretX();
}
// ----------------------------------------------------------------------------
inline void Sci_ScrollToLine(const DocLn line)
{
if (!SciCall_GetLineVisible(line)) {
SciCall_EnsureVisible(line);
}
SciCall_ScrollRange(SciCall_GetLineEndPosition(line), SciCall_PositionFromLine(line));
}
// ----------------------------------------------------------------------------
#define Sci_ScrollToCurrentLine() Sci_ScrollToLine(Sci_GetCurrentLineNumber())
// ----------------------------------------------------------------------------
inline void Sci_SetStreamSelection(DocPos iSelStart, DocPos iSelEnd, bool bStraightSel)
{
SciCall_SetSelectionStart(iSelStart);
SciCall_SetSelectionEnd(iSelEnd);
if (!bStraightSel) {
SciCall_SwapMainAnchorCaret();
}
SciCall_ChooseCaretX();
}
// ----------------------------------------------------------------------------
__forceinline void Sci_SetCaretScrollDocEnd()
{
@ -880,6 +898,7 @@ __forceinline void Sci_SetCaretScrollDocEnd()
//~SciCall_ScrollToEnd();
SciCall_ScrollCaret(); // enforce visible slop policy
}
// ----------------------------------------------------------------------------
__forceinline void Sci_RedrawScrollbars()
{
@ -888,6 +907,7 @@ __forceinline void Sci_RedrawScrollbars()
SciCall_SetVScrollbar(false);
SciCall_SetVScrollbar(true);
}
// ----------------------------------------------------------------------------
// if iRangeEnd == -1 : apply style from iRangeStart to document end
@ -1001,6 +1021,7 @@ __forceinline DocPos Sci_ReplaceTargetTestChgHist(const DocPos length, const cha
{
return SciCall_GetChangeHistory() ? SciCall_ReplaceTargetMinimal(length, text) : SciCall_ReplaceTarget(length, text);
}
// ----------------------------------------------------------------------------
inline DocPos Sci_ReplaceTargetEx(const int mode, const DocPos length, const char* text)
{
@ -1014,7 +1035,6 @@ inline DocPos Sci_ReplaceTargetEx(const int mode, const DocPos length, const cha
return SciCall_ReplaceTarget(length, text);
}
}
// ----------------------------------------------------------------------------
inline LRESULT Sci_ForceNotifyUpdateUI(HWND hwnd, uptr_t idc)
@ -1026,7 +1046,6 @@ inline LRESULT Sci_ForceNotifyUpdateUI(HWND hwnd, uptr_t idc)
scn.updated = SC_UPDATE_CONTENT;
return SendMessageW(hwnd, WM_NOTIFY, idc, (LPARAM)&scn);
}
// ----------------------------------------------------------------------------
//=============================================================================