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/PanelMenu.cpp')
-rw-r--r--[-rwxr-xr-x]CPP/7zip/UI/FileManager/PanelMenu.cpp174
1 files changed, 134 insertions, 40 deletions
diff --git a/CPP/7zip/UI/FileManager/PanelMenu.cpp b/CPP/7zip/UI/FileManager/PanelMenu.cpp
index badf531b..d6dcf6c1 100755..100644
--- a/CPP/7zip/UI/FileManager/PanelMenu.cpp
+++ b/CPP/7zip/UI/FileManager/PanelMenu.cpp
@@ -1,12 +1,13 @@
#include "StdAfx.h"
-#include "Common/StringConvert.h"
+#include "../../../Common/IntToString.h"
+#include "../../../Common/StringConvert.h"
-#include "Windows/COM.h"
-#include "Windows/Clipboard.h"
-#include "Windows/Menu.h"
-#include "Windows/PropVariant.h"
-#include "Windows/PropVariantConversions.h"
+#include "../../../Windows/COM.h"
+#include "../../../Windows/Clipboard.h"
+#include "../../../Windows/Menu.h"
+#include "../../../Windows/PropVariant.h"
+#include "../../../Windows/PropVariantConv.h"
#include "../../PropID.h"
#include "../Common/PropIDUtils.h"
@@ -24,8 +25,8 @@ using namespace NWindows;
LONG g_DllRefCount = 0;
-static const UINT kSevenZipStartMenuID = kPluginMenuStartID ;
-static const UINT kSystemStartMenuID = kPluginMenuStartID + 100;
+static const UINT kSevenZipStartMenuID = kMenuCmdID_Plugin_Start;
+static const UINT kSystemStartMenuID = kMenuCmdID_Plugin_Start + 100;
void CPanel::InvokeSystemCommand(const char *command)
{
@@ -54,6 +55,8 @@ static const wchar_t *kPropValueSeparator = L": ";
extern UString ConvertSizeToString(UInt64 value);
+UString GetOpenArcErrorMessage(UInt32 errorFlags);
+
static void AddPropertyString(PROPID propID, const wchar_t *nameBSTR,
const NCOM::CPropVariant &prop, UString &s)
{
@@ -61,7 +64,17 @@ static void AddPropertyString(PROPID propID, const wchar_t *nameBSTR,
{
UString val;
- if ((prop.vt == VT_UI8 || prop.vt == VT_UI4) && (
+ if (propID == kpidErrorFlags ||
+ propID == kpidWarningFlags)
+ {
+ UInt32 flags = GetOpenArcErrorFlags(prop);
+ if (flags == 0)
+ return;
+ if (flags != 0)
+ val = GetOpenArcErrorMessage(flags);
+ }
+ if (val.IsEmpty())
+ if ((prop.vt == VT_UI8 || prop.vt == VT_UI4 || prop.vt == VT_UI2) && (
propID == kpidSize ||
propID == kpidPackSize ||
propID == kpidNumSubDirs ||
@@ -72,11 +85,16 @@ static void AddPropertyString(PROPID propID, const wchar_t *nameBSTR,
propID == kpidFreeSpace ||
propID == kpidPhySize ||
propID == kpidHeadersSize ||
- propID == kpidFreeSpace
+ propID == kpidFreeSpace ||
+ propID == kpidUnpackSize
))
- val = ConvertSizeToString(ConvertPropVariantToUInt64(prop));
+ {
+ UInt64 v = 0;
+ ConvertPropVariantToUInt64(prop, v);
+ val = ConvertSizeToString(v);
+ }
else
- val = ConvertPropertyToString(prop, propID);
+ ConvertPropertyToString(val, prop, propID);
if (!val.IsEmpty())
{
@@ -92,6 +110,25 @@ static void AddPropertyString(PROPID propID, const wchar_t *nameBSTR,
}
}
+static inline char GetHex(Byte value)
+{
+ return (char)((value < 10) ? ('0' + value) : ('A' + (value - 10)));
+}
+
+static const Byte kSpecProps[] =
+{
+ kpidPath,
+ kpidType,
+ kpidErrorType,
+ kpidError,
+ kpidErrorFlags,
+ kpidWarning,
+ kpidWarningFlags,
+ kpidOffset,
+ kpidPhySize,
+ kpidTailSize
+};
+
void CPanel::Properties()
{
CMyComPtr<IGetFolderArcProps> getFolderArcProps;
@@ -129,6 +166,57 @@ void CPanel::Properties()
AddPropertyString(propID, name, prop, message);
}
}
+
+
+ if (_folderRawProps)
+ {
+ _folderRawProps->GetNumRawProps(&numProps);
+ for (UInt32 i = 0; i < numProps; i++)
+ {
+ CMyComBSTR name;
+ PROPID propID;
+ if (_folderRawProps->GetRawPropInfo(i, &name, &propID) != S_OK)
+ continue;
+
+ const void *data;
+ UInt32 dataSize;
+ UInt32 propType;
+ if (_folderRawProps->GetRawProp(index, propID, &data, &dataSize, &propType) != S_OK)
+ continue;
+
+ if (dataSize != 0)
+ {
+ AString s;
+ if (propID == kpidNtSecure)
+ ConvertNtSecureToString((const Byte *)data, dataSize, s);
+ else
+ {
+ const UInt32 kMaxDataSize = 64;
+ if (dataSize > kMaxDataSize)
+ {
+ char temp[64];
+ s += "data:";
+ ConvertUInt32ToString(dataSize, temp);
+ s += temp;
+ }
+ else
+ {
+ for (UInt32 i = 0; i < dataSize; i++)
+ {
+ Byte b = ((const Byte *)data)[i];
+ s += GetHex((Byte)((b >> 4) & 0xF));
+ s += GetHex((Byte)(b & 0xF));
+ }
+ }
+ }
+ message += GetNameOfProperty(propID, name);
+ message += kPropValueSeparator;
+ message += GetUnicodeString(s);
+ message += L'\n';
+ }
+ }
+ }
+
message += kSeparator;
}
@@ -187,21 +275,19 @@ void CPanel::Properties()
UInt32 numProps;
if (getProps->GetArcNumProps(level, &numProps) == S_OK)
{
+ const int kNumSpecProps = ARRAY_SIZE(kSpecProps);
+
message += kSeparator;
- for (Int32 i = -3; i < (Int32)numProps; i++)
+
+ for (Int32 i = -(int)kNumSpecProps; i < (Int32)numProps; i++)
{
CMyComBSTR name;
PROPID propID;
VARTYPE vt;
- switch (i)
- {
- case -3: propID = kpidPath; break;
- case -2: propID = kpidType; break;
- case -1: propID = kpidError; break;
- default:
- if (getProps->GetArcPropInfo(level, i, &name, &propID, &vt) != S_OK)
- continue;
- }
+ if (i < 0)
+ propID = kSpecProps[i + kNumSpecProps];
+ else if (getProps->GetArcPropInfo(level, i, &name, &propID, &vt) != S_OK)
+ continue;
NCOM::CPropVariant prop;
if (getProps->GetArcProp(level, propID, &prop) != S_OK)
continue;
@@ -209,6 +295,7 @@ void CPanel::Properties()
}
}
}
+
if (level2 != numLevels - 1)
{
UInt32 level = numLevels - 1 - level2;
@@ -233,7 +320,7 @@ void CPanel::Properties()
}
}
}
- ::MessageBoxW(*(this), message, LangString(IDS_PROPERTIES, 0x03020900), MB_OK);
+ ::MessageBoxW(*(this), message, LangString(IDS_PROPERTIES), MB_OK);
}
}
@@ -256,7 +343,7 @@ void CPanel::EditCopy()
UString s;
CRecordVector<UInt32> indices;
GetSelectedItemsIndices(indices);
- for (int i = 0; i < indices.Size(); i++)
+ FOR_VECTOR (i, indices)
{
if (i > 0)
s += L"\xD\n";
@@ -274,7 +361,7 @@ void CPanel::EditPaste()
UString s;
for (int i = 0; i < names.Size(); i++)
{
- s += L" ";
+ s += L' ';
s += names[i];
}
@@ -323,8 +410,8 @@ HRESULT CPanel::CreateShellContextMenu(
// Get a pidl for the file itself.
CRecordVector<LPITEMIDLIST> pidls;
- pidls.Reserve(operatedIndices.Size());
- for (int i = 0; i < operatedIndices.Size(); i++)
+ pidls.ClearAndReserve(operatedIndices.Size());
+ FOR_VECTOR (i, operatedIndices)
{
LPITEMIDLIST pidl;
UString fileName = GetItemRelPath(operatedIndices[i]);
@@ -332,7 +419,7 @@ HRESULT CPanel::CreateShellContextMenu(
fileName += WCHAR_PATH_SEPARATOR;
RINOK(parentFolder->ParseDisplayName(GetParent(), 0,
(wchar_t *)(const wchar_t *)fileName, &eaten, &pidl, 0));
- pidls.Add(pidl);
+ pidls.AddInReserved(pidl);
}
ITEMIDLIST temp;
@@ -431,7 +518,7 @@ void CPanel::CreateSystemMenu(HMENU menuSpec,
menuItem.fType = MFT_STRING;
menuItem.hSubMenu = popupMenu.Detach();
// menuDestroyer.Disable();
- menuItem.StringValue = LangString(IDS_SYSTEM, 0x030202A0);
+ LangString(IDS_SYSTEM, menuItem.StringValue);
menu.InsertItem(0, true, menuItem);
}
/*
@@ -489,11 +576,11 @@ void CPanel::CreateSevenZipMenu(HMENU menuSpec,
*/
UString currentFolderUnicode = _currentFolderPrefix;
UStringVector names;
- int i;
- for(i = 0; i < operatedIndices.Size(); i++)
+ unsigned i;
+ for (i = 0; i < operatedIndices.Size(); i++)
names.Add(currentFolderUnicode + GetItemRelPath(operatedIndices[i]));
CRecordVector<const wchar_t *> namePointers;
- for(i = 0; i < operatedIndices.Size(); i++)
+ for (i = 0; i < operatedIndices.Size(); i++)
namePointers.Add(names[i]);
// NFile::NDirectory::MySetCurrentDirectory(currentFolderUnicode);
@@ -524,19 +611,24 @@ void CPanel::CreateFileMenu(HMENU menuSpec,
CMenu menu;
menu.Attach(menuSpec);
-
- CreateSevenZipMenu(menu, operatedIndices, sevenZipContextMenu);
- if (g_App.ShowSystemMenu)
- CreateSystemMenu(menu, operatedIndices, systemContextMenu);
+
+ if (!IsArcFolder())
+ {
+ CreateSevenZipMenu(menu, operatedIndices, sevenZipContextMenu);
+ // CreateSystemMenu is very slow if you call it inside ZIP archive with big number of files
+ // Windows probably can parse items inside ZIP archive.
+ if (g_App.ShowSystemMenu)
+ CreateSystemMenu(menu, operatedIndices, systemContextMenu);
+ }
/*
if (menu.GetItemCount() > 0)
menu.AppendItem(MF_SEPARATOR, 0, (LPCTSTR)0);
*/
- int i;
+ unsigned i;
for (i = 0; i < operatedIndices.Size(); i++)
- if (IsItemFolder(operatedIndices[i]))
+ if (IsItem_Folder(operatedIndices[i]))
break;
bool allAreFiles = (i == operatedIndices.Size());
LoadFileMenu(menu, menu.GetItemCount(), programMenu,
@@ -627,7 +719,9 @@ bool CPanel::OnContextMenu(HANDLE windowHandle, int xPos, int yPos)
CRecordVector<UInt32> operatedIndices;
GetOperatedItemIndices(operatedIndices);
- if (xPos < 0 || yPos < 0)
+ // negative x,y are possible for multi-screen modes.
+ // x=-1 && y=-1 for keyboard call (SHIFT+F10 and others).
+ if (xPos == -1 && yPos == -1)
{
if (operatedIndices.Size() == 0)
{
@@ -669,7 +763,7 @@ bool CPanel::OnContextMenu(HANDLE windowHandle, int xPos, int yPos)
if (result == 0)
return true;
- if (result >= kPluginMenuStartID)
+ if (result >= kMenuCmdID_Plugin_Start)
{
InvokePluginCommand(result, sevenZipContextMenu, systemContextMenu);
return true;