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

Windows Kernel

Development Platform:

Visual C++

  1. /*----------------------------------------------------------------------------
  2. / Title;
  3. /   viewcb.cpp
  4. /
  5. / Authors;
  6. /   Rick Turner (ricktu)
  7. /
  8. / Notes;
  9. /   Implements IShellFolderViewCB for My Documents code.
  10. /----------------------------------------------------------------------------*/
  11. #include "precomp.hxx"
  12. #pragma hdrstop
  13. /*-----------------------------------------------------------------------------
  14. / CMyDocsViewCB
  15. /   This is the My Documents IShellFolderViewCB implementation.
  16. /----------------------------------------------------------------------------*/
  17. CMyDocsViewCB::CMyDocsViewCB( IShellFolderView * psfv, LPITEMIDLIST pidl )
  18. {
  19.     MDTraceEnter(TRACE_CALLBACKS, "CMyDocsViewCB::CMyDocsViewCB");
  20.     m_psfv = psfv;
  21.     m_pidlReal = ILClone(pidl);
  22.     m_psfvcb = NULL;
  23.     MDTraceLeave();
  24. }
  25. CMyDocsViewCB::~CMyDocsViewCB()
  26. {
  27.     MDTraceEnter(TRACE_CALLBACKS, "CMyDocsViewCB::~CMyDocsViewCB");
  28.     DoILFree( m_pidlReal );
  29.     // DoRelease( m_psfv );  // Not currently Addrefing this...
  30.     DoRelease( m_psfvcb );
  31.     MDTraceLeave();
  32. }
  33. STDMETHODIMP
  34. CMyDocsViewCB::SetRealCB(IShellFolderViewCB * psfvcb)
  35. {
  36.     HRESULT hr = S_OK;
  37.     MDTraceEnter( TRACE_CALLBACKS, "CMyDocsViewCB::SetRealCB" );
  38.     DoRelease( m_psfvcb );
  39.     m_psfvcb = psfvcb;
  40.     MDTraceLeaveResult(hr);
  41. }
  42. #undef CLASS_NAME
  43. #define CLASS_NAME CMyDocsViewCB
  44. #include "unknown.inc"
  45. STDMETHODIMP
  46. CMyDocsViewCB::QueryInterface(REFIID riid, LPVOID* ppvObject)
  47. {
  48.     MDTraceEnter( TRACE_QI, "CMyDocsViewCB::QueryInterface" );
  49.     MDTraceGUID("Interface requested", riid);
  50.     HRESULT hr;
  51.     INTERFACES iface[] =
  52.     {
  53.         &IID_IShellFolderViewCB, (IShellFolderViewCB *)this,
  54.     };
  55.     if (IsEqualIID(riid, IID_IShellFolderViewCB) || IsEqualIID(riid, IID_IUnknown))
  56.     {
  57.         hr = HandleQueryInterface(riid, ppvObject, iface, ARRAYSIZE(iface));
  58.     }
  59.     else
  60.     {
  61.         MDTrace(TEXT("Getting interface from m_psfvcb->QI directly..."));
  62.         // This is totally bogus, but we may need to allow the query to go through to
  63.         // the one we are holding onto as the compatability one juses this to extract
  64.         // additional information...
  65.         hr = m_psfvcb->QueryInterface(riid, ppvObject);
  66.     }
  67.     MDTraceLeaveResult(hr);
  68. }
  69. STDMETHODIMP
  70. CMyDocsViewCB::MessageSFVCB(UINT uMsg, WPARAM wParam, LPARAM lParam)
  71. {
  72.     HRESULT hr = E_FAIL;
  73.     MDTraceEnter( TRACE_CALLBACKS, "CMyDocsViewCB::MessageSFVCB" );
  74.     MDTraceViewMsg( uMsg, wParam, lParam );
  75.     switch (uMsg)
  76.     {
  77.         case SFVM_GETHELPTEXT:
  78.         {
  79.             UINT id = LOWORD(wParam);
  80.             UINT cchBuf = HIWORD(wParam);
  81.             LPTSTR pszBuf = (LPTSTR)lParam;
  82.             if (LoadString(g_hInstance, id+IDS_SORT_FIRST, pszBuf, cchBuf))
  83.             {
  84.                 hr = S_OK;
  85.             }
  86.         }
  87.             break;
  88.         case SFVM_GETNOTIFY:
  89.         {
  90.             LPITEMIDLIST *  ppidl   = (LPITEMIDLIST *)wParam;
  91.             LONG *          pEvents = (LONG *)lParam;
  92.             hr = m_psfvcb->MessageSFVCB( uMsg, wParam, lParam );
  93.             *ppidl = m_pidlReal;
  94.             if (FAILED(hr))
  95.             {
  96.                 *pEvents = SHCNE_DELETE | SHCNE_CREATE | SHCNE_RENAMEITEM |
  97.                            SHCNE_UPDATEDIR | SHCNE_DISKEVENTS;
  98.                 hr = S_OK;
  99.             }
  100.         }
  101.             break;
  102.         case SFVM_INSERTITEM:
  103.         {
  104.             LPITEMIDLIST pidl = (LPITEMIDLIST) lParam;
  105.             TCHAR szPath[ MAX_PATH ];
  106.             LPTSTR pszName;
  107.             if (MDGetPathFromIDL(pidl, szPath, NULL))
  108.             {
  109.                 // Always hide the desktop.ini file.
  110.                 pszName = PathFindFileName( szPath );
  111.                 if ( 0 == lstrcmpi(pszName, TEXT("Desktop.ini")) )
  112.                 {
  113.                     hr = S_FALSE;
  114.                 }
  115.             }
  116.         }
  117.             break;
  118.         case SFVM_INVOKECOMMAND:
  119.             MDTraceAssert( m_psfv );
  120.             if (m_psfv)
  121.                 hr = m_psfv->Rearrange( (UINT)wParam );
  122.             break;
  123.         case SFVM_MERGEMENU:
  124.             hr = _MergeArrangeMenu( (LPQCMINFO)lParam );
  125.             break;
  126.         case SFVM_GETHELPTOPIC:
  127.         {
  128.             SFVM_HELPTOPIC_DATA * phtd = (SFVM_HELPTOPIC_DATA *)lParam;
  129.             StrCpyW( phtd->wszHelpFile, L"mydoc.chm" );
  130.             hr = S_OK;
  131.         }
  132.             break;
  133.         case DVM_DEFVIEWMODE:
  134.             *(FOLDERVIEWMODE *)lParam = FVM_ICON;
  135.             hr = S_OK;
  136.             break;
  137.     }
  138.     if (FAILED(hr))
  139.     {
  140.         MDTrace(TEXT("Calling m_psfvcb..."));
  141.         hr = m_psfvcb->MessageSFVCB( uMsg, wParam, lParam );
  142.     }
  143.     MDTraceLeaveResult(hr);
  144. }