mirror of
https://github.com/Xevion/easy7zip.git
synced 2025-12-07 07:14:56 -06:00
9.34
This commit is contained in:
committed by
Kornel Lesiński
parent
83f8ddcc5b
commit
f08f4dcc3c
95
CPP/7zip/UI/FileManager/PanelDrag.cpp
Executable file → Normal file
95
CPP/7zip/UI/FileManager/PanelDrag.cpp
Executable file → Normal file
@@ -6,12 +6,13 @@
|
||||
#include <winuserm.h>
|
||||
#endif
|
||||
|
||||
#include "Common/StringConvert.h"
|
||||
#include "../../../Common/StringConvert.h"
|
||||
#include "../../../Common/Wildcard.h"
|
||||
|
||||
#include "Windows/Memory.h"
|
||||
#include "Windows/FileDir.h"
|
||||
#include "Windows/FileName.h"
|
||||
#include "Windows/Shell.h"
|
||||
#include "../../../Windows/MemoryGlobal.h"
|
||||
#include "../../../Windows/FileDir.h"
|
||||
#include "../../../Windows/FileName.h"
|
||||
#include "../../../Windows/Shell.h"
|
||||
|
||||
#include "../Common/ArchiveName.h"
|
||||
#include "../Common/CompressCall.h"
|
||||
@@ -22,6 +23,8 @@
|
||||
#include "EnumFormatEtc.h"
|
||||
|
||||
using namespace NWindows;
|
||||
using namespace NFile;
|
||||
using namespace NDir;
|
||||
|
||||
#ifndef _UNICODE
|
||||
extern bool g_IsNT;
|
||||
@@ -204,10 +207,9 @@ STDMETHODIMP CDropSource::QueryContinueDrag(BOOL escapePressed, DWORD keyState)
|
||||
}
|
||||
if (needExtract)
|
||||
{
|
||||
Result = Panel->CopyTo(Indices, Folder,
|
||||
false, // moveMode,
|
||||
false, // showMessages
|
||||
&Messages);
|
||||
CCopyToOptions options;
|
||||
options.folder = Folder;
|
||||
Result = Panel->CopyTo(options, Indices, &Messages);
|
||||
if (Result != S_OK || !Messages.IsEmpty())
|
||||
return DRAGDROP_S_CANCEL;
|
||||
}
|
||||
@@ -224,19 +226,19 @@ STDMETHODIMP CDropSource::GiveFeedback(DWORD effect)
|
||||
|
||||
static bool CopyNamesToHGlobal(NMemory::CGlobal &hgDrop, const UStringVector &names)
|
||||
{
|
||||
size_t totalLength = 1;
|
||||
size_t totalLen = 1;
|
||||
|
||||
#ifndef _UNICODE
|
||||
if (!g_IsNT)
|
||||
{
|
||||
AStringVector namesA;
|
||||
int i;
|
||||
unsigned i;
|
||||
for (i = 0; i < names.Size(); i++)
|
||||
namesA.Add(GetSystemString(names[i]));
|
||||
for (i = 0; i < names.Size(); i++)
|
||||
totalLength += namesA[i].Length() + 1;
|
||||
totalLen += namesA[i].Len() + 1;
|
||||
|
||||
if (!hgDrop.Alloc(GHND | GMEM_SHARE, totalLength * sizeof(CHAR) + sizeof(DROPFILES)))
|
||||
if (!hgDrop.Alloc(GHND | GMEM_SHARE, totalLen * sizeof(CHAR) + sizeof(DROPFILES)))
|
||||
return false;
|
||||
|
||||
NMemory::CGlobalLock dropLock(hgDrop);
|
||||
@@ -252,21 +254,21 @@ static bool CopyNamesToHGlobal(NMemory::CGlobal &hgDrop, const UStringVector &na
|
||||
for (i = 0; i < names.Size(); i++)
|
||||
{
|
||||
const AString &s = namesA[i];
|
||||
int fullLength = s.Length() + 1;
|
||||
unsigned fullLen = s.Len() + 1;
|
||||
MyStringCopy(p, (const char *)s);
|
||||
p += fullLength;
|
||||
totalLength -= fullLength;
|
||||
p += fullLen;
|
||||
totalLen -= fullLen;
|
||||
}
|
||||
*p = 0;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
int i;
|
||||
unsigned i;
|
||||
for (i = 0; i < names.Size(); i++)
|
||||
totalLength += names[i].Length() + 1;
|
||||
totalLen += names[i].Len() + 1;
|
||||
|
||||
if (!hgDrop.Alloc(GHND | GMEM_SHARE, totalLength * sizeof(WCHAR) + sizeof(DROPFILES)))
|
||||
if (!hgDrop.Alloc(GHND | GMEM_SHARE, totalLen * sizeof(WCHAR) + sizeof(DROPFILES)))
|
||||
return false;
|
||||
|
||||
NMemory::CGlobalLock dropLock(hgDrop);
|
||||
@@ -282,10 +284,10 @@ static bool CopyNamesToHGlobal(NMemory::CGlobal &hgDrop, const UStringVector &na
|
||||
for (i = 0; i < names.Size(); i++)
|
||||
{
|
||||
const UString &s = names[i];
|
||||
int fullLength = s.Length() + 1;
|
||||
unsigned fullLen = s.Len() + 1;
|
||||
MyStringCopy(p, (const WCHAR *)s);
|
||||
p += fullLength;
|
||||
totalLength -= fullLength;
|
||||
p += fullLen;
|
||||
totalLen -= fullLen;
|
||||
}
|
||||
*p = 0;
|
||||
}
|
||||
@@ -294,7 +296,7 @@ static bool CopyNamesToHGlobal(NMemory::CGlobal &hgDrop, const UStringVector &na
|
||||
|
||||
void CPanel::OnDrag(LPNMLISTVIEW /* nmListView */)
|
||||
{
|
||||
CPanel::CDisableTimerProcessing disableTimerProcessing2(*this);
|
||||
CDisableTimerProcessing disableTimerProcessing2(*this);
|
||||
if (!DoesItSupportOperations())
|
||||
return;
|
||||
CRecordVector<UInt32> indices;
|
||||
@@ -306,7 +308,7 @@ void CPanel::OnDrag(LPNMLISTVIEW /* nmListView */)
|
||||
// SaveSelectedState(selState);
|
||||
|
||||
FString dirPrefix;
|
||||
NFile::NDirectory::CTempDir tempDirectory;
|
||||
CTempDir tempDirectory;
|
||||
|
||||
bool isFSFolder = IsFSFolder();
|
||||
if (isFSFolder)
|
||||
@@ -323,7 +325,7 @@ void CPanel::OnDrag(LPNMLISTVIEW /* nmListView */)
|
||||
|
||||
{
|
||||
UStringVector names;
|
||||
for (int i = 0; i < indices.Size(); i++)
|
||||
FOR_VECTOR (i, indices)
|
||||
{
|
||||
UInt32 index = indices[i];
|
||||
UString s;
|
||||
@@ -356,6 +358,7 @@ void CPanel::OnDrag(LPNMLISTVIEW /* nmListView */)
|
||||
HRESULT res = DoDragDrop(dataObject, dropSource, effectsOK, &effect);
|
||||
_panelCallback->DragEnd();
|
||||
bool canceled = (res == DRAGDROP_S_CANCEL);
|
||||
CDisableNotify disableNotify(*this);
|
||||
if (res == DRAGDROP_S_DROP)
|
||||
{
|
||||
res = dropSourceSpec->Result;
|
||||
@@ -363,10 +366,10 @@ void CPanel::OnDrag(LPNMLISTVIEW /* nmListView */)
|
||||
if (!dataObjectSpec->Path.IsEmpty())
|
||||
{
|
||||
NFile::NName::NormalizeDirPathPrefix(dataObjectSpec->Path);
|
||||
res = CopyTo(indices, dataObjectSpec->Path,
|
||||
(effect == DROPEFFECT_MOVE),// dropSourceSpec->MoveMode,
|
||||
false, // showErrorMessages
|
||||
&dropSourceSpec->Messages);
|
||||
CCopyToOptions options;
|
||||
options.folder = dataObjectSpec->Path;
|
||||
options.moveMode = (effect == DROPEFFECT_MOVE);
|
||||
res = CopyTo(options, indices, &dropSourceSpec->Messages);
|
||||
}
|
||||
/*
|
||||
if (effect == DROPEFFECT_MOVE)
|
||||
@@ -386,8 +389,14 @@ void CPanel::OnDrag(LPNMLISTVIEW /* nmListView */)
|
||||
messagesDialog.Messages = &dropSourceSpec->Messages;
|
||||
messagesDialog.Create((*this));
|
||||
}
|
||||
|
||||
if (res != S_OK && res != E_ABORT)
|
||||
{
|
||||
// we restore Notify before MessageBoxError. So we will se files selection
|
||||
disableNotify.Restore();
|
||||
// SetFocusToList();
|
||||
MessageBoxError(res);
|
||||
}
|
||||
if (res == S_OK && dropSourceSpec->Messages.IsEmpty() && !canceled)
|
||||
KillSelection();
|
||||
}
|
||||
@@ -483,7 +492,7 @@ void CDropTarget::PositionCursor(POINTL ptl)
|
||||
int realIndex = m_Panel->GetRealItemIndex(index);
|
||||
if (realIndex == kParentIndex)
|
||||
return;
|
||||
if (!m_Panel->IsItemFolder(realIndex))
|
||||
if (!m_Panel->IsItem_Folder(realIndex))
|
||||
return;
|
||||
m_SubFolderIndex = realIndex;
|
||||
m_SubFolderName = m_Panel->GetItemName(m_SubFolderIndex);
|
||||
@@ -585,10 +594,9 @@ bool CDropTarget::IsItSameDrive() const
|
||||
|
||||
if (m_SourcePaths.Size() == 0)
|
||||
return false;
|
||||
for (int i = 0; i < m_SourcePaths.Size(); i++)
|
||||
FOR_VECTOR (i, m_SourcePaths)
|
||||
{
|
||||
const UString &path = m_SourcePaths[i];
|
||||
if (drive.CompareNoCase(path.Left(drive.Length())) != 0)
|
||||
if (MyStringCompareNoCase_N(m_SourcePaths[i], drive, drive.Len()) != 0)
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
@@ -649,7 +657,7 @@ bool CDropTarget::SetPath(bool enablePath) const
|
||||
UString path;
|
||||
if (enablePath)
|
||||
path = GetTargetPath();
|
||||
size_t size = path.Length() + 1;
|
||||
size_t size = path.Len() + 1;
|
||||
medium.hGlobal = GlobalAlloc(GHND | GMEM_SHARE, size * sizeof(wchar_t));
|
||||
if (medium.hGlobal == 0)
|
||||
return false;
|
||||
@@ -752,23 +760,26 @@ void CPanel::CompressDropFiles(HDROP dr)
|
||||
static bool IsFolderInTemp(const FString &path)
|
||||
{
|
||||
FString tempPath;
|
||||
if (!NFile::NDirectory::MyGetTempPath(tempPath))
|
||||
if (!MyGetTempPath(tempPath))
|
||||
return false;
|
||||
if (tempPath.IsEmpty())
|
||||
return false;
|
||||
return (tempPath.CompareNoCase(path.Left(tempPath.Length())) == 0);
|
||||
unsigned len = tempPath.Len();
|
||||
if (path.Len() < len)
|
||||
return false;
|
||||
return CompareFileNames(path.Left(len), tempPath) == 0;
|
||||
}
|
||||
|
||||
static bool AreThereNamesFromTemp(const UStringVector &fileNames)
|
||||
{
|
||||
FString tempPathF;
|
||||
if (!NFile::NDirectory::MyGetTempPath(tempPathF))
|
||||
if (!MyGetTempPath(tempPathF))
|
||||
return false;
|
||||
UString tempPath = fs2us(tempPathF);
|
||||
if (tempPath.IsEmpty())
|
||||
return false;
|
||||
for (int i = 0; i < fileNames.Size(); i++)
|
||||
if (tempPath.CompareNoCase(fileNames[i].Left(tempPath.Length())) == 0)
|
||||
FOR_VECTOR (i, fileNames)
|
||||
if (MyStringCompareNoCase_N(fileNames[i], tempPath, tempPath.Len()) == 0)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
@@ -787,13 +798,15 @@ void CPanel::CompressDropFiles(const UStringVector &fileNames, const UString &fo
|
||||
if (folderPath2.IsEmpty())
|
||||
{
|
||||
FString folderPath2F;
|
||||
NFile::NDirectory::GetOnlyDirPrefix(us2fs(fileNames.Front()), folderPath2F);
|
||||
GetOnlyDirPrefix(us2fs(fileNames.Front()), folderPath2F);
|
||||
folderPath2 = fs2us(folderPath2F);
|
||||
if (IsFolderInTemp(folderPath2F))
|
||||
folderPath2 = ROOT_FS_FOLDER;
|
||||
}
|
||||
const UString archiveName = CreateArchiveName(fileNames.Front(), (fileNames.Size() > 1), false);
|
||||
CompressFiles(folderPath2, archiveName, L"", fileNames,
|
||||
CompressFiles(folderPath2, archiveName, L"",
|
||||
true, // addExtension
|
||||
fileNames,
|
||||
false, // email
|
||||
true, // showDialog
|
||||
AreThereNamesFromTemp(fileNames) // waitFinish
|
||||
|
||||
Reference in New Issue
Block a user