// ExtractDialog.cpp #include "StdAfx.h" #include "../../../Common/StringConvert.h" #include "../../../Common/Wildcard.h" #include "../../../Windows/FileName.h" #include "../../../Windows/FileDir.h" #include "../../../Windows/ResourceString.h" #ifndef NO_REGISTRY #include "../FileManager/HelpUtils.h" #endif #include "../FileManager/BrowseDialog.h" #include "../FileManager/LangUtils.h" #include "../FileManager/resourceGui.h" #include "ExtractDialog.h" #include "ExtractDialogRes.h" #include "ExtractRes.h" using namespace NWindows; using namespace NFile; using namespace NName; extern HINSTANCE g_hInstance; static const UInt32 kPathMode_IDs[] = { IDS_EXTRACT_PATHS_FULL, IDS_EXTRACT_PATHS_NO, IDS_EXTRACT_PATHS_ABS }; static const UInt32 kOverwriteMode_IDs[] = { IDS_EXTRACT_OVERWRITE_ASK, IDS_EXTRACT_OVERWRITE_WITHOUT_PROMPT, IDS_EXTRACT_OVERWRITE_SKIP_EXISTING, IDS_EXTRACT_OVERWRITE_RENAME, IDS_EXTRACT_OVERWRITE_RENAME_EXISTING }; #ifndef _SFX static const // NExtract::NPathMode::EEnum int kPathModeButtonsVals[] = { NExtract::NPathMode::kFullPaths, NExtract::NPathMode::kNoPaths, NExtract::NPathMode::kAbsPaths }; static const int // NExtract::NOverwriteMode::EEnum kOverwriteButtonsVals[] = { NExtract::NOverwriteMode::kAsk, NExtract::NOverwriteMode::kOverwrite, NExtract::NOverwriteMode::kSkip, NExtract::NOverwriteMode::kRename, NExtract::NOverwriteMode::kRenameExisting }; #endif #ifdef LANG static const UInt32 kLangIDs[] = { IDT_EXTRACT_EXTRACT_TO, IDT_EXTRACT_PATH_MODE, IDT_EXTRACT_OVERWRITE_MODE, // IDX_EXTRACT_ALT_STREAMS, IDX_EXTRACT_NT_SECUR, IDX_EXTRACT_ELIM_DUP, IDG_PASSWORD, IDX_PASSWORD_SHOW }; #endif // static const int kWildcardsButtonIndex = 2; #ifndef NO_REGISTRY static const unsigned kHistorySize = 16; #endif #ifndef _SFX // it's used in CompressDialog also void AddComboItems(NControl::CComboBox &combo, const UInt32 *langIDs, unsigned numItems, const int *values, int curVal) { int curSel = 0; for (unsigned i = 0; i < numItems; i++) { UString s = LangString(langIDs[i]); s.RemoveChar(L'&'); int index = (int)combo.AddString(s); combo.SetItemData(index, i); if (values[i] == curVal) curSel = i; } combo.SetCurSel(curSel); } // it's used in CompressDialog also bool GetBoolsVal(const CBoolPair &b1, const CBoolPair &b2) { if (b1.Def) return b1.Val; if (b2.Def) return b2.Val; return b1.Val; } void CExtractDialog::CheckButton_TwoBools(UINT id, const CBoolPair &b1, const CBoolPair &b2) { CheckButton(id, GetBoolsVal(b1, b2)); } void CExtractDialog::GetButton_Bools(UINT id, CBoolPair &b1, CBoolPair &b2) { bool val = IsButtonCheckedBool(id); bool oldVal = GetBoolsVal(b1, b2); if (val != oldVal) b1.Def = b2.Def = true; b1.Val = b2.Val = val; } #endif bool CExtractDialog::OnInit() { #ifdef LANG { UString s; LangString_OnlyFromLangFile(IDD_EXTRACT, s); if (s.IsEmpty()) GetText(s); if (!ArcPath.IsEmpty()) { s += " : "; s += ArcPath; } SetText(s); // LangSetWindowText(*this, IDD_EXTRACT); LangSetDlgItems(*this, kLangIDs, ARRAY_SIZE(kLangIDs)); } #endif #ifndef _SFX _passwordControl.Attach(GetItem(IDE_EXTRACT_PASSWORD)); _passwordControl.SetText(Password); _passwordControl.SetPasswordChar(TEXT('*')); _pathName.Attach(GetItem(IDE_EXTRACT_NAME)); #endif #ifdef NO_REGISTRY PathMode = NExtract::NPathMode::kFullPaths; OverwriteMode = NExtract::NOverwriteMode::kAsk; #else _info.Load(); if (_info.PathMode == NExtract::NPathMode::kCurPaths) _info.PathMode = NExtract::NPathMode::kFullPaths; if (!PathMode_Force && _info.PathMode_Force) PathMode = _info.PathMode; if (!OverwriteMode_Force && _info.OverwriteMode_Force) OverwriteMode = _info.OverwriteMode; // CheckButton_TwoBools(IDX_EXTRACT_ALT_STREAMS, AltStreams, _info.AltStreams); CheckButton_TwoBools(IDX_EXTRACT_NT_SECUR, NtSecurity, _info.NtSecurity); CheckButton_TwoBools(IDX_EXTRACT_ELIM_DUP, ElimDup, _info.ElimDup); CheckButton(IDX_PASSWORD_SHOW, _info.ShowPassword.Val); UpdatePasswordControl(); #endif _path.Attach(GetItem(IDC_EXTRACT_PATH)); UString pathPrefix = DirPath; #ifndef _SFX if (_info.SplitDest.Val) { CheckButton(IDX_EXTRACT_NAME_ENABLE, true); UString pathName; SplitPathToParts_Smart(DirPath, pathPrefix, pathName); if (pathPrefix.IsEmpty()) pathPrefix = pathName; else _pathName.SetText(pathName); } else ShowItem_Bool(IDE_EXTRACT_NAME, false); #endif _path.SetText(pathPrefix); #ifndef NO_REGISTRY for (unsigned i = 0; i < _info.Paths.Size() && i < kHistorySize; i++) _path.AddString(_info.Paths[i]); #endif /* if (_info.Paths.Size() > 0) _path.SetCurSel(0); else _path.SetCurSel(-1); */ #ifndef _SFX _pathMode.Attach(GetItem(IDC_EXTRACT_PATH_MODE)); _overwriteMode.Attach(GetItem(IDC_EXTRACT_OVERWRITE_MODE)); AddComboItems(_pathMode, kPathMode_IDs, ARRAY_SIZE(kPathMode_IDs), kPathModeButtonsVals, PathMode); AddComboItems(_overwriteMode, kOverwriteMode_IDs, ARRAY_SIZE(kOverwriteMode_IDs), kOverwriteButtonsVals, OverwriteMode); #endif HICON icon = LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_ICON)); SetIcon(ICON_BIG, icon); // CWindow filesWindow = GetItem(IDC_EXTRACT_RADIO_FILES); // filesWindow.Enable(_enableFilesButton); NormalizePosition(); return CModalDialog::OnInit(); } #ifndef _SFX void CExtractDialog::UpdatePasswordControl() { _passwordControl.SetPasswordChar(IsShowPasswordChecked() ? 0 : TEXT('*')); UString password; _passwordControl.GetText(password); _passwordControl.SetText(password); } #endif bool CExtractDialog::OnButtonClicked(int buttonID, HWND buttonHWND) { switch (buttonID) { case IDB_EXTRACT_SET_PATH: OnButtonSetPath(); return true; #ifndef _SFX case IDX_EXTRACT_NAME_ENABLE: ShowItem_Bool(IDE_EXTRACT_NAME, IsButtonCheckedBool(IDX_EXTRACT_NAME_ENABLE)); return true; case IDX_PASSWORD_SHOW: { UpdatePasswordControl(); return true; } #endif } return CModalDialog::OnButtonClicked(buttonID, buttonHWND); } void CExtractDialog::OnButtonSetPath() { UString currentPath; _path.GetText(currentPath); UString title = LangString(IDS_EXTRACT_SET_FOLDER); UString resultPath; if (!MyBrowseForFolder(*this, title, currentPath, resultPath)) return; #ifndef NO_REGISTRY _path.SetCurSel(-1); #endif _path.SetText(resultPath); } void AddUniqueString(UStringVector &list, const UString &s) { FOR_VECTOR (i, list) if (s.IsEqualTo_NoCase(list[i])) return; list.Add(s); } void CExtractDialog::OnOK() { #ifndef _SFX int pathMode2 = kPathModeButtonsVals[_pathMode.GetCurSel()]; if (PathMode != NExtract::NPathMode::kCurPaths || pathMode2 != NExtract::NPathMode::kFullPaths) PathMode = (NExtract::NPathMode::EEnum)pathMode2; OverwriteMode = (NExtract::NOverwriteMode::EEnum)kOverwriteButtonsVals[_overwriteMode.GetCurSel()]; // _filesMode = (NExtractionDialog::NFilesMode::EEnum)GetFilesMode(); _passwordControl.GetText(Password); #endif #ifndef NO_REGISTRY // GetButton_Bools(IDX_EXTRACT_ALT_STREAMS, AltStreams, _info.AltStreams); GetButton_Bools(IDX_EXTRACT_NT_SECUR, NtSecurity, _info.NtSecurity); GetButton_Bools(IDX_EXTRACT_ELIM_DUP, ElimDup, _info.ElimDup); bool showPassword = IsShowPasswordChecked(); if (showPassword != _info.ShowPassword.Val) { _info.ShowPassword.Def = true; _info.ShowPassword.Val = showPassword; } if (_info.PathMode != pathMode2) { _info.PathMode_Force = true; _info.PathMode = (NExtract::NPathMode::EEnum)pathMode2; /* // we allow kAbsPaths in registry. if (_info.PathMode == NExtract::NPathMode::kAbsPaths) _info.PathMode = NExtract::NPathMode::kFullPaths; */ } if (!OverwriteMode_Force && _info.OverwriteMode != OverwriteMode) _info.OverwriteMode_Force = true; _info.OverwriteMode = OverwriteMode; #else ElimDup.Val = IsButtonCheckedBool(IDX_EXTRACT_ELIM_DUP); #endif UString s; #ifdef NO_REGISTRY _path.GetText(s); #else int currentItem = _path.GetCurSel(); if (currentItem == CB_ERR) { _path.GetText(s); if (_path.GetCount() >= kHistorySize) currentItem = _path.GetCount() - 1; } else _path.GetLBText(currentItem, s); #endif s.Trim(); NName::NormalizeDirPathPrefix(s); #ifndef _SFX bool splitDest = IsButtonCheckedBool(IDX_EXTRACT_NAME_ENABLE); if (splitDest) { UString pathName; _pathName.GetText(pathName); pathName.Trim(); s += pathName; NName::NormalizeDirPathPrefix(s); } if (splitDest != _info.SplitDest.Val) { _info.SplitDest.Def = true; _info.SplitDest.Val = splitDest; } #endif DirPath = s; #ifndef NO_REGISTRY _info.Paths.Clear(); #ifndef _SFX AddUniqueString(_info.Paths, s); #endif for (int i = 0; i < _path.GetCount(); i++) if (i != currentItem) { UString sTemp; _path.GetLBText(i, sTemp); sTemp.Trim(); AddUniqueString(_info.Paths, sTemp); } _info.Save(); #endif CModalDialog::OnOK(); } #ifndef NO_REGISTRY #define kHelpTopic "fm/plugins/7-zip/extract.htm" void CExtractDialog::OnHelp() { ShowHelpWindow(kHelpTopic); CModalDialog::OnHelp(); } #endif