]> git.saurik.com Git - wxWidgets.git/commitdiff
Implement vertical toolbar under Motif.
authorMattia Barbon <mbarbon@cpan.org>
Thu, 16 Jan 2003 20:41:07 +0000 (20:41 +0000)
committerMattia Barbon <mbarbon@cpan.org>
Thu, 16 Jan 2003 20:41:07 +0000 (20:41 +0000)
  Notify parent frame when toolbar is moved/resized/added/deleted so that
frame childs can be correctly repositioned.

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

include/wx/motif/frame.h
include/wx/motif/toolbar.h
src/motif/frame.cpp
src/motif/toolbar.cpp

index dcc4bd221f136b38c357ed28c4e35e5992d33a5e..7a63af17e42a7117942d5b162b8888e3a8444ade 100644 (file)
@@ -61,7 +61,10 @@ public:
     
     // Create toolbar
 #if wxUSE_TOOLBAR
-    virtual wxToolBar* CreateToolBar(long style = wxNO_BORDER|wxTB_HORIZONTAL, wxWindowID id = -1, const wxString& name = wxToolBarNameStr);
+    virtual wxToolBar* CreateToolBar(long style = wxNO_BORDER|wxTB_HORIZONTAL,
+                                     wxWindowID id = -1,
+                                     const wxString& name = wxToolBarNameStr);
+    virtual void SetToolBar(wxToolBar *toolbar);
     virtual void PositionToolBar();
 #endif // wxUSE_TOOLBAR
     
@@ -89,6 +92,8 @@ public:
 
     bool PreResize();
 
+    void SendSizeEvent();
+
     // for generic/mdig.h
     virtual void DoGetClientSize(int *width, int *height) const;    
 private:
index fdb2e95681ef1a72023d1454d783a467b706603d..4ad276b8cf15af0aa46e7cfd8909e3f008302db4 100644 (file)
@@ -53,7 +53,7 @@ public:
     // find tool by widget
     wxToolBarToolBase *FindToolByWidget(WXWidget w) const;
     
-protected:
+private:
     // common part of all ctors
     void Init();
     
@@ -74,7 +74,10 @@ protected:
                                           const wxString& shortHelp,
                                           const wxString& longHelp);
     virtual wxToolBarToolBase *CreateTool(wxControl *control);
-    
+
+    virtual void DoSetSize(int x, int y,
+                           int width, int height,
+                           int sizeFlags = wxSIZE_AUTO);
 private:
     DECLARE_DYNAMIC_CLASS(wxToolBar)
 };
index 4dd023b994e587922a6394729a8282c00a740689..3e3b6605d98474f259355f4c6a355f13dfc2b53a 100644 (file)
@@ -603,6 +603,13 @@ void wxFrame::OnActivate(wxActivateEvent& event)
     }
 }
 
+void wxFrame::SendSizeEvent()
+{
+    wxSizeEvent event(GetSize(), GetId());
+    event.SetEventObject(this);
+    GetEventHandler()->AddPendingEvent(event);
+}
+
 #if wxUSE_TOOLBAR
 
 wxToolBar* wxFrame::CreateToolBar(long style,
@@ -617,6 +624,12 @@ wxToolBar* wxFrame::CreateToolBar(long style,
     return m_frameToolBar;
 }
 
+void wxFrame::SetToolBar(wxToolBar *toolbar)
+{
+    wxFrameBase::SetToolBar(toolbar);
+    SendSizeEvent();
+}
+
 void wxFrame::PositionToolBar()
 {
     wxToolBar* tb = GetToolBar();
index 5f920cc7a1270b1780ca0b12b8d62d7b38a9011b..a96885dd6cdd90f538c8c23bb0a62bd33ea8c1dc 100644 (file)
@@ -29,6 +29,7 @@
 #include "wx/app.h"
 #include "wx/timer.h"
 #include "wx/toolbar.h"
+#include "wx/frame.h"
 
 #ifdef __VMS__
 #pragma message disable nosimpint
@@ -193,18 +194,11 @@ bool wxToolBar::Create(wxWindow *parent,
                        long style,
                        const wxString& name)
 {
-    Init();
+    if( !wxControl::CreateControl( parent, id, pos, size, style,
+                                   wxDefaultValidator, name ) )
+        return FALSE;
 
-    m_windowId = id;
-
-    SetName(name);
     m_backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE);
-    m_foregroundColour = parent->GetForegroundColour();
-    m_windowStyle = style;
-
-    SetParent(parent);
-
-    if (parent) parent->AddChild(this);
 
     Widget parentWidget = (Widget) parent->GetClientWidget();
 
@@ -229,11 +223,19 @@ bool wxToolBar::Create(wxWindow *parent,
 
     m_mainWidget = (WXWidget) toolbar;
 
-    m_font = parent->GetFont();
     ChangeFont(FALSE);
 
+    wxPoint rPos = pos;
+    wxSize  rSize = size;
+
+    if( rPos.x == -1 ) rPos.x = 0;
+    if( rPos.y == -1 ) rPos.y = 0;
+    if( rSize.x == -1 && GetParent() )
+        rSize.x = GetParent()->GetSize().x;
+
     SetCanAddEventHandler(TRUE);
-    AttachWidget (parent, m_mainWidget, (WXWidget) NULL, pos.x, pos.y, size.x, size.y);
+    AttachWidget (parent, m_mainWidget, (WXWidget) NULL,
+                  rPos.x, rPos.y, rSize.x, rSize.y);
 
     ChangeBackgroundColour();
 
@@ -254,6 +256,8 @@ bool wxToolBar::Realize()
         return TRUE;
     }
 
+    bool isVertical = GetWindowStyle() & wxTB_VERTICAL;
+
     // Separator spacing
     const int separatorSize = GetToolSeparation(); // 8;
     wxSize margins = GetToolMargins();
@@ -264,7 +268,7 @@ bool wxToolBar::Realize()
     int currentX = marginX;
     int currentY = marginY;
 
-    int buttonHeight = 0;
+    int buttonHeight = 0, buttonWidth = 0;
 
     int currentSpacing = 0;
 
@@ -284,15 +288,23 @@ bool wxToolBar::Realize()
                 wxControl* control = tool->GetControl();
                 wxSize sz = control->GetSize();
                 wxPoint pos = control->GetPosition();
-                // Allow a control to specify a y-offset by setting its initial position,
-                // but still don't allow it to position itself above the top margin.
+                // Allow a control to specify a y[x]-offset by setting
+                // its initial position, but still don't allow it to
+                // position itself above the top[left] margin.
                 int controlY = (pos.y > 0) ? currentY + pos.y : currentY;
-                control->Move(currentX, controlY);
-                currentX += sz.x + packing;
+                int controlX = (pos.x > 0) ? currentX + pos.x : currentX;
+                control->Move( isVertical ? controlX : currentX,
+                               isVertical ? currentY : controlY );
+                if ( isVertical )
+                    currentY += sz.y + packing;
+                else
+                    currentX += sz.x + packing;
 
                 break;
             }
             case wxTOOL_STYLE_SEPARATOR:
+                 // skip separators for vertical toolbars
+                if( isVertical ) break;
                 currentX += separatorSize;
                 break;
 
@@ -351,7 +363,6 @@ bool wxToolBar::Realize()
 
                     wxColour col;
                     col.SetPixel(backgroundPixel);
-
                     bmp = wxCreateMaskedBitmap(bmp, col);
 
                     tool->SetNormalBitmap(bmp);
@@ -367,7 +378,6 @@ bool wxToolBar::Realize()
                 else
                     XtVaGetValues(button, XmNarmColor, &backgroundPixel,
                             NULL);
-
                 wxColour col;
                 col.SetPixel(backgroundPixel);
 
@@ -462,8 +472,12 @@ bool wxToolBar::Realize()
                                   XmNwidth, &width,
                                   XmNheight, & height,
                                   NULL);
-                    currentX += width + packing;
+                    if ( isVertical )
+                        currentY += height + packing;
+                    else
+                        currentX += width + packing;
                     buttonHeight = wxMax(buttonHeight, height);
+                    buttonWidth = wxMax(buttonWidth, width);
                 }
 
                 XtAddEventHandler (button, EnterWindowMask | LeaveWindowMask,
@@ -476,7 +490,9 @@ bool wxToolBar::Realize()
         node = node->GetNext();
     }
 
-    SetSize(-1, -1, currentX, buttonHeight + 2*marginY);
+    SetSize( -1, -1,
+             isVertical ? buttonWidth + 2 * marginX : currentX,
+             isVertical ? currentY : buttonHeight +  2*marginY );
 
     return TRUE;
 }
@@ -523,6 +539,39 @@ void wxToolBar::DoSetToggle(wxToolBarToolBase * WXUNUSED(tool),
     // nothing to do
 }
 
+void wxToolBar::DoSetSize(int x, int y, int width, int height, int sizeFlags)
+{
+    int old_width, old_height;
+    GetSize(&old_width, &old_height);
+
+    wxToolBarBase::DoSetSize(x, y, width, height, sizeFlags);
+    
+    // Correct width and height if needed.
+    if ( width == -1 || height == -1 )
+    {
+        int tmp_width, tmp_height;
+        GetSize(&tmp_width, &tmp_height);
+
+        if ( width == -1 )
+            width = tmp_width;
+        if ( height == -1 )
+            height = tmp_height;
+    }
+  
+    // We must refresh the frame size when the toolbar changes size
+    // otherwise the toolbar can be shown incorrectly
+    if ( old_width != width || old_height != height )
+    {
+        // But before we send the size event check it 
+        // we have a frame that is not being deleted.
+        wxFrame *frame = wxDynamicCast(GetParent(), wxFrame);
+        if ( frame && !frame->IsBeingDeleted() )
+        {
+            frame->SendSizeEvent();
+        }
+    }
+}
+
 // ----------------------------------------------------------------------------
 // Motif callbacks
 // ----------------------------------------------------------------------------