• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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