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
34 item.mask = LVIF_TEXT;
\r
35 item.iItem = i_index;
\r
38 item.pszText = const_cast<_TCHAR *>(i_data.m_name.c_str());
\r
39 CHECK_TRUE( ListView_InsertItem(m_hwndMayuPaths, &item) != -1 );
\r
41 ListView_SetItemText(m_hwndMayuPaths, i_index, 1,
\r
42 const_cast<_TCHAR *>(i_data.m_filename.c_str()));
\r
43 ListView_SetItemText(m_hwndMayuPaths, i_index, 2,
\r
44 const_cast<_TCHAR *>(i_data.m_symbols.c_str()));
\r
48 void setItem(int i_index, const Data &i_data)
\r
50 ListView_SetItemText(m_hwndMayuPaths, i_index, 0,
\r
51 const_cast<_TCHAR *>(i_data.m_name.c_str()));
\r
52 ListView_SetItemText(m_hwndMayuPaths, i_index, 1,
\r
53 const_cast<_TCHAR *>(i_data.m_filename.c_str()));
\r
54 ListView_SetItemText(m_hwndMayuPaths, i_index, 2,
\r
55 const_cast<_TCHAR *>(i_data.m_symbols.c_str()));
\r
59 void getItem(int i_index, Data *o_data)
\r
61 _TCHAR buf[GANA_MAX_PATH];
\r
63 item.mask = LVIF_TEXT;
\r
64 item.iItem = i_index;
\r
66 item.cchTextMax = NUMBER_OF(buf);
\r
69 CHECK_TRUE( ListView_GetItem(m_hwndMayuPaths, &item) );
\r
70 o_data->m_name = item.pszText;
\r
73 CHECK_TRUE( ListView_GetItem(m_hwndMayuPaths, &item) );
\r
74 o_data->m_filename = item.pszText;
\r
77 CHECK_TRUE( ListView_GetItem(m_hwndMayuPaths, &item) );
\r
78 o_data->m_symbols = item.pszText;
\r
82 void setSelectedItem(int i_index)
\r
84 ListView_SetItemState(m_hwndMayuPaths, i_index,
\r
85 LVIS_SELECTED, LVIS_SELECTED);
\r
89 int getSelectedItem()
\r
91 if (ListView_GetSelectedCount(m_hwndMayuPaths) == 0)
\r
93 for (int i = 0; ; ++ i)
\r
95 if (ListView_GetItemState(m_hwndMayuPaths, i, LVIS_SELECTED))
\r
102 DlgSetting(HWND i_hwnd)
\r
103 : LayoutManager(i_hwnd),
\r
104 m_hwndMayuPaths(NULL),
\r
105 m_reg(MAYU_REGISTRY_ROOT)
\r
110 BOOL wmInitDialog(HWND /* i_focus */, LPARAM /* i_lParam */)
\r
112 setSmallIcon(m_hwnd, IDI_ICON_mayu);
\r
113 setBigIcon(m_hwnd, IDI_ICON_mayu);
\r
115 CHECK_TRUE( m_hwndMayuPaths = GetDlgItem(m_hwnd, IDC_LIST_mayuPaths) );
\r
117 // create list view colmn
\r
119 GetClientRect(m_hwndMayuPaths, &rc);
\r
122 lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT;
\r
123 lvc.fmt = LVCFMT_LEFT;
\r
124 lvc.cx = (rc.right - rc.left) / 3;
\r
126 tstringi str = loadString(IDS_mayuPathName);
\r
127 lvc.pszText = const_cast<_TCHAR *>(str.c_str());
\r
128 CHECK( 0 ==, ListView_InsertColumn(m_hwndMayuPaths, 0, &lvc) );
\r
129 str = loadString(IDS_mayuPath);
\r
130 lvc.pszText = const_cast<_TCHAR *>(str.c_str());
\r
131 CHECK( 1 ==, ListView_InsertColumn(m_hwndMayuPaths, 1, &lvc) );
\r
132 str = loadString(IDS_mayuSymbols);
\r
133 lvc.pszText = const_cast<_TCHAR *>(str.c_str());
\r
134 CHECK( 2 ==, ListView_InsertColumn(m_hwndMayuPaths, 2, &lvc) );
\r
137 insertItem(0, data); // TODO: why ?
\r
140 tregex split(_T("^([^;]*);([^;]*);(.*)$"));
\r
143 for (i = 0; i < MAX_MAYU_REGISTRY_ENTRIES; ++ i)
\r
146 _sntprintf(buf, NUMBER_OF(buf), _T(".mayu%d"), i);
\r
147 if (!m_reg.read(buf, &dot_mayu))
\r
151 if (boost::regex_match(dot_mayu, what, split))
\r
153 data.m_name = what.str(1);
\r
154 data.m_filename = what.str(2);
\r
155 data.m_symbols = what.str(3);
\r
156 insertItem(i, data);
\r
160 CHECK_TRUE( ListView_DeleteItem(m_hwndMayuPaths, i) ); // TODO: why ?
\r
162 // arrange list view size
\r
163 ListView_SetColumnWidth(m_hwndMayuPaths, 0, LVSCW_AUTOSIZE);
\r
164 ListView_SetColumnWidth(m_hwndMayuPaths, 1, LVSCW_AUTOSIZE);
\r
165 ListView_SetColumnWidth(m_hwndMayuPaths, 2, LVSCW_AUTOSIZE);
\r
167 ListView_SetExtendedListViewStyle(m_hwndMayuPaths, LVS_EX_FULLROWSELECT);
\r
171 m_reg.read(_T(".mayuIndex"), &index, 0);
\r
172 setSelectedItem(index);
\r
174 // set layout manager
\r
175 typedef LayoutManager LM;
\r
176 addItem(GetDlgItem(m_hwnd, IDC_STATIC_mayuPaths),
\r
177 LM::ORIGIN_LEFT_EDGE, LM::ORIGIN_TOP_EDGE,
\r
178 LM::ORIGIN_RIGHT_EDGE, LM::ORIGIN_BOTTOM_EDGE);
\r
179 addItem(GetDlgItem(m_hwnd, IDC_LIST_mayuPaths),
\r
180 LM::ORIGIN_LEFT_EDGE, LM::ORIGIN_TOP_EDGE,
\r
181 LM::ORIGIN_RIGHT_EDGE, LM::ORIGIN_BOTTOM_EDGE);
\r
182 addItem(GetDlgItem(m_hwnd, IDC_BUTTON_up),
\r
183 LM::ORIGIN_RIGHT_EDGE, LM::ORIGIN_CENTER,
\r
184 LM::ORIGIN_RIGHT_EDGE, LM::ORIGIN_CENTER);
\r
185 addItem(GetDlgItem(m_hwnd, IDC_BUTTON_down),
\r
186 LM::ORIGIN_RIGHT_EDGE, LM::ORIGIN_CENTER,
\r
187 LM::ORIGIN_RIGHT_EDGE, LM::ORIGIN_CENTER);
\r
188 addItem(GetDlgItem(m_hwnd, IDC_BUTTON_add),
\r
189 LM::ORIGIN_CENTER, LM::ORIGIN_BOTTOM_EDGE,
\r
190 LM::ORIGIN_CENTER, LM::ORIGIN_BOTTOM_EDGE);
\r
191 addItem(GetDlgItem(m_hwnd, IDC_BUTTON_edit),
\r
192 LM::ORIGIN_CENTER, LM::ORIGIN_BOTTOM_EDGE,
\r
193 LM::ORIGIN_CENTER, LM::ORIGIN_BOTTOM_EDGE);
\r
194 addItem(GetDlgItem(m_hwnd, IDC_BUTTON_delete),
\r
195 LM::ORIGIN_CENTER, LM::ORIGIN_BOTTOM_EDGE,
\r
196 LM::ORIGIN_CENTER, LM::ORIGIN_BOTTOM_EDGE);
\r
197 addItem(GetDlgItem(m_hwnd, IDCANCEL),
\r
198 LM::ORIGIN_CENTER, LM::ORIGIN_BOTTOM_EDGE,
\r
199 LM::ORIGIN_CENTER, LM::ORIGIN_BOTTOM_EDGE);
\r
200 addItem(GetDlgItem(m_hwnd, IDOK),
\r
201 LM::ORIGIN_CENTER, LM::ORIGIN_BOTTOM_EDGE,
\r
202 LM::ORIGIN_CENTER, LM::ORIGIN_BOTTOM_EDGE);
\r
203 restrictSmallestSize();
\r
210 EndDialog(m_hwnd, 0);
\r
215 BOOL wmNotify(int i_id, NMHDR *i_nmh)
\r
219 case IDC_LIST_mayuPaths:
\r
220 if (i_nmh->code == NM_DBLCLK)
\r
221 FORWARD_WM_COMMAND(m_hwnd, IDC_BUTTON_edit, NULL, 0, SendMessage);
\r
228 BOOL wmCommand(int /* i_notifyCode */, int i_id, HWND /* i_hwndControl */)
\r
230 _TCHAR buf[GANA_MAX_PATH];
\r
233 case IDC_BUTTON_up:
\r
234 case IDC_BUTTON_down:
\r
236 int count = ListView_GetItemCount(m_hwndMayuPaths);
\r
239 int index = getSelectedItem();
\r
241 (i_id == IDC_BUTTON_up && index == 0) ||
\r
242 (i_id == IDC_BUTTON_down && index == count - 1))
\r
245 int target = (i_id == IDC_BUTTON_up) ? index - 1 : index + 1;
\r
247 Data dataIndex, dataTarget;
\r
248 getItem(index, &dataIndex);
\r
249 getItem(target, &dataTarget);
\r
250 setItem(index, dataTarget);
\r
251 setItem(target, dataIndex);
\r
253 setSelectedItem(target);
\r
257 case IDC_BUTTON_add:
\r
260 int index = getSelectedItem();
\r
262 getItem(index, &data);
\r
263 if (DialogBoxParam(g_hInst, MAKEINTRESOURCE(IDD_DIALOG_editSetting),
\r
264 m_hwnd, dlgEditSetting_dlgProc, (LPARAM)&data))
\r
265 if (!data.m_name.empty())
\r
267 insertItem(0, data);
\r
268 setSelectedItem(0);
\r
273 case IDC_BUTTON_delete:
\r
275 int index = getSelectedItem();
\r
278 CHECK_TRUE( ListView_DeleteItem(m_hwndMayuPaths, index) );
\r
279 int count = ListView_GetItemCount(m_hwndMayuPaths);
\r
282 else if (count == index)
\r
283 setSelectedItem(index - 1);
\r
285 setSelectedItem(index);
\r
290 case IDC_BUTTON_edit:
\r
293 int index = getSelectedItem();
\r
296 getItem(index, &data);
\r
297 if (DialogBoxParam(g_hInst, MAKEINTRESOURCE(IDD_DIALOG_editSetting),
\r
298 m_hwnd, dlgEditSetting_dlgProc, (LPARAM)&data))
\r
300 setItem(index, data);
\r
301 setSelectedItem(index);
\r
308 int count = ListView_GetItemCount(m_hwndMayuPaths);
\r
310 for (index = 0; index < count; ++ index)
\r
312 _sntprintf(buf, NUMBER_OF(buf), _T(".mayu%d"), index);
\r
314 getItem(index, &data);
\r
315 m_reg.write(buf, data.m_name + _T(";") +
\r
316 data.m_filename + _T(";") + data.m_symbols);
\r
320 _sntprintf(buf, NUMBER_OF(buf), _T(".mayu%d"), index);
\r
321 if (!m_reg.remove(buf))
\r
324 index = getSelectedItem();
\r
327 m_reg.write(_T(".mayuIndex"), index);
\r
328 EndDialog(m_hwnd, 1);
\r
334 CHECK_TRUE( EndDialog(m_hwnd, 0) );
\r
345 INT_PTR CALLBACK dlgSetting_dlgProc(
\r
347 BOOL CALLBACK dlgSetting_dlgProc(
\r
349 HWND i_hwnd, UINT i_message, WPARAM i_wParam, LPARAM i_lParam)
\r
352 getUserData(i_hwnd, &wc);
\r
356 case WM_INITDIALOG:
\r
357 wc = setUserData(i_hwnd, new DlgSetting(i_hwnd));
\r
358 return wc->wmInitDialog(reinterpret_cast<HWND>(i_wParam), i_lParam);
\r
364 return wc->wmCommand(HIWORD(i_wParam), LOWORD(i_wParam),
\r
365 reinterpret_cast<HWND>(i_lParam));
\r
367 return wc->wmClose();
\r
372 return wc->wmNotify(static_cast<int>(i_wParam),
\r
373 reinterpret_cast<NMHDR *>(i_lParam));
\r
375 return wc->defaultWMHandler(i_message, i_wParam, i_lParam);
\r