[EXPLORER] -Implement the trick that makes the start button to get clicked when the...
[reactos.git] / reactos / base / shell / explorer / trayntfy.cpp
index 84e8bcf..6ece02d 100644 (file)
 
 #include "precomp.h"
 
-#define GET_X_LPARAM(lp) ((int)(short)LOWORD(lp))
-#define GET_Y_LPARAM(lp) ((int)(short)HIWORD(lp))
-
 /*
  * SysPagerWnd
  */
-static const WCHAR szSysPagerWndClass [] = TEXT("SysPager");
+static const WCHAR szSysPagerWndClass [] = L"SysPager";
 
 // Data comes from shell32/systray.cpp -> TrayNotifyCDS_Dummy
 typedef struct _SYS_PAGER_COPY_DATA
@@ -86,7 +83,7 @@ public:
     {
         TBBUTTON tbBtn;
         NOTIFYICONDATA * notifyItem;
-        WCHAR text [] = TEXT("");
+        WCHAR text[] = L"";
 
         int index = FindItemByIconData(iconData, &notifyItem);
         if (index >= 0)
@@ -163,14 +160,8 @@ public:
 
         if (iconData->uFlags & NIF_ICON)
         {
-            TBBUTTONINFO tbbiOld = { 0 };
-            tbbiOld.cbSize = sizeof(tbbiOld);
-            tbbiOld.dwMask = TBIF_BYINDEX | TBIF_IMAGE;
-
-            GetButtonInfo(index, &tbbiOld);
-
             tbbi.dwMask |= TBIF_IMAGE;
-            tbbi.iImage = ImageList_ReplaceIcon(m_ImageList, tbbiOld.iImage, iconData->hIcon);
+            tbbi.iImage = ImageList_ReplaceIcon(m_ImageList, index, iconData->hIcon);
         }
 
         if (iconData->uFlags & NIF_TIP)
@@ -215,22 +206,28 @@ public:
         if (index < 0)
             return FALSE;
 
-        TBBUTTONINFO tbbiOld = { 0 };
-        tbbiOld.cbSize = sizeof(tbbiOld);
-        tbbiOld.dwMask = TBIF_BYINDEX | TBIF_IMAGE;
+        if (!(notifyItem->dwState & NIS_HIDDEN))
+        {
+            m_VisibleButtonCount--;
+        }
 
-        GetButtonInfo(index, &tbbiOld);
+        delete notifyItem;
 
-        ImageList_Remove(m_ImageList, tbbiOld.iImage);
+        ImageList_Remove(m_ImageList, index);
 
-        DeleteButton(index);
+        int count = GetButtonCount();
 
-        if (!(notifyItem->dwState & NIS_HIDDEN))
+        /* shift all buttons one index to the left -- starting one index right
+           from item to delete -- to preserve their correct icon and tip */
+        for (int i = index; i < count - 1; i++)
         {
-            m_VisibleButtonCount--;
+            notifyItem = GetItemData(i + 1);
+            SetItemData(i, notifyItem);
+            UpdateButton(notifyItem);
         }
 
-        delete notifyItem;
+        /* Delete the right-most, now obsolete button */
+        DeleteButton(count - 1);
 
         return TRUE;
     }
@@ -322,7 +319,7 @@ private:
     LRESULT OnMouseEvent(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
     {
         POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
-        
+
         INT iBtn = HitTest(&pt);
 
         if (iBtn >= 0)
@@ -450,10 +447,9 @@ public:
         Toolbar.Initialize(m_hWnd);
 
         // Explicitly request running applications to re-register their systray icons
-        ::SendNotifyMessage(HWND_BROADCAST,
-                            RegisterWindowMessage(TEXT("TaskbarCreated")),
-                            0,
-                            0);
+        ::SendNotifyMessageW(HWND_BROADCAST,
+                             RegisterWindowMessageW(L"TaskbarCreated"),
+                             0, 0);
 
         return TRUE;
     }
@@ -626,7 +622,7 @@ public:
  * TrayClockWnd
  */
 
-static const WCHAR szTrayClockWndClass [] = TEXT("TrayClockWClass");
+static const WCHAR szTrayClockWndClass[] = L"TrayClockWClass";
 
 #define ID_TRAYCLOCK_TIMER  0
 #define ID_TRAYCLOCK_TIMER_INIT 1
@@ -635,14 +631,14 @@ static const struct
 {
     BOOL IsTime;
     DWORD dwFormatFlags;
-    LPCTSTR lpFormat;
+    LPCWSTR lpFormat;
 } ClockWndFormats [] = {
-        { TRUE, 0, NULL },
-        { FALSE, 0, TEXT("dddd") },
-        { FALSE, DATE_SHORTDATE, NULL }
+    { TRUE, 0, NULL },
+    { FALSE, 0, L"dddd" },
+    { FALSE, DATE_SHORTDATE, NULL }
 };
 
-#define CLOCKWND_FORMAT_COUNT (sizeof(ClockWndFormats) / sizeof(ClockWndFormats[0]))
+#define CLOCKWND_FORMAT_COUNT (_ARRAYSIZE(ClockWndFormats))
 
 #define TRAY_CLOCK_WND_SPACING_X    0
 #define TRAY_CLOCK_WND_SPACING_Y    0
@@ -687,7 +683,7 @@ public:
         ZeroMemory(&LocalTime, sizeof(LocalTime));
         ZeroMemory(&CurrentSize, sizeof(CurrentSize));
         ZeroMemory(LineSizes, sizeof(LineSizes));
-        ZeroMemory(szLines, sizeof(LineSizes));
+        ZeroMemory(szLines, sizeof(szLines));
     }
     virtual ~CTrayClockWnd() { }
 
@@ -715,20 +711,19 @@ public:
                 0,
                 TMT_TEXTCOLOR,
                 &textColor);
+
+            if (this->hFont != NULL)
+                DeleteObject(this->hFont);
+
+            SetFont(hFont, FALSE);
         }
         else
         {
-            NONCLIENTMETRICS ncm = { 0 };
-            ncm.cbSize = sizeof(ncm);
-            SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(ncm), &ncm, FALSE);
-
-            hFont = CreateFontIndirectW(&ncm.lfMessageFont);
-
+            /* We don't need to set a font here, our parent will use 
+              * WM_SETFONT to set the right one when themes are not enabled. */
             textColor = RGB(0, 0, 0);
         }
 
-        SetFont(hFont, FALSE);
-
         CloseThemeData(clockTheme);
 
         return TRUE;
@@ -743,7 +738,7 @@ public:
     {
         HDC hDC;
         HFONT hPrevFont;
-        INT c, i;
+        UINT c, i;
         BOOL bRet = TRUE;
 
         hDC = GetDC();
@@ -752,11 +747,11 @@ public:
             if (hFont)
                 hPrevFont = (HFONT) SelectObject(hDC, hFont);
 
-            for (i = 0; i != CLOCKWND_FORMAT_COUNT && bRet; i++)
+            for (i = 0; i < CLOCKWND_FORMAT_COUNT && bRet; i++)
             {
-                if (szLines[i][0] != TEXT('\0') &&
-                    !GetTextExtentPoint(hDC, szLines[i], _tcslen(szLines[i]),
-                    &LineSizes[i]))
+                if (szLines[i][0] != L'\0' &&
+                    !GetTextExtentPointW(hDC, szLines[i], wcslen(szLines[i]),
+                                         &LineSizes[i]))
                 {
                     bRet = FALSE;
                     break;
@@ -773,7 +768,7 @@ public:
                 LineSpacing = 0;
 
                 /* calculate the line spacing */
-                for (i = 0, c = 0; i != CLOCKWND_FORMAT_COUNT; i++)
+                for (i = 0, c = 0; i < CLOCKWND_FORMAT_COUNT; i++)
                 {
                     if (LineSizes[i].cx > 0)
                     {
@@ -784,7 +779,7 @@ public:
 
                 if (c > 0)
                 {
-                    /* We want a spaceing of 1/2 line */
+                    /* We want a spacing of 1/2 line */
                     LineSpacing = (LineSpacing / c) / 2;
                 }
 
@@ -798,7 +793,7 @@ public:
     WORD GetMinimumSize(IN BOOL Horizontal, IN OUT PSIZE pSize)
     {
         WORD iLinesVisible = 0;
-        INT i;
+        UINT i;
         SIZE szMax = { 0, 0 };
 
         if (!LinesMeasured)
@@ -807,9 +802,7 @@ public:
         if (!LinesMeasured)
             return 0;
 
-        for (i = 0;
-            i != CLOCKWND_FORMAT_COUNT;
-            i++)
+        for (i = 0; i < CLOCKWND_FORMAT_COUNT; i++)
         {
             if (LineSizes[i].cx != 0)
             {
@@ -851,28 +844,26 @@ public:
     }
 
 
-    VOID        UpdateWnd()
+    VOID UpdateWnd()
     {
         SIZE szPrevCurrent;
-        INT BufSize, iRet, i;
+        UINT BufSize, i;
+        INT iRet;
         RECT rcClient;
 
-        ZeroMemory(LineSizes,
-            sizeof(LineSizes));
+        ZeroMemory(LineSizes, sizeof(LineSizes));
 
         szPrevCurrent = CurrentSize;
 
-        for (i = 0;
-            i != CLOCKWND_FORMAT_COUNT;
-            i++)
+        for (i = 0; i < CLOCKWND_FORMAT_COUNT; i++)
         {
-            szLines[i][0] = TEXT('\0');
-            BufSize = sizeof(szLines[0]) / sizeof(szLines[0][0]);
+            szLines[i][0] = L'\0';
+            BufSize = _countof(szLines[0]);
 
             if (ClockWndFormats[i].IsTime)
             {
                 iRet = GetTimeFormat(LOCALE_USER_DEFAULT,
-                    AdvancedSettings.bShowSeconds ? ClockWndFormats[i].dwFormatFlags : TIME_NOSECONDS,
+                    TaskBarSettings.bShowSeconds ? ClockWndFormats[i].dwFormatFlags : TIME_NOSECONDS,
                     &LocalTime,
                     ClockWndFormats[i].lpFormat,
                     szLines[i],
@@ -931,20 +922,20 @@ public:
         }
     }
 
-    VOID        Update()
+    VOID Update()
     {
         GetLocalTime(&LocalTime);
         UpdateWnd();
     }
 
-    UINT        CalculateDueTime()
+    UINT CalculateDueTime()
     {
         UINT uiDueTime;
 
         /* Calculate the due time */
         GetLocalTime(&LocalTime);
         uiDueTime = 1000 - (UINT) LocalTime.wMilliseconds;
-        if (AdvancedSettings.bShowSeconds)
+        if (TaskBarSettings.bShowSeconds)
             uiDueTime += (UINT) LocalTime.wSecond * 100;
         else
             uiDueTime += (59 - (UINT) LocalTime.wSecond) * 1000;
@@ -961,7 +952,7 @@ public:
         return uiDueTime;
     }
 
-    BOOL        ResetTime()
+    BOOL ResetTime()
     {
         UINT uiDueTime;
         BOOL Ret;
@@ -990,7 +981,7 @@ public:
         return Ret;
     }
 
-    VOID        CalibrateTimer()
+    VOID CalibrateTimer()
     {
         UINT uiDueTime;
         BOOL Ret;
@@ -1002,7 +993,7 @@ public:
 
         uiDueTime = CalculateDueTime();
 
-        if (AdvancedSettings.bShowSeconds)
+        if (TaskBarSettings.bShowSeconds)
         {
             uiWait1 = 1000 - 200;
             uiWait2 = 1000;
@@ -1052,7 +1043,8 @@ public:
     {
         RECT rcClient;
         HFONT hPrevFont;
-        int iPrevBkMode, i, line;
+        INT iPrevBkMode;
+        UINT i, line;
 
         PAINTSTRUCT ps;
         HDC hDC = (HDC) wParam;
@@ -1080,8 +1072,8 @@ public:
             rcClient.bottom = rcClient.top + CurrentSize.cy;
 
             for (i = 0, line = 0;
-                i != CLOCKWND_FORMAT_COUNT && line < VisibleLines;
-                i++)
+                 i < CLOCKWND_FORMAT_COUNT && line < VisibleLines;
+                 i++)
             {
                 if (LineSizes[i].cx != 0)
                 {
@@ -1090,7 +1082,7 @@ public:
                         TRAY_CLOCK_WND_SPACING_X,
                         rcClient.top + TRAY_CLOCK_WND_SPACING_Y,
                         szLines[i],
-                        _tcslen(szLines[i]));
+                        wcslen(szLines[i]));
 
                     rcClient.top += LineSizes[i].cy + LineSpacing;
                     line++;
@@ -1210,8 +1202,10 @@ public:
         MESSAGE_HANDLER(WM_SIZE, OnSize)
         MESSAGE_HANDLER(WM_PAINT, OnPaint)
         MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint)
+        MESSAGE_HANDLER(WM_THEMECHANGED, OnThemeChanged)
         MESSAGE_HANDLER(WM_TIMER, OnTimer)
         MESSAGE_HANDLER(WM_NCHITTEST, OnNcHitTest)
+        MESSAGE_HANDLER(WM_SETFONT, OnSetFont)
         MESSAGE_HANDLER(TCWM_GETMINIMUMSIZE, OnGetMinimumSize)
         MESSAGE_HANDLER(TCWM_UPDATETIME, OnUpdateTime)
 
@@ -1232,10 +1226,7 @@ public:
         Create(hWndParent, 0, NULL, dwStyle);
 
         if (m_hWnd != NULL)
-        {
             SetWindowTheme(m_hWnd, L"TrayNotify", NULL);
-            OnThemeChanged();
-        }
 
         return m_hWnd;
 
@@ -1340,25 +1331,17 @@ public:
         m_pager = new CSysPagerWnd();
         m_pager->_Init(m_hWnd, !HideClock);
 
-        OnThemeChanged();
-
         return TRUE;
     }
 
-    BOOL GetMinimumSize(IN BOOL Horizontal, IN OUT PSIZE pSize)
+    BOOL GetMinimumSize(IN OUT PSIZE pSize)
     {
         SIZE szClock = { 0, 0 };
         SIZE szTray = { 0, 0 };
 
-        IsHorizontal = Horizontal;
-        if (IsHorizontal)
-            SetWindowTheme(m_hWnd, L"TrayNotifyHoriz", NULL);
-        else
-            SetWindowTheme(m_hWnd, L"TrayNotifyVert", NULL);
-
         if (!HideClock)
         {
-            if (Horizontal)
+            if (IsHorizontal)
             {
                 szClock.cy = pSize->cy - 2 * TRAY_NOTIFY_WND_SPACING_Y;
                 if (szClock.cy <= 0)
@@ -1371,7 +1354,7 @@ public:
                     goto NoClock;
             }
 
-            m_clock->SendMessage(TCWM_GETMINIMUMSIZE, (WPARAM) Horizontal, (LPARAM) &szClock);
+            m_clock->SendMessage(TCWM_GETMINIMUMSIZE, (WPARAM) IsHorizontal, (LPARAM) &szClock);
 
             szTrayClockMin = szClock;
         }
@@ -1379,7 +1362,7 @@ public:
         NoClock:
         szTrayClockMin = szClock;
 
-        if (Horizontal)
+        if (IsHorizontal)
         {
             szTray.cy = pSize->cy - 2 * TRAY_NOTIFY_WND_SPACING_Y;
         }
@@ -1388,11 +1371,11 @@ public:
             szTray.cx = pSize->cx - 2 * TRAY_NOTIFY_WND_SPACING_X;
         }
 
-        m_pager->GetSize(Horizontal, &szTray);
+        m_pager->GetSize(IsHorizontal, &szTray);
 
         szTrayNotify = szTray;
 
-        if (Horizontal)
+        if (IsHorizontal)
         {
             pSize->cx = 2 * TRAY_NOTIFY_WND_SPACING_X;
 
@@ -1519,7 +1502,18 @@ public:
 
     LRESULT OnGetMinimumSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
     {
-        return (LRESULT) GetMinimumSize((BOOL) wParam, (PSIZE) lParam);
+        BOOL Horizontal = (BOOL) wParam;
+
+        if (Horizontal != IsHorizontal)
+        {
+            IsHorizontal = Horizontal;
+            if (IsHorizontal)
+                SetWindowTheme(m_hWnd, L"TrayNotifyHoriz", NULL);
+            else
+                SetWindowTheme(m_hWnd, L"TrayNotifyVert", NULL);
+        }
+
+        return (LRESULT) GetMinimumSize((PSIZE) lParam);
     }
 
     LRESULT OnUpdateTime(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)