1 // ExtractDialog.cpp
2
3 #include "StdAfx.h"
4
5 #include "../../../Common/StringConvert.h"
6 #include "../../../Common/Wildcard.h"
7
8 #include "../../../Windows/FileName.h"
9 #include "../../../Windows/FileDir.h"
10 #include "../../../Windows/ResourceString.h"
11
12 #ifndef Z7_NO_REGISTRY
13 #include "../FileManager/HelpUtils.h"
14 #endif
15
16
17 #include "../FileManager/BrowseDialog.h"
18 #include "../FileManager/LangUtils.h"
19 #include "../FileManager/resourceGui.h"
20
21 #include "ExtractDialog.h"
22 #include "ExtractDialogRes.h"
23 #include "ExtractRes.h"
24
25 using namespace NWindows;
26 using namespace NFile;
27 using namespace NName;
28
29 extern HINSTANCE g_hInstance;
30
31 #ifndef Z7_SFX
32
33 static const UInt32 kPathMode_IDs[] =
34 {
35 IDS_EXTRACT_PATHS_FULL,
36 IDS_EXTRACT_PATHS_NO,
37 IDS_EXTRACT_PATHS_ABS
38 };
39
40 static const UInt32 kOverwriteMode_IDs[] =
41 {
42 IDS_EXTRACT_OVERWRITE_ASK,
43 IDS_EXTRACT_OVERWRITE_WITHOUT_PROMPT,
44 IDS_EXTRACT_OVERWRITE_SKIP_EXISTING,
45 IDS_EXTRACT_OVERWRITE_RENAME,
46 IDS_EXTRACT_OVERWRITE_RENAME_EXISTING
47 };
48
49 static const
50 // NExtract::NPathMode::EEnum
51 int
52 kPathModeButtonsVals[] =
53 {
54 NExtract::NPathMode::kFullPaths,
55 NExtract::NPathMode::kNoPaths,
56 NExtract::NPathMode::kAbsPaths
57 };
58
59 static const
60 int
61 // NExtract::NOverwriteMode::EEnum
62 kOverwriteButtonsVals[] =
63 {
64 NExtract::NOverwriteMode::kAsk,
65 NExtract::NOverwriteMode::kOverwrite,
66 NExtract::NOverwriteMode::kSkip,
67 NExtract::NOverwriteMode::kRename,
68 NExtract::NOverwriteMode::kRenameExisting
69 };
70
71 #endif
72
73 #ifdef Z7_LANG
74
75 static const UInt32 kLangIDs[] =
76 {
77 IDT_EXTRACT_EXTRACT_TO,
78 IDT_EXTRACT_PATH_MODE,
79 IDT_EXTRACT_OVERWRITE_MODE,
80 // IDX_EXTRACT_ALT_STREAMS,
81 IDX_EXTRACT_NT_SECUR,
82 IDX_EXTRACT_ELIM_DUP,
83 IDG_PASSWORD,
84 IDX_PASSWORD_SHOW
85 };
86 #endif
87
88 // static const int kWildcardsButtonIndex = 2;
89
90 #ifndef Z7_NO_REGISTRY
91 static const unsigned kHistorySize = 16;
92 #endif
93
94 #ifndef Z7_SFX
95
96 // it's used in CompressDialog also
97 void AddComboItems(NControl::CComboBox &combo, const UInt32 *langIDs, unsigned numItems, const int *values, int curVal);
AddComboItems(NControl::CComboBox & combo,const UInt32 * langIDs,unsigned numItems,const int * values,int curVal)98 void AddComboItems(NControl::CComboBox &combo, const UInt32 *langIDs, unsigned numItems, const int *values, int curVal)
99 {
100 unsigned curSel = 0;
101 for (unsigned i = 0; i < numItems; i++)
102 {
103 UString s = LangString(langIDs[i]);
104 s.RemoveChar(L'&');
105 const int index = (int)combo.AddString(s);
106 combo.SetItemData(index, (LPARAM)i);
107 if (values[i] == curVal)
108 curSel = i;
109 }
110 combo.SetCurSel(curSel);
111 }
112
113 // it's used in CompressDialog also
114 bool GetBoolsVal(const CBoolPair &b1, const CBoolPair &b2);
GetBoolsVal(const CBoolPair & b1,const CBoolPair & b2)115 bool GetBoolsVal(const CBoolPair &b1, const CBoolPair &b2)
116 {
117 if (b1.Def) return b1.Val;
118 if (b2.Def) return b2.Val;
119 return b1.Val;
120 }
121
CheckButton_TwoBools(UINT id,const CBoolPair & b1,const CBoolPair & b2)122 void CExtractDialog::CheckButton_TwoBools(UINT id, const CBoolPair &b1, const CBoolPair &b2)
123 {
124 CheckButton(id, GetBoolsVal(b1, b2));
125 }
126
GetButton_Bools(UINT id,CBoolPair & b1,CBoolPair & b2)127 void CExtractDialog::GetButton_Bools(UINT id, CBoolPair &b1, CBoolPair &b2)
128 {
129 const bool val = IsButtonCheckedBool(id);
130 const bool oldVal = GetBoolsVal(b1, b2);
131 if (val != oldVal)
132 b1.Def = b2.Def = true;
133 b1.Val = b2.Val = val;
134 }
135
136 #endif
137
OnInit()138 bool CExtractDialog::OnInit()
139 {
140 #ifdef Z7_LANG
141 {
142 UString s;
143 LangString_OnlyFromLangFile(IDD_EXTRACT, s);
144 if (s.IsEmpty())
145 GetText(s);
146 if (!ArcPath.IsEmpty())
147 {
148 s += " : ";
149 s += ArcPath;
150 }
151 SetText(s);
152 // LangSetWindowText(*this, IDD_EXTRACT);
153 LangSetDlgItems(*this, kLangIDs, Z7_ARRAY_SIZE(kLangIDs));
154 }
155 #endif
156
157 #ifndef Z7_SFX
158 _passwordControl.Attach(GetItem(IDE_EXTRACT_PASSWORD));
159 _passwordControl.SetText(Password);
160 _passwordControl.SetPasswordChar(TEXT('*'));
161 _pathName.Attach(GetItem(IDE_EXTRACT_NAME));
162 #endif
163
164 #ifdef Z7_NO_REGISTRY
165
166 PathMode = NExtract::NPathMode::kFullPaths;
167 OverwriteMode = NExtract::NOverwriteMode::kAsk;
168
169 #else
170
171 _info.Load();
172
173 if (_info.PathMode == NExtract::NPathMode::kCurPaths)
174 _info.PathMode = NExtract::NPathMode::kFullPaths;
175
176 if (!PathMode_Force && _info.PathMode_Force)
177 PathMode = _info.PathMode;
178 if (!OverwriteMode_Force && _info.OverwriteMode_Force)
179 OverwriteMode = _info.OverwriteMode;
180
181 // CheckButton_TwoBools(IDX_EXTRACT_ALT_STREAMS, AltStreams, _info.AltStreams);
182 CheckButton_TwoBools(IDX_EXTRACT_NT_SECUR, NtSecurity, _info.NtSecurity);
183 CheckButton_TwoBools(IDX_EXTRACT_ELIM_DUP, ElimDup, _info.ElimDup);
184
185 CheckButton(IDX_PASSWORD_SHOW, _info.ShowPassword.Val);
186 UpdatePasswordControl();
187
188 #endif
189
190 _path.Attach(GetItem(IDC_EXTRACT_PATH));
191
192 UString pathPrefix = DirPath;
193
194 #ifndef Z7_SFX
195
196 if (_info.SplitDest.Val)
197 {
198 CheckButton(IDX_EXTRACT_NAME_ENABLE, true);
199 UString pathName;
200 SplitPathToParts_Smart(DirPath, pathPrefix, pathName);
201 if (pathPrefix.IsEmpty())
202 pathPrefix = pathName;
203 else
204 _pathName.SetText(pathName);
205 }
206 else
207 ShowItem_Bool(IDE_EXTRACT_NAME, false);
208
209 #endif
210
211 _path.SetText(pathPrefix);
212
213 #ifndef Z7_NO_REGISTRY
214 for (unsigned i = 0; i < _info.Paths.Size() && i < kHistorySize; i++)
215 _path.AddString(_info.Paths[i]);
216 #endif
217
218 /*
219 if (_info.Paths.Size() > 0)
220 _path.SetCurSel(0);
221 else
222 _path.SetCurSel(-1);
223 */
224
225 #ifndef Z7_SFX
226
227 _pathMode.Attach(GetItem(IDC_EXTRACT_PATH_MODE));
228 _overwriteMode.Attach(GetItem(IDC_EXTRACT_OVERWRITE_MODE));
229
230 AddComboItems(_pathMode, kPathMode_IDs, Z7_ARRAY_SIZE(kPathMode_IDs), kPathModeButtonsVals, PathMode);
231 AddComboItems(_overwriteMode, kOverwriteMode_IDs, Z7_ARRAY_SIZE(kOverwriteMode_IDs), kOverwriteButtonsVals, OverwriteMode);
232
233 #endif
234
235 HICON icon = LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_ICON));
236 SetIcon(ICON_BIG, icon);
237
238 // CWindow filesWindow = GetItem(IDC_EXTRACT_RADIO_FILES);
239 // filesWindow.Enable(_enableFilesButton);
240
241 NormalizePosition();
242
243 return CModalDialog::OnInit();
244 }
245
246 #ifndef Z7_SFX
UpdatePasswordControl()247 void CExtractDialog::UpdatePasswordControl()
248 {
249 _passwordControl.SetPasswordChar(IsShowPasswordChecked() ? 0 : TEXT('*'));
250 UString password;
251 _passwordControl.GetText(password);
252 _passwordControl.SetText(password);
253 }
254 #endif
255
OnButtonClicked(unsigned buttonID,HWND buttonHWND)256 bool CExtractDialog::OnButtonClicked(unsigned buttonID, HWND buttonHWND)
257 {
258 switch (buttonID)
259 {
260 case IDB_EXTRACT_SET_PATH:
261 OnButtonSetPath();
262 return true;
263 #ifndef Z7_SFX
264 case IDX_EXTRACT_NAME_ENABLE:
265 ShowItem_Bool(IDE_EXTRACT_NAME, IsButtonCheckedBool(IDX_EXTRACT_NAME_ENABLE));
266 return true;
267 case IDX_PASSWORD_SHOW:
268 {
269 UpdatePasswordControl();
270 return true;
271 }
272 #endif
273 }
274 return CModalDialog::OnButtonClicked(buttonID, buttonHWND);
275 }
276
OnButtonSetPath()277 void CExtractDialog::OnButtonSetPath()
278 {
279 UString currentPath;
280 _path.GetText(currentPath);
281 UString title = LangString(IDS_EXTRACT_SET_FOLDER);
282 UString resultPath;
283 if (!MyBrowseForFolder(*this, title, currentPath, resultPath))
284 return;
285 #ifndef Z7_NO_REGISTRY
286 _path.SetCurSel(-1);
287 #endif
288 _path.SetText(resultPath);
289 }
290
291 void AddUniqueString(UStringVector &list, const UString &s);
AddUniqueString(UStringVector & list,const UString & s)292 void AddUniqueString(UStringVector &list, const UString &s)
293 {
294 FOR_VECTOR (i, list)
295 if (s.IsEqualTo_NoCase(list[i]))
296 return;
297 list.Add(s);
298 }
299
OnOK()300 void CExtractDialog::OnOK()
301 {
302 #ifndef Z7_SFX
303 int pathMode2 = kPathModeButtonsVals[_pathMode.GetCurSel()];
304 if (PathMode != NExtract::NPathMode::kCurPaths ||
305 pathMode2 != NExtract::NPathMode::kFullPaths)
306 PathMode = (NExtract::NPathMode::EEnum)pathMode2;
307
308 OverwriteMode = (NExtract::NOverwriteMode::EEnum)kOverwriteButtonsVals[_overwriteMode.GetCurSel()];
309
310 // _filesMode = (NExtractionDialog::NFilesMode::EEnum)GetFilesMode();
311
312 _passwordControl.GetText(Password);
313
314 #endif
315
316 #ifndef Z7_NO_REGISTRY
317
318 // GetButton_Bools(IDX_EXTRACT_ALT_STREAMS, AltStreams, _info.AltStreams);
319 GetButton_Bools(IDX_EXTRACT_NT_SECUR, NtSecurity, _info.NtSecurity);
320 GetButton_Bools(IDX_EXTRACT_ELIM_DUP, ElimDup, _info.ElimDup);
321
322 bool showPassword = IsShowPasswordChecked();
323 if (showPassword != _info.ShowPassword.Val)
324 {
325 _info.ShowPassword.Def = true;
326 _info.ShowPassword.Val = showPassword;
327 }
328
329 if (_info.PathMode != pathMode2)
330 {
331 _info.PathMode_Force = true;
332 _info.PathMode = (NExtract::NPathMode::EEnum)pathMode2;
333 /*
334 // we allow kAbsPaths in registry.
335 if (_info.PathMode == NExtract::NPathMode::kAbsPaths)
336 _info.PathMode = NExtract::NPathMode::kFullPaths;
337 */
338 }
339
340 if (!OverwriteMode_Force && _info.OverwriteMode != OverwriteMode)
341 _info.OverwriteMode_Force = true;
342 _info.OverwriteMode = OverwriteMode;
343
344
345 #else
346
347 ElimDup.Val = IsButtonCheckedBool(IDX_EXTRACT_ELIM_DUP);
348
349 #endif
350
351 UString s;
352
353 #ifdef Z7_NO_REGISTRY
354
355 _path.GetText(s);
356
357 #else
358
359 int currentItem = _path.GetCurSel();
360 if (currentItem == CB_ERR)
361 {
362 _path.GetText(s);
363 if (_path.GetCount() >= (int)kHistorySize)
364 currentItem = _path.GetCount() - 1;
365 }
366 else
367 _path.GetLBText(currentItem, s);
368
369 #endif
370
371 s.Trim();
372 NName::NormalizeDirPathPrefix(s);
373
374 #ifndef Z7_SFX
375
376 const bool splitDest = IsButtonCheckedBool(IDX_EXTRACT_NAME_ENABLE);
377 if (splitDest)
378 {
379 UString pathName;
380 _pathName.GetText(pathName);
381 pathName.Trim();
382 s += pathName;
383 NName::NormalizeDirPathPrefix(s);
384 }
385 if (splitDest != _info.SplitDest.Val)
386 {
387 _info.SplitDest.Def = true;
388 _info.SplitDest.Val = splitDest;
389 }
390
391 #endif
392
393 DirPath = s;
394
395 #ifndef Z7_NO_REGISTRY
396 _info.Paths.Clear();
397 #ifndef Z7_SFX
398 AddUniqueString(_info.Paths, s);
399 #endif
400 for (int i = 0; i < _path.GetCount(); i++)
401 if (i != currentItem)
402 {
403 UString sTemp;
404 _path.GetLBText(i, sTemp);
405 sTemp.Trim();
406 AddUniqueString(_info.Paths, sTemp);
407 }
408 _info.Save();
409 #endif
410
411 CModalDialog::OnOK();
412 }
413
414 #ifndef Z7_NO_REGISTRY
415 #define kHelpTopic "fm/plugins/7-zip/extract.htm"
OnHelp()416 void CExtractDialog::OnHelp()
417 {
418 ShowHelpWindow(kHelpTopic);
419 CModalDialog::OnHelp();
420 }
421 #endif
422