OSDN Git Service

refactor
[winmerge-jp/winmerge-jp.git] / Src / LoadSaveCodepageDlg.cpp
1 /** 
2  * @file  LoadSaveCodepageDlg.cpp
3  *
4  * @brief Implementation of the dialog used to select codepages
5  */
6
7 #include "stdafx.h"
8 #include "LoadSaveCodepageDlg.h"
9 #include "resource.h"
10 #include "ExConverter.h"
11
12 #ifdef _DEBUG
13 #define new DEBUG_NEW
14 #endif
15
16 /////////////////////////////////////////////////////////////////////////////
17 // CLoadSaveCodepageDlg dialog
18
19
20 CLoadSaveCodepageDlg::CLoadSaveCodepageDlg(int nFiles, CWnd* pParent /*= nullptr*/)
21 : CTrDialog(CLoadSaveCodepageDlg::IDD, pParent)
22 , m_bAffectsLeft(true)
23 , m_bAffectsMiddle(true)
24 , m_bAffectsRight(true)
25 , m_bLoadSaveSameCodepage(true)
26 // String m_sAffectsLeftString
27 // String m_sAffectsRightString
28 , m_bSaveCodepageBOM(false)
29 , m_nLoadCodepage(-1)
30 , m_nSaveCodepage(-1)
31 , m_bEnableSaveCodepage(false)
32 , m_nFiles(nFiles)
33 {
34         //{{AFX_DATA_INIT(CLoadSaveCodepageDlg)
35                 // NOTE: the ClassWizard will add member initialization here
36         //}}AFX_DATA_INIT
37 }
38
39 void CLoadSaveCodepageDlg::SetLeftRightAffectStrings(const String & sAffectsLeft, const String & sAffectsMiddle, const String & sAffectsRight)
40 {
41         m_sAffectsLeftString = sAffectsLeft;
42         m_sAffectsMiddleString = sAffectsMiddle;
43         m_sAffectsRightString = sAffectsRight;
44 }
45
46 void CLoadSaveCodepageDlg::DoDataExchange(CDataExchange* pDX)
47 {
48         CTrDialog::DoDataExchange(pDX);
49         //{{AFX_DATA_MAP(CLoadSaveCodepageDlg)
50         DDX_Check(pDX, IDC_AFFECTS_LEFT_BTN, m_bAffectsLeft);
51         DDX_Check(pDX, IDC_AFFECTS_MIDDLE_BTN, m_bAffectsMiddle);
52         DDX_Check(pDX, IDC_AFFECTS_RIGHT_BTN, m_bAffectsRight);
53         DDX_Check(pDX, IDC_LOAD_SAVE_SAME_CODEPAGE, m_bLoadSaveSameCodepage);
54         DDX_Control(pDX, IDC_AFFECTS_LEFT_BTN, m_AffectsLeftBtn);
55         DDX_Control(pDX, IDC_AFFECTS_MIDDLE_BTN, m_AffectsMiddleBtn);
56         DDX_Control(pDX, IDC_AFFECTS_RIGHT_BTN, m_AffectsRightBtn);
57         DDX_Text(pDX, IDC_LOAD_CODEPAGE_TEXTBOX, m_nLoadCodepage);
58         DDX_Text(pDX, IDC_SAVE_CODEPAGE_TEXTBOX, m_nSaveCodepage);
59         DDX_Check(pDX, IDC_SAVE_CODEPAGE_BOM, m_bSaveCodepageBOM);
60         //}}AFX_DATA_MAP
61 }
62
63
64 BEGIN_MESSAGE_MAP(CLoadSaveCodepageDlg, CTrDialog)
65         //{{AFX_MSG_MAP(CLoadSaveCodepageDlg)
66         ON_BN_CLICKED(IDC_AFFECTS_LEFT_BTN, OnAffectsLeftBtnClicked)
67         ON_BN_CLICKED(IDC_AFFECTS_MIDDLE_BTN, OnAffectsMiddleBtnClicked)
68         ON_BN_CLICKED(IDC_AFFECTS_RIGHT_BTN, OnAffectsRightBtnClicked)
69         ON_BN_CLICKED(IDC_LOAD_SAVE_SAME_CODEPAGE, OnLoadSaveSameCodepage)
70         ON_MESSAGE(WM_APP, OnLoadCodepages)
71         //}}AFX_MSG_MAP
72 END_MESSAGE_MAP()
73
74 /////////////////////////////////////////////////////////////////////////////
75 // CLoadSaveCodepageDlg message handlers
76
77 /**
78  * @brief Handler for WM_INITDIALOG; conventional location to initialize controls
79  * At this point dialog and control windows exist
80  */
81 BOOL CLoadSaveCodepageDlg::OnInitDialog() 
82 {
83         CTrDialog::OnInitDialog();
84
85         CenterWindow();
86
87         SetDlgItemText(IDC_LEFT_FILES_LABEL, m_sAffectsLeftString);
88         SetDlgItemText(IDC_MIDDLE_FILES_LABEL, m_sAffectsMiddleString);
89         SetDlgItemText(IDC_RIGHT_FILES_LABEL, m_sAffectsRightString);
90
91         UpdateSaveGroup();
92
93         if (m_nFiles < 3)
94                 EnableDlgItem(IDC_AFFECTS_MIDDLE_BTN, false);
95
96         m_asyncCodepagesLoader = Concurrent::CreateTask([hwnd = m_hWnd] {
97                         std::vector<CodePageInfo> cpi;
98                         IExconverter *pexconv = Exconverter::getInstance();
99                         if (pexconv != nullptr)
100                                 cpi = pexconv->enumCodePages();
101                         ::PostMessage(hwnd, WM_APP, 0, 0);
102                         return cpi;
103                 });
104
105         return FALSE;  // return TRUE unless you set the focus to a control
106                       // EXCEPTION: OCX Property Pages should return FALSE
107 }
108
109 /**
110  * @brief If user unchecks left, then check right (to ensure never have nothing checked)
111  */
112 void CLoadSaveCodepageDlg::OnAffectsLeftBtnClicked()
113 {
114         if (m_AffectsLeftBtn.GetCheck() != BST_CHECKED)
115         {
116                 if (m_nFiles < 3)
117                         m_AffectsRightBtn.SetCheck(BST_CHECKED);
118                 else
119                 {
120                         if (m_AffectsMiddleBtn.GetCheck() != BST_CHECKED)
121                         {
122                                 if (m_AffectsRightBtn.GetCheck() != BST_CHECKED)
123                                         m_AffectsRightBtn.SetCheck(BST_CHECKED);
124                         }
125                 }
126         }
127 }
128
129 /**
130  * @brief If user unchecks middle, then check right (to ensure never have nothing checked)
131  */
132 void CLoadSaveCodepageDlg::OnAffectsMiddleBtnClicked()
133 {
134         if (m_AffectsMiddleBtn.GetCheck() != BST_CHECKED)
135         {
136                 if (m_AffectsLeftBtn.GetCheck() != BST_CHECKED)
137                 {
138                         if (m_AffectsRightBtn.GetCheck() != BST_CHECKED)
139                                 m_AffectsLeftBtn.SetCheck(BST_CHECKED);
140                 }
141         }
142 }
143
144 /**
145  * @brief If user unchecks right, then check left (to ensure never have nothing checked)
146  */
147 void CLoadSaveCodepageDlg::OnAffectsRightBtnClicked()
148 {
149         if (m_AffectsRightBtn.GetCheck() != BST_CHECKED)
150         {
151                 if (m_nFiles < 3)
152                         m_AffectsLeftBtn.SetCheck(BST_CHECKED);
153                 else
154                 {
155                         if (m_AffectsMiddleBtn.GetCheck() != BST_CHECKED)
156                         {
157                                 if (m_AffectsLeftBtn.GetCheck() != BST_CHECKED)
158                                         m_AffectsLeftBtn.SetCheck(BST_CHECKED);
159                         }
160                 }
161         }
162 }
163
164 /**
165  * @brief Disable save group if save codepage slaved to load codepage
166  */
167 void CLoadSaveCodepageDlg::OnLoadSaveSameCodepage()
168 {
169         UpdateSaveGroup();
170 }
171
172 LRESULT CLoadSaveCodepageDlg::OnLoadCodepages(WPARAM, LPARAM)
173 {
174         CComboBox combol, combos;
175         combol.Attach(::GetDlgItem(m_hWnd, IDC_LOAD_CODEPAGE_TEXTBOX));
176         combos.Attach(::GetDlgItem(m_hWnd, IDC_SAVE_CODEPAGE_TEXTBOX));
177         m_cpList = m_asyncCodepagesLoader.Get();
178         for (size_t i = 0, j = 0; i < m_cpList.size(); i++)
179         {
180                 String desc = strutils::format(_T("%05d - %s"), m_cpList[i].codepage, m_cpList[i].desc);
181                 combol.AddString(desc.c_str());
182                 combos.AddString(desc.c_str());
183                 if (m_cpList[i].codepage == m_nLoadCodepage)
184                 {
185                         combol.SetCurSel(static_cast<int>(j));
186                         combos.SetCurSel(static_cast<int>(j));
187                 }
188                 j++;
189         }
190         combol.SetFocus();
191         combol.Detach();
192         combos.Detach();
193         UpdateSaveGroup();
194         return 0;
195 }
196
197 /**
198  * @brief Disable save group if save codepage slaved to load codepage
199  */
200 void CLoadSaveCodepageDlg::UpdateSaveGroup()
201 {
202         UpdateDataFromWindow();
203         EnableDlgItem(IDC_LOAD_CODEPAGE_TEXTBOX, m_cpList.size() > 0);
204         if (!m_bEnableSaveCodepage)
205                 EnableDlgItem(IDC_LOAD_SAVE_SAME_CODEPAGE, false);
206         bool EnableSave = m_bEnableSaveCodepage && !m_bLoadSaveSameCodepage;
207         EnableDlgItem(IDC_SAVE_CODEPAGE_TEXTBOX, EnableSave && m_cpList.size() > 0);
208         EnableDlgItem(IDC_SAVE_CODEPAGE_BOM, EnableSave);
209 }
210
211 /**
212  * @brief User pressed Ok, ensure data members set correctly
213  */
214 void CLoadSaveCodepageDlg::OnOK ()
215 {
216         CTrDialog::OnOK();
217         if (m_bLoadSaveSameCodepage)
218         {
219                 m_nSaveCodepage = m_nLoadCodepage;
220         }
221 }