OSDN Git Service

enable command notify on x64
[yamy/yamy.git] / dlgsetting.cpp
1 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
2 // dlgsetting.cpp\r
3 \r
4 \r
5 #include "misc.h"\r
6 \r
7 #include "mayu.h"\r
8 #include "mayurc.h"\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
15 \r
16 #include <commctrl.h>\r
17 #include <windowsx.h>\r
18 \r
19 \r
20 ///\r
21 class DlgSetting : public LayoutManager\r
22 {\r
23         HWND m_hwndMayuPaths;                           ///\r
24 \r
25         ///\r
26         Registry m_reg;\r
27 \r
28         typedef DlgEditSettingData Data;                ///\r
29 \r
30         ///\r
31         void insertItem(int i_index, const Data &i_data) {\r
32                 LVITEM item;\r
33                 item.mask = LVIF_TEXT;\r
34                 item.iItem = i_index;\r
35 \r
36                 item.iSubItem = 0;\r
37                 item.pszText = const_cast<_TCHAR *>(i_data.m_name.c_str());\r
38                 CHECK_TRUE( ListView_InsertItem(m_hwndMayuPaths, &item) != -1 );\r
39 \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
44         }\r
45 \r
46         ///\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
54         }\r
55 \r
56         ///\r
57         void getItem(int i_index, Data *o_data) {\r
58                 _TCHAR buf[GANA_MAX_PATH];\r
59                 LVITEM item;\r
60                 item.mask = LVIF_TEXT;\r
61                 item.iItem = i_index;\r
62                 item.pszText = buf;\r
63                 item.cchTextMax = NUMBER_OF(buf);\r
64 \r
65                 item.iSubItem = 0;\r
66                 CHECK_TRUE( ListView_GetItem(m_hwndMayuPaths, &item) );\r
67                 o_data->m_name = item.pszText;\r
68 \r
69                 item.iSubItem = 1;\r
70                 CHECK_TRUE( ListView_GetItem(m_hwndMayuPaths, &item) );\r
71                 o_data->m_filename = item.pszText;\r
72 \r
73                 item.iSubItem = 2;\r
74                 CHECK_TRUE( ListView_GetItem(m_hwndMayuPaths, &item) );\r
75                 o_data->m_symbols = item.pszText;\r
76         }\r
77 \r
78         ///\r
79         void setSelectedItem(int i_index) {\r
80                 ListView_SetItemState(m_hwndMayuPaths, i_index,\r
81                                                           LVIS_SELECTED, LVIS_SELECTED);\r
82         }\r
83 \r
84         ///\r
85         int getSelectedItem() {\r
86                 if (ListView_GetSelectedCount(m_hwndMayuPaths) == 0)\r
87                         return -1;\r
88                 for (int i = 0; ; ++ i) {\r
89                         if (ListView_GetItemState(m_hwndMayuPaths, i, LVIS_SELECTED))\r
90                                 return i;\r
91                 }\r
92         }\r
93 \r
94 public:\r
95         ///\r
96         DlgSetting(HWND i_hwnd)\r
97                         : LayoutManager(i_hwnd),\r
98                         m_hwndMayuPaths(NULL),\r
99                         m_reg(MAYU_REGISTRY_ROOT) {\r
100         }\r
101 \r
102         /// WM_INITDIALOG\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
106 \r
107                 CHECK_TRUE( m_hwndMayuPaths = GetDlgItem(m_hwnd, IDC_LIST_mayuPaths) );\r
108 \r
109                 // create list view colmn\r
110                 RECT rc;\r
111                 GetClientRect(m_hwndMayuPaths, &rc);\r
112 \r
113                 LVCOLUMN lvc;\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
117 \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
127 \r
128                 Data data;\r
129                 insertItem(0, data);                            // TODO: why ?\r
130 \r
131                 // set list view\r
132                 tregex split(_T("^([^;]*);([^;]*);(.*)$"));\r
133                 tstringi dot_mayu;\r
134                 int i;\r
135                 for (i = 0; i < MAX_MAYU_REGISTRY_ENTRIES; ++ i) {\r
136                         _TCHAR buf[100];\r
137                         _sntprintf(buf, NUMBER_OF(buf), _T(".mayu%d"), i);\r
138                         if (!m_reg.read(buf, &dot_mayu))\r
139                                 break;\r
140 \r
141                         tsmatch what;\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
147                         }\r
148                 }\r
149 \r
150                 CHECK_TRUE( ListView_DeleteItem(m_hwndMayuPaths, i) );  // TODO: why ?\r
151 \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
156 \r
157                 ListView_SetExtendedListViewStyle(m_hwndMayuPaths, LVS_EX_FULLROWSELECT);\r
158 \r
159                 // set selection\r
160                 int index;\r
161                 m_reg.read(_T(".mayuIndex"), &index, 0);\r
162                 setSelectedItem(index);\r
163 \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
194                 return TRUE;\r
195         }\r
196 \r
197         /// WM_CLOSE\r
198         BOOL wmClose() {\r
199                 EndDialog(m_hwnd, 0);\r
200                 return TRUE;\r
201         }\r
202 \r
203         /// WM_NOTIFY\r
204         BOOL wmNotify(int i_id, NMHDR *i_nmh) {\r
205                 switch (i_id) {\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
209                         return TRUE;\r
210                 }\r
211                 return TRUE;\r
212         }\r
213 \r
214         /// WM_COMMAND\r
215         BOOL wmCommand(int /* i_notifyCode */, int i_id, HWND /* i_hwndControl */) {\r
216                 _TCHAR buf[GANA_MAX_PATH];\r
217                 switch (i_id) {\r
218                 case IDC_BUTTON_up:\r
219                 case IDC_BUTTON_down: {\r
220                         int count = ListView_GetItemCount(m_hwndMayuPaths);\r
221                         if (count < 2)\r
222                                 return TRUE;\r
223                         int index = getSelectedItem();\r
224                         if (index < 0 ||\r
225                                         (i_id == IDC_BUTTON_up && index == 0) ||\r
226                                         (i_id == IDC_BUTTON_down && index == count - 1))\r
227                                 return TRUE;\r
228 \r
229                         int target = (i_id == IDC_BUTTON_up) ? index - 1 : index + 1;\r
230 \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
236 \r
237                         setSelectedItem(target);\r
238                         return TRUE;\r
239                 }\r
240 \r
241                 case IDC_BUTTON_add: {\r
242                         Data data;\r
243                         int index = getSelectedItem();\r
244                         if (0 <= index)\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
251                                 }\r
252                         return TRUE;\r
253                 }\r
254 \r
255                 case IDC_BUTTON_delete: {\r
256                         int index = getSelectedItem();\r
257                         if (0 <= index) {\r
258                                 CHECK_TRUE( ListView_DeleteItem(m_hwndMayuPaths, index) );\r
259                                 int count = ListView_GetItemCount(m_hwndMayuPaths);\r
260                                 if (count == 0)\r
261                                         ;\r
262                                 else if (count == index)\r
263                                         setSelectedItem(index - 1);\r
264                                 else\r
265                                         setSelectedItem(index);\r
266                         }\r
267                         return TRUE;\r
268                 }\r
269 \r
270                 case IDC_BUTTON_edit: {\r
271                         Data data;\r
272                         int index = getSelectedItem();\r
273                         if (index < 0)\r
274                                 return TRUE;\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
280                         }\r
281                         return TRUE;\r
282                 }\r
283 \r
284                 case IDOK: {\r
285                         int count = ListView_GetItemCount(m_hwndMayuPaths);\r
286                         int index;\r
287                         for (index = 0; index < count; ++ index) {\r
288                                 _sntprintf(buf, NUMBER_OF(buf), _T(".mayu%d"), index);\r
289                                 Data data;\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
293                         }\r
294                         for (; ; ++ index) {\r
295                                 _sntprintf(buf, NUMBER_OF(buf), _T(".mayu%d"), index);\r
296                                 if (!m_reg.remove(buf))\r
297                                         break;\r
298                         }\r
299                         index = getSelectedItem();\r
300                         if (index < 0)\r
301                                 index = 0;\r
302                         m_reg.write(_T(".mayuIndex"), index);\r
303                         EndDialog(m_hwnd, 1);\r
304                         return TRUE;\r
305                 }\r
306 \r
307                 case IDCANCEL: {\r
308                         CHECK_TRUE( EndDialog(m_hwnd, 0) );\r
309                         return TRUE;\r
310                 }\r
311                 }\r
312                 return FALSE;\r
313         }\r
314 };\r
315 \r
316 \r
317 //\r
318 #ifdef MAYU64\r
319 INT_PTR CALLBACK dlgSetting_dlgProc(\r
320 #else\r
321 BOOL CALLBACK dlgSetting_dlgProc(\r
322 #endif\r
323         HWND i_hwnd, UINT i_message, WPARAM i_wParam, LPARAM i_lParam)\r
324 {\r
325         DlgSetting *wc;\r
326         getUserData(i_hwnd, &wc);\r
327         if (!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
332                 }\r
333         else\r
334                 switch (i_message) {\r
335                 case WM_COMMAND:\r
336                         return wc->wmCommand(HIWORD(i_wParam), LOWORD(i_wParam),\r
337                                                                  reinterpret_cast<HWND>(i_lParam));\r
338                 case WM_CLOSE:\r
339                         return wc->wmClose();\r
340                 case WM_NCDESTROY:\r
341                         delete wc;\r
342                         return TRUE;\r
343                 case WM_NOTIFY:\r
344                         return wc->wmNotify(static_cast<int>(i_wParam),\r
345                                                                 reinterpret_cast<NMHDR *>(i_lParam));\r
346                 default:\r
347                         return wc->defaultWMHandler(i_message, i_wParam, i_lParam);\r
348                 }\r
349         return FALSE;\r
350 }\r