[EXPLORER] Minor cleanup/comment fixes.
[reactos.git] / base / shell / explorer / trayntfy.cpp
index 9a0294e..63dc236 100644 (file)
  * TrayNotifyWnd
  */
 
-static const WCHAR szTrayNotifyWndClass [] = TEXT("TrayNotifyWnd");
+static const WCHAR szTrayNotifyWndClass[] = L"TrayNotifyWnd";
 
 #define TRAY_NOTIFY_WND_SPACING_X   1
 #define TRAY_NOTIFY_WND_SPACING_Y   1
 
 class CTrayNotifyWnd :
+    public CComCoClass<CTrayNotifyWnd>,
     public CComObjectRootEx<CComMultiThreadModelNoCS>,
-    public CWindowImpl < CTrayNotifyWnd, CWindow, CControlWinTraits >
+    public CWindowImpl < CTrayNotifyWnd, CWindow, CControlWinTraits >,
+    public IOleWindow
 {
-    HWND hWndNotify;
+    CComPtr<IUnknown> m_clock;
+    CComPtr<IUnknown> m_pager;
 
-    CSysPagerWnd * m_pager;
-    CTrayClockWnd * m_clock;
-
-    CComPtr<ITrayWindow> TrayWindow;
+    HWND m_hwndClock;
+    HWND m_hwndPager;
 
     HTHEME TrayTheme;
     SIZE szTrayClockMin;
@@ -49,9 +50,8 @@ class CTrayNotifyWnd :
 
 public:
     CTrayNotifyWnd() :
-        hWndNotify(NULL),
-        m_pager(NULL),
-        m_clock(NULL),
+        m_hwndClock(NULL),
+        m_hwndPager(NULL),
         TrayTheme(NULL),
         IsHorizontal(FALSE)
     {
@@ -103,11 +103,23 @@ public:
 
     LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
     {
-        m_clock = new CTrayClockWnd();
-        m_clock->_Init(m_hWnd, !g_TaskbarSettings.sr.HideClock);
+        HRESULT hr;
+
+        hr = CTrayClockWnd_CreateInstance(m_hWnd, IID_PPV_ARG(IUnknown, &m_clock));
+        if (FAILED_UNEXPECTEDLY(hr))
+            return FALSE;
 
-        m_pager = new CSysPagerWnd();
-        m_pager->_Init(m_hWnd, !g_TaskbarSettings.sr.HideClock);
+        hr = IUnknown_GetWindow(m_clock, &m_hwndClock);
+        if (FAILED_UNEXPECTEDLY(hr))
+            return FALSE;
+
+        hr = CSysPagerWnd_CreateInstance(m_hWnd, IID_PPV_ARG(IUnknown, &m_pager));
+        if (FAILED_UNEXPECTEDLY(hr))
+            return FALSE;
+
+        hr = IUnknown_GetWindow(m_pager, &m_hwndPager);
+        if (FAILED_UNEXPECTEDLY(hr))
+            return FALSE;
 
         return TRUE;
     }
@@ -132,7 +144,7 @@ public:
                     goto NoClock;
             }
 
-            m_clock->SendMessage(TCWM_GETMINIMUMSIZE, (WPARAM) IsHorizontal, (LPARAM) &szClock);
+            ::SendMessage(m_hwndClock, TNWM_GETMINIMUMSIZE, (WPARAM) IsHorizontal, (LPARAM) &szClock);
 
             szTrayClockMin = szClock;
         }
@@ -149,7 +161,7 @@ public:
             szTray.cx = pSize->cx - 2 * TRAY_NOTIFY_WND_SPACING_X;
         }
 
-        m_pager->GetSize(IsHorizontal, &szTray);
+        ::SendMessage(m_hwndPager, TNWM_GETMINIMUMSIZE, (WPARAM) IsHorizontal, (LPARAM) &szTray);
 
         szTrayNotify = szTray;
 
@@ -161,6 +173,7 @@ public:
                 pSize->cx += TRAY_NOTIFY_WND_SPACING_X + szTrayClockMin.cx;
 
             pSize->cx += szTray.cx;
+            pSize->cx += ContentMargin.cxLeftWidth + ContentMargin.cxRightWidth;
         }
         else
         {
@@ -170,11 +183,9 @@ public:
                 pSize->cy += TRAY_NOTIFY_WND_SPACING_Y + szTrayClockMin.cy;
 
             pSize->cy += szTray.cy;
+            pSize->cy += ContentMargin.cyTopHeight + ContentMargin.cyBottomHeight;
         }
 
-        pSize->cy += ContentMargin.cyTopHeight + ContentMargin.cyBottomHeight;
-        pSize->cx += ContentMargin.cxLeftWidth + ContentMargin.cxRightWidth;
-
         return TRUE;
     }
 
@@ -200,55 +211,35 @@ public:
                 szClock.cy = szTrayClockMin.cy;
             }
 
-            m_clock->SetWindowPos(
+            ::SetWindowPos(m_hwndClock,
                 NULL,
                 ptClock.x,
                 ptClock.y,
                 szClock.cx,
                 szClock.cy,
                 SWP_NOZORDER);
-
-            POINT ptPager;
-
-            if (IsHorizontal)
-            {
-                ptPager.x = ContentMargin.cxLeftWidth;
-                ptPager.y = (pszClient->cy - szTrayNotify.cy)/2;
-            }
-            else
-            {
-                ptPager.x = (pszClient->cx - szTrayNotify.cx)/2;
-                ptPager.y = ContentMargin.cyTopHeight;
-            }
-
-            m_pager->SetWindowPos(
-                NULL,
-                ptPager.x,
-                ptPager.y,
-                szTrayNotify.cx,
-                szTrayNotify.cy,
-                SWP_NOZORDER);
         }
-    }
-
-    LRESULT DrawBackground(HDC hdc)
-    {
-        HRESULT res;
-        RECT rect;
 
-        GetClientRect(&rect);
+        POINT ptPager;
 
-        if (TrayTheme)
+        if (IsHorizontal)
         {
-            if (IsThemeBackgroundPartiallyTransparent(TrayTheme, TNP_BACKGROUND, 0))
-            {
-                DrawThemeParentBackground(m_hWnd, hdc, &rect);
-            }
-
-            res = DrawThemeBackground(TrayTheme, hdc, TNP_BACKGROUND, 0, &rect, 0);
+            ptPager.x = ContentMargin.cxLeftWidth;
+            ptPager.y = (pszClient->cy - szTrayNotify.cy)/2;
+        }
+        else
+        {
+            ptPager.x = (pszClient->cx - szTrayNotify.cx)/2;
+            ptPager.y = ContentMargin.cyTopHeight;
         }
 
-        return res;
+        ::SetWindowPos(m_hwndPager,
+            NULL,
+            ptPager.x,
+            ptPager.y,
+            szTrayNotify.cx,
+            szTrayNotify.cy,
+            SWP_NOZORDER);
     }
 
     LRESULT OnEraseBackground(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
@@ -261,27 +252,16 @@ public:
             return 0;
         }
 
-        return DrawBackground(hdc);
-    }
+        RECT rect;
+        GetClientRect(&rect);
+        if (IsThemeBackgroundPartiallyTransparent(TrayTheme, TNP_BACKGROUND, 0))
+            DrawThemeParentBackground(m_hWnd, hdc, &rect);
 
-    BOOL NotifyIconCmd(WPARAM wParam, LPARAM lParam)
-    {
-        if (m_pager)
-        {
-            return m_pager->NotifyIconCmd(wParam, lParam);
-        }
+        DrawThemeBackground(TrayTheme, hdc, TNP_BACKGROUND, 0, &rect, 0);
 
         return TRUE;
     }
 
-    BOOL GetClockRect(OUT PRECT rcClock)
-    {
-        if (!m_clock->IsWindowVisible())
-            return FALSE;
-
-        return m_clock->GetWindowRect(rcClock);
-    }
-
     LRESULT OnGetMinimumSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
     {
         BOOL Horizontal = (BOOL) wParam;
@@ -298,16 +278,6 @@ public:
         return (LRESULT) GetMinimumSize((PSIZE) lParam);
     }
 
-    LRESULT OnUpdateTime(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
-    {
-        if (m_clock != NULL)
-        {
-            /* Forward the message to the tray clock window procedure */
-            return m_clock->OnUpdateTime(uMsg, wParam, lParam, bHandled);
-        }
-        return FALSE;
-    }
-
     LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
     {
         SIZE szClient;
@@ -325,127 +295,77 @@ public:
         return HTTRANSPARENT;
     }
 
-    LRESULT OnShowClock(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
+    LRESULT OnCtxMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
     {
-        BOOL PrevHidden = g_TaskbarSettings.sr.HideClock;
-        g_TaskbarSettings.sr.HideClock = (wParam == 0);
-
-        if (m_clock != NULL && PrevHidden != g_TaskbarSettings.sr.HideClock)
-        {
-            m_clock->ShowWindow(g_TaskbarSettings.sr.HideClock ? SW_HIDE : SW_SHOW);
-        }
-
-        return (LRESULT) (!PrevHidden);
+        bHandled = TRUE;
+        return 0;
     }
 
-    LRESULT OnTaskbarSettingsChanged(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
+    LRESULT OnClockMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
     {
-        TaskbarSettings* newSettings = (TaskbarSettings*)lParam;
-        if (newSettings->bShowSeconds != g_TaskbarSettings.bShowSeconds)
-        {
-            g_TaskbarSettings.bShowSeconds = newSettings->bShowSeconds;
-            /* TODO: Toggle showing seconds */
-        }
-
-        if (newSettings->sr.HideClock != g_TaskbarSettings.sr.HideClock)
-        {
-            g_TaskbarSettings.sr.HideClock = newSettings->sr.HideClock;
-            /* TODO: Toggle hiding the clock */
-        }
-
-        return 0;
+        return SendMessageW(m_hwndClock, uMsg, wParam, lParam);
     }
 
-    LRESULT OnNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
+    LRESULT OnPagerMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
     {
-        const NMHDR *nmh = (const NMHDR *) lParam;
-
-        if (nmh->hwndFrom == m_clock->m_hWnd)
-        {
-            /* Pass down notifications */
-            return m_clock->SendMessage(WM_NOTIFY, wParam, lParam);
-        }
-
-        return FALSE;
+        return SendMessageW(m_hwndPager, uMsg, wParam, lParam);
     }
 
-    LRESULT OnSetFont(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
+    LRESULT OnRealign(INT uCode, LPNMHDR hdr, BOOL& bHandled)
     {
-        if (m_clock != NULL)
-        {
-            m_clock->SendMessageW(WM_SETFONT, wParam, lParam);
-        }
-
-        bHandled = FALSE;
-        return FALSE;
+        hdr->hwndFrom = m_hWnd;
+        return GetParent().SendMessage(WM_NOTIFY, 0, (LPARAM)hdr);
     }
 
-    LRESULT OnCtxMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
+    HRESULT WINAPI GetWindow(HWND* phwnd)
     {
-        bHandled = TRUE;
-        return 0;
+        if (!phwnd)
+            return E_INVALIDARG;
+        *phwnd = m_hWnd;
+        return S_OK;
     }
 
-    LRESULT OnSettingChanged(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
+    HRESULT WINAPI ContextSensitiveHelp(BOOL fEnterMode)
     {
-        if (wParam == SPI_SETNONCLIENTMETRICS)
-        {
-            m_pager->ResizeImagelist();
-        }
-        return 0;
+        return E_NOTIMPL;
     }
 
+    DECLARE_NOT_AGGREGATABLE(CTrayNotifyWnd)
+
+    DECLARE_PROTECT_FINAL_CONSTRUCT()
+    BEGIN_COM_MAP(CTrayNotifyWnd)
+        COM_INTERFACE_ENTRY_IID(IID_IOleWindow, IOleWindow)
+    END_COM_MAP()
+
     DECLARE_WND_CLASS_EX(szTrayNotifyWndClass, CS_DBLCLKS, COLOR_3DFACE)
 
     BEGIN_MSG_MAP(CTrayNotifyWnd)
         MESSAGE_HANDLER(WM_CREATE, OnCreate)
         MESSAGE_HANDLER(WM_THEMECHANGED, OnThemeChanged)
         MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground)
-        MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingChanged)
         MESSAGE_HANDLER(WM_SIZE, OnSize)
         MESSAGE_HANDLER(WM_NCHITTEST, OnNcHitTest)
-        MESSAGE_HANDLER(WM_NOTIFY, OnNotify)
-        MESSAGE_HANDLER(WM_SETFONT, OnSetFont)
         MESSAGE_HANDLER(WM_CONTEXTMENU, OnCtxMenu) // FIXME: This handler is not necessary in Windows
+        MESSAGE_HANDLER(WM_NCLBUTTONDBLCLK, OnClockMessage)
+        MESSAGE_HANDLER(TWM_SETTINGSCHANGED, OnClockMessage)
+        MESSAGE_HANDLER(WM_SETFONT, OnClockMessage)
+        MESSAGE_HANDLER(WM_SETTINGCHANGE, OnPagerMessage)
+        MESSAGE_HANDLER(WM_COPYDATA, OnPagerMessage)
+        NOTIFY_CODE_HANDLER(NTNWM_REALIGN, OnRealign)
         MESSAGE_HANDLER(TNWM_GETMINIMUMSIZE, OnGetMinimumSize)
-        MESSAGE_HANDLER(TNWM_UPDATETIME, OnUpdateTime)
-        MESSAGE_HANDLER(TNWM_SHOWCLOCK, OnShowClock)
-        MESSAGE_HANDLER(TWM_SETTINGSCHANGED, OnTaskbarSettingsChanged)
     END_MSG_MAP()
 
-    HWND _Init(IN OUT ITrayWindow *TrayWindow)
+    HRESULT Initialize(IN HWND hwndParent)
     {
-        HWND hWndTrayWindow;
-
-        hWndTrayWindow = TrayWindow->GetHWND();
-        if (hWndTrayWindow == NULL)
-            return NULL;
-
-        this->TrayWindow = TrayWindow;
-        this->hWndNotify = hWndTrayWindow;
-
         DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
-        return Create(hWndTrayWindow, 0, NULL, dwStyle, WS_EX_STATICEDGE);
+        Create(hwndParent, 0, NULL, dwStyle, WS_EX_STATICEDGE);
+        if (!m_hWnd)
+            return E_FAIL;
+        return S_OK;
     }
 };
 
-HWND CreateTrayNotifyWnd(IN OUT ITrayWindow *Tray, CTrayNotifyWnd** ppinstance)
-{
-    CTrayNotifyWnd * pTrayNotify = new CTrayNotifyWnd();
-    // TODO: Destroy after the window is destroyed
-    *ppinstance = pTrayNotify;
-
-    return pTrayNotify->_Init(Tray);
-}
-
-BOOL
-TrayNotify_NotifyIconCmd(CTrayNotifyWnd* pTrayNotify, WPARAM wParam, LPARAM lParam)
-{
-    return pTrayNotify->NotifyIconCmd(wParam, lParam);
-}
-
-BOOL
-TrayNotify_GetClockRect(CTrayNotifyWnd* pTrayNotify, OUT PRECT rcClock)
+HRESULT CTrayNotifyWnd_CreateInstance(HWND hwndParent, REFIID riid, void **ppv)
 {
-    return pTrayNotify->GetClockRect(rcClock);
+    return ShellObjectCreatorInit<CTrayNotifyWnd>(hwndParent, riid, ppv);
 }