xref: /aosp_15_r20/external/lzma/CPP/7zip/UI/FileManager/MenuPage.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // MenuPage.cpp
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h"
4*f6dc9357SAndroid Build Coastguard Worker 
5*f6dc9357SAndroid Build Coastguard Worker #include "../Common/ZipRegistry.h"
6*f6dc9357SAndroid Build Coastguard Worker 
7*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/DLL.h"
8*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/ErrorMsg.h"
9*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/FileFind.h"
10*f6dc9357SAndroid Build Coastguard Worker 
11*f6dc9357SAndroid Build Coastguard Worker #include "../Explorer/ContextMenuFlags.h"
12*f6dc9357SAndroid Build Coastguard Worker #include "../Explorer/RegistryContextMenu.h"
13*f6dc9357SAndroid Build Coastguard Worker #include "../Explorer/resource.h"
14*f6dc9357SAndroid Build Coastguard Worker 
15*f6dc9357SAndroid Build Coastguard Worker #include "../FileManager/PropertyNameRes.h"
16*f6dc9357SAndroid Build Coastguard Worker 
17*f6dc9357SAndroid Build Coastguard Worker #include "../GUI/ExtractDialogRes.h"
18*f6dc9357SAndroid Build Coastguard Worker 
19*f6dc9357SAndroid Build Coastguard Worker #include "FormatUtils.h"
20*f6dc9357SAndroid Build Coastguard Worker #include "HelpUtils.h"
21*f6dc9357SAndroid Build Coastguard Worker #include "LangUtils.h"
22*f6dc9357SAndroid Build Coastguard Worker #include "MenuPage.h"
23*f6dc9357SAndroid Build Coastguard Worker #include "MenuPageRes.h"
24*f6dc9357SAndroid Build Coastguard Worker 
25*f6dc9357SAndroid Build Coastguard Worker 
26*f6dc9357SAndroid Build Coastguard Worker using namespace NWindows;
27*f6dc9357SAndroid Build Coastguard Worker using namespace NContextMenuFlags;
28*f6dc9357SAndroid Build Coastguard Worker 
29*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_LANG
30*f6dc9357SAndroid Build Coastguard Worker static const UInt32 kLangIDs[] =
31*f6dc9357SAndroid Build Coastguard Worker {
32*f6dc9357SAndroid Build Coastguard Worker   IDX_SYSTEM_INTEGRATE_TO_MENU,
33*f6dc9357SAndroid Build Coastguard Worker   IDX_SYSTEM_CASCADED_MENU,
34*f6dc9357SAndroid Build Coastguard Worker   IDX_SYSTEM_ICON_IN_MENU,
35*f6dc9357SAndroid Build Coastguard Worker   IDX_EXTRACT_ELIM_DUP,
36*f6dc9357SAndroid Build Coastguard Worker   IDT_SYSTEM_ZONE,
37*f6dc9357SAndroid Build Coastguard Worker   IDT_SYSTEM_CONTEXT_MENU_ITEMS
38*f6dc9357SAndroid Build Coastguard Worker };
39*f6dc9357SAndroid Build Coastguard Worker #endif
40*f6dc9357SAndroid Build Coastguard Worker 
41*f6dc9357SAndroid Build Coastguard Worker #define kMenuTopic "fm/options.htm#sevenZip"
42*f6dc9357SAndroid Build Coastguard Worker 
43*f6dc9357SAndroid Build Coastguard Worker struct CContextMenuItem
44*f6dc9357SAndroid Build Coastguard Worker {
45*f6dc9357SAndroid Build Coastguard Worker   unsigned ControlID;
46*f6dc9357SAndroid Build Coastguard Worker   UInt32 Flag;
47*f6dc9357SAndroid Build Coastguard Worker };
48*f6dc9357SAndroid Build Coastguard Worker 
49*f6dc9357SAndroid Build Coastguard Worker static const CContextMenuItem kMenuItems[] =
50*f6dc9357SAndroid Build Coastguard Worker {
51*f6dc9357SAndroid Build Coastguard Worker   { IDS_CONTEXT_OPEN, kOpen },
52*f6dc9357SAndroid Build Coastguard Worker   { IDS_CONTEXT_OPEN, kOpenAs },
53*f6dc9357SAndroid Build Coastguard Worker   { IDS_CONTEXT_EXTRACT, kExtract },
54*f6dc9357SAndroid Build Coastguard Worker   { IDS_CONTEXT_EXTRACT_HERE, kExtractHere },
55*f6dc9357SAndroid Build Coastguard Worker   { IDS_CONTEXT_EXTRACT_TO, kExtractTo },
56*f6dc9357SAndroid Build Coastguard Worker 
57*f6dc9357SAndroid Build Coastguard Worker   { IDS_CONTEXT_TEST, kTest },
58*f6dc9357SAndroid Build Coastguard Worker 
59*f6dc9357SAndroid Build Coastguard Worker   { IDS_CONTEXT_COMPRESS, kCompress },
60*f6dc9357SAndroid Build Coastguard Worker   { IDS_CONTEXT_COMPRESS_TO, kCompressTo7z },
61*f6dc9357SAndroid Build Coastguard Worker   { IDS_CONTEXT_COMPRESS_TO, kCompressToZip },
62*f6dc9357SAndroid Build Coastguard Worker 
63*f6dc9357SAndroid Build Coastguard Worker   #ifndef UNDER_CE
64*f6dc9357SAndroid Build Coastguard Worker   { IDS_CONTEXT_COMPRESS_EMAIL, kCompressEmail },
65*f6dc9357SAndroid Build Coastguard Worker   { IDS_CONTEXT_COMPRESS_TO_EMAIL, kCompressTo7zEmail },
66*f6dc9357SAndroid Build Coastguard Worker   { IDS_CONTEXT_COMPRESS_TO_EMAIL, kCompressToZipEmail },
67*f6dc9357SAndroid Build Coastguard Worker   #endif
68*f6dc9357SAndroid Build Coastguard Worker 
69*f6dc9357SAndroid Build Coastguard Worker   { IDS_PROP_CHECKSUM, kCRC },
70*f6dc9357SAndroid Build Coastguard Worker   { IDS_PROP_CHECKSUM, kCRC_Cascaded },
71*f6dc9357SAndroid Build Coastguard Worker };
72*f6dc9357SAndroid Build Coastguard Worker 
73*f6dc9357SAndroid Build Coastguard Worker 
74*f6dc9357SAndroid Build Coastguard Worker #if !defined(_WIN64)
75*f6dc9357SAndroid Build Coastguard Worker extern bool g_Is_Wow64;
76*f6dc9357SAndroid Build Coastguard Worker #endif
77*f6dc9357SAndroid Build Coastguard Worker 
78*f6dc9357SAndroid Build Coastguard Worker #ifndef KEY_WOW64_64KEY
79*f6dc9357SAndroid Build Coastguard Worker   #define KEY_WOW64_64KEY (0x0100)
80*f6dc9357SAndroid Build Coastguard Worker #endif
81*f6dc9357SAndroid Build Coastguard Worker 
82*f6dc9357SAndroid Build Coastguard Worker #ifndef KEY_WOW64_32KEY
83*f6dc9357SAndroid Build Coastguard Worker   #define KEY_WOW64_32KEY (0x0200)
84*f6dc9357SAndroid Build Coastguard Worker #endif
85*f6dc9357SAndroid Build Coastguard Worker 
86*f6dc9357SAndroid Build Coastguard Worker 
LoadLang_Spec(UString & s,UInt32 id,const char * eng)87*f6dc9357SAndroid Build Coastguard Worker static void LoadLang_Spec(UString &s, UInt32 id, const char *eng)
88*f6dc9357SAndroid Build Coastguard Worker {
89*f6dc9357SAndroid Build Coastguard Worker   LangString(id, s);
90*f6dc9357SAndroid Build Coastguard Worker   if (s.IsEmpty())
91*f6dc9357SAndroid Build Coastguard Worker     s = eng;
92*f6dc9357SAndroid Build Coastguard Worker   s.RemoveChar(L'&');
93*f6dc9357SAndroid Build Coastguard Worker }
94*f6dc9357SAndroid Build Coastguard Worker 
95*f6dc9357SAndroid Build Coastguard Worker 
OnInit()96*f6dc9357SAndroid Build Coastguard Worker bool CMenuPage::OnInit()
97*f6dc9357SAndroid Build Coastguard Worker {
98*f6dc9357SAndroid Build Coastguard Worker   _initMode = true;
99*f6dc9357SAndroid Build Coastguard Worker 
100*f6dc9357SAndroid Build Coastguard Worker   Clear_MenuChanged();
101*f6dc9357SAndroid Build Coastguard Worker 
102*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_LANG
103*f6dc9357SAndroid Build Coastguard Worker   LangSetDlgItems(*this, kLangIDs, Z7_ARRAY_SIZE(kLangIDs));
104*f6dc9357SAndroid Build Coastguard Worker #endif
105*f6dc9357SAndroid Build Coastguard Worker 
106*f6dc9357SAndroid Build Coastguard Worker   #ifdef UNDER_CE
107*f6dc9357SAndroid Build Coastguard Worker 
108*f6dc9357SAndroid Build Coastguard Worker   HideItem(IDX_SYSTEM_INTEGRATE_TO_MENU);
109*f6dc9357SAndroid Build Coastguard Worker   HideItem(IDX_SYSTEM_INTEGRATE_TO_MENU_2);
110*f6dc9357SAndroid Build Coastguard Worker 
111*f6dc9357SAndroid Build Coastguard Worker   #else
112*f6dc9357SAndroid Build Coastguard Worker 
113*f6dc9357SAndroid Build Coastguard Worker   {
114*f6dc9357SAndroid Build Coastguard Worker     UString s;
115*f6dc9357SAndroid Build Coastguard Worker     {
116*f6dc9357SAndroid Build Coastguard Worker       CWindow window(GetItem(IDX_SYSTEM_INTEGRATE_TO_MENU));
117*f6dc9357SAndroid Build Coastguard Worker       window.GetText(s);
118*f6dc9357SAndroid Build Coastguard Worker     }
119*f6dc9357SAndroid Build Coastguard Worker     UString bit64 = LangString(IDS_PROP_BIT64);
120*f6dc9357SAndroid Build Coastguard Worker     if (bit64.IsEmpty())
121*f6dc9357SAndroid Build Coastguard Worker       bit64 = "64-bit";
122*f6dc9357SAndroid Build Coastguard Worker     #ifdef _WIN64
123*f6dc9357SAndroid Build Coastguard Worker       bit64.Replace(L"64", L"32");
124*f6dc9357SAndroid Build Coastguard Worker     #endif
125*f6dc9357SAndroid Build Coastguard Worker     s.Add_Space();
126*f6dc9357SAndroid Build Coastguard Worker     s.Add_Char('(');
127*f6dc9357SAndroid Build Coastguard Worker     s += bit64;
128*f6dc9357SAndroid Build Coastguard Worker     s.Add_Char(')');
129*f6dc9357SAndroid Build Coastguard Worker     SetItemText(IDX_SYSTEM_INTEGRATE_TO_MENU_2, s);
130*f6dc9357SAndroid Build Coastguard Worker   }
131*f6dc9357SAndroid Build Coastguard Worker 
132*f6dc9357SAndroid Build Coastguard Worker   const FString prefix = NDLL::GetModuleDirPrefix();
133*f6dc9357SAndroid Build Coastguard Worker 
134*f6dc9357SAndroid Build Coastguard Worker   _dlls[0].ctrl = IDX_SYSTEM_INTEGRATE_TO_MENU;
135*f6dc9357SAndroid Build Coastguard Worker   _dlls[1].ctrl = IDX_SYSTEM_INTEGRATE_TO_MENU_2;
136*f6dc9357SAndroid Build Coastguard Worker 
137*f6dc9357SAndroid Build Coastguard Worker   _dlls[0].wow = 0;
138*f6dc9357SAndroid Build Coastguard Worker   _dlls[1].wow =
139*f6dc9357SAndroid Build Coastguard Worker       #ifdef _WIN64
140*f6dc9357SAndroid Build Coastguard Worker         KEY_WOW64_32KEY
141*f6dc9357SAndroid Build Coastguard Worker       #else
142*f6dc9357SAndroid Build Coastguard Worker         KEY_WOW64_64KEY
143*f6dc9357SAndroid Build Coastguard Worker       #endif
144*f6dc9357SAndroid Build Coastguard Worker       ;
145*f6dc9357SAndroid Build Coastguard Worker 
146*f6dc9357SAndroid Build Coastguard Worker   for (unsigned d = 0; d < 2; d++)
147*f6dc9357SAndroid Build Coastguard Worker   {
148*f6dc9357SAndroid Build Coastguard Worker     CShellDll &dll = _dlls[d];
149*f6dc9357SAndroid Build Coastguard Worker 
150*f6dc9357SAndroid Build Coastguard Worker     dll.wasChanged = false;
151*f6dc9357SAndroid Build Coastguard Worker 
152*f6dc9357SAndroid Build Coastguard Worker     #ifndef _WIN64
153*f6dc9357SAndroid Build Coastguard Worker     if (d != 0 && !g_Is_Wow64)
154*f6dc9357SAndroid Build Coastguard Worker     {
155*f6dc9357SAndroid Build Coastguard Worker       HideItem(dll.ctrl);
156*f6dc9357SAndroid Build Coastguard Worker       continue;
157*f6dc9357SAndroid Build Coastguard Worker     }
158*f6dc9357SAndroid Build Coastguard Worker     #endif
159*f6dc9357SAndroid Build Coastguard Worker 
160*f6dc9357SAndroid Build Coastguard Worker     FString &path = dll.Path;
161*f6dc9357SAndroid Build Coastguard Worker     path = prefix;
162*f6dc9357SAndroid Build Coastguard Worker     path += (d == 0 ? "7-zip.dll" :
163*f6dc9357SAndroid Build Coastguard Worker         #ifdef _WIN64
164*f6dc9357SAndroid Build Coastguard Worker           "7-zip32.dll"
165*f6dc9357SAndroid Build Coastguard Worker         #else
166*f6dc9357SAndroid Build Coastguard Worker           "7-zip64.dll"
167*f6dc9357SAndroid Build Coastguard Worker         #endif
168*f6dc9357SAndroid Build Coastguard Worker         );
169*f6dc9357SAndroid Build Coastguard Worker 
170*f6dc9357SAndroid Build Coastguard Worker 
171*f6dc9357SAndroid Build Coastguard Worker     if (!NFile::NFind::DoesFileExist_Raw(path))
172*f6dc9357SAndroid Build Coastguard Worker     {
173*f6dc9357SAndroid Build Coastguard Worker       path.Empty();
174*f6dc9357SAndroid Build Coastguard Worker       EnableItem(dll.ctrl, false);
175*f6dc9357SAndroid Build Coastguard Worker     }
176*f6dc9357SAndroid Build Coastguard Worker     else
177*f6dc9357SAndroid Build Coastguard Worker     {
178*f6dc9357SAndroid Build Coastguard Worker       dll.prevValue = CheckContextMenuHandler(fs2us(path), dll.wow);
179*f6dc9357SAndroid Build Coastguard Worker       CheckButton(dll.ctrl, dll.prevValue);
180*f6dc9357SAndroid Build Coastguard Worker     }
181*f6dc9357SAndroid Build Coastguard Worker   }
182*f6dc9357SAndroid Build Coastguard Worker 
183*f6dc9357SAndroid Build Coastguard Worker   #endif
184*f6dc9357SAndroid Build Coastguard Worker 
185*f6dc9357SAndroid Build Coastguard Worker 
186*f6dc9357SAndroid Build Coastguard Worker   CContextMenuInfo ci;
187*f6dc9357SAndroid Build Coastguard Worker   ci.Load();
188*f6dc9357SAndroid Build Coastguard Worker 
189*f6dc9357SAndroid Build Coastguard Worker   CheckButton(IDX_SYSTEM_CASCADED_MENU, ci.Cascaded.Val);
190*f6dc9357SAndroid Build Coastguard Worker   CheckButton(IDX_SYSTEM_ICON_IN_MENU, ci.MenuIcons.Val);
191*f6dc9357SAndroid Build Coastguard Worker   CheckButton(IDX_EXTRACT_ELIM_DUP, ci.ElimDup.Val);
192*f6dc9357SAndroid Build Coastguard Worker 
193*f6dc9357SAndroid Build Coastguard Worker   _listView.Attach(GetItem(IDL_SYSTEM_OPTIONS));
194*f6dc9357SAndroid Build Coastguard Worker   _zoneCombo.Attach(GetItem(IDC_SYSTEM_ZONE));
195*f6dc9357SAndroid Build Coastguard Worker 
196*f6dc9357SAndroid Build Coastguard Worker   {
197*f6dc9357SAndroid Build Coastguard Worker     unsigned wz = ci.WriteZone;
198*f6dc9357SAndroid Build Coastguard Worker     if (wz == (UInt32)(Int32)-1)
199*f6dc9357SAndroid Build Coastguard Worker       wz = 0;
200*f6dc9357SAndroid Build Coastguard Worker     for (unsigned i = 0; i <= 3; i++)
201*f6dc9357SAndroid Build Coastguard Worker     {
202*f6dc9357SAndroid Build Coastguard Worker       unsigned val = i;
203*f6dc9357SAndroid Build Coastguard Worker       UString s;
204*f6dc9357SAndroid Build Coastguard Worker       if (i == 3)
205*f6dc9357SAndroid Build Coastguard Worker       {
206*f6dc9357SAndroid Build Coastguard Worker         if (wz < 3)
207*f6dc9357SAndroid Build Coastguard Worker           break;
208*f6dc9357SAndroid Build Coastguard Worker         val = wz;
209*f6dc9357SAndroid Build Coastguard Worker       }
210*f6dc9357SAndroid Build Coastguard Worker       else
211*f6dc9357SAndroid Build Coastguard Worker       {
212*f6dc9357SAndroid Build Coastguard Worker         #define MY_IDYES  406
213*f6dc9357SAndroid Build Coastguard Worker         #define MY_IDNO   407
214*f6dc9357SAndroid Build Coastguard Worker         if (i == 0)
215*f6dc9357SAndroid Build Coastguard Worker           LoadLang_Spec(s, MY_IDNO, "No");
216*f6dc9357SAndroid Build Coastguard Worker         else if (i == 1)
217*f6dc9357SAndroid Build Coastguard Worker           LoadLang_Spec(s, MY_IDYES, "Yes");
218*f6dc9357SAndroid Build Coastguard Worker         else
219*f6dc9357SAndroid Build Coastguard Worker           LangString(IDT_ZONE_FOR_OFFICE, s);
220*f6dc9357SAndroid Build Coastguard Worker       }
221*f6dc9357SAndroid Build Coastguard Worker       if (s.IsEmpty())
222*f6dc9357SAndroid Build Coastguard Worker         s.Add_UInt32(val);
223*f6dc9357SAndroid Build Coastguard Worker       if (i == 0)
224*f6dc9357SAndroid Build Coastguard Worker         s.Insert(0, L"* ");
225*f6dc9357SAndroid Build Coastguard Worker       const int index = (int)_zoneCombo.AddString(s);
226*f6dc9357SAndroid Build Coastguard Worker       _zoneCombo.SetItemData(index, (LPARAM)val);
227*f6dc9357SAndroid Build Coastguard Worker       if (val == wz)
228*f6dc9357SAndroid Build Coastguard Worker         _zoneCombo.SetCurSel(index);
229*f6dc9357SAndroid Build Coastguard Worker     }
230*f6dc9357SAndroid Build Coastguard Worker   }
231*f6dc9357SAndroid Build Coastguard Worker 
232*f6dc9357SAndroid Build Coastguard Worker 
233*f6dc9357SAndroid Build Coastguard Worker   const UInt32 newFlags = LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT;
234*f6dc9357SAndroid Build Coastguard Worker   _listView.SetExtendedListViewStyle(newFlags, newFlags);
235*f6dc9357SAndroid Build Coastguard Worker 
236*f6dc9357SAndroid Build Coastguard Worker   _listView.InsertColumn(0, L"", 200);
237*f6dc9357SAndroid Build Coastguard Worker 
238*f6dc9357SAndroid Build Coastguard Worker   for (unsigned i = 0; i < Z7_ARRAY_SIZE(kMenuItems); i++)
239*f6dc9357SAndroid Build Coastguard Worker   {
240*f6dc9357SAndroid Build Coastguard Worker     const CContextMenuItem &menuItem = kMenuItems[i];
241*f6dc9357SAndroid Build Coastguard Worker 
242*f6dc9357SAndroid Build Coastguard Worker     UString s = LangString(menuItem.ControlID);
243*f6dc9357SAndroid Build Coastguard Worker     if (menuItem.Flag == kCRC)
244*f6dc9357SAndroid Build Coastguard Worker       s = "CRC SHA";
245*f6dc9357SAndroid Build Coastguard Worker     else if (menuItem.Flag == kCRC_Cascaded)
246*f6dc9357SAndroid Build Coastguard Worker       s = "7-Zip > CRC SHA";
247*f6dc9357SAndroid Build Coastguard Worker     if (menuItem.Flag == kOpenAs
248*f6dc9357SAndroid Build Coastguard Worker         || menuItem.Flag == kCRC
249*f6dc9357SAndroid Build Coastguard Worker         || menuItem.Flag == kCRC_Cascaded)
250*f6dc9357SAndroid Build Coastguard Worker       s += " >";
251*f6dc9357SAndroid Build Coastguard Worker 
252*f6dc9357SAndroid Build Coastguard Worker     switch (menuItem.ControlID)
253*f6dc9357SAndroid Build Coastguard Worker     {
254*f6dc9357SAndroid Build Coastguard Worker       case IDS_CONTEXT_EXTRACT_TO:
255*f6dc9357SAndroid Build Coastguard Worker       {
256*f6dc9357SAndroid Build Coastguard Worker         s = MyFormatNew(s, LangString(IDS_CONTEXT_FOLDER));
257*f6dc9357SAndroid Build Coastguard Worker         break;
258*f6dc9357SAndroid Build Coastguard Worker       }
259*f6dc9357SAndroid Build Coastguard Worker       case IDS_CONTEXT_COMPRESS_TO:
260*f6dc9357SAndroid Build Coastguard Worker       case IDS_CONTEXT_COMPRESS_TO_EMAIL:
261*f6dc9357SAndroid Build Coastguard Worker       {
262*f6dc9357SAndroid Build Coastguard Worker         UString s2 = LangString(IDS_CONTEXT_ARCHIVE);
263*f6dc9357SAndroid Build Coastguard Worker         switch (menuItem.Flag)
264*f6dc9357SAndroid Build Coastguard Worker         {
265*f6dc9357SAndroid Build Coastguard Worker           case kCompressTo7z:
266*f6dc9357SAndroid Build Coastguard Worker           case kCompressTo7zEmail:
267*f6dc9357SAndroid Build Coastguard Worker             s2 += (".7z");
268*f6dc9357SAndroid Build Coastguard Worker             break;
269*f6dc9357SAndroid Build Coastguard Worker           case kCompressToZip:
270*f6dc9357SAndroid Build Coastguard Worker           case kCompressToZipEmail:
271*f6dc9357SAndroid Build Coastguard Worker             s2 += (".zip");
272*f6dc9357SAndroid Build Coastguard Worker             break;
273*f6dc9357SAndroid Build Coastguard Worker         }
274*f6dc9357SAndroid Build Coastguard Worker         s = MyFormatNew(s, s2);
275*f6dc9357SAndroid Build Coastguard Worker         break;
276*f6dc9357SAndroid Build Coastguard Worker       }
277*f6dc9357SAndroid Build Coastguard Worker     }
278*f6dc9357SAndroid Build Coastguard Worker 
279*f6dc9357SAndroid Build Coastguard Worker     const int itemIndex = _listView.InsertItem(i, s);
280*f6dc9357SAndroid Build Coastguard Worker     _listView.SetCheckState((unsigned)itemIndex, ((ci.Flags & menuItem.Flag) != 0));
281*f6dc9357SAndroid Build Coastguard Worker   }
282*f6dc9357SAndroid Build Coastguard Worker 
283*f6dc9357SAndroid Build Coastguard Worker   _listView.SetColumnWidthAuto(0);
284*f6dc9357SAndroid Build Coastguard Worker   _initMode = false;
285*f6dc9357SAndroid Build Coastguard Worker 
286*f6dc9357SAndroid Build Coastguard Worker   return CPropertyPage::OnInit();
287*f6dc9357SAndroid Build Coastguard Worker }
288*f6dc9357SAndroid Build Coastguard Worker 
289*f6dc9357SAndroid Build Coastguard Worker 
290*f6dc9357SAndroid Build Coastguard Worker #ifndef UNDER_CE
291*f6dc9357SAndroid Build Coastguard Worker 
ShowMenuErrorMessage(const wchar_t * m,HWND hwnd)292*f6dc9357SAndroid Build Coastguard Worker static void ShowMenuErrorMessage(const wchar_t *m, HWND hwnd)
293*f6dc9357SAndroid Build Coastguard Worker {
294*f6dc9357SAndroid Build Coastguard Worker   MessageBoxW(hwnd, m, L"7-Zip", MB_ICONERROR);
295*f6dc9357SAndroid Build Coastguard Worker }
296*f6dc9357SAndroid Build Coastguard Worker 
297*f6dc9357SAndroid Build Coastguard Worker #endif
298*f6dc9357SAndroid Build Coastguard Worker 
299*f6dc9357SAndroid Build Coastguard Worker 
OnApply()300*f6dc9357SAndroid Build Coastguard Worker LONG CMenuPage::OnApply()
301*f6dc9357SAndroid Build Coastguard Worker {
302*f6dc9357SAndroid Build Coastguard Worker   #ifndef UNDER_CE
303*f6dc9357SAndroid Build Coastguard Worker 
304*f6dc9357SAndroid Build Coastguard Worker   for (unsigned d = 2; d != 0;)
305*f6dc9357SAndroid Build Coastguard Worker   {
306*f6dc9357SAndroid Build Coastguard Worker     d--;
307*f6dc9357SAndroid Build Coastguard Worker     CShellDll &dll = _dlls[d];
308*f6dc9357SAndroid Build Coastguard Worker     if (dll.wasChanged && !dll.Path.IsEmpty())
309*f6dc9357SAndroid Build Coastguard Worker     {
310*f6dc9357SAndroid Build Coastguard Worker       const bool newVal = IsButtonCheckedBool(dll.ctrl);
311*f6dc9357SAndroid Build Coastguard Worker       const LONG res = SetContextMenuHandler(newVal, fs2us(dll.Path), dll.wow);
312*f6dc9357SAndroid Build Coastguard Worker       if (res != ERROR_SUCCESS && (dll.prevValue != newVal || newVal))
313*f6dc9357SAndroid Build Coastguard Worker         ShowMenuErrorMessage(NError::MyFormatMessage(res), *this);
314*f6dc9357SAndroid Build Coastguard Worker       dll.prevValue = CheckContextMenuHandler(fs2us(dll.Path), dll.wow);
315*f6dc9357SAndroid Build Coastguard Worker       CheckButton(dll.ctrl, dll.prevValue);
316*f6dc9357SAndroid Build Coastguard Worker       dll.wasChanged = false;
317*f6dc9357SAndroid Build Coastguard Worker     }
318*f6dc9357SAndroid Build Coastguard Worker   }
319*f6dc9357SAndroid Build Coastguard Worker 
320*f6dc9357SAndroid Build Coastguard Worker   #endif
321*f6dc9357SAndroid Build Coastguard Worker 
322*f6dc9357SAndroid Build Coastguard Worker   if (_cascaded_Changed
323*f6dc9357SAndroid Build Coastguard Worker       || _menuIcons_Changed
324*f6dc9357SAndroid Build Coastguard Worker       || _elimDup_Changed
325*f6dc9357SAndroid Build Coastguard Worker       || _writeZone_Changed
326*f6dc9357SAndroid Build Coastguard Worker       || _flags_Changed)
327*f6dc9357SAndroid Build Coastguard Worker   {
328*f6dc9357SAndroid Build Coastguard Worker     CContextMenuInfo ci;
329*f6dc9357SAndroid Build Coastguard Worker     ci.Cascaded.Val = IsButtonCheckedBool(IDX_SYSTEM_CASCADED_MENU);
330*f6dc9357SAndroid Build Coastguard Worker     ci.Cascaded.Def = _cascaded_Changed;
331*f6dc9357SAndroid Build Coastguard Worker 
332*f6dc9357SAndroid Build Coastguard Worker     ci.MenuIcons.Val = IsButtonCheckedBool(IDX_SYSTEM_ICON_IN_MENU);
333*f6dc9357SAndroid Build Coastguard Worker     ci.MenuIcons.Def = _menuIcons_Changed;
334*f6dc9357SAndroid Build Coastguard Worker 
335*f6dc9357SAndroid Build Coastguard Worker     ci.ElimDup.Val = IsButtonCheckedBool(IDX_EXTRACT_ELIM_DUP);
336*f6dc9357SAndroid Build Coastguard Worker     ci.ElimDup.Def = _elimDup_Changed;
337*f6dc9357SAndroid Build Coastguard Worker 
338*f6dc9357SAndroid Build Coastguard Worker     {
339*f6dc9357SAndroid Build Coastguard Worker       int zoneIndex = (int)_zoneCombo.GetItemData_of_CurSel();
340*f6dc9357SAndroid Build Coastguard Worker       if (zoneIndex <= 0)
341*f6dc9357SAndroid Build Coastguard Worker         zoneIndex = -1;
342*f6dc9357SAndroid Build Coastguard Worker       ci.WriteZone = (UInt32)(Int32)zoneIndex;
343*f6dc9357SAndroid Build Coastguard Worker     }
344*f6dc9357SAndroid Build Coastguard Worker 
345*f6dc9357SAndroid Build Coastguard Worker     ci.Flags = 0;
346*f6dc9357SAndroid Build Coastguard Worker 
347*f6dc9357SAndroid Build Coastguard Worker     for (unsigned i = 0; i < Z7_ARRAY_SIZE(kMenuItems); i++)
348*f6dc9357SAndroid Build Coastguard Worker       if (_listView.GetCheckState(i))
349*f6dc9357SAndroid Build Coastguard Worker         ci.Flags |= kMenuItems[i].Flag;
350*f6dc9357SAndroid Build Coastguard Worker 
351*f6dc9357SAndroid Build Coastguard Worker     ci.Flags_Def = _flags_Changed;
352*f6dc9357SAndroid Build Coastguard Worker     ci.Save();
353*f6dc9357SAndroid Build Coastguard Worker 
354*f6dc9357SAndroid Build Coastguard Worker     Clear_MenuChanged();
355*f6dc9357SAndroid Build Coastguard Worker   }
356*f6dc9357SAndroid Build Coastguard Worker 
357*f6dc9357SAndroid Build Coastguard Worker   // UnChanged();
358*f6dc9357SAndroid Build Coastguard Worker 
359*f6dc9357SAndroid Build Coastguard Worker   return PSNRET_NOERROR;
360*f6dc9357SAndroid Build Coastguard Worker }
361*f6dc9357SAndroid Build Coastguard Worker 
OnNotifyHelp()362*f6dc9357SAndroid Build Coastguard Worker void CMenuPage::OnNotifyHelp()
363*f6dc9357SAndroid Build Coastguard Worker {
364*f6dc9357SAndroid Build Coastguard Worker   ShowHelpWindow(kMenuTopic);
365*f6dc9357SAndroid Build Coastguard Worker }
366*f6dc9357SAndroid Build Coastguard Worker 
OnButtonClicked(unsigned buttonID,HWND buttonHWND)367*f6dc9357SAndroid Build Coastguard Worker bool CMenuPage::OnButtonClicked(unsigned buttonID, HWND buttonHWND)
368*f6dc9357SAndroid Build Coastguard Worker {
369*f6dc9357SAndroid Build Coastguard Worker   switch (buttonID)
370*f6dc9357SAndroid Build Coastguard Worker   {
371*f6dc9357SAndroid Build Coastguard Worker     #ifndef UNDER_CE
372*f6dc9357SAndroid Build Coastguard Worker     case IDX_SYSTEM_INTEGRATE_TO_MENU:
373*f6dc9357SAndroid Build Coastguard Worker     case IDX_SYSTEM_INTEGRATE_TO_MENU_2:
374*f6dc9357SAndroid Build Coastguard Worker     {
375*f6dc9357SAndroid Build Coastguard Worker       for (unsigned d = 0; d < 2; d++)
376*f6dc9357SAndroid Build Coastguard Worker       {
377*f6dc9357SAndroid Build Coastguard Worker         CShellDll &dll = _dlls[d];
378*f6dc9357SAndroid Build Coastguard Worker         if (buttonID == dll.ctrl && !dll.Path.IsEmpty())
379*f6dc9357SAndroid Build Coastguard Worker           dll.wasChanged = true;
380*f6dc9357SAndroid Build Coastguard Worker       }
381*f6dc9357SAndroid Build Coastguard Worker       break;
382*f6dc9357SAndroid Build Coastguard Worker     }
383*f6dc9357SAndroid Build Coastguard Worker     #endif
384*f6dc9357SAndroid Build Coastguard Worker 
385*f6dc9357SAndroid Build Coastguard Worker     case IDX_SYSTEM_CASCADED_MENU: _cascaded_Changed = true; break;
386*f6dc9357SAndroid Build Coastguard Worker     case IDX_SYSTEM_ICON_IN_MENU: _menuIcons_Changed = true; break;
387*f6dc9357SAndroid Build Coastguard Worker     case IDX_EXTRACT_ELIM_DUP: _elimDup_Changed = true; break;
388*f6dc9357SAndroid Build Coastguard Worker     // case IDX_EXTRACT_WRITE_ZONE: _writeZone_Changed = true; break;
389*f6dc9357SAndroid Build Coastguard Worker 
390*f6dc9357SAndroid Build Coastguard Worker     default:
391*f6dc9357SAndroid Build Coastguard Worker       return CPropertyPage::OnButtonClicked(buttonID, buttonHWND);
392*f6dc9357SAndroid Build Coastguard Worker   }
393*f6dc9357SAndroid Build Coastguard Worker 
394*f6dc9357SAndroid Build Coastguard Worker   Changed();
395*f6dc9357SAndroid Build Coastguard Worker   return true;
396*f6dc9357SAndroid Build Coastguard Worker }
397*f6dc9357SAndroid Build Coastguard Worker 
398*f6dc9357SAndroid Build Coastguard Worker 
OnCommand(unsigned code,unsigned itemID,LPARAM param)399*f6dc9357SAndroid Build Coastguard Worker bool CMenuPage::OnCommand(unsigned code, unsigned itemID, LPARAM param)
400*f6dc9357SAndroid Build Coastguard Worker {
401*f6dc9357SAndroid Build Coastguard Worker   if (code == CBN_SELCHANGE && itemID == IDC_SYSTEM_ZONE)
402*f6dc9357SAndroid Build Coastguard Worker   {
403*f6dc9357SAndroid Build Coastguard Worker     _writeZone_Changed = true;
404*f6dc9357SAndroid Build Coastguard Worker     Changed();
405*f6dc9357SAndroid Build Coastguard Worker     return true;
406*f6dc9357SAndroid Build Coastguard Worker   }
407*f6dc9357SAndroid Build Coastguard Worker   return CPropertyPage::OnCommand(code, itemID, param);
408*f6dc9357SAndroid Build Coastguard Worker }
409*f6dc9357SAndroid Build Coastguard Worker 
410*f6dc9357SAndroid Build Coastguard Worker 
OnNotify(UINT controlID,LPNMHDR lParam)411*f6dc9357SAndroid Build Coastguard Worker bool CMenuPage::OnNotify(UINT controlID, LPNMHDR lParam)
412*f6dc9357SAndroid Build Coastguard Worker {
413*f6dc9357SAndroid Build Coastguard Worker   if (lParam->hwndFrom == HWND(_listView))
414*f6dc9357SAndroid Build Coastguard Worker   {
415*f6dc9357SAndroid Build Coastguard Worker     switch (lParam->code)
416*f6dc9357SAndroid Build Coastguard Worker     {
417*f6dc9357SAndroid Build Coastguard Worker       case (LVN_ITEMCHANGED):
418*f6dc9357SAndroid Build Coastguard Worker         return OnItemChanged((const NMLISTVIEW *)lParam);
419*f6dc9357SAndroid Build Coastguard Worker     }
420*f6dc9357SAndroid Build Coastguard Worker   }
421*f6dc9357SAndroid Build Coastguard Worker   return CPropertyPage::OnNotify(controlID, lParam);
422*f6dc9357SAndroid Build Coastguard Worker }
423*f6dc9357SAndroid Build Coastguard Worker 
424*f6dc9357SAndroid Build Coastguard Worker 
OnItemChanged(const NMLISTVIEW * info)425*f6dc9357SAndroid Build Coastguard Worker bool CMenuPage::OnItemChanged(const NMLISTVIEW *info)
426*f6dc9357SAndroid Build Coastguard Worker {
427*f6dc9357SAndroid Build Coastguard Worker   if (_initMode)
428*f6dc9357SAndroid Build Coastguard Worker     return true;
429*f6dc9357SAndroid Build Coastguard Worker   if ((info->uChanged & LVIF_STATE) != 0)
430*f6dc9357SAndroid Build Coastguard Worker   {
431*f6dc9357SAndroid Build Coastguard Worker     UINT oldState = info->uOldState & LVIS_STATEIMAGEMASK;
432*f6dc9357SAndroid Build Coastguard Worker     UINT newState = info->uNewState & LVIS_STATEIMAGEMASK;
433*f6dc9357SAndroid Build Coastguard Worker     if (oldState != newState)
434*f6dc9357SAndroid Build Coastguard Worker     {
435*f6dc9357SAndroid Build Coastguard Worker       _flags_Changed = true;
436*f6dc9357SAndroid Build Coastguard Worker       Changed();
437*f6dc9357SAndroid Build Coastguard Worker     }
438*f6dc9357SAndroid Build Coastguard Worker   }
439*f6dc9357SAndroid Build Coastguard Worker   return true;
440*f6dc9357SAndroid Build Coastguard Worker }
441