xref: /aosp_15_r20/external/lzma/CPP/7zip/UI/FileManager/SystemPage.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // SystemPage.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/MyWindows.h"
6*f6dc9357SAndroid Build Coastguard Worker 
7*f6dc9357SAndroid Build Coastguard Worker #if defined(__MINGW32__) || defined(__MINGW64__)
8*f6dc9357SAndroid Build Coastguard Worker #include <shlobj.h>
9*f6dc9357SAndroid Build Coastguard Worker #else
10*f6dc9357SAndroid Build Coastguard Worker #include <ShlObj.h>
11*f6dc9357SAndroid Build Coastguard Worker #endif
12*f6dc9357SAndroid Build Coastguard Worker 
13*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/Defs.h"
14*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/StringConvert.h"
15*f6dc9357SAndroid Build Coastguard Worker 
16*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/DLL.h"
17*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/ErrorMsg.h"
18*f6dc9357SAndroid Build Coastguard Worker 
19*f6dc9357SAndroid Build Coastguard Worker #include "HelpUtils.h"
20*f6dc9357SAndroid Build Coastguard Worker #include "IFolder.h"
21*f6dc9357SAndroid Build Coastguard Worker #include "LangUtils.h"
22*f6dc9357SAndroid Build Coastguard Worker #include "PropertyNameRes.h"
23*f6dc9357SAndroid Build Coastguard Worker #include "SystemPage.h"
24*f6dc9357SAndroid Build Coastguard Worker #include "SystemPageRes.h"
25*f6dc9357SAndroid Build Coastguard Worker 
26*f6dc9357SAndroid Build Coastguard Worker using namespace NWindows;
27*f6dc9357SAndroid Build Coastguard Worker 
28*f6dc9357SAndroid Build Coastguard Worker #ifndef _UNICODE
29*f6dc9357SAndroid Build Coastguard Worker extern bool g_IsNT;
30*f6dc9357SAndroid Build Coastguard Worker #endif
31*f6dc9357SAndroid Build Coastguard Worker 
32*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_LANG
33*f6dc9357SAndroid Build Coastguard Worker static const UInt32 kLangIDs[] =
34*f6dc9357SAndroid Build Coastguard Worker {
35*f6dc9357SAndroid Build Coastguard Worker   IDT_SYSTEM_ASSOCIATE
36*f6dc9357SAndroid Build Coastguard Worker };
37*f6dc9357SAndroid Build Coastguard Worker #endif
38*f6dc9357SAndroid Build Coastguard Worker 
39*f6dc9357SAndroid Build Coastguard Worker #define kSystemTopic "FM/options.htm#system"
40*f6dc9357SAndroid Build Coastguard Worker 
GetString() const41*f6dc9357SAndroid Build Coastguard Worker CSysString CModifiedExtInfo::GetString() const
42*f6dc9357SAndroid Build Coastguard Worker {
43*f6dc9357SAndroid Build Coastguard Worker   const char *s;
44*f6dc9357SAndroid Build Coastguard Worker   if (State == kExtState_7Zip)
45*f6dc9357SAndroid Build Coastguard Worker     s = "7-Zip";
46*f6dc9357SAndroid Build Coastguard Worker   else if (State == kExtState_Clear)
47*f6dc9357SAndroid Build Coastguard Worker     s = "";
48*f6dc9357SAndroid Build Coastguard Worker   else if (Other7Zip)
49*f6dc9357SAndroid Build Coastguard Worker     s = "[7-Zip]";
50*f6dc9357SAndroid Build Coastguard Worker   else
51*f6dc9357SAndroid Build Coastguard Worker     return ProgramKey;
52*f6dc9357SAndroid Build Coastguard Worker   return CSysString (s);
53*f6dc9357SAndroid Build Coastguard Worker }
54*f6dc9357SAndroid Build Coastguard Worker 
55*f6dc9357SAndroid Build Coastguard Worker 
AddIcon(const UString & iconPath,int iconIndex)56*f6dc9357SAndroid Build Coastguard Worker int CSystemPage::AddIcon(const UString &iconPath, int iconIndex)
57*f6dc9357SAndroid Build Coastguard Worker {
58*f6dc9357SAndroid Build Coastguard Worker   if (iconPath.IsEmpty())
59*f6dc9357SAndroid Build Coastguard Worker     return -1;
60*f6dc9357SAndroid Build Coastguard Worker   if (iconIndex == -1)
61*f6dc9357SAndroid Build Coastguard Worker     iconIndex = 0;
62*f6dc9357SAndroid Build Coastguard Worker 
63*f6dc9357SAndroid Build Coastguard Worker   HICON hicon;
64*f6dc9357SAndroid Build Coastguard Worker 
65*f6dc9357SAndroid Build Coastguard Worker   #ifdef UNDER_CE
66*f6dc9357SAndroid Build Coastguard Worker   ExtractIconExW(iconPath, iconIndex, NULL, &hicon, 1);
67*f6dc9357SAndroid Build Coastguard Worker   if (!hicon)
68*f6dc9357SAndroid Build Coastguard Worker   #else
69*f6dc9357SAndroid Build Coastguard Worker   // we expand path from REG_EXPAND_SZ registry item.
70*f6dc9357SAndroid Build Coastguard Worker   UString path;
71*f6dc9357SAndroid Build Coastguard Worker   const DWORD size = MAX_PATH + 10;
72*f6dc9357SAndroid Build Coastguard Worker   const DWORD needLen = ::ExpandEnvironmentStringsW(iconPath, path.GetBuf(size + 2), size);
73*f6dc9357SAndroid Build Coastguard Worker   path.ReleaseBuf_CalcLen(size);
74*f6dc9357SAndroid Build Coastguard Worker   if (needLen == 0 || needLen >= size)
75*f6dc9357SAndroid Build Coastguard Worker     path = iconPath;
76*f6dc9357SAndroid Build Coastguard Worker   const UINT num = ExtractIconExW(path, iconIndex, NULL, &hicon, 1);
77*f6dc9357SAndroid Build Coastguard Worker   if (num != 1 || !hicon)
78*f6dc9357SAndroid Build Coastguard Worker   #endif
79*f6dc9357SAndroid Build Coastguard Worker     return -1;
80*f6dc9357SAndroid Build Coastguard Worker 
81*f6dc9357SAndroid Build Coastguard Worker   _imageList.AddIcon(hicon);
82*f6dc9357SAndroid Build Coastguard Worker   DestroyIcon(hicon);
83*f6dc9357SAndroid Build Coastguard Worker   return (int)(_numIcons++);
84*f6dc9357SAndroid Build Coastguard Worker }
85*f6dc9357SAndroid Build Coastguard Worker 
86*f6dc9357SAndroid Build Coastguard Worker 
RefreshListItem(unsigned group,unsigned listIndex)87*f6dc9357SAndroid Build Coastguard Worker void CSystemPage::RefreshListItem(unsigned group, unsigned listIndex)
88*f6dc9357SAndroid Build Coastguard Worker {
89*f6dc9357SAndroid Build Coastguard Worker   const CAssoc &assoc = _items[GetRealIndex(listIndex)];
90*f6dc9357SAndroid Build Coastguard Worker   _listView.SetSubItem(listIndex, group + 1, assoc.Pair[group].GetString());
91*f6dc9357SAndroid Build Coastguard Worker   LVITEMW newItem;
92*f6dc9357SAndroid Build Coastguard Worker   memset(&newItem, 0, sizeof(newItem));
93*f6dc9357SAndroid Build Coastguard Worker   newItem.iItem = (int)listIndex;
94*f6dc9357SAndroid Build Coastguard Worker   newItem.mask = LVIF_IMAGE;
95*f6dc9357SAndroid Build Coastguard Worker   newItem.iImage = assoc.GetIconIndex();
96*f6dc9357SAndroid Build Coastguard Worker   _listView.SetItem(&newItem);
97*f6dc9357SAndroid Build Coastguard Worker }
98*f6dc9357SAndroid Build Coastguard Worker 
99*f6dc9357SAndroid Build Coastguard Worker 
ChangeState(unsigned group,const CUIntVector & indices)100*f6dc9357SAndroid Build Coastguard Worker void CSystemPage::ChangeState(unsigned group, const CUIntVector &indices)
101*f6dc9357SAndroid Build Coastguard Worker {
102*f6dc9357SAndroid Build Coastguard Worker   if (indices.IsEmpty())
103*f6dc9357SAndroid Build Coastguard Worker     return;
104*f6dc9357SAndroid Build Coastguard Worker 
105*f6dc9357SAndroid Build Coastguard Worker   bool thereAreClearItems = false;
106*f6dc9357SAndroid Build Coastguard Worker   unsigned counters[3] = { 0, 0, 0 };
107*f6dc9357SAndroid Build Coastguard Worker 
108*f6dc9357SAndroid Build Coastguard Worker   unsigned i;
109*f6dc9357SAndroid Build Coastguard Worker   for (i = 0; i < indices.Size(); i++)
110*f6dc9357SAndroid Build Coastguard Worker   {
111*f6dc9357SAndroid Build Coastguard Worker     const CModifiedExtInfo &mi = _items[GetRealIndex(indices[i])].Pair[group];
112*f6dc9357SAndroid Build Coastguard Worker     int state = kExtState_7Zip;
113*f6dc9357SAndroid Build Coastguard Worker     if (mi.State == kExtState_7Zip)
114*f6dc9357SAndroid Build Coastguard Worker       state = kExtState_Clear;
115*f6dc9357SAndroid Build Coastguard Worker     else if (mi.State == kExtState_Clear)
116*f6dc9357SAndroid Build Coastguard Worker     {
117*f6dc9357SAndroid Build Coastguard Worker       thereAreClearItems = true;
118*f6dc9357SAndroid Build Coastguard Worker       if (mi.Other)
119*f6dc9357SAndroid Build Coastguard Worker         state = kExtState_Other;
120*f6dc9357SAndroid Build Coastguard Worker     }
121*f6dc9357SAndroid Build Coastguard Worker     counters[state]++;
122*f6dc9357SAndroid Build Coastguard Worker   }
123*f6dc9357SAndroid Build Coastguard Worker 
124*f6dc9357SAndroid Build Coastguard Worker   int state = kExtState_Clear;
125*f6dc9357SAndroid Build Coastguard Worker   if (counters[kExtState_Other] != 0)
126*f6dc9357SAndroid Build Coastguard Worker     state = kExtState_Other;
127*f6dc9357SAndroid Build Coastguard Worker   else if (counters[kExtState_7Zip] != 0)
128*f6dc9357SAndroid Build Coastguard Worker     state = kExtState_7Zip;
129*f6dc9357SAndroid Build Coastguard Worker 
130*f6dc9357SAndroid Build Coastguard Worker   for (i = 0; i < indices.Size(); i++)
131*f6dc9357SAndroid Build Coastguard Worker   {
132*f6dc9357SAndroid Build Coastguard Worker     unsigned listIndex = indices[i];
133*f6dc9357SAndroid Build Coastguard Worker     CAssoc &assoc = _items[GetRealIndex(listIndex)];
134*f6dc9357SAndroid Build Coastguard Worker     CModifiedExtInfo &mi = assoc.Pair[group];
135*f6dc9357SAndroid Build Coastguard Worker     bool change = false;
136*f6dc9357SAndroid Build Coastguard Worker 
137*f6dc9357SAndroid Build Coastguard Worker     switch (state)
138*f6dc9357SAndroid Build Coastguard Worker     {
139*f6dc9357SAndroid Build Coastguard Worker       case kExtState_Clear: change = true; break;
140*f6dc9357SAndroid Build Coastguard Worker       case kExtState_Other: change = mi.Other; break;
141*f6dc9357SAndroid Build Coastguard Worker       default: change = !(mi.Other && thereAreClearItems); break;
142*f6dc9357SAndroid Build Coastguard Worker     }
143*f6dc9357SAndroid Build Coastguard Worker 
144*f6dc9357SAndroid Build Coastguard Worker     if (change)
145*f6dc9357SAndroid Build Coastguard Worker     {
146*f6dc9357SAndroid Build Coastguard Worker       mi.State = state;
147*f6dc9357SAndroid Build Coastguard Worker       RefreshListItem(group, listIndex);
148*f6dc9357SAndroid Build Coastguard Worker     }
149*f6dc9357SAndroid Build Coastguard Worker   }
150*f6dc9357SAndroid Build Coastguard Worker 
151*f6dc9357SAndroid Build Coastguard Worker   _needSave = true;
152*f6dc9357SAndroid Build Coastguard Worker   Changed();
153*f6dc9357SAndroid Build Coastguard Worker }
154*f6dc9357SAndroid Build Coastguard Worker 
155*f6dc9357SAndroid Build Coastguard Worker 
OnInit()156*f6dc9357SAndroid Build Coastguard Worker bool CSystemPage::OnInit()
157*f6dc9357SAndroid Build Coastguard Worker {
158*f6dc9357SAndroid Build Coastguard Worker   _needSave = false;
159*f6dc9357SAndroid Build Coastguard Worker 
160*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_LANG
161*f6dc9357SAndroid Build Coastguard Worker   LangSetDlgItems(*this, kLangIDs, Z7_ARRAY_SIZE(kLangIDs));
162*f6dc9357SAndroid Build Coastguard Worker #endif
163*f6dc9357SAndroid Build Coastguard Worker 
164*f6dc9357SAndroid Build Coastguard Worker   _listView.Attach(GetItem(IDL_SYSTEM_ASSOCIATE));
165*f6dc9357SAndroid Build Coastguard Worker   _listView.SetUnicodeFormat();
166*f6dc9357SAndroid Build Coastguard Worker   DWORD newFlags = LVS_EX_FULLROWSELECT;
167*f6dc9357SAndroid Build Coastguard Worker   _listView.SetExtendedListViewStyle(newFlags, newFlags);
168*f6dc9357SAndroid Build Coastguard Worker 
169*f6dc9357SAndroid Build Coastguard Worker   _numIcons = 0;
170*f6dc9357SAndroid Build Coastguard Worker   _imageList.Create(16, 16, ILC_MASK | ILC_COLOR32, 0, 0);
171*f6dc9357SAndroid Build Coastguard Worker 
172*f6dc9357SAndroid Build Coastguard Worker   _listView.SetImageList(_imageList, LVSIL_SMALL);
173*f6dc9357SAndroid Build Coastguard Worker 
174*f6dc9357SAndroid Build Coastguard Worker   _listView.InsertColumn(0, LangString(IDS_PROP_FILE_TYPE), 80);
175*f6dc9357SAndroid Build Coastguard Worker 
176*f6dc9357SAndroid Build Coastguard Worker   UString s;
177*f6dc9357SAndroid Build Coastguard Worker 
178*f6dc9357SAndroid Build Coastguard Worker   #if NUM_EXT_GROUPS == 1
179*f6dc9357SAndroid Build Coastguard Worker     s = "Program";
180*f6dc9357SAndroid Build Coastguard Worker   #else
181*f6dc9357SAndroid Build Coastguard Worker     #ifndef UNDER_CE
182*f6dc9357SAndroid Build Coastguard Worker       const unsigned kSize = 256;
183*f6dc9357SAndroid Build Coastguard Worker       BOOL res;
184*f6dc9357SAndroid Build Coastguard Worker 
185*f6dc9357SAndroid Build Coastguard Worker       DWORD size = kSize;
186*f6dc9357SAndroid Build Coastguard Worker 
187*f6dc9357SAndroid Build Coastguard Worker       #ifndef _UNICODE
188*f6dc9357SAndroid Build Coastguard Worker       if (!g_IsNT)
189*f6dc9357SAndroid Build Coastguard Worker       {
190*f6dc9357SAndroid Build Coastguard Worker         AString s2;
191*f6dc9357SAndroid Build Coastguard Worker         res = GetUserNameA(s2.GetBuf(size), &size);
192*f6dc9357SAndroid Build Coastguard Worker         s2.ReleaseBuf_CalcLen(MyMin((unsigned)size, kSize));
193*f6dc9357SAndroid Build Coastguard Worker         s = GetUnicodeString(s2);
194*f6dc9357SAndroid Build Coastguard Worker       }
195*f6dc9357SAndroid Build Coastguard Worker       else
196*f6dc9357SAndroid Build Coastguard Worker       #endif
197*f6dc9357SAndroid Build Coastguard Worker       {
198*f6dc9357SAndroid Build Coastguard Worker         res = GetUserNameW(s.GetBuf(size), &size);
199*f6dc9357SAndroid Build Coastguard Worker         s.ReleaseBuf_CalcLen(MyMin((unsigned)size, kSize));
200*f6dc9357SAndroid Build Coastguard Worker       }
201*f6dc9357SAndroid Build Coastguard Worker 
202*f6dc9357SAndroid Build Coastguard Worker       if (!res)
203*f6dc9357SAndroid Build Coastguard Worker     #endif
204*f6dc9357SAndroid Build Coastguard Worker         s = "Current User";
205*f6dc9357SAndroid Build Coastguard Worker   #endif
206*f6dc9357SAndroid Build Coastguard Worker 
207*f6dc9357SAndroid Build Coastguard Worker   LV_COLUMNW ci;
208*f6dc9357SAndroid Build Coastguard Worker   ci.mask = LVCF_TEXT | LVCF_FMT | LVCF_WIDTH | LVCF_SUBITEM;
209*f6dc9357SAndroid Build Coastguard Worker   ci.cx = 152;
210*f6dc9357SAndroid Build Coastguard Worker   ci.fmt = LVCFMT_CENTER;
211*f6dc9357SAndroid Build Coastguard Worker   ci.pszText = s.Ptr_non_const();
212*f6dc9357SAndroid Build Coastguard Worker   ci.iSubItem = 1;
213*f6dc9357SAndroid Build Coastguard Worker   _listView.InsertColumn(1, &ci);
214*f6dc9357SAndroid Build Coastguard Worker 
215*f6dc9357SAndroid Build Coastguard Worker   #if NUM_EXT_GROUPS > 1
216*f6dc9357SAndroid Build Coastguard Worker   {
217*f6dc9357SAndroid Build Coastguard Worker     LangString(IDS_SYSTEM_ALL_USERS, s);
218*f6dc9357SAndroid Build Coastguard Worker     ci.pszText = s.Ptr_non_const();
219*f6dc9357SAndroid Build Coastguard Worker     ci.iSubItem = 2;
220*f6dc9357SAndroid Build Coastguard Worker     _listView.InsertColumn(2, &ci);
221*f6dc9357SAndroid Build Coastguard Worker   }
222*f6dc9357SAndroid Build Coastguard Worker   #endif
223*f6dc9357SAndroid Build Coastguard Worker 
224*f6dc9357SAndroid Build Coastguard Worker   _extDB.Read();
225*f6dc9357SAndroid Build Coastguard Worker   _items.Clear();
226*f6dc9357SAndroid Build Coastguard Worker 
227*f6dc9357SAndroid Build Coastguard Worker   FOR_VECTOR (i, _extDB.Exts)
228*f6dc9357SAndroid Build Coastguard Worker   {
229*f6dc9357SAndroid Build Coastguard Worker     const CExtPlugins &extInfo = _extDB.Exts[i];
230*f6dc9357SAndroid Build Coastguard Worker 
231*f6dc9357SAndroid Build Coastguard Worker     LVITEMW item;
232*f6dc9357SAndroid Build Coastguard Worker     item.iItem = (int)i;
233*f6dc9357SAndroid Build Coastguard Worker     item.mask = LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE;
234*f6dc9357SAndroid Build Coastguard Worker     item.lParam = (LPARAM)i;
235*f6dc9357SAndroid Build Coastguard Worker     item.iSubItem = 0;
236*f6dc9357SAndroid Build Coastguard Worker     // ListView always uses internal iImage that is 0 by default?
237*f6dc9357SAndroid Build Coastguard Worker     // so we always use LVIF_IMAGE.
238*f6dc9357SAndroid Build Coastguard Worker     item.iImage = -1;
239*f6dc9357SAndroid Build Coastguard Worker     item.pszText = extInfo.Ext.Ptr_non_const();
240*f6dc9357SAndroid Build Coastguard Worker 
241*f6dc9357SAndroid Build Coastguard Worker     CAssoc assoc;
242*f6dc9357SAndroid Build Coastguard Worker     const CPluginToIcon &plug = extInfo.Plugins[0];
243*f6dc9357SAndroid Build Coastguard Worker     assoc.SevenZipImageIndex = AddIcon(plug.IconPath, plug.IconIndex);
244*f6dc9357SAndroid Build Coastguard Worker 
245*f6dc9357SAndroid Build Coastguard Worker     CSysString texts[NUM_EXT_GROUPS];
246*f6dc9357SAndroid Build Coastguard Worker     unsigned g;
247*f6dc9357SAndroid Build Coastguard Worker     for (g = 0; g < NUM_EXT_GROUPS; g++)
248*f6dc9357SAndroid Build Coastguard Worker     {
249*f6dc9357SAndroid Build Coastguard Worker       CModifiedExtInfo &mi = assoc.Pair[g];
250*f6dc9357SAndroid Build Coastguard Worker       mi.ReadFromRegistry(GetHKey(g), GetSystemString(extInfo.Ext));
251*f6dc9357SAndroid Build Coastguard Worker       mi.SetState(plug.IconPath);
252*f6dc9357SAndroid Build Coastguard Worker       mi.ImageIndex = AddIcon(mi.IconPath, mi.IconIndex);
253*f6dc9357SAndroid Build Coastguard Worker       texts[g] = mi.GetString();
254*f6dc9357SAndroid Build Coastguard Worker     }
255*f6dc9357SAndroid Build Coastguard Worker     item.iImage = assoc.GetIconIndex();
256*f6dc9357SAndroid Build Coastguard Worker     const int itemIndex = _listView.InsertItem(&item);
257*f6dc9357SAndroid Build Coastguard Worker     for (g = 0; g < NUM_EXT_GROUPS; g++)
258*f6dc9357SAndroid Build Coastguard Worker       _listView.SetSubItem((unsigned)itemIndex, 1 + g, texts[g]);
259*f6dc9357SAndroid Build Coastguard Worker     _items.Add(assoc);
260*f6dc9357SAndroid Build Coastguard Worker   }
261*f6dc9357SAndroid Build Coastguard Worker 
262*f6dc9357SAndroid Build Coastguard Worker   if (_listView.GetItemCount() > 0)
263*f6dc9357SAndroid Build Coastguard Worker     _listView.SetItemState(0, LVIS_FOCUSED, LVIS_FOCUSED);
264*f6dc9357SAndroid Build Coastguard Worker 
265*f6dc9357SAndroid Build Coastguard Worker   return CPropertyPage::OnInit();
266*f6dc9357SAndroid Build Coastguard Worker }
267*f6dc9357SAndroid Build Coastguard Worker 
268*f6dc9357SAndroid Build Coastguard Worker 
GetProgramCommand()269*f6dc9357SAndroid Build Coastguard Worker static UString GetProgramCommand()
270*f6dc9357SAndroid Build Coastguard Worker {
271*f6dc9357SAndroid Build Coastguard Worker   UString s ('\"');
272*f6dc9357SAndroid Build Coastguard Worker   s += fs2us(NDLL::GetModuleDirPrefix());
273*f6dc9357SAndroid Build Coastguard Worker   s += "7zFM.exe\" \"%1\"";
274*f6dc9357SAndroid Build Coastguard Worker   return s;
275*f6dc9357SAndroid Build Coastguard Worker }
276*f6dc9357SAndroid Build Coastguard Worker 
277*f6dc9357SAndroid Build Coastguard Worker 
OnApply()278*f6dc9357SAndroid Build Coastguard Worker LONG CSystemPage::OnApply()
279*f6dc9357SAndroid Build Coastguard Worker {
280*f6dc9357SAndroid Build Coastguard Worker   if (!_needSave)
281*f6dc9357SAndroid Build Coastguard Worker     return PSNRET_NOERROR;
282*f6dc9357SAndroid Build Coastguard Worker 
283*f6dc9357SAndroid Build Coastguard Worker   const UString command = GetProgramCommand();
284*f6dc9357SAndroid Build Coastguard Worker 
285*f6dc9357SAndroid Build Coastguard Worker   LONG res = 0;
286*f6dc9357SAndroid Build Coastguard Worker 
287*f6dc9357SAndroid Build Coastguard Worker   FOR_VECTOR (listIndex, _extDB.Exts)
288*f6dc9357SAndroid Build Coastguard Worker   {
289*f6dc9357SAndroid Build Coastguard Worker     unsigned realIndex = GetRealIndex(listIndex);
290*f6dc9357SAndroid Build Coastguard Worker     const CExtPlugins &extInfo = _extDB.Exts[realIndex];
291*f6dc9357SAndroid Build Coastguard Worker     CAssoc &assoc = _items[realIndex];
292*f6dc9357SAndroid Build Coastguard Worker 
293*f6dc9357SAndroid Build Coastguard Worker     for (unsigned g = 0; g < NUM_EXT_GROUPS; g++)
294*f6dc9357SAndroid Build Coastguard Worker     {
295*f6dc9357SAndroid Build Coastguard Worker       CModifiedExtInfo &mi = assoc.Pair[g];
296*f6dc9357SAndroid Build Coastguard Worker       HKEY key = GetHKey(g);
297*f6dc9357SAndroid Build Coastguard Worker 
298*f6dc9357SAndroid Build Coastguard Worker       if (mi.OldState != mi.State)
299*f6dc9357SAndroid Build Coastguard Worker       {
300*f6dc9357SAndroid Build Coastguard Worker         LONG res2 = 0;
301*f6dc9357SAndroid Build Coastguard Worker 
302*f6dc9357SAndroid Build Coastguard Worker         if (mi.State == kExtState_7Zip)
303*f6dc9357SAndroid Build Coastguard Worker         {
304*f6dc9357SAndroid Build Coastguard Worker           UString title = extInfo.Ext;
305*f6dc9357SAndroid Build Coastguard Worker           title += " Archive";
306*f6dc9357SAndroid Build Coastguard Worker           const CPluginToIcon &plug = extInfo.Plugins[0];
307*f6dc9357SAndroid Build Coastguard Worker           res2 = NRegistryAssoc::AddShellExtensionInfo(key, GetSystemString(extInfo.Ext),
308*f6dc9357SAndroid Build Coastguard Worker               title, command, plug.IconPath, plug.IconIndex);
309*f6dc9357SAndroid Build Coastguard Worker         }
310*f6dc9357SAndroid Build Coastguard Worker         else if (mi.State == kExtState_Clear)
311*f6dc9357SAndroid Build Coastguard Worker           res2 = NRegistryAssoc::DeleteShellExtensionInfo(key, GetSystemString(extInfo.Ext));
312*f6dc9357SAndroid Build Coastguard Worker 
313*f6dc9357SAndroid Build Coastguard Worker         if (res == 0)
314*f6dc9357SAndroid Build Coastguard Worker           res = res2;
315*f6dc9357SAndroid Build Coastguard Worker         if (res2 == 0)
316*f6dc9357SAndroid Build Coastguard Worker           mi.OldState = mi.State;
317*f6dc9357SAndroid Build Coastguard Worker 
318*f6dc9357SAndroid Build Coastguard Worker         mi.State = mi.OldState;
319*f6dc9357SAndroid Build Coastguard Worker         RefreshListItem(g, listIndex);
320*f6dc9357SAndroid Build Coastguard Worker       }
321*f6dc9357SAndroid Build Coastguard Worker     }
322*f6dc9357SAndroid Build Coastguard Worker   }
323*f6dc9357SAndroid Build Coastguard Worker 
324*f6dc9357SAndroid Build Coastguard Worker   #ifndef UNDER_CE
325*f6dc9357SAndroid Build Coastguard Worker   SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL);
326*f6dc9357SAndroid Build Coastguard Worker   #endif
327*f6dc9357SAndroid Build Coastguard Worker 
328*f6dc9357SAndroid Build Coastguard Worker   WasChanged = true;
329*f6dc9357SAndroid Build Coastguard Worker 
330*f6dc9357SAndroid Build Coastguard Worker   _needSave = false;
331*f6dc9357SAndroid Build Coastguard Worker 
332*f6dc9357SAndroid Build Coastguard Worker   if (res != 0)
333*f6dc9357SAndroid Build Coastguard Worker     MessageBoxW(*this, NError::MyFormatMessage(res), L"7-Zip", MB_ICONERROR);
334*f6dc9357SAndroid Build Coastguard Worker 
335*f6dc9357SAndroid Build Coastguard Worker   return PSNRET_NOERROR;
336*f6dc9357SAndroid Build Coastguard Worker }
337*f6dc9357SAndroid Build Coastguard Worker 
338*f6dc9357SAndroid Build Coastguard Worker 
OnNotifyHelp()339*f6dc9357SAndroid Build Coastguard Worker void CSystemPage::OnNotifyHelp()
340*f6dc9357SAndroid Build Coastguard Worker {
341*f6dc9357SAndroid Build Coastguard Worker   ShowHelpWindow(kSystemTopic);
342*f6dc9357SAndroid Build Coastguard Worker }
343*f6dc9357SAndroid Build Coastguard Worker 
344*f6dc9357SAndroid Build Coastguard Worker 
OnButtonClicked(unsigned buttonID,HWND buttonHWND)345*f6dc9357SAndroid Build Coastguard Worker bool CSystemPage::OnButtonClicked(unsigned buttonID, HWND buttonHWND)
346*f6dc9357SAndroid Build Coastguard Worker {
347*f6dc9357SAndroid Build Coastguard Worker   switch (buttonID)
348*f6dc9357SAndroid Build Coastguard Worker   {
349*f6dc9357SAndroid Build Coastguard Worker     /*
350*f6dc9357SAndroid Build Coastguard Worker     case IDC_SYSTEM_SELECT_ALL:
351*f6dc9357SAndroid Build Coastguard Worker       _listView.SelectAll();
352*f6dc9357SAndroid Build Coastguard Worker       return true;
353*f6dc9357SAndroid Build Coastguard Worker     */
354*f6dc9357SAndroid Build Coastguard Worker     case IDB_SYSTEM_CURRENT:
355*f6dc9357SAndroid Build Coastguard Worker     case IDB_SYSTEM_ALL:
356*f6dc9357SAndroid Build Coastguard Worker       ChangeState(buttonID == IDB_SYSTEM_CURRENT ? 0 : 1);
357*f6dc9357SAndroid Build Coastguard Worker       return true;
358*f6dc9357SAndroid Build Coastguard Worker   }
359*f6dc9357SAndroid Build Coastguard Worker   return CPropertyPage::OnButtonClicked(buttonID, buttonHWND);
360*f6dc9357SAndroid Build Coastguard Worker }
361*f6dc9357SAndroid Build Coastguard Worker 
362*f6dc9357SAndroid Build Coastguard Worker 
OnNotify(UINT controlID,LPNMHDR lParam)363*f6dc9357SAndroid Build Coastguard Worker bool CSystemPage::OnNotify(UINT controlID, LPNMHDR lParam)
364*f6dc9357SAndroid Build Coastguard Worker {
365*f6dc9357SAndroid Build Coastguard Worker   if (lParam->hwndFrom == HWND(_listView))
366*f6dc9357SAndroid Build Coastguard Worker   {
367*f6dc9357SAndroid Build Coastguard Worker     switch (lParam->code)
368*f6dc9357SAndroid Build Coastguard Worker     {
369*f6dc9357SAndroid Build Coastguard Worker       case NM_RETURN:
370*f6dc9357SAndroid Build Coastguard Worker       {
371*f6dc9357SAndroid Build Coastguard Worker         ChangeState(0);
372*f6dc9357SAndroid Build Coastguard Worker         return true;
373*f6dc9357SAndroid Build Coastguard Worker       }
374*f6dc9357SAndroid Build Coastguard Worker 
375*f6dc9357SAndroid Build Coastguard Worker       case NM_CLICK:
376*f6dc9357SAndroid Build Coastguard Worker       {
377*f6dc9357SAndroid Build Coastguard Worker         #ifdef UNDER_CE
378*f6dc9357SAndroid Build Coastguard Worker         NMLISTVIEW *item = (NMLISTVIEW *)lParam;
379*f6dc9357SAndroid Build Coastguard Worker         #else
380*f6dc9357SAndroid Build Coastguard Worker         NMITEMACTIVATE *item = (NMITEMACTIVATE *)lParam;
381*f6dc9357SAndroid Build Coastguard Worker         if (item->uKeyFlags == 0)
382*f6dc9357SAndroid Build Coastguard Worker         #endif
383*f6dc9357SAndroid Build Coastguard Worker         {
384*f6dc9357SAndroid Build Coastguard Worker           if (item->iItem >= 0)
385*f6dc9357SAndroid Build Coastguard Worker           {
386*f6dc9357SAndroid Build Coastguard Worker             // unsigned realIndex = GetRealIndex(item->iItem);
387*f6dc9357SAndroid Build Coastguard Worker             if (item->iSubItem >= 1 && item->iSubItem <= 2)
388*f6dc9357SAndroid Build Coastguard Worker             {
389*f6dc9357SAndroid Build Coastguard Worker               CUIntVector indices;
390*f6dc9357SAndroid Build Coastguard Worker               indices.Add((unsigned)item->iItem);
391*f6dc9357SAndroid Build Coastguard Worker               ChangeState(item->iSubItem < 2 ? 0 : 1, indices);
392*f6dc9357SAndroid Build Coastguard Worker             }
393*f6dc9357SAndroid Build Coastguard Worker           }
394*f6dc9357SAndroid Build Coastguard Worker         }
395*f6dc9357SAndroid Build Coastguard Worker         break;
396*f6dc9357SAndroid Build Coastguard Worker       }
397*f6dc9357SAndroid Build Coastguard Worker 
398*f6dc9357SAndroid Build Coastguard Worker       case LVN_KEYDOWN:
399*f6dc9357SAndroid Build Coastguard Worker       {
400*f6dc9357SAndroid Build Coastguard Worker         if (OnListKeyDown(LPNMLVKEYDOWN(lParam)))
401*f6dc9357SAndroid Build Coastguard Worker           return true;
402*f6dc9357SAndroid Build Coastguard Worker         break;
403*f6dc9357SAndroid Build Coastguard Worker       }
404*f6dc9357SAndroid Build Coastguard Worker 
405*f6dc9357SAndroid Build Coastguard Worker       /*
406*f6dc9357SAndroid Build Coastguard Worker       case NM_RCLICK:
407*f6dc9357SAndroid Build Coastguard Worker       case NM_DBLCLK:
408*f6dc9357SAndroid Build Coastguard Worker       case LVN_BEGINRDRAG:
409*f6dc9357SAndroid Build Coastguard Worker         // PostMessage(kRefreshpluginsListMessage, 0);
410*f6dc9357SAndroid Build Coastguard Worker         PostMessage(kUpdateDatabase, 0);
411*f6dc9357SAndroid Build Coastguard Worker         break;
412*f6dc9357SAndroid Build Coastguard Worker       */
413*f6dc9357SAndroid Build Coastguard Worker     }
414*f6dc9357SAndroid Build Coastguard Worker   }
415*f6dc9357SAndroid Build Coastguard Worker   return CPropertyPage::OnNotify(controlID, lParam);
416*f6dc9357SAndroid Build Coastguard Worker }
417*f6dc9357SAndroid Build Coastguard Worker 
418*f6dc9357SAndroid Build Coastguard Worker 
ChangeState(unsigned group)419*f6dc9357SAndroid Build Coastguard Worker void CSystemPage::ChangeState(unsigned group)
420*f6dc9357SAndroid Build Coastguard Worker {
421*f6dc9357SAndroid Build Coastguard Worker   CUIntVector indices;
422*f6dc9357SAndroid Build Coastguard Worker 
423*f6dc9357SAndroid Build Coastguard Worker   int itemIndex = -1;
424*f6dc9357SAndroid Build Coastguard Worker   while ((itemIndex = _listView.GetNextSelectedItem(itemIndex)) != -1)
425*f6dc9357SAndroid Build Coastguard Worker     indices.Add((unsigned)itemIndex);
426*f6dc9357SAndroid Build Coastguard Worker 
427*f6dc9357SAndroid Build Coastguard Worker   if (indices.IsEmpty())
428*f6dc9357SAndroid Build Coastguard Worker     FOR_VECTOR (i, _items)
429*f6dc9357SAndroid Build Coastguard Worker       indices.Add(i);
430*f6dc9357SAndroid Build Coastguard Worker 
431*f6dc9357SAndroid Build Coastguard Worker   ChangeState(group, indices);
432*f6dc9357SAndroid Build Coastguard Worker }
433*f6dc9357SAndroid Build Coastguard Worker 
434*f6dc9357SAndroid Build Coastguard Worker 
OnListKeyDown(LPNMLVKEYDOWN keyDownInfo)435*f6dc9357SAndroid Build Coastguard Worker bool CSystemPage::OnListKeyDown(LPNMLVKEYDOWN keyDownInfo)
436*f6dc9357SAndroid Build Coastguard Worker {
437*f6dc9357SAndroid Build Coastguard Worker   bool ctrl = IsKeyDown(VK_CONTROL);
438*f6dc9357SAndroid Build Coastguard Worker   bool alt = IsKeyDown(VK_MENU);
439*f6dc9357SAndroid Build Coastguard Worker 
440*f6dc9357SAndroid Build Coastguard Worker   if (alt)
441*f6dc9357SAndroid Build Coastguard Worker     return false;
442*f6dc9357SAndroid Build Coastguard Worker 
443*f6dc9357SAndroid Build Coastguard Worker   if ((ctrl && keyDownInfo->wVKey == 'A')
444*f6dc9357SAndroid Build Coastguard Worker       || (!ctrl && keyDownInfo->wVKey == VK_MULTIPLY))
445*f6dc9357SAndroid Build Coastguard Worker   {
446*f6dc9357SAndroid Build Coastguard Worker     _listView.SelectAll();
447*f6dc9357SAndroid Build Coastguard Worker     return true;
448*f6dc9357SAndroid Build Coastguard Worker   }
449*f6dc9357SAndroid Build Coastguard Worker 
450*f6dc9357SAndroid Build Coastguard Worker   switch (keyDownInfo->wVKey)
451*f6dc9357SAndroid Build Coastguard Worker   {
452*f6dc9357SAndroid Build Coastguard Worker     case VK_SPACE:
453*f6dc9357SAndroid Build Coastguard Worker     case VK_ADD:
454*f6dc9357SAndroid Build Coastguard Worker     case VK_SUBTRACT:
455*f6dc9357SAndroid Build Coastguard Worker     case VK_SEPARATOR:
456*f6dc9357SAndroid Build Coastguard Worker     case VK_DIVIDE:
457*f6dc9357SAndroid Build Coastguard Worker 
458*f6dc9357SAndroid Build Coastguard Worker     #ifndef UNDER_CE
459*f6dc9357SAndroid Build Coastguard Worker     case VK_OEM_PLUS:
460*f6dc9357SAndroid Build Coastguard Worker     case VK_OEM_MINUS:
461*f6dc9357SAndroid Build Coastguard Worker     #endif
462*f6dc9357SAndroid Build Coastguard Worker 
463*f6dc9357SAndroid Build Coastguard Worker       if (!ctrl)
464*f6dc9357SAndroid Build Coastguard Worker       {
465*f6dc9357SAndroid Build Coastguard Worker         ChangeState(keyDownInfo->wVKey == VK_SPACE ? 0 : 1);
466*f6dc9357SAndroid Build Coastguard Worker         return true;
467*f6dc9357SAndroid Build Coastguard Worker       }
468*f6dc9357SAndroid Build Coastguard Worker       break;
469*f6dc9357SAndroid Build Coastguard Worker   }
470*f6dc9357SAndroid Build Coastguard Worker 
471*f6dc9357SAndroid Build Coastguard Worker   return false;
472*f6dc9357SAndroid Build Coastguard Worker }
473