Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/kornelski/7z.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'CPP/7zip/UI/FileManager/App.cpp')
-rw-r--r--[-rwxr-xr-x]CPP/7zip/UI/FileManager/App.cpp284
1 files changed, 151 insertions, 133 deletions
diff --git a/CPP/7zip/UI/FileManager/App.cpp b/CPP/7zip/UI/FileManager/App.cpp
index 5f31f607..51c8d2db 100755..100644
--- a/CPP/7zip/UI/FileManager/App.cpp
+++ b/CPP/7zip/UI/FileManager/App.cpp
@@ -5,17 +5,17 @@
#include "resource.h"
#include "OverwriteDialogRes.h"
-#include "Common/IntToString.h"
-#include "Common/StringConvert.h"
+#include "../../../Windows/FileName.h"
+#include "../../../Windows/PropVariantConv.h"
+/*
#include "Windows/COM.h"
#include "Windows/Error.h"
#include "Windows/FileDir.h"
-#include "Windows/FileName.h"
#include "Windows/PropVariant.h"
-#include "Windows/PropVariantConversions.h"
#include "Windows/Thread.h"
+*/
#include "App.h"
#include "CopyDialog.h"
@@ -26,9 +26,13 @@
#include "RegistryUtils.h"
#include "ViewSettings.h"
+#include "PropertyNameRes.h"
+
using namespace NWindows;
using namespace NFile;
+using namespace NDir;
using namespace NFind;
+using namespace NName;
extern DWORD g_ComCtl32Version;
extern HINSTANCE g_hInstance;
@@ -61,6 +65,11 @@ void CPanelCallbackImp::DragBegin() { _app->DragBegin(_index); }
void CPanelCallbackImp::DragEnd() { _app->DragEnd(); }
void CPanelCallbackImp::RefreshTitle(bool always) { _app->RefreshTitle(_index, always); }
+void CApp::ReloadLang()
+{
+ LangString(IDS_N_SELECTED_ITEMS, LangString_N_SELECTED_ITEMS);
+}
+
void CApp::SetListSettings()
{
bool showDots = ReadShowDots();
@@ -102,7 +111,7 @@ void CApp::SetListSettings()
void CApp::SetShowSystemMenu()
{
- ShowSystemMenu = ReadShowSystemMenu();
+ ShowSystemMenu = Read_ShowSystemMenu();
}
#ifndef ILC_COLOR32
@@ -166,23 +175,23 @@ struct CButtonInfo
UINT BitmapResID;
UINT Bitmap2ResID;
UINT StringResID;
- UInt32 LangID;
- UString GetText() const { return LangString(StringResID, LangID); }
+
+ UString GetText() const { return LangString(StringResID); }
};
static CButtonInfo g_StandardButtons[] =
{
- { IDM_COPY_TO, IDB_COPY, IDB_COPY2, IDS_BUTTON_COPY, 0x03020420},
- { IDM_MOVE_TO, IDB_MOVE, IDB_MOVE2, IDS_BUTTON_MOVE, 0x03020421},
- { IDM_DELETE, IDB_DELETE, IDB_DELETE2, IDS_BUTTON_DELETE, 0x03020422} ,
- { IDM_FILE_PROPERTIES, IDB_INFO, IDB_INFO2, IDS_BUTTON_INFO, 0x03020423}
+ { IDM_COPY_TO, IDB_COPY, IDB_COPY2, IDS_BUTTON_COPY },
+ { IDM_MOVE_TO, IDB_MOVE, IDB_MOVE2, IDS_BUTTON_MOVE },
+ { IDM_DELETE, IDB_DELETE, IDB_DELETE2, IDS_BUTTON_DELETE } ,
+ { IDM_PROPERTIES, IDB_INFO, IDB_INFO2, IDS_BUTTON_INFO }
};
static CButtonInfo g_ArchiveButtons[] =
{
- { kAddCommand, IDB_ADD, IDB_ADD2, IDS_ADD, 0x03020400},
- { kExtractCommand, IDB_EXTRACT, IDB_EXTRACT2, IDS_EXTRACT, 0x03020401},
- { kTestCommand , IDB_TEST, IDB_TEST2, IDS_TEST, 0x03020402}
+ { kMenuCmdID_Toolbar_Add, IDB_ADD, IDB_ADD2, IDS_ADD },
+ { kMenuCmdID_Toolbar_Extract, IDB_EXTRACT, IDB_EXTRACT2, IDS_EXTRACT },
+ { kMenuCmdID_Toolbar_Test, IDB_TEST, IDB_TEST2, IDS_TEST }
};
static bool SetButtonText(int commandID, CButtonInfo *buttons, int numButtons, UString &s)
@@ -201,11 +210,9 @@ static bool SetButtonText(int commandID, CButtonInfo *buttons, int numButtons, U
static void SetButtonText(int commandID, UString &s)
{
- if (SetButtonText(commandID, g_StandardButtons,
- sizeof(g_StandardButtons) / sizeof(g_StandardButtons[0]), s))
+ if (SetButtonText(commandID, g_StandardButtons, ARRAY_SIZE(g_StandardButtons), s))
return;
- SetButtonText(commandID, g_ArchiveButtons,
- sizeof(g_ArchiveButtons) / sizeof(g_ArchiveButtons[0]), s);
+ SetButtonText(commandID, g_ArchiveButtons, ARRAY_SIZE(g_ArchiveButtons), s);
}
static void AddButton(
@@ -253,10 +260,10 @@ void CApp::ReloadToolbars()
CreateToolbar(_window, _buttonsImageList, _toolBar, LargeButtons);
int i;
if (ShowArchiveToolbar)
- for (i = 0; i < sizeof(g_ArchiveButtons) / sizeof(g_ArchiveButtons[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(g_ArchiveButtons); i++)
AddButton(_buttonsImageList, _toolBar, g_ArchiveButtons[i], ShowButtonsLables, LargeButtons);
if (ShowStandardToolbar)
- for (i = 0; i < sizeof(g_StandardButtons) / sizeof(g_StandardButtons[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(g_StandardButtons); i++)
AddButton(_buttonsImageList, _toolBar, g_StandardButtons[i], ShowButtonsLables, LargeButtons);
_toolBar.AutoSize();
@@ -295,9 +302,10 @@ HRESULT CApp::Create(HWND hwnd, const UString &mainPath, const UString &arcForma
SetShowSystemMenu();
if (LastFocusedPanel >= kNumPanelsMax)
LastFocusedPanel = 0;
+ // ShowDeletedFiles = Read_ShowDeleted();
CListMode listMode;
- ReadListMode(listMode);
+ listMode.Read();
for (i = 0; i < kNumPanelsMax; i++)
{
CPanel &panel = Panels[i];
@@ -361,7 +369,8 @@ void CApp::Save()
listMode.Panels[i] = panel.GetListViewMode();
SaveFlatView(i, panel._flatModeForArc);
}
- SaveListMode(listMode);
+ listMode.Save();
+ // Save_ShowDeleted(ShowDeletedFiles);
}
void CApp::Release()
@@ -383,20 +392,20 @@ static void ReducePathToRealFileSystemPath(UString &path)
}
int pos = path.ReverseFind(WCHAR_PATH_SEPARATOR);
if (pos < 0)
+ {
path.Empty();
- else
+ break;
+ }
+ path.DeleteFrom(pos + 1);
+ if (path.Len() == 3 && path[1] == L':')
+ break;
+ if (path.Len() > 2 && path[0] == '\\' && path[1] == '\\')
{
- path = path.Left(pos + 1);
- if (path.Length() == 3 && path[1] == L':')
+ int nextPos = path.Find(WCHAR_PATH_SEPARATOR, 2); // pos after \\COMPNAME
+ if (nextPos > 0 && path.Find(WCHAR_PATH_SEPARATOR, nextPos + 1) == pos)
break;
- if (path.Length() > 2 && path[0] == '\\' && path[1] == '\\')
- {
- int nextPos = path.Find(WCHAR_PATH_SEPARATOR, 2); // pos after \\COMPNAME
- if (nextPos > 0 && path.Find(WCHAR_PATH_SEPARATOR, nextPos + 1) == pos)
- break;
- }
- path = path.Left(pos);
}
+ path.DeleteFrom(pos);
}
}
@@ -408,38 +417,27 @@ static bool CheckFolderPath(const UString &path)
return (pathReduced == path);
}
-static bool IsPathAbsolute(const UString &path)
-{
- if (path.Length() >= 1 && path[0] == WCHAR_PATH_SEPARATOR)
- return true;
- #ifdef _WIN32
- if (path.Length() >= 3 && path[1] == L':' && path[2] == L'\\')
- return true;
- #endif
- return false;
-}
-
extern UString ConvertSizeToString(UInt64 value);
static UString AddSizeValue(UInt64 size)
{
- return MyFormatNew(IDS_FILE_SIZE, 0x02000982, ConvertSizeToString(size));
+ return MyFormatNew(IDS_FILE_SIZE, ConvertSizeToString(size));
}
-static void AddValuePair1(UINT resourceID, UInt32 langID, UInt64 size, UString &s)
+static void AddValuePair1(UString &s, UINT resourceID, UInt64 size)
{
- s += LangString(resourceID, langID);
- s += L" ";
+ s += LangString(resourceID);
+ s += L": ";
s += AddSizeValue(size);
- s += L"\n";
+ s += L'\n';
}
-void AddValuePair2(UINT resourceID, UInt32 langID, UInt64 num, UInt64 size, UString &s)
+void AddValuePair2(UString &s, UINT resourceID, UInt64 num, UInt64 size)
{
if (num == 0)
return;
- s += LangString(resourceID, langID);
- s += L" ";
+ s += LangString(resourceID);
+ s += L": ";
s += ConvertSizeToString(num);
if (size != (UInt64)(Int64)-1)
@@ -448,7 +446,7 @@ void AddValuePair2(UINT resourceID, UInt32 langID, UInt64 num, UInt64 size, UStr
s += AddSizeValue(size);
s += L" )";
}
- s += L"\n";
+ s += L'\n';
}
static void AddPropValueToSum(IFolderFolder *folder, int index, PROPID propID, UInt64 &sum)
@@ -457,15 +455,11 @@ static void AddPropValueToSum(IFolderFolder *folder, int index, PROPID propID, U
return;
NCOM::CPropVariant prop;
folder->GetProperty(index, propID, &prop);
- switch(prop.vt)
- {
- case VT_UI4:
- case VT_UI8:
- sum += ConvertPropVariantToUInt64(prop);
- break;
- default:
- sum = (UInt64)(Int64)-1;
- }
+ UInt64 val = 0;
+ if (ConvertPropVariantToUInt64(prop, val))
+ sum += val;
+ else
+ sum = (UInt64)(Int64)-1;
}
UString CPanel::GetItemsInfoString(const CRecordVector<UInt32> &indices)
@@ -473,11 +467,11 @@ UString CPanel::GetItemsInfoString(const CRecordVector<UInt32> &indices)
UString info;
UInt64 numDirs, numFiles, filesSize, foldersSize;
numDirs = numFiles = filesSize = foldersSize = 0;
- int i;
+ unsigned i;
for (i = 0; i < indices.Size(); i++)
{
int index = indices[i];
- if (IsItemFolder(index))
+ if (IsItem_Folder(index))
{
AddPropValueToSum(_folder, index, kpidSize, foldersSize);
numDirs++;
@@ -489,22 +483,22 @@ UString CPanel::GetItemsInfoString(const CRecordVector<UInt32> &indices)
}
}
- AddValuePair2(IDS_FOLDERS_COLON, 0x02000321, numDirs, foldersSize, info);
- AddValuePair2(IDS_FILES_COLON, 0x02000320, numFiles, filesSize, info);
+ AddValuePair2(info, IDS_PROP_FOLDERS, numDirs, foldersSize);
+ AddValuePair2(info, IDS_PROP_FILES, numFiles, filesSize);
int numDefined = ((foldersSize != (UInt64)(Int64)-1) && foldersSize != 0) ? 1: 0;
numDefined += ((filesSize != (UInt64)(Int64)-1) && filesSize != 0) ? 1: 0;
if (numDefined == 2)
- AddValuePair1(IDS_SIZE_COLON, 0x02000322, filesSize + foldersSize, info);
+ AddValuePair1(info, IDS_PROP_SIZE, filesSize + foldersSize);
info += L"\n";
info += _currentFolderPrefix;
- for (i = 0; i < indices.Size() && i < kCopyDialog_NumInfoLines - 6; i++)
+ for (i = 0; i < indices.Size() && (int)i < (int)kCopyDialog_NumInfoLines - 6; i++)
{
info += L"\n ";
int index = indices[i];
info += GetItemRelPath(index);
- if (IsItemFolder(index))
+ if (IsItem_Folder(index))
info += WCHAR_PATH_SEPARATOR;
}
if (i != indices.Size())
@@ -512,7 +506,7 @@ UString CPanel::GetItemsInfoString(const CRecordVector<UInt32> &indices)
return info;
}
-bool IsCorrectFsName(const UString name);
+bool IsCorrectFsName(const UString &name);
void CApp::OnCopy(bool move, bool copyToSame, int srcPanelIndex)
{
@@ -525,7 +519,7 @@ void CApp::OnCopy(bool move, bool copyToSame, int srcPanelIndex)
if (!srcPanel.DoesItSupportOperations())
{
- srcPanel.MessageBoxErrorLang(IDS_OPERATION_IS_NOT_SUPPORTED, 0x03020208);
+ srcPanel.MessageBoxErrorLang(IDS_OPERATION_IS_NOT_SUPPORTED);
return;
}
@@ -554,49 +548,49 @@ void CApp::OnCopy(bool move, bool copyToSame, int srcPanelIndex)
if (NumPanels == 1)
ReducePathToRealFileSystemPath(destPath);
}
-
+ }
+ UStringVector copyFolders;
+ ReadCopyHistory(copyFolders);
+ {
CCopyDialog copyDialog;
- UStringVector copyFolders;
- ReadCopyHistory(copyFolders);
copyDialog.Strings = copyFolders;
copyDialog.Value = destPath;
-
- copyDialog.Title = move ?
- LangString(IDS_MOVE, 0x03020202):
- LangString(IDS_COPY, 0x03020201);
- copyDialog.Static = move ?
- LangString(IDS_MOVE_TO, 0x03020204):
- LangString(IDS_COPY_TO, 0x03020203);
-
+ LangString(move ? IDS_MOVE : IDS_COPY, copyDialog.Title);
+ LangString(move ? IDS_MOVE_TO : IDS_COPY_TO, copyDialog.Static);
copyDialog.Info = srcPanel.GetItemsInfoString(indices);
- if (copyDialog.Create(srcPanel.GetParent()) == IDCANCEL)
+ if (copyDialog.Create(srcPanel.GetParent()) != IDOK)
return;
destPath = copyDialog.Value;
+ }
+ {
if (destPath.IsEmpty())
{
- srcPanel.MessageBoxErrorLang(IDS_OPERATION_IS_NOT_SUPPORTED, 0x03020208);
+ srcPanel.MessageBoxErrorLang(IDS_OPERATION_IS_NOT_SUPPORTED);
return;
}
- if (!IsPathAbsolute(destPath))
+ UString correctName;
+ if (!srcPanel.CorrectFsPath(destPath, correctName))
{
- if (!srcPanel.IsFSFolder())
- {
- srcPanel.MessageBoxErrorLang(IDS_OPERATION_IS_NOT_SUPPORTED, 0x03020208);
- return;
- }
- destPath = srcPanel._currentFolderPrefix + destPath;
+ srcPanel.MessageBoxError(E_INVALIDARG);
+ return;
}
+ if (IsAbsolutePath(destPath))
+ destPath.Empty();
+ else
+ destPath = srcPanel._currentFolderPrefix;
+ destPath += correctName;
+
#ifndef UNDER_CE
- if (destPath.Length() > 0 && destPath[0] == '\\')
- if (destPath.Length() == 1 || destPath[1] != '\\')
+ if (destPath.Len() > 0 && destPath[0] == '\\')
+ if (destPath.Len() == 1 || destPath[1] != '\\')
{
- srcPanel.MessageBoxErrorLang(IDS_OPERATION_IS_NOT_SUPPORTED, 0x03020208);
+ srcPanel.MessageBoxErrorLang(IDS_OPERATION_IS_NOT_SUPPORTED);
return;
}
#endif
@@ -606,13 +600,13 @@ void CApp::OnCopy(bool move, bool copyToSame, int srcPanelIndex)
NFind::DoesDirExist(us2fs(destPath)) ||
srcPanel.IsArcFolder())
{
- NDirectory::CreateComplexDirectory(us2fs(destPath));
+ CreateComplexDir(us2fs(destPath));
NName::NormalizeDirPathPrefix(destPath);
if (!CheckFolderPath(destPath))
{
if (NumPanels < 2 || destPath != destPanel._currentFolderPrefix || !destPanel.DoesItSupportOperations())
{
- srcPanel.MessageBoxErrorLang(IDS_OPERATION_IS_NOT_SUPPORTED, 0x03020208);
+ srcPanel.MessageBoxErrorLang(IDS_OPERATION_IS_NOT_SUPPORTED);
return;
}
useDestPanel = true;
@@ -629,10 +623,10 @@ void CApp::OnCopy(bool move, bool copyToSame, int srcPanelIndex)
if (pos >= 0)
{
UString prefix = destPath.Left(pos + 1);
- NDirectory::CreateComplexDirectory(us2fs(prefix));
+ CreateComplexDir(us2fs(prefix));
if (!CheckFolderPath(prefix))
{
- srcPanel.MessageBoxErrorLang(IDS_OPERATION_IS_NOT_SUPPORTED, 0x03020208);
+ srcPanel.MessageBoxErrorLang(IDS_OPERATION_IS_NOT_SUPPORTED);
return;
}
}
@@ -654,7 +648,7 @@ void CApp::OnCopy(bool move, bool copyToSame, int srcPanelIndex)
bool useSrcPanel = (!useDestPanel || !srcPanel.IsFsOrDrivesFolder() || destPanel.IsFSFolder());
bool useTemp = useSrcPanel && useDestPanel;
- NFile::NDirectory::CTempDir tempDirectory;
+ CTempDir tempDirectory;
FString tempDirPrefix;
if (useTemp)
{
@@ -668,24 +662,23 @@ void CApp::OnCopy(bool move, bool copyToSame, int srcPanelIndex)
srcPanel.SaveSelectedState(srcSelState);
destPanel.SaveSelectedState(destSelState);
- HRESULT result;
+ CPanel::CDisableNotify disableNotify1(destPanel);
+ CPanel::CDisableNotify disableNotify2(srcPanel);
+
+ HRESULT result = S_OK;
if (useSrcPanel)
{
- UString folder = useTemp ? fs2us(tempDirPrefix) : destPath;
- result = srcPanel.CopyTo(indices, folder, move, true, 0);
- if (result != S_OK)
- {
- disableTimerProcessing1.Restore();
- disableTimerProcessing2.Restore();
- // For Password:
- srcPanel.SetFocusToList();
- if (result != E_ABORT)
- srcPanel.MessageBoxError(result, L"Error");
- return;
- }
+ CCopyToOptions options;
+ options.folder = useTemp ? fs2us(tempDirPrefix) : destPath;
+ options.moveMode = move;
+ options.includeAltStreams = true;
+ options.replaceAltStreamChars = false;
+ options.showErrorMessages = true;
+
+ result = srcPanel.CopyTo(options, indices, NULL);
}
- if (useDestPanel)
+ if (result == S_OK && useDestPanel)
{
UStringVector filePaths;
UString folderPrefix;
@@ -693,22 +686,22 @@ void CApp::OnCopy(bool move, bool copyToSame, int srcPanelIndex)
folderPrefix = fs2us(tempDirPrefix);
else
folderPrefix = srcPanel._currentFolderPrefix;
- filePaths.Reserve(indices.Size());
- for (int i = 0; i < indices.Size(); i++)
- filePaths.Add(srcPanel.GetItemRelPath(indices[i]));
-
- result = destPanel.CopyFrom(folderPrefix, filePaths, true, 0);
-
- if (result != S_OK)
- {
- disableTimerProcessing1.Restore();
- disableTimerProcessing2.Restore();
- // For Password:
- srcPanel.SetFocusToList();
- if (result != E_ABORT)
- srcPanel.MessageBoxError(result, L"Error");
- return;
- }
+ filePaths.ClearAndReserve(indices.Size());
+ FOR_VECTOR (i, indices)
+ filePaths.AddInReserved(srcPanel.GetItemRelPath(indices[i]));
+ result = destPanel.CopyFrom(move, folderPrefix, filePaths, true, 0);
+ }
+ if (result != S_OK)
+ {
+ // disableNotify1.Restore();
+ // disableNotify2.Restore();
+ // For Password:
+ // srcPanel.SetFocusToList();
+ // srcPanel.InvalidateList(NULL, true);
+
+ if (result != E_ABORT)
+ srcPanel.MessageBoxError(result, L"Error");
+ // return;
}
RefreshTitleAlways();
@@ -721,8 +714,8 @@ void CApp::OnCopy(bool move, bool copyToSame, int srcPanelIndex)
destPanel.RefreshListCtrl(destSelState);
srcPanel.KillSelection();
}
- disableTimerProcessing1.Restore();
- disableTimerProcessing2.Restore();
+ disableNotify1.Restore();
+ disableNotify2.Restore();
srcPanel.SetFocusToList();
}
@@ -746,7 +739,7 @@ void CApp::OnSetSubFolder(int srcPanelIndex)
if (focusedItem < 0)
return;
int realIndex = srcPanel.GetRealItemIndex(focusedItem);
- if (!srcPanel.IsItemFolder(realIndex))
+ if (!srcPanel.IsItem_Folder(realIndex))
return;
// destPanel.BindToFolder(srcPanel._currentFolderPrefix + srcPanel.GetItemName(realIndex) + WCHAR_PATH_SEPARATOR);
@@ -763,7 +756,7 @@ void CApp::OnSetSubFolder(int srcPanelIndex)
return;
}
destPanel.CloseOpenFolders();
- destPanel._folder = newFolder;
+ destPanel.SetNewFolder(newFolder);
destPanel.RefreshListCtrl();
}
@@ -821,7 +814,7 @@ void CApp::RefreshTitle(bool always)
{
UString path = GetFocusedPanel()._currentFolderPrefix;
if (path.IsEmpty())
- path += LangString(IDS_APP_TITLE, 0x03000000);
+ path = L"7-Zip"; // LangString(IDS_APP_TITLE);
if (!always && path == PrevTitle)
return;
PrevTitle = path;
@@ -834,3 +827,28 @@ void CApp::RefreshTitle(int panelIndex, bool always)
return;
RefreshTitle(always);
}
+
+void AddUniqueStringToHead(UStringVector &list, const UString &s)
+{
+ for (unsigned i = 0; i < list.Size();)
+ if (s.IsEqualToNoCase(list[i]))
+ list.Delete(i);
+ else
+ i++;
+ list.Insert(0, s);
+}
+
+
+void CFolderHistory::Normalize()
+{
+ const unsigned kMaxSize = 100;
+ if (Strings.Size() > kMaxSize)
+ Strings.DeleteFrom(kMaxSize);
+}
+
+void CFolderHistory::AddString(const UString &s)
+{
+ NWindows::NSynchronization::CCriticalSectionLock lock(_criticalSection);
+ AddUniqueStringToHead(Strings, s);
+ Normalize();
+}