[COMCTL32] Unset the toolbar's hot item when deleting a button. CORE-14222
[reactos.git] / dll / win32 / comctl32 / toolbar.c
index e0a73e7..c2befb2 100644 (file)
@@ -627,6 +627,31 @@ TOOLBAR_DrawString (const TOOLBAR_INFO *infoPtr, RECT *rcText, LPCWSTR lpText,
               wine_dbgstr_rect(rcText));
 
        hOldFont = SelectObject (hdc, infoPtr->hFont);
+#ifdef __REACTOS__
+    if (theme)
+    {
+        DWORD dwDTFlags2 = 0;
+        int partId = TP_BUTTON;
+        int stateId = TS_NORMAL;
+
+        if (state & CDIS_DISABLED)
+        {
+            stateId = TS_DISABLED;
+            dwDTFlags2 = DTT_GRAYED;
+        }
+        else if (state & CDIS_SELECTED)
+            stateId = TS_PRESSED;
+        else if (state & CDIS_CHECKED)
+            stateId = (state & CDIS_HOT) ? TS_HOTCHECKED : TS_HOT;
+        else if (state & CDIS_HOT)
+            stateId = TS_HOT;
+
+        DrawThemeText(theme, hdc, partId, stateId, lpText, -1, infoPtr->dwDTFlags, dwDTFlags2, rcText);
+        SelectObject (hdc, hOldFont);
+        return;
+    }
+#endif
+
        if ((state & CDIS_HOT) && (dwItemCDFlag & TBCDRF_HILITEHOTTRACK )) {
            clrOld = SetTextColor (hdc, tbcd->clrTextHighlight);
        }
@@ -649,25 +674,6 @@ TOOLBAR_DrawString (const TOOLBAR_INFO *infoPtr, RECT *rcText, LPCWSTR lpText,
            clrOld = SetTextColor (hdc, tbcd->clrText);
        }
 
-#ifdef __REACTOS__
-    if (theme)
-    {
-        int partId = TP_BUTTON;
-        int stateId = TS_NORMAL;
-
-        if (state & CDIS_DISABLED)
-            stateId = TS_DISABLED;
-        else if (state & CDIS_SELECTED)
-            stateId = TS_PRESSED;
-        else if (state & CDIS_CHECKED)
-            stateId = (state & CDIS_HOT) ? TS_HOTCHECKED : TS_HOT;
-        else if (state & CDIS_HOT)
-            stateId = TS_HOT;
-
-        DrawThemeText(theme, hdc, partId, stateId, lpText, -1, infoPtr->dwDTFlags, 0, rcText);
-    }
-    else
-#endif
        DrawTextW (hdc, lpText, -1, rcText, infoPtr->dwDTFlags);
        SetTextColor (hdc, clrOld);
        if ((state & CDIS_MARKED) && !(dwItemCDFlag & TBCDRF_NOMARK))
@@ -1130,7 +1136,11 @@ TOOLBAR_DrawButton (const TOOLBAR_INFO *infoPtr, TBUTTON_INFO *btnPtr, HDC hdc,
         else if (tbcd.nmcd.uItemState & CDIS_SELECTED)
             stateId = TS_PRESSED;
         else if (tbcd.nmcd.uItemState & CDIS_CHECKED)
+#ifdef __REACTOS__
+            stateId = (tbcd.nmcd.uItemState & CDIS_HOT) ? TS_HOTCHECKED : TS_CHECKED;
+#else
             stateId = (tbcd.nmcd.uItemState & CDIS_HOT) ? TS_HOTCHECKED : TS_HOT;
+#endif
         else if ((tbcd.nmcd.uItemState & CDIS_HOT)
             || (drawSepDropDownArrow && btnPtr->bDropDownPressed))
             stateId = TS_HOT;
@@ -1156,7 +1166,11 @@ TOOLBAR_DrawButton (const TOOLBAR_INFO *infoPtr, TBUTTON_INFO *btnPtr, HDC hdc,
             else if (btnPtr->bDropDownPressed || (tbcd.nmcd.uItemState & CDIS_SELECTED))
                 stateId = TS_PRESSED;
             else if (tbcd.nmcd.uItemState & CDIS_CHECKED)
+#ifdef __REACTOS__
+                stateId = (tbcd.nmcd.uItemState & CDIS_HOT) ? TS_HOTCHECKED : TS_CHECKED;
+#else
                 stateId = (tbcd.nmcd.uItemState & CDIS_HOT) ? TS_HOTCHECKED : TS_HOT;
+#endif
             else if (tbcd.nmcd.uItemState & CDIS_HOT)
                 stateId = TS_HOT;
                 
@@ -1181,6 +1195,7 @@ TOOLBAR_DrawButton (const TOOLBAR_INFO *infoPtr, TBUTTON_INFO *btnPtr, HDC hdc,
             TOOLBAR_DrawArrow(hdc, rcArrow.left+1, rcArrow.top+1 + (rcArrow.bottom - rcArrow.top - ARROW_HEIGHT) / 2, comctl32_color.clrBtnHighlight);
             TOOLBAR_DrawArrow(hdc, rcArrow.left, rcArrow.top + (rcArrow.bottom - rcArrow.top - ARROW_HEIGHT) / 2, comctl32_color.clr3dShadow);
         }
+#ifndef __REACTOS__
         else if (tbcd.nmcd.uItemState & (CDIS_SELECTED | CDIS_CHECKED))
         {
             offset = (dwItemCDFlag & TBCDRF_NOOFFSET) ? 0 : 1;
@@ -1188,6 +1203,22 @@ TOOLBAR_DrawButton (const TOOLBAR_INFO *infoPtr, TBUTTON_INFO *btnPtr, HDC hdc,
         }
         else
             TOOLBAR_DrawArrow(hdc, rcArrow.left, rcArrow.top + (rcArrow.bottom - rcArrow.top - ARROW_HEIGHT) / 2, comctl32_color.clrBtnText);
+#else
+        else
+        {
+            COLORREF clr = comctl32_color.clrBtnText;
+            if (theme)
+                GetThemeColor(theme, TP_BUTTON, TS_NORMAL, TMT_TEXTCOLOR, &clr);
+
+            if (tbcd.nmcd.uItemState & (CDIS_SELECTED | CDIS_CHECKED))
+            {
+                offset = (dwItemCDFlag & TBCDRF_NOOFFSET) ? 0 : 1;
+                TOOLBAR_DrawArrow(hdc, rcArrow.left + offset, rcArrow.top + offset + (rcArrow.bottom - rcArrow.top - ARROW_HEIGHT) / 2, clr);
+            }
+            else
+                TOOLBAR_DrawArrow(hdc, rcArrow.left, rcArrow.top + (rcArrow.bottom - rcArrow.top - ARROW_HEIGHT) / 2, clr);
+        }
+#endif
     }
 
     if (dwItemCustDraw & CDRF_NOTIFYPOSTPAINT)
@@ -3351,6 +3382,7 @@ TOOLBAR_DeleteButton (TOOLBAR_INFO *infoPtr, INT nIndex)
 
     TOOLBAR_TooltipDelTool(infoPtr, &infoPtr->buttons[nIndex]);
 
+    infoPtr->nHotItem = -1;
     if (infoPtr->nNumButtons == 1) {
        TRACE(" simple delete\n");
         free_string( infoPtr->buttons );