tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

ExtractDialog.cpp (9880B)


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