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