view.cpp
Upload User: xhy777
Upload Date: 2007-02-14
Package Size: 24088k
Code Size: 7k
Category:

Windows Kernel

Development Platform:

Visual C++

  1. #include "folder.h"
  2. #include "item.h"
  3. #include "utils.h"
  4. #include <mluisupp.h>
  5. ///////////////////////////////////////////////////////////////////////////////
  6. // View functions
  7. const struct {
  8.     short int iCol;
  9.     short int ids;
  10.     short int cchCol;
  11.     short int iFmt;
  12. } s_ControlFolder_cols[] = {
  13.     {SI_CONTROL, IDS_COL_CONTROL, 20, LVCFMT_LEFT},
  14.     {SI_STATUS, IDS_COL_STATUS, 20, LVCFMT_LEFT},
  15.     {SI_TOTALSIZE, IDS_COL_TOTALSIZE, 18, LVCFMT_LEFT},
  16.     {SI_CREATION, IDS_COL_CREATION, 18, LVCFMT_LEFT},
  17.     {SI_LASTACCESS, IDS_COL_LASTACCESS, 18, LVCFMT_LEFT},
  18.     {SI_VERSION, IDS_COL_VERSION, 18, LVCFMT_LEFT}
  19. };
  20. HRESULT ControlFolderView_Command(HWND hwnd, UINT uID)
  21. {
  22.     switch (uID)
  23.     {
  24.     case IDM_SORTBYNAME:
  25.     case IDM_SORTBYSTATUS:
  26.     case IDM_SORTBYTOTALSIZE:
  27.     case IDM_SORTBYCREATION:
  28.     case IDM_SORTBYLASTACCESS:
  29.     case IDM_SORTBYVERSION:
  30.         ShellFolderView_ReArrange(hwnd, uID - IDM_SORTBYNAME);
  31.         break;
  32.     default:
  33.         return E_FAIL;
  34.     }
  35.     return NOERROR;
  36. }
  37. HMENU GetMenuFromID(HMENU hmenu, UINT idm)
  38. {
  39.     MENUITEMINFO mii = {sizeof(mii), MIIM_SUBMENU, 0, 0, 0, NULL, NULL, NULL, 0, NULL, 0};
  40.     GetMenuItemInfo(hmenu, idm, FALSE, &mii);
  41.     return mii.hSubMenu;
  42. }
  43. UINT MergeMenuHierarchy(
  44.                     HMENU hmenuDst, 
  45.                     HMENU hmenuSrc, 
  46.                     UINT idcMin, 
  47.                     UINT idcMax)
  48. {
  49.     UINT idcMaxUsed = idcMin;
  50.     int imi = GetMenuItemCount(hmenuSrc);
  51.     while (--imi >= 0) 
  52.     {
  53.         MENUITEMINFO mii = {sizeof(mii), MIIM_ID | MIIM_SUBMENU, 0, 0, 0, NULL, NULL, NULL, 0, NULL, 0};
  54.         if (GetMenuItemInfo(hmenuSrc, imi, TRUE, &mii)) 
  55.         {
  56.             UINT idcT = Shell_MergeMenus(
  57.                                   GetMenuFromID(hmenuDst, mii.wID),
  58.                                   mii.hSubMenu, 
  59.                                   0, idcMin, idcMax, 
  60.                                   MM_ADDSEPARATOR|MM_SUBMENUSHAVEIDS);
  61.             idcMaxUsed = max(idcMaxUsed, idcT);
  62.         }
  63.     }
  64.     return idcMaxUsed;
  65. }
  66. HRESULT ControlFolderView_MergeMenu(LPQCMINFO pqcm)
  67. {
  68.     HMENU hmenu = LoadMenu(MLGetHinst(), MAKEINTRESOURCE(IDR_CONTROLFOLDER));
  69.     Assert(hmenu != NULL);
  70.     if (hmenu)
  71.     {
  72.         MENUITEMINFO mii;
  73.         mii.cbSize = sizeof(mii);
  74.         mii.fMask = MIIM_ID;
  75.         mii.wID = SFVIDM_MENU_ARRANGE;
  76.         SetMenuItemInfo(hmenu, 0, TRUE, &mii);
  77.         MergeMenuHierarchy(pqcm->hmenu, hmenu, pqcm->idCmdFirst, pqcm->idCmdLast);
  78.         DestroyMenu(hmenu);
  79.     }
  80.     return NOERROR;
  81. }
  82. HRESULT ControlFolderView_InitMenuPopup(
  83.                                    HWND hwnd, 
  84.                                    UINT idCmdFirst, 
  85.                                    int nIndex, 
  86.                                    HMENU hmenu)
  87. {
  88.     return NOERROR;
  89. }
  90. HRESULT ControlFolderView_OnGetDetailsOf(
  91.                                     HWND hwnd, 
  92.                                     UINT iColumn, 
  93.                                     PDETAILSINFO pdi)
  94. {
  95.     BOOL bResult = TRUE;
  96.     LPCONTROLPIDL pcpidl = (LPCONTROLPIDL)pdi->pidl;
  97.     if (iColumn >= NUM_COLUMNS)
  98.         return E_NOTIMPL;
  99.     pdi->str.uType = STRRET_CSTR;
  100.     pdi->str.cStr[0] = '';
  101.     // if NULL, asking for column info
  102.     if (pcpidl == NULL)
  103.     {
  104.         MLLoadString(
  105.               s_ControlFolder_cols[iColumn].ids, 
  106.               pdi->str.cStr, 
  107.               ARRAYSIZE(pdi->str.cStr));
  108.         pdi->fmt = s_ControlFolder_cols[iColumn].iFmt;
  109.         pdi->cxChar = s_ControlFolder_cols[iColumn].cchCol;
  110.         return NOERROR;
  111.     }
  112.            
  113.     switch (iColumn)
  114.     {
  115.     case SI_CONTROL:
  116.         lstrcpy(pdi->str.cStr, GetStringInfo(pcpidl, SI_CONTROL));
  117.         break;
  118.     case SI_VERSION:
  119.         lstrcpy(pdi->str.cStr, GetStringInfo(pcpidl, SI_VERSION));
  120.         break;
  121.     case SI_CREATION:
  122.         lstrcpy(pdi->str.cStr, GetStringInfo(pcpidl, SI_CREATION));
  123.         break;
  124.     case SI_LASTACCESS:
  125.         lstrcpy(pdi->str.cStr, GetStringInfo(pcpidl, SI_LASTACCESS));
  126.         break;
  127.     case SI_TOTALSIZE:
  128.         GetSizeSaved(pcpidl, pdi->str.cStr);
  129.         break;
  130.     case SI_STATUS:
  131.         GetStatus(pcpidl, pdi->str.cStr, sizeof(pdi->str.cStr));
  132.         break;
  133.     default:
  134.         bResult = FALSE;
  135.     }
  136.     return (bResult ? NOERROR : E_FAIL);
  137. }
  138. HRESULT ControlFolderView_OnColumnClick(HWND hwnd, UINT iColumn)
  139. {
  140.     ShellFolderView_ReArrange(hwnd, iColumn);
  141.     return NOERROR;
  142. }
  143. HRESULT ControlFolderView_DidDragDrop(HWND hwnd, IDataObject *pdo, DWORD dwEffect)
  144. {
  145.     HRESULT hr = E_FAIL;
  146.     if (dwEffect & DROPEFFECT_MOVE)
  147.     {
  148.         CControlItem *pCItem;
  149.         if (SUCCEEDED(pdo->QueryInterface(CLSID_ControlFolder, (void **)&pCItem)))
  150.         {
  151.             hr = pCItem->Remove(hwnd);
  152.             pCItem->Release();
  153.         }
  154.     }
  155.     return hr;
  156. }
  157. HRESULT CALLBACK ControlFolderView_ViewCallback(
  158.                                      IShellView *psvOuter,
  159.                                      IShellFolder *psf,
  160.                                      HWND hwnd,
  161.                                      UINT uMsg,
  162.                                      WPARAM wParam,
  163.                                      LPARAM lParam)
  164. {
  165.     HRESULT hres = NOERROR;
  166.     switch (uMsg)
  167.     {
  168.     case DVM_GETHELPTEXT:
  169.         {
  170.             UINT id = LOWORD(wParam);
  171.             UINT cchBuf = HIWORD(wParam);
  172.             LPTSTR pszBuf = (LPTSTR)lParam;
  173.             MLLoadString(id + IDS_HELP_SORTBYNAME ,pszBuf, cchBuf);
  174.         }
  175.         break;
  176.     case DVM_DIDDRAGDROP:
  177.         hres = ControlFolderView_DidDragDrop(
  178.                                         hwnd, 
  179.                                         (IDataObject*)lParam, 
  180.                                         (DWORD)wParam);
  181.         break;
  182.     case DVM_INITMENUPOPUP:
  183.         hres = ControlFolderView_InitMenuPopup(
  184.                                            hwnd, 
  185.                                            LOWORD(wParam), 
  186.                                            HIWORD(wParam), 
  187.                                            (HMENU)lParam);
  188.         break;
  189.     case DVM_INVOKECOMMAND:
  190.         ControlFolderView_Command(hwnd, (UINT)wParam);
  191.         break;
  192.     case DVM_COLUMNCLICK:
  193.         hres = ControlFolderView_OnColumnClick(hwnd, (UINT)wParam);
  194.         break;
  195.     case DVM_GETDETAILSOF:
  196.         hres = ControlFolderView_OnGetDetailsOf(hwnd, (UINT)wParam, (PDETAILSINFO)lParam);
  197.         break;
  198.     case DVM_MERGEMENU:
  199.         hres = ControlFolderView_MergeMenu((LPQCMINFO)lParam);
  200.         break;
  201.     case DVM_DEFVIEWMODE:
  202.         *(FOLDERVIEWMODE *)lParam = FVM_DETAILS;
  203.         break;
  204.     default:
  205.         hres = E_FAIL;
  206.     }
  207.     return hres;
  208. }
  209. HRESULT ControlFolderView_CreateInstance(
  210.                                     CControlFolder *pCFolder, 
  211.                                     LPCITEMIDLIST pidl, 
  212.                                     void **ppvOut)
  213. {
  214.     CSFV csfv;
  215.     csfv.cbSize = sizeof(csfv);
  216.     csfv.pshf = (IShellFolder*)pCFolder;
  217.     csfv.psvOuter = NULL;
  218.     csfv.pidl = pidl;
  219.     csfv.lEvents = SHCNE_DELETE | SHCNE_UPDATEITEM; // SHCNE_DISKEVENTS | SHCNE_ASSOCCHANGED | SHCNE_GLOBALEVENTS;
  220.     csfv.pfnCallback = ControlFolderView_ViewCallback;
  221.     csfv.fvm = (FOLDERVIEWMODE)0;         // Have defview restore the folder view mode
  222.     return SHCreateShellFolderViewEx(&csfv, (IShellView**)ppvOut); // &this->psv);
  223. }