]> git.saurik.com Git - wxWidgets.git/blobdiff - src/motif/toolbar.cpp
use jast major.minor, not major.minor.micro, in the DLL names
[wxWidgets.git] / src / motif / toolbar.cpp
index 9a79f005ba8d06e89f7ee903536388319e68e3b8..c02fbac2444f56f43b1f19d40b33569fb3e6dd22 100644 (file)
     #pragma implementation "toolbar.h"
 #endif
 
-#include "wx/wx.h"
+#ifdef __VMS
+#define XtDisplay XTDISPLAY
+#endif
+
+#include "wx/settings.h"
 #include "wx/app.h"
 #include "wx/timer.h"
 #include "wx/toolbar.h"
+#include "wx/frame.h"
 
 #ifdef __VMS__
 #pragma message disable nosimpint
@@ -47,7 +52,7 @@
 // ----------------------------------------------------------------------------
 
 #if !USE_SHARED_LIBRARY
-IMPLEMENT_DYNAMIC_CLASS(wxToolBar, wxControl)
+IMPLEMENT_DYNAMIC_CLASS(wxToolBar, wxToolBarBase)
 #endif
 
 // ----------------------------------------------------------------------------
@@ -78,14 +83,15 @@ class wxToolBarTool : public wxToolBarToolBase
 public:
     wxToolBarTool(wxToolBar *tbar,
                   int id,
-                  const wxBitmap& bitmap1,
-                  const wxBitmap& bitmap2,
-                  bool toggle,
+                  const wxString& label,
+                  const wxBitmap& bmpNormal,
+                  const wxBitmap& bmpToggled,
+                  wxItemKind kind,
                   wxObject *clientData,
-                  const wxString& shortHelpString,
-                  const wxString& longHelpString)
-        : wxToolBarToolBase(tbar, id, bitmap1, bitmap2, toggle,
-                            clientData, shortHelpString, longHelpString)
+                  const wxString& shortHelp,
+                  const wxString& longHelp)
+        : wxToolBarToolBase(tbar, id, label, bmpNormal, bmpToggled, kind,
+                            clientData, shortHelp, longHelp)
     {
         Init();
     }
@@ -131,17 +137,19 @@ wxString wxToolBarTimer::helpString;
 // ----------------------------------------------------------------------------
 
 wxToolBarToolBase *wxToolBar::CreateTool(int id,
-                                         const wxBitmap& bitmap1,
-                                         const wxBitmap& bitmap2,
-                                         bool toggle,
+                                         const wxString& label,
+                                         const wxBitmap& bmpNormal,
+                                         const wxBitmap& bmpToggled,
+                                         wxItemKind kind,
                                          wxObject *clientData,
-                                         const wxString& shortHelpString,
-                                         const wxString& longHelpString)
+                                         const wxString& shortHelp,
+                                         const wxString& longHelp)
 {
-    return new wxToolBarTool(this, id, bitmap1, bitmap2, toggle,
-                             clientData, shortHelpString, longHelpString);
+    return new wxToolBarTool(this, id, label, bmpNormal, bmpToggled, kind,
+                             clientData, shortHelp, longHelp);
 }
 
+
 wxToolBarToolBase *wxToolBar::CreateTool(wxControl *control)
 {
     return new wxToolBarTool(this, control);
@@ -157,9 +165,8 @@ wxToolBarTool::~wxToolBarTool()
 {
     if ( m_widget )
         XtDestroyWidget(m_widget);
-    if ( m_pixmap )
-        XmDestroyPixmap(DefaultScreenOfDisplay((Display*)wxGetDisplay()),
-                        m_pixmap);
+    // note: do not delete m_pixmap here because it will be deleted
+    //       by the base class when the bitmap is destroyed.
 }
 
 // ----------------------------------------------------------------------------
@@ -187,18 +194,11 @@ bool wxToolBar::Create(wxWindow *parent,
                        long style,
                        const wxString& name)
 {
-    Init();
-
-    m_windowId = id;
+    if( !wxControl::CreateControl( parent, id, pos, size, style,
+                                   wxDefaultValidator, name ) )
+        return FALSE;
 
-    SetName(name);
-    m_backgroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE);
-    m_foregroundColour = parent->GetForegroundColour();
-    m_windowStyle = style;
-
-    SetParent(parent);
-
-    if (parent) parent->AddChild(this);
+    m_backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE);
 
     Widget parentWidget = (Widget) parent->GetClientWidget();
 
@@ -223,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();
 
@@ -248,17 +256,19 @@ bool wxToolBar::Realize()
         return TRUE;
     }
 
+    bool isVertical = GetWindowStyle() & wxTB_VERTICAL;
+
     // Separator spacing
     const int separatorSize = GetToolSeparation(); // 8;
     wxSize margins = GetToolMargins();
-    wxSize packing = GetToolPacking();
+    int packing = GetToolPacking();
     int marginX = margins.x;
     int marginY = margins.y;
 
     int currentX = marginX;
     int currentY = marginY;
 
-    int buttonHeight = 0;
+    int buttonHeight = 0, buttonWidth = 0;
 
     int currentSpacing = 0;
 
@@ -274,15 +284,27 @@ bool wxToolBar::Realize()
         switch ( tool->GetStyle() )
         {
             case wxTOOL_STYLE_CONTROL:
+            {
                 wxControl* control = tool->GetControl();
                 wxSize sz = control->GetSize();
-                wxSize pos = control->GetPosition();
-                control->Move(currentX, pos.y);
-                currentX += sz.x + packing.x;
+                wxPoint pos = control->GetPosition();
+                // 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;
+                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;
 
@@ -332,7 +354,7 @@ bool wxToolBar::Realize()
                 // a new wxBitmap that has the correct background colour
                 // for the button. Otherwise the background will just be
                 // e.g. black if a transparent XPM has been loaded.
-                bmp = tool->GetBitmap1();
+                bmp = tool->GetNormalBitmap();
                 if ( bmp.GetMask() )
                 {
                     int backgroundPixel;
@@ -341,10 +363,9 @@ bool wxToolBar::Realize()
 
                     wxColour col;
                     col.SetPixel(backgroundPixel);
-
                     bmp = wxCreateMaskedBitmap(bmp, col);
 
-                    tool->SetBitmap1(bmp);
+                    tool->SetNormalBitmap(bmp);
                 }
 
                 // Create a selected/toggled bitmap. If there isn't a 2nd
@@ -357,15 +378,17 @@ bool wxToolBar::Realize()
                 else
                     XtVaGetValues(button, XmNarmColor, &backgroundPixel,
                             NULL);
-
                 wxColour col;
                 col.SetPixel(backgroundPixel);
 
-                if (tool->GetBitmap2().Ok() && tool->GetBitmap2().GetMask())
+                // FIXME: we use disabled bitmap as the bitmap for the toggled
+                //        state, we probably need a GetToggledBitmap() instead
+                wxBitmap bmpToggled = tool->GetDisabledBitmap();
+                if ( bmpToggled.Ok() && bmpToggled.GetMask())
                 {
                     // Use what's there
-                    wxBitmap newBitmap = wxCreateMaskedBitmap(tool->GetBitmap2(), col);
-                    tool->SetBitmap2(newBitmap);
+                    wxBitmap newBitmap = wxCreateMaskedBitmap(bmpToggled, col);
+                    tool->SetDisabledBitmap(newBitmap);
                 }
                 else
                 {
@@ -373,12 +396,13 @@ bool wxToolBar::Realize()
                     if ( bmp.GetMask() )
                     {
                         wxBitmap newBitmap = wxCreateMaskedBitmap(bmp, col);
-                        tool->SetBitmap2(newBitmap);
+                        tool->SetDisabledBitmap(newBitmap);
                     }
                     else
-                        tool->SetBitmap2(bmp);
+                        tool->SetDisabledBitmap(bmp);
                 }
 
+                // FIXME: and here we should use GetDisabledBitmap()...
                 pixmap = (Pixmap) bmp.GetPixmap();
                 insensPixmap = (Pixmap) bmp.GetInsensPixmap();
 
@@ -390,11 +414,12 @@ bool wxToolBar::Realize()
 
                     // If there's a bitmap for the toggled state, use it,
                     // otherwise generate one.
-                    if (tool->GetBitmap2().Ok())
+                    //
+                    // FIXME: see above
+                    if ( bmpToggled.Ok() )
                     {
-                        wxBitmap bmp2 = tool->GetBitmap2();
-                        pixmap2 = (Pixmap) bmp2.GetPixmap();
-                        insensPixmap2 = (Pixmap) bmp2.GetInsensPixmap();
+                        pixmap2 = (Pixmap) bmpToggled.GetPixmap();
+                        insensPixmap2 = (Pixmap) bmpToggled.GetInsensPixmap();
                     }
                     else
                     {
@@ -419,9 +444,9 @@ bool wxToolBar::Realize()
 
                     // If there's a bitmap for the armed state, use it,
                     // otherwise generate one.
-                    if (tool->GetBitmap2().Ok())
+                    if ( bmpToggled.Ok() )
                     {
-                        pixmap2 = (Pixmap) tool->GetBitmap2().GetPixmap();
+                        pixmap2 = (Pixmap) bmpToggled.GetPixmap();
                     }
                     else
                     {
@@ -447,8 +472,12 @@ bool wxToolBar::Realize()
                                   XmNwidth, &width,
                                   XmNheight, & height,
                                   NULL);
-                    currentX += width + packing.x;
+                    if ( isVertical )
+                        currentY += height + packing;
+                    else
+                        currentX += width + packing;
                     buttonHeight = wxMax(buttonHeight, height);
+                    buttonWidth = wxMax(buttonWidth, width);
                 }
 
                 XtAddEventHandler (button, EnterWindowMask | LeaveWindowMask,
@@ -461,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;
 }
@@ -508,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
 // ----------------------------------------------------------------------------