1 // ContextMenu.h 2 3 #ifndef ZIP7_INC_CONTEXT_MENU_H 4 #define ZIP7_INC_CONTEXT_MENU_H 5 6 #include "../../../Windows/Shell.h" 7 8 #include "MyExplorerCommand.h" 9 10 #include "../FileManager/MyCom2.h" 11 12 #ifdef CMF_EXTENDEDVERBS 13 #define Z7_WIN_CMF_EXTENDEDVERBS CMF_EXTENDEDVERBS 14 #else 15 #define Z7_WIN_CMF_EXTENDEDVERBS 0x00000100 16 #endif 17 18 enum enum_CtxCommandType 19 { 20 CtxCommandType_Normal, 21 CtxCommandType_OpenRoot, 22 CtxCommandType_OpenChild, 23 CtxCommandType_CrcRoot, 24 CtxCommandType_CrcChild 25 }; 26 27 28 class CZipContextMenu Z7_final: 29 public IContextMenu, 30 public IShellExtInit, 31 public IExplorerCommand, 32 public IEnumExplorerCommand, 33 public CMyUnknownImp 34 { 35 Z7_COM_UNKNOWN_IMP_4_MT( 36 IContextMenu, 37 IShellExtInit, 38 IExplorerCommand, 39 IEnumExplorerCommand 40 ) 41 42 // IShellExtInit 43 STDMETHOD(Initialize)(LPCITEMIDLIST pidlFolder, LPDATAOBJECT dataObject, HKEY hkeyProgID) Z7_override; 44 45 // IContextMenu 46 STDMETHOD(QueryContextMenu)(HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags) Z7_override; 47 STDMETHOD(InvokeCommand)(LPCMINVOKECOMMANDINFO lpici) Z7_override; 48 STDMETHOD(GetCommandString)( 49 #ifdef Z7_OLD_WIN_SDK 50 UINT 51 #else 52 UINT_PTR 53 #endif 54 idCmd, UINT uType, UINT *pwReserved, LPSTR pszName, UINT cchMax) Z7_override; 55 56 // IExplorerCommand 57 STDMETHOD (GetTitle) (IShellItemArray *psiItemArray, LPWSTR *ppszName) Z7_override; 58 STDMETHOD (GetIcon) (IShellItemArray *psiItemArray, LPWSTR *ppszIcon) Z7_override; 59 STDMETHOD (GetToolTip) (IShellItemArray *psiItemArray, LPWSTR *ppszInfotip) Z7_override; 60 STDMETHOD (GetCanonicalName) (GUID *pguidCommandName) Z7_override; 61 STDMETHOD (GetState) (IShellItemArray *psiItemArray, BOOL fOkToBeSlow, EXPCMDSTATE *pCmdState) Z7_override; 62 STDMETHOD (Invoke) (IShellItemArray *psiItemArray, IBindCtx *pbc) Z7_override; 63 STDMETHOD (GetFlags) (EXPCMDFLAGS *pFlags) Z7_override; 64 STDMETHOD (EnumSubCommands) (IEnumExplorerCommand **ppEnum) Z7_override; 65 66 // IEnumExplorerCommand 67 STDMETHOD (Next) (ULONG celt, IExplorerCommand **pUICommand, ULONG *pceltFetched) Z7_override; 68 STDMETHOD (Skip) (ULONG celt) Z7_override; 69 STDMETHOD (Reset) (void) Z7_override; 70 STDMETHOD (Clone) (IEnumExplorerCommand **ppenum) Z7_override; 71 72 public: 73 74 enum enum_CommandInternalID 75 { 76 kCommandNULL, 77 kOpen, 78 kExtract, 79 kExtractHere, 80 kExtractTo, 81 kTest, 82 kCompress, 83 kCompressEmail, 84 kCompressTo7z, 85 kCompressTo7zEmail, 86 kCompressToZip, 87 kCompressToZipEmail, 88 kHash_CRC32, 89 kHash_CRC64, 90 kHash_XXH64, 91 kHash_MD5, 92 kHash_SHA1, 93 kHash_SHA256, 94 kHash_SHA384, 95 kHash_SHA512, 96 kHash_SHA3_256, 97 kHash_BLAKE2SP, 98 kHash_All, 99 kHash_Generate_SHA256, 100 kHash_TestArc 101 }; 102 103 public: Init_For_7zFM()104 void Init_For_7zFM() 105 { 106 // _isMenuForFM = true; 107 // _fileNames_WereReduced = false; 108 } 109 110 void LoadItems(IShellItemArray *psiItemArray); 111 112 CZipContextMenu(); 113 ~CZipContextMenu(); 114 115 struct CCommandMapItem 116 { 117 enum_CommandInternalID CommandInternalID; 118 UString Verb; 119 UString UserString; 120 // UString HelpString; 121 UString Folder; 122 UString ArcName; 123 UString ArcType; 124 bool IsPopup; 125 enum_CtxCommandType CtxCommandType; 126 CCommandMapItemCCommandMapItem127 CCommandMapItem(): 128 IsPopup(false), 129 CtxCommandType(CtxCommandType_Normal) 130 {} 131 IsSubMenuCCommandMapItem132 bool IsSubMenu() const 133 { 134 return 135 CtxCommandType == CtxCommandType_CrcRoot || 136 CtxCommandType == CtxCommandType_OpenRoot; 137 } 138 }; 139 140 UStringVector _fileNames; 141 NWindows::NShell::CFileAttribs _attribs; 142 143 private: 144 bool _isMenuForFM; 145 bool _fileNames_WereReduced; // = true, if only first 16 items were used in QueryContextMenu() 146 bool _dropMode; 147 UString _dropPath; 148 CObjectVector<CCommandMapItem> _commandMap; 149 CObjectVector<CCommandMapItem> _commandMap_Cur; 150 151 HBITMAP _bitmap; 152 UInt32 _writeZone; 153 CBoolPair _elimDup; 154 155 bool IsSeparator; 156 bool IsRoot; 157 CObjectVector< CMyComPtr<IExplorerCommand> > SubCommands; 158 unsigned CurrentSubCommand; 159 Set_UserString_in_LastCommand(const UString & s)160 void Set_UserString_in_LastCommand(const UString &s) 161 { 162 _commandMap.Back().UserString = s; 163 } 164 165 int FindVerb(const UString &verb) const; 166 void FillCommand(enum_CommandInternalID id, UString &mainString, CCommandMapItem &cmi) const; 167 void AddCommand(enum_CommandInternalID id, UString &mainString, CCommandMapItem &cmi); 168 void AddMapItem_ForSubMenu(const char *ver); 169 170 HRESULT InvokeCommandCommon(const CCommandMapItem &cmi); 171 }; 172 173 #endif 174