mirror of
https://github.com/Xevion/easy7zip.git
synced 2025-12-06 17:15:00 -06:00
926 lines
25 KiB
C++
Executable File
926 lines
25 KiB
C++
Executable File
// MyLoadMenu.cpp
|
|
|
|
#include "StdAfx.h"
|
|
|
|
#include "../../../Windows/Menu.h"
|
|
#include "../../../Windows/TimeUtils.h"
|
|
#include "../../../Windows/Control/Dialog.h"
|
|
|
|
#include "../../PropID.h"
|
|
|
|
#include "../Common/CompressCall.h"
|
|
|
|
#include "AboutDialog.h"
|
|
#include "AboutEasy7ZipDialog.h"
|
|
#include "App.h"
|
|
#include "HelpUtils.h"
|
|
#include "LangUtils.h"
|
|
#include "MyLoadMenu.h"
|
|
#include "RegistryUtils.h"
|
|
|
|
#include "PropertyNameRes.h"
|
|
#include "resource.h"
|
|
|
|
using namespace NWindows;
|
|
|
|
static const UINT k_MenuID_OpenBookmark = 830;
|
|
static const UINT k_MenuID_SetBookmark = 810;
|
|
static const UINT k_MenuID_TimePopup = IDM_VIEW_TIME_POPUP;
|
|
static const UINT k_MenuID_Time = IDM_VIEW_TIME;
|
|
|
|
extern HINSTANCE g_hInstance;
|
|
|
|
#define kFMHelpTopic "FM/index.htm"
|
|
|
|
extern void OptionsDialog(HWND hwndOwner, HINSTANCE hInstance);
|
|
|
|
enum
|
|
{
|
|
k_MenuIndex_File = 0,
|
|
k_MenuIndex_Edit,
|
|
k_MenuIndex_View,
|
|
k_MenuIndex_Bookmarks
|
|
};
|
|
|
|
#ifdef Z7_LANG
|
|
static const UInt32 k_LangID_TopMenuItems[] =
|
|
{
|
|
IDM_FILE,
|
|
IDM_EDIT,
|
|
IDM_VIEW,
|
|
IDM_FAVORITES,
|
|
IDM_TOOLS,
|
|
IDM_HELP
|
|
};
|
|
|
|
static const UInt32 k_LangID_Toolbars = IDM_VIEW_TOOLBARS;
|
|
static const UInt32 k_LangID_AddToFavorites = IDM_ADD_TO_FAVORITES;
|
|
|
|
static const CIDLangPair kIDLangPairs[] =
|
|
{
|
|
{ IDCLOSE, 557 }, // IDM_EXIT
|
|
{ IDM_VIEW_ARANGE_BY_NAME, IDS_PROP_NAME },
|
|
{ IDM_VIEW_ARANGE_BY_TYPE, IDS_PROP_FILE_TYPE },
|
|
{ IDM_VIEW_ARANGE_BY_DATE, IDS_PROP_MTIME },
|
|
{ IDM_VIEW_ARANGE_BY_SIZE, IDS_PROP_SIZE }
|
|
};
|
|
|
|
static int FindLangItem(unsigned controlID)
|
|
{
|
|
for (unsigned i = 0; i < Z7_ARRAY_SIZE(kIDLangPairs); i++)
|
|
if (kIDLangPairs[i].ControlID == controlID)
|
|
return (int)i;
|
|
return -1;
|
|
}
|
|
#endif
|
|
|
|
static unsigned GetSortControlID(PROPID propID)
|
|
{
|
|
switch (propID)
|
|
{
|
|
case kpidName: return IDM_VIEW_ARANGE_BY_NAME;
|
|
case kpidExtension: return IDM_VIEW_ARANGE_BY_TYPE;
|
|
case kpidMTime: return IDM_VIEW_ARANGE_BY_DATE;
|
|
case kpidSize: return IDM_VIEW_ARANGE_BY_SIZE;
|
|
case kpidNoProperty: return IDM_VIEW_ARANGE_NO_SORT;
|
|
}
|
|
return IDM_VIEW_ARANGE_BY_NAME;
|
|
// IDM_VIEW_ARANGE_NO_SORT;
|
|
// return -1;
|
|
}
|
|
|
|
/*
|
|
#if _MSC_VER > 1400
|
|
// GetVersion was declared deprecated
|
|
#pragma warning(disable : 4996)
|
|
#endif
|
|
|
|
static bool g_IsNew_fMask = false;
|
|
static class CInit_fMask
|
|
{
|
|
public:
|
|
CInit_fMask()
|
|
{
|
|
DWORD v = GetVersion();
|
|
v = ((v & 0xff) << 8) | ((v >> 8) & 0xFF);
|
|
g_IsNew_fMask = (v > 0x400); // (win98/win2000) or newer
|
|
}
|
|
} g_Init_fMask;
|
|
static UINT Get_fMask_for_String()
|
|
{ return g_IsNew_fMask ? MIIM_STRING : MIIM_TYPE; }
|
|
static UINT Get_fMask_for_FType_and_String()
|
|
{ return g_IsNew_fMask ? (MIIM_STRING | MIIM_FTYPE) : MIIM_TYPE; }
|
|
*/
|
|
|
|
/*
|
|
We can use new MIIM_STRING / MIIM_FTYPE flags in the following conditions:
|
|
1) we run at new Windows (win98/win2000) or newer
|
|
2) also we probably must set MENUITEMINFO::cbSize as sizeof of full
|
|
(MENUITEMINFO) that was compiled with (WINVER >= 0x0500)
|
|
But it's simpler to use old MIIM_TYPE without these complex checks.
|
|
*/
|
|
|
|
// /*
|
|
static inline UINT Get_fMask_for_String() { return MIIM_TYPE; }
|
|
static inline UINT Get_fMask_for_FType_and_String() { return MIIM_TYPE; }
|
|
// */
|
|
|
|
static bool Is_MenuItem_TimePopup(const CMenuItem &item)
|
|
{
|
|
return item.wID == k_MenuID_TimePopup ||
|
|
item.StringValue.IsPrefixedBy_Ascii_NoCase("20");
|
|
}
|
|
|
|
#ifdef Z7_LANG
|
|
static void MyChangeMenu(HMENU menuLoc, unsigned menuID, unsigned level, unsigned menuIndex)
|
|
{
|
|
CMenu menu;
|
|
menu.Attach(menuLoc);
|
|
|
|
for (unsigned i = 0;; i++)
|
|
{
|
|
CMenuItem item;
|
|
/* here we can use
|
|
Get_fMask_for_String() or
|
|
Get_fMask_for_FType_and_String()
|
|
We want to change only String of menu item.
|
|
It's not required to change (fType) of menu item.
|
|
We can look (fType) to check for SEPARATOR item.
|
|
But String of separator is empty and (wID == 0).
|
|
So we can check for SEPARATOR without (fType) requesting.
|
|
So it's enough to use Get_fMask_for_String() here */
|
|
item.fMask =
|
|
Get_fMask_for_String()
|
|
// Get_fMask_for_FType_and_String()
|
|
| MIIM_SUBMENU | MIIM_ID;
|
|
if (!menu.GetItem(i, true, item))
|
|
break;
|
|
{
|
|
UString newString;
|
|
if (item.hSubMenu)
|
|
{
|
|
/* in win10:
|
|
MENU+POPUP:
|
|
(wID == item.hSubMenu)
|
|
MENUEX+POPUP where ID is not set:
|
|
(wID == 0)
|
|
MENU+SEPARATOR
|
|
(wID == 0)
|
|
*/
|
|
UInt32 langID = item.wID;
|
|
if (langID >= (1 << 16))
|
|
{
|
|
// here we try to exclude the case (wID == item.hSubMenu) if (MENU+POPUP)
|
|
continue;
|
|
}
|
|
if (langID == 0)
|
|
{
|
|
if (level == 0)
|
|
{
|
|
if (i < Z7_ARRAY_SIZE(k_LangID_TopMenuItems))
|
|
langID = k_LangID_TopMenuItems[i];
|
|
}
|
|
else if (level == 1)
|
|
{
|
|
if (menuID == IDM_FAVORITES || (menuID == 0 && menuIndex == k_MenuIndex_Bookmarks))
|
|
langID = k_LangID_AddToFavorites;
|
|
else if (menuID == IDM_VIEW || (menuID == 0 && menuIndex == k_MenuIndex_View))
|
|
{
|
|
if (Is_MenuItem_TimePopup(item))
|
|
langID = k_MenuID_TimePopup;
|
|
else
|
|
langID = k_LangID_Toolbars;
|
|
}
|
|
}
|
|
}
|
|
if (langID == k_MenuID_TimePopup)
|
|
continue;
|
|
if (langID != k_LangID_AddToFavorites)
|
|
MyChangeMenu(item.hSubMenu, langID, level + 1, i);
|
|
if (langID == 0)
|
|
continue;
|
|
LangString_OnlyFromLangFile(langID, newString);
|
|
if (newString.IsEmpty())
|
|
continue;
|
|
}
|
|
else
|
|
{
|
|
if (item.fMask & (MIIM_TYPE | MIIM_FTYPE))
|
|
if (item.IsSeparator())
|
|
continue;
|
|
if (item.StringValue.IsEmpty())
|
|
continue;
|
|
const int langPos = FindLangItem(item.wID);
|
|
// we don't need lang change for CRC items!!!
|
|
const UInt32 langID = langPos >= 0 ? kIDLangPairs[langPos].LangID : item.wID;
|
|
if (langID == 0)
|
|
continue;
|
|
|
|
if (langID == IDM_OPEN_INSIDE_ONE ||
|
|
langID == IDM_OPEN_INSIDE_PARSER)
|
|
{
|
|
LangString_OnlyFromLangFile(IDM_OPEN_INSIDE, newString);
|
|
if (newString.IsEmpty())
|
|
continue;
|
|
newString.Replace(L"&", L"");
|
|
const int tabPos = newString.Find(L"\t");
|
|
if (tabPos >= 0)
|
|
newString.DeleteFrom(tabPos);
|
|
newString += (langID == IDM_OPEN_INSIDE_ONE ? " *" : " #");
|
|
}
|
|
else if (langID == IDM_BENCHMARK2)
|
|
{
|
|
LangString_OnlyFromLangFile(IDM_BENCHMARK, newString);
|
|
if (newString.IsEmpty())
|
|
continue;
|
|
newString.Replace(L"&", L"");
|
|
const int tabPos = newString.Find(L"\t");
|
|
if (tabPos >= 0)
|
|
newString.DeleteFrom(tabPos);
|
|
newString += " 2";
|
|
}
|
|
else
|
|
{
|
|
LangString_OnlyFromLangFile(langID, newString);
|
|
}
|
|
|
|
if (newString.IsEmpty())
|
|
continue;
|
|
|
|
const int tabPos = item.StringValue.ReverseFind(L'\t');
|
|
if (tabPos >= 0)
|
|
newString += item.StringValue.Ptr(tabPos);
|
|
}
|
|
|
|
{
|
|
item.StringValue = newString;
|
|
// we want to change only String
|
|
item.fMask = Get_fMask_for_String();
|
|
menu.SetItem(i, true, item);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
static CMenu g_FileMenu;
|
|
|
|
static struct CFileMenuDestroyer
|
|
{
|
|
~CFileMenuDestroyer() { if ((HMENU)g_FileMenu) g_FileMenu.Destroy(); }
|
|
} g_FileMenuDestroyer;
|
|
|
|
|
|
static void CopyMenu(HMENU srcMenuSpec, HMENU destMenuSpec);
|
|
|
|
static void CopyPopMenu_IfRequired(CMenuItem &item)
|
|
{
|
|
/* if (item.hSubMenu) is defined
|
|
{
|
|
- it creates new (popup) menu
|
|
- it copies menu items from old item.hSubMenu menu to new (popup) menu
|
|
- it sets item.hSubMenu to handle of created (popup) menu
|
|
} */
|
|
if (item.hSubMenu)
|
|
{
|
|
CMenu popup;
|
|
popup.CreatePopup();
|
|
CopyMenu(item.hSubMenu, popup);
|
|
item.hSubMenu = popup;
|
|
}
|
|
}
|
|
|
|
/* destMenuSpec must be non-NULL handle to created empty popup menu */
|
|
static void CopyMenu(HMENU srcMenuSpec, HMENU destMenuSpec)
|
|
{
|
|
CMenu srcMenu;
|
|
srcMenu.Attach(srcMenuSpec);
|
|
CMenu destMenu;
|
|
destMenu.Attach(destMenuSpec);
|
|
unsigned startPos = 0;
|
|
for (unsigned i = 0;; i++)
|
|
{
|
|
CMenuItem item;
|
|
item.fMask = MIIM_SUBMENU | MIIM_STATE | MIIM_ID | Get_fMask_for_FType_and_String();
|
|
if (!srcMenu.GetItem(i, true, item))
|
|
break;
|
|
CopyPopMenu_IfRequired(item);
|
|
if (destMenu.InsertItem(startPos, true, item))
|
|
startPos++;
|
|
}
|
|
}
|
|
|
|
|
|
/* use for (needResetMenu):
|
|
false : for call from program window creation code
|
|
true : for another calls : (from Options language change)
|
|
*/
|
|
void MyLoadMenu(bool needResetMenu)
|
|
{
|
|
#ifdef UNDER_CE
|
|
|
|
const HMENU oldMenu = g_App._commandBar.GetMenu(0);
|
|
if (oldMenu)
|
|
::DestroyMenu(oldMenu);
|
|
/* BOOL b = */ g_App._commandBar.InsertMenubar(g_hInstance, IDM_MENU, 0);
|
|
const HMENU baseMenu = g_App._commandBar.GetMenu(0);
|
|
// if (startInit)
|
|
// SetIdsForSubMenus(baseMenu, 0, 0);
|
|
if (!g_LangID.IsEmpty())
|
|
MyChangeMenu(baseMenu, 0, 0);
|
|
g_App._commandBar.DrawMenuBar(0);
|
|
|
|
#else // UNDER_CE
|
|
|
|
const HWND hWnd = g_HWND;
|
|
bool menuWasChanged = false;
|
|
/*
|
|
We must reload to english default menu for at least two cases:
|
|
- if some submenu was changed (File or another submenu can be changed after menu activating).
|
|
- for change from non-english lang to another partial non-english lang,
|
|
where we still need some english strings.
|
|
But we reload menu to default menu everytime except of program starting stage.
|
|
That scheme is simpler than complex checks for exact conditions for menu reload.
|
|
*/
|
|
if (needResetMenu)
|
|
{
|
|
const HMENU oldMenu = ::GetMenu(hWnd);
|
|
const HMENU newMenu = ::LoadMenu(g_hInstance, MAKEINTRESOURCE(IDM_MENU));
|
|
// docs for SetMenu(): the window is redrawn to reflect the menu change.
|
|
if (newMenu && ::SetMenu(hWnd, newMenu))
|
|
::DestroyMenu(oldMenu);
|
|
menuWasChanged = true;
|
|
}
|
|
const HMENU baseMenu = ::GetMenu(hWnd);
|
|
// if (startInit)
|
|
// SetIdsForSubMenus(baseMenu, 0, 0);
|
|
#ifdef Z7_LANG
|
|
if (!g_Lang.IsEmpty()) // !g_LangID.IsEmpty() &&
|
|
{
|
|
MyChangeMenu(baseMenu, 0, 0, 0);
|
|
menuWasChanged = true;
|
|
}
|
|
#endif
|
|
|
|
if (menuWasChanged)
|
|
::DrawMenuBar(hWnd);
|
|
|
|
#endif // UNDER_CE
|
|
|
|
// menuWasChanged = false; // for debug
|
|
if (menuWasChanged || !(HMENU)g_FileMenu)
|
|
{
|
|
if ((HMENU)g_FileMenu)
|
|
g_FileMenu.Destroy();
|
|
g_FileMenu.CreatePopup();
|
|
CopyMenu(::GetSubMenu(baseMenu, k_MenuIndex_File), g_FileMenu);
|
|
}
|
|
}
|
|
|
|
void OnMenuActivating(HWND /* hWnd */, HMENU hMenu, int position)
|
|
{
|
|
HMENU mainMenu =
|
|
#ifdef UNDER_CE
|
|
g_App._commandBar.GetMenu(0);
|
|
#else
|
|
::GetMenu(g_HWND)
|
|
#endif
|
|
;
|
|
|
|
if (::GetSubMenu(mainMenu, position) != hMenu)
|
|
return;
|
|
|
|
if (position == k_MenuIndex_File)
|
|
{
|
|
CMenu menu;
|
|
menu.Attach(hMenu);
|
|
menu.RemoveAllItems();
|
|
g_App.GetFocusedPanel().CreateFileMenu(hMenu);
|
|
}
|
|
else if (position == k_MenuIndex_Edit)
|
|
{
|
|
/*
|
|
CMenu menu;
|
|
menu.Attach(hMenu);
|
|
menu.EnableItem(IDM_EDIT_CUT, MF_ENABLED);
|
|
menu.EnableItem(IDM_EDIT_COPY, MF_ENABLED);
|
|
menu.EnableItem(IDM_EDIT_PASTE, IsClipboardFormatAvailableHDROP() ? MF_ENABLED : MF_GRAYED);
|
|
*/
|
|
}
|
|
else if (position == k_MenuIndex_View)
|
|
{
|
|
// View;
|
|
CMenu menu;
|
|
menu.Attach(hMenu);
|
|
menu.CheckRadioItem(
|
|
IDM_VIEW_LARGE_ICONS, IDM_VIEW_DETAILS,
|
|
IDM_VIEW_LARGE_ICONS + g_App.GetListViewMode(), MF_BYCOMMAND);
|
|
|
|
menu.CheckRadioItem(
|
|
IDM_VIEW_ARANGE_BY_NAME,
|
|
IDM_VIEW_ARANGE_NO_SORT,
|
|
GetSortControlID(g_App.GetSortID()),
|
|
MF_BYCOMMAND);
|
|
|
|
menu.CheckItemByID(IDM_VIEW_TWO_PANELS, g_App.NumPanels == 2);
|
|
menu.CheckItemByID(IDM_VIEW_FLAT_VIEW, g_App.GetFlatMode());
|
|
menu.CheckItemByID(IDM_VIEW_ARCHIVE_TOOLBAR, g_App.ShowArchiveToolbar);
|
|
menu.CheckItemByID(IDM_VIEW_STANDARD_TOOLBAR, g_App.ShowStandardToolbar);
|
|
menu.CheckItemByID(IDM_VIEW_TOOLBARS_LARGE_BUTTONS, g_App.LargeButtons);
|
|
menu.CheckItemByID(IDM_VIEW_TOOLBARS_SHOW_BUTTONS_TEXT, g_App.ShowButtonsLables);
|
|
menu.CheckItemByID(IDM_VIEW_AUTO_REFRESH, g_App.Get_AutoRefresh_Mode());
|
|
// menu.CheckItemByID(IDM_VIEW_SHOW_STREAMS, g_App.Get_ShowNtfsStrems_Mode());
|
|
// menu.CheckItemByID(IDM_VIEW_SHOW_DELETED, g_App.ShowDeletedFiles);
|
|
|
|
for (unsigned i = 0;; i++)
|
|
{
|
|
CMenuItem item;
|
|
item.fMask = Get_fMask_for_String() | MIIM_SUBMENU | MIIM_ID;
|
|
item.fType = MFT_STRING;
|
|
if (!menu.GetItem(i, true, item))
|
|
break;
|
|
if (item.hSubMenu && Is_MenuItem_TimePopup(item))
|
|
{
|
|
FILETIME ft;
|
|
NTime::GetCurUtcFileTime(ft);
|
|
|
|
{
|
|
wchar_t s[64];
|
|
s[0] = 0;
|
|
if (ConvertUtcFileTimeToString(ft, s, kTimestampPrintLevel_DAY))
|
|
item.StringValue = s;
|
|
}
|
|
|
|
item.fMask = Get_fMask_for_String() | MIIM_ID;
|
|
item.fType = MFT_STRING;
|
|
item.wID = k_MenuID_TimePopup;
|
|
menu.SetItem(i, true, item);
|
|
|
|
CMenu subMenu;
|
|
subMenu.Attach(menu.GetSubMenu((int)i));
|
|
subMenu.RemoveAllItems();
|
|
|
|
const int k_TimeLevels[] =
|
|
{
|
|
kTimestampPrintLevel_DAY,
|
|
kTimestampPrintLevel_MIN,
|
|
kTimestampPrintLevel_SEC,
|
|
// 1,2,3,4,5,6,
|
|
kTimestampPrintLevel_NTFS,
|
|
kTimestampPrintLevel_NS
|
|
};
|
|
|
|
unsigned last = k_MenuID_Time;
|
|
unsigned selectedCommand = 0;
|
|
g_App._timestampLevels.Clear();
|
|
unsigned id = k_MenuID_Time;
|
|
|
|
for (unsigned k = 0; k < Z7_ARRAY_SIZE(k_TimeLevels); k++)
|
|
{
|
|
wchar_t s[64];
|
|
s[0] = 0;
|
|
const int timestampLevel = k_TimeLevels[k];
|
|
if (ConvertUtcFileTimeToString(ft, s, timestampLevel))
|
|
{
|
|
if (subMenu.AppendItem(MF_STRING, id, s))
|
|
{
|
|
last = id;
|
|
g_App._timestampLevels.Add(timestampLevel);
|
|
if (g_App.GetTimestampLevel() == timestampLevel)
|
|
selectedCommand = id;
|
|
id++;
|
|
}
|
|
}
|
|
}
|
|
if (selectedCommand != 0)
|
|
menu.CheckRadioItem(k_MenuID_Time, last, selectedCommand, MF_BYCOMMAND);
|
|
}
|
|
}
|
|
}
|
|
else if (position == k_MenuIndex_Bookmarks)
|
|
{
|
|
CMenu menu;
|
|
menu.Attach(hMenu);
|
|
|
|
CMenu subMenu;
|
|
subMenu.Attach(menu.GetSubMenu(0));
|
|
subMenu.RemoveAllItems();
|
|
unsigned i;
|
|
|
|
for (i = 0; i < 10; i++)
|
|
{
|
|
UString s = LangString(IDS_BOOKMARK);
|
|
s.Add_Space();
|
|
const char c = (char)(L'0' + i);
|
|
s += c;
|
|
s += "\tAlt+Shift+";
|
|
s += c;
|
|
subMenu.AppendItem(MF_STRING, k_MenuID_SetBookmark + i, s);
|
|
}
|
|
|
|
menu.RemoveAllItemsFrom(2);
|
|
|
|
for (i = 0; i < 10; i++)
|
|
{
|
|
UString s = g_App.AppState.FastFolders.GetString(i);
|
|
const int kMaxSize = 100;
|
|
const int kFirstPartSize = kMaxSize / 2;
|
|
if (s.Len() > kMaxSize)
|
|
{
|
|
s.Delete(kFirstPartSize, s.Len() - kMaxSize);
|
|
s.Insert(kFirstPartSize, L" ... ");
|
|
}
|
|
if (s.IsEmpty())
|
|
s = '-';
|
|
s += "\tAlt+";
|
|
s += (char)('0' + i);
|
|
menu.AppendItem(MF_STRING, k_MenuID_OpenBookmark + i, s);
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
It doesn't help
|
|
void OnMenuUnActivating(HWND hWnd, HMENU hMenu, int id)
|
|
{
|
|
if (::GetSubMenu(::GetMenu(g_HWND), 0) != hMenu)
|
|
return;
|
|
}
|
|
*/
|
|
|
|
static const unsigned g_Zvc_IDs[] =
|
|
{
|
|
IDM_VER_EDIT,
|
|
IDM_VER_COMMIT,
|
|
IDM_VER_REVERT,
|
|
IDM_VER_DIFF
|
|
};
|
|
|
|
static const char * const g_Zvc_Strings[] =
|
|
{
|
|
"Ver Edit (&1)"
|
|
, "Ver Commit"
|
|
, "Ver Revert"
|
|
, "Ver Diff (&0)"
|
|
};
|
|
|
|
void CFileMenu::Load(HMENU hMenu, unsigned startPos)
|
|
{
|
|
CMenu destMenu;
|
|
destMenu.Attach(hMenu);
|
|
|
|
UString diffPath;
|
|
ReadRegDiff(diffPath);
|
|
|
|
unsigned numRealItems = startPos;
|
|
|
|
const bool isBigScreen = NControl::IsDialogSizeOK(40, 200, g_HWND);
|
|
|
|
for (unsigned i = 0;; i++)
|
|
{
|
|
CMenuItem item;
|
|
|
|
item.fMask = MIIM_SUBMENU | MIIM_STATE | MIIM_ID | Get_fMask_for_FType_and_String();
|
|
item.fType = MFT_STRING;
|
|
|
|
if (!g_FileMenu.GetItem(i, true, item))
|
|
break;
|
|
|
|
{
|
|
if (!programMenu && item.wID == IDCLOSE)
|
|
continue;
|
|
|
|
if (item.wID == IDM_DIFF && diffPath.IsEmpty())
|
|
continue;
|
|
|
|
if (item.wID == IDM_OPEN_INSIDE_ONE || item.wID == IDM_OPEN_INSIDE_PARSER)
|
|
{
|
|
// We use diff as "super mode" marker for additional commands.
|
|
/*
|
|
if (diffPath.IsEmpty())
|
|
continue;
|
|
*/
|
|
}
|
|
|
|
if (item.wID == IDM_BENCHMARK2)
|
|
{
|
|
// We use diff as "super mode" marker for additional commands.
|
|
if (diffPath.IsEmpty())
|
|
continue;
|
|
}
|
|
|
|
bool isOneFsFile = (isFsFolder && numItems == 1 && allAreFiles);
|
|
bool disable = (!isOneFsFile && (item.wID == IDM_SPLIT || item.wID == IDM_COMBINE));
|
|
|
|
if (readOnly)
|
|
{
|
|
switch (item.wID)
|
|
{
|
|
case IDM_RENAME:
|
|
case IDM_MOVE_TO:
|
|
case IDM_DELETE:
|
|
case IDM_COMMENT:
|
|
case IDM_CREATE_FOLDER:
|
|
case IDM_CREATE_FILE:
|
|
disable = true;
|
|
}
|
|
}
|
|
|
|
if (isHashFolder)
|
|
{
|
|
switch (item.wID)
|
|
{
|
|
case IDM_OPEN:
|
|
case IDM_OPEN_INSIDE:
|
|
case IDM_OPEN_INSIDE_ONE:
|
|
case IDM_OPEN_INSIDE_PARSER:
|
|
case IDM_OPEN_OUTSIDE:
|
|
case IDM_FILE_VIEW:
|
|
case IDM_FILE_EDIT:
|
|
// case IDM_RENAME:
|
|
case IDM_COPY_TO:
|
|
case IDM_MOVE_TO:
|
|
// case IDM_DELETE:
|
|
case IDM_COMMENT:
|
|
case IDM_CREATE_FOLDER:
|
|
case IDM_CREATE_FILE:
|
|
case IDM_LINK:
|
|
case IDM_DIFF:
|
|
disable = true;
|
|
}
|
|
}
|
|
|
|
|
|
if (item.wID == IDM_LINK && numItems != 1)
|
|
disable = true;
|
|
|
|
if (item.wID == IDM_ALT_STREAMS)
|
|
disable = !isAltStreamsSupported;
|
|
|
|
if (!isBigScreen && (disable || item.IsSeparator()))
|
|
continue;
|
|
|
|
CopyPopMenu_IfRequired(item);
|
|
if (destMenu.InsertItem(startPos, true, item))
|
|
{
|
|
if (disable)
|
|
destMenu.EnableItem(startPos, MF_BYPOSITION | MF_GRAYED);
|
|
startPos++;
|
|
}
|
|
|
|
if (!item.IsSeparator())
|
|
numRealItems = startPos;
|
|
}
|
|
}
|
|
|
|
UString vercPath;
|
|
if (!diffPath.IsEmpty() && isFsFolder && allAreFiles && numItems == 1)
|
|
ReadReg_VerCtrlPath(vercPath);
|
|
|
|
if (!vercPath.IsEmpty())
|
|
{
|
|
NFile::NFind::CFileInfo fi;
|
|
if (fi.Find(FilePath) && fi.Size < ((UInt32)1 << 31) && !fi.IsDir())
|
|
{
|
|
for (unsigned k = 0; k < Z7_ARRAY_SIZE(g_Zvc_IDs); k++)
|
|
{
|
|
const unsigned id = g_Zvc_IDs[k];
|
|
if (fi.IsReadOnly())
|
|
{
|
|
if (id == IDM_VER_COMMIT ||
|
|
id == IDM_VER_REVERT ||
|
|
id == IDM_VER_DIFF)
|
|
continue;
|
|
}
|
|
else
|
|
{
|
|
if (id == IDM_VER_EDIT)
|
|
continue;
|
|
}
|
|
|
|
CMenuItem item;
|
|
UString s (g_Zvc_Strings[k]);
|
|
if (destMenu.AppendItem(MF_STRING, id, s))
|
|
{
|
|
startPos++;
|
|
numRealItems = startPos;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
destMenu.RemoveAllItemsFrom(numRealItems);
|
|
}
|
|
|
|
bool ExecuteFileCommand(unsigned id)
|
|
{
|
|
if (id >= kMenuCmdID_Plugin_Start)
|
|
{
|
|
g_App.GetFocusedPanel().InvokePluginCommand(id);
|
|
g_App.GetFocusedPanel()._sevenZipContextMenu.Release();
|
|
g_App.GetFocusedPanel()._systemContextMenu.Release();
|
|
return true;
|
|
}
|
|
|
|
switch (id)
|
|
{
|
|
// File
|
|
case IDM_OPEN: g_App.OpenItem(); break;
|
|
|
|
case IDM_OPEN_INSIDE: g_App.OpenItemInside(NULL); break;
|
|
case IDM_OPEN_INSIDE_ONE: g_App.OpenItemInside(L"*"); break;
|
|
case IDM_OPEN_INSIDE_PARSER: g_App.OpenItemInside(L"#"); break;
|
|
|
|
case IDM_OPEN_OUTSIDE: g_App.OpenItemOutside(); break;
|
|
case IDM_FILE_VIEW: g_App.EditItem(false); break;
|
|
case IDM_FILE_EDIT: g_App.EditItem(true); break;
|
|
case IDM_RENAME: g_App.Rename(); break;
|
|
case IDM_COPY_TO: g_App.CopyTo(); break;
|
|
case IDM_MOVE_TO: g_App.MoveTo(); break;
|
|
case IDM_DELETE: g_App.Delete(!IsKeyDown(VK_SHIFT)); break;
|
|
|
|
case IDM_HASH_ALL: g_App.CalculateCrc("*"); break;
|
|
case IDM_CRC32: g_App.CalculateCrc("CRC32"); break;
|
|
case IDM_CRC64: g_App.CalculateCrc("CRC64"); break;
|
|
case IDM_SHA1: g_App.CalculateCrc("SHA1"); break;
|
|
case IDM_SHA256: g_App.CalculateCrc("SHA256"); break;
|
|
|
|
case IDM_DIFF: g_App.DiffFiles(); break;
|
|
|
|
case IDM_VER_EDIT:
|
|
case IDM_VER_COMMIT:
|
|
case IDM_VER_REVERT:
|
|
case IDM_VER_DIFF:
|
|
g_App.VerCtrl(id); break;
|
|
|
|
case IDM_SPLIT: g_App.Split(); break;
|
|
case IDM_COMBINE: g_App.Combine(); break;
|
|
case IDM_PROPERTIES: g_App.Properties(); break;
|
|
case IDM_COMMENT: g_App.Comment(); break;
|
|
case IDM_CREATE_FOLDER: g_App.CreateFolder(); break;
|
|
case IDM_CREATE_FILE: g_App.CreateFile(); break;
|
|
#ifndef UNDER_CE
|
|
case IDM_LINK: g_App.Link(); break;
|
|
case IDM_ALT_STREAMS: g_App.OpenAltStreams(); break;
|
|
#endif
|
|
default: return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
static void MyBenchmark(bool totalMode)
|
|
{
|
|
CPanel::CDisableTimerProcessing disableTimerProcessing1(g_App.Panels[0]);
|
|
CPanel::CDisableTimerProcessing disableTimerProcessing2(g_App.Panels[1]);
|
|
Benchmark(totalMode);
|
|
}
|
|
|
|
bool OnMenuCommand(HWND hWnd, unsigned id)
|
|
{
|
|
if (ExecuteFileCommand(id))
|
|
return true;
|
|
|
|
switch (id)
|
|
{
|
|
// File
|
|
case IDCLOSE:
|
|
SendMessage(hWnd, WM_ACTIVATE, MAKEWPARAM(WA_INACTIVE, 0), (LPARAM)hWnd);
|
|
g_ExitEventLauncher.Exit(false);
|
|
SendMessage(hWnd, WM_CLOSE, 0, 0);
|
|
break;
|
|
|
|
// Edit
|
|
/*
|
|
case IDM_EDIT_CUT:
|
|
g_App.EditCut();
|
|
break;
|
|
case IDM_EDIT_COPY:
|
|
g_App.EditCopy();
|
|
break;
|
|
case IDM_EDIT_PASTE:
|
|
g_App.EditPaste();
|
|
break;
|
|
*/
|
|
case IDM_SELECT_ALL:
|
|
g_App.SelectAll(true);
|
|
g_App.Refresh_StatusBar();
|
|
break;
|
|
case IDM_DESELECT_ALL:
|
|
g_App.SelectAll(false);
|
|
g_App.Refresh_StatusBar();
|
|
break;
|
|
case IDM_INVERT_SELECTION:
|
|
g_App.InvertSelection();
|
|
g_App.Refresh_StatusBar();
|
|
break;
|
|
case IDM_SELECT:
|
|
g_App.SelectSpec(true);
|
|
g_App.Refresh_StatusBar();
|
|
break;
|
|
case IDM_DESELECT:
|
|
g_App.SelectSpec(false);
|
|
g_App.Refresh_StatusBar();
|
|
break;
|
|
case IDM_SELECT_BY_TYPE:
|
|
g_App.SelectByType(true);
|
|
g_App.Refresh_StatusBar();
|
|
break;
|
|
case IDM_DESELECT_BY_TYPE:
|
|
g_App.SelectByType(false);
|
|
g_App.Refresh_StatusBar();
|
|
break;
|
|
|
|
//View
|
|
case IDM_VIEW_LARGE_ICONS:
|
|
case IDM_VIEW_SMALL_ICONS:
|
|
case IDM_VIEW_LIST:
|
|
case IDM_VIEW_DETAILS:
|
|
{
|
|
UINT index = id - IDM_VIEW_LARGE_ICONS;
|
|
if (index < 4)
|
|
{
|
|
g_App.SetListViewMode(index);
|
|
/*
|
|
CMenu menu;
|
|
menu.Attach(::GetSubMenu(::GetMenu(hWnd), k_MenuIndex_View));
|
|
menu.CheckRadioItem(IDM_VIEW_LARGE_ICONS, IDM_VIEW_DETAILS,
|
|
id, MF_BYCOMMAND);
|
|
*/
|
|
}
|
|
break;
|
|
}
|
|
case IDM_VIEW_ARANGE_BY_NAME: g_App.SortItemsWithPropID(kpidName); break;
|
|
case IDM_VIEW_ARANGE_BY_TYPE: g_App.SortItemsWithPropID(kpidExtension); break;
|
|
case IDM_VIEW_ARANGE_BY_DATE: g_App.SortItemsWithPropID(kpidMTime); break;
|
|
case IDM_VIEW_ARANGE_BY_SIZE: g_App.SortItemsWithPropID(kpidSize); break;
|
|
case IDM_VIEW_ARANGE_NO_SORT: g_App.SortItemsWithPropID(kpidNoProperty); break;
|
|
|
|
case IDM_OPEN_ROOT_FOLDER: g_App.OpenRootFolder(); break;
|
|
case IDM_OPEN_PARENT_FOLDER: g_App.OpenParentFolder(); break;
|
|
case IDM_FOLDERS_HISTORY: g_App.FoldersHistory(); break;
|
|
case IDM_VIEW_FLAT_VIEW: g_App.ChangeFlatMode(); break;
|
|
case IDM_VIEW_REFRESH: g_App.RefreshView(); break;
|
|
case IDM_VIEW_AUTO_REFRESH: g_App.Change_AutoRefresh_Mode(); break;
|
|
|
|
// case IDM_VIEW_SHOW_STREAMS: g_App.Change_ShowNtfsStrems_Mode(); break;
|
|
/*
|
|
case IDM_VIEW_SHOW_DELETED:
|
|
{
|
|
g_App.Change_ShowDeleted();
|
|
bool isChecked = g_App.ShowDeletedFiles;
|
|
Save_ShowDeleted(isChecked);
|
|
}
|
|
*/
|
|
|
|
case IDM_VIEW_TWO_PANELS: g_App.SwitchOnOffOnePanel(); break;
|
|
case IDM_VIEW_STANDARD_TOOLBAR: g_App.SwitchStandardToolbar(); break;
|
|
case IDM_VIEW_ARCHIVE_TOOLBAR: g_App.SwitchArchiveToolbar(); break;
|
|
|
|
case IDM_VIEW_TOOLBARS_SHOW_BUTTONS_TEXT: g_App.SwitchButtonsLables(); break;
|
|
case IDM_VIEW_TOOLBARS_LARGE_BUTTONS: g_App.SwitchLargeButtons(); break;
|
|
|
|
// Tools
|
|
case IDM_OPTIONS: OptionsDialog(hWnd, g_hInstance); break;
|
|
|
|
case IDM_BENCHMARK: MyBenchmark(false); break;
|
|
case IDM_BENCHMARK2: MyBenchmark(true); break;
|
|
|
|
// Help
|
|
case IDM_HELP_CONTENTS:
|
|
ShowHelpWindow(kFMHelpTopic);
|
|
break;
|
|
case IDM_ABOUT:
|
|
{
|
|
CAboutDialog dialog;
|
|
dialog.Create(hWnd);
|
|
break;
|
|
}
|
|
case IDM_ABOUT_EASY_7ZIP:
|
|
{
|
|
CAboutEasy7ZipDialog dialog;
|
|
dialog.Create(hWnd);
|
|
break;
|
|
}
|
|
default:
|
|
{
|
|
if (id >= k_MenuID_OpenBookmark && id <= k_MenuID_OpenBookmark + 9)
|
|
{
|
|
g_App.OpenBookmark(id - k_MenuID_OpenBookmark);
|
|
return true;
|
|
}
|
|
else if (id >= k_MenuID_SetBookmark && id <= k_MenuID_SetBookmark + 9)
|
|
{
|
|
g_App.SetBookmark(id - k_MenuID_SetBookmark);
|
|
return true;
|
|
}
|
|
else if (id >= k_MenuID_Time && (unsigned)id < k_MenuID_Time + g_App._timestampLevels.Size())
|
|
{
|
|
g_App.SetTimestampLevel(g_App._timestampLevels[id - k_MenuID_Time]);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|