OSDN Git Service

Change when encrypting, ask password twice.
[tombo/Tombo.git] / Src / Win32Platform.cpp
1 #if defined(PLATFORM_WIN32)\r
2 #include <windows.h>\r
3 #include <commctrl.h>\r
4 #include <tchar.h>\r
5 \r
6 #include "Tombo.h"\r
7 #include "resource.h"\r
8 #include "PlatformLayer.h"\r
9 #include "Win32Platform.h"\r
10 #include "StatusBar.h"\r
11 #include "Property.h"\r
12 #include "Message.h"\r
13 \r
14 #define NUM_MY_TOOLBAR_BMPS 12\r
15 \r
16 #define NUM_TOOLBAR_BUTTONS 19\r
17 static TBBUTTON aToolbarButtons[NUM_TOOLBAR_BUTTONS] = {\r
18         {STD_FILENEW + NUM_MY_TOOLBAR_BMPS,  IDM_NEWMEMO,    TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0, -1},\r
19         {STD_FILESAVE + NUM_MY_TOOLBAR_BMPS, IDM_SAVE,       TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0, -1},\r
20         {0,                                  0,              TBSTATE_ENABLED, TBSTYLE_SEP,    0, 0, 0, -1},\r
21         {STD_CUT + NUM_MY_TOOLBAR_BMPS,      IDM_CUT,        TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0, -1},\r
22         {STD_COPY + NUM_MY_TOOLBAR_BMPS,     IDM_COPY,       TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0, -1},\r
23         {STD_PASTE + NUM_MY_TOOLBAR_BMPS,    IDM_PASTE,      TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0, -1},\r
24         {0,                                  0,              TBSTATE_ENABLED, TBSTYLE_SEP,    0, 0, 0, -1},\r
25         {STD_DELETE + NUM_MY_TOOLBAR_BMPS,   IDM_DELETEITEM, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0, -1},\r
26         {0,                                  0,              TBSTATE_ENABLED, TBSTYLE_SEP,    0, 0, 0, -1},\r
27         {3,                                  IDM_INSDATE1,   TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0, -1},\r
28         {4,                                  IDM_INSDATE2,   TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0, -1},\r
29         {0,                                  0,              TBSTATE_ENABLED, TBSTYLE_SEP,    0, 0, 0, -1},\r
30         {9,                                  IDM_SEARCH,     TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0, -1},\r
31         {7,                                  IDM_SEARCH_PREV,              0, TBSTYLE_BUTTON, 0, 0, 0, -1},\r
32         {8,                                  IDM_SEARCH_NEXT,              0, TBSTYLE_BUTTON, 0, 0, 0, -1},\r
33         {0,                                  0,              TBSTATE_ENABLED, TBSTYLE_SEP,    0, 0, 0, -1},\r
34         {6,                                  IDM_TOGGLEPANE, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0, -1},\r
35         {10,                                 IDM_TOPMOST,    TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0, -1},\r
36         {0,                                  0,              TBSTATE_ENABLED, TBSTYLE_SEP,    0, 0, 0, -1},\r
37 };\r
38 \r
39 Win32Platform::Win32Platform() : pStatusBar(NULL)\r
40 {\r
41 }\r
42 \r
43 Win32Platform::~Win32Platform()\r
44 {\r
45         delete pStatusBar;\r
46 }\r
47 \r
48 static HWND CreateToolBar(HWND hParent, HINSTANCE hInst)\r
49 {\r
50         HWND hwndTB;\r
51         TBADDBITMAP tbab;\r
52 \r
53         hwndTB = CreateWindowEx(WS_EX_TOOLWINDOW, TOOLBARCLASSNAME, (LPSTR)NULL, \r
54                                                         WS_CHILD | \r
55                                                         WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CCS_NODIVIDER | CCS_NORESIZE |\r
56                                                         TBSTYLE_FLAT | TBSTYLE_ALTDRAG |\r
57                                                         TBSTYLE_TOOLTIPS| CCS_ADJUSTABLE ,\r
58                                                         0, 0, 0, 0, \r
59                                                         hParent, (HMENU)IDC_TOOLBAR, hInst, NULL);\r
60         SendMessage(hwndTB, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);\r
61 \r
62         tbab.hInst = hInst;\r
63         tbab.nID = IDB_TOOLBAR;\r
64     SendMessage(hwndTB, TB_ADDBITMAP, (WPARAM) 3, (LPARAM) &tbab);  \r
65 \r
66         tbab.hInst = HINST_COMMCTRL;\r
67         tbab.nID = IDB_STD_SMALL_COLOR;\r
68     SendMessage(hwndTB, TB_ADDBITMAP, (WPARAM) NUM_TOOLBAR_BUTTONS, (LPARAM) &tbab);  \r
69 \r
70     \r
71         SendMessage(hwndTB, TB_ADDBUTTONS, (WPARAM) NUM_TOOLBAR_BUTTONS, \r
72         (LPARAM) (LPTBBUTTON) &aToolbarButtons); \r
73      return hwndTB; \r
74 }\r
75 \r
76 void Win32Platform::Create(HWND hWnd, HINSTANCE hInst)\r
77 {\r
78         pStatusBar = new StatusBar();\r
79         pStatusBar->Create(hWnd, g_Property.GetUseTwoPane());\r
80 \r
81          hRebar = CreateWindowEx(WS_EX_TOOLWINDOW, REBARCLASSNAME, NULL,\r
82                                                                 WS_BORDER | RBS_BANDBORDERS | RBS_AUTOSIZE | \r
83                                                                 WS_CHILD | WS_CLIPSIBLINGS| RBS_TOOLTIPS | \r
84                                                                 WS_CLIPCHILDREN|RBS_VARHEIGHT,\r
85                                                                 0, 0, 0, 0,\r
86                                                                 hWnd, NULL, hInst, NULL);\r
87         REBARINFO rbi;\r
88         rbi.cbSize = sizeof(rbi);\r
89         rbi.fMask = 0;\r
90         rbi.himl = NULL;\r
91         SendMessage(hRebar, RB_SETBARINFO, 0, (LPARAM)&rbi);\r
92 \r
93         hToolBar = CreateToolBar(hRebar, hInst);\r
94 \r
95         REBARBANDINFO rbband;\r
96         rbband.cbSize = sizeof(rbband);\r
97         rbband.fMask = RBBIM_SIZE | RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_STYLE ;\r
98         rbband.fStyle = RBBS_CHILDEDGE | RBBS_GRIPPERALWAYS;\r
99 \r
100         DWORD dwBtnSize = SendMessage(hToolBar, TB_GETBUTTONSIZE, 0, 0);\r
101 \r
102         rbband.cbSize = sizeof(rbband);\r
103         rbband.hwndChild  = hToolBar;\r
104         rbband.cxMinChild = 0;\r
105         rbband.cyMinChild = HIWORD(dwBtnSize);\r
106         rbband.cx         = 250;\r
107 \r
108         SendMessage(hRebar, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbband);\r
109         SendMessage(hRebar, RB_MAXIMIZEBAND, 0, 0);\r
110 }\r
111 \r
112 void Win32Platform::EnableMenu(UINT uId, BOOL bEnable)\r
113 {\r
114         BOOL bTB = FALSE;\r
115         HWND hTB;\r
116 \r
117         switch (uId) {\r
118         case IDM_DELETEITEM:\r
119         case IDM_NEWMEMO:\r
120         case IDM_CUT:\r
121         case IDM_COPY:\r
122         case IDM_PASTE:\r
123         case IDM_SAVE:\r
124                 bTB = TRUE;\r
125                 hTB = GetMainToolBar();\r
126         default:\r
127                 break;\r
128         }\r
129 \r
130         HMENU hMenu = GetMainMenu();\r
131 \r
132         UINT uFlg1;\r
133         if (bEnable) {\r
134                 uFlg1 = MF_BYCOMMAND | MF_ENABLED;\r
135         } else {\r
136                 uFlg1 = MF_BYCOMMAND | MF_GRAYED | MF_DISABLED;\r
137         }\r
138         EnableMenuItem(hMenu, uId, uFlg1);\r
139 \r
140         if (bTB) {\r
141                 int x = SendMessage(hTB, TB_ENABLEBUTTON, uId, MAKELONG(bEnable, 0));\r
142         }\r
143 }\r
144 \r
145 void Win32Platform::ControlMenu(BOOL bTreeActive)\r
146 {\r
147         HMENU hMenu = GetMainMenu();\r
148 \r
149         UINT uDisableFlg = MF_BYCOMMAND | MF_GRAYED;\r
150 #if defined(PLATFORM_WIN32)\r
151         uDisableFlg |= MF_DISABLED;\r
152 #endif\r
153 \r
154         UINT uFlg1, uFlg2;\r
155         if (bTreeActive) {\r
156                 uFlg1 = MF_BYCOMMAND | MF_ENABLED;\r
157                 uFlg2 = uDisableFlg;\r
158         } else {\r
159                 uFlg1 = uDisableFlg;\r
160                 uFlg2 = MF_BYCOMMAND | MF_ENABLED;\r
161         }\r
162 \r
163         EnableMenuItem(hMenu, IDM_FORGETPASS, uFlg1);\r
164         EnableMenuItem(hMenu, IDM_PROPERTY, uFlg1);\r
165 \r
166         EnableMenuItem(hMenu, IDM_INSDATE1, uFlg2);\r
167         EnableMenuItem(hMenu, IDM_INSDATE2, uFlg2);\r
168         EnableMenuItem(hMenu, IDM_DETAILS_HSCROLL, uFlg2);\r
169 }\r
170 \r
171 void Win32Platform::ControlToolbar(BOOL bTreeActive)\r
172 {\r
173         SendMessage(hToolBar, TB_ENABLEBUTTON, IDM_INSDATE1, MAKELONG(!bTreeActive, 0));\r
174         SendMessage(hToolBar, TB_ENABLEBUTTON, IDM_INSDATE2, MAKELONG(!bTreeActive, 0));\r
175 }\r
176 \r
177 void Win32Platform::OpenDetailsView()\r
178 {\r
179         ControlMenu(FALSE);\r
180         ControlToolbar(FALSE);\r
181 }\r
182 \r
183 void Win32Platform::CloseDetailsView()\r
184 {\r
185         ControlMenu(TRUE);\r
186         ControlToolbar(TRUE);\r
187 }\r
188 \r
189 void Win32Platform::EnableSearchNext()\r
190 {\r
191         SendMessage(hToolBar, TB_SETSTATE, IDM_SEARCH_PREV, MAKELONG(TBSTATE_ENABLED, 0)); \r
192         SendMessage(hToolBar, TB_SETSTATE, IDM_SEARCH_NEXT, MAKELONG(TBSTATE_ENABLED, 0)); \r
193 }\r
194 \r
195 void Win32Platform::AdjustUserRect(RECT *pRect)\r
196 {\r
197         // get rebar height\r
198         WORD nRebarH;\r
199 \r
200         if (g_Property.GetHideRebar()) {\r
201                 nRebarH = 0;\r
202         } else {\r
203                 RECT r;\r
204                 GetWindowRect(hRebar, &r);\r
205                 nRebarH = (WORD)(r.bottom - r.top);\r
206         }\r
207 \r
208         // get statusbar height\r
209         WORD nStatusHeight;\r
210         if (g_Property.GetHideStatusBar()) {\r
211                 nStatusHeight = 0;\r
212         } else {\r
213                 nStatusHeight = GetStatusBarHeight();\r
214         }\r
215 \r
216         pRect->top = nRebarH;\r
217         pRect->bottom -= (nRebarH + nStatusHeight);\r
218 \r
219 }\r
220 \r
221 void Win32Platform::CheckMenu(UINT uid, BOOL bCheck)\r
222 {\r
223         HMENU hMenu;\r
224         BOOL bNegButton = FALSE;\r
225         switch(uid) {\r
226         case IDM_TOGGLEPANE:\r
227                 bNegButton = TRUE;\r
228                 hMenu = GetMainMenu();\r
229                 break;\r
230         case IDM_DETAILS_HSCROLL:\r
231                 hMenu = GetMDToolMenu();\r
232                 break;\r
233         default:\r
234                 return;\r
235         }\r
236 \r
237         BOOL bButton = bNegButton ? !bCheck : bCheck;\r
238 \r
239         // CheckMenuItem is superseeded funcs, but in CE, SetMenuItemInfo can't set values, so use it.\r
240         CheckMenuItem(hMenu, uid, MF_BYCOMMAND | (bCheck ? MF_CHECKED : MF_UNCHECKED));\r
241         SendMessage(hToolBar, TB_PRESSBUTTON, uid, MAKELONG(bButton, 0));\r
242 }\r
243 \r
244 void Win32Platform::ShowStatusBar(BOOL bShow)\r
245 {\r
246         pStatusBar->Show(bShow);\r
247 }\r
248 \r
249 void Win32Platform::ShowRebar(BOOL bShow)\r
250 {\r
251         if (bShow) {\r
252                 ShowWindow(hRebar, SW_SHOW);\r
253         } else {\r
254                 ShowWindow(hRebar, SW_HIDE);\r
255         }\r
256 }\r
257 \r
258 void Win32Platform::SetStatusIndicator(DWORD nPos, LPCTSTR pText, BOOL bDisp)\r
259 {\r
260         pStatusBar->SetStatusIndicator(nPos, pText, bDisp);\r
261 }\r
262 \r
263 WORD Win32Platform::GetStatusBarHeight()\r
264 {\r
265         return pStatusBar->GetHeight();\r
266 }\r
267 \r
268 void Win32Platform::ResizeStatusBar(WPARAM wParam, LPARAM lParam)\r
269 {\r
270         SendMessage(hRebar, WM_SIZE, wParam, lParam);\r
271 \r
272         pStatusBar->SendSize(wParam, lParam);\r
273         pStatusBar->ResizeStatusBar();\r
274 }\r
275 \r
276 void Win32Platform::GetStatusWindowRect(RECT *pRect)\r
277 {\r
278         pStatusBar->GetWindowRect(pRect);\r
279 }\r
280 \r
281 ///////////////////////////////////////////////////\r
282 // Load i18nized menu\r
283 ///////////////////////////////////////////////////\r
284 \r
285 static void InsertBaseMenu(HMENU hMain, int pos, LPCTSTR pText, HMENU hSub)\r
286 {\r
287         MENUITEMINFO mii;\r
288         memset(&mii, 0, sizeof(mii));\r
289         mii.cbSize = sizeof(mii);\r
290 \r
291         mii.fMask = MIIM_DATA | MIIM_TYPE | MIIM_SUBMENU;\r
292         mii.fType = MFT_STRING;\r
293         mii.dwTypeData = (LPTSTR)pText;\r
294         mii.cch = _tcslen(pText);\r
295         mii.hSubMenu = hSub;\r
296         InsertMenuItem(hMain, pos, FALSE, &mii);\r
297 }\r
298 \r
299 static MenuMsgRes aFileMenu[] = {\r
300         {  0, IDM_NEWMEMO,    0, MSG_ID_MENUITEM_W32_F_NEWMEMO },\r
301         {  1, IDM_NEWFOLDER,  0, MSG_ID_MENUITEM_W32_F_NEWFOLDER },\r
302         {  2, IDM_RENAME,     0, MSG_ID_MENUITEM_W32_F_RENAME },\r
303         {  3, IDM_DELETEITEM, 0, MSG_ID_MENUITEM_W32_F_DEL },\r
304         {  4, -1,             0, 0},\r
305         {  5, IDM_SAVE,       0, MSG_ID_MENUITEM_W32_F_SAVE },\r
306         {  6, IDM_EXIT,       0, MSG_ID_MENUITEM_W32_F_EXIT},\r
307 };\r
308 \r
309 static MenuMsgRes aEditMenu[] = {\r
310         {  0, IDM_CUT,         0,         MSG_ID_MENUITEM_W32_E_CUT },\r
311         {  1, IDM_COPY,        0,         MSG_ID_MENUITEM_W32_E_COPY },\r
312         {  2, IDM_PASTE,       0,         MSG_ID_MENUITEM_W32_E_PASTE },\r
313         {  3, -1,              0,         0 },\r
314         {  4, IDM_SELALL,      0,         MSG_ID_MENUITEM_W32_E_SELALL },\r
315         {  5, -1,              0,         0 },\r
316         {  6, IDM_SEARCH,      0,         MSG_ID_MENUITEM_W32_E_FIND },\r
317         {  7, IDM_SEARCH_NEXT, 0,         MSG_ID_MENUITEM_W32_E_FINDNEXT },\r
318         {  8, IDM_SEARCH_PREV, 0,         MSG_ID_MENUITEM_W32_E_FINDPREV },\r
319         {  9, -1,              0,         0 },\r
320         { 10, IDM_GREP,        0,         MSG_ID_MENUITEM_W32_E_QFILTER },\r
321         { 11, -1,              0,         0 },\r
322         { 12, IDM_INSDATE1,    MF_GRAYED, MSG_ID_MENUITEM_W32_E_DATE1 },\r
323         { 13, IDM_INSDATE2,    MF_GRAYED, MSG_ID_MENUITEM_W32_E_DATE2 },\r
324 };\r
325 \r
326 static MenuMsgRes aBookMarkMenu[] = {\r
327         { 0, IDM_BOOKMARK_ADD,    0, MSG_ID_MENUITEM_W32_B_ADDBM },\r
328         { 1, IDM_BOOKMARK_CONFIG, 0, MSG_ID_MENUITEM_W32_B_EDITBM },\r
329         { 2, -1,                  0, 0 },\r
330 };\r
331 \r
332 static MenuMsgRes aToolMenu[] = {\r
333         {  0, IDM_DETAILS_HSCROLL, MF_CHECKED | MF_GRAYED, MSG_ID_MENUITEM_W32_T_WRAPTEXT },\r
334         {  1, IDM_TOGGLEPANE,      MF_CHECKED,             MSG_ID_MENUITEM_W32_T_TWOPANE },\r
335         {  2, IDM_SHOWREBAR,       MF_CHECKED,             MSG_ID_MENUITEM_W32_T_REBAR },\r
336         {  3, IDM_SHOWSTATUSBAR,   MF_CHECKED,             MSG_ID_MENUITEM_W32_T_STATUSBAR },\r
337         {  4, IDM_TOPMOST,         0,                      MSG_ID_MENUITEM_W32_T_STAYTOPMOST },\r
338         {  5, -1,                  0,                      0 },\r
339         {  6, IDM_ENCRYPT,         MF_GRAYED,              MSG_ID_MENUITEM_W32_T_ENCRYPT },\r
340         {  7, IDM_DECRYPT,         MF_GRAYED,              MSG_ID_MENUITEM_W32_T_DECRYPT },\r
341         {  8, -1,                  0,                      0 },\r
342         {  9, IDM_FORGETPASS,      0,                      MSG_ID_MENUITEM_W32_T_ERASEPASS },\r
343         { 10, -1,                  0,                      0 },\r
344         { 11, IDM_VFOLDER_DEF,     0,                      MSG_ID_MENUITEM_W32_T_VIRTUALFOLDER },\r
345         { 12, IDM_PROPERTY,        0,                      MSG_ID_MENUITEM_W32_T_OPTIONS },\r
346 };\r
347 \r
348 static MenuMsgRes aHelpMenu[] = {\r
349         { 0, IDM_ABOUT, 0, MSG_ID_MENUITEM_W32_H_ABOUT },\r
350 };\r
351 \r
352 \r
353 HMENU Win32Platform::LoadMainMenu()\r
354 {\r
355         HMENU hMainM = CreateMenu();\r
356 \r
357         HMENU hSub;\r
358         OverrideMenuTitle(hSub = CreateMenu(), aFileMenu, sizeof(aFileMenu)/sizeof(MenuMsgRes));\r
359         InsertBaseMenu(hMainM, 0, MSG_MENUITEM_W32B_FILE, hSub);\r
360         OverrideMenuTitle(hSub = CreateMenu(), aEditMenu, sizeof(aEditMenu)/sizeof(MenuMsgRes));\r
361         InsertBaseMenu(hMainM, 1, MSG_MENUITEM_W32B_EDIT, hSub);\r
362         OverrideMenuTitle(hSub = CreateMenu(), aBookMarkMenu, sizeof(aBookMarkMenu)/sizeof(MenuMsgRes));\r
363         InsertBaseMenu(hMainM, 1, MSG_MENUITEM_W32B_BOOKMARK, hSub);\r
364         OverrideMenuTitle(hSub = CreateMenu(), aToolMenu, sizeof(aToolMenu)/sizeof(MenuMsgRes));\r
365         InsertBaseMenu(hMainM, 1, MSG_MENUITEM_W32B_TOOL, hSub);\r
366         OverrideMenuTitle(hSub = CreateMenu(), aHelpMenu, sizeof(aHelpMenu)/sizeof(MenuMsgRes));\r
367         InsertBaseMenu(hMainM, 1, MSG_MENUITEM_W32B_HELP, hSub);\r
368         return hMainM;\r
369 }\r
370 \r
371 #endif // PLATFORM_WIN32