OSDN Git Service

resource.h: Add IDS_PLUGIN_DESCRIPTION*
[winmerge-jp/winmerge-jp.git] / Src / PropCodepage.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 //    WinMerge:  an interactive diff/merge utility
3 //    Copyright (C) 1997-2000  Thingamahoochie Software
4 //    Author: Dean Grimm
5 //    SPDX-License-Identifier: GPL-2.0-or-later
6 /////////////////////////////////////////////////////////////////////////////
7 /** 
8  * @file  PropCodepage.cpp
9  *
10  * @brief Implementation file for PropCodepage propertyheet
11  *
12  */
13
14 #include "stdafx.h"
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"
21 #include "charsets.h"
22
23 #ifdef _DEBUG
24 #define new DEBUG_NEW
25 #endif
26
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)
34 {
35 }
36
37 void PropCodepage::DoDataExchange(CDataExchange* pDX)
38 {
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);
47         //}}AFX_DATA_MAP
48 }
49
50
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)
58         //}}AFX_MSG_MAP
59 END_MESSAGE_MAP()
60
61 /** 
62  * @brief Reads options values from storage to UI.
63  */
64 void PropCodepage::ReadOptions()
65 {
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;
74 }
75
76 /** 
77  * @brief Writes options values from UI to storage.
78  */
79 void PropCodepage::WriteOptions()
80 {
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));
85 }
86
87 BOOL PropCodepage::OnInitDialog() 
88 {
89         OptionsPanel::OnInitDialog();
90         
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);
95
96         m_comboCustomCodepageValue.SetWindowText(strutils::to_str(m_nCustomCodepageValue).c_str());
97
98         IExconverter *pexconv = Exconverter::getInstance();
99         if (pexconv != nullptr)
100         {
101                 std::vector<CodePageInfo> cpi = pexconv->enumCodePages();
102                 size_t Index = 0;
103                 for (size_t i = 0; i < cpi.size(); i++)
104                 {
105                         if (cpi[i].codepage == 1200 /* UNICODE */)
106                                 continue;
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));
111                 }
112
113                 static int ManualAddTypeList[] = {437, 850, 858, 860, 863, 861, 1200, 1201, 65000};
114                 for (int i = 0; i < sizeof(ManualAddTypeList) / sizeof(int); i++)
115                 {
116                         String desc;
117                         pexconv->getCodepageDescription(ManualAddTypeList[i], desc);
118                         desc = strutils::format(_T("% 5d - %s"), ManualAddTypeList[i], desc);
119
120                         if (m_comboCustomCodepageValue.FindStringExact(0, desc.c_str()) == CB_ERR)
121                         {
122                                 Index = m_comboCustomCodepageValue.AddString(desc.c_str());
123                                 if (ManualAddTypeList[i] == m_nCustomCodepageValue)
124                                         m_comboCustomCodepageValue.SetCurSel(static_cast<int>(Index));
125                         }
126                 }
127
128                 static int autodetectTypeList[] = {50001, 50936, 50950, 50932, 50949};
129                 for (int i = 0; i < sizeof(autodetectTypeList)/sizeof(int); i++)
130                 {
131                         String desc;
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);
137                 }
138         }
139
140         return TRUE;  // return TRUE unless you set the focus to a control
141                       // EXCEPTION: OCX Property Pages should return FALSE
142 }
143
144 void PropCodepage::OnCpSystem() 
145 {
146         EnableDlgItem(IDC_CUSTOM_CP_NUMBER, false);
147 }
148
149 void PropCodepage::OnCpCustom() 
150 {
151         EnableDlgItem(IDC_CUSTOM_CP_NUMBER, true);
152 }
153
154 void PropCodepage::OnDetectCodepage2() 
155 {
156         m_comboAutodetectType.EnableWindow(
157                 IsDlgButtonChecked(IDC_DETECT_CODEPAGE2) == 1);
158 }
159
160 void PropCodepage::OnDetectAutodetecttype()
161 {
162         m_nAutodetectType = static_cast<int>(m_comboAutodetectType.GetItemData(m_comboAutodetectType.GetCurSel()));     
163 }
164
165 void PropCodepage::OnCpUi() 
166 {
167         EnableDlgItem(IDC_CUSTOM_CP_NUMBER, false);     
168 }
169
170 void PropCodepage::GetEncodingCodePageFromNameString()
171 {
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;
178 }