mirror of
https://github.com/Xevion/easy7zip.git
synced 2025-12-06 15:14:59 -06:00
212 lines
4.8 KiB
C++
212 lines
4.8 KiB
C++
// MenuPage.cpp
|
|
|
|
#include "StdAfx.h"
|
|
|
|
#include "../Common/ZipRegistry.h"
|
|
|
|
#include "../Explorer/ContextMenuFlags.h"
|
|
#include "../Explorer/RegistryContextMenu.h"
|
|
#include "../Explorer/resource.h"
|
|
|
|
#include "HelpUtils.h"
|
|
#include "LangUtils.h"
|
|
#include "MenuPage.h"
|
|
#include "MenuPageRes.h"
|
|
#include "FormatUtils.h"
|
|
|
|
#include "../FileManager/PropertyNameRes.h"
|
|
|
|
using namespace NContextMenuFlags;
|
|
|
|
static const UInt32 kLangIDs[] =
|
|
{
|
|
IDX_SYSTEM_INTEGRATE_TO_CONTEXT_MENU,
|
|
IDX_SYSTEM_CASCADED_MENU,
|
|
IDX_SYSTEM_ICON_IN_MENU,
|
|
IDT_SYSTEM_CONTEXT_MENU_ITEMS
|
|
};
|
|
|
|
static LPCWSTR kSystemTopic = L"fm/options.htm#sevenZip";
|
|
|
|
struct CContextMenuItem
|
|
{
|
|
int ControlID;
|
|
UInt32 Flag;
|
|
};
|
|
|
|
static CContextMenuItem kMenuItems[] =
|
|
{
|
|
{ IDS_CONTEXT_OPEN, kOpen},
|
|
{ IDS_CONTEXT_OPEN, kOpenAs},
|
|
{ IDS_CONTEXT_EXTRACT, kExtract},
|
|
{ IDS_CONTEXT_EXTRACT_HERE, kExtractHere },
|
|
{ IDS_CONTEXT_EXTRACT_TO, kExtractTo },
|
|
|
|
{ IDS_CONTEXT_TEST, kTest},
|
|
|
|
{ IDS_CONTEXT_COMPRESS, kCompress },
|
|
{ IDS_CONTEXT_COMPRESS_TO, kCompressTo7z },
|
|
{ IDS_CONTEXT_COMPRESS_TO, kCompressToZip }
|
|
|
|
#ifndef UNDER_CE
|
|
,
|
|
{ IDS_CONTEXT_COMPRESS_EMAIL, kCompressEmail },
|
|
{ IDS_CONTEXT_COMPRESS_TO_EMAIL, kCompressTo7zEmail },
|
|
{ IDS_CONTEXT_COMPRESS_TO_EMAIL, kCompressToZipEmail }
|
|
#endif
|
|
|
|
, { IDS_PROP_CHECKSUM, kCRC }
|
|
};
|
|
|
|
bool CMenuPage::OnInit()
|
|
{
|
|
_initMode = true;
|
|
LangSetDlgItems(*this, kLangIDs, ARRAY_SIZE(kLangIDs));
|
|
|
|
#ifdef UNDER_CE
|
|
EnableItem(IDX_SYSTEM_INTEGRATE_TO_CONTEXT_MENU, false);
|
|
#else
|
|
CheckButton(IDX_SYSTEM_INTEGRATE_TO_CONTEXT_MENU, NZipRootRegistry::CheckContextMenuHandler());
|
|
#endif
|
|
|
|
CContextMenuInfo ci;
|
|
ci.Load();
|
|
|
|
CheckButton(IDX_SYSTEM_CASCADED_MENU, ci.Cascaded);
|
|
CheckButton(IDX_SYSTEM_ICON_IN_MENU, ci.MenuIcons);
|
|
|
|
_listView.Attach(GetItem(IDL_SYSTEM_OPTIONS));
|
|
|
|
UInt32 newFlags = LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT;
|
|
_listView.SetExtendedListViewStyle(newFlags, newFlags);
|
|
|
|
_listView.InsertColumn(0, L"", 100);
|
|
|
|
for (int i = 0; i < ARRAY_SIZE(kMenuItems); i++)
|
|
{
|
|
CContextMenuItem &menuItem = kMenuItems[i];
|
|
|
|
UString s = LangString(menuItem.ControlID);
|
|
if (menuItem.Flag == kCRC)
|
|
s = L"CRC SHA";
|
|
if (menuItem.Flag == kOpenAs ||
|
|
menuItem.Flag == kCRC)
|
|
s += L" >";
|
|
|
|
switch (menuItem.ControlID)
|
|
{
|
|
case IDS_CONTEXT_EXTRACT_TO:
|
|
{
|
|
s = MyFormatNew(s, LangString(IDS_CONTEXT_FOLDER));
|
|
break;
|
|
}
|
|
case IDS_CONTEXT_COMPRESS_TO:
|
|
case IDS_CONTEXT_COMPRESS_TO_EMAIL:
|
|
{
|
|
UString s2 = LangString(IDS_CONTEXT_ARCHIVE);
|
|
switch (menuItem.Flag)
|
|
{
|
|
case kCompressTo7z:
|
|
case kCompressTo7zEmail:
|
|
s2 += L".7z";
|
|
break;
|
|
case kCompressToZip:
|
|
case kCompressToZipEmail:
|
|
s2 += L".zip";
|
|
break;
|
|
}
|
|
s = MyFormatNew(s, s2);
|
|
break;
|
|
}
|
|
}
|
|
|
|
int itemIndex = _listView.InsertItem(i, s);
|
|
_listView.SetCheckState(itemIndex, ((ci.Flags & menuItem.Flag) != 0));
|
|
}
|
|
|
|
_listView.SetColumnWidthAuto(0);
|
|
_initMode = false;
|
|
return CPropertyPage::OnInit();
|
|
}
|
|
|
|
#ifndef UNDER_CE
|
|
STDAPI DllRegisterServer(void);
|
|
STDAPI DllUnregisterServer(void);
|
|
HWND g_MenuPageHWND = 0;
|
|
#endif
|
|
|
|
LONG CMenuPage::OnApply()
|
|
{
|
|
#ifndef UNDER_CE
|
|
g_MenuPageHWND = *this;
|
|
if (IsButtonCheckedBool(IDX_SYSTEM_INTEGRATE_TO_CONTEXT_MENU))
|
|
{
|
|
DllRegisterServer();
|
|
NZipRootRegistry::AddContextMenuHandler();
|
|
}
|
|
else
|
|
{
|
|
DllUnregisterServer();
|
|
NZipRootRegistry::DeleteContextMenuHandler();
|
|
}
|
|
#endif
|
|
|
|
CContextMenuInfo ci;
|
|
ci.Cascaded = IsButtonCheckedBool(IDX_SYSTEM_CASCADED_MENU);
|
|
ci.MenuIcons = IsButtonCheckedBool(IDX_SYSTEM_ICON_IN_MENU);
|
|
ci.Flags = 0;
|
|
for (int i = 0; i < ARRAY_SIZE(kMenuItems); i++)
|
|
if (_listView.GetCheckState(i))
|
|
ci.Flags |= kMenuItems[i].Flag;
|
|
ci.Save();
|
|
|
|
return PSNRET_NOERROR;
|
|
}
|
|
|
|
void CMenuPage::OnNotifyHelp()
|
|
{
|
|
ShowHelpWindow(NULL, kSystemTopic);
|
|
}
|
|
|
|
bool CMenuPage::OnButtonClicked(int buttonID, HWND buttonHWND)
|
|
{
|
|
switch (buttonID)
|
|
{
|
|
case IDX_SYSTEM_INTEGRATE_TO_CONTEXT_MENU:
|
|
case IDX_SYSTEM_CASCADED_MENU:
|
|
case IDX_SYSTEM_ICON_IN_MENU:
|
|
Changed();
|
|
return true;
|
|
}
|
|
return CPropertyPage::OnButtonClicked(buttonID, buttonHWND);
|
|
|
|
}
|
|
|
|
bool CMenuPage::OnNotify(UINT controlID, LPNMHDR lParam)
|
|
{
|
|
if (lParam->hwndFrom == HWND(_listView))
|
|
{
|
|
switch (lParam->code)
|
|
{
|
|
case (LVN_ITEMCHANGED):
|
|
return OnItemChanged((const NMLISTVIEW *)lParam);
|
|
}
|
|
}
|
|
return CPropertyPage::OnNotify(controlID, lParam);
|
|
}
|
|
|
|
|
|
bool CMenuPage::OnItemChanged(const NMLISTVIEW *info)
|
|
{
|
|
if (_initMode)
|
|
return true;
|
|
if ((info->uChanged & LVIF_STATE) != 0)
|
|
{
|
|
UINT oldState = info->uOldState & LVIS_STATEIMAGEMASK;
|
|
UINT newState = info->uNewState & LVIS_STATEIMAGEMASK;
|
|
if (oldState != newState)
|
|
Changed();
|
|
}
|
|
return true;
|
|
}
|