]> git.saurik.com Git - wxWidgets.git/blobdiff - src/motif/toolbar.cpp
Allow using windows that can't be focused with wxNavigationEnabled<>.
[wxWidgets.git] / src / motif / toolbar.cpp
index 2a75efa5b13dbab169ad2e3e486a3c4f7d8f9e08..c8ae30e002ce32112854879f8361e774315b2a32 100644 (file)
@@ -1,5 +1,5 @@
 /////////////////////////////////////////////////////////////////////////////
-// Name:        motif/toolbar.cpp
+// Name:        src/motif/toolbar.cpp
 // Purpose:     wxToolBar
 // Author:      Julian Smart
 // Modified by: 13.12.99 by VZ during toolbar classes reorganization
 // headers
 // ----------------------------------------------------------------------------
 
-#ifdef __GNUG__
-    #pragma implementation "toolbar.h"
-#endif
-
-#ifdef __VMS
-#define XtDisplay XTDISPLAY
-#endif
+// For compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
 
-#include "wx/settings.h"
-#include "wx/app.h"
-#include "wx/timer.h"
 #include "wx/toolbar.h"
-#include "wx/frame.h"
+
+#ifndef WX_PRECOMP
+    #include "wx/app.h"
+    #include "wx/frame.h"
+    #include "wx/timer.h"
+    #include "wx/settings.h"
+#endif
 
 #ifdef __VMS__
 #pragma message disable nosimpint
@@ -52,9 +50,7 @@
 // wxWin macros
 // ----------------------------------------------------------------------------
 
-#if !USE_SHARED_LIBRARY
-IMPLEMENT_DYNAMIC_CLASS(wxToolBar, wxToolBarBase)
-#endif
+IMPLEMENT_DYNAMIC_CLASS(wxToolBar, wxControl)
 
 // ----------------------------------------------------------------------------
 // private functions
@@ -97,8 +93,8 @@ public:
         Init();
     }
 
-    wxToolBarTool(wxToolBar *tbar, wxControl *control)
-        : wxToolBarToolBase(tbar, control)
+    wxToolBarTool(wxToolBar *tbar, wxControl *control, const wxString& label)
+        : wxToolBarToolBase(tbar, control, label)
     {
         Init();
     }
@@ -131,7 +127,7 @@ protected:
 // globals
 // ----------------------------------------------------------------------------
 
-static wxToolBarTimer* wxTheToolBarTimer = (wxToolBarTimer*) NULL;
+static wxToolBarTimer* wxTheToolBarTimer = NULL;
 
 Widget wxToolBarTimer::help_popup = (Widget) 0;
 Widget wxToolBarTimer::buttonWidget = (Widget) 0;
@@ -159,9 +155,10 @@ wxToolBarToolBase *wxToolBar::CreateTool(int id,
 }
 
 
-wxToolBarToolBase *wxToolBar::CreateTool(wxControl *control)
+wxToolBarToolBase *
+wxToolBar::CreateTool(wxControl *control, const wxString& label)
 {
-    return new wxToolBarTool(this, control);
+    return new wxToolBarTool(this, control, label);
 }
 
 void wxToolBarTool::Init()
@@ -202,9 +199,10 @@ bool wxToolBar::Create(wxWindow *parent,
 {
     if( !wxControl::CreateControl( parent, id, pos, size, style,
                                    wxDefaultValidator, name ) )
-        return FALSE;
+        return false;
+    PreCreation();
 
-    m_backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE);
+    FixupStyle();
 
     Widget parentWidget = (Widget) parent->GetClientWidget();
 
@@ -229,8 +227,6 @@ bool wxToolBar::Create(wxWindow *parent,
 
     m_mainWidget = (WXWidget) toolbar;
 
-    ChangeFont(FALSE);
-
     wxPoint rPos = pos;
     wxSize  rSize = size;
 
@@ -239,18 +235,16 @@ bool wxToolBar::Create(wxWindow *parent,
     if( rSize.x == -1 && GetParent() )
         rSize.x = GetParent()->GetSize().x;
 
+    PostCreation();
     AttachWidget (parent, m_mainWidget, (WXWidget) NULL,
                   rPos.x, rPos.y, rSize.x, rSize.y);
 
-    ChangeBackgroundColour();
-
-    return TRUE;
+    return true;
 }
 
 wxToolBar::~wxToolBar()
 {
-    delete wxTheToolBarTimer;
-    wxTheToolBarTimer = NULL;
+    wxDELETE(wxTheToolBarTimer);
 }
 
 bool wxToolBar::Realize()
@@ -258,7 +252,7 @@ bool wxToolBar::Realize()
     if ( m_tools.GetCount() == 0 )
     {
         // nothing to do
-        return TRUE;
+        return true;
     }
 
     bool isVertical = GetWindowStyle() & wxTB_VERTICAL;
@@ -275,8 +269,6 @@ bool wxToolBar::Realize()
 
     int buttonHeight = 0, buttonWidth = 0;
 
-    int currentSpacing = 0;
-
     Widget button;
     Pixmap pixmap, insensPixmap;
     wxBitmap bmp, insensBmp;
@@ -361,7 +353,7 @@ bool wxToolBar::Realize()
                 if( !tool->GetButtonWidget() )
                 {
                     wxDoChangeBackgroundColour((WXWidget) button,
-                                               m_backgroundColour, TRUE);
+                                               m_backgroundColour, true);
 
                     tool->SetWidget(button);
                 }
@@ -381,20 +373,20 @@ bool wxToolBar::Realize()
                 insensBmp = tool->GetDisabledBitmap();
                 if ( bmp.GetMask() || insensBmp.GetMask() )
                 {
-                    int backgroundPixel;
+                    WXPixel backgroundPixel;
                     XtVaGetValues(button, XmNbackground, &backgroundPixel,
                                   NULL);
 
                     wxColour col;
                     col.SetPixel(backgroundPixel);
 
-                    if( bmp.Ok() && bmp.GetMask() )
+                    if( bmp.IsOk() && bmp.GetMask() )
                     {
                         bmp = wxCreateMaskedBitmap(bmp, col);
                         tool->SetNormalBitmap(bmp);
                     }
 
-                    if( insensBmp.Ok() && insensBmp.GetMask() )
+                    if( insensBmp.IsOk() && insensBmp.GetMask() )
                     {
                         insensBmp = wxCreateMaskedBitmap(insensBmp, col);
                         tool->SetDisabledBitmap(insensBmp);
@@ -404,7 +396,7 @@ bool wxToolBar::Realize()
                 // Create a selected/toggled bitmap. If there isn't a 2nd
                 // bitmap, we need to create it (with a darker, selected
                 // background)
-                int backgroundPixel;
+                WXPixel backgroundPixel;
                 if ( tool->CanBeToggled() )
                     XtVaGetValues(button, XmNselectColor, &backgroundPixel,
                                   NULL);
@@ -418,11 +410,11 @@ bool wxToolBar::Realize()
                 {
                     wxBitmap tmp = tool->GetDisabledBitmap();
 
-                    insensPixmap = tmp.Ok() ?
+                    insensPixmap = tmp.IsOk() ?
                             (Pixmap)tmp.GetDrawable() :
                             tool->GetInsensPixmap();
                 }
-                
+
                 if (tool->CanBeToggled())
                 {
                     // Toggle button
@@ -469,7 +461,6 @@ bool wxToolBar::Realize()
                 XtAddEventHandler (button, EnterWindowMask | LeaveWindowMask,
                         False, wxToolButtonPopupCallback, (XtPointer) this);
 
-                currentSpacing = 0;
                 break;
         }
 
@@ -480,25 +471,25 @@ bool wxToolBar::Realize()
              isVertical ? buttonWidth + 2 * marginX : -1,
              isVertical ? -1 : buttonHeight +  2*marginY );
 
-    return TRUE;
+    return true;
 }
 
 wxToolBarToolBase *wxToolBar::FindToolForPosition(wxCoord WXUNUSED(x),
                                                   wxCoord WXUNUSED(y)) const
 {
-    wxFAIL_MSG( _T("TODO") );
+    wxFAIL_MSG( wxT("TODO") );
 
-    return (wxToolBarToolBase *)NULL;
+    return NULL;
 }
 
 bool wxToolBar::DoInsertTool(size_t WXUNUSED(pos), wxToolBarToolBase *tool)
 {
     tool->Attach(this);
 
-    return TRUE;
+    return true;
 }
 
-bool wxToolBar::DoDeleteTool(size_t pos, wxToolBarToolBase *tool)
+bool wxToolBar::DoDeleteTool(size_t WXUNUSED(pos), wxToolBarToolBase *tool)
 {
     tool->Detach();
 
@@ -522,7 +513,7 @@ bool wxToolBar::DoDeleteTool(size_t pos, wxToolBarToolBase *tool)
                 offset = isVertical ? size.y : size.x;
                 offset += packing;
                 break;
-            }       
+            }
             case wxTOOL_STYLE_SEPARATOR:
                 offset = isVertical ? 0 : separatorSize;
                 break;
@@ -548,14 +539,14 @@ bool wxToolBar::DoDeleteTool(size_t pos, wxToolBarToolBase *tool)
             {
             case wxTOOL_STYLE_CONTROL:
             {
-                wxPoint pos = t->GetControl()->GetPosition();
+                wxPoint location = t->GetControl()->GetPosition();
 
                 if( isVertical )
-                    pos.y -= offset;
+                    location.y -= offset;
                 else
-                    pos.x -= offset;
+                    location.x -= offset;
 
-                t->GetControl()->Move( pos );
+                t->GetControl()->Move( location );
                 break;
             }
             case wxTOOL_STYLE_SEPARATOR:
@@ -569,9 +560,9 @@ bool wxToolBar::DoDeleteTool(size_t pos, wxToolBarToolBase *tool)
                                NULL );
 
                 if( isVertical )
-                    y -= offset;
+                    y = (Dimension)(y - offset);
                 else
-                    x -= offset;
+                    x = (Dimension)(x - offset);
 
                 XtVaSetValues( t->GetButtonWidget(),
                                XmNx, x,
@@ -583,14 +574,18 @@ bool wxToolBar::DoDeleteTool(size_t pos, wxToolBarToolBase *tool)
         }
     }
 
-    return TRUE;
+    return true;
 }
 
 void wxToolBar::DoEnableTool(wxToolBarToolBase *toolBase, bool enable)
 {
     wxToolBarTool *tool = (wxToolBarTool *)toolBase;
-
-    XtSetSensitive(tool->GetButtonWidget(), (Boolean) enable);
+    if (tool->GetButtonWidget()){
+        XtSetSensitive(tool->GetButtonWidget(), (Boolean) enable);
+    } else if (wxTOOL_STYLE_CONTROL == tool->GetStyle()){
+        // Controls (such as wxChoice) do not have button widgets
+        tool->GetControl()->Enable(enable);
+    }
 }
 
 void wxToolBar::DoToggleTool(wxToolBarToolBase *toolBase, bool toggle)
@@ -623,12 +618,12 @@ void wxToolBar::DoSetSize(int x, int y, int width, int height, int sizeFlags)
     }
 
     wxToolBarBase::DoSetSize(x, y, width, height, sizeFlags);
-  
+
     // 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 
+        // 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() )
@@ -656,7 +651,7 @@ wxToolBarToolBase *wxToolBar::FindToolByWidget(WXWidget w) const
         node = node->GetNext();
     }
 
-    return (wxToolBarToolBase *)NULL;
+    return NULL;
 }
 
 static void wxToolButtonCallback(Widget w,
@@ -716,7 +711,7 @@ static void wxToolButtonPopupCallback(Widget w,
         wxToolBarTimer::help_popup = (Widget) 0;
 
         // One shot
-        wxTheToolBarTimer->Start(delayMilli, TRUE);
+        wxTheToolBarTimer->Start(delayMilli, true);
 
     }
     /************************************************************/
@@ -756,7 +751,7 @@ void wxToolBarTimer::Notify()
 
         // Move the tooltip more or less above the button
         int yOffset = 20; // TODO: What should be really?
-        y -= yOffset;
+        y = (Position)(y - yOffset);
         if (y < yOffset) y = 0;
 
         /************************************************************/
@@ -788,4 +783,3 @@ void wxToolBarTimer::Notify()
         /************************************************************/
         XtPopup (help_popup, XtGrabNone);
 }
-