xref: /aosp_15_r20/external/lzma/CPP/Windows/Menu.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // Windows/Menu.h
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_WINDOWS_MENU_H
4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_WINDOWS_MENU_H
5*f6dc9357SAndroid Build Coastguard Worker 
6*f6dc9357SAndroid Build Coastguard Worker #include "../Common/MyWindows.h"
7*f6dc9357SAndroid Build Coastguard Worker #include "../Common/MyString.h"
8*f6dc9357SAndroid Build Coastguard Worker 
9*f6dc9357SAndroid Build Coastguard Worker #include "Defs.h"
10*f6dc9357SAndroid Build Coastguard Worker 
11*f6dc9357SAndroid Build Coastguard Worker namespace NWindows {
12*f6dc9357SAndroid Build Coastguard Worker 
13*f6dc9357SAndroid Build Coastguard Worker #ifndef MIIM_STRING
14*f6dc9357SAndroid Build Coastguard Worker #define MIIM_STRING      0x00000040
15*f6dc9357SAndroid Build Coastguard Worker #endif
16*f6dc9357SAndroid Build Coastguard Worker /*
17*f6dc9357SAndroid Build Coastguard Worker #ifndef MIIM_BITMAP
18*f6dc9357SAndroid Build Coastguard Worker #define MIIM_BITMAP      0x00000080
19*f6dc9357SAndroid Build Coastguard Worker #endif
20*f6dc9357SAndroid Build Coastguard Worker */
21*f6dc9357SAndroid Build Coastguard Worker #ifndef MIIM_FTYPE
22*f6dc9357SAndroid Build Coastguard Worker #define MIIM_FTYPE       0x00000100
23*f6dc9357SAndroid Build Coastguard Worker #endif
24*f6dc9357SAndroid Build Coastguard Worker 
25*f6dc9357SAndroid Build Coastguard Worker struct CMenuItem
26*f6dc9357SAndroid Build Coastguard Worker {
27*f6dc9357SAndroid Build Coastguard Worker   UString StringValue;
28*f6dc9357SAndroid Build Coastguard Worker   UINT fMask;
29*f6dc9357SAndroid Build Coastguard Worker   UINT fType;
30*f6dc9357SAndroid Build Coastguard Worker   UINT fState;
31*f6dc9357SAndroid Build Coastguard Worker   UINT wID;
32*f6dc9357SAndroid Build Coastguard Worker   HMENU hSubMenu;
33*f6dc9357SAndroid Build Coastguard Worker   HBITMAP hbmpChecked;
34*f6dc9357SAndroid Build Coastguard Worker   HBITMAP hbmpUnchecked;
35*f6dc9357SAndroid Build Coastguard Worker   ULONG_PTR dwItemData;
36*f6dc9357SAndroid Build Coastguard Worker   // LPTSTR dwTypeData;
37*f6dc9357SAndroid Build Coastguard Worker   // UINT cch;
38*f6dc9357SAndroid Build Coastguard Worker   // HBITMAP hbmpItem;
IsStringCMenuItem39*f6dc9357SAndroid Build Coastguard Worker   bool IsString() const { return (fMask & (MIIM_TYPE | MIIM_STRING)) != 0; }
IsSeparatorCMenuItem40*f6dc9357SAndroid Build Coastguard Worker   bool IsSeparator() const { return (fType == MFT_SEPARATOR); }
CMenuItemCMenuItem41*f6dc9357SAndroid Build Coastguard Worker   CMenuItem(): fMask(0), fType(0), fState(0), wID(0),
42*f6dc9357SAndroid Build Coastguard Worker       hSubMenu(NULL), hbmpChecked(NULL), hbmpUnchecked(NULL), dwItemData(0) {}
43*f6dc9357SAndroid Build Coastguard Worker };
44*f6dc9357SAndroid Build Coastguard Worker 
45*f6dc9357SAndroid Build Coastguard Worker class CMenu
46*f6dc9357SAndroid Build Coastguard Worker {
47*f6dc9357SAndroid Build Coastguard Worker   HMENU _menu;
48*f6dc9357SAndroid Build Coastguard Worker public:
CMenu()49*f6dc9357SAndroid Build Coastguard Worker   CMenu(): _menu(NULL) {}
HMENU()50*f6dc9357SAndroid Build Coastguard Worker   operator HMENU() const { return _menu; }
Attach(HMENU menu)51*f6dc9357SAndroid Build Coastguard Worker   void Attach(HMENU menu) { _menu = menu; }
52*f6dc9357SAndroid Build Coastguard Worker 
Detach()53*f6dc9357SAndroid Build Coastguard Worker   HMENU Detach()
54*f6dc9357SAndroid Build Coastguard Worker   {
55*f6dc9357SAndroid Build Coastguard Worker     const HMENU menu = _menu;
56*f6dc9357SAndroid Build Coastguard Worker     _menu = NULL;
57*f6dc9357SAndroid Build Coastguard Worker     return menu;
58*f6dc9357SAndroid Build Coastguard Worker   }
59*f6dc9357SAndroid Build Coastguard Worker 
Create()60*f6dc9357SAndroid Build Coastguard Worker   bool Create()
61*f6dc9357SAndroid Build Coastguard Worker   {
62*f6dc9357SAndroid Build Coastguard Worker     _menu = ::CreateMenu();
63*f6dc9357SAndroid Build Coastguard Worker     return (_menu != NULL);
64*f6dc9357SAndroid Build Coastguard Worker   }
65*f6dc9357SAndroid Build Coastguard Worker 
CreatePopup()66*f6dc9357SAndroid Build Coastguard Worker   bool CreatePopup()
67*f6dc9357SAndroid Build Coastguard Worker   {
68*f6dc9357SAndroid Build Coastguard Worker     _menu = ::CreatePopupMenu();
69*f6dc9357SAndroid Build Coastguard Worker     return (_menu != NULL);
70*f6dc9357SAndroid Build Coastguard Worker   }
71*f6dc9357SAndroid Build Coastguard Worker 
Destroy()72*f6dc9357SAndroid Build Coastguard Worker   bool Destroy()
73*f6dc9357SAndroid Build Coastguard Worker   {
74*f6dc9357SAndroid Build Coastguard Worker     if (!_menu)
75*f6dc9357SAndroid Build Coastguard Worker       return false;
76*f6dc9357SAndroid Build Coastguard Worker     return BOOLToBool(::DestroyMenu(Detach()));
77*f6dc9357SAndroid Build Coastguard Worker   }
78*f6dc9357SAndroid Build Coastguard Worker 
GetItemCount()79*f6dc9357SAndroid Build Coastguard Worker   int GetItemCount() const
80*f6dc9357SAndroid Build Coastguard Worker   {
81*f6dc9357SAndroid Build Coastguard Worker     #ifdef UNDER_CE
82*f6dc9357SAndroid Build Coastguard Worker     for (unsigned i = 0;; i++)
83*f6dc9357SAndroid Build Coastguard Worker     {
84*f6dc9357SAndroid Build Coastguard Worker       CMenuItem item;
85*f6dc9357SAndroid Build Coastguard Worker       item.fMask = MIIM_STATE;
86*f6dc9357SAndroid Build Coastguard Worker       if (!GetItem(i, true, item))
87*f6dc9357SAndroid Build Coastguard Worker         return (int)i;
88*f6dc9357SAndroid Build Coastguard Worker     }
89*f6dc9357SAndroid Build Coastguard Worker     #else
90*f6dc9357SAndroid Build Coastguard Worker     return GetMenuItemCount(_menu);
91*f6dc9357SAndroid Build Coastguard Worker     #endif
92*f6dc9357SAndroid Build Coastguard Worker   }
93*f6dc9357SAndroid Build Coastguard Worker 
GetSubMenu(int pos)94*f6dc9357SAndroid Build Coastguard Worker   HMENU GetSubMenu(int pos) const { return ::GetSubMenu(_menu, pos); }
95*f6dc9357SAndroid Build Coastguard Worker   #ifndef UNDER_CE
96*f6dc9357SAndroid Build Coastguard Worker   /*
97*f6dc9357SAndroid Build Coastguard Worker   bool GetItemString(UINT idItem, UINT flag, CSysString &result)
98*f6dc9357SAndroid Build Coastguard Worker   {
99*f6dc9357SAndroid Build Coastguard Worker     result.Empty();
100*f6dc9357SAndroid Build Coastguard Worker     int len = ::GetMenuString(_menu, idItem, 0, 0, flag);
101*f6dc9357SAndroid Build Coastguard Worker     int len2 = ::GetMenuString(_menu, idItem, result.GetBuf(len + 2), len + 1, flag);
102*f6dc9357SAndroid Build Coastguard Worker     if (len > len2)
103*f6dc9357SAndroid Build Coastguard Worker       len = len2;
104*f6dc9357SAndroid Build Coastguard Worker     result.ReleaseBuf_CalcLen(len + 2);
105*f6dc9357SAndroid Build Coastguard Worker     return (len != 0);
106*f6dc9357SAndroid Build Coastguard Worker   }
107*f6dc9357SAndroid Build Coastguard Worker   */
GetItemID(int pos)108*f6dc9357SAndroid Build Coastguard Worker   UINT GetItemID(int pos) const { return ::GetMenuItemID(_menu, pos);   }
GetItemState(UINT id,UINT flags)109*f6dc9357SAndroid Build Coastguard Worker   UINT GetItemState(UINT id, UINT flags)  const { return ::GetMenuState(_menu, id, flags);   }
110*f6dc9357SAndroid Build Coastguard Worker   #endif
111*f6dc9357SAndroid Build Coastguard Worker 
GetItemInfo(UINT itemIndex,bool byPosition,LPMENUITEMINFO itemInfo)112*f6dc9357SAndroid Build Coastguard Worker   bool GetItemInfo(UINT itemIndex, bool byPosition, LPMENUITEMINFO itemInfo) const
113*f6dc9357SAndroid Build Coastguard Worker     { return BOOLToBool(::GetMenuItemInfo(_menu, itemIndex, BoolToBOOL(byPosition), itemInfo)); }
SetItemInfo(UINT itemIndex,bool byPosition,LPMENUITEMINFO itemInfo)114*f6dc9357SAndroid Build Coastguard Worker   bool SetItemInfo(UINT itemIndex, bool byPosition, LPMENUITEMINFO itemInfo)
115*f6dc9357SAndroid Build Coastguard Worker     { return BOOLToBool(::SetMenuItemInfo(_menu, itemIndex, BoolToBOOL(byPosition), itemInfo)); }
116*f6dc9357SAndroid Build Coastguard Worker 
AppendItem(UINT flags,UINT_PTR newItemID,LPCTSTR newItem)117*f6dc9357SAndroid Build Coastguard Worker   bool AppendItem(UINT flags, UINT_PTR newItemID, LPCTSTR newItem)
118*f6dc9357SAndroid Build Coastguard Worker     { return BOOLToBool(::AppendMenu(_menu, flags, newItemID, newItem)); }
119*f6dc9357SAndroid Build Coastguard Worker 
Insert(UINT position,UINT flags,UINT_PTR idNewItem,LPCTSTR newItem)120*f6dc9357SAndroid Build Coastguard Worker   bool Insert(UINT position, UINT flags, UINT_PTR idNewItem, LPCTSTR newItem)
121*f6dc9357SAndroid Build Coastguard Worker     { return BOOLToBool(::InsertMenu(_menu, position, flags, idNewItem, newItem)); }
122*f6dc9357SAndroid Build Coastguard Worker 
123*f6dc9357SAndroid Build Coastguard Worker   #ifndef UNDER_CE
InsertItem(UINT itemIndex,bool byPosition,LPCMENUITEMINFO itemInfo)124*f6dc9357SAndroid Build Coastguard Worker   bool InsertItem(UINT itemIndex, bool byPosition, LPCMENUITEMINFO itemInfo)
125*f6dc9357SAndroid Build Coastguard Worker     { return BOOLToBool(::InsertMenuItem(_menu, itemIndex, BoolToBOOL(byPosition), itemInfo)); }
126*f6dc9357SAndroid Build Coastguard Worker   #endif
127*f6dc9357SAndroid Build Coastguard Worker 
RemoveItem(UINT item,UINT flags)128*f6dc9357SAndroid Build Coastguard Worker   bool RemoveItem(UINT item, UINT flags) { return BOOLToBool(::RemoveMenu(_menu, item, flags)); }
RemoveAllItemsFrom(UINT index)129*f6dc9357SAndroid Build Coastguard Worker   void RemoveAllItemsFrom(UINT index) { while (RemoveItem(index, MF_BYPOSITION)); }
RemoveAllItems()130*f6dc9357SAndroid Build Coastguard Worker   void RemoveAllItems() { RemoveAllItemsFrom(0); }
131*f6dc9357SAndroid Build Coastguard Worker 
132*f6dc9357SAndroid Build Coastguard Worker   #ifndef _UNICODE
GetItemInfo(UINT itemIndex,bool byPosition,LPMENUITEMINFOW itemInfo)133*f6dc9357SAndroid Build Coastguard Worker   bool GetItemInfo(UINT itemIndex, bool byPosition, LPMENUITEMINFOW itemInfo) const
134*f6dc9357SAndroid Build Coastguard Worker     { return BOOLToBool(::GetMenuItemInfoW(_menu, itemIndex, BoolToBOOL(byPosition), itemInfo)); }
InsertItem(UINT itemIndex,bool byPosition,LPMENUITEMINFOW itemInfo)135*f6dc9357SAndroid Build Coastguard Worker   bool InsertItem(UINT itemIndex, bool byPosition, LPMENUITEMINFOW itemInfo)
136*f6dc9357SAndroid Build Coastguard Worker     { return BOOLToBool(::InsertMenuItemW(_menu, itemIndex, BoolToBOOL(byPosition), itemInfo)); }
SetItemInfo(UINT itemIndex,bool byPosition,LPMENUITEMINFOW itemInfo)137*f6dc9357SAndroid Build Coastguard Worker   bool SetItemInfo(UINT itemIndex, bool byPosition, LPMENUITEMINFOW itemInfo)
138*f6dc9357SAndroid Build Coastguard Worker     { return BOOLToBool(::SetMenuItemInfoW(_menu, itemIndex, BoolToBOOL(byPosition), itemInfo)); }
139*f6dc9357SAndroid Build Coastguard Worker   bool AppendItem(UINT flags, UINT_PTR newItemID, LPCWSTR newItem);
140*f6dc9357SAndroid Build Coastguard Worker   #endif
141*f6dc9357SAndroid Build Coastguard Worker 
142*f6dc9357SAndroid Build Coastguard Worker   bool GetItem(UINT itemIndex, bool byPosition, CMenuItem &item) const;
143*f6dc9357SAndroid Build Coastguard Worker   bool SetItem(UINT itemIndex, bool byPosition, const CMenuItem &item);
144*f6dc9357SAndroid Build Coastguard Worker   bool InsertItem(UINT itemIndex, bool byPosition, const CMenuItem &item);
145*f6dc9357SAndroid Build Coastguard Worker 
Track(UINT flags,int x,int y,HWND hWnd)146*f6dc9357SAndroid Build Coastguard Worker   int Track(UINT flags, int x, int y, HWND hWnd) { return ::TrackPopupMenuEx(_menu, flags, x, y, hWnd, NULL); }
147*f6dc9357SAndroid Build Coastguard Worker 
CheckRadioItem(UINT idFirst,UINT idLast,UINT idCheck,UINT flags)148*f6dc9357SAndroid Build Coastguard Worker   bool CheckRadioItem(UINT idFirst, UINT idLast, UINT idCheck, UINT flags)
149*f6dc9357SAndroid Build Coastguard Worker     { return BOOLToBool(::CheckMenuRadioItem(_menu, idFirst, idLast, idCheck, flags)); }
150*f6dc9357SAndroid Build Coastguard Worker 
CheckItem(UINT id,UINT uCheck)151*f6dc9357SAndroid Build Coastguard Worker   DWORD CheckItem(UINT id, UINT uCheck) { return ::CheckMenuItem(_menu, id, uCheck); }
CheckItemByID(UINT id,bool check)152*f6dc9357SAndroid Build Coastguard Worker   DWORD CheckItemByID(UINT id, bool check) { return CheckItem(id, MF_BYCOMMAND | (check ? MF_CHECKED : MF_UNCHECKED)); }
153*f6dc9357SAndroid Build Coastguard Worker 
EnableItem(UINT uIDEnableItem,UINT uEnable)154*f6dc9357SAndroid Build Coastguard Worker   BOOL EnableItem(UINT uIDEnableItem, UINT uEnable) { return EnableMenuItem(_menu, uIDEnableItem, uEnable); }
155*f6dc9357SAndroid Build Coastguard Worker };
156*f6dc9357SAndroid Build Coastguard Worker 
157*f6dc9357SAndroid Build Coastguard Worker class CMenuDestroyer
158*f6dc9357SAndroid Build Coastguard Worker {
159*f6dc9357SAndroid Build Coastguard Worker   CMenu *_menu;
160*f6dc9357SAndroid Build Coastguard Worker public:
CMenuDestroyer(CMenu & menu)161*f6dc9357SAndroid Build Coastguard Worker   CMenuDestroyer(CMenu &menu): _menu(&menu) {}
CMenuDestroyer()162*f6dc9357SAndroid Build Coastguard Worker   CMenuDestroyer(): _menu(NULL) {}
~CMenuDestroyer()163*f6dc9357SAndroid Build Coastguard Worker   ~CMenuDestroyer() { if (_menu) _menu->Destroy(); }
Attach(CMenu & menu)164*f6dc9357SAndroid Build Coastguard Worker   void Attach(CMenu &menu) { _menu = &menu; }
Disable()165*f6dc9357SAndroid Build Coastguard Worker   void Disable() { _menu = NULL; }
166*f6dc9357SAndroid Build Coastguard Worker };
167*f6dc9357SAndroid Build Coastguard Worker 
168*f6dc9357SAndroid Build Coastguard Worker }
169*f6dc9357SAndroid Build Coastguard Worker 
170*f6dc9357SAndroid Build Coastguard Worker #endif
171