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

Windows Kernel

Development Platform:

Visual C++

  1. #include "cabinet.h"
  2. #include "taskbar.h"
  3. CTaskBar::CTaskBar() : CSimpleOleWindow(v_hwndTray)
  4. {
  5.     _fRestrictionsInited = FALSE;
  6. }
  7. HRESULT CTaskBar::QueryInterface(REFIID riid, LPVOID * ppvObj)
  8. {
  9.     if (IsEqualIID(riid, IID_IContextMenu))
  10.     {
  11.         *ppvObj = SAFECAST(this, IContextMenu*);
  12.     }
  13.     else if (IsEqualIID(riid, IID_IServiceProvider))
  14.     {
  15.         *ppvObj = SAFECAST(this, IServiceProvider*);
  16.     }
  17.     else if (IsEqualIID(riid, IID_IRestrict))
  18.     {
  19.         *ppvObj = SAFECAST(this, IRestrict*);
  20.     }
  21.     else if (IsEqualIID(riid, IID_IDeskBar))
  22.     {
  23.         *ppvObj = SAFECAST(this, IDeskBar*);
  24.     }
  25.     else 
  26.     {
  27.         return CSimpleOleWindow::QueryInterface(riid, ppvObj);
  28.     }
  29.     AddRef();
  30.     return S_OK;
  31. }
  32. HRESULT CTaskBar::InvokeCommand(LPCMINVOKECOMMANDINFO pici)
  33. {
  34.     int idCmd = -1;
  35.     if (IS_INTRESOURCE(pici->lpVerb))
  36.         idCmd = LOWORD(pici->lpVerb);
  37.     Tray_ContextMenuInvoke(idCmd);
  38.     return S_OK;
  39. }
  40. HRESULT CTaskBar::GetCommandString(UINT_PTR idCmd,
  41.                             UINT        uType,
  42.                             UINT      * pwReserved,
  43.                             LPSTR       pszName,
  44.                             UINT        cchMax)
  45. {
  46.     return E_NOTIMPL;
  47. }
  48. HRESULT CTaskBar::QueryContextMenu(HMENU hmenu,
  49.                                 UINT indexMenu,
  50.                                 UINT idCmdFirst,
  51.                                 UINT idCmdLast,
  52.                                 UINT uFlags)
  53. {
  54.     int i = 0;
  55.     HMENU hmenuSrc = Tray_BuildContextMenu((S_OK == SHIsChildOrSelf(g_tasks.hwnd, GetFocus())) ? TRUE : FALSE);
  56.     if (hmenuSrc) {
  57.         // BUGBUG off-by-1 and by idCmdFirst+i, i think...
  58.         i += Shell_MergeMenus(hmenu, hmenuSrc, (UINT)-1, idCmdFirst + i, idCmdLast, MM_ADDSEPARATOR) - (idCmdFirst + i);
  59.         DestroyMenu(hmenuSrc);
  60.     }
  61.     
  62.     return i;   // potentially off-by-1, but who cares...
  63. }
  64. // *** IServiceProvider ***
  65. HRESULT CTaskBar::QueryService(REFGUID guidService, REFIID riid, void **ppvObj)
  66. {
  67.     if (ppvObj)
  68.         *ppvObj = NULL;
  69.     if (IsEqualGUID(guidService, SID_SRestrictionHandler))
  70.     {
  71.         return QueryInterface(riid, ppvObj);
  72.     }
  73.     
  74.     return E_FAIL;
  75. }
  76. // *** IRestrict ***
  77. HRESULT CTaskBar::IsRestricted(const GUID * pguidID, DWORD dwRestrictAction, VARIANT * pvarArgs, DWORD * pdwRestrictionResult)
  78. {
  79.     HRESULT hr = S_OK;
  80.     if (!EVAL(pguidID) || !EVAL(pdwRestrictionResult))
  81.         return E_INVALIDARG;
  82.     *pdwRestrictionResult = RR_NOCHANGE;
  83.     if (IsEqualGUID(RID_RDeskBars, *pguidID))
  84.     {
  85.         if (!_fRestrictionsInited)
  86.         {
  87.             _fRestrictionsInited = TRUE;
  88.             if (SHRestricted(REST_NOCLOSE_DRAGDROPBAND))
  89.                 _fRestrictDDClose = TRUE;
  90.             else
  91.                 _fRestrictDDClose = FALSE;
  92.             if (SHRestricted(REST_NOMOVINGBAND))
  93.                 _fRestrictMove = TRUE;
  94.             else
  95.                 _fRestrictMove = FALSE;
  96.         }
  97.         switch(dwRestrictAction)
  98.         {
  99.         case RA_DRAG:
  100.         case RA_DROP:
  101.         case RA_ADD:
  102.         case RA_CLOSE:
  103.             if (_fRestrictDDClose)
  104.                 *pdwRestrictionResult = RR_DISALLOW;
  105.             break;
  106.         case RA_MOVE:
  107.             if (_fRestrictMove)
  108.                 *pdwRestrictionResult = RR_DISALLOW;
  109.             break;
  110.         }
  111.     }
  112.     // TODO: If we have or get a parent, we should ask them if they want to restrict.
  113. //    if (RR_NOCHANGE == *pdwRestrictionResult)    // If we don't handle it, let our parents have a wack at it.
  114. //        hr = IUnknown_HandleIRestrict(_punkParent, pguidID, dwRestrictAction, pvarArgs, pdwRestrictionResult);
  115.     return hr;
  116. }
  117. #ifndef RECTWIDTH
  118. #define RECTWIDTH(rc) ((rc).right - (rc).left)
  119. #define RECTHEIGHT(rc) ((rc).bottom - (rc).top)
  120. #endif
  121. extern "C" void Tray_VerifySize(BOOL fWinIni);
  122. extern "C" TrayShowWindow(int nCmdShow);
  123. extern "C" void Tray_ClipWindow(BOOL fEnableClipping);
  124. extern "C" int g_fInSizeMove;
  125. // *** IDeskBar ***
  126. HRESULT CTaskBar::OnPosRectChangeDB(LPRECT prc)
  127. {
  128.     int cyDelta, cxDelta;
  129.     RECT rc, rcChild;
  130.     // if we haven't fully initialized the tray, don't resize in response to (bogus) rebar sizes
  131.     if (!g_ts.hbmpStartBkg)
  132.         return S_FALSE;
  133.     
  134.     if (g_ts._fDeferedPosRectChange) {
  135.         // we're in the moving code, don't do this stuff..
  136.         return S_FALSE;
  137.     }
  138.     GetWindowRect(g_ts.hwndMain, &rc);
  139.     GetClientRect(g_ts.hwndRebar, &rcChild); // Handle case of no coolbar???
  140.     // Need to special-case sizing down to 0 rows
  141.     if (RECTHEIGHT(rcChild) == 0)
  142.     {
  143.         return S_OK;
  144.     }
  145.     TraceMsg(TF_TRAY, "OnPosRectChangeDB: hwndMain= (%d,%d,%d,%d), hwndRebar= (%d,%d,%d,%d), prc= (%d,%d,%d,%d)",
  146.         rc.left,rc.top,rc.right,rc.bottom,
  147.         rcChild.left,rcChild.top,rcChild.right,rcChild.bottom,
  148.         prc->left,prc->top,prc->right,prc->bottom);
  149.     cyDelta = (RECTHEIGHT(*prc) - RECTHEIGHT(rcChild));
  150.     cxDelta = (RECTWIDTH(*prc) - RECTWIDTH(rcChild));
  151.     BOOL fHiding = (g_ts.uAutoHide & AH_HIDING);
  152.     switch(g_ts.uStuckPlace)
  153.     {
  154.         case STICK_BOTTOM:
  155.             if (fHiding)
  156.             {
  157.                 rc.bottom -= RECTHEIGHT(rcChild);
  158.                 rc.top -= cyDelta + RECTHEIGHT(rcChild);
  159.             }
  160.             else
  161.                 rc.top -= cyDelta;
  162.             break;
  163.         case STICK_TOP:
  164.             if (fHiding)
  165.             {
  166.                 rc.top += RECTHEIGHT(rcChild);
  167.                 rc.bottom += cyDelta + RECTHEIGHT(rcChild);
  168.             }
  169.             else
  170.                 rc.bottom += cyDelta;
  171.             break;
  172.         case STICK_RIGHT:
  173.             if (fHiding)
  174.             {
  175.                 rc.right -= RECTWIDTH(*prc);
  176.                 rc.left -= cxDelta + RECTWIDTH(*prc);
  177.             }
  178.             else
  179.                 rc.left -= cxDelta;
  180.             break;
  181.         case STICK_LEFT:
  182.             if (fHiding)
  183.             {
  184.                 rc.left += RECTWIDTH(*prc);
  185.                 rc.right += cxDelta + RECTWIDTH(*prc);
  186.             }
  187.             else
  188.                 rc.right += cxDelta;
  189.             break;
  190.         default:
  191.             ASSERT(0); // Where are we stuck???
  192.     }
  193.     TraceMsg(TF_TRAY, "OnPosRectChangeDB: moving to hwndMain = (%d,%d,%d,%d)",
  194.         rc.left,rc.top,rc.right,rc.bottom);
  195.     g_ts.arStuckRects[g_ts.uStuckPlace] = rc;
  196.     if (fHiding) {
  197.         TrayShowWindow(SW_HIDE);
  198.     }
  199.     if ((g_ts.uAutoHide & (AH_ON | AH_HIDING)) != (AH_ON | AH_HIDING))
  200.     {
  201.         g_ts.fSelfSizing = TRUE;
  202.         SetWindowPos(g_ts.hwndMain, NULL,
  203.             rc.left, rc.top,
  204.             RECTWIDTH(rc),RECTHEIGHT(rc),
  205.             SWP_NOZORDER | SWP_NOACTIVATE);
  206.         g_ts.fSelfSizing = FALSE;
  207.         // during 'bottom up' resizes (e.g. isfband View.Large), we don't
  208.         // get WM_ENTERSIZEMOVE/WM_EXITSIZEMOVE.  so we send it here.
  209.         // this fixes two bugs:
  210.         // - nt5:168643: btm-of-screen on-top tray mmon clipping not updated
  211.         // after view.large
  212.         // - nt5:175287: top-of-screen on-top tray doesn't resize workarea
  213.         // (obscuring top of 'my computer' icon) after view.large
  214.         if (!g_fInSizeMove)
  215.             SendMessage(v_hwndTray, WM_EXITSIZEMOVE, 0, 0);
  216.     }
  217.     else
  218.     {
  219.         ASSERT(0);
  220.         Tray_VerifySize(TRUE);
  221.     }
  222.     if (fHiding) {
  223.         TrayShowWindow(SW_SHOWNA);
  224.     }
  225.     return S_OK;
  226. }