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/PanelListNotify.cpp')
-rw-r--r--CPP/7zip/UI/FileManager/PanelListNotify.cpp252
1 files changed, 161 insertions, 91 deletions
diff --git a/CPP/7zip/UI/FileManager/PanelListNotify.cpp b/CPP/7zip/UI/FileManager/PanelListNotify.cpp
index 7be6aa62..2f37db14 100644
--- a/CPP/7zip/UI/FileManager/PanelListNotify.cpp
+++ b/CPP/7zip/UI/FileManager/PanelListNotify.cpp
@@ -19,30 +19,57 @@
using namespace NWindows;
-static void ConvertSizeToString(UInt64 value, wchar_t *dest)
+#define INT_TO_STR_SPEC(v) \
+ while (v >= 10) { temp[i++] = (unsigned char)('0' + (unsigned)(v % 10)); v /= 10; } \
+ *s++ = (unsigned char)('0' + (unsigned)v);
+
+static void ConvertSizeToString(UInt64 val, wchar_t *s) throw()
{
- char s[32];
- ConvertUInt64ToString(value, s);
- unsigned i = MyStringLen(s);
- unsigned pos = ARRAY_SIZE(s);
- s[--pos] = 0;
- while (i > 3)
+ unsigned char temp[32];
+ unsigned i = 0;
+
+ if (val <= (UInt32)0xFFFFFFFF)
+ {
+ UInt32 val32 = (UInt32)val;
+ INT_TO_STR_SPEC(val32)
+ }
+ else
{
- s[--pos] = s[--i];
- s[--pos] = s[--i];
- s[--pos] = s[--i];
- s[--pos] = L' ';
+ INT_TO_STR_SPEC(val)
}
- while (i > 0)
- s[--pos] = s[--i];
- for (;;)
+ if (i < 3)
{
- char c = s[pos++];
- *dest++ = (unsigned char)c;
- if (c == 0)
- break;
+ if (i != 0)
+ {
+ *s++ = temp[i - 1];
+ if (i == 2)
+ *s++ = temp[0];
+ }
+ *s = 0;
+ return;
+ }
+
+ unsigned r = i % 3;
+ if (r != 0)
+ {
+ s[0] = temp[--i];
+ if (r == 2)
+ s[1] = temp[--i];
+ s += r;
}
+
+ do
+ {
+ s[0] = ' ';
+ s[1] = temp[i - 1];
+ s[2] = temp[i - 2];
+ s[3] = temp[i - 3];
+ s += 4;
+ }
+ while (i -= 3);
+
+ *s = 0;
}
UString ConvertSizeToString(UInt64 value)
@@ -52,29 +79,62 @@ UString ConvertSizeToString(UInt64 value)
return s;
}
-static inline char GetHex(Byte value)
+static inline unsigned GetHex(unsigned v)
{
- return (char)((value < 10) ? ('0' + value) : ('A' + (value - 10)));
+ return (v < 10) ? ('0' + v) : ('A' + (v - 10));
}
-void HexToString(char *dest, const Byte *data, UInt32 size)
+/*
+static void HexToString(char *dest, const Byte *data, UInt32 size)
{
for (UInt32 i = 0; i < size; i++)
{
- Byte b = data[i];
- dest[0] = GetHex((Byte)((b >> 4) & 0xF));
- dest[1] = GetHex((Byte)(b & 0xF));
+ unsigned b = data[i];
+ dest[0] = GetHex((b >> 4) & 0xF);
+ dest[1] = GetHex(b & 0xF);
dest += 2;
}
*dest = 0;
}
+*/
-LRESULT CPanel::SetItemText(LVITEMW &item)
+bool IsSizeProp(UINT propID) throw()
{
+ switch (propID)
+ {
+ case kpidSize:
+ case kpidPackSize:
+ case kpidNumSubDirs:
+ case kpidNumSubFiles:
+ case kpidOffset:
+ case kpidLinks:
+ case kpidNumBlocks:
+ case kpidNumVolumes:
+ case kpidPhySize:
+ case kpidHeadersSize:
+ case kpidTotalSize:
+ case kpidFreeSpace:
+ case kpidClusterSize:
+ case kpidNumErrors:
+ case kpidNumStreams:
+ case kpidNumAltStreams:
+ case kpidAltStreamsSize:
+ case kpidVirtualSize:
+ case kpidUnpackSize:
+ case kpidTotalPhySize:
+ case kpidTailSize:
+ case kpidEmbeddedStubSize:
+ return true;
+ }
+ return false;
+}
+LRESULT CPanel::SetItemText(LVITEMW &item)
+{
if (_dontShowMode)
return 0;
UInt32 realIndex = GetRealIndex(item);
+
/*
if ((item.mask & LVIF_IMAGE) != 0)
{
@@ -107,10 +167,31 @@ LRESULT CPanel::SetItemText(LVITEMW &item)
if ((item.mask & LVIF_TEXT) == 0)
return 0;
- if (realIndex == kParentIndex)
+ LPWSTR text = item.pszText;
+
+ if (item.cchTextMax > 0)
+ text[0] = 0;
+
+ if (item.cchTextMax <= 1)
return 0;
+
const CItemProperty &property = _visibleProperties[item.iSubItem];
PROPID propID = property.ID;
+
+ if (realIndex == kParentIndex)
+ {
+ if (propID == kpidName)
+ {
+ if (item.cchTextMax > 2)
+ {
+ text[0] = '.';
+ text[1] = '.';
+ text[2] = 0;
+ }
+ }
+ return 0;
+ }
+
if (property.IsRawProp)
{
@@ -118,10 +199,10 @@ LRESULT CPanel::SetItemText(LVITEMW &item)
UInt32 dataSize;
UInt32 propType;
RINOK(_folderRawProps->GetRawProp(realIndex, propID, &data, &dataSize, &propType));
- int limit = item.cchTextMax - 1;
+ unsigned limit = item.cchTextMax - 1;
if (dataSize == 0)
{
- item.pszText[0] = 0;
+ text[0] = 0;
return 0;
}
@@ -131,15 +212,15 @@ LRESULT CPanel::SetItemText(LVITEMW &item)
ConvertNtReparseToString((const Byte *)data, dataSize, s);
if (!s.IsEmpty())
{
- int i;
+ unsigned i;
for (i = 0; i < limit; i++)
{
wchar_t c = s[i];
if (c == 0)
break;
- item.pszText[i] = c;
+ text[i] = c;
}
- item.pszText[i] = 0;
+ text[i] = 0;
return 0;
}
}
@@ -149,45 +230,45 @@ LRESULT CPanel::SetItemText(LVITEMW &item)
ConvertNtSecureToString((const Byte *)data, dataSize, s);
if (!s.IsEmpty())
{
- int i;
+ unsigned i;
for (i = 0; i < limit; i++)
{
- wchar_t c = s[i];
+ wchar_t c = (Byte)s[i];
if (c == 0)
break;
- item.pszText[i] = c;
+ text[i] = c;
}
- item.pszText[i] = 0;
+ text[i] = 0;
return 0;
}
}
{
- const UInt32 kMaxDataSize = 64;
+ const unsigned kMaxDataSize = 64;
if (dataSize > kMaxDataSize)
{
- char temp[64];
+ char temp[32];
MyStringCopy(temp, "data:");
ConvertUInt32ToString(dataSize, temp + 5);
- int i;
+ unsigned i;
for (i = 0; i < limit; i++)
{
- wchar_t c = temp[i];
+ wchar_t c = (Byte)temp[i];
if (c == 0)
break;
- item.pszText[i] = c;
+ text[i] = c;
}
- item.pszText[i] = 0;
+ text[i] = 0;
}
else
{
- if ((int)dataSize > limit)
+ if (dataSize > limit)
dataSize = limit;
- WCHAR *dest = item.pszText;
+ WCHAR *dest = text;
for (UInt32 i = 0; i < dataSize; i++)
{
- Byte b = ((const Byte *)data)[i];
- dest[0] = GetHex((Byte)((b >> 4) & 0xF));
- dest[1] = GetHex((Byte)(b & 0xF));
+ unsigned b = ((const Byte *)data)[i];
+ dest[0] = (WCHAR)GetHex((b >> 4) & 0xF);
+ dest[1] = (WCHAR)GetHex(b & 0xF);
dest += 2;
}
*dest = 0;
@@ -230,11 +311,7 @@ LRESULT CPanel::SetItemText(LVITEMW &item)
*/
if (item.cchTextMax < 32)
- {
- if (item.cchTextMax > 0)
- item.pszText[0] = 0;
return 0;
- }
if (propID == kpidName)
{
@@ -245,35 +322,36 @@ LRESULT CPanel::SetItemText(LVITEMW &item)
_folderGetItemName->GetItemName(realIndex, &name, &nameLen);
if (name)
{
- int dest = 0;
- int limit = item.cchTextMax - 1;
- for (int i = 0; dest < limit;)
+ unsigned dest = 0;
+ unsigned limit = item.cchTextMax - 1;
+ for (unsigned i = 0; dest < limit;)
{
wchar_t c = name[i++];
if (c == 0)
break;
- item.pszText[dest++] = c;
+ text[dest++] = c;
if (c != ' ')
continue;
if (name[i + 1] != ' ')
continue;
- int t = 2;
+ unsigned t = 2;
for (; name[i + t] == ' '; t++);
if (t >= 4 && dest + 4 <= limit)
{
- item.pszText[dest++] = '.';
- item.pszText[dest++] = '.';
- item.pszText[dest++] = '.';
- item.pszText[dest++] = ' ';
+ text[dest++] = '.';
+ text[dest++] = '.';
+ text[dest++] = '.';
+ text[dest++] = ' ';
i += t;
}
}
- item.pszText[dest] = 0;
+ text[dest] = 0;
return 0;
}
}
}
+
if (propID == kpidPrefix)
{
if (_folderGetItemName)
@@ -283,73 +361,65 @@ LRESULT CPanel::SetItemText(LVITEMW &item)
_folderGetItemName->GetItemPrefix(realIndex, &name, &nameLen);
if (name)
{
- int dest = 0;
- int limit = item.cchTextMax - 1;
- for (int i = 0; dest < limit;)
+ unsigned dest = 0;
+ unsigned limit = item.cchTextMax - 1;
+ for (unsigned i = 0; dest < limit;)
{
wchar_t c = name[i++];
if (c == 0)
break;
- item.pszText[dest++] = c;
+ text[dest++] = c;
}
- item.pszText[dest] = 0;
+ text[dest] = 0;
return 0;
}
}
}
+
HRESULT res = _folder->GetProperty(realIndex, propID, &prop);
+
if (res != S_OK)
{
- MyStringCopy(item.pszText, L"Error: ");
+ MyStringCopy(text, L"Error: ");
// s = UString(L"Error: ") + HResultToMessage(res);
}
- else if ((prop.vt == VT_UI8 || prop.vt == VT_UI4 || prop.vt == VT_UI2) && (
- propID == kpidSize ||
- propID == kpidPackSize ||
- propID == kpidNumSubDirs ||
- propID == kpidNumSubFiles ||
- propID == kpidPosition ||
- propID == kpidNumBlocks ||
- propID == kpidClusterSize ||
- propID == kpidTotalSize ||
- propID == kpidFreeSpace ||
- propID == kpidUnpackSize
- ))
+ else if ((prop.vt == VT_UI8 || prop.vt == VT_UI4 || prop.vt == VT_UI2) && IsSizeProp(propID))
{
UInt64 v = 0;
ConvertPropVariantToUInt64(prop, v);
- ConvertSizeToString(v, item.pszText);
+ ConvertSizeToString(v, text);
}
else if (prop.vt == VT_BSTR)
{
- int limit = item.cchTextMax - 1;
+ unsigned limit = item.cchTextMax - 1;
const wchar_t *src = prop.bstrVal;
- int i;
+ unsigned i;
for (i = 0; i < limit; i++)
{
wchar_t c = src[i];
if (c == 0) break;
if (c == 0xA) c = ' ';
if (c == 0xD) c = ' ';
- item.pszText[i] = c;
+ text[i] = c;
}
- item.pszText[i] = 0;
+ text[i] = 0;
}
else
{
char temp[64];
ConvertPropertyToShortString(temp, prop, propID, false);
- int i;
- int limit = item.cchTextMax - 1;
+ unsigned i;
+ unsigned limit = item.cchTextMax - 1;
for (i = 0; i < limit; i++)
{
- wchar_t c = temp[i];
+ wchar_t c = (Byte)temp[i];
if (c == 0)
break;
- item.pszText[i] = c;
+ text[i] = c;
}
- item.pszText[i] = 0;
+ text[i] = 0;
}
+
return 0;
}
@@ -606,7 +676,7 @@ void CPanel::Refresh_StatusBar()
if (indices.Size() > 0)
{
- // for (int ttt = 0; ttt < 1000; ttt++) {
+ // for (unsigned ttt = 0; ttt < 1000; ttt++) {
UInt64 totalSize = 0;
FOR_VECTOR (i, indices)
totalSize += GetItemSize(indices[i]);
@@ -632,10 +702,10 @@ void CPanel::Refresh_StatusBar()
char dateString2[32];
dateString2[0] = 0;
ConvertPropertyToShortString(dateString2, prop, kpidMTime, false);
- for (int i = 0;; i++)
+ for (unsigned i = 0;; i++)
{
char c = dateString2[i];
- dateString[i] = c;
+ dateString[i] = (Byte)c;
if (c == 0)
break;
}