OSDN Git Service

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