diff options
Diffstat (limited to 'CPP/7zip/UI/FileManager/PanelListNotify.cpp')
-rw-r--r-- | CPP/7zip/UI/FileManager/PanelListNotify.cpp | 252 |
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; } |