5
#include "Common/StringConvert.h"
7
#include "Windows/Menu.h"
8
#include "Windows/Error.h"
9
#include "Windows/Clipboard.h"
11
#include "../../PropID.h"
15
#include "AboutDialog.h"
16
#include "../Common/CompressCall.h"
18
#include "HelpUtils.h"
19
#include "LangUtils.h"
20
#include "PluginInterface.h"
22
static const UINT kOpenBookmarkMenuID = 730;
23
static const UINT kSetBookmarkMenuID = 740;
25
extern HINSTANCE g_hInstance;
27
static LPCWSTR kFMHelpTopic = L"FM/index.htm";
29
extern void OptionsDialog(HWND hwndOwner, HINSTANCE hInstance);
31
using namespace NWindows;
33
static const int kFileMenuIndex = 0;
34
static const int kEditMenuIndex = 1;
35
static const int kViewMenuIndex = 2;
36
static const int kBookmarksMenuIndex = kViewMenuIndex + 1;
38
struct CStringLangPair
44
static CStringLangPair kStringLangPairs[] =
46
{ L"&File", 0x03000102 },
47
{ L"&Edit", 0x03000103 },
48
{ L"&View", 0x03000104 },
49
{ L"&Bookmarks", 0x03000107 },
50
{ L"&Tools", 0x03000105 },
51
{ L"&Help", 0x03000106 },
54
UINT32 kAddToFavoritesLangID = 0x03000710;
55
UINT32 kToolbarsLangID = 0x03000451;
58
static int FindStringLangItem(const UString &anItem)
60
for (int i = 0; i < sizeof(kStringLangPairs) /
61
sizeof(kStringLangPairs[0]); i++)
62
if (anItem.CompareNoCase(kStringLangPairs[i].String) == 0)
68
static CIDLangPair kIDLangPairs[] =
71
{ IDM_FILE_OPEN, 0x03000210 },
72
{ IDM_FILE_OPEN_INSIDE, 0x03000211 },
73
{ IDM_FILE_OPEN_OUTSIDE, 0x03000212 },
74
{ IDM_FILE_VIEW, 0x03000220 },
75
{ IDM_FILE_EDIT, 0x03000221 },
76
{ IDM_RENAME, 0x03000230 },
77
{ IDM_COPY_TO, 0x03000231 },
78
{ IDM_MOVE_TO, 0x03000232 },
79
{ IDM_DELETE, 0x03000233 },
80
{ IDM_FILE_PROPERTIES, 0x03000240 },
81
{ IDM_FILE_COMMENT, 0x03000241 },
82
{ IDM_FILE_CRC, 0x03000242 },
83
{ IDM_FILE_SPLIT, 0x03000270 },
84
{ IDM_FILE_COMBINE, 0x03000271 },
85
{ IDM_CREATE_FOLDER, 0x03000250 },
86
{ IDM_CREATE_FILE, 0x03000251 },
87
{ IDCLOSE, 0x03000260 },
90
{ IDM_EDIT_CUT, 0x03000320 },
91
{ IDM_EDIT_COPY, 0x03000321 },
92
{ IDM_EDIT_PASTE, 0x03000322 },
94
{ IDM_SELECT_ALL, 0x03000330 },
95
{ IDM_DESELECT_ALL, 0x03000331 },
96
{ IDM_INVERT_SELECTION, 0x03000332 },
97
{ IDM_SELECT, 0x03000333 },
98
{ IDM_DESELECT, 0x03000334 },
99
{ IDM_SELECT_BY_TYPE, 0x03000335 },
100
{ IDM_DESELECT_BY_TYPE, 0x03000336 },
102
{ IDM_VIEW_LARGE_ICONS, 0x03000410 },
103
{ IDM_VIEW_SMALL_ICONS, 0x03000411 },
104
{ IDM_VIEW_LIST, 0x03000412 },
105
{ IDM_VIEW_DETAILS, 0x03000413 },
107
{ IDM_VIEW_ARANGE_BY_NAME, 0x02000204 },
108
{ IDM_VIEW_ARANGE_BY_TYPE, 0x02000214 },
109
{ IDM_VIEW_ARANGE_BY_DATE, 0x0200020C },
110
{ IDM_VIEW_ARANGE_BY_SIZE, 0x02000207 },
111
{ IDM_VIEW_ARANGE_NO_SORT, 0x03000420 },
113
{ IDM_OPEN_ROOT_FOLDER, 0x03000430 },
114
{ IDM_OPEN_PARENT_FOLDER, 0x03000431 },
115
{ IDM_FOLDERS_HISTORY, 0x03000432 },
117
{ IDM_VIEW_REFRESH, 0x03000440 },
119
{ IDM_VIEW_FLAT_VIEW, 0x03000449 },
120
{ IDM_VIEW_TWO_PANELS, 0x03000450 },
121
{ IDM_VIEW_ARCHIVE_TOOLBAR, 0x03000460 },
122
{ IDM_VIEW_STANDARD_TOOLBAR, 0x03000461 },
123
{ IDM_VIEW_TOOLBARS_LARGE_BUTTONS, 0x03000462 },
124
{ IDM_VIEW_TOOLBARS_SHOW_BUTTONS_TEXT, 0x03000463 },
126
{ IDM_OPTIONS, 0x03000510 },
127
{ IDM_BENCHMARK, 0x03000511 },
129
{ IDM_HELP_CONTENTS, 0x03000610 },
130
{ IDM_ABOUT, 0x03000620 }
134
static int FindLangItem(int ControlID)
136
for (int i = 0; i < sizeof(kIDLangPairs) / sizeof(kIDLangPairs[0]); i++)
137
if (kIDLangPairs[i].ControlID == ControlID)
144
static bool g_IsNew_fMask = true;
151
g_IsNew_fMask = false;
153
vi.dwOSVersionInfoSize = sizeof(vi);
154
if (::GetVersionEx(&vi))
156
g_IsNew_fMask = (vi.dwMajorVersion > 4 ||
157
(vi.dwMajorVersion == 4 && vi.dwMinorVersion > 0));
159
g_IsNew_fMask = false;
163
// it's hack for supporting Windows NT
164
// constants are from WinUser.h
167
#define MIIM_STRING 0x00000040
168
#define MIIM_BITMAP 0x00000080
169
#define MIIM_FTYPE 0x00000100
172
static UINT Get_fMaskForString()
174
return g_IsNew_fMask ? MIIM_STRING : MIIM_TYPE;
177
static UINT Get_fMaskForFTypeAndString()
179
return g_IsNew_fMask ? (MIIM_STRING | MIIM_FTYPE) : MIIM_TYPE;
183
static UINT Get_fMaskForString()
188
static UINT Get_fMaskForFTypeAndString()
195
static void MyChangeMenu(HMENU menuLoc, int level, int menuIndex)
198
menu.Attach(menuLoc);
199
for (int i = 0; i < menu.GetItemCount(); i++)
202
item.fMask = Get_fMaskForString() | MIIM_SUBMENU | MIIM_ID;
203
item.fType = MFT_STRING;
204
if (menu.GetItem(i, true, item))
209
if (level == 1 && menuIndex == kBookmarksMenuIndex)
210
newString = LangString(kAddToFavoritesLangID);
213
MyChangeMenu(item.hSubMenu, level + 1, i);
214
if (level == 1 && menuIndex == kViewMenuIndex)
216
newString = LangString(kToolbarsLangID);
220
if (level == 0 && i < sizeof(kStringLangPairs) /
221
sizeof(kStringLangPairs[0]))
222
newString = LangString(kStringLangPairs[i].LangID);
227
if (newString.IsEmpty())
232
int langPos = FindLangItem(item.wID);
235
newString = LangString(kIDLangPairs[langPos].LangID);
236
if (newString.IsEmpty())
238
UString shorcutString = item.StringValue;
239
int tabPos = shorcutString.ReverseFind(wchar_t('\t'));
241
newString += shorcutString.Mid(tabPos);
244
item.StringValue = newString;
245
item.fMask = Get_fMaskForString();
246
item.fType = MFT_STRING;
247
menu.SetItem(i, true, item);
255
class CFileMenuDestroyer
258
~CFileMenuDestroyer()
260
if ((HMENU)g_FileMenu != 0)
261
g_FileMenu.Destroy();
263
} g_FileMenuDestroyer;
266
void MyLoadMenu(HWND hWnd)
268
if ((HMENU)g_FileMenu != 0)
269
g_FileMenu.Destroy();
270
HMENU oldMenu = ::GetMenu(hWnd);
271
HMENU baseMenu = ::LoadMenu(g_hInstance, MAKEINTRESOURCE(IDM_MENU));
272
::SetMenu(hWnd, baseMenu);
273
::DestroyMenu(oldMenu);
274
if (!g_LangID.IsEmpty())
276
HMENU menuOld = ::GetMenu(hWnd);
277
MyChangeMenu(menuOld, 0, 0);
288
static void CopyMenu(HMENU srcMenuSpec, HMENU destMenuSpec)
291
srcMenu.Attach(srcMenuSpec);
293
destMenu.Attach(destMenuSpec);
295
for (int i = 0; i < srcMenu.GetItemCount(); i++)
298
item.fMask = MIIM_STATE | MIIM_ID | Get_fMaskForFTypeAndString();
299
item.fType = MFT_STRING;
300
if (srcMenu.GetItem(i, true, item))
301
if (destMenu.InsertItem(startPos, true, item))
306
void OnMenuActivating(HWND /* hWnd */, HMENU hMenu, int position)
308
if (::GetSubMenu(::GetMenu(g_HWND), position) != hMenu)
310
if (position == kFileMenuIndex)
312
if ((HMENU)g_FileMenu == 0)
314
g_FileMenu.CreatePopup();
315
CopyMenu(hMenu, g_FileMenu);
319
while (menu.GetItemCount() > 0)
321
if (!menu.RemoveItem(0, MF_BYPOSITION))
324
// CopyMenu(g_FileMenu, hMenu);
325
g_App.GetFocusedPanel().CreateFileMenu(hMenu);
327
else if (position == kEditMenuIndex)
332
menu.EnableItem(IDM_EDIT_CUT, MF_ENABLED);
333
menu.EnableItem(IDM_EDIT_COPY, MF_ENABLED);
334
menu.EnableItem(IDM_EDIT_PASTE, IsClipboardFormatAvailableHDROP() ? MF_ENABLED : MF_GRAYED);
337
else if (position == kViewMenuIndex)
342
menu.CheckRadioItem(IDM_VIEW_LARGE_ICONS, IDM_VIEW_DETAILS,
343
IDM_VIEW_LARGE_ICONS + g_App.GetListViewMode(), MF_BYCOMMAND);
344
menu.CheckItem(IDM_VIEW_TWO_PANELS, MF_BYCOMMAND |
345
((g_App.NumPanels == 2) ? MF_CHECKED : MF_UNCHECKED));
346
menu.CheckItem(IDM_VIEW_FLAT_VIEW, MF_BYCOMMAND |
347
((g_App.GetFlatMode()) ? MF_CHECKED : MF_UNCHECKED));
348
menu.CheckItem(IDM_VIEW_ARCHIVE_TOOLBAR, MF_BYCOMMAND |
349
(g_App.ShowArchiveToolbar ? MF_CHECKED : MF_UNCHECKED));
350
menu.CheckItem(IDM_VIEW_STANDARD_TOOLBAR, MF_BYCOMMAND |
351
(g_App.ShowStandardToolbar ? MF_CHECKED : MF_UNCHECKED));
352
menu.CheckItem(IDM_VIEW_TOOLBARS_LARGE_BUTTONS, MF_BYCOMMAND |
353
(g_App.LargeButtons ? MF_CHECKED : MF_UNCHECKED));
354
menu.CheckItem(IDM_VIEW_TOOLBARS_SHOW_BUTTONS_TEXT, MF_BYCOMMAND |
355
(g_App.ShowButtonsLables ? MF_CHECKED : MF_UNCHECKED));
357
else if (position == kBookmarksMenuIndex)
363
subMenu.Attach(menu.GetSubMenu(0));
364
while (subMenu.GetItemCount() > 0)
365
subMenu.RemoveItem(subMenu.GetItemCount() - 1, MF_BYPOSITION);
367
for (i = 0; i < 10; i++)
369
UString s = LangString(IDS_BOOKMARK, 0x03000720);
371
wchar_t c = (wchar_t)(L'0' + i);
373
s += L"\tAlt+Shift+";
375
subMenu.AppendItem(MF_STRING, kSetBookmarkMenuID + i, s);
378
while (menu.GetItemCount() > 2)
379
menu.RemoveItem(menu.GetItemCount() - 1, MF_BYPOSITION);
381
for (i = 0; i < 10; i++)
383
UString path = g_App.AppState.FastFolders.GetString(i);
384
const int kMaxSize = 100;
385
const int kFirstPartSize = kMaxSize / 2;
386
if (path.Length() > kMaxSize)
388
path = path.Left(kFirstPartSize) + UString(L" ... ") +
389
path.Right(kMaxSize - kFirstPartSize);
395
s += (wchar_t)(L'0' + i);
396
menu.AppendItem(MF_STRING, kOpenBookmarkMenuID + i, s);
403
void OnMenuUnActivating(HWND hWnd, HMENU hMenu, int id)
405
if (::GetSubMenu(::GetMenu(g_HWND), 0) != hMenu)
407
// g_App.GetFocusedPanel()._contextMenu.Release();
410
void OnMenuUnActivating(HWND hWnd)
416
void LoadFileMenu(HMENU hMenu, int startPos, bool /* forFileMode */, bool programMenu)
420
srcMenu.Attach(::GetSubMenu(::GetMenu(g_HWND), 0));
421
if ((HMENU)g_FileMenu == 0)
423
g_FileMenu.CreatePopup();
424
CopyMenu(srcMenu, g_FileMenu);
429
destMenu.Attach(hMenu);
431
for (int i = 0; i < g_FileMenu.GetItemCount(); i++)
435
item.fMask = MIIM_STATE | MIIM_ID | Get_fMaskForFTypeAndString();
436
item.fType = MFT_STRING;
437
if (g_FileMenu.GetItem(i, true, item))
440
if (item.wID == IDCLOSE)
443
bool createItem = (item.wID == IDM_CREATE_FOLDER || item.wID == IDM_CREATE_FILE);
455
if (destMenu.InsertItem(startPos, true, item))
459
while (destMenu.GetItemCount() > 0)
462
item.fMask = MIIM_TYPE;
464
// item.dwTypeData = 0;
465
int lastIndex = destMenu.GetItemCount() - 1;
466
if (!destMenu.GetItem(lastIndex, true, item))
468
if(item.fType != MFT_SEPARATOR)
470
if (!destMenu.RemoveItem(lastIndex, MF_BYPOSITION))
475
bool ExecuteFileCommand(int id)
477
if (id >= kPluginMenuStartID)
479
g_App.GetFocusedPanel().InvokePluginCommand(id);
480
g_App.GetFocusedPanel()._sevenZipContextMenu.Release();
481
g_App.GetFocusedPanel()._systemContextMenu.Release();
491
case IDM_FILE_OPEN_INSIDE:
492
g_App.OpenItemInside();
494
case IDM_FILE_OPEN_OUTSIDE:
495
g_App.OpenItemOutside();
513
bool shift = (::GetKeyState(VK_SHIFT) & 0x8000) != 0;
514
g_App.Delete(!shift);
518
g_App.CalculateCrc();
523
case IDM_FILE_COMBINE:
526
case IDM_FILE_PROPERTIES:
529
case IDM_FILE_COMMENT:
533
case IDM_CREATE_FOLDER:
534
g_App.CreateFolder();
536
case IDM_CREATE_FILE:
545
bool OnMenuCommand(HWND hWnd, int id)
547
if (ExecuteFileCommand(id))
554
SendMessage(hWnd, WM_ACTIVATE, MAKEWPARAM(WA_INACTIVE, 0), (LPARAM)hWnd);
555
SendMessage (hWnd, WM_CLOSE, 0, 0);
569
g_App.SelectAll(true);
570
g_App.RefreshStatusBar();
572
case IDM_DESELECT_ALL:
573
g_App.SelectAll(false);
574
g_App.RefreshStatusBar();
576
case IDM_INVERT_SELECTION:
577
g_App.InvertSelection();
578
g_App.RefreshStatusBar();
581
g_App.SelectSpec(true);
582
g_App.RefreshStatusBar();
585
g_App.SelectSpec(false);
586
g_App.RefreshStatusBar();
588
case IDM_SELECT_BY_TYPE:
589
g_App.SelectByType(true);
590
g_App.RefreshStatusBar();
592
case IDM_DESELECT_BY_TYPE:
593
g_App.SelectByType(false);
594
g_App.RefreshStatusBar();
598
case IDM_VIEW_LARGE_ICONS:
599
case IDM_VIEW_SMALL_ICONS:
601
case IDM_VIEW_DETAILS:
603
UINT index = id - IDM_VIEW_LARGE_ICONS;
606
g_App.SetListViewMode(index);
609
menu.Attach(::GetSubMenu(::GetMenu(hWnd), kViewMenuIndex));
610
menu.CheckRadioItem(IDM_VIEW_LARGE_ICONS, IDM_VIEW_DETAILS,
616
case IDM_VIEW_ARANGE_BY_NAME:
618
g_App.SortItemsWithPropID(kpidName);
621
case IDM_VIEW_ARANGE_BY_TYPE:
623
g_App.SortItemsWithPropID(kpidExtension);
626
case IDM_VIEW_ARANGE_BY_DATE:
628
g_App.SortItemsWithPropID(kpidLastWriteTime);
631
case IDM_VIEW_ARANGE_BY_SIZE:
633
g_App.SortItemsWithPropID(kpidSize);
636
case IDM_VIEW_ARANGE_NO_SORT:
638
g_App.SortItemsWithPropID(kpidNoProperty);
642
case IDM_OPEN_ROOT_FOLDER:
643
g_App.OpenRootFolder();
645
case IDM_OPEN_PARENT_FOLDER:
646
g_App.OpenParentFolder();
648
case IDM_FOLDERS_HISTORY:
649
g_App.FoldersHistory();
651
case IDM_VIEW_REFRESH:
654
case IDM_VIEW_FLAT_VIEW:
655
g_App.ChangeFlatMode();
657
case IDM_VIEW_TWO_PANELS:
658
g_App.SwitchOnOffOnePanel();
660
case IDM_VIEW_STANDARD_TOOLBAR:
661
g_App.SwitchStandardToolbar();
663
case IDM_VIEW_ARCHIVE_TOOLBAR:
664
g_App.SwitchArchiveToolbar();
666
case IDM_VIEW_TOOLBARS_SHOW_BUTTONS_TEXT:
667
g_App.SwitchButtonsLables();
669
case IDM_VIEW_TOOLBARS_LARGE_BUTTONS:
670
g_App.SwitchLargeButtons();
675
OptionsDialog(hWnd, g_hInstance);
682
case IDM_HELP_CONTENTS:
683
ShowHelpWindow(NULL, kFMHelpTopic);
693
if (id >= kOpenBookmarkMenuID && id <= kOpenBookmarkMenuID + 9)
695
g_App.OpenBookmark(id - kOpenBookmarkMenuID);
698
else if (id >= kSetBookmarkMenuID && id <= kSetBookmarkMenuID + 9)
700
g_App.SetBookmark(id - kSetBookmarkMenuID);