xref: /aosp_15_r20/external/lzma/CPP/7zip/UI/FileManager/SettingsPage.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // SettingsPage.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 <CommCtrl.h>
6*f6dc9357SAndroid Build Coastguard Worker 
7*f6dc9357SAndroid Build Coastguard Worker // #include "../../../Common/IntToString.h"
8*f6dc9357SAndroid Build Coastguard Worker // #include "../../../Common/StringConvert.h"
9*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/StringToInt.h"
10*f6dc9357SAndroid Build Coastguard Worker 
11*f6dc9357SAndroid Build Coastguard Worker #ifndef UNDER_CE
12*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/ErrorMsg.h"
13*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/MemoryLock.h"
14*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/System.h"
15*f6dc9357SAndroid Build Coastguard Worker #endif
16*f6dc9357SAndroid Build Coastguard Worker 
17*f6dc9357SAndroid Build Coastguard Worker #include "../Explorer/MyMessages.h"
18*f6dc9357SAndroid Build Coastguard Worker 
19*f6dc9357SAndroid Build Coastguard Worker #include "../Common/ZipRegistry.h"
20*f6dc9357SAndroid Build Coastguard Worker 
21*f6dc9357SAndroid Build Coastguard Worker #include "HelpUtils.h"
22*f6dc9357SAndroid Build Coastguard Worker #include "LangUtils.h"
23*f6dc9357SAndroid Build Coastguard Worker #include "RegistryUtils.h"
24*f6dc9357SAndroid Build Coastguard Worker #include "SettingsPage.h"
25*f6dc9357SAndroid Build Coastguard Worker #include "SettingsPageRes.h"
26*f6dc9357SAndroid Build Coastguard Worker 
27*f6dc9357SAndroid Build Coastguard Worker using namespace NWindows;
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_SETTINGS_SHOW_DOTS,
33*f6dc9357SAndroid Build Coastguard Worker   IDX_SETTINGS_SHOW_REAL_FILE_ICONS,
34*f6dc9357SAndroid Build Coastguard Worker   IDX_SETTINGS_SHOW_SYSTEM_MENU,
35*f6dc9357SAndroid Build Coastguard Worker   IDX_SETTINGS_FULL_ROW,
36*f6dc9357SAndroid Build Coastguard Worker   IDX_SETTINGS_SHOW_GRID,
37*f6dc9357SAndroid Build Coastguard Worker   IDX_SETTINGS_SINGLE_CLICK,
38*f6dc9357SAndroid Build Coastguard Worker   IDX_SETTINGS_ALTERNATIVE_SELECTION,
39*f6dc9357SAndroid Build Coastguard Worker   IDX_SETTINGS_LARGE_PAGES,
40*f6dc9357SAndroid Build Coastguard Worker   IDT_MEM_USAGE_EXTRACT
41*f6dc9357SAndroid Build Coastguard Worker   // , IDT_COMPRESS_MEMORY
42*f6dc9357SAndroid Build Coastguard Worker };
43*f6dc9357SAndroid Build Coastguard Worker #endif
44*f6dc9357SAndroid Build Coastguard Worker 
45*f6dc9357SAndroid Build Coastguard Worker #define kSettingsTopic "FM/options.htm#settings"
46*f6dc9357SAndroid Build Coastguard Worker 
47*f6dc9357SAndroid Build Coastguard Worker extern bool IsLargePageSupported();
48*f6dc9357SAndroid Build Coastguard Worker 
49*f6dc9357SAndroid Build Coastguard Worker /*
50*f6dc9357SAndroid Build Coastguard Worker static void AddMemSize(UString &res, UInt64 size, bool needRound = false)
51*f6dc9357SAndroid Build Coastguard Worker {
52*f6dc9357SAndroid Build Coastguard Worker   char c;
53*f6dc9357SAndroid Build Coastguard Worker   unsigned moveBits = 0;
54*f6dc9357SAndroid Build Coastguard Worker   if (needRound)
55*f6dc9357SAndroid Build Coastguard Worker   {
56*f6dc9357SAndroid Build Coastguard Worker     UInt64 rn = 0;
57*f6dc9357SAndroid Build Coastguard Worker     if (size >= (1 << 31))
58*f6dc9357SAndroid Build Coastguard Worker       rn = (1 << 28) - 1;
59*f6dc9357SAndroid Build Coastguard Worker     UInt32 kRound = (1 << 20) - 1;
60*f6dc9357SAndroid Build Coastguard Worker     if (rn < kRound)
61*f6dc9357SAndroid Build Coastguard Worker       rn = kRound;
62*f6dc9357SAndroid Build Coastguard Worker     size += rn;
63*f6dc9357SAndroid Build Coastguard Worker     size &= ~rn;
64*f6dc9357SAndroid Build Coastguard Worker   }
65*f6dc9357SAndroid Build Coastguard Worker   if (size >= ((UInt64)1 << 31) && (size & 0x3FFFFFFF) == 0)
66*f6dc9357SAndroid Build Coastguard Worker     { moveBits = 30; c = 'G'; }
67*f6dc9357SAndroid Build Coastguard Worker   else
68*f6dc9357SAndroid Build Coastguard Worker     { moveBits = 20; c = 'M'; }
69*f6dc9357SAndroid Build Coastguard Worker   res.Add_UInt64(size >> moveBits);
70*f6dc9357SAndroid Build Coastguard Worker   res.Add_Space();
71*f6dc9357SAndroid Build Coastguard Worker   if (moveBits != 0)
72*f6dc9357SAndroid Build Coastguard Worker     res += c;
73*f6dc9357SAndroid Build Coastguard Worker   res += 'B';
74*f6dc9357SAndroid Build Coastguard Worker }
75*f6dc9357SAndroid Build Coastguard Worker 
76*f6dc9357SAndroid Build Coastguard Worker 
77*f6dc9357SAndroid Build Coastguard Worker int CSettingsPage::AddMemComboItem(UInt64 size, UInt64 percents, bool isDefault)
78*f6dc9357SAndroid Build Coastguard Worker {
79*f6dc9357SAndroid Build Coastguard Worker   UString sUser;
80*f6dc9357SAndroid Build Coastguard Worker   UString sRegistry;
81*f6dc9357SAndroid Build Coastguard Worker   if (size == 0)
82*f6dc9357SAndroid Build Coastguard Worker   {
83*f6dc9357SAndroid Build Coastguard Worker     UString s;
84*f6dc9357SAndroid Build Coastguard Worker     s.Add_UInt64(percents);
85*f6dc9357SAndroid Build Coastguard Worker     s += '%';
86*f6dc9357SAndroid Build Coastguard Worker     if (isDefault)
87*f6dc9357SAndroid Build Coastguard Worker       sUser = "* ";
88*f6dc9357SAndroid Build Coastguard Worker     else
89*f6dc9357SAndroid Build Coastguard Worker       sRegistry = s;
90*f6dc9357SAndroid Build Coastguard Worker     sUser += s;
91*f6dc9357SAndroid Build Coastguard Worker   }
92*f6dc9357SAndroid Build Coastguard Worker   else
93*f6dc9357SAndroid Build Coastguard Worker   {
94*f6dc9357SAndroid Build Coastguard Worker     AddMemSize(sUser, size);
95*f6dc9357SAndroid Build Coastguard Worker     sRegistry = sUser;
96*f6dc9357SAndroid Build Coastguard Worker     for (;;)
97*f6dc9357SAndroid Build Coastguard Worker     {
98*f6dc9357SAndroid Build Coastguard Worker       int pos = sRegistry.Find(L' ');
99*f6dc9357SAndroid Build Coastguard Worker       if (pos < 0)
100*f6dc9357SAndroid Build Coastguard Worker         break;
101*f6dc9357SAndroid Build Coastguard Worker       sRegistry.Delete(pos);
102*f6dc9357SAndroid Build Coastguard Worker     }
103*f6dc9357SAndroid Build Coastguard Worker     if (!sRegistry.IsEmpty())
104*f6dc9357SAndroid Build Coastguard Worker       if (sRegistry.Back() == 'B')
105*f6dc9357SAndroid Build Coastguard Worker         sRegistry.DeleteBack();
106*f6dc9357SAndroid Build Coastguard Worker   }
107*f6dc9357SAndroid Build Coastguard Worker   const int index = (int)_memCombo.AddString(sUser);
108*f6dc9357SAndroid Build Coastguard Worker   _memCombo.SetItemData(index, _memLimitStrings.Size());
109*f6dc9357SAndroid Build Coastguard Worker   _memLimitStrings.Add(sRegistry);
110*f6dc9357SAndroid Build Coastguard Worker   return index;
111*f6dc9357SAndroid Build Coastguard Worker }
112*f6dc9357SAndroid Build Coastguard Worker */
113*f6dc9357SAndroid Build Coastguard Worker 
OnInit()114*f6dc9357SAndroid Build Coastguard Worker bool CSettingsPage::OnInit()
115*f6dc9357SAndroid Build Coastguard Worker {
116*f6dc9357SAndroid Build Coastguard Worker   _initMode = true;
117*f6dc9357SAndroid Build Coastguard Worker   _wasChanged = false;
118*f6dc9357SAndroid Build Coastguard Worker   _largePages_wasChanged = false;
119*f6dc9357SAndroid Build Coastguard Worker   _memx_wasChanged = false;
120*f6dc9357SAndroid Build Coastguard Worker   /*
121*f6dc9357SAndroid Build Coastguard Worker   _wasChanged_MemLimit = false;
122*f6dc9357SAndroid Build Coastguard Worker   _memLimitStrings.Clear();
123*f6dc9357SAndroid Build Coastguard Worker   _memCombo.Attach(GetItem(IDC_SETTINGS_MEM));
124*f6dc9357SAndroid Build Coastguard Worker   */
125*f6dc9357SAndroid Build Coastguard Worker 
126*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_LANG
127*f6dc9357SAndroid Build Coastguard Worker   LangSetDlgItems(*this, kLangIDs, Z7_ARRAY_SIZE(kLangIDs));
128*f6dc9357SAndroid Build Coastguard Worker #endif
129*f6dc9357SAndroid Build Coastguard Worker 
130*f6dc9357SAndroid Build Coastguard Worker   CFmSettings st;
131*f6dc9357SAndroid Build Coastguard Worker   st.Load();
132*f6dc9357SAndroid Build Coastguard Worker 
133*f6dc9357SAndroid Build Coastguard Worker   CheckButton(IDX_SETTINGS_SHOW_DOTS, st.ShowDots);
134*f6dc9357SAndroid Build Coastguard Worker   CheckButton(IDX_SETTINGS_SHOW_REAL_FILE_ICONS, st.ShowRealFileIcons);
135*f6dc9357SAndroid Build Coastguard Worker   CheckButton(IDX_SETTINGS_FULL_ROW, st.FullRow);
136*f6dc9357SAndroid Build Coastguard Worker   CheckButton(IDX_SETTINGS_SHOW_GRID, st.ShowGrid);
137*f6dc9357SAndroid Build Coastguard Worker   CheckButton(IDX_SETTINGS_SINGLE_CLICK, st.SingleClick);
138*f6dc9357SAndroid Build Coastguard Worker   CheckButton(IDX_SETTINGS_ALTERNATIVE_SELECTION, st.AlternativeSelection);
139*f6dc9357SAndroid Build Coastguard Worker   // CheckButton(IDX_SETTINGS_UNDERLINE, st.Underline);
140*f6dc9357SAndroid Build Coastguard Worker 
141*f6dc9357SAndroid Build Coastguard Worker   CheckButton(IDX_SETTINGS_SHOW_SYSTEM_MENU, st.ShowSystemMenu);
142*f6dc9357SAndroid Build Coastguard Worker 
143*f6dc9357SAndroid Build Coastguard Worker   if (IsLargePageSupported())
144*f6dc9357SAndroid Build Coastguard Worker     CheckButton(IDX_SETTINGS_LARGE_PAGES, ReadLockMemoryEnable());
145*f6dc9357SAndroid Build Coastguard Worker   else
146*f6dc9357SAndroid Build Coastguard Worker     EnableItem(IDX_SETTINGS_LARGE_PAGES, false);
147*f6dc9357SAndroid Build Coastguard Worker 
148*f6dc9357SAndroid Build Coastguard Worker 
149*f6dc9357SAndroid Build Coastguard Worker   /*
150*f6dc9357SAndroid Build Coastguard Worker   NCompression::CMemUse mu;
151*f6dc9357SAndroid Build Coastguard Worker   bool needSetCur = NCompression::MemLimit_Load(mu);
152*f6dc9357SAndroid Build Coastguard Worker   UInt64 curMemLimit;
153*f6dc9357SAndroid Build Coastguard Worker   {
154*f6dc9357SAndroid Build Coastguard Worker     AddMemComboItem(0, 90, true);
155*f6dc9357SAndroid Build Coastguard Worker     _memCombo.SetCurSel(0);
156*f6dc9357SAndroid Build Coastguard Worker   }
157*f6dc9357SAndroid Build Coastguard Worker   if (mu.IsPercent)
158*f6dc9357SAndroid Build Coastguard Worker   {
159*f6dc9357SAndroid Build Coastguard Worker     const int index = AddMemComboItem(0, mu.Val);
160*f6dc9357SAndroid Build Coastguard Worker     _memCombo.SetCurSel(index);
161*f6dc9357SAndroid Build Coastguard Worker     needSetCur = false;
162*f6dc9357SAndroid Build Coastguard Worker   }
163*f6dc9357SAndroid Build Coastguard Worker   {
164*f6dc9357SAndroid Build Coastguard Worker     _ramSize = (size_t)sizeof(size_t) << 29;
165*f6dc9357SAndroid Build Coastguard Worker     _ramSize_Defined = NSystem::GetRamSize(_ramSize);
166*f6dc9357SAndroid Build Coastguard Worker     UString s;
167*f6dc9357SAndroid Build Coastguard Worker     if (_ramSize_Defined)
168*f6dc9357SAndroid Build Coastguard Worker     {
169*f6dc9357SAndroid Build Coastguard Worker       s += "/ ";
170*f6dc9357SAndroid Build Coastguard Worker       AddMemSize(s, _ramSize, true);
171*f6dc9357SAndroid Build Coastguard Worker     }
172*f6dc9357SAndroid Build Coastguard Worker     SetItemText(IDT_SETTINGS_MEM_RAM, s);
173*f6dc9357SAndroid Build Coastguard Worker 
174*f6dc9357SAndroid Build Coastguard Worker     curMemLimit = mu.GetBytes(_ramSize);
175*f6dc9357SAndroid Build Coastguard Worker 
176*f6dc9357SAndroid Build Coastguard Worker     // size = 100 << 20; // for debug only;
177*f6dc9357SAndroid Build Coastguard Worker     for (unsigned i = (27) * 2;; i++)
178*f6dc9357SAndroid Build Coastguard Worker     {
179*f6dc9357SAndroid Build Coastguard Worker       UInt64 size = (UInt64)(2 + (i & 1)) << (i / 2);
180*f6dc9357SAndroid Build Coastguard Worker       if (i > (20 + sizeof(size_t) * 3 * 1 - 1) * 2)
181*f6dc9357SAndroid Build Coastguard Worker         size = (UInt64)(Int64)-1;
182*f6dc9357SAndroid Build Coastguard Worker       if (needSetCur && (size >= curMemLimit))
183*f6dc9357SAndroid Build Coastguard Worker       {
184*f6dc9357SAndroid Build Coastguard Worker         const int index = AddMemComboItem(curMemLimit);
185*f6dc9357SAndroid Build Coastguard Worker         _memCombo.SetCurSel(index);
186*f6dc9357SAndroid Build Coastguard Worker         needSetCur = false;
187*f6dc9357SAndroid Build Coastguard Worker         if (size == curMemLimit)
188*f6dc9357SAndroid Build Coastguard Worker           continue;
189*f6dc9357SAndroid Build Coastguard Worker       }
190*f6dc9357SAndroid Build Coastguard Worker       if (size == (UInt64)(Int64)-1)
191*f6dc9357SAndroid Build Coastguard Worker         break;
192*f6dc9357SAndroid Build Coastguard Worker       AddMemComboItem(size);
193*f6dc9357SAndroid Build Coastguard Worker     }
194*f6dc9357SAndroid Build Coastguard Worker   }
195*f6dc9357SAndroid Build Coastguard Worker   */
196*f6dc9357SAndroid Build Coastguard Worker 
197*f6dc9357SAndroid Build Coastguard Worker   // EnableSubItems();
198*f6dc9357SAndroid Build Coastguard Worker 
199*f6dc9357SAndroid Build Coastguard Worker 
200*f6dc9357SAndroid Build Coastguard Worker   {
201*f6dc9357SAndroid Build Coastguard Worker     size_t ramSize = (size_t)sizeof(size_t) << 29;
202*f6dc9357SAndroid Build Coastguard Worker     const bool ramSize_defined = NWindows::NSystem::GetRamSize(ramSize);
203*f6dc9357SAndroid Build Coastguard Worker     // ramSize *= 10; // for debug
204*f6dc9357SAndroid Build Coastguard Worker     UInt32 ramSize_GB = (UInt32)(((UInt64)ramSize + (1u << 29)) >> 30);
205*f6dc9357SAndroid Build Coastguard Worker     if (ramSize_GB == 0)
206*f6dc9357SAndroid Build Coastguard Worker       ramSize_GB = 1;
207*f6dc9357SAndroid Build Coastguard Worker     UString s ("GB");
208*f6dc9357SAndroid Build Coastguard Worker     if (ramSize_defined)
209*f6dc9357SAndroid Build Coastguard Worker     {
210*f6dc9357SAndroid Build Coastguard Worker       s += " / ";
211*f6dc9357SAndroid Build Coastguard Worker       s.Add_UInt64(ramSize_GB);
212*f6dc9357SAndroid Build Coastguard Worker       s += " GB (RAM)";
213*f6dc9357SAndroid Build Coastguard Worker     }
214*f6dc9357SAndroid Build Coastguard Worker     SetItemText(IDT_SETTINGS_MEM_GB, s);
215*f6dc9357SAndroid Build Coastguard Worker 
216*f6dc9357SAndroid Build Coastguard Worker     const UINT valMin = 1;
217*f6dc9357SAndroid Build Coastguard Worker     UINT valMax = 64; // 64GB for RAR7
218*f6dc9357SAndroid Build Coastguard Worker     if (ramSize_defined /* && ramSize_GB > valMax */)
219*f6dc9357SAndroid Build Coastguard Worker     {
220*f6dc9357SAndroid Build Coastguard Worker       const UINT k_max_val = 1u << 14;
221*f6dc9357SAndroid Build Coastguard Worker       if (ramSize_GB >= k_max_val)
222*f6dc9357SAndroid Build Coastguard Worker         valMax = k_max_val;
223*f6dc9357SAndroid Build Coastguard Worker       else if (ramSize_GB > 1)
224*f6dc9357SAndroid Build Coastguard Worker         valMax = (UINT)ramSize_GB - 1;
225*f6dc9357SAndroid Build Coastguard Worker       else
226*f6dc9357SAndroid Build Coastguard Worker         valMax = 1;
227*f6dc9357SAndroid Build Coastguard Worker     }
228*f6dc9357SAndroid Build Coastguard Worker 
229*f6dc9357SAndroid Build Coastguard Worker     UInt32 limit = NExtract::Read_LimitGB();
230*f6dc9357SAndroid Build Coastguard Worker     if (limit != 0 && limit != (UInt32)(Int32)-1)
231*f6dc9357SAndroid Build Coastguard Worker       CheckButton(IDX_SETTINGS_MEM_SET, true);
232*f6dc9357SAndroid Build Coastguard Worker     else
233*f6dc9357SAndroid Build Coastguard Worker     {
234*f6dc9357SAndroid Build Coastguard Worker       limit = 4;
235*f6dc9357SAndroid Build Coastguard Worker       EnableSpin(false);
236*f6dc9357SAndroid Build Coastguard Worker     }
237*f6dc9357SAndroid Build Coastguard Worker     SendItemMessage(IDC_SETTINGS_MEM_SPIN, UDM_SETRANGE, 0, MAKELPARAM(valMax, valMin)); // Sets the controls direction
238*f6dc9357SAndroid Build Coastguard Worker     // UDM_SETPOS doesn't set value larger than max value (valMax) of range:
239*f6dc9357SAndroid Build Coastguard Worker     SendItemMessage(IDC_SETTINGS_MEM_SPIN, UDM_SETPOS, 0, limit);
240*f6dc9357SAndroid Build Coastguard Worker     s.Empty();
241*f6dc9357SAndroid Build Coastguard Worker     s.Add_UInt32(limit);
242*f6dc9357SAndroid Build Coastguard Worker     SetItemText(IDE_SETTINGS_MEM_SPIN_EDIT, s);
243*f6dc9357SAndroid Build Coastguard Worker   }
244*f6dc9357SAndroid Build Coastguard Worker 
245*f6dc9357SAndroid Build Coastguard Worker   _initMode = false;
246*f6dc9357SAndroid Build Coastguard Worker   return CPropertyPage::OnInit();
247*f6dc9357SAndroid Build Coastguard Worker }
248*f6dc9357SAndroid Build Coastguard Worker 
249*f6dc9357SAndroid Build Coastguard Worker 
EnableSpin(bool enable)250*f6dc9357SAndroid Build Coastguard Worker void CSettingsPage::EnableSpin(bool enable)
251*f6dc9357SAndroid Build Coastguard Worker {
252*f6dc9357SAndroid Build Coastguard Worker   EnableItem(IDC_SETTINGS_MEM_SPIN, enable);
253*f6dc9357SAndroid Build Coastguard Worker   EnableItem(IDE_SETTINGS_MEM_SPIN_EDIT, enable);
254*f6dc9357SAndroid Build Coastguard Worker }
255*f6dc9357SAndroid Build Coastguard Worker 
256*f6dc9357SAndroid Build Coastguard Worker 
257*f6dc9357SAndroid Build Coastguard Worker /*
258*f6dc9357SAndroid Build Coastguard Worker void CSettingsPage::EnableSubItems()
259*f6dc9357SAndroid Build Coastguard Worker {
260*f6dc9357SAndroid Build Coastguard Worker   EnableItem(IDX_SETTINGS_UNDERLINE, IsButtonCheckedBool(IDX_SETTINGS_SINGLE_CLICK));
261*f6dc9357SAndroid Build Coastguard Worker }
262*f6dc9357SAndroid Build Coastguard Worker */
263*f6dc9357SAndroid Build Coastguard Worker 
264*f6dc9357SAndroid Build Coastguard Worker /*
265*f6dc9357SAndroid Build Coastguard Worker static void AddSize_MB(UString &s, UInt64 size)
266*f6dc9357SAndroid Build Coastguard Worker {
267*f6dc9357SAndroid Build Coastguard Worker   s.Add_UInt64((size + (1 << 20) - 1) >> 20);
268*f6dc9357SAndroid Build Coastguard Worker   s += " MB";
269*f6dc9357SAndroid Build Coastguard Worker }
270*f6dc9357SAndroid Build Coastguard Worker */
271*f6dc9357SAndroid Build Coastguard Worker 
OnApply()272*f6dc9357SAndroid Build Coastguard Worker LONG CSettingsPage::OnApply()
273*f6dc9357SAndroid Build Coastguard Worker {
274*f6dc9357SAndroid Build Coastguard Worker   if (_wasChanged)
275*f6dc9357SAndroid Build Coastguard Worker   {
276*f6dc9357SAndroid Build Coastguard Worker     CFmSettings st;
277*f6dc9357SAndroid Build Coastguard Worker     st.ShowDots = IsButtonCheckedBool(IDX_SETTINGS_SHOW_DOTS);
278*f6dc9357SAndroid Build Coastguard Worker     st.ShowRealFileIcons = IsButtonCheckedBool(IDX_SETTINGS_SHOW_REAL_FILE_ICONS);
279*f6dc9357SAndroid Build Coastguard Worker     st.FullRow = IsButtonCheckedBool(IDX_SETTINGS_FULL_ROW);
280*f6dc9357SAndroid Build Coastguard Worker     st.ShowGrid = IsButtonCheckedBool(IDX_SETTINGS_SHOW_GRID);
281*f6dc9357SAndroid Build Coastguard Worker     st.SingleClick = IsButtonCheckedBool(IDX_SETTINGS_SINGLE_CLICK);
282*f6dc9357SAndroid Build Coastguard Worker     st.AlternativeSelection = IsButtonCheckedBool(IDX_SETTINGS_ALTERNATIVE_SELECTION);
283*f6dc9357SAndroid Build Coastguard Worker     // st.Underline = IsButtonCheckedBool(IDX_SETTINGS_UNDERLINE);
284*f6dc9357SAndroid Build Coastguard Worker 
285*f6dc9357SAndroid Build Coastguard Worker     st.ShowSystemMenu = IsButtonCheckedBool(IDX_SETTINGS_SHOW_SYSTEM_MENU);
286*f6dc9357SAndroid Build Coastguard Worker 
287*f6dc9357SAndroid Build Coastguard Worker     st.Save();
288*f6dc9357SAndroid Build Coastguard Worker     _wasChanged = false;
289*f6dc9357SAndroid Build Coastguard Worker   }
290*f6dc9357SAndroid Build Coastguard Worker 
291*f6dc9357SAndroid Build Coastguard Worker   #ifndef UNDER_CE
292*f6dc9357SAndroid Build Coastguard Worker   if (_largePages_wasChanged)
293*f6dc9357SAndroid Build Coastguard Worker   {
294*f6dc9357SAndroid Build Coastguard Worker     if (IsLargePageSupported())
295*f6dc9357SAndroid Build Coastguard Worker     {
296*f6dc9357SAndroid Build Coastguard Worker       const bool enable = IsButtonCheckedBool(IDX_SETTINGS_LARGE_PAGES);
297*f6dc9357SAndroid Build Coastguard Worker       NSecurity::EnablePrivilege_LockMemory(enable);
298*f6dc9357SAndroid Build Coastguard Worker       SaveLockMemoryEnable(enable);
299*f6dc9357SAndroid Build Coastguard Worker     }
300*f6dc9357SAndroid Build Coastguard Worker     _largePages_wasChanged = false;
301*f6dc9357SAndroid Build Coastguard Worker   }
302*f6dc9357SAndroid Build Coastguard Worker   #endif
303*f6dc9357SAndroid Build Coastguard Worker 
304*f6dc9357SAndroid Build Coastguard Worker   if (_memx_wasChanged)
305*f6dc9357SAndroid Build Coastguard Worker   {
306*f6dc9357SAndroid Build Coastguard Worker     UInt32 val = (UInt32)(Int32)-1;
307*f6dc9357SAndroid Build Coastguard Worker     if (IsButtonCheckedBool(IDX_SETTINGS_MEM_SET))
308*f6dc9357SAndroid Build Coastguard Worker     {
309*f6dc9357SAndroid Build Coastguard Worker       UString s;
310*f6dc9357SAndroid Build Coastguard Worker       GetItemText(IDE_SETTINGS_MEM_SPIN_EDIT, s);
311*f6dc9357SAndroid Build Coastguard Worker       const wchar_t *end;
312*f6dc9357SAndroid Build Coastguard Worker       val = ConvertStringToUInt32(s.Ptr(), &end);
313*f6dc9357SAndroid Build Coastguard Worker       if (s.IsEmpty() || *end != 0 || val > (1u << 30))
314*f6dc9357SAndroid Build Coastguard Worker       {
315*f6dc9357SAndroid Build Coastguard Worker         // L"Incorrect value"
316*f6dc9357SAndroid Build Coastguard Worker         ShowErrorMessage(*this, NError::MyFormatMessage(E_INVALIDARG));
317*f6dc9357SAndroid Build Coastguard Worker         return PSNRET_INVALID;
318*f6dc9357SAndroid Build Coastguard Worker       }
319*f6dc9357SAndroid Build Coastguard Worker     }
320*f6dc9357SAndroid Build Coastguard Worker     NExtract::Save_LimitGB(val);
321*f6dc9357SAndroid Build Coastguard Worker     _memx_wasChanged = false;
322*f6dc9357SAndroid Build Coastguard Worker   }
323*f6dc9357SAndroid Build Coastguard Worker 
324*f6dc9357SAndroid Build Coastguard Worker   /*
325*f6dc9357SAndroid Build Coastguard Worker   if (_wasChanged_MemLimit)
326*f6dc9357SAndroid Build Coastguard Worker   {
327*f6dc9357SAndroid Build Coastguard Worker     const unsigned index = (int)_memCombo.GetItemData_of_CurSel();
328*f6dc9357SAndroid Build Coastguard Worker     const UString str = _memLimitStrings[index];
329*f6dc9357SAndroid Build Coastguard Worker 
330*f6dc9357SAndroid Build Coastguard Worker     bool needSave = true;
331*f6dc9357SAndroid Build Coastguard Worker 
332*f6dc9357SAndroid Build Coastguard Worker     NCompression::CMemUse mu;
333*f6dc9357SAndroid Build Coastguard Worker 
334*f6dc9357SAndroid Build Coastguard Worker     if (_ramSize_Defined)
335*f6dc9357SAndroid Build Coastguard Worker       mu.Parse(str);
336*f6dc9357SAndroid Build Coastguard Worker     if (mu.IsDefined)
337*f6dc9357SAndroid Build Coastguard Worker     {
338*f6dc9357SAndroid Build Coastguard Worker       const UInt64 usage64 = mu.GetBytes(_ramSize);
339*f6dc9357SAndroid Build Coastguard Worker       if (_ramSize <= usage64)
340*f6dc9357SAndroid Build Coastguard Worker       {
341*f6dc9357SAndroid Build Coastguard Worker         UString s2 = LangString(IDT_COMPRESS_MEMORY);
342*f6dc9357SAndroid Build Coastguard Worker         if (s2.IsEmpty())
343*f6dc9357SAndroid Build Coastguard Worker           GetItemText(IDT_COMPRESS_MEMORY, s2);
344*f6dc9357SAndroid Build Coastguard Worker         UString s;
345*f6dc9357SAndroid Build Coastguard Worker 
346*f6dc9357SAndroid Build Coastguard Worker         s += "The selected value is not safe for system performance.";
347*f6dc9357SAndroid Build Coastguard Worker         s.Add_LF();
348*f6dc9357SAndroid Build Coastguard Worker         s += "The memory consumption for compression operation will exceed RAM size.";
349*f6dc9357SAndroid Build Coastguard Worker         s.Add_LF();
350*f6dc9357SAndroid Build Coastguard Worker         s.Add_LF();
351*f6dc9357SAndroid Build Coastguard Worker         AddSize_MB(s, usage64);
352*f6dc9357SAndroid Build Coastguard Worker 
353*f6dc9357SAndroid Build Coastguard Worker         if (!s2.IsEmpty())
354*f6dc9357SAndroid Build Coastguard Worker         {
355*f6dc9357SAndroid Build Coastguard Worker           s += " : ";
356*f6dc9357SAndroid Build Coastguard Worker           s += s2;
357*f6dc9357SAndroid Build Coastguard Worker         }
358*f6dc9357SAndroid Build Coastguard Worker 
359*f6dc9357SAndroid Build Coastguard Worker         s.Add_LF();
360*f6dc9357SAndroid Build Coastguard Worker         AddSize_MB(s, _ramSize);
361*f6dc9357SAndroid Build Coastguard Worker         s += " : RAM";
362*f6dc9357SAndroid Build Coastguard Worker 
363*f6dc9357SAndroid Build Coastguard Worker         s.Add_LF();
364*f6dc9357SAndroid Build Coastguard Worker         s.Add_LF();
365*f6dc9357SAndroid Build Coastguard Worker         s += "Are you sure you want set that unsafe value for memory usage?";
366*f6dc9357SAndroid Build Coastguard Worker 
367*f6dc9357SAndroid Build Coastguard Worker         int res = MessageBoxW(*this, s, L"7-Zip", MB_YESNOCANCEL | MB_ICONQUESTION);
368*f6dc9357SAndroid Build Coastguard Worker         if (res != IDYES)
369*f6dc9357SAndroid Build Coastguard Worker           needSave = false;
370*f6dc9357SAndroid Build Coastguard Worker       }
371*f6dc9357SAndroid Build Coastguard Worker     }
372*f6dc9357SAndroid Build Coastguard Worker 
373*f6dc9357SAndroid Build Coastguard Worker     if (needSave)
374*f6dc9357SAndroid Build Coastguard Worker     {
375*f6dc9357SAndroid Build Coastguard Worker       NCompression::MemLimit_Save(str);
376*f6dc9357SAndroid Build Coastguard Worker       _wasChanged_MemLimit = false;
377*f6dc9357SAndroid Build Coastguard Worker     }
378*f6dc9357SAndroid Build Coastguard Worker     else
379*f6dc9357SAndroid Build Coastguard Worker       return PSNRET_INVALID_NOCHANGEPAGE;
380*f6dc9357SAndroid Build Coastguard Worker   }
381*f6dc9357SAndroid Build Coastguard Worker   */
382*f6dc9357SAndroid Build Coastguard Worker 
383*f6dc9357SAndroid Build Coastguard Worker   return PSNRET_NOERROR;
384*f6dc9357SAndroid Build Coastguard Worker }
385*f6dc9357SAndroid Build Coastguard Worker 
OnNotifyHelp()386*f6dc9357SAndroid Build Coastguard Worker void CSettingsPage::OnNotifyHelp()
387*f6dc9357SAndroid Build Coastguard Worker {
388*f6dc9357SAndroid Build Coastguard Worker   ShowHelpWindow(kSettingsTopic);
389*f6dc9357SAndroid Build Coastguard Worker }
390*f6dc9357SAndroid Build Coastguard Worker 
OnCommand(unsigned code,unsigned itemID,LPARAM param)391*f6dc9357SAndroid Build Coastguard Worker bool CSettingsPage::OnCommand(unsigned code, unsigned itemID, LPARAM param)
392*f6dc9357SAndroid Build Coastguard Worker {
393*f6dc9357SAndroid Build Coastguard Worker   if (!_initMode)
394*f6dc9357SAndroid Build Coastguard Worker   {
395*f6dc9357SAndroid Build Coastguard Worker     if (code == EN_CHANGE && itemID == IDE_SETTINGS_MEM_SPIN_EDIT)
396*f6dc9357SAndroid Build Coastguard Worker     {
397*f6dc9357SAndroid Build Coastguard Worker       _memx_wasChanged = true;
398*f6dc9357SAndroid Build Coastguard Worker       Changed();
399*f6dc9357SAndroid Build Coastguard Worker     }
400*f6dc9357SAndroid Build Coastguard Worker     /*
401*f6dc9357SAndroid Build Coastguard Worker     if (code == CBN_SELCHANGE)
402*f6dc9357SAndroid Build Coastguard Worker     {
403*f6dc9357SAndroid Build Coastguard Worker       switch (itemID)
404*f6dc9357SAndroid Build Coastguard Worker       {
405*f6dc9357SAndroid Build Coastguard Worker         case IDC_SETTINGS_MEM:
406*f6dc9357SAndroid Build Coastguard Worker         {
407*f6dc9357SAndroid Build Coastguard Worker           _wasChanged_MemLimit = true;
408*f6dc9357SAndroid Build Coastguard Worker           Changed();
409*f6dc9357SAndroid Build Coastguard Worker           break;
410*f6dc9357SAndroid Build Coastguard Worker         }
411*f6dc9357SAndroid Build Coastguard Worker       }
412*f6dc9357SAndroid Build Coastguard Worker     }
413*f6dc9357SAndroid Build Coastguard Worker     */
414*f6dc9357SAndroid Build Coastguard Worker   }
415*f6dc9357SAndroid Build Coastguard Worker   return CPropertyPage::OnCommand(code, itemID, param);
416*f6dc9357SAndroid Build Coastguard Worker }
417*f6dc9357SAndroid Build Coastguard Worker 
OnButtonClicked(unsigned buttonID,HWND buttonHWND)418*f6dc9357SAndroid Build Coastguard Worker bool CSettingsPage::OnButtonClicked(unsigned buttonID, HWND buttonHWND)
419*f6dc9357SAndroid Build Coastguard Worker {
420*f6dc9357SAndroid Build Coastguard Worker   switch (buttonID)
421*f6dc9357SAndroid Build Coastguard Worker   {
422*f6dc9357SAndroid Build Coastguard Worker     case IDX_SETTINGS_SINGLE_CLICK:
423*f6dc9357SAndroid Build Coastguard Worker     /*
424*f6dc9357SAndroid Build Coastguard Worker       EnableSubItems();
425*f6dc9357SAndroid Build Coastguard Worker       break;
426*f6dc9357SAndroid Build Coastguard Worker     */
427*f6dc9357SAndroid Build Coastguard Worker     case IDX_SETTINGS_SHOW_DOTS:
428*f6dc9357SAndroid Build Coastguard Worker     case IDX_SETTINGS_SHOW_SYSTEM_MENU:
429*f6dc9357SAndroid Build Coastguard Worker     case IDX_SETTINGS_SHOW_REAL_FILE_ICONS:
430*f6dc9357SAndroid Build Coastguard Worker     case IDX_SETTINGS_FULL_ROW:
431*f6dc9357SAndroid Build Coastguard Worker     case IDX_SETTINGS_SHOW_GRID:
432*f6dc9357SAndroid Build Coastguard Worker     case IDX_SETTINGS_ALTERNATIVE_SELECTION:
433*f6dc9357SAndroid Build Coastguard Worker       _wasChanged = true;
434*f6dc9357SAndroid Build Coastguard Worker       break;
435*f6dc9357SAndroid Build Coastguard Worker 
436*f6dc9357SAndroid Build Coastguard Worker     case IDX_SETTINGS_LARGE_PAGES:
437*f6dc9357SAndroid Build Coastguard Worker       _largePages_wasChanged = true;
438*f6dc9357SAndroid Build Coastguard Worker       break;
439*f6dc9357SAndroid Build Coastguard Worker 
440*f6dc9357SAndroid Build Coastguard Worker     case IDX_SETTINGS_MEM_SET:
441*f6dc9357SAndroid Build Coastguard Worker     {
442*f6dc9357SAndroid Build Coastguard Worker       _memx_wasChanged = true;
443*f6dc9357SAndroid Build Coastguard Worker       EnableSpin(IsButtonCheckedBool(IDX_SETTINGS_MEM_SET));
444*f6dc9357SAndroid Build Coastguard Worker       break;
445*f6dc9357SAndroid Build Coastguard Worker     }
446*f6dc9357SAndroid Build Coastguard Worker 
447*f6dc9357SAndroid Build Coastguard Worker     default:
448*f6dc9357SAndroid Build Coastguard Worker       return CPropertyPage::OnButtonClicked(buttonID, buttonHWND);
449*f6dc9357SAndroid Build Coastguard Worker   }
450*f6dc9357SAndroid Build Coastguard Worker 
451*f6dc9357SAndroid Build Coastguard Worker   Changed();
452*f6dc9357SAndroid Build Coastguard Worker   return true;
453*f6dc9357SAndroid Build Coastguard Worker }
454