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_SHA1, 92 kHash_SHA256, 93 kHash_BLAKE2SP, 94 kHash_All, 95 kHash_Generate_SHA256, 96 kHash_TestArc 97 }; 98 99 public: Init_For_7zFM()100 void Init_For_7zFM() 101 { 102 // _isMenuForFM = true; 103 // _fileNames_WereReduced = false; 104 } 105 106 void LoadItems(IShellItemArray *psiItemArray); 107 108 CZipContextMenu(); 109 ~CZipContextMenu(); 110 111 struct CCommandMapItem 112 { 113 enum_CommandInternalID CommandInternalID; 114 UString Verb; 115 UString UserString; 116 // UString HelpString; 117 UString Folder; 118 UString ArcName; 119 UString ArcType; 120 bool IsPopup; 121 enum_CtxCommandType CtxCommandType; 122 CCommandMapItemCCommandMapItem123 CCommandMapItem(): 124 IsPopup(false), 125 CtxCommandType(CtxCommandType_Normal) 126 {} 127 IsSubMenuCCommandMapItem128 bool IsSubMenu() const 129 { 130 return 131 CtxCommandType == CtxCommandType_CrcRoot || 132 CtxCommandType == CtxCommandType_OpenRoot; 133 } 134 }; 135 136 UStringVector _fileNames; 137 NWindows::NShell::CFileAttribs _attribs; 138 139 private: 140 bool _isMenuForFM; 141 bool _fileNames_WereReduced; // = true, if only first 16 items were used in QueryContextMenu() 142 bool _dropMode; 143 UString _dropPath; 144 CObjectVector<CCommandMapItem> _commandMap; 145 CObjectVector<CCommandMapItem> _commandMap_Cur; 146 147 HBITMAP _bitmap; 148 UInt32 _writeZone; 149 CBoolPair _elimDup; 150 151 bool IsSeparator; 152 bool IsRoot; 153 CObjectVector< CMyComPtr<IExplorerCommand> > SubCommands; 154 unsigned CurrentSubCommand; 155 Set_UserString_in_LastCommand(const UString & s)156 void Set_UserString_in_LastCommand(const UString &s) 157 { 158 _commandMap.Back().UserString = s; 159 } 160 161 int FindVerb(const UString &verb) const; 162 void FillCommand(enum_CommandInternalID id, UString &mainString, CCommandMapItem &cmi) const; 163 void AddCommand(enum_CommandInternalID id, UString &mainString, CCommandMapItem &cmi); 164 void AddMapItem_ForSubMenu(const char *ver); 165 166 HRESULT InvokeCommandCommon(const CCommandMapItem &cmi); 167 }; 168 169 #endif 170