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

Windows Kernel

Development Platform:

Visual C++

  1. #include "cabinet.h"
  2. #include "taskband.h"
  3. #include "bandsite.h"
  4. #define DM_FOCUS    0               // focus
  5. #define DM_COMWIN       0           // com/win32 interaction
  6. extern "C" IDropTarget* Tray_GetDropTarget();
  7. CSimpleOleWindow::~CSimpleOleWindow()
  8. {
  9. }
  10. CSimpleOleWindow::CSimpleOleWindow(HWND hwnd) : _cRef(1), _hwnd(hwnd)
  11. {
  12. }
  13. ULONG CSimpleOleWindow::AddRef()
  14. {
  15.     _cRef++;
  16.     return _cRef;
  17. }
  18. ULONG CSimpleOleWindow::Release()
  19. {
  20.     ASSERT(_cRef > 0);
  21.     _cRef--;
  22.     if (_cRef > 0)
  23.         return _cRef;
  24.     delete this;
  25.     return 0;
  26. }
  27. HRESULT CSimpleOleWindow::QueryInterface(REFIID riid, LPVOID * ppvObj)
  28. {
  29.     if (IsEqualIID(riid, IID_IUnknown) ||
  30.         IsEqualIID(riid, IID_IOleWindow))
  31.     {
  32.         *ppvObj = SAFECAST(this, IOleWindow*);
  33.     } 
  34.     else
  35.     {
  36.         *ppvObj = NULL;
  37.         return E_NOINTERFACE;
  38.         
  39.     }
  40.     
  41.     AddRef();
  42.     return S_OK;
  43. }
  44. HRESULT CSimpleOleWindow::GetWindow(HWND * lphwnd) 
  45. {
  46.     *lphwnd = _hwnd; 
  47.     if (_hwnd)
  48.         return S_OK; 
  49.     return E_FAIL;
  50.         
  51. }
  52. #define SUPERCLASS CSimpleOleWindow
  53. class CTaskBand : public CSimpleOleWindow
  54.         ,public IDeskBand
  55.         ,public IObjectWithSite
  56.         ,public IDropTarget
  57.         ,public IInputObject
  58.         ,public IWinEventHandler
  59. {
  60. public:
  61.     // *** IUnknown ***
  62.     virtual STDMETHODIMP QueryInterface(REFIID riid, LPVOID * ppvObj);
  63.     virtual STDMETHODIMP_(ULONG) AddRef(void) {return SUPERCLASS::AddRef();};
  64.     virtual STDMETHODIMP_(ULONG) Release(void){return SUPERCLASS::Release();};
  65.     // *** IOleWindow methods ***
  66.     virtual STDMETHODIMP GetWindow(HWND * lphwnd) {return SUPERCLASS::GetWindow(lphwnd);};
  67.     virtual STDMETHODIMP ContextSensitiveHelp(BOOL fEnterMode) { return SUPERCLASS::ContextSensitiveHelp(fEnterMode); };
  68.     // *** IDockingWindow methods ***
  69.     virtual STDMETHODIMP ShowDW(BOOL fShow);
  70.     virtual STDMETHODIMP CloseDW(DWORD dwReserved);
  71.     virtual STDMETHODIMP ResizeBorderDW(LPCRECT prcBorder,
  72.                                              IUnknown* punkToolbarSite,
  73.                                              BOOL fReserved);
  74.     // *** IObjectWithSite methods ***
  75.     virtual STDMETHODIMP SetSite(IUnknown* punkSite);
  76.     // BUGBUG is E_NOTIMPL ok?
  77.     virtual STDMETHODIMP GetSite(REFIID riid, void** ppvSite) { ASSERT(0); return E_NOTIMPL; };
  78.     // *** IDeskBand methods ***
  79.     virtual STDMETHODIMP GetBandInfo(DWORD dwBandID, DWORD fViewMode, 
  80.                                      DESKBANDINFO* pdbi) ;
  81.     
  82.     // *** IDropTarget methods ***
  83.     virtual STDMETHODIMP DragEnter(IDataObject *pdtobj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect);
  84.     virtual STDMETHODIMP DragOver(DWORD grfKeyState, POINTL pt, DWORD *pdwEffect);
  85.     virtual STDMETHODIMP DragLeave(void);
  86.     virtual STDMETHODIMP Drop(IDataObject *pdtobj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect);
  87.     // *** IInputObject methods ***
  88.     virtual STDMETHODIMP TranslateAcceleratorIO(LPMSG lpMsg);
  89.     virtual STDMETHODIMP HasFocusIO();
  90.     virtual STDMETHODIMP UIActivateIO(BOOL fActivate, LPMSG lpMsg);
  91.     // *** IWinEventHandler methods ***
  92.     virtual STDMETHODIMP OnWinEvent(HWND hwnd, UINT dwMsg, WPARAM wParam, LPARAM lParam, LRESULT* plres);
  93.     virtual STDMETHODIMP IsWindowOwner(HWND hwnd);
  94. protected:
  95.     
  96.     friend IUnknown* Tasks_CreateInstance();
  97.         
  98.     CTaskBand();
  99.     ~CTaskBand();
  100.     DWORD _dwBandID;
  101. private:
  102.     IUnknown *  _punkSite;
  103.     
  104. } ;
  105. CTaskBand::CTaskBand() : 
  106.     SUPERCLASS(NULL)
  107. {
  108.     _dwBandID = (DWORD)-1;   
  109. }
  110. CTaskBand::~CTaskBand()
  111. {
  112.     if (_punkSite)
  113.         _punkSite->Release();
  114. }
  115. HRESULT CTaskBand::QueryInterface(REFIID riid, LPVOID* ppvObj)
  116. {
  117.     if (IsEqualIID(riid, IID_IDockingWindow)
  118.         || IsEqualIID(riid, IID_IDeskBand))
  119.     {
  120.         *ppvObj = SAFECAST(this, IDeskBand*);
  121.     }
  122.     else if (IsEqualIID(riid, IID_IObjectWithSite)) 
  123.     {
  124.         *ppvObj = SAFECAST(this, IObjectWithSite*);
  125.     } 
  126.     else if (IsEqualIID(riid, IID_IDropTarget)) 
  127.     {
  128.         *ppvObj = SAFECAST(this, IDropTarget*);
  129.     } 
  130.     else if (IsEqualIID(riid, IID_IInputObject)) {
  131.         *ppvObj = SAFECAST(this, IInputObject*);
  132.     }
  133.     else if (IsEqualIID(riid, IID_IWinEventHandler)) {
  134.         *ppvObj = SAFECAST(this, IWinEventHandler*);
  135.     }
  136.     else
  137.     {
  138.         return SUPERCLASS::QueryInterface(riid, ppvObj);
  139.     }
  140.     AddRef();
  141.     return NOERROR;
  142. }
  143. IUnknown* Tasks_CreateInstance()
  144. {
  145.     CTaskBand* pstb = new CTaskBand();
  146.     return (IDeskBand*)pstb;
  147. }
  148. HRESULT CTaskBand::ShowDW(BOOL f)
  149. {
  150.     return S_OK;
  151. }
  152. HRESULT CTaskBand::CloseDW(DWORD dwReserved)
  153. {
  154.     return S_OK;
  155. }
  156. HRESULT CTaskBand::ResizeBorderDW(LPCRECT prcBorder, IUnknown* punkToolbarSite, BOOL fReserved)
  157. {
  158.     return E_NOTIMPL;
  159. }
  160. //***   CTaskBand::IInputObject::* {
  161. HRESULT CTaskBand::TranslateAcceleratorIO(LPMSG lpMsg)
  162. {
  163. #if 0
  164. #ifdef DEBUG
  165.     extern BOOL IsVK_TABCycler(WPARAM wParam);
  166.     if (lpMsg && lpMsg->message == WM_KEYDOWN
  167.       && IsVK_TABCycler(lpMsg->wParam)) {
  168.         TraceMsg(DM_FOCUS, "ctb.taio: TAB hres=E_NOTIMPL");
  169.     }
  170. #endif
  171. #endif
  172.     return E_NOTIMPL;
  173. }
  174. extern "C" BOOL IsChildOrHWND(HWND hwnd, HWND hwndChild);
  175. HRESULT CTaskBand::HasFocusIO()
  176. {
  177.     BOOL f;
  178.     HWND hwndFocus = GetFocus();
  179.     f = IsChildOrHWND(_hwnd, hwndFocus);
  180.     ASSERT(hwndFocus != NULL || !f);
  181.     ASSERT(_hwnd != NULL || !f);
  182.     if (!f)
  183.         TraceMsg(DM_FOCUS, "ctb.hfio: hres=S_FALSE");
  184.     return f ? S_OK : S_FALSE;
  185. }
  186. //***
  187. // NOTES
  188. //  BUGBUG should default be to SetFocus or to ignore?
  189. HRESULT CTaskBand::UIActivateIO(BOOL fActivate, LPMSG lpMsg)
  190. {
  191.     ASSERT(NULL == lpMsg || IS_VALID_WRITE_PTR(lpMsg, MSG));
  192.     TraceMsg(DM_FOCUS, "ctb.uiaio(fActivate=%d)", fActivate);
  193.     #define _fCanFocus 1
  194.     if (!_fCanFocus) {
  195.         TraceMsg(DM_FOCUS, "ctb.uiaio: !_fCanFocus ret S_FALSE");
  196.         return S_FALSE;
  197.     }
  198.     #undef  _fCanFocus
  199.     if (fActivate) {
  200.         UnkOnFocusChangeIS(_punkSite, SAFECAST(this, IInputObject*), TRUE);
  201.         SetFocus(_hwnd);
  202.     }
  203.     else {
  204.         // if we don't have focus, we're fine;
  205.         // if we do have focus, there's nothing we can do about it...
  206.         /*NOTHING*/
  207. #ifdef DEBUG
  208.         TraceMsg(DM_FOCUS, "ctb.uiaio: GetFocus()=%x _hwnd=%x", GetFocus(), _hwnd);
  209. #endif
  210.     }
  211.     return S_OK;
  212. }
  213. // }
  214. extern "C" BOOL Tasks_Create(HWND hwndParent);
  215. HRESULT CTaskBand::SetSite(IUnknown* punk)
  216. {
  217.     HRESULT hres = S_OK;
  218.     if (punk != _punkSite) {
  219.         if (_punkSite)
  220.             _punkSite->Release();
  221.         _punkSite = punk;
  222.         _hwnd = NULL;
  223.         if (punk) {
  224.             HWND hwndParent;
  225.             hres = E_FAIL;
  226.             punk->AddRef();
  227.             if (SUCCEEDED(IUnknown_GetWindow(punk, &hwndParent)))
  228.             {
  229.                 ASSERT(!_hwnd);
  230.                 if (Tasks_Create(hwndParent))
  231.                 {
  232.                     _hwnd = g_tasks.hwnd;
  233.                     hres = S_OK;
  234.                 }
  235.             }
  236.         }
  237.     }
  238.     return hres;
  239. }
  240. HRESULT CTaskBand::GetBandInfo(DWORD dwBandID, DWORD fViewMode, 
  241.                                 DESKBANDINFO* pdbi) 
  242. {
  243.     _dwBandID = dwBandID;
  244.     pdbi->ptMaxSize.y = -1;
  245.     pdbi->ptActual.y =  g_cySize + 2*g_cyEdge;
  246.     
  247.     if (fViewMode & DBIF_VIEWMODE_VERTICAL) {
  248.         pdbi->ptMinSize.y = 1;
  249.         pdbi->ptMinSize.x = (g_cySize + 2*g_cyEdge + g_cyTabSpace + 1);
  250.         pdbi->ptIntegral.y = 1;
  251.     } else {
  252.         pdbi->ptMinSize.y = g_cySize + 2*g_cyEdge;
  253.         pdbi->ptMinSize.x = pdbi->ptIntegral.y = g_cySize + 2*g_cyEdge + g_cyTabSpace;
  254.         pdbi->ptMinSize.x *= 3;
  255.     }
  256.     pdbi->dwModeFlags = DBIMF_VARIABLEHEIGHT;
  257.     pdbi->dwMask &= ~DBIM_TITLE;    // no title for us (ever)
  258.     return S_OK;
  259. }
  260. // IDropTarget implementation
  261. //
  262. HRESULT CTaskBand::DragEnter(IDataObject *pdtobj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect)
  263. {
  264.     return Tray_GetDropTarget()->DragEnter(pdtobj, grfKeyState, pt, pdwEffect);
  265. }
  266. HRESULT CTaskBand::DragOver(DWORD grfKeyState, POINTL pt, DWORD *pdwEffect)
  267. {
  268.     return Tray_GetDropTarget()->DragOver(grfKeyState, pt, pdwEffect);
  269. }
  270. HRESULT CTaskBand::DragLeave(void)
  271. {
  272.     return Tray_GetDropTarget()->DragLeave();
  273. }
  274. HRESULT CTaskBand::Drop(IDataObject *pdtobj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect)
  275. {
  276.     return Tray_GetDropTarget()->Drop(pdtobj, grfKeyState, pt, pdwEffect);
  277. }
  278. // *** IWinEventHandler methods ***
  279. HRESULT CTaskBand::OnWinEvent(HWND hwnd, UINT dwMsg, WPARAM wParam, LPARAM lParam, LRESULT* plres)
  280. {
  281.     *plres = 0;
  282.     
  283.     switch (dwMsg) 
  284.     {
  285.     case WM_WININICHANGE:
  286.     case WM_SYSCOLORCHANGE:
  287.     case WM_PALETTECHANGED:
  288.         TraceMsg(DM_COMWIN, "ctb.owe: fwd WM_WININICHG(etc.)");
  289.         SendMessage(_hwnd, dwMsg, wParam, lParam);
  290.         break;
  291.     case WM_NOTIFY:
  292.         if (EVAL(lParam))
  293.         {
  294.             switch (((LPNMHDR)lParam)->code)
  295.             {
  296.             case NM_SETFOCUS:
  297.                 UnkOnFocusChangeIS(_punkSite, SAFECAST(this, IInputObject*), TRUE);
  298.                 break;
  299.             }
  300.         }
  301.         break;
  302.     }
  303.     return S_OK;
  304. }
  305. HRESULT CTaskBand::IsWindowOwner(HWND hwnd)
  306. {
  307.     BOOL bRet = IsChildOrHWND(_hwnd, hwnd);
  308.     ASSERT (_hwnd || !bRet);
  309.     ASSERT (hwnd || !bRet);
  310.     return bRet ? S_OK : S_FALSE;
  311. }