OSDN Git Service

1e2d722445ecf2750e2a4aca6dd71f20602a57e3
[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_nLoadCodepage(-1)
29 , m_nSaveCodepage(-1)
30 , m_bEnableSaveCodepage(false)
31 , m_nFiles(nFiles)
32 {
33         //{{AFX_DATA_INIT(CLoadSaveCodepageDlg)
34                 // NOTE: the ClassWizard will add member initialization here
35         //}}AFX_DATA_INIT
36 }
37
38 void CLoadSaveCodepageDlg::SetLeftRightAffectStrings(const String & sAffectsLeft, const String & sAffectsMiddle, const String & sAffectsRight)
39 {
40         m_sAffectsLeftString = sAffectsLeft;
41         m_sAffectsMiddleString = sAffectsMiddle;
42         m_sAffectsRightString = sAffectsRight;
43 }
44
45 void CLoadSaveCodepageDlg::DoDataExchange(CDataExchange* pDX)
46 {
47         CTrDialog::DoDataExchange(pDX);
48         //{{AFX_DATA_MAP(CLoadSaveCodepageDlg)
49         DDX_Check(pDX, IDC_AFFECTS_LEFT_BTN, m_bAffectsLeft);
50         DDX_Check(pDX, IDC_AFFECTS_MIDDLE_BTN, m_bAffectsMiddle);
51         DDX_Check(pDX, IDC_AFFECTS_RIGHT_BTN, m_bAffectsRight);
52         DDX_Check(pDX, IDC_LOAD_SAVE_SAME_CODEPAGE, m_bLoadSaveSameCodepage);
53         DDX_Control(pDX, IDC_AFFECTS_LEFT_BTN, m_AffectsLeftBtn);
54         DDX_Control(pDX, IDC_AFFECTS_MIDDLE_BTN, m_AffectsMiddleBtn);
55         DDX_Control(pDX, IDC_AFFECTS_RIGHT_BTN, m_AffectsRightBtn);
56         DDX_Text(pDX, IDC_LOAD_CODEPAGE_TEXTBOX, m_nLoadCodepage);
57         DDX_Text(pDX, IDC_SAVE_CODEPAGE_TEXTBOX, m_nSaveCodepage);
58         //}}AFX_DATA_MAP
59 }
60
61
62 BEGIN_MESSAGE_MAP(CLoadSaveCodepageDlg, CTrDialog)
63         //{{AFX_MSG_MAP(CLoadSaveCodepageDlg)
64         ON_BN_CLICKED(IDC_AFFECTS_LEFT_BTN, OnAffectsLeftBtnClicked)
65         ON_BN_CLICKED(IDC_AFFECTS_MIDDLE_BTN, OnAffectsMiddleBtnClicked)
66         ON_BN_CLICKED(IDC_AFFECTS_RIGHT_BTN, OnAffectsRightBtnClicked)
67         ON_BN_CLICKED(IDC_LOAD_SAVE_SAME_CODEPAGE, OnLoadSaveSameCodepage)
68         //}}AFX_MSG_MAP
69 END_MESSAGE_MAP()
70
71 /////////////////////////////////////////////////////////////////////////////
72 // CLoadSaveCodepageDlg message handlers
73
74 /**
75  * @brief Handler for WM_INITDIALOG; conventional location to initialize controls
76  * At this point dialog and control windows exist
77  */
78 BOOL CLoadSaveCodepageDlg::OnInitDialog() 
79 {
80         CTrDialog::OnInitDialog();
81
82         IExconverter *pexconv = Exconverter::getInstance();
83         if (pexconv != nullptr)
84         {
85                 CComboBox combol, combos;
86                 combol.Attach(::GetDlgItem(m_hWnd, IDC_LOAD_CODEPAGE_TEXTBOX));
87                 combos.Attach(::GetDlgItem(m_hWnd, IDC_SAVE_CODEPAGE_TEXTBOX));
88                 std::vector<CodePageInfo> cpi = pexconv->enumCodePages();
89                 for (size_t i = 0, j = 0; i < cpi.size(); i++)
90                 {
91                         String desc = strutils::format(_T("%05d - %s"), cpi[i].codepage, cpi[i].desc.c_str());
92                         combol.AddString(desc.c_str());
93                         combos.AddString(desc.c_str());
94                         if (cpi[i].codepage == m_nLoadCodepage)
95                         {
96                                 combol.SetCurSel(static_cast<int>(j));
97                                 combos.SetCurSel(static_cast<int>(j));
98                         }
99                         j++;
100                 }
101                 combol.Detach();
102                 combos.Detach();
103         }
104
105         AfxGetMainWnd()->CenterWindow(this);
106
107         SetDlgItemText(IDC_LEFT_FILES_LABEL, m_sAffectsLeftString);
108         SetDlgItemText(IDC_MIDDLE_FILES_LABEL, m_sAffectsMiddleString);
109         SetDlgItemText(IDC_RIGHT_FILES_LABEL, m_sAffectsRightString);
110
111         UpdateSaveGroup();
112
113         if (m_nFiles < 3)
114                 EnableDlgItem(IDC_AFFECTS_MIDDLE_BTN, false);
115         
116         return TRUE;  // return TRUE unless you set the focus to a control
117                       // EXCEPTION: OCX Property Pages should return FALSE
118 }
119
120 /**
121  * @brief If user unchecks left, then check right (to ensure never have nothing checked)
122  */
123 void CLoadSaveCodepageDlg::OnAffectsLeftBtnClicked()
124 {
125         if (m_AffectsLeftBtn.GetCheck() != BST_CHECKED)
126         {
127                 if (m_nFiles < 3)
128                         m_AffectsRightBtn.SetCheck(BST_CHECKED);
129                 else
130                 {
131                         if (m_AffectsMiddleBtn.GetCheck() != BST_CHECKED)
132                         {
133                                 if (m_AffectsRightBtn.GetCheck() != BST_CHECKED)
134                                         m_AffectsRightBtn.SetCheck(BST_CHECKED);
135                         }
136                 }
137         }
138 }
139
140 /**
141  * @brief If user unchecks middle, then check right (to ensure never have nothing checked)
142  */
143 void CLoadSaveCodepageDlg::OnAffectsMiddleBtnClicked()
144 {
145         if (m_AffectsMiddleBtn.GetCheck() != BST_CHECKED)
146         {
147                 if (m_AffectsLeftBtn.GetCheck() != BST_CHECKED)
148                 {
149                         if (m_AffectsRightBtn.GetCheck() != BST_CHECKED)
150                                 m_AffectsLeftBtn.SetCheck(BST_CHECKED);
151                 }
152         }
153 }
154
155 /**
156  * @brief If user unchecks right, then check left (to ensure never have nothing checked)
157  */
158 void CLoadSaveCodepageDlg::OnAffectsRightBtnClicked()
159 {
160         if (m_AffectsRightBtn.GetCheck() != BST_CHECKED)
161         {
162                 if (m_nFiles < 3)
163                         m_AffectsLeftBtn.SetCheck(BST_CHECKED);
164                 else
165                 {
166                         if (m_AffectsMiddleBtn.GetCheck() != BST_CHECKED)
167                         {
168                                 if (m_AffectsLeftBtn.GetCheck() != BST_CHECKED)
169                                         m_AffectsLeftBtn.SetCheck(BST_CHECKED);
170                         }
171                 }
172         }
173 }
174
175 /**
176  * @brief Disable save group if save codepage slaved to load codepage
177  */
178 void CLoadSaveCodepageDlg::OnLoadSaveSameCodepage()
179 {
180         UpdateSaveGroup();
181 }
182
183 /**
184  * @brief Disable save group if save codepage slaved to load codepage
185  */
186 void CLoadSaveCodepageDlg::UpdateSaveGroup()
187 {
188         UpdateDataFromWindow();
189         if (!m_bEnableSaveCodepage)
190                 EnableDlgItem(IDC_LOAD_SAVE_SAME_CODEPAGE, false);
191         bool EnableSave = m_bEnableSaveCodepage && !m_bLoadSaveSameCodepage;
192         EnableDlgItem(IDC_SAVE_CODEPAGE_TEXTBOX, EnableSave);
193 }
194
195 /**
196  * @brief User pressed Ok, ensure data members set correctly
197  */
198 void CLoadSaveCodepageDlg::OnOK ()
199 {
200         CTrDialog::OnOK();
201         if (m_bLoadSaveSameCodepage)
202         {
203                 m_nSaveCodepage = m_nLoadCodepage;
204         }
205 }