Implement vertical toolbar under Motif.

Notify parent frame when toolbar is moved/resized/added/deleted so that
frame childs can be correctly repositioned.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@18777 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Mattia Barbon
2003-01-16 20:41:07 +00:00
parent b05206c98b
commit 46675b4610
4 changed files with 94 additions and 24 deletions

View File

@@ -61,7 +61,10 @@ public:
// Create toolbar // Create toolbar
#if wxUSE_TOOLBAR #if wxUSE_TOOLBAR
virtual wxToolBar* CreateToolBar(long style = wxNO_BORDER|wxTB_HORIZONTAL, wxWindowID id = -1, const wxString& name = wxToolBarNameStr); virtual wxToolBar* CreateToolBar(long style = wxNO_BORDER|wxTB_HORIZONTAL,
wxWindowID id = -1,
const wxString& name = wxToolBarNameStr);
virtual void SetToolBar(wxToolBar *toolbar);
virtual void PositionToolBar(); virtual void PositionToolBar();
#endif // wxUSE_TOOLBAR #endif // wxUSE_TOOLBAR
@@ -89,6 +92,8 @@ public:
bool PreResize(); bool PreResize();
void SendSizeEvent();
// for generic/mdig.h // for generic/mdig.h
virtual void DoGetClientSize(int *width, int *height) const; virtual void DoGetClientSize(int *width, int *height) const;
private: private:

View File

@@ -53,7 +53,7 @@ public:
// find tool by widget // find tool by widget
wxToolBarToolBase *FindToolByWidget(WXWidget w) const; wxToolBarToolBase *FindToolByWidget(WXWidget w) const;
protected: private:
// common part of all ctors // common part of all ctors
void Init(); void Init();
@@ -74,7 +74,10 @@ protected:
const wxString& shortHelp, const wxString& shortHelp,
const wxString& longHelp); const wxString& longHelp);
virtual wxToolBarToolBase *CreateTool(wxControl *control); virtual wxToolBarToolBase *CreateTool(wxControl *control);
virtual void DoSetSize(int x, int y,
int width, int height,
int sizeFlags = wxSIZE_AUTO);
private: private:
DECLARE_DYNAMIC_CLASS(wxToolBar) DECLARE_DYNAMIC_CLASS(wxToolBar)
}; };

View File

@@ -603,6 +603,13 @@ void wxFrame::OnActivate(wxActivateEvent& event)
} }
} }
void wxFrame::SendSizeEvent()
{
wxSizeEvent event(GetSize(), GetId());
event.SetEventObject(this);
GetEventHandler()->AddPendingEvent(event);
}
#if wxUSE_TOOLBAR #if wxUSE_TOOLBAR
wxToolBar* wxFrame::CreateToolBar(long style, wxToolBar* wxFrame::CreateToolBar(long style,
@@ -617,6 +624,12 @@ wxToolBar* wxFrame::CreateToolBar(long style,
return m_frameToolBar; return m_frameToolBar;
} }
void wxFrame::SetToolBar(wxToolBar *toolbar)
{
wxFrameBase::SetToolBar(toolbar);
SendSizeEvent();
}
void wxFrame::PositionToolBar() void wxFrame::PositionToolBar()
{ {
wxToolBar* tb = GetToolBar(); wxToolBar* tb = GetToolBar();

View File

@@ -29,6 +29,7 @@
#include "wx/app.h" #include "wx/app.h"
#include "wx/timer.h" #include "wx/timer.h"
#include "wx/toolbar.h" #include "wx/toolbar.h"
#include "wx/frame.h"
#ifdef __VMS__ #ifdef __VMS__
#pragma message disable nosimpint #pragma message disable nosimpint
@@ -193,18 +194,11 @@ bool wxToolBar::Create(wxWindow *parent,
long style, long style,
const wxString& name) const wxString& name)
{ {
Init(); if( !wxControl::CreateControl( parent, id, pos, size, style,
wxDefaultValidator, name ) )
return FALSE;
m_windowId = id;
SetName(name);
m_backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE); m_backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE);
m_foregroundColour = parent->GetForegroundColour();
m_windowStyle = style;
SetParent(parent);
if (parent) parent->AddChild(this);
Widget parentWidget = (Widget) parent->GetClientWidget(); Widget parentWidget = (Widget) parent->GetClientWidget();
@@ -229,11 +223,19 @@ bool wxToolBar::Create(wxWindow *parent,
m_mainWidget = (WXWidget) toolbar; m_mainWidget = (WXWidget) toolbar;
m_font = parent->GetFont();
ChangeFont(FALSE); 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); 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(); ChangeBackgroundColour();
@@ -254,6 +256,8 @@ bool wxToolBar::Realize()
return TRUE; return TRUE;
} }
bool isVertical = GetWindowStyle() & wxTB_VERTICAL;
// Separator spacing // Separator spacing
const int separatorSize = GetToolSeparation(); // 8; const int separatorSize = GetToolSeparation(); // 8;
wxSize margins = GetToolMargins(); wxSize margins = GetToolMargins();
@@ -264,7 +268,7 @@ bool wxToolBar::Realize()
int currentX = marginX; int currentX = marginX;
int currentY = marginY; int currentY = marginY;
int buttonHeight = 0; int buttonHeight = 0, buttonWidth = 0;
int currentSpacing = 0; int currentSpacing = 0;
@@ -284,15 +288,23 @@ bool wxToolBar::Realize()
wxControl* control = tool->GetControl(); wxControl* control = tool->GetControl();
wxSize sz = control->GetSize(); wxSize sz = control->GetSize();
wxPoint pos = control->GetPosition(); wxPoint pos = control->GetPosition();
// Allow a control to specify a y-offset by setting its initial position, // Allow a control to specify a y[x]-offset by setting
// but still don't allow it to position itself above the top margin. // 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 controlY = (pos.y > 0) ? currentY + pos.y : currentY;
control->Move(currentX, controlY); int controlX = (pos.x > 0) ? currentX + pos.x : currentX;
currentX += sz.x + packing; control->Move( isVertical ? controlX : currentX,
isVertical ? currentY : controlY );
if ( isVertical )
currentY += sz.y + packing;
else
currentX += sz.x + packing;
break; break;
} }
case wxTOOL_STYLE_SEPARATOR: case wxTOOL_STYLE_SEPARATOR:
// skip separators for vertical toolbars
if( isVertical ) break;
currentX += separatorSize; currentX += separatorSize;
break; break;
@@ -351,7 +363,6 @@ bool wxToolBar::Realize()
wxColour col; wxColour col;
col.SetPixel(backgroundPixel); col.SetPixel(backgroundPixel);
bmp = wxCreateMaskedBitmap(bmp, col); bmp = wxCreateMaskedBitmap(bmp, col);
tool->SetNormalBitmap(bmp); tool->SetNormalBitmap(bmp);
@@ -367,7 +378,6 @@ bool wxToolBar::Realize()
else else
XtVaGetValues(button, XmNarmColor, &backgroundPixel, XtVaGetValues(button, XmNarmColor, &backgroundPixel,
NULL); NULL);
wxColour col; wxColour col;
col.SetPixel(backgroundPixel); col.SetPixel(backgroundPixel);
@@ -462,8 +472,12 @@ bool wxToolBar::Realize()
XmNwidth, &width, XmNwidth, &width,
XmNheight, & height, XmNheight, & height,
NULL); NULL);
currentX += width + packing; if ( isVertical )
currentY += height + packing;
else
currentX += width + packing;
buttonHeight = wxMax(buttonHeight, height); buttonHeight = wxMax(buttonHeight, height);
buttonWidth = wxMax(buttonWidth, width);
} }
XtAddEventHandler (button, EnterWindowMask | LeaveWindowMask, XtAddEventHandler (button, EnterWindowMask | LeaveWindowMask,
@@ -476,7 +490,9 @@ bool wxToolBar::Realize()
node = node->GetNext(); 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; return TRUE;
} }
@@ -523,6 +539,39 @@ void wxToolBar::DoSetToggle(wxToolBarToolBase * WXUNUSED(tool),
// nothing to do // 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 // Motif callbacks
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------