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

Windows Kernel

Development Platform:

Visual C++

  1. /* sample source code for IE4 view extension
  2.  * 
  3.  * Copyright Microsoft 1996
  4.  *
  5.  * This file implements the IShellFolderView interface
  6.  */
  7. #include "precomp.h"
  8. //////////////////////////////////////////////////////////////////////////////////
  9. void CThumbnailView::SortBy( LPARAM dwArrange, BOOL fAscend )
  10. {
  11.     if (m_hWndListView != NULL )
  12.     {
  13.         // now sort the view ...
  14.         ListViewCompareStruct   rgCompare;
  15.         // the shell always loses the sort item, so shall we :-)
  16.         rgCompare.m_iCompareFlag = dwArrange;
  17.         rgCompare.m_iAscend = ( fAscend ? 1 : -1 );
  18.         rgCompare.m_pFolder = m_pFolder;
  19.         m_pFolder->AddRef();
  20.         ListView_SortItems( m_hWndListView, ListViewCompare, ( LPARAM ) &rgCompare );
  21.             
  22.         rgCompare.m_pFolder->Release();
  23.     }
  24. }
  25. //////////////////////////////////////////////////////////////////////////////////
  26. HRESULT CThumbnailView::EnumFolder( )
  27. {
  28.     ULONG ulType = SHCONTF_FOLDERS | SHCONTF_NONFOLDERS;
  29.     if ( m_fShowAllObjects )
  30.        ulType |= SHCONTF_INCLUDEHIDDEN;
  31.     
  32.     IEnumIDList *pEnum;
  33.     HRESULT hr = m_pFolder->EnumObjects(this->m_hWnd, ulType, &pEnum);
  34.     if (hr == S_OK)
  35.     {
  36.         for (;;)
  37.         {
  38.             ULONG celtFetched;
  39.             LPITEMIDLIST pidlList;
  40.             hr = pEnum->Next( 1, &pidlList, &celtFetched );
  41.             if ((hr == S_OK) && (celtFetched == 1))
  42.             {
  43.                 int iRes = this->AddItem(pidlList);
  44.                 if ( iRes == -1 )
  45.                     SHFree(pidlList);  // AddItem() failed, clean up
  46.             }
  47.             else
  48.                 break;      // end of loop ....
  49.         }
  50.         pEnum->Release();
  51.     }
  52.     else if (hr == S_FALSE)
  53.     {
  54.         IShellFolderView *psfv;
  55.         hr = m_pDefView->QueryInterface(IID_IShellFolderView, (void **)&psfv);
  56.         if (SUCCEEDED(hr))
  57.         {
  58.             UINT cItems;
  59.             hr = psfv->GetObjectCount(&cItems);
  60.             if (SUCCEEDED(hr))
  61.             {
  62.                 for (UINT i = 0; i < cItems ; i++)
  63.                 {
  64.                     LPITEMIDLIST pidl;
  65.                     if (SUCCEEDED(psfv->GetObject(&pidl, i)))
  66.                     {
  67.                         LPITEMIDLIST pidlAdd = ILClone(pidl);
  68.                         if (pidlAdd)
  69.                         {
  70.                             if (-1 == this->AddItem(pidlAdd))
  71.                                 ILFree(pidlAdd);
  72.                         }
  73.                     }
  74.                 }
  75.             }
  76.         }
  77.     }
  78.     
  79.     return hr;
  80. }
  81. //////////////////////////////////////////////////////////////////////////////////
  82. void CThumbnailView::FocusOnSomething( )
  83. {
  84.     ListView_SetItemState( m_hWndListView, 0, LVIS_FOCUSED, LVIS_FOCUSED );
  85. }
  86. int CThumbnailView::AddItem( LPCITEMIDLIST pidl )
  87. {
  88.     int iPos = -1;
  89.     // NOTE: the IShellView we pass is the one for the Def-View, if it 
  90.     // NOTE: needs to delegate to us, it will.
  91.     if (m_pCommDlg == NULL || 
  92.         S_FALSE != m_pCommDlg->IncludeObject(m_pDefView, pidl))
  93.     {
  94.         // note: the icon is done on a callback so that we only fetch those displayed
  95.         WCHAR szTextBuffer[MAX_PATH];
  96.         LV_ITEMW rgData;
  97.         ZeroMemory( &rgData, sizeof( rgData ));
  98.         rgData.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
  99.         rgData.iItem = 0x7fffffff - 1;
  100.         rgData.lParam = (LPARAM) pidl;
  101.         rgData.iImage = I_IMAGECALLBACK;
  102.         rgData.pszText = szTextBuffer;
  103.         ULONG ulAttrs = SFGAO_GHOSTED;
  104.         if ( SUCCEEDED(m_pFolder->GetAttributesOf( 1, &pidl, &ulAttrs )) && ulAttrs & SFGAO_GHOSTED )
  105.         {
  106.             rgData.stateMask = LVIS_CUT;
  107.             rgData.state = LVIS_CUT;
  108.             rgData.mask |= LVIF_STATE;
  109.         }
  110.    
  111.         STRRET strret;
  112.         if (SUCCEEDED(m_pFolder->GetDisplayNameOf( pidl, SHGDN_NORMAL, &strret )))
  113.         {
  114.             StrRetToBufW(&strret, pidl, szTextBuffer, ARRAYSIZE(szTextBuffer));
  115.             iPos = ListView_InsertItemWrapW( m_hWndListView, &rgData);
  116.         }
  117.     }
  118.     return iPos;
  119. }
  120. ///////////////////////////////////////////////////////////////////////////////////////////
  121. //////////////////////////////CDropTargetClient////////////////////////////////////////////
  122. ///////////////////////////////////////////////////////////////////////////////////////////
  123. void CThumbnailView::PreScrolling( WORD wVertical, WORD wHorizontal )
  124. {
  125.     // do nothing...
  126. }
  127. //////////////////////////////////////////////////////////////////////////////////////////
  128. void CThumbnailView::GetOrigin( POINT * prgOrigin )
  129. {
  130.     Assert( prgOrigin != NULL );
  131.     ListView_GetOrigin( m_hWndListView, prgOrigin );
  132. }
  133. //////////////////////////////////////////////////////////////////////////////////////////
  134. HWND CThumbnailView::GetWindow()
  135. {
  136.     return m_hWndListView;
  137. }
  138. //////////////////////////////////////////////////////////////////////////////////////////
  139. BOOL CThumbnailView::WasDragStartedHere()
  140. {
  141.     return m_fDragStarted;
  142. }
  143. //////////////////////////////////////////////////////////////////////////////////////////
  144. HRESULT CThumbnailView::MoveSelectedItems( int iDx, int iDy )
  145. {
  146.     // nothing to move behind the scenes ...
  147.     m_fItemsMoved = TRUE;
  148.     return NOERROR;
  149. }