1 // PanelListNotify.cpp
\r
5 #include "resource.h"
\r
7 #include "Common/IntToString.h"
\r
8 #include "Common/StringConvert.h"
\r
10 #include "Windows/PropVariant.h"
\r
11 #include "Windows/PropVariantConversions.h"
\r
13 #include "../Common/PropIDUtils.h"
\r
14 #include "../../PropID.h"
\r
17 #include "FormatUtils.h"
\r
19 using namespace NWindows;
\r
22 static UString ConvertSizeToStringShort(UInt64 value)
\r
25 wchar_t c, c2 = L'B';
\r
26 if (value < (UInt64)10000)
\r
31 else if (value < ((UInt64)10000 << 10))
\r
36 else if (value < ((UInt64)10000 << 20))
\r
46 ConvertUInt64ToString(value, s);
\r
47 int p = MyStringLen(s);
\r
56 UString ConvertSizeToString(UInt64 value)
\r
59 ConvertUInt64ToString(value, s);
\r
60 int i = MyStringLen(s);
\r
61 int pos = sizeof(s) / sizeof(s[0]);
\r
75 LRESULT CPanel::SetItemText(LVITEMW &item)
\r
80 UINT32 realIndex = GetRealIndex(item);
\r
82 if ((item.mask & LVIF_IMAGE) != 0)
\r
84 bool defined = false;
\r
85 CComPtr<IFolderGetSystemIconIndex> folderGetSystemIconIndex;
\r
86 _folder.QueryInterface(&folderGetSystemIconIndex);
\r
87 if (folderGetSystemIconIndex)
\r
89 folderGetSystemIconIndex->GetSystemIconIndex(index, &item.iImage);
\r
90 defined = (item.iImage > 0);
\r
94 NCOM::CPropVariant prop;
\r
95 _folder->GetProperty(index, kpidAttrib, &prop);
\r
97 if (prop.vt == VT_UI4)
\r
98 attrib = prop.ulVal;
\r
99 else if (IsItemFolder(index))
\r
100 attrib |= FILE_ATTRIBUTE_DIRECTORY;
\r
101 if (_currentFolderPrefix.IsEmpty())
\r
104 item.iImage = _extToIconMap.GetIconIndex(attrib, GetSystemString(GetItemName(index)));
\r
106 // item.iImage = 1;
\r
110 if ((item.mask & LVIF_TEXT) == 0)
\r
113 if (realIndex == kParentIndex)
\r
116 UINT32 subItemIndex = item.iSubItem;
\r
117 PROPID propID = _visibleProperties[subItemIndex].ID;
\r
120 NCOM::CPropVariant property;
\r
121 if (propID == kpidType)
\r
122 string = GetFileType(index);
\r
125 HRESULT result = m_ArchiveFolder->GetProperty(index, propID, &property);
\r
126 if (result != S_OK)
\r
128 // PrintMessage("GetPropertyValue error");
\r
131 string = ConvertPropertyToString(property, propID, false);
\r
135 // const NFind::CFileInfo &aFileInfo = m_Files[index];
\r
137 NCOM::CPropVariant prop;
\r
139 bool needRead = true;
\r
140 if (propID == kpidSize)
\r
142 CComPtr<IFolderGetItemFullSize> getItemFullSize;
\r
143 if (_folder.QueryInterface(&getItemFullSize) == S_OK)
\r
145 if (getItemFullSize->GetItemFullSize(index, &prop) == S_OK)
\r
152 HRESULT res = _folder->GetProperty(realIndex, propID, &prop);
\r
154 s = UString(L"Error: ") + HResultToMessage(res);
\r
156 if ((prop.vt == VT_UI8 || prop.vt == VT_UI4) && (
\r
157 propID == kpidSize ||
\r
158 propID == kpidPackSize ||
\r
159 propID == kpidNumSubDirs ||
\r
160 propID == kpidNumSubFiles ||
\r
161 propID == kpidPosition ||
\r
162 propID == kpidNumBlocks ||
\r
163 propID == kpidClusterSize ||
\r
164 propID == kpidTotalSize ||
\r
165 propID == kpidFreeSpace
\r
167 s = ConvertSizeToString(ConvertPropVariantToUInt64(prop));
\r
170 s = ConvertPropertyToString(prop, propID, false);
\r
171 s.Replace(wchar_t(0xA), L' ');
\r
172 s.Replace(wchar_t(0xD), L' ');
\r
174 int size = item.cchTextMax;
\r
177 if (s.Length() + 1 > size)
\r
178 s = s.Left(size - 1);
\r
179 MyStringCopy(item.pszText, (const wchar_t *)s);
\r
185 extern DWORD g_ComCtl32Version;
\r
188 void CPanel::OnItemChanged(NMLISTVIEW *item)
\r
190 int index = (int)item->lParam;
\r
191 if (index == kParentIndex)
\r
193 bool oldSelected = (item->uOldState & LVIS_SELECTED) != 0;
\r
194 bool newSelected = (item->uNewState & LVIS_SELECTED) != 0;
\r
195 // Don't change this code. It works only with such check
\r
196 if (oldSelected != newSelected)
\r
197 _selectedStatusVector[index] = newSelected;
\r
200 extern bool g_LVN_ITEMACTIVATE_Support;
\r
202 void CPanel::OnNotifyActivateItems()
\r
204 // bool leftCtrl = (::GetKeyState(VK_LCONTROL) & 0x8000) != 0;
\r
205 // bool rightCtrl = (::GetKeyState(VK_RCONTROL) & 0x8000) != 0;
\r
206 bool alt = (::GetKeyState(VK_MENU) & 0x8000) != 0;
\r
207 bool ctrl = (::GetKeyState(VK_CONTROL) & 0x8000) != 0;
\r
208 bool shift = (::GetKeyState(VK_SHIFT) & 0x8000) != 0;
\r
209 if (!shift && alt && !ctrl)
\r
212 OpenSelectedItems(!shift || alt || ctrl);
\r
215 bool CPanel::OnNotifyList(LPNMHDR header, LRESULT &result)
\r
217 switch(header->code)
\r
219 case LVN_ITEMCHANGED:
\r
221 if (_enableItemChangeNotify)
\r
223 if (!_mySelectMode)
\r
224 OnItemChanged((LPNMLISTVIEW)header);
\r
225 RefreshStatusBar();
\r
231 case LVN_ODSTATECHANGED:
\r
237 case LVN_GETDISPINFOW:
\r
239 LV_DISPINFOW *dispInfo = (LV_DISPINFOW *)header;
\r
241 //is the sub-item information being requested?
\r
243 if ((dispInfo->item.mask & LVIF_TEXT) != 0 ||
\r
244 (dispInfo->item.mask & LVIF_IMAGE) != 0)
\r
245 SetItemText(dispInfo->item);
\r
250 bool boolResult = OnKeyDown(LPNMLVKEYDOWN(header), result);
\r
251 RefreshStatusBar();
\r
255 case LVN_COLUMNCLICK:
\r
256 OnColumnClick(LPNMLISTVIEW(header));
\r
259 case LVN_ITEMACTIVATE:
\r
260 if (g_LVN_ITEMACTIVATE_Support)
\r
262 OnNotifyActivateItems();
\r
268 if (!g_LVN_ITEMACTIVATE_Support)
\r
270 OnNotifyActivateItems();
\r
276 RefreshStatusBar();
\r
280 return OnRightClick((LPNMITEMACTIVATE)header, result);
\r
284 SendRefreshStatusBarMessage();
\r
287 // TODO : Handler default action...
\r
289 case LVN_ITEMCHANGED:
\r
291 NMLISTVIEW *pNMLV = (NMLISTVIEW *) lpnmh;
\r
296 return onSetFocus(NULL);
\r
298 return onKillFocus(NULL);
\r
302 // we need SetFocusToList, if we drag-select items from other panel.
\r
304 RefreshStatusBar();
\r
307 if (g_ComCtl32Version >= MAKELONG(71, 4))
\r
309 OnLeftClick((MY_NMLISTVIEW_NMITEMACTIVATE *)header);
\r
312 case LVN_BEGINLABELEDITW:
\r
313 result = OnBeginLabelEdit((LV_DISPINFOW *)header);
\r
315 case LVN_ENDLABELEDITW:
\r
316 result = OnEndLabelEdit((LV_DISPINFOW *)header);
\r
319 case NM_CUSTOMDRAW:
\r
322 return OnCustomDraw((LPNMLVCUSTOMDRAW)header, result);
\r
325 case LVN_BEGINDRAG:
\r
327 OnDrag((LPNMLISTVIEW)header);
\r
328 RefreshStatusBar();
\r
331 // case LVN_BEGINRDRAG:
\r
336 bool CPanel::OnCustomDraw(LPNMLVCUSTOMDRAW lplvcd, LRESULT &result)
\r
338 switch(lplvcd->nmcd.dwDrawStage)
\r
340 case CDDS_PREPAINT :
\r
341 result = CDRF_NOTIFYITEMDRAW;
\r
344 case CDDS_ITEMPREPAINT:
\r
346 SelectObject(lplvcd->nmcd.hdc,
\r
347 GetFontForItem(lplvcd->nmcd.dwItemSpec,
\r
348 lplvcd->nmcd.lItemlParam) );
\r
349 lplvcd->clrText = GetColorForItem(lplvcd->nmcd.dwItemSpec,
\r
350 lplvcd->nmcd.lItemlParam);
\r
351 lplvcd->clrTextBk = GetBkColorForItem(lplvcd->nmcd.dwItemSpec,
\r
352 lplvcd->nmcd.lItemlParam);
\r
354 int realIndex = (int)lplvcd->nmcd.lItemlParam;
\r
355 bool selected = false;
\r
356 if (realIndex != kParentIndex)
\r
357 selected = _selectedStatusVector[realIndex];
\r
359 lplvcd->clrTextBk = RGB(255, 192, 192);
\r
360 // lplvcd->clrText = RGB(255, 0, 128);
\r
362 lplvcd->clrTextBk = _listView.GetBkColor();
\r
363 // lplvcd->clrText = RGB(0, 0, 0);
\r
364 // result = CDRF_NEWFONT;
\r
365 result = CDRF_NOTIFYITEMDRAW;
\r
371 case CDDS_SUBITEM | CDDS_ITEMPREPAINT:
\r
372 if (lplvcd->iSubItem == 0)
\r
374 // lplvcd->clrText = RGB(255, 0, 0);
\r
375 lplvcd->clrTextBk = RGB(192, 192, 192);
\r
379 lplvcd->clrText = RGB(0, 0, 0);
\r
380 lplvcd->clrTextBk = RGB(255, 255, 255);
\r
385 /* At this point, you can change the background colors for the item
\r
386 and any subitems and return CDRF_NEWFONT. If the list-view control
\r
387 is in report mode, you can simply return CDRF_NOTIFYSUBITEMREDRAW
\r
388 to customize the item's subitems individually */
\r
393 void CPanel::OnRefreshStatusBar()
\r
395 CRecordVector<UINT32> indices;
\r
396 GetOperatedItemIndices(indices);
\r
398 _statusBar.SetText(0, MyFormatNew(IDS_N_SELECTED_ITEMS, 0x02000301, NumberToString(indices.Size())));
\r
400 UString selectSizeString;
\r
402 if (indices.Size() > 0)
\r
404 UInt64 totalSize = 0;
\r
405 for (int i = 0; i < indices.Size(); i++)
\r
406 totalSize += GetItemSize(indices[i]);
\r
407 selectSizeString = ConvertSizeToString(totalSize);
\r
409 _statusBar.SetText(1, selectSizeString);
\r
411 int focusedItem = _listView.GetFocusedItem();
\r
412 UString sizeString;
\r
413 UString dateString;
\r
414 if (focusedItem >= 0 && _listView.GetSelectedCount() > 0)
\r
416 int realIndex = GetRealItemIndex(focusedItem);
\r
417 if (realIndex != kParentIndex)
\r
419 sizeString = ConvertSizeToString(GetItemSize(realIndex));
\r
420 NCOM::CPropVariant prop;
\r
421 if (_folder->GetProperty(realIndex, kpidMTime, &prop) == S_OK)
\r
422 dateString = ConvertPropertyToString(prop, kpidMTime, false);
\r
425 _statusBar.SetText(2, sizeString);
\r
426 _statusBar.SetText(3, dateString);
\r
427 // _statusBar.SetText(4, nameString);
\r
428 // _statusBar2.SetText(1, MyFormatNew(L"{0} bytes", NumberToStringW(totalSize)));
\r