1 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
\r
9 #include "registry.h"
\r
10 #include "stringtool.h"
\r
11 #include "windowstool.h"
\r
12 #include "setting.h"
\r
13 #include "dlgeditsetting.h"
\r
14 #include "layoutmanager.h"
\r
16 #include <commctrl.h>
\r
17 #include <windowsx.h>
\r
21 class DlgSetting : public LayoutManager
\r
23 HWND m_hwndMayuPaths; ///
\r
28 typedef DlgEditSettingData Data; ///
\r
31 void insertItem(int i_index, const Data &i_data) {
\r
33 item.mask = LVIF_TEXT;
\r
34 item.iItem = i_index;
\r
37 item.pszText = const_cast<_TCHAR *>(i_data.m_name.c_str());
\r
38 CHECK_TRUE( ListView_InsertItem(m_hwndMayuPaths, &item) != -1 );
\r
40 ListView_SetItemText(m_hwndMayuPaths, i_index, 1,
\r
41 const_cast<_TCHAR *>(i_data.m_filename.c_str()));
\r
42 ListView_SetItemText(m_hwndMayuPaths, i_index, 2,
\r
43 const_cast<_TCHAR *>(i_data.m_symbols.c_str()));
\r
47 void setItem(int i_index, const Data &i_data) {
\r
48 ListView_SetItemText(m_hwndMayuPaths, i_index, 0,
\r
49 const_cast<_TCHAR *>(i_data.m_name.c_str()));
\r
50 ListView_SetItemText(m_hwndMayuPaths, i_index, 1,
\r
51 const_cast<_TCHAR *>(i_data.m_filename.c_str()));
\r
52 ListView_SetItemText(m_hwndMayuPaths, i_index, 2,
\r
53 const_cast<_TCHAR *>(i_data.m_symbols.c_str()));
\r
57 void getItem(int i_index, Data *o_data) {
\r
58 _TCHAR buf[GANA_MAX_PATH];
\r
60 item.mask = LVIF_TEXT;
\r
61 item.iItem = i_index;
\r
63 item.cchTextMax = NUMBER_OF(buf);
\r
66 CHECK_TRUE( ListView_GetItem(m_hwndMayuPaths, &item) );
\r
67 o_data->m_name = item.pszText;
\r
70 CHECK_TRUE( ListView_GetItem(m_hwndMayuPaths, &item) );
\r
71 o_data->m_filename = item.pszText;
\r
74 CHECK_TRUE( ListView_GetItem(m_hwndMayuPaths, &item) );
\r
75 o_data->m_symbols = item.pszText;
\r
79 void setSelectedItem(int i_index) {
\r
80 ListView_SetItemState(m_hwndMayuPaths, i_index,
\r
81 LVIS_SELECTED, LVIS_SELECTED);
\r
85 int getSelectedItem() {
\r
86 if (ListView_GetSelectedCount(m_hwndMayuPaths) == 0)
\r
88 for (int i = 0; ; ++ i) {
\r
89 if (ListView_GetItemState(m_hwndMayuPaths, i, LVIS_SELECTED))
\r
96 DlgSetting(HWND i_hwnd)
\r
97 : LayoutManager(i_hwnd),
\r
98 m_hwndMayuPaths(NULL),
\r
99 m_reg(MAYU_REGISTRY_ROOT) {
\r
103 BOOL wmInitDialog(HWND /* i_focus */, LPARAM /* i_lParam */) {
\r
104 setSmallIcon(m_hwnd, IDI_ICON_mayu);
\r
105 setBigIcon(m_hwnd, IDI_ICON_mayu);
\r
107 CHECK_TRUE( m_hwndMayuPaths = GetDlgItem(m_hwnd, IDC_LIST_mayuPaths) );
\r
109 // create list view colmn
\r
111 GetClientRect(m_hwndMayuPaths, &rc);
\r
114 lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT;
\r
115 lvc.fmt = LVCFMT_LEFT;
\r
116 lvc.cx = (rc.right - rc.left) / 3;
\r
118 tstringi str = loadString(IDS_mayuPathName);
\r
119 lvc.pszText = const_cast<_TCHAR *>(str.c_str());
\r
120 CHECK( 0 ==, ListView_InsertColumn(m_hwndMayuPaths, 0, &lvc) );
\r
121 str = loadString(IDS_mayuPath);
\r
122 lvc.pszText = const_cast<_TCHAR *>(str.c_str());
\r
123 CHECK( 1 ==, ListView_InsertColumn(m_hwndMayuPaths, 1, &lvc) );
\r
124 str = loadString(IDS_mayuSymbols);
\r
125 lvc.pszText = const_cast<_TCHAR *>(str.c_str());
\r
126 CHECK( 2 ==, ListView_InsertColumn(m_hwndMayuPaths, 2, &lvc) );
\r
129 insertItem(0, data); // TODO: why ?
\r
132 tregex split(_T("^([^;]*);([^;]*);(.*)$"));
\r
135 for (i = 0; i < MAX_MAYU_REGISTRY_ENTRIES; ++ i) {
\r
137 _sntprintf(buf, NUMBER_OF(buf), _T(".mayu%d"), i);
\r
138 if (!m_reg.read(buf, &dot_mayu))
\r
142 if (boost::regex_match(dot_mayu, what, split)) {
\r
143 data.m_name = what.str(1);
\r
144 data.m_filename = what.str(2);
\r
145 data.m_symbols = what.str(3);
\r
146 insertItem(i, data);
\r
150 CHECK_TRUE( ListView_DeleteItem(m_hwndMayuPaths, i) ); // TODO: why ?
\r
152 // arrange list view size
\r
153 ListView_SetColumnWidth(m_hwndMayuPaths, 0, LVSCW_AUTOSIZE);
\r
154 ListView_SetColumnWidth(m_hwndMayuPaths, 1, LVSCW_AUTOSIZE);
\r
155 ListView_SetColumnWidth(m_hwndMayuPaths, 2, LVSCW_AUTOSIZE);
\r
157 ListView_SetExtendedListViewStyle(m_hwndMayuPaths, LVS_EX_FULLROWSELECT);
\r
161 m_reg.read(_T(".mayuIndex"), &index, 0);
\r
162 setSelectedItem(index);
\r
164 // set layout manager
\r
165 typedef LayoutManager LM;
\r
166 addItem(GetDlgItem(m_hwnd, IDC_STATIC_mayuPaths),
\r
167 LM::ORIGIN_LEFT_EDGE, LM::ORIGIN_TOP_EDGE,
\r
168 LM::ORIGIN_RIGHT_EDGE, LM::ORIGIN_BOTTOM_EDGE);
\r
169 addItem(GetDlgItem(m_hwnd, IDC_LIST_mayuPaths),
\r
170 LM::ORIGIN_LEFT_EDGE, LM::ORIGIN_TOP_EDGE,
\r
171 LM::ORIGIN_RIGHT_EDGE, LM::ORIGIN_BOTTOM_EDGE);
\r
172 addItem(GetDlgItem(m_hwnd, IDC_BUTTON_up),
\r
173 LM::ORIGIN_RIGHT_EDGE, LM::ORIGIN_CENTER,
\r
174 LM::ORIGIN_RIGHT_EDGE, LM::ORIGIN_CENTER);
\r
175 addItem(GetDlgItem(m_hwnd, IDC_BUTTON_down),
\r
176 LM::ORIGIN_RIGHT_EDGE, LM::ORIGIN_CENTER,
\r
177 LM::ORIGIN_RIGHT_EDGE, LM::ORIGIN_CENTER);
\r
178 addItem(GetDlgItem(m_hwnd, IDC_BUTTON_add),
\r
179 LM::ORIGIN_CENTER, LM::ORIGIN_BOTTOM_EDGE,
\r
180 LM::ORIGIN_CENTER, LM::ORIGIN_BOTTOM_EDGE);
\r
181 addItem(GetDlgItem(m_hwnd, IDC_BUTTON_edit),
\r
182 LM::ORIGIN_CENTER, LM::ORIGIN_BOTTOM_EDGE,
\r
183 LM::ORIGIN_CENTER, LM::ORIGIN_BOTTOM_EDGE);
\r
184 addItem(GetDlgItem(m_hwnd, IDC_BUTTON_delete),
\r
185 LM::ORIGIN_CENTER, LM::ORIGIN_BOTTOM_EDGE,
\r
186 LM::ORIGIN_CENTER, LM::ORIGIN_BOTTOM_EDGE);
\r
187 addItem(GetDlgItem(m_hwnd, IDCANCEL),
\r
188 LM::ORIGIN_CENTER, LM::ORIGIN_BOTTOM_EDGE,
\r
189 LM::ORIGIN_CENTER, LM::ORIGIN_BOTTOM_EDGE);
\r
190 addItem(GetDlgItem(m_hwnd, IDOK),
\r
191 LM::ORIGIN_CENTER, LM::ORIGIN_BOTTOM_EDGE,
\r
192 LM::ORIGIN_CENTER, LM::ORIGIN_BOTTOM_EDGE);
\r
193 restrictSmallestSize();
\r
199 EndDialog(m_hwnd, 0);
\r
204 BOOL wmNotify(int i_id, NMHDR *i_nmh) {
\r
206 case IDC_LIST_mayuPaths:
\r
207 if (i_nmh->code == NM_DBLCLK)
\r
208 FORWARD_WM_COMMAND(m_hwnd, IDC_BUTTON_edit, NULL, 0, SendMessage);
\r
215 BOOL wmCommand(int /* i_notifyCode */, int i_id, HWND /* i_hwndControl */) {
\r
216 _TCHAR buf[GANA_MAX_PATH];
\r
218 case IDC_BUTTON_up:
\r
219 case IDC_BUTTON_down: {
\r
220 int count = ListView_GetItemCount(m_hwndMayuPaths);
\r
223 int index = getSelectedItem();
\r
225 (i_id == IDC_BUTTON_up && index == 0) ||
\r
226 (i_id == IDC_BUTTON_down && index == count - 1))
\r
229 int target = (i_id == IDC_BUTTON_up) ? index - 1 : index + 1;
\r
231 Data dataIndex, dataTarget;
\r
232 getItem(index, &dataIndex);
\r
233 getItem(target, &dataTarget);
\r
234 setItem(index, dataTarget);
\r
235 setItem(target, dataIndex);
\r
237 setSelectedItem(target);
\r
241 case IDC_BUTTON_add: {
\r
243 int index = getSelectedItem();
\r
245 getItem(index, &data);
\r
246 if (DialogBoxParam(g_hInst, MAKEINTRESOURCE(IDD_DIALOG_editSetting),
\r
247 m_hwnd, dlgEditSetting_dlgProc, (LPARAM)&data))
\r
248 if (!data.m_name.empty()) {
\r
249 insertItem(0, data);
\r
250 setSelectedItem(0);
\r
255 case IDC_BUTTON_delete: {
\r
256 int index = getSelectedItem();
\r
258 CHECK_TRUE( ListView_DeleteItem(m_hwndMayuPaths, index) );
\r
259 int count = ListView_GetItemCount(m_hwndMayuPaths);
\r
262 else if (count == index)
\r
263 setSelectedItem(index - 1);
\r
265 setSelectedItem(index);
\r
270 case IDC_BUTTON_edit: {
\r
272 int index = getSelectedItem();
\r
275 getItem(index, &data);
\r
276 if (DialogBoxParam(g_hInst, MAKEINTRESOURCE(IDD_DIALOG_editSetting),
\r
277 m_hwnd, dlgEditSetting_dlgProc, (LPARAM)&data)) {
\r
278 setItem(index, data);
\r
279 setSelectedItem(index);
\r
285 int count = ListView_GetItemCount(m_hwndMayuPaths);
\r
287 for (index = 0; index < count; ++ index) {
\r
288 _sntprintf(buf, NUMBER_OF(buf), _T(".mayu%d"), index);
\r
290 getItem(index, &data);
\r
291 m_reg.write(buf, data.m_name + _T(";") +
\r
292 data.m_filename + _T(";") + data.m_symbols);
\r
294 for (; ; ++ index) {
\r
295 _sntprintf(buf, NUMBER_OF(buf), _T(".mayu%d"), index);
\r
296 if (!m_reg.remove(buf))
\r
299 index = getSelectedItem();
\r
302 m_reg.write(_T(".mayuIndex"), index);
\r
303 EndDialog(m_hwnd, 1);
\r
308 CHECK_TRUE( EndDialog(m_hwnd, 0) );
\r
319 INT_PTR CALLBACK dlgSetting_dlgProc(
\r
321 BOOL CALLBACK dlgSetting_dlgProc(
\r
323 HWND i_hwnd, UINT i_message, WPARAM i_wParam, LPARAM i_lParam)
\r
326 getUserData(i_hwnd, &wc);
\r
328 switch (i_message) {
\r
329 case WM_INITDIALOG:
\r
330 wc = setUserData(i_hwnd, new DlgSetting(i_hwnd));
\r
331 return wc->wmInitDialog(reinterpret_cast<HWND>(i_wParam), i_lParam);
\r
334 switch (i_message) {
\r
336 return wc->wmCommand(HIWORD(i_wParam), LOWORD(i_wParam),
\r
337 reinterpret_cast<HWND>(i_lParam));
\r
339 return wc->wmClose();
\r
344 return wc->wmNotify(static_cast<int>(i_wParam),
\r
345 reinterpret_cast<NMHDR *>(i_lParam));
\r
347 return wc->defaultWMHandler(i_message, i_wParam, i_lParam);
\r