xref: /aosp_15_r20/external/lzma/CPP/7zip/UI/Explorer/ContextMenu.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
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