BOOL CMenuPage::OnApply() { #ifndef UNDER_CE g_MenuPageHWND = *this; if (IsDlgButtonChecked(IDX_SYSTEM_INTEGRATE_TO_CONTEXT_MENU) == BST_CHECKED) { DllRegisterServer(); NZipRootRegistry::AddContextMenuHandler(); } else { DllUnregisterServer(); NZipRootRegistry::DeleteContextMenuHandler(); } #endif CContextMenuInfo ci; ci.Cascaded = IsDlgButtonChecked(IDX_SYSTEM_CASCADED_MENU) == BST_CHECKED; ci.MenuIcons = IsDlgButtonChecked(IDX_SYSTEM_ICON_IN_MENU) == BST_CHECKED; ci.Flags = 0; for (int i = 0; i < ARRAY_SIZE(kMenuItems); i++) if (m_lstOptions.GetCheck(i)) ci.Flags |= kMenuItems[i].Flag; ci.Save(); return CPropertyPage::OnApply(); }
LONG CMenuPage::OnApply() { #ifndef UNDER_CE g_MenuPageHWND = *this; if (IsButtonCheckedBool(IDC_SYSTEM_INTEGRATE_TO_CONTEXT_MENU)) { DllRegisterServer(); NZipRootRegistry::AddContextMenuHandler(); } else { DllUnregisterServer(); NZipRootRegistry::DeleteContextMenuHandler(); } #endif CContextMenuInfo ci; ci.Cascaded = IsButtonCheckedBool(IDC_SYSTEM_CASCADED_MENU); ci.Flags = 0; for (int i = 0; i < kNumMenuItems; i++) if (_listView.GetCheckState(i)) ci.Flags |= kMenuItems[i].Flag; ci.Save(); return PSNRET_NOERROR; }
LONG CMenuPage::OnApply() { #ifndef UNDER_CE for (unsigned d = 2; d != 0;) { d--; CShellDll &dll = _dlls[d]; if (dll.wasChanged && !dll.Path.IsEmpty()) { bool newVal = IsButtonCheckedBool(dll.ctrl); LONG res = SetContextMenuHandler(newVal, fs2us(dll.Path), dll.wow); if (res != ERROR_SUCCESS && (dll.prevValue != newVal || newVal)) ShowMenuErrorMessage(NError::MyFormatMessage(res), *this); dll.prevValue = CheckContextMenuHandler(fs2us(dll.Path), dll.wow); CheckButton(dll.ctrl, dll.prevValue); dll.wasChanged = false; } } #endif if (_cascaded_Changed || _menuIcons_Changed || _elimDup_Changed || _flags_Changed) { CContextMenuInfo ci; ci.Cascaded.Val = IsButtonCheckedBool(IDX_SYSTEM_CASCADED_MENU); ci.Cascaded.Def = _cascaded_Changed; ci.MenuIcons.Val = IsButtonCheckedBool(IDX_SYSTEM_ICON_IN_MENU); ci.MenuIcons.Def = _menuIcons_Changed; ci.ElimDup.Val = IsButtonCheckedBool(IDX_EXTRACT_ELIM_DUP); ci.ElimDup.Def = _elimDup_Changed; ci.Flags = 0; for (unsigned i = 0; i < ARRAY_SIZE(kMenuItems); i++) if (_listView.GetCheckState(i)) ci.Flags |= kMenuItems[i].Flag; ci.Flags_Def = _flags_Changed; ci.Save(); Clear_MenuChanged(); } // UnChanged(); return PSNRET_NOERROR; }
STDMETHODIMP CZipContextMenu::QueryContextMenu(HMENU hMenu, UINT indexMenu, UINT commandIDFirst, UINT commandIDLast, UINT flags) { // OutputDebugStringA("QueryContextMenu"); LoadLangOneTime(); if (_fileNames.Size() == 0) return E_FAIL; UINT currentCommandID = commandIDFirst; if ((flags & 0x000F) != CMF_NORMAL && (flags & CMF_VERBSONLY) == 0 && (flags & CMF_EXPLORE) == 0) return MAKE_HRESULT(SEVERITY_SUCCESS, 0, currentCommandID); _commandMap.Clear(); CMenu popupMenu; CMenuDestroyer menuDestroyer; CContextMenuInfo ci; ci.Load(); _elimDup = ci.ElimDup; HBITMAP bitmap = NULL; if (ci.MenuIcons.Val) bitmap = _bitmap; UINT subIndex = indexMenu; if (ci.Cascaded.Val) { if (!popupMenu.CreatePopup()) return E_FAIL; menuDestroyer.Attach(popupMenu); /* 9.31: we commented the following code. Probably we don't need. Check more systems. Maybe it was for old Windows? */ /* AddMapItem_ForSubMenu(); currentCommandID++; */ subIndex = 0; } else { popupMenu.Attach(hMenu); CMenuItem mi; mi.fType = MFT_SEPARATOR; mi.fMask = MIIM_TYPE; popupMenu.InsertItem(subIndex++, true, mi); } UInt32 contextMenuFlags = ci.Flags; NFind::CFileInfo fi0; FString folderPrefix; if (_fileNames.Size() > 0) { const UString &fileName = _fileNames.Front(); #if defined(_WIN32) && !defined(UNDER_CE) if (NName::IsDevicePath(us2fs(fileName))) { // CFileInfo::Find can be slow for device files. So we don't call it. // we need only name here. fi0.Name = us2fs(fileName.Ptr(NName::kDevicePathPrefixSize)); // change it 4 - must be constant folderPrefix = #ifdef UNDER_CE FTEXT("\\"); #else FTEXT("C:\\"); #endif } else #endif { if (!fi0.Find(us2fs(fileName))) return E_FAIL; GetOnlyDirPrefix(us2fs(fileName), folderPrefix); } } UString mainString; if (_fileNames.Size() == 1 && currentCommandID + 14 <= commandIDLast) { if (!fi0.IsDir() && DoNeedExtract(fi0.Name)) { // Open bool thereIsMainOpenItem = ((contextMenuFlags & NContextMenuFlags::kOpen) != 0); if (thereIsMainOpenItem) { CCommandMapItem commandMapItem; FillCommand(kOpen, mainString, commandMapItem); MyInsertMenu(popupMenu, subIndex++, currentCommandID++, mainString, bitmap); _commandMap.Add(commandMapItem); } if ((contextMenuFlags & NContextMenuFlags::kOpenAs) != 0 // && (!thereIsMainOpenItem || !FindExt(kNoOpenAsExtensions, fi0.Name)) ) { CMenu subMenu; if (subMenu.CreatePopup()) { CMenuItem mi; mi.fType = MFT_STRING; mi.fMask = MIIM_SUBMENU | MIIM_TYPE | MIIM_ID; if (bitmap) mi.fMask |= MIIM_CHECKMARKS; mi.wID = currentCommandID++; mi.hSubMenu = subMenu; mi.hbmpUnchecked = bitmap; LangString(IDS_CONTEXT_OPEN, mi.StringValue); popupMenu.InsertItem(subIndex++, true, mi); AddMapItem_ForSubMenu(kOpenCascadedVerb); UINT subIndex2 = 0; for (unsigned i = (thereIsMainOpenItem ? 1 : 0); i < ARRAY_SIZE(kOpenTypes); i++) { CCommandMapItem commandMapItem; if (i == 0) FillCommand(kOpen, mainString, commandMapItem); else { mainString.SetFromAscii(kOpenTypes[i]); commandMapItem.CommandInternalID = kOpen; commandMapItem.Verb = (UString)kMainVerb + L".Open." + mainString; commandMapItem.HelpString = mainString; commandMapItem.ArcType = mainString; } MyInsertMenu(subMenu, subIndex2++, currentCommandID++, mainString, bitmap); _commandMap.Add(commandMapItem); } subMenu.Detach(); } } } } if (_fileNames.Size() > 0 && currentCommandID + 10 <= commandIDLast) { bool needExtract = (!fi0.IsDir() && DoNeedExtract(fi0.Name)); if (!needExtract) { for (unsigned i = 1; i < _fileNames.Size(); i++) { NFind::CFileInfo fi; if (!fi.Find(us2fs(_fileNames[i]))) return E_FAIL; if (!fi.IsDir() && DoNeedExtract(fi.Name)) { needExtract = true; break; } } } const UString &fileName = _fileNames.Front(); if (needExtract) { { UString baseFolder = fs2us(folderPrefix); if (_dropMode) baseFolder = _dropPath; UString specFolder = L'*'; if (_fileNames.Size() == 1) specFolder = GetSubFolderNameForExtract(fs2us(fi0.Name)); specFolder.Add_PathSepar(); if ((contextMenuFlags & NContextMenuFlags::kExtract) != 0) { // Extract CCommandMapItem commandMapItem; FillCommand(kExtract, mainString, commandMapItem); commandMapItem.Folder = baseFolder + specFolder; MyInsertMenu(popupMenu, subIndex++, currentCommandID++, mainString, bitmap); _commandMap.Add(commandMapItem); } if ((contextMenuFlags & NContextMenuFlags::kExtractHere) != 0) { // Extract Here CCommandMapItem commandMapItem; FillCommand(kExtractHere, mainString, commandMapItem); commandMapItem.Folder = baseFolder; MyInsertMenu(popupMenu, subIndex++, currentCommandID++, mainString, bitmap); _commandMap.Add(commandMapItem); } if ((contextMenuFlags & NContextMenuFlags::kExtractTo) != 0) { // Extract To CCommandMapItem commandMapItem; UString s; FillCommand(kExtractTo, s, commandMapItem); commandMapItem.Folder = baseFolder + specFolder; MyFormatNew_ReducedName(s, specFolder); MyInsertMenu(popupMenu, subIndex++, currentCommandID++, s, bitmap); _commandMap.Add(commandMapItem); } } if ((contextMenuFlags & NContextMenuFlags::kTest) != 0) { // Test CCommandMapItem commandMapItem; FillCommand(kTest, mainString, commandMapItem); MyInsertMenu(popupMenu, subIndex++, currentCommandID++, mainString, bitmap); _commandMap.Add(commandMapItem); } } UString arcName; if (_fileNames.Size() == 1) arcName = CreateArchiveName(fi0, false); else arcName = CreateArchiveName(fileName, _fileNames.Size() > 1, false); UString arcName7z = arcName + L".7z"; UString arcNameZip = arcName + L".zip"; // Compress if ((contextMenuFlags & NContextMenuFlags::kCompress) != 0) { CCommandMapItem commandMapItem; if (_dropMode) commandMapItem.Folder = _dropPath; else commandMapItem.Folder = fs2us(folderPrefix); commandMapItem.ArcName = arcName; FillCommand(kCompress, mainString, commandMapItem); MyInsertMenu(popupMenu, subIndex++, currentCommandID++, mainString, bitmap); _commandMap.Add(commandMapItem); } #ifdef EMAIL_SUPPORT // CompressEmail if ((contextMenuFlags & NContextMenuFlags::kCompressEmail) != 0 && !_dropMode) { CCommandMapItem commandMapItem; commandMapItem.ArcName = arcName; FillCommand(kCompressEmail, mainString, commandMapItem); MyInsertMenu(popupMenu, subIndex++, currentCommandID++, mainString, bitmap); _commandMap.Add(commandMapItem); } #endif // CompressTo7z if (contextMenuFlags & NContextMenuFlags::kCompressTo7z && !arcName7z.IsEqualTo_NoCase(fs2us(fi0.Name))) { CCommandMapItem commandMapItem; UString s; FillCommand(kCompressTo7z, s, commandMapItem); if (_dropMode) commandMapItem.Folder = _dropPath; else commandMapItem.Folder = fs2us(folderPrefix); commandMapItem.ArcName = arcName7z; commandMapItem.ArcType.SetFromAscii("7z"); MyFormatNew_ReducedName(s, arcName7z); MyInsertMenu(popupMenu, subIndex++, currentCommandID++, s, bitmap); _commandMap.Add(commandMapItem); } #ifdef EMAIL_SUPPORT // CompressTo7zEmail if ((contextMenuFlags & NContextMenuFlags::kCompressTo7zEmail) != 0 && !_dropMode) { CCommandMapItem commandMapItem; UString s; FillCommand(kCompressTo7zEmail, s, commandMapItem); commandMapItem.ArcName = arcName7z; commandMapItem.ArcType.SetFromAscii("7z"); MyFormatNew_ReducedName(s, arcName7z); MyInsertMenu(popupMenu, subIndex++, currentCommandID++, s, bitmap); _commandMap.Add(commandMapItem); } #endif // CompressToZip if (contextMenuFlags & NContextMenuFlags::kCompressToZip && !arcNameZip.IsEqualTo_NoCase(fs2us(fi0.Name))) { CCommandMapItem commandMapItem; UString s; FillCommand(kCompressToZip, s, commandMapItem); if (_dropMode) commandMapItem.Folder = _dropPath; else commandMapItem.Folder = fs2us(folderPrefix); commandMapItem.ArcName = arcNameZip; commandMapItem.ArcType.SetFromAscii("zip"); MyFormatNew_ReducedName(s, arcNameZip); MyInsertMenu(popupMenu, subIndex++, currentCommandID++, s, bitmap); _commandMap.Add(commandMapItem); } #ifdef EMAIL_SUPPORT // CompressToZipEmail if ((contextMenuFlags & NContextMenuFlags::kCompressToZipEmail) != 0 && !_dropMode) { CCommandMapItem commandMapItem; UString s; FillCommand(kCompressToZipEmail, s, commandMapItem); commandMapItem.ArcName = arcNameZip; commandMapItem.ArcType.SetFromAscii("zip"); MyFormatNew_ReducedName(s, arcNameZip); MyInsertMenu(popupMenu, subIndex++, currentCommandID++, s, bitmap); _commandMap.Add(commandMapItem); } #endif } // don't use InsertMenu: See MSDN: // PRB: Duplicate Menu Items In the File Menu For a Shell Context Menu Extension // ID: Q214477 if (ci.Cascaded.Val) { CMenuItem mi; mi.fType = MFT_STRING; mi.fMask = MIIM_SUBMENU | MIIM_TYPE | MIIM_ID; if (bitmap) mi.fMask |= MIIM_CHECKMARKS; mi.wID = currentCommandID++; mi.hSubMenu = popupMenu.Detach(); mi.StringValue.SetFromAscii("7-Zip"); // LangString(IDS_CONTEXT_POPUP_CAPTION); mi.hbmpUnchecked = bitmap; CMenu menu; menu.Attach(hMenu); menuDestroyer.Disable(); menu.InsertItem(indexMenu++, true, mi); AddMapItem_ForSubMenu(kMainVerb); } else { popupMenu.Detach(); indexMenu = subIndex; } if (!_isMenuForFM && ((contextMenuFlags & NContextMenuFlags::kCRC) != 0 && currentCommandID + 6 <= commandIDLast)) { CMenu subMenu; // CMenuDestroyer menuDestroyer_CRC; UINT subIndex_CRC = 0; if (subMenu.CreatePopup()) { // menuDestroyer_CRC.Attach(subMenu); CMenuItem mi; mi.fType = MFT_STRING; mi.fMask = MIIM_SUBMENU | MIIM_TYPE | MIIM_ID; if (bitmap) mi.fMask |= MIIM_CHECKMARKS; mi.wID = currentCommandID++; mi.hSubMenu = subMenu; mi.StringValue.SetFromAscii("CRC SHA"); mi.hbmpUnchecked = bitmap; CMenu menu; menu.Attach(hMenu); // menuDestroyer_CRC.Disable(); menu.InsertItem(indexMenu++, true, mi); AddMapItem_ForSubMenu(kCheckSumCascadedVerb); for (unsigned i = 0; i < ARRAY_SIZE(g_HashCommands); i++) { const CHashCommand &hc = g_HashCommands[i]; CCommandMapItem commandMapItem; commandMapItem.CommandInternalID = hc.CommandInternalID; commandMapItem.Verb = (UString)kCheckSumCascadedVerb + (UString)hc.MethodName; // commandMapItem.HelpString = hc.Name; MyInsertMenu(subMenu, subIndex_CRC++, currentCommandID++, hc.UserName, bitmap); _commandMap.Add(commandMapItem); } subMenu.Detach(); } } return MAKE_HRESULT(SEVERITY_SUCCESS, 0, currentCommandID - commandIDFirst); }
BOOL CMenuPage::OnInitDialog() { CPropertyPage::OnInitDialog(); _initMode = true; LangSetDlgItems(*this, kLangIDs, ARRAY_SIZE(kLangIDs)); #ifdef UNDER_CE EnableItem(IDX_SYSTEM_INTEGRATE_TO_CONTEXT_MENU, false); #else CheckDlgButton(IDX_SYSTEM_INTEGRATE_TO_CONTEXT_MENU, NZipRootRegistry::CheckContextMenuHandler() ? BST_CHECKED : BST_UNCHECKED); #endif CContextMenuInfo ci; ci.Load(); CheckDlgButton(IDX_SYSTEM_CASCADED_MENU, ci.Cascaded ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(IDX_SYSTEM_ICON_IN_MENU, ci.MenuIcons ? BST_CHECKED : BST_UNCHECKED); UInt32 newFlags = LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT; m_lstOptions.SetExtendedStyle(newFlags); m_lstOptions.InsertColumn(0, _T(""), LVCFMT_LEFT, 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 kCompressTo7ze: case kCompressTo7zeEmail: s2 += L".7ze"; break; case kCompressToZip: case kCompressToZipEmail: s2 += L".zip"; break; } s = MyFormatNew(s, s2); break; } } int itemIndex = m_lstOptions.InsertItem(i, GetSystemString(s)); m_lstOptions.SetCheck(itemIndex, ((ci.Flags & menuItem.Flag) != 0)); } m_lstOptions.SetColumnWidth(0, LVSCW_AUTOSIZE); _initMode = false; return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE }
bool CMenuPage::OnInit() { _initMode = true; LangSetDlgItemsText(HWND(*this), kIDLangPairs, sizeof(kIDLangPairs) / sizeof(kIDLangPairs[0])); #ifdef UNDER_CE EnableItem(IDC_SYSTEM_INTEGRATE_TO_CONTEXT_MENU, false); #else CheckButton(IDC_SYSTEM_INTEGRATE_TO_CONTEXT_MENU, NZipRootRegistry::CheckContextMenuHandler()); #endif CContextMenuInfo ci; ci.Load(); CheckButton(IDC_SYSTEM_CASCADED_MENU, ci.Cascaded); _listView.Attach(GetItem(IDC_SYSTEM_OPTIONS_LIST)); UInt32 newFlags = LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT; _listView.SetExtendedListViewStyle(newFlags, newFlags); _listView.InsertColumn(0, L"", 100); for (int i = 0; i < kNumMenuItems; i++) { CContextMenuItem &menuItem = kMenuItems[i]; UString s = LangString(menuItem.ControlID, menuItem.LangID); if (menuItem.Flag == kOpenAs) s += L" >"; 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; case kCompressToPk3: case kCompressToPk3Email: s2 += L".pk3"; 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(); }
STDMETHODIMP CZipContextMenu::QueryContextMenu(HMENU hMenu, UINT indexMenu, UINT commandIDFirst, UINT commandIDLast, UINT flags) { LoadLangOneTime(); if (_fileNames.Size() == 0) return E_FAIL; UINT currentCommandID = commandIDFirst; if ((flags & 0x000F) != CMF_NORMAL && (flags & CMF_VERBSONLY) == 0 && (flags & CMF_EXPLORE) == 0) return MAKE_HRESULT(SEVERITY_SUCCESS, 0, currentCommandID); _commandMap.Clear(); CMenu popupMenu; CMenuDestroyer menuDestroyer; CContextMenuInfo ci; ci.Load(); MENUITEMINFO menuItem; UINT subIndex = indexMenu; if (ci.Cascaded) { CCommandMapItem commandMapItem; if (!popupMenu.CreatePopup()) return E_FAIL; menuDestroyer.Attach(popupMenu); commandMapItem.CommandInternalID = kCommandNULL; commandMapItem.Verb = kMainVerb; commandMapItem.HelpString = LangString(IDS_CONTEXT_CAPTION_HELP, 0x02000102); _commandMap.Add(commandMapItem); menuItem.wID = currentCommandID++; subIndex = 0; } else { popupMenu.Attach(hMenu); } UInt32 contextMenuFlags = ci.Flags; UString mainString; if (_fileNames.Size() == 1 && currentCommandID + 6 <= commandIDLast) { const UString &fileName = _fileNames.Front(); UString folderPrefix; NFile::NDirectory::GetOnlyDirPrefix(fileName, folderPrefix); NFile::NFind::CFileInfoW fileInfo; if (!fileInfo.Find(fileName)) return E_FAIL; if (!fileInfo.IsDir() && DoNeedExtract(fileInfo.Name)) { // Open bool thereIsMainOpenItem = ((contextMenuFlags & NContextMenuFlags::kOpen) != 0); if (thereIsMainOpenItem) { CCommandMapItem commandMapItem; FillCommand(kOpen, mainString, commandMapItem); MyInsertMenu(popupMenu, subIndex++, currentCommandID++, mainString); _commandMap.Add(commandMapItem); } if ((contextMenuFlags & NContextMenuFlags::kOpenAs) != 0 && (!thereIsMainOpenItem || !FindExt(kNoOpenAsExtensions, fileInfo.Name))) { CMenu subMenu; if (subMenu.CreatePopup()) { CCommandMapItem commandMapItem; CMenuItem menuItem; menuItem.fType = MFT_STRING; menuItem.fMask = MIIM_SUBMENU | MIIM_TYPE | MIIM_ID; menuItem.wID = currentCommandID++; menuItem.hSubMenu = subMenu; menuItem.StringValue = LangString(IDS_CONTEXT_OPEN, 0x02000103); popupMenu.InsertItem(subIndex++, true, menuItem); commandMapItem.CommandInternalID = kCommandNULL; commandMapItem.Verb = kMainVerb; commandMapItem.HelpString = LangString(IDS_CONTEXT_OPEN_HELP, 0x02000104); _commandMap.Add(commandMapItem); UINT subIndex2 = 0; const wchar_t *exts[] = { L"", L"*", L"7z", L"zip", L"cab", L"rar" }; for (int i = (thereIsMainOpenItem ? 1 : 0); i < sizeof(exts) / sizeof(exts[0]); i++) { CCommandMapItem commandMapItem; if (i == 0) FillCommand(kOpen, mainString, commandMapItem); else { mainString = exts[i]; commandMapItem.CommandInternalID = kOpen; commandMapItem.Verb = (UString)kMainVerb + L".Open." + mainString; commandMapItem.HelpString = mainString; commandMapItem.ArcType = mainString; } MyInsertMenu(subMenu, subIndex2++, currentCommandID++, mainString); _commandMap.Add(commandMapItem); } subMenu.Detach(); } } } } if (_fileNames.Size() > 0 && currentCommandID + 10 <= commandIDLast) { bool needExtract = false; for(int i = 0; i < _fileNames.Size(); i++) { NFile::NFind::CFileInfoW fileInfo; if (!fileInfo.Find(_fileNames[i])) return E_FAIL; if (!fileInfo.IsDir() && DoNeedExtract(fileInfo.Name)) needExtract = true; } const UString &fileName = _fileNames.Front(); if (needExtract) { UString folderPrefix; NFile::NDirectory::GetOnlyDirPrefix(fileName, folderPrefix); NFile::NFind::CFileInfoW fileInfo; if (!fileInfo.Find(fileName)) return E_FAIL; // Extract if ((contextMenuFlags & NContextMenuFlags::kExtract) != 0) { CCommandMapItem commandMapItem; FillCommand(kExtract, mainString, commandMapItem); if (_dropMode) commandMapItem.Folder = _dropPath; else commandMapItem.Folder = folderPrefix; commandMapItem.Folder += GetSubFolderNameForExtract(fileInfo.Name) + UString(WCHAR_PATH_SEPARATOR); MyInsertMenu(popupMenu, subIndex++, currentCommandID++, mainString); _commandMap.Add(commandMapItem); } // Extract Here if ((contextMenuFlags & NContextMenuFlags::kExtractHere) != 0) { CCommandMapItem commandMapItem; FillCommand(kExtractHere, mainString, commandMapItem); MyInsertMenu(popupMenu, subIndex++, currentCommandID++, mainString); if (_dropMode) commandMapItem.Folder = _dropPath; else commandMapItem.Folder = folderPrefix; _commandMap.Add(commandMapItem); } // Extract To if ((contextMenuFlags & NContextMenuFlags::kExtractTo) != 0) { CCommandMapItem commandMapItem; UString s; FillCommand(kExtractTo, s, commandMapItem); UString folder; if (_fileNames.Size() == 1) folder = GetSubFolderNameForExtract(fileInfo.Name); else folder = L'*'; if (_dropMode) commandMapItem.Folder = _dropPath; else commandMapItem.Folder = folderPrefix; commandMapItem.Folder += folder; s = MyFormatNew(s, GetQuotedReducedString(folder + UString(WCHAR_PATH_SEPARATOR))); MyInsertMenu(popupMenu, subIndex++, currentCommandID++, s); _commandMap.Add(commandMapItem); } // Test if ((contextMenuFlags & NContextMenuFlags::kTest) != 0) { CCommandMapItem commandMapItem; FillCommand(kTest, mainString, commandMapItem); MyInsertMenu(popupMenu, subIndex++, currentCommandID++, mainString); _commandMap.Add(commandMapItem); } } UString archiveName = CreateArchiveName(fileName, _fileNames.Size() > 1, false); UString archiveName7z = archiveName + L".7z"; UString archiveNameZip = archiveName + L".zip"; UString archivePathPrefix; NFile::NDirectory::GetOnlyDirPrefix(fileName, archivePathPrefix); // Compress if ((contextMenuFlags & NContextMenuFlags::kCompress) != 0) { CCommandMapItem commandMapItem; if (_dropMode) commandMapItem.Folder = _dropPath; else commandMapItem.Folder = archivePathPrefix; commandMapItem.ArcName = archiveName; FillCommand(kCompress, mainString, commandMapItem); MyInsertMenu(popupMenu, subIndex++, currentCommandID++, mainString); _commandMap.Add(commandMapItem); } #ifdef EMAIL_SUPPORT // CompressEmail if ((contextMenuFlags & NContextMenuFlags::kCompressEmail) != 0 && !_dropMode) { CCommandMapItem commandMapItem; commandMapItem.ArcName = archiveName; FillCommand(kCompressEmail, mainString, commandMapItem); MyInsertMenu(popupMenu, subIndex++, currentCommandID++, mainString); _commandMap.Add(commandMapItem); } #endif // CompressTo7z if (contextMenuFlags & NContextMenuFlags::kCompressTo7z) { CCommandMapItem commandMapItem; UString s; FillCommand(kCompressTo7z, s, commandMapItem); if (_dropMode) commandMapItem.Folder = _dropPath; else commandMapItem.Folder = archivePathPrefix; commandMapItem.ArcName = archiveName7z; commandMapItem.ArcType = L"7z"; s = MyFormatNew(s, GetQuotedReducedString(archiveName7z)); MyInsertMenu(popupMenu, subIndex++, currentCommandID++, s); _commandMap.Add(commandMapItem); } #ifdef EMAIL_SUPPORT // CompressTo7zEmail if ((contextMenuFlags & NContextMenuFlags::kCompressTo7zEmail) != 0 && !_dropMode) { CCommandMapItem commandMapItem; UString s; FillCommand(kCompressTo7zEmail, s, commandMapItem); commandMapItem.ArcName = archiveName7z; commandMapItem.ArcType = L"7z"; s = MyFormatNew(s, GetQuotedReducedString(archiveName7z)); MyInsertMenu(popupMenu, subIndex++, currentCommandID++, s); _commandMap.Add(commandMapItem); } #endif // CompressToZip if (contextMenuFlags & NContextMenuFlags::kCompressToZip) { CCommandMapItem commandMapItem; UString s; FillCommand(kCompressToZip, s, commandMapItem); if (_dropMode) commandMapItem.Folder = _dropPath; else commandMapItem.Folder = archivePathPrefix; commandMapItem.ArcName = archiveNameZip; commandMapItem.ArcType = L"zip"; s = MyFormatNew(s, GetQuotedReducedString(archiveNameZip)); MyInsertMenu(popupMenu, subIndex++, currentCommandID++, s); _commandMap.Add(commandMapItem); } #ifdef EMAIL_SUPPORT // CompressToZipEmail if ((contextMenuFlags & NContextMenuFlags::kCompressToZipEmail) != 0 && !_dropMode) { CCommandMapItem commandMapItem; UString s; FillCommand(kCompressToZipEmail, s, commandMapItem); commandMapItem.ArcName = archiveNameZip; commandMapItem.ArcType = L"zip"; s = MyFormatNew(s, GetQuotedReducedString(archiveNameZip)); MyInsertMenu(popupMenu, subIndex++, currentCommandID++, s); _commandMap.Add(commandMapItem); } #endif } // don't use InsertMenu: See MSDN: // PRB: Duplicate Menu Items In the File Menu For a Shell Context Menu Extension // ID: Q214477 if (ci.Cascaded) { CMenuItem menuItem; menuItem.fType = MFT_STRING; menuItem.fMask = MIIM_SUBMENU | MIIM_TYPE | MIIM_ID; menuItem.wID = currentCommandID++; menuItem.hSubMenu = popupMenu.Detach(); menuDestroyer.Disable(); menuItem.StringValue = LangString(IDS_CONTEXT_POPUP_CAPTION, 0x02000101); CMenu menu; menu.Attach(hMenu); menu.InsertItem(indexMenu++, true, menuItem); } return MAKE_HRESULT(SEVERITY_SUCCESS, 0, currentCommandID - commandIDFirst); }
bool CMenuPage::OnInit() { _initMode = true; Clear_MenuChanged(); LangSetDlgItems(*this, kLangIDs, ARRAY_SIZE(kLangIDs)); #ifdef UNDER_CE HideItem(IDX_SYSTEM_INTEGRATE_TO_MENU); HideItem(IDX_SYSTEM_INTEGRATE_TO_MENU_2); #else { UString s; { CWindow window(GetItem(IDX_SYSTEM_INTEGRATE_TO_MENU)); window.GetText(s); } UString bit64 = LangString(IDS_PROP_BIT64); if (bit64.IsEmpty()) bit64.SetFromAscii("64-bit"); #ifdef _WIN64 bit64.Replace(L"64", L"32"); #endif s.Add_Space(); s += L'('; s += bit64; s += L')'; SetItemText(IDX_SYSTEM_INTEGRATE_TO_MENU_2, s); } const FString prefix = NDLL::GetModuleDirPrefix(); _dlls[0].ctrl = IDX_SYSTEM_INTEGRATE_TO_MENU; _dlls[1].ctrl = IDX_SYSTEM_INTEGRATE_TO_MENU_2; _dlls[0].wow = 0; _dlls[1].wow = #ifdef _WIN64 KEY_WOW64_32KEY #else KEY_WOW64_64KEY #endif ; for (unsigned d = 0; d < 2; d++) { CShellDll &dll = _dlls[d]; dll.wasChanged = false; #ifndef _WIN64 if (d != 0 && !g_Is_Wow64) { HideItem(dll.ctrl); continue; } #endif FString &path = dll.Path; path = prefix; path.AddAscii(d == 0 ? "7-zip.dll" : #ifdef _WIN64 "7-zip32.dll" #else "7-zip64.dll" #endif ); if (!NFile::NFind::DoesFileExist(path)) { path.Empty(); EnableItem(dll.ctrl, false); } else { dll.prevValue = CheckContextMenuHandler(fs2us(path), dll.wow); CheckButton(dll.ctrl, dll.prevValue); } } #endif CContextMenuInfo ci; ci.Load(); CheckButton(IDX_SYSTEM_CASCADED_MENU, ci.Cascaded.Val); CheckButton(IDX_SYSTEM_ICON_IN_MENU, ci.MenuIcons.Val); CheckButton(IDX_EXTRACT_ELIM_DUP, ci.ElimDup.Val); _listView.Attach(GetItem(IDL_SYSTEM_OPTIONS)); const UInt32 newFlags = LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT; _listView.SetExtendedListViewStyle(newFlags, newFlags); _listView.InsertColumn(0, L"", 200); for (unsigned i = 0; i < ARRAY_SIZE(kMenuItems); i++) { const CContextMenuItem &menuItem = kMenuItems[i]; UString s = LangString(menuItem.ControlID); if (menuItem.Flag == kCRC) s.SetFromAscii("CRC SHA"); if (menuItem.Flag == kOpenAs || menuItem.Flag == kCRC) s.AddAscii(" >"); 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.AddAscii(".7z"); break; case kCompressToZip: case kCompressToZipEmail: s2.AddAscii(".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(); }