]> git.saurik.com Git - wxWidgets.git/commitdiff
Rewrote wxToolBar another time.
authorRobert Roebling <robert@roebling.de>
Sat, 30 Mar 2002 21:18:39 +0000 (21:18 +0000)
committerRobert Roebling <robert@roebling.de>
Sat, 30 Mar 2002 21:18:39 +0000 (21:18 +0000)
  Other minor tweaks.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@14874 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/univ/toolbar.h
samples/toolbar/toolbar.cpp
src/univ/button.cpp
src/univ/renderer.cpp
src/univ/themes/win32.cpp
src/univ/toolbar.cpp

index 4ed637c3e6d1ba93951fc3b4115665e5a3ce412d..5ca1a31a6811b800a1e2877b7175adce32eebb7a 100644 (file)
@@ -67,6 +67,10 @@ public:
 
     virtual void SetToolShortHelp(int id, const wxString& helpString);
 
 
     virtual void SetToolShortHelp(int id, const wxString& helpString);
 
+    virtual void SetMargins(int x, int y);
+    void SetMargins(const wxSize& size)
+        { SetMargins((int) size.x, (int) size.y); }
+    
 protected:
     // common part of all ctors
     void Init();
 protected:
     // common part of all ctors
     void Init();
@@ -110,15 +114,6 @@ protected:
     // vertical toolbar, left/right for a horizontal one
     void GetRectLimits(const wxRect& rect, wxCoord *start, wxCoord *end) const;
 
     // vertical toolbar, left/right for a horizontal one
     void GetRectLimits(const wxRect& rect, wxCoord *start, wxCoord *end) const;
 
-    // wxButton actions: all these use m_toolPressed and can only be called if
-    // we have one
-    void Toggle();
-    void Press();
-    void Release();
-
-    // this one used m_toolCurrent
-    void Click();
-
 private:
     // have we calculated the positions of our tools?
     bool m_needsLayout;
 private:
     // have we calculated the positions of our tools?
     bool m_needsLayout;
@@ -129,14 +124,8 @@ private:
     // the total size of all toolbar elements
     wxCoord m_maxWidth,
             m_maxHeight;
     // the total size of all toolbar elements
     wxCoord m_maxWidth,
             m_maxHeight;
-    
-    // the tool over which the mouse currently is or NULL
-    wxToolBarToolBase *m_toolCurrent;
-
-    // the tool which currently has the mouse capture (i.e. the one user is
-    // pressing) or NULL
-    wxToolBarTool *m_toolPressed;
 
 
+private:
     DECLARE_DYNAMIC_CLASS(wxToolBar)
 };
 
     DECLARE_DYNAMIC_CLASS(wxToolBar)
 };
 
@@ -145,7 +134,7 @@ private:
 // click into button press/release actions
 // ----------------------------------------------------------------------------
 
 // click into button press/release actions
 // ----------------------------------------------------------------------------
 
-class WXDLLEXPORT wxStdToolbarInputHandler : public wxStdButtonInputHandler
+class WXDLLEXPORT wxStdToolbarInputHandler : public wxStdInputHandler
 {
 public:
     wxStdToolbarInputHandler(wxInputHandler *inphand);
 {
 public:
     wxStdToolbarInputHandler(wxInputHandler *inphand);
@@ -158,6 +147,11 @@ public:
     virtual bool HandleMouseMove(wxInputConsumer *consumer, const wxMouseEvent& event);
     virtual bool HandleFocus(wxInputConsumer *consumer, const wxFocusEvent& event);
     virtual bool HandleActivation(wxInputConsumer *consumer, bool activated);
     virtual bool HandleMouseMove(wxInputConsumer *consumer, const wxMouseEvent& event);
     virtual bool HandleFocus(wxInputConsumer *consumer, const wxFocusEvent& event);
     virtual bool HandleActivation(wxInputConsumer *consumer, bool activated);
+    
+private:
+    wxWindow            *m_winCapture;
+    wxToolBarToolBase   *m_toolCapture;
+    wxToolBarToolBase   *m_toolLast;
 };
 
 #endif // _WX_UNIV_TOOLBAR_H_
 };
 
 #endif // _WX_UNIV_TOOLBAR_H_
index 4d5307987bf09e8b32ba6f4189139ea18a2d5982..77e6ad964bc023d2465f6c2a0c3abe912c1a82af 100644 (file)
@@ -152,7 +152,8 @@ private:
 
 const int ID_TOOLBAR = 500;
 
 
 const int ID_TOOLBAR = 500;
 
-static const long TOOLBAR_STYLE = wxTB_FLAT | wxTB_DOCKABLE | wxTB_TEXT;
+static const long TOOLBAR_STYLE = wxTB_FLAT | wxTB_DOCKABLE | wxTB_TEXT ;
+// static const long TOOLBAR_STYLE = 0;
 
 enum
 {
 
 enum
 {
index eaf7fea91bd05ef5d1f7256f7fe60f4419d41060..f98b725e51af659400c0b44434856e99092e2364 100644 (file)
@@ -236,9 +236,9 @@ void wxButton::SetImageLabel(const wxBitmap& bitmap)
 
 void wxButton::SetImageMargins(wxCoord x, wxCoord y)
 {
 
 void wxButton::SetImageMargins(wxCoord x, wxCoord y)
 {
-    m_marginBmpX = x;
-    m_marginBmpY = y;
-
+    m_marginBmpX = x + 2;
+    m_marginBmpY = y + 2;
+    
     SetBestSize(wxDefaultSize);
 }
 
     SetBestSize(wxDefaultSize);
 }
 
index 4053fbf68feb622a88ae4564b76cb5af90650d7b..3ad6923ec2b24da83b94669da693acd56f0a0328 100644 (file)
@@ -428,6 +428,10 @@ void wxControlRenderer::DrawLabel(const wxBitmap& bitmap,
         if ( bitmap.Ok() )
         {
             rectLabel.Inflate(-marginX, -marginY);
         if ( bitmap.Ok() )
         {
             rectLabel.Inflate(-marginX, -marginY);
+            
+            // I don't know why this is necessary. RR.
+            rectLabel.x ++;
+            rectLabel.y ++;
         }
 
         wxControl *ctrl = wxStaticCast(m_window, wxControl);
         }
 
         wxControl *ctrl = wxStaticCast(m_window, wxControl);
index dae32a197b7695eb6841a8cc58fb0803ee1ee2b0..d17179d9b81617e4ba09b34bd87394d842b3553c 100644 (file)
@@ -354,7 +354,7 @@ public:
     virtual wxSize GetToolBarButtonSize(wxCoord *separator) const
         { if ( separator ) *separator = 5; return wxSize(16, 15); }
     virtual wxSize GetToolBarMargin() const
     virtual wxSize GetToolBarButtonSize(wxCoord *separator) const
         { if ( separator ) *separator = 5; return wxSize(16, 15); }
     virtual wxSize GetToolBarMargin() const
-        { return wxSize(6, 6); }
+        { return wxSize(4, 4); }
 
     virtual wxRect GetTextTotalArea(const wxTextCtrl *text,
                                     const wxRect& rect) const;
 
     virtual wxRect GetTextTotalArea(const wxTextCtrl *text,
                                     const wxRect& rect) const;
index 2ce2dacdb8834a006893f6a2125e5f089daad7ba..e0d4b6f169489fd584128e622f1dc7dbb0175ab0 100644 (file)
@@ -73,6 +73,9 @@ public:
 
         // not pressed yet
         m_isInverted = FALSE;
 
         // not pressed yet
         m_isInverted = FALSE;
+        
+        // mouse not here yet
+        m_underMouse = FALSE;
     }
 
     // is this tool pressed, even temporarily? (this is different from being
     }
 
     // is this tool pressed, even temporarily? (this is different from being
@@ -85,6 +88,10 @@ public:
 
     // press the tool temporarily by inverting its toggle state
     void Invert() { m_isInverted = !m_isInverted; }
 
     // press the tool temporarily by inverting its toggle state
     void Invert() { m_isInverted = !m_isInverted; }
+    
+    // Set underMouse
+    void SetUnderMouse( bool under = TRUE ) { m_underMouse = under; }
+    bool IsUnderMouse() { return m_underMouse; }
 
 public:
     // the tool position (the size is known by the toolbar itself)
 
 public:
     // the tool position (the size is known by the toolbar itself)
@@ -94,6 +101,9 @@ public:
 private:
     // TRUE if the tool is pressed
     bool m_isInverted;
 private:
     // TRUE if the tool is pressed
     bool m_isInverted;
+    
+    // TRUE if the tool is under the mouse
+    bool m_underMouse;
 };
 
 // ============================================================================
 };
 
 // ============================================================================
@@ -117,9 +127,6 @@ void wxToolBar::Init()
     m_maxWidth =
     m_maxHeight = 0;
 
     m_maxWidth =
     m_maxHeight = 0;
 
-    m_toolPressed = NULL;
-    m_toolCurrent = NULL;
-
     wxRenderer *renderer = GetRenderer();
 
     SetToolBitmapSize(renderer->GetToolBarButtonSize(&m_widthSeparator));
     wxRenderer *renderer = GetRenderer();
 
     SetToolBitmapSize(renderer->GetToolBarButtonSize(&m_widthSeparator));
@@ -150,6 +157,13 @@ wxToolBar::~wxToolBar()
 {
 }
 
 {
 }
 
+void wxToolBar::SetMargins(int x, int y)
+{
+    // This required for similar visual effects under
+    // native platforms and wxUniv.
+    wxToolBarBase::SetMargins( x + 2, y + 2 );
+}
+
 // ----------------------------------------------------------------------------
 // wxToolBar tool-related methods
 // ----------------------------------------------------------------------------
 // ----------------------------------------------------------------------------
 // wxToolBar tool-related methods
 // ----------------------------------------------------------------------------
@@ -458,7 +472,7 @@ void wxToolBar::DoDraw(wxControlRenderer *renderer)
           node;
           node = node->GetNext() )
     {
           node;
           node = node->GetNext() )
     {
-        wxToolBarToolBase *tool = node->GetData();
+        wxToolBarTool *tool = (wxToolBarTool*) node->GetData();
         wxRect rectTool = GetToolRect(tool);
         wxCoord startTool, endTool;
         GetRectLimits(rectTool, &startTool, &endTool);
         wxRect rectTool = GetToolRect(tool);
         wxCoord startTool, endTool;
         GetRectLimits(rectTool, &startTool, &endTool);
@@ -474,14 +488,14 @@ void wxToolBar::DoDraw(wxControlRenderer *renderer)
             // we're beyond the area to redraw, nothing left to do
             break;
         }
             // we're beyond the area to redraw, nothing left to do
             break;
         }
-
+        
         // deal with the flags
         int flags = 0;
 
         if ( tool->IsEnabled() )
         {
         // deal with the flags
         int flags = 0;
 
         if ( tool->IsEnabled() )
         {
-            // the toolbars without wxTB_FLAT don't react to the mouse hovering
-            if ( HasFlag(wxTB_FLAT) && (tool == m_toolCurrent) )
+            // The toolbars without wxTB_FLAT don't react to the mouse hovering
+            if ( !HasFlag(wxTB_FLAT) || tool->IsUnderMouse() )
                 flags |= wxCONTROL_CURRENT;
         }
         else // disabled tool
                 flags |= wxCONTROL_CURRENT;
         }
         else // disabled tool
@@ -489,17 +503,17 @@ void wxToolBar::DoDraw(wxControlRenderer *renderer)
             flags |= wxCONTROL_DISABLED;
         }
 
             flags |= wxCONTROL_DISABLED;
         }
 
-        if ( tool == m_toolPressed )
-            flags |= wxCONTROL_FOCUSED;
+        //if ( tool == m_toolCaptured )
+        //    flags |= wxCONTROL_FOCUSED;
 
 
-        if ( ((wxToolBarTool *)tool)->IsPressed() )
-            flags |= wxCONTROL_PRESSED;
+        if ( tool->IsPressed() )
+            flags = wxCONTROL_PRESSED;
 
         wxString label;
         wxBitmap bitmap;
         if ( !tool->IsSeparator() )
         {
 
         wxString label;
         wxBitmap bitmap;
         if ( !tool->IsSeparator() )
         {
-            label = tool->GetLabel();
+            // label = tool->GetLabel();
             bitmap = tool->GetBitmap();
         }
         //else: leave both the label and the bitmap invalid to draw a separator
             bitmap = tool->GetBitmap();
         }
         //else: leave both the label and the bitmap invalid to draw a separator
@@ -512,116 +526,75 @@ void wxToolBar::DoDraw(wxControlRenderer *renderer)
 // wxToolBar actions
 // ----------------------------------------------------------------------------
 
 // wxToolBar actions
 // ----------------------------------------------------------------------------
 
-void wxToolBar::Press()
-{
-    wxCHECK_RET( m_toolCurrent, _T("no tool to press?") );
-
-    wxLogTrace(_T("toolbar"),
-               _T("Button '%s' pressed."),
-               m_toolCurrent->GetShortHelp().c_str());
-
-    // this is the tool whose state is going to change
-    m_toolPressed = (wxToolBarTool *)m_toolCurrent;
-
-    // we must toggle it regardless of whether it is a checkable tool or not,
-    // so use Invert() and not Toggle() here
-    m_toolPressed->Invert();
-
-    RefreshTool(m_toolPressed);
-}
-
-void wxToolBar::Release()
-{
-    wxCHECK_RET( m_toolPressed, _T("no tool to release?") );
-
-    wxLogTrace(_T("toolbar"),
-               _T("Button '%s' released."),
-               m_toolCurrent->GetShortHelp().c_str());
-
-    wxASSERT_MSG( m_toolPressed->IsInverted(), _T("release unpressed button?") );
-
-    m_toolPressed->Invert();
-
-    RefreshTool(m_toolPressed);
-}
-
-void wxToolBar::Toggle()
+bool wxToolBar::PerformAction(const wxControlAction& action,
+                              long numArg,
+                              const wxString& strArg)
 {
 {
-    m_toolCurrent = m_toolPressed;
-
-    Release();
-
-    Click();
-}
+    wxToolBarTool *tool = (wxToolBarTool*) FindById(numArg);
+    
+    if ( action == wxACTION_TOOLBAR_TOGGLE )
+    {
+        PerformAction( wxACTION_BUTTON_RELEASE, numArg );
 
 
-void wxToolBar::Click()
-{
-    wxCHECK_RET( m_toolCurrent, _T("no tool to click?") );
+        PerformAction( wxACTION_BUTTON_CLICK, numArg );
+    }
+    else if ( action == wxACTION_TOOLBAR_PRESS )
+    {
+        wxLogTrace(_T("toolbar"), _T("Button '%s' pressed."), tool->GetShortHelp().c_str());
+        
+        tool->Invert();
 
 
-    bool isToggled;
-    if ( m_toolCurrent->CanBeToggled() )
+        RefreshTool( tool );
+    }
+    else if ( action == wxACTION_TOOLBAR_RELEASE )
     {
     {
-        m_toolCurrent->Toggle();
+        wxLogTrace(_T("toolbar"), _T("Button '%s' released."), tool->GetShortHelp().c_str());
 
 
-        RefreshTool(m_toolCurrent);
+        wxASSERT_MSG( tool->IsInverted(), _T("release unpressed button?") );
+    
+        tool->Invert();
 
 
-        isToggled = m_toolCurrent->IsToggled();
+        RefreshTool( tool );
     }
     }
-    else // simple non-checkable tool
+    else if ( action == wxACTION_TOOLBAR_CLICK )
     {
     {
-        isToggled = FALSE;
-    }
+        bool isToggled;
+        if ( tool->CanBeToggled() )
+        {
+            tool->Toggle();
 
 
-    OnLeftClick(m_toolCurrent->GetId(), isToggled);
-}
+            RefreshTool( tool );
 
 
-bool wxToolBar::PerformAction(const wxControlAction& action,
-                              long numArg,
-                              const wxString& strArg)
-{
-    if ( action == wxACTION_TOOLBAR_TOGGLE )
-        Toggle();
-    else if ( action == wxACTION_TOOLBAR_PRESS )
-        Press();
-    else if ( action == wxACTION_TOOLBAR_RELEASE )
-        Release();
-    else if ( action == wxACTION_TOOLBAR_CLICK )
-        Click();
+            isToggled = tool->IsToggled();
+        }
+        else // simple non-checkable tool
+        {
+            isToggled = FALSE;
+        }
+        OnLeftClick( tool->GetId(), isToggled );
+    }
     else if ( action == wxACTION_TOOLBAR_ENTER )
     {
     else if ( action == wxACTION_TOOLBAR_ENTER )
     {
-        wxToolBarToolBase *toolCurrentOld = m_toolCurrent;
-        m_toolCurrent = FindById((int)numArg);
-
-        if ( m_toolCurrent != toolCurrentOld )
+        wxCHECK_MSG( tool, FALSE, _T("no tool to enter?") );
+        
+        if ( HasFlag(wxTB_FLAT) && tool->IsEnabled() )
         {
         {
-            // the appearance of the current tool only changes for the flat
-            // toolbars
-            if ( HasFlag(wxTB_FLAT) )
-            {
-                // and only if the tool was/is enabled
-                if ( toolCurrentOld && toolCurrentOld->IsEnabled() )
-                    RefreshTool(toolCurrentOld);
-
-                if ( m_toolCurrent )
-                {
-                    if ( m_toolCurrent->IsEnabled() )
-                        RefreshTool(m_toolCurrent);
-                }
-                else
-                {
-                    wxFAIL_MSG( _T("no current tool in wxACTION_TOOLBAR_ENTER?") );
-                }
-            }
+            tool->SetUnderMouse( TRUE );
+            
+            if ( !tool->IsToggled() )
+                RefreshTool( tool );
         }
     }
     else if ( action == wxACTION_TOOLBAR_LEAVE )
     {
         }
     }
     else if ( action == wxACTION_TOOLBAR_LEAVE )
     {
-        if ( m_toolCurrent )
+        wxCHECK_MSG( tool, FALSE, _T("no tool to leave?") );
+        
+        if ( HasFlag(wxTB_FLAT) && tool->IsEnabled() )
         {
         {
-            wxToolBarToolBase *toolCurrentOld = m_toolCurrent;
-            m_toolCurrent = NULL;
-
-            RefreshTool(toolCurrentOld);
+            tool->SetUnderMouse( FALSE );
+            
+            if ( !tool->IsToggled() )
+                RefreshTool( tool );
         }
     }
     else
         }
     }
     else
@@ -635,8 +608,11 @@ bool wxToolBar::PerformAction(const wxControlAction& action,
 // ============================================================================
 
 wxStdToolbarInputHandler::wxStdToolbarInputHandler(wxInputHandler *handler)
 // ============================================================================
 
 wxStdToolbarInputHandler::wxStdToolbarInputHandler(wxInputHandler *handler)
-                        : wxStdButtonInputHandler(handler)
+                        : wxStdInputHandler(handler)
 {
 {
+    m_winCapture = NULL;
+    m_toolCapture = NULL;
+    m_toolLast = NULL;
 }
 
 bool wxStdToolbarInputHandler::HandleKey(wxInputConsumer *consumer,
 }
 
 bool wxStdToolbarInputHandler::HandleKey(wxInputConsumer *consumer,
@@ -651,39 +627,96 @@ bool wxStdToolbarInputHandler::HandleKey(wxInputConsumer *consumer,
 bool wxStdToolbarInputHandler::HandleMouse(wxInputConsumer *consumer,
                                            const wxMouseEvent& event)
 {
 bool wxStdToolbarInputHandler::HandleMouse(wxInputConsumer *consumer,
                                            const wxMouseEvent& event)
 {
-    // don't let the base class press the disabled buttons but simply ignore
-    // all events on them
     wxToolBar *tbar = wxStaticCast(consumer->GetInputWindow(), wxToolBar);
     wxToolBarToolBase *tool = tbar->FindToolForPosition(event.GetX(), event.GetY());
 
     wxToolBar *tbar = wxStaticCast(consumer->GetInputWindow(), wxToolBar);
     wxToolBarToolBase *tool = tbar->FindToolForPosition(event.GetX(), event.GetY());
 
-    if ( !tool || !tool->IsEnabled() )
-        return TRUE;
+    if ( event.Button(1) )
+    {
+        if ( !tool || !tool->IsEnabled() )
+            return TRUE;
+
+        if ( event.LeftDown() || event.LeftDClick() )
+        {
+            m_winCapture = tbar;
+            m_winCapture->CaptureMouse();
+            
+            m_toolCapture = tool;
+
+            consumer->PerformAction( wxACTION_BUTTON_PRESS, tool->GetId() );
+
+            return TRUE;
+        }
+        else if ( event.LeftUp() )
+        {
+            if ( m_winCapture )
+            {
+                m_winCapture->ReleaseMouse();
+                m_winCapture = NULL;
+            }
+
+            if ( tool == m_toolCapture )
+            {
+                // this will generate a click event
+                consumer->PerformAction( wxACTION_BUTTON_TOGGLE, tool->GetId() );
 
 
-    return wxStdButtonInputHandler::HandleMouse(consumer, event);
+                m_toolCapture = NULL;
+                
+                return TRUE;
+            }
+            //else: the mouse was released outside the tool or in
+            //      a different tool
+            
+            m_toolCapture = NULL;
+            
+        }
+        //else: don't do anything special about the double click
+    }
+
+    return wxStdInputHandler::HandleMouse(consumer, event);
 }
 
 bool wxStdToolbarInputHandler::HandleMouseMove(wxInputConsumer *consumer,
                                                const wxMouseEvent& event)
 {
 }
 
 bool wxStdToolbarInputHandler::HandleMouseMove(wxInputConsumer *consumer,
                                                const wxMouseEvent& event)
 {
-    if ( !wxStdButtonInputHandler::HandleMouseMove(consumer, event) )
+    if ( !wxStdInputHandler::HandleMouseMove(consumer, event) )
     {
     {
-        wxToolBarToolBase *tool;
-
+        wxToolBar *tbar = wxStaticCast(consumer->GetInputWindow(), wxToolBar);
+        
+        wxToolBarTool *tool;
         if ( event.Leaving() )
         {
         if ( event.Leaving() )
         {
+            // We cannot possibly be over a tool when
+            // leaving the toolbar
             tool = NULL;
         }
         else
         {
             tool = NULL;
         }
         else
         {
-            wxToolBar *tbar = wxStaticCast(consumer->GetInputWindow(), wxToolBar);
-            tool = tbar->FindToolForPosition(event.GetX(), event.GetY());
+            tool = (wxToolBarTool*) tbar->FindToolForPosition( event.GetX(), event.GetY() );
         }
         }
-
-        if ( tool )
-            consumer->PerformAction(wxACTION_TOOLBAR_ENTER, tool->GetId());
+        
+        if ((tool) && (tool == m_toolLast))
+        {
+            // Still over the same tool as last time
+            return TRUE;
+        }
+        
+        if (m_toolLast)
+        {
+            // Leave old tool if any
+            consumer->PerformAction( wxACTION_TOOLBAR_LEAVE, m_toolLast->GetId() );
+        }
+        
+        if (m_toolCapture && (m_toolCapture != tool))
+            m_toolLast = NULL;
         else
         else
-            consumer->PerformAction(wxACTION_TOOLBAR_LEAVE);
-
+            m_toolLast = tool;
+        
+        if (m_toolLast)
+        {
+            // Enter new tool if any
+            consumer->PerformAction( wxACTION_TOOLBAR_ENTER, m_toolLast->GetId() );
+        }
+        
         return TRUE;
     }
 
         return TRUE;
     }
 
@@ -693,8 +726,11 @@ bool wxStdToolbarInputHandler::HandleMouseMove(wxInputConsumer *consumer,
 bool wxStdToolbarInputHandler::HandleFocus(wxInputConsumer *consumer,
                                            const wxFocusEvent& event)
 {
 bool wxStdToolbarInputHandler::HandleFocus(wxInputConsumer *consumer,
                                            const wxFocusEvent& event)
 {
-    // we shouldn't be left with a highlighted button
-    consumer->PerformAction(wxACTION_TOOLBAR_LEAVE);
+    if (m_toolCapture)
+    {
+        // We shouldn't be left with a highlighted button
+        consumer->PerformAction( wxACTION_TOOLBAR_LEAVE, m_toolCapture->GetId() );
+    }
 
     return TRUE;
 }
 
     return TRUE;
 }
@@ -702,9 +738,11 @@ bool wxStdToolbarInputHandler::HandleFocus(wxInputConsumer *consumer,
 bool wxStdToolbarInputHandler::HandleActivation(wxInputConsumer *consumer,
                                                 bool activated)
 {
 bool wxStdToolbarInputHandler::HandleActivation(wxInputConsumer *consumer,
                                                 bool activated)
 {
-    // as above
-    if ( !activated )
-        consumer->PerformAction(wxACTION_TOOLBAR_LEAVE);
+    if (m_toolCapture && !activated)
+    {
+        // We shouldn't be left with a highlighted button
+        consumer->PerformAction( wxACTION_TOOLBAR_LEAVE, m_toolCapture->GetId() );
+    }
 
     return TRUE;
 }
 
     return TRUE;
 }