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:
@@ -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:
|
||||||
|
@@ -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();
|
||||||
|
|
||||||
@@ -75,6 +75,9 @@ protected:
|
|||||||
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)
|
||||||
};
|
};
|
||||||
|
@@ -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();
|
||||||
|
@@ -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;
|
||||||
|
control->Move( isVertical ? controlX : currentX,
|
||||||
|
isVertical ? currentY : controlY );
|
||||||
|
if ( isVertical )
|
||||||
|
currentY += sz.y + packing;
|
||||||
|
else
|
||||||
currentX += sz.x + packing;
|
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);
|
||||||
|
if ( isVertical )
|
||||||
|
currentY += height + packing;
|
||||||
|
else
|
||||||
currentX += width + packing;
|
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
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
Reference in New Issue
Block a user