]> git.saurik.com Git - wxWidgets.git/blobdiff - src/motif/toolbar.cpp
fixed crash under GTK+ 2.0
[wxWidgets.git] / src / motif / toolbar.cpp
index 56c79abbccfb43125054fd1be8b31b2a33599131..03f2e08a9e3f6cdbc8ada9fa4409b0174bf27d98 100644 (file)
     #pragma implementation "toolbar.h"
 #endif
 
+#ifdef __VMS
+#define XtDisplay XTDISPLAY
+#endif
+
 #include "wx/wx.h"
 #include "wx/app.h"
 #include "wx/timer.h"
@@ -47,7 +51,7 @@
 // ----------------------------------------------------------------------------
 
 #if !USE_SHARED_LIBRARY
-IMPLEMENT_DYNAMIC_CLASS(wxToolBar, wxControl)
+IMPLEMENT_DYNAMIC_CLASS(wxToolBar, wxToolBarBase)
 #endif
 
 // ----------------------------------------------------------------------------
@@ -78,14 +82,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();
     }
@@ -130,22 +135,23 @@ wxString wxToolBarTimer::helpString;
 // wxToolBarTool
 // ----------------------------------------------------------------------------
 
-wxToolBarToolBase *wxToolBarToolBase::New(wxToolBar *tbar,
-                                          int id,
-                                          const wxBitmap& bitmap1,
-                                          const wxBitmap& bitmap2,
-                                          bool toggle,
-                                          wxObject *clientData,
-                                          const wxString& shortHelpString,
-                                          const wxString& longHelpString)
+wxToolBarToolBase *wxToolBar::CreateTool(int id,
+                                         const wxString& label,
+                                         const wxBitmap& bmpNormal,
+                                         const wxBitmap& bmpToggled,
+                                         wxItemKind kind,
+                                         wxObject *clientData,
+                                         const wxString& shortHelp,
+                                         const wxString& longHelp)
 {
-    return new wxToolBarTool(tbar, id, bitmap1, bitmap2, toggle,
-                             clientData, shortHelpString, longHelpString);
+    return new wxToolBarTool(this, id, label, bmpNormal, bmpToggled, kind,
+                             clientData, shortHelp, longHelp);
 }
 
-wxToolBarToolBase *wxToolBarToolBase::New(wxToolBar *tbar, wxControl *control)
+
+wxToolBarToolBase *wxToolBar::CreateTool(wxControl *control)
 {
-    return new wxToolBarTool(tbar, control);
+    return new wxToolBarTool(this, control);
 }
 
 void wxToolBarTool::Init()
@@ -156,8 +162,11 @@ void wxToolBarTool::Init()
 
 wxToolBarTool::~wxToolBarTool()
 {
-    XtDestroyWidget(m_widget);
-    XmDestroyPixmap(DefaultScreenOfDisplay((Display*)wxGetDisplay()), m_pixmap);
+    if ( m_widget )
+        XtDestroyWidget(m_widget);
+    if ( m_pixmap )
+        XmDestroyPixmap(DefaultScreenOfDisplay((Display*)wxGetDisplay()),
+                        m_pixmap);
 }
 
 // ----------------------------------------------------------------------------
@@ -170,6 +179,12 @@ void wxToolBar::Init()
     m_maxHeight = -1;
     m_defaultWidth = 24;
     m_defaultHeight = 22;
+    m_toolPacking = 2;
+    m_toolSeparation = 8;
+    m_xMargin = 2;
+    m_yMargin = 2;
+    m_maxRows = 100;
+    m_maxCols = 100;
 }
 
 bool wxToolBar::Create(wxWindow *parent,
@@ -184,7 +199,7 @@ bool wxToolBar::Create(wxWindow *parent,
     m_windowId = id;
 
     SetName(name);
-    m_backgroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE);
+    m_backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE);
     m_foregroundColour = parent->GetForegroundColour();
     m_windowStyle = style;
 
@@ -243,6 +258,7 @@ bool wxToolBar::Realize()
     // Separator spacing
     const int separatorSize = GetToolSeparation(); // 8;
     wxSize margins = GetToolMargins();
+    int packing = GetToolPacking();
     int marginX = margins.x;
     int marginY = margins.y;
 
@@ -265,9 +281,15 @@ bool wxToolBar::Realize()
         switch ( tool->GetStyle() )
         {
             case wxTOOL_STYLE_CONTROL:
-                wxFAIL_MSG( _T("not implemented") );
-                break;
+            {
+                wxControl* control = tool->GetControl();
+                wxSize sz = control->GetSize();
+                wxPoint pos = control->GetPosition();
+                control->Move(currentX, pos.y);
+                currentX += sz.x + packing;
 
+                break;
+            }
             case wxTOOL_STYLE_SEPARATOR:
                 currentX += separatorSize;
                 break;
@@ -280,7 +302,12 @@ bool wxToolBar::Realize()
                     button = XtVaCreateWidget("toggleButton",
                             xmToggleButtonWidgetClass, (Widget) m_mainWidget,
                             XmNx, currentX, XmNy, currentY,
-                            //                   XmNpushButtonEnabled, True,
+                            XmNindicatorOn, False,
+                            XmNshadowThickness, 2,
+                            XmNborderWidth, 0,
+                            XmNspacing, 0,
+                            XmNmarginWidth, 0,
+                            XmNmarginHeight, 0,
                             XmNmultiClick, XmMULTICLICK_KEEP,
                             XmNlabelType, XmPIXMAP,
                             NULL);
@@ -313,7 +340,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;
@@ -323,9 +350,9 @@ bool wxToolBar::Realize()
                     wxColour col;
                     col.SetPixel(backgroundPixel);
 
-                    wxBitmap newBitmap = wxCreateMaskedBitmap(bmp, col);
+                    bmp = wxCreateMaskedBitmap(bmp, col);
 
-                    tool->SetBitmap1(newBitmap);
+                    tool->SetNormalBitmap(bmp);
                 }
 
                 // Create a selected/toggled bitmap. If there isn't a 2nd
@@ -342,11 +369,14 @@ bool wxToolBar::Realize()
                 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
                 {
@@ -354,12 +384,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();
 
@@ -371,11 +402,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
                     {
@@ -383,13 +415,9 @@ bool wxToolBar::Realize()
                         insensPixmap2 = XCreateInsensitivePixmap((Display*) wxGetDisplay(), pixmap2);
                     }
 
+                    tool->SetPixmap(pixmap2);
+
                     XtVaSetValues (button,
-                            XmNindicatorOn, False,
-                            XmNshadowThickness, 2,
-                            //                    XmNborderWidth, 0,
-                            //                    XmNspacing, 0,
-                            XmNmarginWidth, 0,
-                            XmNmarginHeight, 0,
                             XmNfillOnSelect, True,
                             XmNlabelPixmap, pixmap,
                             XmNselectPixmap, pixmap2,
@@ -404,15 +432,18 @@ 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
                     {
                         pixmap2 = (Pixmap) bmp.GetArmPixmap(button);
 
                     }
+
+                    tool->SetPixmap(pixmap2);
+
                     // Normal button
                     XtVaSetValues(button,
                             XmNlabelPixmap, pixmap,
@@ -420,6 +451,7 @@ bool wxToolBar::Realize()
                             XmNarmPixmap, pixmap2,
                             NULL);
                 }
+
                 XtManageChild(button);
 
                 {
@@ -428,7 +460,7 @@ bool wxToolBar::Realize()
                                   XmNwidth, &width,
                                   XmNheight, & height,
                                   NULL);
-                    currentX += width + marginX;
+                    currentX += width + packing;
                     buttonHeight = wxMax(buttonHeight, height);
                 }
 
@@ -447,48 +479,53 @@ bool wxToolBar::Realize()
     return TRUE;
 }
 
-wxToolBarTool *wxToolBar::FindToolForPosition(wxCoord WXUNUSED(x),
-                                              wxCoord WXUNUSED(y)) const
+wxToolBarToolBase *wxToolBar::FindToolForPosition(wxCoord WXUNUSED(x),
+                                                  wxCoord WXUNUSED(y)) const
 {
     wxFAIL_MSG( _T("TODO") );
 
-    return (wxToolBarTool *)NULL;
+    return (wxToolBarToolBase *)NULL;
 }
 
-bool wxToolBar::DoInsertTool(size_t WXUNUSED(pos), wxToolBarTool *tool)
+bool wxToolBar::DoInsertTool(size_t WXUNUSED(pos), wxToolBarToolBase *tool)
 {
     tool->Attach(this);
 
     return TRUE;
 }
 
-bool wxToolBar::DoDeleteTool(size_t WXUNUSED(pos), wxToolBarTool *tool)
+bool wxToolBar::DoDeleteTool(size_t WXUNUSED(pos), wxToolBarToolBase *tool)
 {
     tool->Detach();
 
     return TRUE;
 }
 
-void wxToolBar::DoEnableTool(wxToolBarTool *tool, bool enable)
+void wxToolBar::DoEnableTool(wxToolBarToolBase *toolBase, bool enable)
 {
+    wxToolBarTool *tool = (wxToolBarTool *)toolBase;
+
     XtSetSensitive(tool->GetButtonWidget(), (Boolean) enable);
 }
 
-void wxToolBar::DoToggleTool(wxToolBarTool *tool, bool toggle)
+void wxToolBar::DoToggleTool(wxToolBarToolBase *toolBase, bool toggle)
 {
+    wxToolBarTool *tool = (wxToolBarTool *)toolBase;
+
     XmToggleButtonSetState(tool->GetButtonWidget(), (Boolean) toggle, False);
 }
 
-void wxToolBar::DoSetToggle(wxToolBarTool *tool, bool toggle)
+void wxToolBar::DoSetToggle(wxToolBarToolBase * WXUNUSED(tool),
+                            bool WXUNUSED(toggle))
 {
-    wxFAIL_MSG( _T("TODO") );
+    // nothing to do
 }
 
 // ----------------------------------------------------------------------------
 // Motif callbacks
 // ----------------------------------------------------------------------------
 
-wxToolBarTool *wxToolBar::FindToolByWidget(WXWidget w) const
+wxToolBarToolBase *wxToolBar::FindToolByWidget(WXWidget w) const
 {
     wxToolBarToolsList::Node* node = m_tools.GetFirst();
     while ( node )
@@ -502,7 +539,7 @@ wxToolBarTool *wxToolBar::FindToolByWidget(WXWidget w) const
         node = node->GetNext();
     }
 
-    return (wxToolBarTool *)NULL;
+    return (wxToolBarToolBase *)NULL;
 }
 
 static void wxToolButtonCallback(Widget w,
@@ -510,7 +547,7 @@ static void wxToolButtonCallback(Widget w,
                                  XtPointer WXUNUSED(ptr))
 {
     wxToolBar *toolBar = (wxToolBar *) clientData;
-    wxToolBarTool *tool = toolBar->FindToolByWidget((WXWidget) w);
+    wxToolBarToolBase *tool = toolBar->FindToolByWidget((WXWidget) w);
     if ( !tool )
         return;
 
@@ -534,7 +571,7 @@ static void wxToolButtonPopupCallback(Widget w,
     static const int delayMilli = 800;
 
     wxToolBar* toolBar = (wxToolBar*) client_data;
-    wxToolBarTool *tool = toolBar->FindToolByWidget((WXWidget) w);
+    wxToolBarToolBase *tool = toolBar->FindToolByWidget((WXWidget) w);
 
     if ( !tool )
         return;