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

Windows Kernel

Development Platform:

Visual C++

  1. //////////////////////////////////////////////////
  2. //
  3. // CBandISFOC
  4. //
  5. // This is a thin OC that wraps the above band.
  6. // For quickness, use CShellEmbedding, even though
  7. // this is heavier than we need.
  8. //
  9. // TODO:
  10. //  - support IPersistPropertyBag so we can read the
  11. //    pidl to show out of an html page
  12. //  - listen to ISFBand for resizes and request them
  13. //    from our container
  14. //
  15. // NOTE: looks like this is being dropped. I ripped
  16. //       the code out of bandisf.cpp and put it in
  17. //       this dead directory. [mikesh]
  18. //
  19. #undef  SUPERCLASS
  20. #define SUPERCLASS CShellEmbedding
  21. class CBandISFOC : public SUPERCLASS
  22. {
  23. public:
  24.     virtual STDMETHODIMP SetObjectRects(LPCRECT lprcPosRect, LPCRECT lprcClipRect);
  25. protected:
  26.     CBandISFOC(IUnknown* punkOuter, LPCOBJECTINFO poi);
  27.     ~CBandISFOC();
  28.     friend HRESULT CBandISFOC_CreateInstance(IUnknown* punkOuter, IUnknown** ppunk, LPCOBJECTINFO poi);
  29.     virtual HRESULT v_InternalQueryInterface(REFIID riid, LPVOID* ppvObj);
  30.     virtual LRESULT v_WndProc(HWND, UINT, WPARAM, LPARAM);
  31.     virtual void _OnInPlaceActivate(void);      // called when we actually go in-place-active
  32.     virtual void _OnInPlaceDeactivate(void);    // called when we actually deactivate
  33.     LPITEMIDLIST      _pidl;
  34.     IShellToolband*   _pst;
  35.     IDockingWindow*   _pdw;
  36.     IWinEventHandler* _pweh;
  37.     // for GetBandInfo, not currently used
  38.     POINT _ptSizes[STBE_MAX];
  39.     WCHAR _szTitle[40];
  40.     DWORD _dwSizeMode;
  41. };
  42. CBandISFOC::CBandISFOC(IUnknown* punkOuter, LPCOBJECTINFO poi) : 
  43.     CShellEmbedding(punkOuter, poi, NULL)
  44. {
  45. }
  46. CBandISFOC::~CBandISFOC() 
  47. {
  48.     if (_pidl)
  49.         ILFree(_pidl);
  50. }
  51. LRESULT CBandISFOC::v_WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  52. {
  53.     LRESULT lres = 0;
  54.     switch(uMsg)
  55.     {
  56.     case WM_CONTEXTMENU:
  57.         if (_pst)
  58.         {
  59.             IContextMenu * pcm;
  60.             if (SUCCEEDED(_pst->QueryInterface(IID_IContextMenu, (LPVOID*)&pcm)))
  61.             {
  62.                 POINT pt;
  63.         
  64.                 pt.x = GET_X_LPARAM(lParam);
  65.                 pt.y = GET_Y_LPARAM(lParam);
  66.                 lres = OnContextMenu(hwnd, pcm, &pt);
  67.                 pcm->Release();
  68.             }
  69.         }
  70.         return lres;
  71.     case WM_ERASEBKGND:
  72.         return DefWindowProc(hwnd, uMsg, wParam, lParam);
  73.     case WM_COMMAND:
  74.     case WM_NOTIFY:
  75.         if (_pweh)
  76.         {
  77.             LRESULT lres;
  78.             if (SUCCEEDED(_pweh->OnWinEvent(hwnd, uMsg, wParam, lParam, (LPDWORD)&lres)))
  79.                 return lres;
  80.         }
  81.         // fall through
  82.     default:
  83.         return SUPERCLASS::v_WndProc(hwnd, uMsg, wParam, lParam);
  84.     }
  85. }
  86. HRESULT CBandISFOC::v_InternalQueryInterface(REFIID riid, void **ppvObj)
  87. {
  88.     if (IsEqualIID(riid, IID_IPersistStorage))
  89.     {
  90.         // shembed.cpp supports this, we really want to
  91.         // rip this out there but this is quicker.
  92.         *ppvObj = NULL;
  93.         return(E_NOINTERFACE);
  94.     }
  95.     else
  96.     {
  97.         return SUPERCLASS::v_InternalQueryInterface(riid, ppvObj);
  98.     }
  99.     AddRef();
  100.     return S_OK;
  101. }
  102. void CBandISFOC::_OnInPlaceActivate()
  103. {
  104.     SUPERCLASS::_OnInPlaceActivate();
  105.     // we should never get called twice, but might as well be safe
  106.     //
  107.     if (EVAL(!_pst))
  108.     {
  109.         if (!_pidl)
  110.         {
  111.             SHGetSpecialFolderLocation(NULL, CSIDL_FAVORITES, &_pidl);
  112.         }
  113.     
  114.         if (EVAL(_pidl))
  115.         {
  116.             _pst = CISFBand_Create(NULL, _pidl, FALSE);
  117.             if (_pst)
  118.             {
  119.                 if (SUCCEEDED(_pst->QueryInterface(IID_IDockingWindow, (LPVOID*)&_pdw)))
  120.                 {
  121.                     IOleWindow* pow;
  122.             
  123.                     _pdw->QueryInterface(IID_IWinEventHandler, (LPVOID*)&_pweh);
  124.             
  125.                     _pdw->SetToolbarSite(SAFECAST(this, IOleObject*));
  126.                     _pst->GetBandInfo(STBBIF_VIEWMODE_VERTICAL, _ptSizes, _szTitle, ARRAYSIZE(_szTitle), &_dwSizeMode);
  127.                     if (SUCCEEDED(_pdw->QueryInterface(IID_IOleWindow, (LPVOID*)&pow)))
  128.                     {
  129.                         pow->GetWindow(&_hwndChild);
  130.                         pow->Release();
  131.                         SetWindowPos(_hwndChild, NULL, 0, 0, _size.cx, _size.cy, SWP_NOMOVE|SWP_NOACTIVATE|SWP_NOZORDER|SWP_SHOWWINDOW);
  132.                         TraceMsg(TF_BAND, "ISFBandOC::_OnInPlaceActivate()d");
  133.                     }
  134.                     _pdw->ShowDW(TRUE);
  135.                 }
  136.             }
  137.         }
  138.     }
  139. }
  140. void CBandISFOC::_OnInPlaceDeactivate()
  141. {
  142.     if (_pdw)
  143.     {
  144.         _hwndChild = NULL;
  145.         _pdw->ShowDW(FALSE);
  146.         _pdw->SetToolbarSite(NULL);
  147.         _pdw->CloseDW(0);
  148.         _pdw->Release();
  149.         _pdw = NULL;
  150.         TraceMsg(TF_BAND, "ISFBandOC::_OnInPlaceDeactivate()d");
  151.     }
  152.     ATOMICRELEASE(_pst);
  153.     ATOMICRELEASE(_pweh);
  154.     SUPERCLASS::_OnInPlaceDeactivate();
  155. }
  156. HRESULT CBandISFOC::SetObjectRects(LPCRECT lprcPosRect, LPCRECT lprcClipRect)
  157. {
  158.     HRESULT hres = SUPERCLASS::SetObjectRects(lprcPosRect, lprcClipRect);
  159.     if (_hwndChild)
  160.     {
  161.         SetWindowPos(_hwndChild, NULL, 0, 0, 
  162.             _rcPos.right - _rcPos.left, _rcPos.bottom - _rcPos.top, SWP_NOZORDER);
  163.     }
  164.     return hres;
  165. }
  166. HRESULT CBandISFOC_CreateInstance(IUnknown* punkOuter, IUnknown** ppunk, LPCOBJECTINFO poi)
  167. {
  168.     HRESULT hres = E_OUTOFMEMORY;
  169.     CBandISFOC* pBand = new CBandISFOC(punkOuter, poi);
  170.     if (pBand)
  171.     {
  172.         *ppunk = pBand->_GetInner();
  173.         hres = S_OK;
  174.     }
  175.     return hres;
  176. }