Commit before breaking everything
[matches/honours.git] / research / transmission_spectroscopy / TOF / Win32++ / samples / Explorer / src / MyListView.cpp
1 //////////////////////////////////////////////////////////\r
2 // MyListView.cpp\r
3 //  Definitions for the CMyListView and ListItemData classes\r
4 \r
5 #include "stdafx.h"\r
6 #include "ExplorerApp.h"\r
7 #include "MyListView.h"\r
8 #include "resource.h"\r
9 \r
10 ////////////////////////////////\r
11 //CMyListView function definitions\r
12 int CALLBACK CMyListView::CompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)\r
13 {\r
14         UNREFERENCED_PARAMETER(lParamSort);\r
15         ListItemData*  pItem1 = (ListItemData*)lParam1;\r
16         ListItemData*  pItem2 = (ListItemData*)lParam2;\r
17 \r
18         HRESULT hr = pItem1->GetParentFolder().CompareIDs(0, pItem1->GetRelPidl(), pItem2->GetRelPidl());\r
19 \r
20         if(FAILED(hr))\r
21                 return 0;\r
22 \r
23         return (short)SCODE_CODE(GetScode(hr));\r
24 }\r
25 \r
26 CMyListView::CMyListView()\r
27 {\r
28         SetImageLists();\r
29 }\r
30 \r
31 CMyListView::~CMyListView()\r
32 {\r
33         DeleteItems();\r
34 }\r
35 \r
36 void CMyListView::DeleteItems()\r
37 {\r
38         m_pItems.clear();\r
39 }\r
40 \r
41 void CMyListView::DisplayFolder(CShellFolder& cParentFolder, Cpidl& cpidlFull, Cpidl& cpidlRel)\r
42 {\r
43         m_cpidlCurFull = cpidlFull;\r
44         if(cParentFolder.GetIShellFolder())\r
45                 cParentFolder.BindToObject(cpidlRel, NULL, IID_IShellFolder, m_csfCurFolder);\r
46         else\r
47                 m_csfCurFolder.SHGetDesktopFolder();\r
48 \r
49         DoDisplay();\r
50 }\r
51 \r
52 void CMyListView::DoBackgroundMenu(CPoint& ptScreen)\r
53 {\r
54         HRESULT        hr;\r
55         if(m_csfCurFolder.GetIShellFolder())\r
56         {\r
57                 CContextMenu ccm;\r
58                 hr = m_csfCurFolder.CreateViewObject(GetParent()->GetHwnd(), IID_IContextMenu, ccm);\r
59 \r
60                 if(SUCCEEDED(hr))\r
61                 {\r
62                         CMenu Popup;\r
63                         Popup.CreatePopupMenu();\r
64                         if(Popup.GetHandle())\r
65                         {\r
66                                 int   i = 0;\r
67                                 UINT  idCmdFirst = 0;\r
68                                 UINT  idCmd;\r
69 \r
70                                 //find the largest ID in the menu\r
71                                 while((idCmd = Popup.GetMenuItemID(i)) != (UINT)-1)\r
72                                 {\r
73                                         if(idCmd > idCmdFirst)\r
74                                                 idCmdFirst = idCmd;\r
75                                         i++;\r
76                                 }\r
77 \r
78                                 hr = ccm.QueryContextMenu(Popup, 0, ++idCmdFirst, (UINT)-1, CMF_NORMAL | CMF_EXPLORE);\r
79 \r
80                                 if(SUCCEEDED(hr))\r
81                                 {\r
82                                         ccm.QueryInterface(IID_IContextMenu2, m_ccm2);\r
83 \r
84                                         idCmd = Popup.TrackPopupMenu(TPM_LEFTALIGN | TPM_RETURNCMD | TPM_RIGHTBUTTON,\r
85                                                 ptScreen.x, ptScreen.y, this, NULL);\r
86 \r
87                                         if(idCmd)\r
88                                         {\r
89                                                 CMINVOKECOMMANDINFO  cmi = {0};\r
90                                                 cmi.cbSize = sizeof(CMINVOKECOMMANDINFO);\r
91                                                 cmi.hwnd = ::GetParent(m_hWnd);\r
92                                                 cmi.lpVerb = (LPCSTR)(INT_PTR)(idCmd - idCmdFirst);\r
93                                                 cmi.nShow = SW_SHOWNORMAL;\r
94                                                 ccm.InvokeCommand(cmi);\r
95 \r
96                                                 //The operation performed by the context menu may have\r
97                                                 // changed the contents of the folder, so do a refresh.\r
98                                                 DoDisplay();\r
99                                         }\r
100 \r
101                                         m_ccm2.Release();\r
102                                 }\r
103                         }\r
104                 }\r
105         }\r
106 }\r
107 \r
108 void CMyListView::DoContextMenu(CPoint& ptScreen)\r
109 {\r
110         LVHITTESTINFO  lvhti;\r
111         lvhti.pt = ptScreen;\r
112         ScreenToClient(lvhti.pt);\r
113         lvhti.flags = LVHT_NOWHERE;\r
114         HitTest(lvhti);\r
115 \r
116         if(LVHT_ONITEM & lvhti.flags)\r
117         {\r
118                 //get the selected items\r
119                 UINT  nItems = GetSelectedCount();\r
120                 std::vector<int> vItems(nItems, 0);\r
121                 int* pItemArray = &vItems.front();\r
122 \r
123                 if(pItemArray)\r
124                 {\r
125                         UINT  i;\r
126                         int   nCurItem;\r
127 \r
128                         //put the item clicked on first in the list\r
129                         pItemArray[0] = lvhti.iItem;\r
130 \r
131                         for(i = 1, nCurItem = -1; i < nItems; ++i)\r
132                         {\r
133                                 nCurItem = GetNextItem(nCurItem, LVNI_SELECTED);\r
134                                 if(nCurItem != lvhti.iItem)\r
135                                         pItemArray[i] = nCurItem;\r
136                                 else\r
137                                         --i;\r
138                         }\r
139 \r
140                         DoItemMenu(pItemArray, nItems, ptScreen);\r
141                 }\r
142         }\r
143         else\r
144                 DoBackgroundMenu(ptScreen);\r
145 }\r
146 \r
147 void CMyListView::DoDefault(int iItem)\r
148 {\r
149         LVITEM   lvItem = {0};\r
150         lvItem.mask = LVIF_PARAM;\r
151         lvItem.iItem = iItem;\r
152 \r
153         if(GetItem(lvItem))\r
154         {\r
155                 HRESULT        hr;\r
156                 ListItemData*  pInfo = (ListItemData*)lvItem.lParam;\r
157                 CShellFolder csFolder;\r
158                 CContextMenu ccm;\r
159                 csFolder = pInfo->GetParentFolder();\r
160 \r
161                 if (!csFolder.GetIShellFolder())\r
162                         csFolder.SHGetDesktopFolder();\r
163 \r
164                 if(csFolder.GetIShellFolder())\r
165                 {\r
166                         Cpidl* pCpidl = &(pInfo->GetRelPidl());\r
167                         hr = csFolder.GetUIObjectOf(m_hWnd, 1, pCpidl, IID_IContextMenu, 0, ccm);\r
168 \r
169                         if(SUCCEEDED(hr))\r
170                         {\r
171                                 CMenu Popup;\r
172                                 Popup.CreatePopupMenu();\r
173                                 if(Popup.GetHandle())\r
174                                 {\r
175                                         hr = ccm.QueryContextMenu(Popup, 0, 1, 0x7fff, CMF_DEFAULTONLY | CMF_EXPLORE);\r
176 \r
177                                         if(SUCCEEDED(hr))\r
178                                         {\r
179                                                 UINT idCmd = Popup.GetMenuItemID(0);\r
180                                                 if(idCmd && (idCmd != (UINT)-1))\r
181                                                 {\r
182                                                         //determine if the item is a folder\r
183                                                         ULONG ulAttr = SFGAO_HASSUBFOLDER | SFGAO_FOLDER;\r
184                                                         csFolder.GetAttributesOf(1, pInfo->GetRelPidl(), ulAttr);\r
185 \r
186                                                         if ((ulAttr & SFGAO_HASSUBFOLDER) || (ulAttr &SFGAO_FOLDER))\r
187                                                         {\r
188                                                                 GetExplorerApp().GetMainFrame().GetTreeView()->SelectFromListView(pInfo->GetFullPidl());\r
189                                                         }\r
190                                                         else\r
191                                                         {\r
192                                                                 CMINVOKECOMMANDINFO  cmi = {0};\r
193                                                                 cmi.cbSize = sizeof(CMINVOKECOMMANDINFO);\r
194                                                                 cmi.hwnd = ::GetParent(m_hWnd);\r
195                                                                 cmi.lpVerb = (LPCSTR)(INT_PTR)(idCmd - 1);\r
196                                                                 cmi.nShow = SW_SHOWNORMAL;\r
197                                                                 ccm.InvokeCommand(cmi);\r
198                                                         }\r
199                                                 }\r
200                                         }\r
201                                 }\r
202                         }\r
203                 }\r
204         }\r
205 }\r
206 \r
207 void CMyListView::DoDisplay()\r
208 {\r
209         DeleteAllItems();\r
210         DeleteItems();\r
211 \r
212         if(m_csfCurFolder.GetIShellFolder())\r
213         {\r
214                 HCURSOR  hCur = ::LoadCursor(NULL, IDC_WAIT);\r
215                 hCur = ::SetCursor(hCur);\r
216 \r
217                 //turn redawing off in the ListView. This will speed things up as we add items\r
218                 SendMessage(WM_SETREDRAW, FALSE, 0);\r
219 \r
220                 EnumObjects(m_csfCurFolder, m_cpidlCurFull);\r
221                 SortItems(CompareProc, 0);\r
222 \r
223                 //turn redawing back on\r
224                 SendMessage(WM_SETREDRAW, TRUE, 0);\r
225                 ::SetCursor(hCur);\r
226         }\r
227 }\r
228 \r
229 void CMyListView::DoItemMenu(LPINT piItems, UINT cbItems, CPoint& ptScreen)\r
230 {\r
231         std::vector<Cpidl> vpidl(cbItems);\r
232         Cpidl* pidlArray = &vpidl.front();\r
233 \r
234         for(UINT i = 0; i < cbItems; ++i)\r
235         {\r
236                 LVITEM lvItem = {0};\r
237                 lvItem.mask = LVIF_PARAM;\r
238                 lvItem.iItem = piItems[i];\r
239                 if(GetItem(lvItem))\r
240                 {\r
241                         ListItemData*  pInfo = (ListItemData*)lvItem.lParam;\r
242                         pidlArray[i] = pInfo->GetRelPidl();\r
243                 }\r
244         }\r
245 \r
246         if(pidlArray[0].GetPidl())\r
247         {\r
248                 HRESULT        hr;\r
249                 CContextMenu ccm;\r
250 \r
251                 if(m_csfCurFolder.GetIShellFolder())\r
252                 {\r
253                         hr = m_csfCurFolder.GetUIObjectOf(m_hWnd, cbItems, pidlArray, IID_IContextMenu, 0, ccm);\r
254 \r
255                         if(SUCCEEDED(hr))\r
256                         {\r
257                                 CMenu Popup;\r
258                                 Popup.CreatePopupMenu();\r
259                                 if(Popup.GetHandle())\r
260                                 {\r
261                                         hr = ccm.QueryContextMenu(Popup, 0, 1, 0x7fff, CMF_NORMAL | CMF_EXPLORE);\r
262                                         if(SUCCEEDED(hr))\r
263                                         {\r
264                                                 ccm.QueryInterface(IID_IContextMenu2, m_ccm2);\r
265                                                 UINT  idCmd;\r
266                                                 idCmd = Popup.TrackPopupMenu(TPM_LEFTALIGN | TPM_RETURNCMD | TPM_RIGHTBUTTON,\r
267                                                                         ptScreen.x, ptScreen.y, this, NULL);\r
268 \r
269                                                 if(idCmd)\r
270                                                 {\r
271                                                         CMINVOKECOMMANDINFO  cmi = {0};\r
272                                                         cmi.cbSize = sizeof(CMINVOKECOMMANDINFO);\r
273                                                         cmi.hwnd = ::GetParent(m_hWnd);\r
274                                                         cmi.lpVerb = (LPCSTR)(INT_PTR)(idCmd - 1);\r
275                                                         cmi.nShow = SW_SHOWNORMAL;\r
276                                                         ccm.InvokeCommand(cmi);\r
277 \r
278                                                 //      The operation performed by the context menu may have changed\r
279                                                 //      the contents of the folder, so do a refresh.\r
280                                                         DoDisplay();\r
281                                                 }\r
282 \r
283                                                 m_ccm2.Release();\r
284                                         }\r
285                                 }\r
286                         }\r
287                 }\r
288         }\r
289 }\r
290 \r
291 LRESULT CMyListView::OnNotifyReflect(WPARAM, LPARAM lParam)\r
292 {\r
293         LPNMHDR  pnmh = (LPNMHDR) lParam;\r
294 \r
295         switch(pnmh->code)\r
296         {\r
297         case NM_RCLICK:\r
298                 {\r
299                         CPoint ptScreen;\r
300                         ::GetCursorPos(&ptScreen);\r
301                         DoContextMenu(ptScreen);\r
302                 }\r
303                 break;\r
304         case LVN_GETDISPINFO:\r
305                 {\r
306                         NMLVDISPINFO*   pdi = (NMLVDISPINFO*)lParam;\r
307                         ListItemData*   pItem = (ListItemData*)pdi->item.lParam;\r
308 \r
309                         //do we need to supply the text?\r
310                         if(pdi->item.mask & LVIF_TEXT)\r
311                         {\r
312                         TCHAR szFileName[MAX_PATH];\r
313                                 GetFullFileName(pItem->GetFullPidl().GetPidl(), szFileName);\r
314 \r
315                                 ULONG ulAttr = SFGAO_CANDELETE | SFGAO_FOLDER;\r
316                                 pItem->GetParentFolder().GetAttributesOf(1, pItem->GetRelPidl(), ulAttr);\r
317 \r
318                                 HANDLE hFile;\r
319 \r
320                                 //A trick to help get a quick response from CreateFile\r
321                                 if (ulAttr & SFGAO_CANDELETE)\r
322                                         hFile = ::CreateFile (szFileName, 0, FILE_SHARE_READ, NULL,\r
323                                                 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_BACKUP_SEMANTICS, NULL);\r
324                                 else\r
325                                         hFile = ::CreateFile (szFileName, 0, FILE_SHARE_READ, NULL,\r
326                                                 0, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_BACKUP_SEMANTICS, NULL);\r
327 \r
328                                 TCHAR szText[32];\r
329                                 int nMaxLength = sizeof(szText)/sizeof(szText[0])-1;\r
330 \r
331                                 switch(pdi->item.iSubItem)\r
332                                 {\r
333                                 case 0:  //name\r
334                                         {\r
335                                                 SHFILEINFO sfi = {0};\r
336                                                 //get the display name of the item\r
337                                                 if (pItem->GetFullPidl().SHGetFileInfo(0, sfi, SHGFI_PIDL | SHGFI_DISPLAYNAME))\r
338                                                         ::lstrcpyn(pdi->item.pszText, sfi.szDisplayName, pdi->item.cchTextMax -1);\r
339                                         }\r
340                                         break;\r
341                                 case 1: //Size\r
342                                         {\r
343                                                 TCHAR szSize[32];\r
344 \r
345                                                 //report the size files and not folders\r
346                                                 if ((hFile != INVALID_HANDLE_VALUE)&&(~ulAttr & SFGAO_FOLDER))\r
347                                                 {\r
348                                                         GetFileSizeText(hFile, szSize);\r
349                                                         ::lstrcpyn(pdi->item.pszText, szSize, nMaxLength -1);\r
350                                                 }\r
351                                                 else\r
352                                                         ::lstrcpy(pdi->item.pszText, _T(""));\r
353                                         }\r
354                                         break;\r
355                                 case 2: //Type\r
356                                         {\r
357                                                 SHFILEINFO sfi = {0};\r
358                                                 if(pItem->GetFullPidl().SHGetFileInfo(0, sfi, SHGFI_PIDL | SHGFI_TYPENAME))\r
359                                                         ::lstrcpyn(pdi->item.pszText, sfi.szTypeName, pdi->item.cchTextMax -1);\r
360                                         }\r
361                                         break;\r
362                                 case 3: //Modified\r
363                                         {\r
364                                                 if (hFile != INVALID_HANDLE_VALUE)\r
365                                                 {\r
366                                                         GetLastWriteTime(hFile, szText);\r
367                                                         ::lstrcpyn(pdi->item.pszText, szText, nMaxLength -1);\r
368                                                 }\r
369                                                 else\r
370                                                         ::lstrcpy(pdi->item.pszText, _T(""));\r
371                                         }\r
372                                         break;\r
373                                 }\r
374                                 if (hFile != INVALID_HANDLE_VALUE)\r
375                                         ::CloseHandle(hFile);\r
376                         }\r
377 \r
378                         //do we need to supply the unselected image?\r
379                         if(pdi->item.mask & LVIF_IMAGE)\r
380                         {\r
381                                 SHFILEINFO sfi = {0};\r
382 \r
383                                 //get the unselected image for this item\r
384                                 if(pItem->GetFullPidl().SHGetFileInfo(0, sfi, SHGFI_PIDL | SHGFI_SYSICONINDEX | SHGFI_SMALLICON))\r
385                                         pdi->item.iImage = sfi.iIcon;\r
386                         }\r
387                 }\r
388                 break;\r
389 \r
390         case NM_DBLCLK:\r
391         case NM_RETURN:\r
392                 {\r
393                         //get the item that has the focus\r
394                         int nItem = (int)::SendMessage(m_hWnd, LVM_GETNEXTITEM, (WPARAM) -1, (LPARAM) MAKELPARAM (LVNI_FOCUSED, 0));\r
395 \r
396                         if(nItem != -1)\r
397                                 DoDefault(nItem);\r
398                 }\r
399                 break;\r
400         }\r
401         return 0;\r
402 }\r
403 \r
404 void CMyListView::EnumObjects(CShellFolder& cPFolder, Cpidl& cpidlParent)\r
405 {\r
406         CEnumIDList cEnum;\r
407 \r
408         int grFlags = SHCONTF_FOLDERS | SHCONTF_NONFOLDERS;\r
409         if ( GetExplorerApp().GetMainFrame().GetShowHidden() )\r
410                 grFlags |= SHCONTF_INCLUDEHIDDEN;\r
411 \r
412         if(SUCCEEDED(cPFolder.EnumObjects(NULL, grFlags, cEnum)))\r
413         {\r
414                 ULONG ulFetched = 1;\r
415                 Cpidl cpidlRel;\r
416 \r
417                 //enumerate the item's PIDLs\r
418                 while(S_OK == (cEnum.Next(1, cpidlRel, ulFetched)) && ulFetched)\r
419                 {\r
420                         LVITEM lvItem = {0};\r
421                         ULONG  ulAttr;\r
422 \r
423                         //fill in the TV_ITEM structure for this item\r
424                         lvItem.mask = LVIF_PARAM | LVIF_TEXT | LVIF_IMAGE | LVIF_STATE;\r
425 \r
426                         //Store a pointer to the ListItemData in the lParam and m_pItems\r
427                         ListItemData* pItem = new ListItemData(cpidlParent, cpidlRel, cPFolder);\r
428                         lvItem.lParam = (LPARAM)pItem;\r
429                         m_pItems.push_back(pItem);\r
430 \r
431                         //text and images are done on a callback basis\r
432                         lvItem.pszText = LPSTR_TEXTCALLBACK;\r
433                         lvItem.iImage = I_IMAGECALLBACK;\r
434 \r
435                         //determine if the item's icon characteristics\r
436                         ulAttr = SFGAO_SHARE | SFGAO_LINK | SFGAO_GHOSTED;\r
437                         cPFolder.GetAttributesOf(1, cpidlRel, ulAttr);\r
438 \r
439                         if(ulAttr & SFGAO_SHARE)\r
440                         {\r
441                                 lvItem.mask |= LVIF_STATE;\r
442                                 lvItem.stateMask |= LVIS_OVERLAYMASK;\r
443                                 lvItem.state |= INDEXTOOVERLAYMASK(1); //1 is the index for the shared overlay image\r
444                         }\r
445 \r
446                         if (ulAttr & SFGAO_LINK)\r
447                         {\r
448                                 lvItem.mask |= LVIF_STATE;\r
449                                 lvItem.stateMask |= LVIS_OVERLAYMASK;\r
450                                 lvItem.state |= INDEXTOOVERLAYMASK(2); //2 is the index for the link overlay image\r
451                         }\r
452 \r
453                         if(ulAttr & SFGAO_GHOSTED)\r
454                         {\r
455                                 lvItem.mask |= LVIF_STATE;\r
456                                 lvItem.stateMask |= LVIS_CUT;\r
457                                 lvItem.state |= LVIS_CUT;\r
458                         }\r
459 \r
460                         InsertItem(lvItem);\r
461                         ulFetched = 0;\r
462                 }\r
463         }\r
464 }\r
465 \r
466 BOOL CMyListView::GetFileSizeText(HANDLE hFile, LPTSTR lpszSize)\r
467 {\r
468         DWORD dwFileSizeLo;\r
469         DWORD dwFileSizeHi;\r
470         DWORDLONG ldwSize;\r
471         int nMaxSize = 31;\r
472         CString strPreFormat;\r
473         CString strPostFormat;\r
474 \r
475         dwFileSizeLo = ::GetFileSize (hFile, &dwFileSizeHi);\r
476         ldwSize = ((DWORDLONG) dwFileSizeHi)<<32 | dwFileSizeLo;\r
477         strPreFormat.Format(_T("%d"), ((1023 + ldwSize)>>10));\r
478 \r
479         //Convert our number string using Locale information\r
480         ::GetNumberFormat(LOCALE_USER_DEFAULT, LOCALE_NOUSEROVERRIDE, strPreFormat, NULL, strPostFormat.GetBuffer(nMaxSize), nMaxSize);\r
481         strPostFormat.ReleaseBuffer();\r
482 \r
483         //Get our decimal point character from Locale information\r
484         int nBuffLen = ::GetLocaleInfo( LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, NULL, 0 );\r
485     assert(nBuffLen > 0);    \r
486         CString Decimal;\r
487         ::GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, Decimal.GetBuffer(nBuffLen), nBuffLen);\r
488         Decimal.ReleaseBuffer();\r
489 \r
490         //Truncate at the "decimal" point\r
491         int nPos = strPostFormat.Find(Decimal);\r
492         if (nPos > 0)\r
493                 strPostFormat = strPostFormat.Left(nPos);\r
494 \r
495         strPostFormat += _T(" KB");\r
496         lstrcpyn(lpszSize, strPostFormat, nMaxSize);\r
497         return TRUE;\r
498 }\r
499 \r
500 BOOL CMyListView::GetLastWriteTime(HANDLE hFile, LPTSTR lpszString)\r
501 {\r
502         FILETIME ftCreate, ftAccess, ftWrite;\r
503         SYSTEMTIME stLocal;\r
504         FILETIME ftLocal;\r
505         TCHAR szTime[32];\r
506         TCHAR szDate[32];\r
507 \r
508         // Retrieve the file times for the file.\r
509         if (!::GetFileTime(hFile, &ftCreate, &ftAccess, &ftWrite))\r
510                 return FALSE;\r
511 \r
512         // Convert the last-write time to local time.\r
513         ::FileTimeToLocalFileTime(&ftWrite, &ftLocal);\r
514         ::FileTimeToSystemTime(&ftLocal, &stLocal);\r
515 \r
516         // Build a string showing the date and time with regional settings.\r
517         ::GetDateFormat(LOCALE_USER_DEFAULT, DATE_SHORTDATE, &stLocal, NULL, szDate, 31);\r
518         ::GetTimeFormat(LOCALE_USER_DEFAULT, TIME_NOSECONDS, &stLocal, NULL, szTime, 31);\r
519 \r
520         ::lstrcpy(lpszString, szDate);\r
521         ::lstrcat(lpszString, _T(" "));\r
522         ::lstrcat(lpszString, szTime);\r
523 \r
524         return TRUE;\r
525 }\r
526 \r
527 HIMAGELIST CMyListView::GetImageList(BOOL bLarge)\r
528 {\r
529         if (bLarge)\r
530                 return m_hLargeImageList;\r
531         else\r
532                 return m_hSmallImageList;\r
533 }\r
534 \r
535 void CMyListView::OnInitialUpdate()\r
536 {\r
537         //Set the image lists\r
538         SendMessage(LVM_SETIMAGELIST, LVSIL_NORMAL, (LPARAM) GetImageList(TRUE));\r
539         SendMessage(LVM_SETIMAGELIST, LVSIL_SMALL, (LPARAM) GetImageList(FALSE));\r
540 \r
541         //Set up the colmns for report mode\r
542         TCHAR szText[256];\r
543         LVCOLUMN lvc = {0};\r
544     lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;\r
545         int iColumns = 4;       //Number of columns\r
546         int ColSize[4] = {150, 70, 100, 120}; // width of columns in pixels\r
547 \r
548     for (int iCol = 0; iCol < iColumns; iCol++)\r
549         {\r
550                 lvc.iSubItem = iCol;\r
551                 lvc.pszText = szText;\r
552                 lvc.cx = ColSize[iCol];\r
553 \r
554                 if (1 == iCol) lvc.fmt = LVCFMT_RIGHT; // right-aligned column\r
555                 else lvc.fmt = LVCFMT_LEFT;             //left-aligned column\r
556 \r
557                 ::LoadString(GetApp()->GetInstanceHandle(), IDS_COLUMN1 + iCol,\r
558                         szText, sizeof(szText)/sizeof(szText[0]));\r
559 \r
560                 InsertColumn(iCol, lvc);\r
561     }\r
562 \r
563         //Set initial the view style as report\r
564         ViewReport();\r
565 }\r
566 \r
567 void CMyListView::PreCreate(CREATESTRUCT &cs)\r
568 {\r
569         cs.style = WS_TABSTOP | WS_CHILD | WS_VISIBLE | LVS_AUTOARRANGE |\r
570             LVS_ICON | LVS_SHAREIMAGELISTS | LVS_SHOWSELALWAYS;\r
571         cs.dwExStyle = WS_EX_CLIENTEDGE;\r
572 }\r
573 \r
574 void CMyListView::SetImageLists()\r
575 {\r
576         SHFILEINFO  sfi;\r
577 \r
578         // Get the system image list\r
579         m_hLargeImageList = (HIMAGELIST)::SHGetFileInfo(_T("C:\\"), 0, &sfi,\r
580                 sizeof(SHFILEINFO), SHGFI_SYSICONINDEX);\r
581 \r
582         m_hSmallImageList = (HIMAGELIST)::SHGetFileInfo(_T("C:\\"), 0, &sfi,\r
583                 sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_SMALLICON);\r
584 }\r
585 \r
586 void CMyListView::ViewLargeIcons()\r
587 {\r
588         DWORD dwStyle = (DWORD)GetWindowLongPtr(GWL_STYLE);\r
589         SetWindowLongPtr(GWL_STYLE, (dwStyle & ~LVS_TYPEMASK) | LVS_ICON );\r
590 }\r
591 \r
592 void CMyListView::ViewSmallIcons()\r
593 {\r
594         DWORD dwStyle = (DWORD)GetWindowLongPtr(GWL_STYLE);\r
595         SetWindowLongPtr(GWL_STYLE, (dwStyle & ~LVS_TYPEMASK) | LVS_SMALLICON);\r
596 }\r
597 \r
598 void CMyListView::ViewList()\r
599 {\r
600         DWORD dwStyle = (DWORD)GetWindowLongPtr(GWL_STYLE);\r
601         SetWindowLongPtr(GWL_STYLE, (dwStyle & ~LVS_TYPEMASK) | LVS_LIST);\r
602 }\r
603 \r
604 void CMyListView::ViewReport()\r
605 {\r
606         DWORD dwStyle = (DWORD)GetWindowLongPtr(GWL_STYLE);\r
607         SetWindowLongPtr(GWL_STYLE, (dwStyle & ~LVS_TYPEMASK) | LVS_REPORT);\r
608 }\r
609 \r
610 LRESULT CMyListView::WndProc(UINT uMsg, WPARAM wParam, LPARAM lParam)\r
611 {\r
612         switch (uMsg)\r
613         {\r
614         case WM_DRAWITEM:\r
615         case WM_MENUCHAR:\r
616         case WM_MEASUREITEM:\r
617         case WM_INITMENUPOPUP:\r
618                 {\r
619                         if(m_ccm2.GetIContextMenu2())\r
620                                 m_ccm2.HandleMenuMsg(uMsg, wParam, lParam);\r
621                 }\r
622                 break;\r
623         case WM_DESTROY:\r
624                 // Cleanup\r
625                 m_pItems.clear();\r
626                 m_csfCurFolder.Delete();\r
627                 break;\r
628         }\r
629 \r
630         return WndProcDefault(uMsg, wParam, lParam);\r
631 }\r
632 \r
633 ///////////////////////////////////\r
634 //ListItemData function definitions\r
635 CMyListView::ListItemData::ListItemData(Cpidl& cpidlParent, Cpidl& cpidlRel, CShellFolder& cParentFolder)\r
636 {\r
637         m_cParentFolder = cParentFolder;\r
638         m_cpidlFull     = cpidlParent + cpidlRel;\r
639         m_cpidlRel      = cpidlRel;\r
640 }\r
641 \r
642 CMyListView::ListItemData::~ListItemData()\r
643 {\r
644 }\r

UCC git Repository :: git.ucc.asn.au