421 lines
9.3 KiB
C++
421 lines
9.3 KiB
C++
// 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.AddAscii(" : ");
|
|
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
|
|
|
|
#ifdef _WIN32
|
|
HICON icon = LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_ICON));
|
|
SetIcon(ICON_BIG, icon);
|
|
#endif
|
|
|
|
// 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
|
|
static LPCWSTR kHelpTopic = L"fm/plugins/7-zip/extract.htm";
|
|
void CExtractDialog::OnHelp()
|
|
{
|
|
ShowHelpWindow(NULL, kHelpTopic);
|
|
CModalDialog::OnHelp();
|
|
}
|
|
#endif
|