1 /////////////////////////////////////////////////////////////////////////////
2 // WinMerge: an interactive diff/merge utility
3 // Copyright (C) 1997-2000 Thingamahoochie Software
5 // SPDX-License-Identifier: GPL-2.0-or-later
6 /////////////////////////////////////////////////////////////////////////////
8 * @file PropCodepage.cpp
10 * @brief Implementation file for PropCodepage propertyheet
15 #include "PropCodepage.h"
16 #include "common/unicoder.h"
17 #include "common/ExConverter.h"
18 #include "OptionsDef.h"
19 #include "OptionsMgr.h"
20 #include "OptionsPanel.h"
27 PropCodepage::PropCodepage(COptionsMgr *optionsMgr)
28 : OptionsPanel(optionsMgr, PropCodepage::IDD)
29 , m_nCodepageSystem(-1)
30 , m_nCustomCodepageValue(0)
31 , m_bDetectCodepage(false)
32 , m_bDetectCodepage2(false)
33 , m_nAutodetectType(50001)
37 void PropCodepage::DoDataExchange(CDataExchange* pDX)
39 CPropertyPage::DoDataExchange(pDX);
40 //{{AFX_DATA_MAP(PropCodepage)
41 DDX_Radio(pDX, IDC_CP_SYSTEM, m_nCodepageSystem);
42 DDX_Text(pDX, IDC_CUSTOM_CP_NUMBER, m_cCustomCodepageValue);
43 DDX_Check(pDX, IDC_DETECT_CODEPAGE, m_bDetectCodepage);
44 DDX_Check(pDX, IDC_DETECT_CODEPAGE2, m_bDetectCodepage2);
45 DDX_Control(pDX, IDC_CUSTOM_CP_NUMBER, m_comboCustomCodepageValue);
46 DDX_Control(pDX, IDC_DETECT_AUTODETECTTYPE, m_comboAutodetectType);
51 BEGIN_MESSAGE_MAP(PropCodepage, OptionsPanel)
52 //{{AFX_MSG_MAP(PropCodepage)
53 ON_BN_CLICKED(IDC_CP_SYSTEM, OnCpSystem)
54 ON_BN_CLICKED(IDC_CP_CUSTOM, OnCpCustom)
55 ON_BN_CLICKED(IDC_DETECT_CODEPAGE2, OnDetectCodepage2)
56 ON_CBN_SELCHANGE(IDC_DETECT_AUTODETECTTYPE, OnDetectAutodetecttype)
57 ON_BN_CLICKED(IDC_CP_UI, OnCpUi)
62 * @brief Reads options values from storage to UI.
64 void PropCodepage::ReadOptions()
66 m_nCodepageSystem = GetOptionsMgr()->GetInt(OPT_CP_DEFAULT_MODE);
67 m_nCustomCodepageValue = GetOptionsMgr()->GetInt(OPT_CP_DEFAULT_CUSTOM);
68 m_cCustomCodepageValue = strutils::to_str(m_nCustomCodepageValue);
69 m_bDetectCodepage = GetOptionsMgr()->GetInt(OPT_CP_DETECT) & 1;
70 m_bDetectCodepage2 = (GetOptionsMgr()->GetInt(OPT_CP_DETECT) & 2) != 0;
71 m_nAutodetectType = ((unsigned)GetOptionsMgr()->GetInt(OPT_CP_DETECT) >> 16);
72 if (m_nAutodetectType == 0)
73 m_nAutodetectType = 50001;
77 * @brief Writes options values from UI to storage.
79 void PropCodepage::WriteOptions()
81 GetOptionsMgr()->SaveOption(OPT_CP_DEFAULT_MODE, (int)m_nCodepageSystem);
82 GetEncodingCodePageFromNameString();
83 GetOptionsMgr()->SaveOption(OPT_CP_DEFAULT_CUSTOM, (int)m_nCustomCodepageValue);
84 GetOptionsMgr()->SaveOption(OPT_CP_DETECT, (m_bDetectCodepage ? 1 : 0) | (m_bDetectCodepage2 << 1) | (m_nAutodetectType << 16));
87 BOOL PropCodepage::OnInitDialog()
89 OptionsPanel::OnInitDialog();
91 // Enable/disable "Custom codepage" edit field
92 EnableDlgItem(IDC_CUSTOM_CP_NUMBER, IsDlgButtonChecked(IDC_CP_CUSTOM) == 1);
93 m_comboAutodetectType.EnableWindow(
94 IsDlgButtonChecked(IDC_DETECT_CODEPAGE2) == 1);
96 m_comboCustomCodepageValue.SetWindowText(strutils::to_str(m_nCustomCodepageValue).c_str());
98 IExconverter *pexconv = Exconverter::getInstance();
99 if (pexconv != nullptr)
101 std::vector<CodePageInfo> cpi = pexconv->enumCodePages();
103 for (size_t i = 0; i < cpi.size(); i++)
105 if (cpi[i].codepage == 1200 /* UNICODE */)
107 String desc = strutils::format(_T("% 5d - %s"), cpi[i].codepage, cpi[i].desc);
108 Index = m_comboCustomCodepageValue.AddString(desc.c_str());
109 if (cpi[i].codepage == m_nCustomCodepageValue)
110 m_comboCustomCodepageValue.SetCurSel(static_cast<int>(Index));
113 static int ManualAddTypeList[] = {437, 850, 858, 860, 863, 861, 1200, 1201, 65000};
114 for (int i = 0; i < sizeof(ManualAddTypeList) / sizeof(int); i++)
117 pexconv->getCodepageDescription(ManualAddTypeList[i], desc);
118 desc = strutils::format(_T("% 5d - %s"), ManualAddTypeList[i], desc);
120 if (m_comboCustomCodepageValue.FindStringExact(0, desc.c_str()) == CB_ERR)
122 Index = m_comboCustomCodepageValue.AddString(desc.c_str());
123 if (ManualAddTypeList[i] == m_nCustomCodepageValue)
124 m_comboCustomCodepageValue.SetCurSel(static_cast<int>(Index));
128 static int autodetectTypeList[] = {50001, 50936, 50950, 50932, 50949};
129 for (int i = 0; i < sizeof(autodetectTypeList)/sizeof(int); i++)
132 pexconv->getCodepageDescription(autodetectTypeList[i], desc);
133 m_comboAutodetectType.AddString(desc.c_str());
134 m_comboAutodetectType.SetItemData(i, autodetectTypeList[i]);
135 if (m_nAutodetectType == autodetectTypeList[i])
136 m_comboAutodetectType.SetCurSel(i);
140 return TRUE; // return TRUE unless you set the focus to a control
141 // EXCEPTION: OCX Property Pages should return FALSE
144 void PropCodepage::OnCpSystem()
146 EnableDlgItem(IDC_CUSTOM_CP_NUMBER, false);
149 void PropCodepage::OnCpCustom()
151 EnableDlgItem(IDC_CUSTOM_CP_NUMBER, true);
154 void PropCodepage::OnDetectCodepage2()
156 m_comboAutodetectType.EnableWindow(
157 IsDlgButtonChecked(IDC_DETECT_CODEPAGE2) == 1);
160 void PropCodepage::OnDetectAutodetecttype()
162 m_nAutodetectType = static_cast<int>(m_comboAutodetectType.GetItemData(m_comboAutodetectType.GetCurSel()));
165 void PropCodepage::OnCpUi()
167 EnableDlgItem(IDC_CUSTOM_CP_NUMBER, false);
170 void PropCodepage::GetEncodingCodePageFromNameString()
172 int nCustomCodepageValue = _ttol(m_cCustomCodepageValue.c_str());
173 if (nCustomCodepageValue == 0)
174 nCustomCodepageValue = GetEncodingCodePageFromName(ucr::toSystemCP(m_cCustomCodepageValue).c_str());
175 //if found a new codepage valid
176 if (nCustomCodepageValue)
177 m_nCustomCodepageValue = nCustomCodepageValue;