2 * @file LoadSaveCodepageDlg.cpp
4 * @brief Implementation of the dialog used to select codepages
8 #include "LoadSaveCodepageDlg.h"
10 #include "ExConverter.h"
16 /////////////////////////////////////////////////////////////////////////////
17 // CLoadSaveCodepageDlg dialog
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)
31 , m_bEnableSaveCodepage(false)
34 //{{AFX_DATA_INIT(CLoadSaveCodepageDlg)
35 // NOTE: the ClassWizard will add member initialization here
39 void CLoadSaveCodepageDlg::SetLeftRightAffectStrings(const String & sAffectsLeft, const String & sAffectsMiddle, const String & sAffectsRight)
41 m_sAffectsLeftString = sAffectsLeft;
42 m_sAffectsMiddleString = sAffectsMiddle;
43 m_sAffectsRightString = sAffectsRight;
46 void CLoadSaveCodepageDlg::DoDataExchange(CDataExchange* pDX)
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);
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)
74 /////////////////////////////////////////////////////////////////////////////
75 // CLoadSaveCodepageDlg message handlers
78 * @brief Handler for WM_INITDIALOG; conventional location to initialize controls
79 * At this point dialog and control windows exist
81 BOOL CLoadSaveCodepageDlg::OnInitDialog()
83 CTrDialog::OnInitDialog();
87 SetDlgItemText(IDC_LEFT_FILES_LABEL, m_sAffectsLeftString);
88 SetDlgItemText(IDC_MIDDLE_FILES_LABEL, m_sAffectsMiddleString);
89 SetDlgItemText(IDC_RIGHT_FILES_LABEL, m_sAffectsRightString);
94 EnableDlgItem(IDC_AFFECTS_MIDDLE_BTN, false);
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);
105 return FALSE; // return TRUE unless you set the focus to a control
106 // EXCEPTION: OCX Property Pages should return FALSE
110 * @brief If user unchecks left, then check right (to ensure never have nothing checked)
112 void CLoadSaveCodepageDlg::OnAffectsLeftBtnClicked()
114 if (m_AffectsLeftBtn.GetCheck() != BST_CHECKED)
117 m_AffectsRightBtn.SetCheck(BST_CHECKED);
120 if (m_AffectsMiddleBtn.GetCheck() != BST_CHECKED)
122 if (m_AffectsRightBtn.GetCheck() != BST_CHECKED)
123 m_AffectsRightBtn.SetCheck(BST_CHECKED);
130 * @brief If user unchecks middle, then check right (to ensure never have nothing checked)
132 void CLoadSaveCodepageDlg::OnAffectsMiddleBtnClicked()
134 if (m_AffectsMiddleBtn.GetCheck() != BST_CHECKED)
136 if (m_AffectsLeftBtn.GetCheck() != BST_CHECKED)
138 if (m_AffectsRightBtn.GetCheck() != BST_CHECKED)
139 m_AffectsLeftBtn.SetCheck(BST_CHECKED);
145 * @brief If user unchecks right, then check left (to ensure never have nothing checked)
147 void CLoadSaveCodepageDlg::OnAffectsRightBtnClicked()
149 if (m_AffectsRightBtn.GetCheck() != BST_CHECKED)
152 m_AffectsLeftBtn.SetCheck(BST_CHECKED);
155 if (m_AffectsMiddleBtn.GetCheck() != BST_CHECKED)
157 if (m_AffectsLeftBtn.GetCheck() != BST_CHECKED)
158 m_AffectsLeftBtn.SetCheck(BST_CHECKED);
165 * @brief Disable save group if save codepage slaved to load codepage
167 void CLoadSaveCodepageDlg::OnLoadSaveSameCodepage()
172 LRESULT CLoadSaveCodepageDlg::OnLoadCodepages(WPARAM, LPARAM)
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++)
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)
185 combol.SetCurSel(static_cast<int>(j));
186 combos.SetCurSel(static_cast<int>(j));
198 * @brief Disable save group if save codepage slaved to load codepage
200 void CLoadSaveCodepageDlg::UpdateSaveGroup()
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);
212 * @brief User pressed Ok, ensure data members set correctly
214 void CLoadSaveCodepageDlg::OnOK ()
217 if (m_bLoadSaveSameCodepage)
219 m_nSaveCodepage = m_nLoadCodepage;