/////////////////////////////////////////////////////////////////////////////
-// Name: toolbar.cpp
+// Name: motif/toolbar.cpp
// Purpose: wxToolBar
// Author: Julian Smart
-// Modified by:
+// Modified by: 13.12.99 by VZ during toolbar classes reorganization
// Created: 04/01/98
// RCS-ID: $Id$
// Copyright: (c) Julian Smart
-// Licence: wxWindows licence
+// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
+// ============================================================================
+// declarations
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// headers
+// ----------------------------------------------------------------------------
+
#ifdef __GNUG__
-#pragma implementation "toolbar.h"
+ #pragma implementation "toolbar.h"
+#endif
+
+#ifdef __VMS
+#define XtDisplay XTDISPLAY
#endif
#include "wx/wx.h"
#include "wx/app.h"
#include "wx/timer.h"
-#include "wx/motif/toolbar.h"
+#include "wx/toolbar.h"
+#ifdef __VMS__
+#pragma message disable nosimpint
+#endif
#include <Xm/Xm.h>
#include <Xm/PushBG.h>
#include <Xm/PushB.h>
#include <Xm/ToggleB.h>
#include <Xm/ToggleBG.h>
#include <Xm/Form.h>
+#ifdef __VMS__
+#pragma message enable nosimpint
+#endif
#include "wx/motif/private.h"
+// ----------------------------------------------------------------------------
+// wxWin macros
+// ----------------------------------------------------------------------------
+
#if !USE_SHARED_LIBRARY
IMPLEMENT_DYNAMIC_CLASS(wxToolBar, wxToolBarBase)
-
-BEGIN_EVENT_TABLE(wxToolBar, wxToolBarBase)
-END_EVENT_TABLE()
#endif
+// ----------------------------------------------------------------------------
+// private functions
+// ----------------------------------------------------------------------------
+
static void wxToolButtonCallback (Widget w, XtPointer clientData,
- XtPointer ptr);
+ XtPointer ptr);
static void wxToolButtonPopupCallback (Widget w, XtPointer client_data,
XEvent *event, Boolean *continue_to_dispatch);
-class wxToolBarTimer: public wxTimer
+// ----------------------------------------------------------------------------
+// private classes
+// ----------------------------------------------------------------------------
+
+class wxToolBarTimer : public wxTimer
{
public:
- wxToolBarTimer() { }
- virtual void Notify();
+ virtual void Notify();
+
+ static Widget help_popup;
+ static Widget buttonWidget;
+ static wxString helpString;
+};
+
+class wxToolBarTool : public wxToolBarToolBase
+{
+public:
+ wxToolBarTool(wxToolBar *tbar,
+ int id,
+ const wxString& label,
+ const wxBitmap& bmpNormal,
+ const wxBitmap& bmpToggled,
+ wxItemKind kind,
+ wxObject *clientData,
+ const wxString& shortHelp,
+ const wxString& longHelp)
+ : wxToolBarToolBase(tbar, id, label, bmpNormal, bmpToggled, kind,
+ clientData, shortHelp, longHelp)
+ {
+ Init();
+ }
+
+ wxToolBarTool(wxToolBar *tbar, wxControl *control)
+ : wxToolBarToolBase(tbar, control)
+ {
+ Init();
+ }
+
+ virtual ~wxToolBarTool();
+
+ // accessors
+ void SetWidget(Widget widget) { m_widget = widget; }
+ Widget GetButtonWidget() const { return m_widget; }
+
+ void SetPixmap(Pixmap pixmap) { m_pixmap = pixmap; }
+ Pixmap GetPixmap() const { return m_pixmap; }
- static Widget help_popup;
- static Widget buttonWidget;
- static wxString helpString;
+protected:
+ void Init();
+
+ Widget m_widget;
+ Pixmap m_pixmap;
};
+// ----------------------------------------------------------------------------
+// globals
+// ----------------------------------------------------------------------------
+
static wxToolBarTimer* wxTheToolBarTimer = (wxToolBarTimer*) NULL;
Widget wxToolBarTimer::help_popup = (Widget) 0;
Widget wxToolBarTimer::buttonWidget = (Widget) 0;
-wxString wxToolBarTimer::helpString = "";
+wxString wxToolBarTimer::helpString;
+
+// ============================================================================
+// implementation
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// wxToolBarTool
+// ----------------------------------------------------------------------------
+
+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(this, id, label, bmpNormal, bmpToggled, kind,
+ clientData, shortHelp, longHelp);
+}
+
+
+wxToolBarToolBase *wxToolBar::CreateTool(wxControl *control)
+{
+ return new wxToolBarTool(this, control);
+}
+
+void wxToolBarTool::Init()
+{
+ m_widget = (Widget)0;
+ m_pixmap = (Pixmap)0;
+}
-wxToolBar::wxToolBar():
- m_widgets(wxKEY_INTEGER)
+wxToolBarTool::~wxToolBarTool()
{
- m_maxWidth = -1;
- m_maxHeight = -1;
- m_defaultWidth = 24;
- m_defaultHeight = 22;
+ if ( m_widget )
+ XtDestroyWidget(m_widget);
+ if ( m_pixmap )
+ XmDestroyPixmap(DefaultScreenOfDisplay((Display*)wxGetDisplay()),
+ m_pixmap);
}
-bool wxToolBar::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size,
- long style, const wxString& name)
+// ----------------------------------------------------------------------------
+// wxToolBar construction
+// ----------------------------------------------------------------------------
+
+void wxToolBar::Init()
{
m_maxWidth = -1;
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,
+ wxWindowID id,
+ const wxPoint& pos,
+ const wxSize& size,
+ long style,
+ const wxString& name)
+{
+ Init();
+
+ 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;
m_mainWidget = (WXWidget) toolbar;
- m_windowFont = parent->GetFont();
+ m_font = parent->GetFont();
ChangeFont(FALSE);
SetCanAddEventHandler(TRUE);
AttachWidget (parent, m_mainWidget, (WXWidget) NULL, pos.x, pos.y, size.x, size.y);
ChangeBackgroundColour();
-
+
return TRUE;
}
{
delete wxTheToolBarTimer;
wxTheToolBarTimer = NULL;
- ClearTools();
- DestroyPixmaps();
}
-bool wxToolBar::CreateTools()
+bool wxToolBar::Realize()
{
- if (m_tools.Number() == 0)
- return FALSE;
+ if ( m_tools.GetCount() == 0 )
+ {
+ // nothing to do
+ return TRUE;
+ }
// Separator spacing
const int separatorSize = GetToolSeparation(); // 8;
wxSize margins = GetToolMargins();
+ int packing = GetToolPacking();
int marginX = margins.x;
int marginY = margins.y;
int currentSpacing = 0;
- m_widgets.Clear();
- Widget prevButton = (Widget) 0;
- wxNode* node = m_tools.First();
- while (node)
+ Widget button;
+ Pixmap pixmap, insensPixmap;
+ wxBitmap bmp;
+
+ wxToolBarToolsList::Node *node = m_tools.GetFirst();
+ while ( node )
{
- wxToolBarTool *tool = (wxToolBarTool *)node->Data();
+ wxToolBarTool *tool = (wxToolBarTool *)node->GetData();
- if (tool->m_toolStyle == wxTOOL_STYLE_SEPARATOR)
- currentX += separatorSize;
- else if (tool->m_bitmap1.Ok())
+ switch ( tool->GetStyle() )
{
- Widget button = (Widget) 0;
-
- if (tool->m_isToggle)
+ case wxTOOL_STYLE_CONTROL:
{
- button = XtVaCreateWidget("toggleButton",
- xmToggleButtonWidgetClass, (Widget) m_mainWidget,
- XmNx, currentX, XmNy, currentY,
- // XmNpushButtonEnabled, True,
- XmNmultiClick, XmMULTICLICK_KEEP,
- XmNlabelType, XmPIXMAP,
- NULL);
- XtAddCallback ((Widget) button, XmNvalueChangedCallback, (XtCallbackProc) wxToolButtonCallback,
- (XtPointer) this);
- }
- else
- {
- button = XtVaCreateWidget("button",
- xmPushButtonWidgetClass, (Widget) m_mainWidget,
- XmNx, currentX, XmNy, currentY,
- XmNpushButtonEnabled, True,
- XmNmultiClick, XmMULTICLICK_KEEP,
- XmNlabelType, XmPIXMAP,
- NULL);
- XtAddCallback (button,
- XmNactivateCallback, (XtCallbackProc) wxToolButtonCallback,
- (XtPointer) this);
- }
-
- DoChangeBackgroundColour((WXWidget) button, m_backgroundColour, TRUE);
-
- // For each button, if there is a mask, we must create
- // 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.
- wxBitmap originalBitmap = tool->m_bitmap1;
-
- if (tool->m_bitmap1.GetMask())
- {
- int backgroundPixel;
- XtVaGetValues(button, XmNbackground, &backgroundPixel,
- NULL);
-
-
- wxColour col;
- col.SetPixel(backgroundPixel);
-
- wxBitmap newBitmap = wxCreateMaskedBitmap(tool->m_bitmap1, col);
-
- tool->m_bitmap1 = newBitmap;
+ 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.
+ int controlY = (pos.y > 0) ? currentY + pos.y : currentY;
+ control->Move(currentX, controlY);
+ currentX += sz.x + packing;
+
+ break;
}
+ case wxTOOL_STYLE_SEPARATOR:
+ currentX += separatorSize;
+ break;
- // Create a selected/toggled bitmap. If there isn't a m_bitmap2,
- // we need to create it (with a darker, selected background)
- int backgroundPixel;
- if (tool->m_isToggle)
- XtVaGetValues(button, XmNselectColor, &backgroundPixel,
- NULL);
- else
- XtVaGetValues(button, XmNarmColor, &backgroundPixel,
- NULL);
-
- wxColour col;
- col.SetPixel(backgroundPixel);
-
- if (tool->m_bitmap2.Ok() && tool->m_bitmap2.GetMask())
- {
- // Use what's there
- wxBitmap newBitmap = wxCreateMaskedBitmap(tool->m_bitmap2, col);
- tool->m_bitmap2 = newBitmap;
- }
- else
- {
- // Use unselected bitmap
- if (originalBitmap.GetMask())
- {
- wxBitmap newBitmap = wxCreateMaskedBitmap(originalBitmap, col);
- tool->m_bitmap2 = newBitmap;
- }
- else
- tool->m_bitmap2 = tool->m_bitmap1;
- }
-
- Pixmap pixmap = (Pixmap) tool->m_bitmap1.GetPixmap();
- Pixmap insensPixmap = (Pixmap) tool->m_bitmap1.GetInsensPixmap();
-
- if (tool->m_isToggle)
- {
- // Toggle button
- Pixmap pixmap2 = (Pixmap) 0;
- Pixmap insensPixmap2 = (Pixmap) 0;
+ case wxTOOL_STYLE_BUTTON:
+ button = (Widget) 0;
- // If there's a bitmap for the toggled state, use it,
- // otherwise generate one.
- if (tool->m_bitmap2.Ok())
+ if ( tool->CanBeToggled() )
{
- pixmap2 = (Pixmap) tool->m_bitmap2.GetPixmap();
- insensPixmap2 = (Pixmap) tool->m_bitmap2.GetInsensPixmap();
+ button = XtVaCreateWidget("toggleButton",
+ xmToggleButtonWidgetClass, (Widget) m_mainWidget,
+ XmNx, currentX, XmNy, currentY,
+ XmNindicatorOn, False,
+ XmNshadowThickness, 2,
+ XmNborderWidth, 0,
+ XmNspacing, 0,
+ XmNmarginWidth, 0,
+ XmNmarginHeight, 0,
+ XmNmultiClick, XmMULTICLICK_KEEP,
+ XmNlabelType, XmPIXMAP,
+ NULL);
+ XtAddCallback ((Widget) button, XmNvalueChangedCallback, (XtCallbackProc) wxToolButtonCallback,
+ (XtPointer) this);
+
+ XtVaSetValues ((Widget) button,
+ XmNselectColor, m_backgroundColour.AllocColour(XtDisplay((Widget) button)),
+ NULL);
}
else
{
- pixmap2 = (Pixmap) tool->m_bitmap1.GetArmPixmap(button);
- insensPixmap2 = XCreateInsensitivePixmap((Display*) wxGetDisplay(), pixmap2);
- m_pixmaps.Append((wxObject*) insensPixmap2); // Store for later deletion
+ button = XtVaCreateWidget("button",
+ xmPushButtonWidgetClass, (Widget) m_mainWidget,
+ XmNx, currentX, XmNy, currentY,
+ XmNpushButtonEnabled, True,
+ XmNmultiClick, XmMULTICLICK_KEEP,
+ XmNlabelType, XmPIXMAP,
+ NULL);
+ XtAddCallback (button,
+ XmNactivateCallback, (XtCallbackProc) wxToolButtonCallback,
+ (XtPointer) this);
}
- XtVaSetValues (button,
- XmNindicatorOn, False,
- XmNshadowThickness, 2,
- // XmNborderWidth, 0,
- // XmNspacing, 0,
- XmNmarginWidth, 0,
- XmNmarginHeight, 0,
- XmNfillOnSelect, True,
- XmNlabelPixmap, pixmap,
- XmNselectPixmap, pixmap2,
- XmNlabelInsensitivePixmap, insensPixmap,
- XmNselectInsensitivePixmap, insensPixmap2,
- XmNlabelType, XmPIXMAP,
- NULL);
- }
- else
- {
- Pixmap pixmap2 = (Pixmap) 0;
-
- // If there's a bitmap for the armed state, use it,
- // otherwise generate one.
- if (tool->m_bitmap2.Ok())
- {
- pixmap2 = (Pixmap) tool->m_bitmap2.GetPixmap();
- }
- else
- {
- pixmap2 = (Pixmap) tool->m_bitmap1.GetArmPixmap(button);
-
- }
- // Normal button
- XtVaSetValues(button,
- XmNlabelPixmap, pixmap,
- XmNlabelInsensitivePixmap, insensPixmap,
- XmNarmPixmap, pixmap2,
- NULL);
- }
- XtManageChild(button);
-
- Dimension width, height;
- XtVaGetValues(button, XmNwidth, & width, XmNheight, & height,
- NULL);
- currentX += width + marginX;
- buttonHeight = wxMax(buttonHeight, height);
-
- XtAddEventHandler (button, EnterWindowMask | LeaveWindowMask,
- False, wxToolButtonPopupCallback, (XtPointer) this);
- m_widgets.Append(tool->m_index, (wxObject*) button);
-
- prevButton = button;
- currentSpacing = 0;
- }
- node = node->Next();
- }
-
- SetSize(-1, -1, currentX, buttonHeight + 2*marginY);
-
- return TRUE;
-}
-
-// Old version, assuming we use a form. Now we use
-// a bulletin board, so we can create controls on the toolbar.
-#if 0
-bool wxToolBar::CreateTools()
-{
- if (m_tools.Number() == 0)
- return FALSE;
- // Separator spacing
- const int separatorSize = GetToolSeparation(); // 8;
+ DoChangeBackgroundColour((WXWidget) button, m_backgroundColour, TRUE);
- int currentSpacing = 0;
+ tool->SetWidget(button);
- m_widgets.Clear();
- Widget prevButton = (Widget) 0;
- wxNode* node = m_tools.First();
- while (node)
- {
- wxToolBarTool *tool = (wxToolBarTool *)node->Data();
+ // For each button, if there is a mask, we must create
+ // 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->GetNormalBitmap();
+ if ( bmp.GetMask() )
+ {
+ int backgroundPixel;
+ XtVaGetValues(button, XmNbackground, &backgroundPixel,
+ NULL);
- if (tool->m_toolStyle == wxTOOL_STYLE_SEPARATOR)
- currentSpacing = separatorSize;
- else if (tool->m_bitmap1.Ok())
- {
- Widget button = (Widget) 0;
+ wxColour col;
+ col.SetPixel(backgroundPixel);
- if (tool->m_isToggle)
- {
- button = XtVaCreateManagedWidget("toggleButton",
- xmToggleButtonWidgetClass, (Widget) m_mainWidget,
- XmNleftAttachment, (prevButton == (Widget) 0) ? XmATTACH_FORM : XmATTACH_WIDGET,
- XmNleftWidget, (prevButton == (Widget) 0) ? NULL : prevButton,
- XmNleftOffset, currentSpacing,
- XmNtopAttachment, XmATTACH_FORM,
- // XmNpushButtonEnabled, True,
- XmNmultiClick, XmMULTICLICK_KEEP,
- XmNlabelType, XmPIXMAP,
- NULL);
- XtAddCallback ((Widget) button, XmNvalueChangedCallback, (XtCallbackProc) wxToolButtonCallback,
- (XtPointer) this);
- }
- else
- {
- button = XtVaCreateManagedWidget("button",
- xmPushButtonWidgetClass, (Widget) m_mainWidget,
- XmNleftAttachment, (prevButton == (Widget) 0) ? XmATTACH_FORM : XmATTACH_WIDGET,
- XmNleftWidget, (prevButton == (Widget) 0) ? NULL : prevButton,
- XmNleftOffset, currentSpacing,
- XmNtopAttachment, XmATTACH_FORM,
- XmNpushButtonEnabled, True,
- XmNmultiClick, XmMULTICLICK_KEEP,
- XmNlabelType, XmPIXMAP,
- NULL);
- XtAddCallback (button,
- XmNactivateCallback, (XtCallbackProc) wxToolButtonCallback,
- (XtPointer) this);
- }
+ bmp = wxCreateMaskedBitmap(bmp, col);
- // For each button, if there is a mask, we must create
- // 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.
- wxBitmap originalBitmap = tool->m_bitmap1;
+ tool->SetNormalBitmap(bmp);
+ }
- if (tool->m_bitmap1.GetMask())
- {
+ // Create a selected/toggled bitmap. If there isn't a 2nd
+ // bitmap, we need to create it (with a darker, selected
+ // background)
int backgroundPixel;
- XtVaGetValues(button, XmNbackground, &backgroundPixel,
- NULL);
-
+ if ( tool->CanBeToggled() )
+ XtVaGetValues(button, XmNselectColor, &backgroundPixel,
+ NULL);
+ else
+ XtVaGetValues(button, XmNarmColor, &backgroundPixel,
+ NULL);
wxColour col;
col.SetPixel(backgroundPixel);
-
- wxBitmap newBitmap = wxCreateMaskedBitmap(tool->m_bitmap1, col);
-
- tool->m_bitmap1 = newBitmap;
- }
-
- // Create a selected/toggled bitmap. If there isn't a m_bitmap2,
- // we need to create it (with a darker, selected background)
- int backgroundPixel;
- if (tool->m_isToggle)
- XtVaGetValues(button, XmNselectColor, &backgroundPixel,
- NULL);
- else
- XtVaGetValues(button, XmNarmColor, &backgroundPixel,
- NULL);
-
- wxColour col;
- col.SetPixel(backgroundPixel);
-
- if (tool->m_bitmap2.Ok() && tool->m_bitmap2.GetMask())
- {
- // Use what's there
- wxBitmap newBitmap = wxCreateMaskedBitmap(tool->m_bitmap2, col);
- tool->m_bitmap2 = newBitmap;
- }
- else
- {
- // Use unselected bitmap
- if (originalBitmap.GetMask())
- {
- wxBitmap newBitmap = wxCreateMaskedBitmap(originalBitmap, col);
- tool->m_bitmap2 = newBitmap;
- }
- else
- tool->m_bitmap2 = tool->m_bitmap1;
- }
-
- Pixmap pixmap = (Pixmap) tool->m_bitmap1.GetPixmap();
- Pixmap insensPixmap = (Pixmap) tool->m_bitmap1.GetInsensPixmap();
-
- if (tool->m_isToggle)
- {
- // Toggle button
- Pixmap pixmap2 = (Pixmap) 0;
- Pixmap insensPixmap2 = (Pixmap) 0;
- // If there's a bitmap for the toggled state, use it,
- // otherwise generate one.
- if (tool->m_bitmap2.Ok())
+ // 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())
{
- pixmap2 = (Pixmap) tool->m_bitmap2.GetPixmap();
- insensPixmap2 = (Pixmap) tool->m_bitmap2.GetInsensPixmap();
+ // Use what's there
+ wxBitmap newBitmap = wxCreateMaskedBitmap(bmpToggled, col);
+ tool->SetDisabledBitmap(newBitmap);
}
else
{
- pixmap2 = (Pixmap) tool->m_bitmap1.GetArmPixmap(button);
- insensPixmap2 = XCreateInsensitivePixmap((Display*) wxGetDisplay(), pixmap2);
- m_pixmaps.Append((wxObject*) insensPixmap2); // Store for later deletion
+ // Use unselected bitmap
+ if ( bmp.GetMask() )
+ {
+ wxBitmap newBitmap = wxCreateMaskedBitmap(bmp, col);
+ tool->SetDisabledBitmap(newBitmap);
+ }
+ else
+ tool->SetDisabledBitmap(bmp);
}
- XtVaSetValues (button,
- XmNindicatorOn, False,
- XmNshadowThickness, 2,
- // XmNborderWidth, 0,
- // XmNspacing, 0,
- XmNmarginWidth, 0,
- XmNmarginHeight, 0,
- XmNfillOnSelect, True,
- XmNlabelPixmap, pixmap,
- XmNselectPixmap, pixmap2,
- XmNlabelInsensitivePixmap, insensPixmap,
- XmNselectInsensitivePixmap, insensPixmap2,
- XmNlabelType, XmPIXMAP,
- NULL);
- }
- else
- {
- Pixmap pixmap2 = (Pixmap) 0;
- // If there's a bitmap for the armed state, use it,
- // otherwise generate one.
- if (tool->m_bitmap2.Ok())
+ // FIXME: and here we should use GetDisabledBitmap()...
+ pixmap = (Pixmap) bmp.GetPixmap();
+ insensPixmap = (Pixmap) bmp.GetInsensPixmap();
+
+ if (tool->CanBeToggled())
{
- pixmap2 = (Pixmap) tool->m_bitmap2.GetPixmap();
+ // Toggle button
+ Pixmap pixmap2 = (Pixmap) 0;
+ Pixmap insensPixmap2 = (Pixmap) 0;
+
+ // If there's a bitmap for the toggled state, use it,
+ // otherwise generate one.
+ //
+ // FIXME: see above
+ if ( bmpToggled.Ok() )
+ {
+ pixmap2 = (Pixmap) bmpToggled.GetPixmap();
+ insensPixmap2 = (Pixmap) bmpToggled.GetInsensPixmap();
+ }
+ else
+ {
+ pixmap2 = (Pixmap) bmp.GetArmPixmap(button);
+ insensPixmap2 = XCreateInsensitivePixmap((Display*) wxGetDisplay(), pixmap2);
+ }
+
+ tool->SetPixmap(pixmap2);
+
+ XtVaSetValues (button,
+ XmNfillOnSelect, True,
+ XmNlabelPixmap, pixmap,
+ XmNselectPixmap, pixmap2,
+ XmNlabelInsensitivePixmap, insensPixmap,
+ XmNselectInsensitivePixmap, insensPixmap2,
+ XmNlabelType, XmPIXMAP,
+ NULL);
}
else
{
- pixmap2 = (Pixmap) tool->m_bitmap1.GetArmPixmap(button);
+ Pixmap pixmap2 = (Pixmap) 0;
+
+ // If there's a bitmap for the armed state, use it,
+ // otherwise generate one.
+ if ( bmpToggled.Ok() )
+ {
+ pixmap2 = (Pixmap) bmpToggled.GetPixmap();
+ }
+ else
+ {
+ pixmap2 = (Pixmap) bmp.GetArmPixmap(button);
+
+ }
+
+ tool->SetPixmap(pixmap2);
+
+ // Normal button
+ XtVaSetValues(button,
+ XmNlabelPixmap, pixmap,
+ XmNlabelInsensitivePixmap, insensPixmap,
+ XmNarmPixmap, pixmap2,
+ NULL);
+ }
+
+ XtManageChild(button);
+ {
+ Dimension width, height;
+ XtVaGetValues(button,
+ XmNwidth, &width,
+ XmNheight, & height,
+ NULL);
+ currentX += width + packing;
+ buttonHeight = wxMax(buttonHeight, height);
}
- // Normal button
- XtVaSetValues(button,
- XmNlabelPixmap, pixmap,
- XmNlabelInsensitivePixmap, insensPixmap,
- XmNarmPixmap, pixmap2,
- NULL);
- }
- XtAddEventHandler (button, EnterWindowMask | LeaveWindowMask,
- False, wxToolButtonPopupCallback, (XtPointer) this);
- m_widgets.Append(tool->m_index, (wxObject*) button);
+ XtAddEventHandler (button, EnterWindowMask | LeaveWindowMask,
+ False, wxToolButtonPopupCallback, (XtPointer) this);
- prevButton = button;
- currentSpacing = 0;
+ currentSpacing = 0;
+ break;
}
- node = node->Next();
+
+ node = node->GetNext();
}
- return TRUE;
-}
-#endif
+ SetSize(-1, -1, currentX, buttonHeight + 2*marginY);
-void wxToolBar::SetToolBitmapSize(const wxSize& size)
-{
- // TODO not necessary?
- m_defaultWidth = size.x; m_defaultHeight = size.y;
+ return TRUE;
}
-wxSize wxToolBar::GetMaxSize() const
+wxToolBarToolBase *wxToolBar::FindToolForPosition(wxCoord WXUNUSED(x),
+ wxCoord WXUNUSED(y)) const
{
- int w, h;
- GetSize(& w, & h);
+ wxFAIL_MSG( _T("TODO") );
- return wxSize(w, h);
+ return (wxToolBarToolBase *)NULL;
}
-// The button size is bigger than the bitmap size
-wxSize wxToolBar::GetToolSize() const
+bool wxToolBar::DoInsertTool(size_t WXUNUSED(pos), wxToolBarToolBase *tool)
{
- // TODO not necessary?
- return wxSize(m_defaultWidth + 8, m_defaultHeight + 7);
-}
+ tool->Attach(this);
-void wxToolBar::EnableTool(int toolIndex, bool enable)
-{
- wxNode *node = m_tools.Find((long)toolIndex);
- if (node)
- {
- wxToolBarTool *tool = (wxToolBarTool *)node->Data();
- tool->m_enabled = enable;
-
- WXWidget widget = FindWidgetForIndex(tool->m_index);
- if (widget == (WXWidget) 0)
- return;
-
- XtSetSensitive((Widget) widget, (Boolean) enable);
- }
+ return TRUE;
}
-void wxToolBar::ToggleTool(int toolIndex, bool toggle)
+bool wxToolBar::DoDeleteTool(size_t WXUNUSED(pos), wxToolBarToolBase *tool)
{
- wxNode *node = m_tools.Find((long)toolIndex);
- if (node)
- {
- wxToolBarTool *tool = (wxToolBarTool *)node->Data();
- if (tool->m_isToggle)
- {
- tool->m_toggleState = toggle;
-
- WXWidget widget = FindWidgetForIndex(tool->m_index);
- if (widget == (WXWidget) 0)
- return;
+ tool->Detach();
- XmToggleButtonSetState((Widget) widget, (Boolean) toggle, False);
- }
- }
+ return TRUE;
}
-void wxToolBar::ClearTools()
+void wxToolBar::DoEnableTool(wxToolBarToolBase *toolBase, bool enable)
{
- wxNode* node = m_widgets.First();
- while (node)
- {
- Widget button = (Widget) node->Data();
- XtDestroyWidget(button);
- node = node->Next();
- }
- m_widgets.Clear();
- DestroyPixmaps();
+ wxToolBarTool *tool = (wxToolBarTool *)toolBase;
- wxToolBarBase::ClearTools();
+ XtSetSensitive(tool->GetButtonWidget(), (Boolean) enable);
}
-void wxToolBar::DestroyPixmaps()
+void wxToolBar::DoToggleTool(wxToolBarToolBase *toolBase, bool toggle)
{
- wxNode* node = m_pixmaps.First();
- while (node)
- {
- Pixmap pixmap = (Pixmap) node->Data();
- XmDestroyPixmap (DefaultScreenOfDisplay ((Display*) GetXDisplay()), pixmap);
- node = node->Next();
- }
- m_pixmaps.Clear();
-}
-
-// If pushedBitmap is NULL, a reversed version of bitmap is
-// created and used as the pushed/toggled image.
-// If toggle is TRUE, the button toggles between the two states.
+ wxToolBarTool *tool = (wxToolBarTool *)toolBase;
-wxToolBarTool *wxToolBar::AddTool(int index, const wxBitmap& bitmap, const wxBitmap& pushedBitmap,
- bool toggle, long xPos, long yPos, wxObject *clientData, const wxString& helpString1, const wxString& helpString2)
-{
- wxToolBarTool *tool = new wxToolBarTool(index, bitmap, wxNullBitmap, toggle, xPos, yPos, helpString1, helpString2);
- tool->m_clientData = clientData;
-
- if (xPos > -1)
- tool->m_x = xPos;
- else
- tool->m_x = m_xMargin;
-
- if (yPos > -1)
- tool->m_y = yPos;
- else
- tool->m_y = m_yMargin;
-
- tool->SetSize(GetDefaultButtonWidth(), GetDefaultButtonHeight());
-
- m_tools.Append((long)index, tool);
- return tool;
+ XmToggleButtonSetState(tool->GetButtonWidget(), (Boolean) toggle, False);
}
-int wxToolBar::FindIndexForWidget(WXWidget w)
+void wxToolBar::DoSetToggle(wxToolBarToolBase * WXUNUSED(tool),
+ bool WXUNUSED(toggle))
{
- wxNode* node = m_widgets.First();
- while (node)
- {
- WXWidget widget = (WXWidget) node->Data();
- if (widget == w)
- return (int) node->GetKeyInteger();
- node = node->Next();
- }
- return -1;
+ // nothing to do
}
-WXWidget wxToolBar::FindWidgetForIndex(int index)
-{
- wxNode* node = m_widgets.Find((long) index);
- if (!node)
- return (WXWidget) 0;
- else
- return (WXWidget) node->Data();
-}
+// ----------------------------------------------------------------------------
+// Motif callbacks
+// ----------------------------------------------------------------------------
-WXWidget wxToolBar::GetTopWidget() const
+wxToolBarToolBase *wxToolBar::FindToolByWidget(WXWidget w) const
{
- return m_mainWidget;
-}
+ wxToolBarToolsList::Node* node = m_tools.GetFirst();
+ while ( node )
+ {
+ wxToolBarTool *tool = (wxToolBarTool *)node->GetData();
+ if ( tool->GetButtonWidget() == w)
+ {
+ return tool;
+ }
-WXWidget wxToolBar::GetClientWidget() const
-{
- return m_mainWidget;
-}
+ node = node->GetNext();
+ }
-WXWidget wxToolBar::GetMainWidget() const
-{
- return m_mainWidget;
+ return (wxToolBarToolBase *)NULL;
}
-
-void wxToolButtonCallback (Widget w, XtPointer clientData,
- XtPointer ptr)
+static void wxToolButtonCallback(Widget w,
+ XtPointer clientData,
+ XtPointer WXUNUSED(ptr))
{
wxToolBar *toolBar = (wxToolBar *) clientData;
- int index = toolBar->FindIndexForWidget((WXWidget) w);
+ wxToolBarToolBase *tool = toolBar->FindToolByWidget((WXWidget) w);
+ if ( !tool )
+ return;
+
+ if ( tool->CanBeToggled() )
+ tool->Toggle();
- if (index != -1)
+ if ( !toolBar->OnLeftClick(tool->GetId(), tool->IsToggled()) )
{
- wxNode *node = toolBar->GetTools().Find((long)index);
- if (!node)
- return;
- wxToolBarTool *tool = (wxToolBarTool *)node->Data();
- if (tool->m_isToggle)
- tool->m_toggleState = toolBar->GetToolState(index);
-
- (void) toolBar->OnLeftClick(index, tool->m_toggleState);
+ // revert
+ tool->Toggle();
}
-
}
-static void wxToolButtonPopupCallback (Widget w, XtPointer client_data,
- XEvent *event, Boolean *continue_to_dispatch)
+static void wxToolButtonPopupCallback(Widget w,
+ XtPointer client_data,
+ XEvent *event,
+ Boolean *WXUNUSED(continue_to_dispatch))
{
// TODO: retrieve delay before popping up tooltip from wxSystemSettings.
- int delayMilli = 800;
+ static const int delayMilli = 800;
+
wxToolBar* toolBar = (wxToolBar*) client_data;
+ wxToolBarToolBase *tool = toolBar->FindToolByWidget((WXWidget) w);
- int index = toolBar->FindIndexForWidget((WXWidget) w);
+ if ( !tool )
+ return;
- if (index != -1)
- {
- wxNode *node = toolBar->GetTools().Find((long)index);
- if (!node)
- return;
- wxToolBarTool *tool = (wxToolBarTool *)node->Data();
- wxString str(toolBar->GetToolShortHelp(index));
- if (str.IsNull() || str == "")
- return;
+ wxString tooltip = tool->GetShortHelp();
+ if ( !tooltip )
+ return;
- if (!wxTheToolBarTimer)
- wxTheToolBarTimer = new wxToolBarTimer;
-
- wxToolBarTimer::buttonWidget = w;
- wxToolBarTimer::helpString = str;
+ if (!wxTheToolBarTimer)
+ wxTheToolBarTimer = new wxToolBarTimer;
+ wxToolBarTimer::buttonWidget = w;
+ wxToolBarTimer::helpString = tooltip;
/************************************************************/
/* Popup help label */
{
XtDestroyWidget (wxToolBarTimer::help_popup);
XtPopdown (wxToolBarTimer::help_popup);
- }
+ }
wxToolBarTimer::help_popup = (Widget) 0;
// One shot
{
XtDestroyWidget (wxToolBarTimer::help_popup);
XtPopdown (wxToolBarTimer::help_popup);
- }
+ }
wxToolBarTimer::help_popup = (Widget) 0;
}
- }
}
void wxToolBarTimer::Notify()
/************************************************************/
/* Create shell without window decorations */
/************************************************************/
- help_popup = XtVaCreatePopupShell ("shell",
- overrideShellWidgetClass, (Widget) wxTheApp->GetTopLevelWidget(),
+ help_popup = XtVaCreatePopupShell ("shell",
+ overrideShellWidgetClass, (Widget) wxTheApp->GetTopLevelWidget(),
NULL);
/************************************************************/
/* Get absolute position on display of toolbar button */
/************************************************************/
XtTranslateCoords (buttonWidget,
- (Position) 0,
- (Position) 0,
+ (Position) 0,
+ (Position) 0,
&x, &y);
// Move the tooltip more or less above the button
/************************************************************/
/* Set the position of the help popup */
/************************************************************/
- XtVaSetValues (help_popup,
- XmNx, (Position) x,
- XmNy, (Position) y,
+ XtVaSetValues (help_popup,
+ XmNx, (Position) x,
+ XmNy, (Position) y,
NULL);
-
+
/************************************************************/
/* Create help label */
/************************************************************/
XmString text = XmStringCreateSimple ((char*) (const char*) helpString);
- XtVaCreateManagedWidget ("help_label",
- xmLabelWidgetClass, help_popup,
+ XtVaCreateManagedWidget ("help_label",
+ xmLabelWidgetClass, help_popup,
XmNlabelString, text,
- XtVaTypedArg,
- XmNforeground, XtRString, "black",
- strlen("black")+1,
- XtVaTypedArg,
- XmNbackground, XtRString, "LightGoldenrod",
- strlen("LightGoldenrod")+1,
+ XtVaTypedArg,
+ XmNforeground, XtRString, "black",
+ strlen("black")+1,
+ XtVaTypedArg,
+ XmNbackground, XtRString, "LightGoldenrod",
+ strlen("LightGoldenrod")+1,
NULL);
XmStringFree (text);