#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
// ----------------------------------------------------------------------------
#if !USE_SHARED_LIBRARY
-IMPLEMENT_DYNAMIC_CLASS(wxToolBar, wxControl)
+IMPLEMENT_DYNAMIC_CLASS(wxToolBar, wxToolBarBase)
#endif
// ----------------------------------------------------------------------------
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();
}
// ----------------------------------------------------------------------------
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);
{
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.
}
// ----------------------------------------------------------------------------
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();
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();
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;
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;
// 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;
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
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
{
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();
// 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
{
// 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
{
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,
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;
}
// 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
// ----------------------------------------------------------------------------