Files
easy7zip/CPP/7zip/UI/Explorer/SystemPage.cpp
Igor Pavlov 173c07e166 4.59 beta
2016-05-28 00:15:56 +01:00

199 lines
4.9 KiB
C++
Executable File

// SystemPage.cpp
#include "StdAfx.h"
#include "resource.h"
#include "SystemPageRes.h"
#include "SystemPage.h"
#include "Common/StringConvert.h"
#include "Windows/Defs.h"
#include "Windows/Control/ListView.h"
#include "../Common/ZipRegistry.h"
#include "../FileManager/HelpUtils.h"
#include "../FileManager/LangUtils.h"
#include "../FileManager/FormatUtils.h"
#include "RegistryContextMenu.h"
#include "ContextMenuFlags.h"
using namespace NContextMenuFlags;
static CIDLangPair kIDLangPairs[] =
{
{ IDC_SYSTEM_INTEGRATE_TO_CONTEXT_MENU, 0x01000301},
{ IDC_SYSTEM_CASCADED_MENU, 0x01000302},
{ IDC_SYSTEM_STATIC_CONTEXT_MENU_ITEMS, 0x01000310}
};
static LPCWSTR kSystemTopic = L"fm/plugins/7-zip/options.htm#system";
struct CContextMenuItem
{
int ControlID;
UInt32 LangID;
UInt32 Flag;
};
static CContextMenuItem kMenuItems[] =
{
{ IDS_CONTEXT_OPEN, 0x02000103, kOpen},
{ IDS_CONTEXT_EXTRACT, 0x02000105, kExtract},
{ IDS_CONTEXT_EXTRACT_HERE, 0x0200010B, kExtractHere },
{ IDS_CONTEXT_EXTRACT_TO, 0x0200010D, kExtractTo },
{ IDS_CONTEXT_TEST, 0x02000109, kTest},
{ IDS_CONTEXT_COMPRESS, 0x02000107, kCompress },
{ IDS_CONTEXT_COMPRESS_EMAIL, 0x02000111, kCompressEmail },
{ IDS_CONTEXT_COMPRESS_TO, 0x0200010F, kCompressTo7z },
{ IDS_CONTEXT_COMPRESS_TO_EMAIL, 0x02000113, kCompressTo7zEmail},
{ IDS_CONTEXT_COMPRESS_TO, 0x0200010F, kCompressToZip },
{ IDS_CONTEXT_COMPRESS_TO_EMAIL, 0x02000113, kCompressToZipEmail}
};
const int kNumMenuItems = sizeof(kMenuItems) / sizeof(kMenuItems[0]);
bool CSystemPage::OnInit()
{
_initMode = true;
LangSetDlgItemsText(HWND(*this), kIDLangPairs, sizeof(kIDLangPairs) / sizeof(kIDLangPairs[0]));
CheckButton(IDC_SYSTEM_INTEGRATE_TO_CONTEXT_MENU,
NZipRootRegistry::CheckContextMenuHandler());
CheckButton(IDC_SYSTEM_CASCADED_MENU, ReadCascadedMenu());
UInt32 contextMenuFlags;
if (!ReadContextMenuStatus(contextMenuFlags))
contextMenuFlags = NContextMenuFlags::GetDefaultFlags();
m_ListView.Attach(GetItem(IDC_SYSTEM_OPTIONS_LIST));
/*
CheckButton(IDC_SYSTEM_INTEGRATE_TO_CONTEXT_MENU,
NRegistryAssociations::CheckContextMenuHandler());
*/
UInt32 newFlags = LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT;
m_ListView.SetExtendedListViewStyle(newFlags, newFlags);
m_ListView.InsertColumn(0, L"", 270);
for (int i = 0; i < kNumMenuItems; i++)
{
CContextMenuItem &menuItem = kMenuItems[i];
UString s = LangString(menuItem.ControlID, menuItem.LangID);
switch(menuItem.ControlID)
{
case IDS_CONTEXT_EXTRACT_TO:
{
s = MyFormatNew(s, LangString(IDS_CONTEXT_FOLDER, 0x02000140));
break;
}
case IDS_CONTEXT_COMPRESS_TO:
case IDS_CONTEXT_COMPRESS_TO_EMAIL:
{
UString s2 = LangString(IDS_CONTEXT_ARCHIVE, 0x02000141);
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 = m_ListView.InsertItem(i, s);
m_ListView.SetCheckState(itemIndex, ((contextMenuFlags & menuItem.Flag) != 0));
}
_initMode = false;
return CPropertyPage::OnInit();
}
STDAPI DllRegisterServer(void);
STDAPI DllUnregisterServer(void);
LONG CSystemPage::OnApply()
{
if (IsButtonCheckedBool(IDC_SYSTEM_INTEGRATE_TO_CONTEXT_MENU))
{
DllRegisterServer();
NZipRootRegistry::AddContextMenuHandler();
}
else
{
DllUnregisterServer();
NZipRootRegistry::DeleteContextMenuHandler();
}
SaveCascadedMenu(IsButtonCheckedBool(IDC_SYSTEM_CASCADED_MENU));
UInt32 flags = 0;
for (int i = 0; i < kNumMenuItems; i++)
if (m_ListView.GetCheckState(i))
flags |= kMenuItems[i].Flag;
SaveContextMenuStatus(flags);
return PSNRET_NOERROR;
}
void CSystemPage::OnNotifyHelp()
{
ShowHelpWindow(NULL, kSystemTopic);
}
bool CSystemPage::OnButtonClicked(int buttonID, HWND buttonHWND)
{
switch(buttonID)
{
case IDC_SYSTEM_CASCADED_MENU:
case IDC_SYSTEM_INTEGRATE_TO_CONTEXT_MENU:
Changed();
return true;
}
return CPropertyPage::OnButtonClicked(buttonID, buttonHWND);
}
bool CSystemPage::OnNotify(UINT controlID, LPNMHDR lParam)
{
if (lParam->hwndFrom == HWND(m_ListView))
{
switch(lParam->code)
{
case (LVN_ITEMCHANGED):
return OnItemChanged((const NMLISTVIEW *)lParam);
}
}
return CPropertyPage::OnNotify(controlID, lParam);
}
bool CSystemPage::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();
}
// PostMessage(kRefreshpluginsListMessage, 0);
// RefreshPluginsList();
return true;
}