OSDN Git Service

change EOL style to CRLF to adjust to default setting of Visual Studio
[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   {\r
33     LVITEM item;\r
34     item.mask = LVIF_TEXT;\r
35     item.iItem = i_index;\r
36     \r
37     item.iSubItem = 0;\r
38     item.pszText = const_cast<_TCHAR *>(i_data.m_name.c_str());\r
39     CHECK_TRUE( ListView_InsertItem(m_hwndMayuPaths, &item) != -1 );\r
40 \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
45   }\r
46   \r
47   ///\r
48   void setItem(int i_index, const Data &i_data)\r
49   {\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
56   }\r
57 \r
58   ///\r
59   void getItem(int i_index, Data *o_data)\r
60   {\r
61     _TCHAR buf[GANA_MAX_PATH];\r
62     LVITEM item;\r
63     item.mask = LVIF_TEXT;\r
64     item.iItem = i_index;\r
65     item.pszText = buf;\r
66     item.cchTextMax = NUMBER_OF(buf);\r
67     \r
68     item.iSubItem = 0;\r
69     CHECK_TRUE( ListView_GetItem(m_hwndMayuPaths, &item) );\r
70     o_data->m_name = item.pszText;\r
71     \r
72     item.iSubItem = 1;\r
73     CHECK_TRUE( ListView_GetItem(m_hwndMayuPaths, &item) );\r
74     o_data->m_filename = item.pszText;\r
75 \r
76     item.iSubItem = 2;\r
77     CHECK_TRUE( ListView_GetItem(m_hwndMayuPaths, &item) );\r
78     o_data->m_symbols = item.pszText;\r
79   }\r
80 \r
81   ///\r
82   void setSelectedItem(int i_index)\r
83   {\r
84     ListView_SetItemState(m_hwndMayuPaths, i_index,\r
85                           LVIS_SELECTED, LVIS_SELECTED);\r
86   }\r
87 \r
88   ///\r
89   int getSelectedItem()\r
90   {\r
91     if (ListView_GetSelectedCount(m_hwndMayuPaths) == 0)\r
92       return -1;\r
93     for (int i = 0; ; ++ i)\r
94     {\r
95       if (ListView_GetItemState(m_hwndMayuPaths, i, LVIS_SELECTED))\r
96         return i;\r
97     }\r
98   }\r
99 \r
100 public:\r
101   ///\r
102   DlgSetting(HWND i_hwnd)\r
103     : LayoutManager(i_hwnd),\r
104       m_hwndMayuPaths(NULL),\r
105       m_reg(MAYU_REGISTRY_ROOT)\r
106   {\r
107   }\r
108   \r
109   /// WM_INITDIALOG\r
110   BOOL wmInitDialog(HWND /* i_focus */, LPARAM /* i_lParam */)\r
111   {\r
112     setSmallIcon(m_hwnd, IDI_ICON_mayu);\r
113     setBigIcon(m_hwnd, IDI_ICON_mayu);\r
114     \r
115     CHECK_TRUE( m_hwndMayuPaths = GetDlgItem(m_hwnd, IDC_LIST_mayuPaths) );\r
116 \r
117     // create list view colmn\r
118     RECT rc;\r
119     GetClientRect(m_hwndMayuPaths, &rc);\r
120     \r
121     LVCOLUMN lvc; \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
125 \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
135 \r
136     Data data;\r
137     insertItem(0, data);                                // TODO: why ?\r
138     \r
139     // set list view\r
140     tregex split(_T("^([^;]*);([^;]*);(.*)$"));\r
141     tstringi dot_mayu;\r
142     int i;\r
143     for (i = 0; i < MAX_MAYU_REGISTRY_ENTRIES; ++ i)\r
144     {\r
145       _TCHAR buf[100];\r
146       _sntprintf(buf, NUMBER_OF(buf), _T(".mayu%d"), i);\r
147       if (!m_reg.read(buf, &dot_mayu))\r
148         break;\r
149 \r
150       tsmatch what;\r
151       if (boost::regex_match(dot_mayu, what, split))\r
152       {\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
157       }\r
158     }\r
159 \r
160     CHECK_TRUE( ListView_DeleteItem(m_hwndMayuPaths, i) );      // TODO: why ?\r
161 \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
166 \r
167     ListView_SetExtendedListViewStyle(m_hwndMayuPaths, LVS_EX_FULLROWSELECT);\r
168 \r
169     // set selection\r
170     int index;\r
171     m_reg.read(_T(".mayuIndex"), &index, 0);\r
172     setSelectedItem(index);\r
173 \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
204     return TRUE;\r
205   }\r
206 \r
207   /// WM_CLOSE\r
208   BOOL wmClose()\r
209   {\r
210     EndDialog(m_hwnd, 0);\r
211     return TRUE;\r
212   }\r
213 \r
214   /// WM_NOTIFY\r
215   BOOL wmNotify(int i_id, NMHDR *i_nmh)\r
216   {\r
217     switch (i_id)\r
218     {\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
222         return TRUE;\r
223     }\r
224     return TRUE;\r
225   }\r
226   \r
227   /// WM_COMMAND\r
228   BOOL wmCommand(int /* i_notifyCode */, int i_id, HWND /* i_hwndControl */)\r
229   {\r
230     _TCHAR buf[GANA_MAX_PATH];\r
231     switch (i_id)\r
232     {\r
233       case IDC_BUTTON_up:\r
234       case IDC_BUTTON_down:\r
235       {\r
236         int count = ListView_GetItemCount(m_hwndMayuPaths);\r
237         if (count < 2)\r
238           return TRUE;\r
239         int index = getSelectedItem();\r
240         if (index < 0 ||\r
241             (i_id == IDC_BUTTON_up && index == 0) ||\r
242             (i_id == IDC_BUTTON_down && index == count - 1))\r
243           return TRUE;\r
244 \r
245         int target = (i_id == IDC_BUTTON_up) ? index - 1 : index + 1;\r
246 \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
252         \r
253         setSelectedItem(target);\r
254         return TRUE;\r
255       }\r
256       \r
257       case IDC_BUTTON_add:\r
258       {\r
259         Data data;\r
260         int index = getSelectedItem();\r
261         if (0 <= index)\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
266           {\r
267             insertItem(0, data);\r
268             setSelectedItem(0);\r
269           }\r
270         return TRUE;\r
271       }\r
272       \r
273       case IDC_BUTTON_delete:\r
274       {\r
275         int index = getSelectedItem();\r
276         if (0 <= index)\r
277         {\r
278           CHECK_TRUE( ListView_DeleteItem(m_hwndMayuPaths, index) );\r
279           int count = ListView_GetItemCount(m_hwndMayuPaths);\r
280           if (count == 0)\r
281             ;\r
282           else if (count == index)\r
283             setSelectedItem(index - 1);\r
284           else\r
285             setSelectedItem(index);\r
286         }\r
287         return TRUE;\r
288       }\r
289       \r
290       case IDC_BUTTON_edit:\r
291       {\r
292         Data data;\r
293         int index = getSelectedItem();\r
294         if (index < 0)\r
295           return TRUE;\r
296         getItem(index, &data);\r
297         if (DialogBoxParam(g_hInst, MAKEINTRESOURCE(IDD_DIALOG_editSetting),\r
298                            m_hwnd, dlgEditSetting_dlgProc, (LPARAM)&data))\r
299         {\r
300           setItem(index, data);\r
301           setSelectedItem(index);\r
302         }\r
303         return TRUE;\r
304       }\r
305       \r
306       case IDOK:\r
307       {\r
308         int count = ListView_GetItemCount(m_hwndMayuPaths);\r
309         int index;\r
310         for (index = 0; index < count; ++ index)\r
311         {\r
312           _sntprintf(buf, NUMBER_OF(buf), _T(".mayu%d"), index);\r
313           Data data;\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
317         }\r
318         for (; ; ++ index)\r
319         {\r
320           _sntprintf(buf, NUMBER_OF(buf), _T(".mayu%d"), index);\r
321           if (!m_reg.remove(buf))\r
322             break;\r
323         }\r
324         index = getSelectedItem();\r
325         if (index < 0)\r
326           index = 0;\r
327         m_reg.write(_T(".mayuIndex"), index);\r
328         EndDialog(m_hwnd, 1);\r
329         return TRUE;\r
330       }\r
331       \r
332       case IDCANCEL:\r
333       {\r
334         CHECK_TRUE( EndDialog(m_hwnd, 0) );\r
335         return TRUE;\r
336       }\r
337     }\r
338     return FALSE;\r
339   }\r
340 };\r
341 \r
342 \r
343 //\r
344 #ifdef MAYU64\r
345 INT_PTR CALLBACK dlgSetting_dlgProc(\r
346 #else\r
347 BOOL CALLBACK dlgSetting_dlgProc(\r
348 #endif\r
349   HWND i_hwnd, UINT i_message, WPARAM i_wParam, LPARAM i_lParam)\r
350 {\r
351   DlgSetting *wc;\r
352   getUserData(i_hwnd, &wc);\r
353   if (!wc)\r
354     switch (i_message)\r
355     {\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
359     }\r
360   else\r
361     switch (i_message)\r
362     {\r
363       case WM_COMMAND:\r
364         return wc->wmCommand(HIWORD(i_wParam), LOWORD(i_wParam),\r
365                              reinterpret_cast<HWND>(i_lParam));\r
366       case WM_CLOSE:\r
367         return wc->wmClose();\r
368       case WM_NCDESTROY:\r
369         delete wc;\r
370         return TRUE;\r
371       case WM_NOTIFY:\r
372         return wc->wmNotify(static_cast<int>(i_wParam),\r
373                             reinterpret_cast<NMHDR *>(i_lParam));\r
374       default:\r
375         return wc->defaultWMHandler(i_message, i_wParam, i_lParam);\r
376     }\r
377   return FALSE;\r
378 }\r