OSDN Git Service

Fix an issue where items with different case are not displayed correctly in the folde...
[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         //}}AFX_MSG_MAP
71 END_MESSAGE_MAP()
72
73 /////////////////////////////////////////////////////////////////////////////
74 // CLoadSaveCodepageDlg message handlers
75
76 /**
77  * @brief Handler for WM_INITDIALOG; conventional location to initialize controls
78  * At this point dialog and control windows exist
79  */
80 BOOL CLoadSaveCodepageDlg::OnInitDialog() 
81 {
82         CTrDialog::OnInitDialog();
83
84         IExconverter *pexconv = Exconverter::getInstance();
85         if (pexconv != nullptr)
86         {
87                 CComboBox combol, combos;
88                 combol.Attach(::GetDlgItem(m_hWnd, IDC_LOAD_CODEPAGE_TEXTBOX));
89                 combos.Attach(::GetDlgItem(m_hWnd, IDC_SAVE_CODEPAGE_TEXTBOX));
90                 std::vector<CodePageInfo> cpi = pexconv->enumCodePages();
91                 for (size_t i = 0, j = 0; i < cpi.size(); i++)
92                 {
93                         String desc = strutils::format(_T("%05d - %s"), cpi[i].codepage, cpi[i].desc);
94                         combol.AddString(desc.c_str());
95                         combos.AddString(desc.c_str());
96                         if (cpi[i].codepage == m_nLoadCodepage)
97                         {
98                                 combol.SetCurSel(static_cast<int>(j));
99                                 combos.SetCurSel(static_cast<int>(j));
100                         }
101                         j++;
102                 }
103                 combol.SetFocus();
104                 combol.Detach();
105                 combos.Detach();
106         }
107
108         CenterWindow();
109
110         SetDlgItemText(IDC_LEFT_FILES_LABEL, m_sAffectsLeftString);
111         SetDlgItemText(IDC_MIDDLE_FILES_LABEL, m_sAffectsMiddleString);
112         SetDlgItemText(IDC_RIGHT_FILES_LABEL, m_sAffectsRightString);
113
114         UpdateSaveGroup();
115
116         if (m_nFiles < 3)
117                 EnableDlgItem(IDC_AFFECTS_MIDDLE_BTN, false);
118
119         return FALSE;  // return TRUE unless you set the focus to a control
120                       // EXCEPTION: OCX Property Pages should return FALSE
121 }
122
123 /**
124  * @brief If user unchecks left, then check right (to ensure never have nothing checked)
125  */
126 void CLoadSaveCodepageDlg::OnAffectsLeftBtnClicked()
127 {
128         if (m_AffectsLeftBtn.GetCheck() != BST_CHECKED)
129         {
130                 if (m_nFiles < 3)
131                         m_AffectsRightBtn.SetCheck(BST_CHECKED);
132                 else
133                 {
134                         if (m_AffectsMiddleBtn.GetCheck() != BST_CHECKED)
135                         {
136                                 if (m_AffectsRightBtn.GetCheck() != BST_CHECKED)
137                                         m_AffectsRightBtn.SetCheck(BST_CHECKED);
138                         }
139                 }
140         }
141 }
142
143 /**
144  * @brief If user unchecks middle, then check right (to ensure never have nothing checked)
145  */
146 void CLoadSaveCodepageDlg::OnAffectsMiddleBtnClicked()
147 {
148         if (m_AffectsMiddleBtn.GetCheck() != BST_CHECKED)
149         {
150                 if (m_AffectsLeftBtn.GetCheck() != BST_CHECKED)
151                 {
152                         if (m_AffectsRightBtn.GetCheck() != BST_CHECKED)
153                                 m_AffectsLeftBtn.SetCheck(BST_CHECKED);
154                 }
155         }
156 }
157
158 /**
159  * @brief If user unchecks right, then check left (to ensure never have nothing checked)
160  */
161 void CLoadSaveCodepageDlg::OnAffectsRightBtnClicked()
162 {
163         if (m_AffectsRightBtn.GetCheck() != BST_CHECKED)
164         {
165                 if (m_nFiles < 3)
166                         m_AffectsLeftBtn.SetCheck(BST_CHECKED);
167                 else
168                 {
169                         if (m_AffectsMiddleBtn.GetCheck() != BST_CHECKED)
170                         {
171                                 if (m_AffectsLeftBtn.GetCheck() != BST_CHECKED)
172                                         m_AffectsLeftBtn.SetCheck(BST_CHECKED);
173                         }
174                 }
175         }
176 }
177
178 /**
179  * @brief Disable save group if save codepage slaved to load codepage
180  */
181 void CLoadSaveCodepageDlg::OnLoadSaveSameCodepage()
182 {
183         UpdateSaveGroup();
184 }
185
186 /**
187  * @brief Disable save group if save codepage slaved to load codepage
188  */
189 void CLoadSaveCodepageDlg::UpdateSaveGroup()
190 {
191         UpdateDataFromWindow();
192         if (!m_bEnableSaveCodepage)
193                 EnableDlgItem(IDC_LOAD_SAVE_SAME_CODEPAGE, false);
194         bool EnableSave = m_bEnableSaveCodepage && !m_bLoadSaveSameCodepage;
195         EnableDlgItem(IDC_SAVE_CODEPAGE_TEXTBOX, EnableSave);
196         EnableDlgItem(IDC_SAVE_CODEPAGE_BOM, EnableSave);
197 }
198
199 /**
200  * @brief User pressed Ok, ensure data members set correctly
201  */
202 void CLoadSaveCodepageDlg::OnOK ()
203 {
204         CTrDialog::OnOK();
205         if (m_bLoadSaveSameCodepage)
206         {
207                 m_nSaveCodepage = m_nLoadCodepage;
208         }
209 }