OSDN Git Service

Add BOM checkbox to the LoadSaveCodepage dialog
authorTakashi Sawanaka <sdottaka@users.sourceforge.net>
Thu, 11 Mar 2021 15:43:21 +0000 (00:43 +0900)
committerTakashi Sawanaka <sdottaka@users.sourceforge.net>
Thu, 11 Mar 2021 15:43:21 +0000 (00:43 +0900)
Src/LoadSaveCodepageDlg.cpp
Src/LoadSaveCodepageDlg.h
Src/Merge.rc
Src/MergeDocEncoding.cpp
Src/resource.h
Translations/WinMerge/StringBlacklist.txt

index 47d703c..6f8988f 100644 (file)
@@ -25,6 +25,7 @@ CLoadSaveCodepageDlg::CLoadSaveCodepageDlg(int nFiles, CWnd* pParent /*= nullptr
 , m_bLoadSaveSameCodepage(true)
 // String m_sAffectsLeftString
 // String m_sAffectsRightString
+, m_bSaveCodepageBOM(false)
 , m_nLoadCodepage(-1)
 , m_nSaveCodepage(-1)
 , m_bEnableSaveCodepage(false)
@@ -55,6 +56,7 @@ void CLoadSaveCodepageDlg::DoDataExchange(CDataExchange* pDX)
        DDX_Control(pDX, IDC_AFFECTS_RIGHT_BTN, m_AffectsRightBtn);
        DDX_Text(pDX, IDC_LOAD_CODEPAGE_TEXTBOX, m_nLoadCodepage);
        DDX_Text(pDX, IDC_SAVE_CODEPAGE_TEXTBOX, m_nSaveCodepage);
+       DDX_Check(pDX, IDC_SAVE_CODEPAGE_BOM, m_bSaveCodepageBOM);
        //}}AFX_DATA_MAP
 }
 
@@ -190,6 +192,7 @@ void CLoadSaveCodepageDlg::UpdateSaveGroup()
                EnableDlgItem(IDC_LOAD_SAVE_SAME_CODEPAGE, false);
        bool EnableSave = m_bEnableSaveCodepage && !m_bLoadSaveSameCodepage;
        EnableDlgItem(IDC_SAVE_CODEPAGE_TEXTBOX, EnableSave);
+       EnableDlgItem(IDC_SAVE_CODEPAGE_BOM, EnableSave);
 }
 
 /**
index 56f0a16..8baf7fa 100644 (file)
@@ -19,10 +19,12 @@ public:
        void SetLeftRightAffectStrings(const String & sAffectsLeft, const String & sAffectsMiddle, const String & sAffectsRight);
        void EnableSaveCodepage(bool enable) { m_bEnableSaveCodepage = enable; }
        void SetCodepages(int codepage) { m_nLoadCodepage = m_nSaveCodepage = codepage; }
+       void SetCodepageBOM(bool bom) { m_bSaveCodepageBOM = bom; }
 
 // Reading results
        int GetLoadCodepage() const { return m_nLoadCodepage; }
        int GetSaveCodepage() const { return m_nSaveCodepage; }
+       bool GetSaveCodepageBOM() const { return m_bSaveCodepageBOM; }
        bool DoesAffectLeft() const { return m_bAffectsLeft; }
        bool DoesAffectMiddle() const { return m_bAffectsMiddle; }
        bool DoesAffectRight() const { return m_bAffectsRight; }
@@ -51,6 +53,7 @@ private:
        String m_sAffectsRightString;
        int m_nLoadCodepage;
        int m_nSaveCodepage;
+       bool m_bSaveCodepageBOM;
        bool m_bEnableSaveCodepage;
        int m_nFiles;
 
index 979accb..4228523 100644 (file)
@@ -1751,7 +1751,7 @@ BEGIN
     DEFPUSHBUTTON   "Close",IDOK,200,193,50,14\r
 END\r
 \r
-IDD_LOAD_SAVE_CODEPAGE DIALOGEX 0, 0, 278, 150\r
+IDD_LOAD_SAVE_CODEPAGE DIALOGEX 0, 0, 278, 163\r
 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU\r
 CAPTION "Codepage"\r
 FONT 8, "MS Shell Dlg", 0, 0, 0x1\r
@@ -1763,15 +1763,17 @@ BEGIN
     LTEXT           "(Affects)",IDC_MIDDLE_FILES_LABEL,70,29,193,10\r
     CONTROL         "&Right",IDC_AFFECTS_RIGHT_BTN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,40,54,10\r
     LTEXT           "(Affects)",IDC_RIGHT_FILES_LABEL,70,40,193,10\r
-    GROUPBOX        "Select Codepage for",IDC_LOADING_GROUP,5,59,266,63\r
+    GROUPBOX        "Select Codepage for",IDC_LOADING_GROUP,5,59,266,76\r
     LTEXT           "&File Loading:",IDC_LOAD_FILES_LABEL,12,75,172,10\r
     COMBOBOX        IDC_LOAD_CODEPAGE_TEXTBOX,86,74,165,12,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP\r
     LTEXT           "File &Saving:",IDC_SAVE_FILES_LABEL,12,90,67,10\r
     COMBOBOX        IDC_SAVE_CODEPAGE_TEXTBOX,86,90,165,12,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP\r
+    CONTROL         "&BOM",IDC_SAVE_CODEPAGE_BOM,\r
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,86,107,165,10\r
     CONTROL         "&Use same codepage for both",IDC_LOAD_SAVE_SAME_CODEPAGE,\r
-                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,107,250,10\r
-    DEFPUSHBUTTON   "&Ok",IDOK,165,128,50,14\r
-    PUSHBUTTON      "&Cancel",IDCANCEL,221,128,50,14\r
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,120,250,10\r
+    DEFPUSHBUTTON   "&Ok",IDOK,165,141,50,14\r
+    PUSHBUTTON      "&Cancel",IDCANCEL,221,141,50,14\r
 END\r
 \r
 IDD_TEST_FILTER DIALOGEX 0, 0, 249, 142\r
index 3106c22..b594db5 100644 (file)
@@ -13,6 +13,7 @@
 
 #include "stdafx.h"
 #include "MergeDoc.h"
+#include "MergeEditView.h"
 #include "LoadSaveCodepageDlg.h"
 #include "unicoder.h"
 
@@ -32,6 +33,7 @@ bool CMergeDoc::DoFileEncodingDialog()
        CLoadSaveCodepageDlg dlg(m_nBuffers);
        dlg.EnableSaveCodepage(true);
        dlg.SetCodepages(m_ptBuf[0]->getCodepage());
+       dlg.SetCodepageBOM(m_ptBuf[0]->getHasBom());
        if (IDOK != dlg.DoModal())
                return false;
 
@@ -48,8 +50,17 @@ bool CMergeDoc::DoFileEncodingDialog()
                    (pane == 1 && doMiddle && m_nBuffers == 3) ||
                    (pane == 2 && doRight  && m_nBuffers == 3))
                {
-                       fileloc[pane].encoding.m_unicoding = ucr::NONE;
-                       fileloc[pane].encoding.m_codepage = dlg.GetLoadCodepage();
+                       fileloc[pane].encoding.SetCodepage(dlg.GetLoadCodepage());
+                       switch (fileloc[pane].encoding.m_unicoding)
+                       {
+                       case ucr::UTF8:
+                       case ucr::UCS2LE:
+                       case ucr::UCS2BE:
+                               m_ptBuf[pane]->setHasBom(dlg.GetSaveCodepageBOM());
+                               break;
+                       default:
+                               break;
+                       }
                }
                else
                {
@@ -60,7 +71,7 @@ bool CMergeDoc::DoFileEncodingDialog()
        }
        OpenDocs(m_nBuffers, fileloc, bRO, m_strDesc);
        
-       if (dlg.GetSaveCodepage() != dlg.GetLoadCodepage())
+       if (dlg.GetSaveCodepage() != dlg.GetLoadCodepage() || m_ptBuf[0]->getHasBom() != dlg.GetSaveCodepageBOM())
        {
                int nSaveCodepage = dlg.GetSaveCodepage();
                for (int pane = 0; pane < m_nBuffers; pane++)
@@ -73,9 +84,20 @@ bool CMergeDoc::DoFileEncodingDialog()
                                (pane == 2 && doRight  && m_nBuffers == 3)
                                ))
                        {
+                               switch (nSaveCodepage)
+                               {
+                               case ucr::CP_UTF_8:
+                               case ucr::CP_UCS2LE:
+                               case ucr::CP_UCS2BE:
+                                       m_ptBuf[pane]->setHasBom(dlg.GetSaveCodepageBOM());
+                                       break;
+                               default:
+                                       break;
+                               }
                                m_ptBuf[pane]->setCodepage(nSaveCodepage);
                                m_ptBuf[pane]->SetModified();
                                UpdateHeaderPath(pane);
+                               ForEachView([](auto& pView) { pView->UpdateStatusbar(); });
                        }
                }
        }
index 9f72fb9..0d4ed81 100644 (file)
 #define IDC_LFILTER_ADDBTN              1321\r
 #define IDC_LFILTER_EDITBTN             1322\r
 #define IDC_LFILTER_REMOVEBTN           1323\r
-#define IDC_SUBSTITUTION_FILTERS 1324\r
+#define IDC_SUBSTITUTION_FILTERS        1324\r
+#define IDC_SAVE_CODEPAGE_BOM           1325\r
 #define IDC_ASK_MULTIWINDOW_CLOSE       1326\r
 #define IDC_COLDLG_LIST                 1327\r
 #define IDC_PRESERVE_FILETIME           1328\r