]> git.saurik.com Git - wxWidgets.git/blobdiff - src/univ/toolbar.cpp
Fix setting the clipping region for a DC when the region is an
[wxWidgets.git] / src / univ / toolbar.cpp
index 59891ba4ae2f35fa2220fb5ca916a4121b3f2411..0ab62234b0da33e48ff42078ab86250ad2fc496c 100644 (file)
     #include "wx/app.h"
     #include "wx/log.h"
     #include "wx/frame.h"
+    #include "wx/dc.h"
+    #include "wx/image.h"
 #endif
 
 #include "wx/univ/renderer.h"
 
-#include "wx/image.h"
+// ----------------------------------------------------------------------------
+// wxStdToolbarInputHandler: translates SPACE and ENTER keys and the left mouse
+// click into button press/release actions
+// ----------------------------------------------------------------------------
+
+class WXDLLEXPORT wxStdToolbarInputHandler : public wxStdInputHandler
+{
+public:
+    wxStdToolbarInputHandler(wxInputHandler *inphand);
+
+    virtual bool HandleKey(wxInputConsumer *consumer,
+                           const wxKeyEvent& event,
+                           bool pressed);
+    virtual bool HandleMouse(wxInputConsumer *consumer,
+                             const wxMouseEvent& event);
+    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;
+};
 
 // ----------------------------------------------------------------------------
 // constants
@@ -375,8 +400,17 @@ wxRect wxToolBar::GetToolRect(wxToolBarToolBase *toolBase) const
     {
         if (tool->IsButton())
         {
-            rect.width = m_defaultWidth;
-            rect.height = m_defaultHeight;
+            if(!HasFlag(wxTB_TEXT))
+            {
+                rect.width = m_defaultWidth;
+                rect.height = m_defaultHeight;
+            }
+            else
+            {
+                rect.width = m_defaultWidth +
+                    GetFont().GetPointSize() * tool->GetLabel().length();
+                rect.height = m_defaultHeight;
+            }
         }
         else if (tool->IsSeparator())
         {
@@ -393,8 +427,17 @@ wxRect wxToolBar::GetToolRect(wxToolBarToolBase *toolBase) const
     {
         if (tool->IsButton())
         {
-            rect.width = m_defaultWidth;
-            rect.height = m_defaultHeight;
+            if(!HasFlag(wxTB_TEXT))
+            {
+                rect.width = m_defaultWidth;
+                rect.height = m_defaultHeight;
+            }
+            else
+            {
+                rect.width = m_defaultWidth +
+                    GetFont().GetPointSize() * tool->GetLabel().length();
+                rect.height = m_defaultHeight;
+            }
         }
         else if (tool->IsSeparator())
         {
@@ -427,6 +470,15 @@ bool wxToolBar::Realize()
     return true;
 }
 
+void wxToolBar::SetWindowStyleFlag( long style )
+{
+    wxToolBarBase::SetWindowStyleFlag(style);
+
+    m_needsLayout = true;
+
+    Refresh();
+}
+
 void wxToolBar::DoLayout()
 {
     wxASSERT_MSG( m_needsLayout, _T("why are we called?") );
@@ -436,7 +488,8 @@ void wxToolBar::DoLayout()
     wxCoord x = m_xMargin,
             y = m_yMargin;
 
-    const wxCoord widthTool = IsVertical() ? m_defaultHeight : m_defaultWidth;
+    wxCoord widthTool = 0, maxWidthTool = 0;
+    wxCoord heightTool = 0, maxHeightTool = 0;
     wxCoord margin = IsVertical() ? m_xMargin : m_yMargin;
     wxCoord *pCur = IsVertical() ? &y : &x;
 
@@ -453,6 +506,32 @@ void wxToolBar::DoLayout()
         // TODO ugly number fiddling
         if (tool->IsButton())
         {
+            if (IsVertical())
+            {
+                widthTool = m_defaultHeight;
+                heightTool = m_defaultWidth;
+                if(HasFlag(wxTB_TEXT))
+                    heightTool += GetFont().GetPointSize() * tool->GetLabel().length();
+            }
+            else
+            {
+                widthTool = m_defaultWidth;
+                if(HasFlag(wxTB_TEXT))
+                    widthTool += GetFont().GetPointSize() * tool->GetLabel().length();
+
+                heightTool = m_defaultHeight;
+            }
+
+            if(widthTool > maxWidthTool) // Record max width of tool
+            {
+                maxWidthTool = widthTool;
+            }
+
+            if(heightTool > maxHeightTool) // Record max width of tool
+            {
+                maxHeightTool = heightTool;
+            }
+
             *pCur += widthTool;
         }
         else if (tool->IsSeparator())
@@ -473,8 +552,26 @@ void wxToolBar::DoLayout()
     }
 
     // calculate the total toolbar size
-    wxCoord xMin = m_defaultWidth + 2*m_xMargin,
-            yMin = m_defaultHeight + 2*m_yMargin;
+    wxCoord xMin, yMin;
+
+    if(!HasFlag(wxTB_TEXT))
+    {
+        xMin = m_defaultWidth + 2*m_xMargin;
+        yMin = m_defaultHeight + 2*m_yMargin;
+    }
+    else
+    {
+        if (IsVertical())
+        {
+            xMin = heightTool + 2*m_xMargin;
+            yMin = widthTool + 2*m_xMargin;
+        }
+        else
+        {
+            xMin = maxWidthTool + 2*m_xMargin;
+            yMin = heightTool + 2*m_xMargin;
+        }
+    }
 
     m_maxWidth = x < xMin ? xMin : x;
     m_maxHeight = y < yMin ? yMin : y;
@@ -550,7 +647,7 @@ void wxToolBar::DoDraw(wxControlRenderer *renderer)
     // prepare the variables used below
     wxDC& dc = renderer->GetDC();
     wxRenderer *rend = renderer->GetRenderer();
-    // dc.SetFont(GetFont()); -- uncomment when we support labels
+    dc.SetFont(GetFont());
 
     // draw the border separating us from the menubar (if there is no menubar
     // we probably shouldn't draw it?)
@@ -616,14 +713,28 @@ void wxToolBar::DoDraw(wxControlRenderer *renderer)
         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
 
         if ( !tool->IsControl() )
         {
-            rend->DrawToolBarButton(dc, label, bitmap, rectTool, flags, tool->GetStyle());
+            int tbStyle = 0;
+            if(HasFlag(wxTB_TEXT))
+            {
+                tbStyle |= wxTB_TEXT;
+            }
+
+            if(HasFlag(wxTB_VERTICAL))
+            {
+                tbStyle |= wxTB_VERTICAL;
+            }
+            else
+            {
+                tbStyle |= wxTB_HORIZONTAL;
+            }
+            rend->DrawToolBarButton(dc, label, bitmap, rectTool, flags, tool->GetStyle(), tbStyle);
         }
         else // control
         {
@@ -653,6 +764,11 @@ bool wxToolBar::PerformAction(const wxControlAction& action,
 
         // Write by Danny Raynor to change state again.
         // Check button still pressed or not
+        if ( tool->CanBeToggled() && tool->IsToggled() )
+        {
+            tool->Toggle(false);
+        }
+
         if( tool->IsInverted() )
         {
             PerformAction( wxACTION_TOOLBAR_RELEASE, numArg );
@@ -727,6 +843,14 @@ bool wxToolBar::PerformAction(const wxControlAction& action,
     return true;
 }
 
+/* static */
+wxInputHandler *wxToolBar::GetStdInputHandler(wxInputHandler *handlerDef)
+{
+    static wxStdToolbarInputHandler s_handler(handlerDef);
+
+    return &s_handler;
+}
+
 // ============================================================================
 // wxStdToolbarInputHandler implementation
 // ============================================================================