added wxTB_RIGHT style for right-aligned toolbars (slightly modified patch 1567469)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@42645 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin 2006-10-29 19:12:52 +00:00
parent 3af706cc31
commit 7a9763046b
8 changed files with 137 additions and 56 deletions

View File

@ -73,6 +73,7 @@ use this option under Windows XP with true colour:
\twocolitem{\windowstyle{wxTB\_HORZ\_TEXT}}{Combination of wxTB\_HORZ\_LAYOUT and wxTB\_TEXT.}
\twocolitem{\windowstyle{wxTB\_NO\_TOOLTIPS}}{Don't show the short help tooltips for the tools when the mouse hovers over them.}
\twocolitem{\windowstyle{wxTB\_BOTTOM}}{Align the toolbar at the bottom of parent window.}
\twocolitem{\windowstyle{wxTB\_RIGHT}}{Align the toolbar at the right side of parent window.}
\end{twocollist}
See also \helpref{window styles overview}{windowstyles}. Note that the Win32

View File

@ -420,7 +420,7 @@ public:
wxToolBarToolBase *FindById(int toolid) const;
// return true if this is a vertical toolbar, otherwise false
bool IsVertical() const { return HasFlag(wxTB_VERTICAL); }
bool IsVertical() const { return HasFlag(wxTB_LEFT | wxTB_RIGHT); }
// the old versions of the various methods kept for compatibility

View File

@ -22,9 +22,11 @@ enum
{
// lay out the toolbar horizontally
wxTB_HORIZONTAL = wxHORIZONTAL, // == 0x0004
wxTB_TOP = wxTB_HORIZONTAL,
// lay out the toolbar vertically
wxTB_VERTICAL = wxVERTICAL, // == 0x0008
wxTB_LEFT = wxTB_VERTICAL,
// show 3D buttons (wxToolBarSimple only)
wxTB_3DBUTTONS = 0x0010,
@ -55,7 +57,10 @@ enum
wxTB_NO_TOOLTIPS = 0x1000,
// lay out toolbar at the bottom of the window
wxTB_BOTTOM = 0x2000
wxTB_BOTTOM = 0x2000,
// lay out toolbar at the right edge of the window
wxTB_RIGHT = 0x4000
};
#if wxUSE_TOOLBAR

View File

@ -64,6 +64,14 @@
#include "bitmaps/help.xpm"
#endif // USE_XPM_BITMAPS
enum Positions
{
TOOLBAR_LEFT,
TOOLBAR_TOP,
TOOLBAR_RIGHT,
TOOLBAR_BOTTOM
};
// ----------------------------------------------------------------------------
// classes
// ----------------------------------------------------------------------------
@ -97,9 +105,8 @@ public:
void OnToggleAnotherToolbar(wxCommandEvent& event);
void OnToggleHorizontalText(wxCommandEvent& WXUNUSED(event));
void OnBottomToolbar(wxCommandEvent& WXUNUSED(event));
void OnToggleToolbarSize(wxCommandEvent& event);
void OnToggleToolbarOrient(wxCommandEvent& event);
void OnChangeOrientation(wxCommandEvent& event);
void OnToggleToolbarRows(wxCommandEvent& event);
void OnToggleTooltips(wxCommandEvent& event);
void OnToggleCustomDisabled(wxCommandEvent& event);
@ -132,8 +139,6 @@ private:
void LayoutChildren();
bool m_smallToolbar,
m_horzToolbar,
m_bottomToolbar,
m_horzText,
m_useCustomDisabled,
m_showTooltips;
@ -142,6 +147,9 @@ private:
// the number of print buttons we have (they're added/removed dynamically)
size_t m_nPrint;
// store toolbar position for future use
Positions m_toolbarPosition;
wxTextCtrl *m_textWindow;
wxToolBar *m_tbar;
@ -163,7 +171,6 @@ static const long TOOLBAR_STYLE = wxTB_FLAT | wxTB_DOCKABLE | wxTB_TEXT;
enum
{
IDM_TOOLBAR_TOGGLETOOLBARSIZE = 200,
IDM_TOOLBAR_TOGGLETOOLBARORIENT,
IDM_TOOLBAR_TOGGLETOOLBARROWS,
IDM_TOOLBAR_TOGGLETOOLTIPS,
IDM_TOOLBAR_TOGGLECUSTOMDISABLED,
@ -182,7 +189,10 @@ enum
IDM_TOOLBAR_SHOW_ICONS,
IDM_TOOLBAR_SHOW_BOTH,
IDM_TOOLBAR_CUSTOM_PATH,
IDM_TOOLBAR_TOP_ORIENTATION,
IDM_TOOLBAR_LEFT_ORIENTATION,
IDM_TOOLBAR_BOTTOM_ORIENTATION,
IDM_TOOLBAR_RIGHT_ORIENTATION,
IDM_TOOLBAR_OTHER_1,
IDM_TOOLBAR_OTHER_2,
IDM_TOOLBAR_OTHER_3,
@ -208,9 +218,8 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_MENU(IDM_TOOLBAR_TOGGLE_ANOTHER_TOOLBAR, MyFrame::OnToggleAnotherToolbar)
EVT_MENU(IDM_TOOLBAR_TOGGLE_HORIZONTAL_TEXT, MyFrame::OnToggleHorizontalText)
EVT_MENU(IDM_TOOLBAR_BOTTOM_ORIENTATION, MyFrame::OnBottomToolbar)
EVT_MENU_RANGE(IDM_TOOLBAR_TOP_ORIENTATION, IDM_TOOLBAR_RIGHT_ORIENTATION, MyFrame::OnChangeOrientation)
EVT_MENU(IDM_TOOLBAR_TOGGLETOOLBARSIZE, MyFrame::OnToggleToolbarSize)
EVT_MENU(IDM_TOOLBAR_TOGGLETOOLBARORIENT, MyFrame::OnToggleToolbarOrient)
EVT_MENU(IDM_TOOLBAR_TOGGLETOOLBARROWS, MyFrame::OnToggleToolbarRows)
EVT_MENU(IDM_TOOLBAR_TOGGLETOOLTIPS, MyFrame::OnToggleTooltips)
EVT_MENU(IDM_TOOLBAR_TOGGLECUSTOMDISABLED, MyFrame::OnToggleCustomDisabled)
@ -292,11 +301,22 @@ void MyFrame::RecreateToolbar()
SetToolBar(NULL);
style &= ~(wxTB_HORIZONTAL | wxTB_VERTICAL | wxTB_BOTTOM | wxTB_HORZ_LAYOUT);
if( m_bottomToolbar )
style &= ~(wxTB_HORIZONTAL | wxTB_VERTICAL | wxTB_BOTTOM | wxTB_RIGHT | wxTB_HORZ_LAYOUT);
switch( m_toolbarPosition )
{
case TOOLBAR_LEFT:
style |= wxTB_LEFT;
break;
case TOOLBAR_TOP:
style |= wxTB_TOP;
break;
case TOOLBAR_RIGHT:
style |= wxTB_RIGHT;
break;
case TOOLBAR_BOTTOM:
style |= wxTB_BOTTOM;
else
style |= m_horzToolbar ? wxTB_HORIZONTAL : wxTB_VERTICAL;
break;
}
if ( m_showTooltips )
style &= ~wxTB_NO_TOOLTIPS;
@ -369,7 +389,7 @@ void MyFrame::RecreateToolbar()
// the generic toolbar doesn't really support this
#if wxUSE_TOOLBAR_NATIVE && !defined(__WXX11__) || defined(__WXUNIVERSAL__)
// adding a combo to a vertical toolbar is not very smart
if ( m_horzToolbar )
if ( !( toolBar->IsVertical() ) )
{
wxComboBox *combo = new wxComboBox(toolBar, ID_COMBO, wxEmptyString, wxDefaultPosition, wxSize(200,wxDefaultCoord) );
combo->Append(_T("This"));
@ -432,7 +452,7 @@ void MyFrame::RecreateToolbar()
// the changes
toolBar->Realize();
toolBar->SetRows(m_horzToolbar ? m_rows : 10 / m_rows);
toolBar->SetRows(!(toolBar->IsVertical()) ? m_rows : 10 / m_rows);
}
// ----------------------------------------------------------------------------
@ -451,8 +471,6 @@ MyFrame::MyFrame(wxFrame* parent,
m_tbar = NULL;
m_smallToolbar = true;
m_horzToolbar = true;
m_bottomToolbar = false;
m_horzText = false;
m_useCustomDisabled = false;
m_showTooltips = true;
@ -486,10 +504,6 @@ MyFrame::MyFrame(wxFrame* parent,
_T("&Toggle toolbar size\tCtrl-S"),
_T("Toggle between big/small toolbar"));
tbarMenu->AppendCheckItem(IDM_TOOLBAR_TOGGLETOOLBARORIENT,
_T("Toggle toolbar &orientation\tCtrl-O"),
_T("Toggle toolbar orientation"));
tbarMenu->AppendCheckItem(IDM_TOOLBAR_TOGGLETOOLBARROWS,
_T("Toggle number of &rows\tCtrl-R"),
_T("Toggle number of toolbar rows between 1 and 2"));
@ -503,9 +517,19 @@ MyFrame::MyFrame(wxFrame* parent,
_T("Switch between using system-generated and custom disabled images"));
tbarMenu->AppendCheckItem(IDM_TOOLBAR_BOTTOM_ORIENTATION,
tbarMenu->AppendSeparator();
tbarMenu->AppendRadioItem(IDM_TOOLBAR_TOP_ORIENTATION,
_T("Set toolbar at the top of the window"),
_T("Set toolbar at the top of the window"));
tbarMenu->AppendRadioItem(IDM_TOOLBAR_LEFT_ORIENTATION,
_T("Set toolbar at the left of the window"),
_T("Set toolbar at the left of the window"));
tbarMenu->AppendRadioItem(IDM_TOOLBAR_BOTTOM_ORIENTATION,
_T("Set toolbar at the bottom of the window"),
_T("Set toolbar at the bottom of the window"));
tbarMenu->AppendRadioItem(IDM_TOOLBAR_RIGHT_ORIENTATION,
_T("Set toolbar at the right edge of the window"),
_T("Set toolbar at the right edge of the window"));
tbarMenu->AppendSeparator();
tbarMenu->Append(IDM_TOOLBAR_ENABLEPRINT, _T("&Enable print button\tCtrl-E"));
@ -543,6 +567,8 @@ MyFrame::MyFrame(wxFrame* parent,
menuBar->Check(IDM_TOOLBAR_SHOW_BOTH, true);
menuBar->Check(IDM_TOOLBAR_TOGGLETOOLTIPS, true);
menuBar->Check(IDM_TOOLBAR_TOP_ORIENTATION, true );
m_toolbarPosition = TOOLBAR_TOP;
// Create the toolbar
RecreateToolbar();
@ -660,7 +686,7 @@ void MyFrame::OnToggleToolbarRows(wxCommandEvent& WXUNUSED(event))
// m_rows may be only 1 or 2
m_rows = 3 - m_rows;
GetToolBar()->SetRows(m_horzToolbar ? m_rows : 10 / m_rows);
GetToolBar()->SetRows(!(GetToolBar()->IsVertical()) ? m_rows : 10 / m_rows);
//RecreateToolbar(); -- this is unneeded
}
@ -679,15 +705,23 @@ void MyFrame::OnToggleCustomDisabled(wxCommandEvent& WXUNUSED(event))
RecreateToolbar();
}
void MyFrame::OnToggleToolbarOrient(wxCommandEvent& WXUNUSED(event))
void MyFrame::OnChangeOrientation(wxCommandEvent& event)
{
if( m_bottomToolbar )
m_bottomToolbar = false;
m_horzToolbar = !m_horzToolbar;
wxMenuBar *menuBar = GetMenuBar();
if( menuBar->IsChecked( IDM_TOOLBAR_BOTTOM_ORIENTATION ) )
menuBar->Check( IDM_TOOLBAR_BOTTOM_ORIENTATION, false );
switch( event.GetId() )
{
case IDM_TOOLBAR_LEFT_ORIENTATION:
m_toolbarPosition = TOOLBAR_LEFT;
break;
case IDM_TOOLBAR_TOP_ORIENTATION:
m_toolbarPosition = TOOLBAR_TOP;
break;
case IDM_TOOLBAR_RIGHT_ORIENTATION:
m_toolbarPosition = TOOLBAR_RIGHT;
break;
case IDM_TOOLBAR_BOTTOM_ORIENTATION:
m_toolbarPosition = TOOLBAR_BOTTOM;
break;
}
RecreateToolbar();
}
@ -836,13 +870,3 @@ void MyFrame::OnToggleRadioBtn(wxCommandEvent& event)
event.GetId() - IDM_TOOLBAR_TOGGLERADIOBTN1, true);
}
}
void MyFrame::OnBottomToolbar(wxCommandEvent& WXUNUSED(event) )
{
m_bottomToolbar = !m_bottomToolbar;
wxMenuBar *menuBar = GetMenuBar();
if( menuBar->IsChecked( IDM_TOOLBAR_TOGGLETOOLBARORIENT ) )
menuBar->Check( IDM_TOOLBAR_TOGGLETOOLBARORIENT, false );
if( !m_horzToolbar )
m_horzToolbar = true;
RecreateToolbar();
}

View File

@ -251,7 +251,7 @@ void wxFrame::DoGetClientSize( int *width, int *height ) const
{
int x, y;
m_frameToolBar->GetSize( &x, &y );
if ( m_frameToolBar->GetWindowStyle() & wxTB_VERTICAL )
if ( m_frameToolBar->IsVertical() )
{
if (width != NULL)
*width -= x;
@ -305,7 +305,7 @@ void wxFrame::DoSetClientSize( int width, int height )
{
int x, y;
m_frameToolBar->GetSize( &x, &y );
if ( m_frameToolBar->GetWindowStyle() & wxTB_VERTICAL )
if ( m_frameToolBar->IsVertical() )
{
width += x;
}
@ -431,6 +431,17 @@ void wxFrame::GtkOnSize()
client_area_x_offset += ww;
}
else if( m_frameToolBar->HasFlag(wxTB_RIGHT) )
{
yy += 2;
ww = m_toolBarDetached ? wxPLACE_HOLDER
: m_frameToolBar->m_width;
xx = GetClientSize().x - 1;
hh = m_height - 2*m_miniEdge;
if( hh < 0 )
hh = 0;
}
else if( m_frameToolBar->GetWindowStyle() & wxTB_BOTTOM )
{
xx = m_miniEdge;

View File

@ -52,8 +52,7 @@ extern wxCursor g_globalCursor;
static void GetGtkStyle(long style,
GtkOrientation *orient, GtkToolbarStyle *gtkStyle)
{
*orient = style & wxTB_VERTICAL ? GTK_ORIENTATION_VERTICAL
: GTK_ORIENTATION_HORIZONTAL;
*orient = ( style & wxTB_LEFT || style & wxTB_RIGHT ) ? GTK_ORIENTATION_VERTICAL : GTK_ORIENTATION_HORIZONTAL;
if ( style & wxTB_TEXT )
@ -633,4 +632,8 @@ wxToolBar::GetClassDefaultAttributes(wxWindowVariant WXUNUSED(variant))
return GetDefaultAttributesFromGTKWidget(gtk_toolbar_new);
}
bool wxToolBar::IsVertical()
{
return HasFlag(wxTB_LEFT) || HasFlag(wxTB_RIGHT);
}
#endif // wxUSE_TOOLBAR_NATIVE

View File

@ -232,6 +232,20 @@ void wxFrame::DoSetClientSize(int width, int height)
wxPoint pt = GetClientAreaOrigin();
width += pt.x;
height += pt.y;
#if wxUSE_TOOLBAR
if ( width )
{
wxToolBar *toolbar = GetToolBar();
if ( toolbar && toolbar->HasFlag(wxTB_RIGHT) )
{
width -= toolbar->GetClientSize().x;
}
if ( toolbar && toolbar->HasFlag( wxTB_BOTTOM ) )
{
height -= toolbar->GetClientSize().y;
}
}
#endif
wxTopLevelWindow::DoSetClientSize(width, height);
}
@ -257,6 +271,14 @@ void wxFrame::DoGetClientSize(int *x, int *y) const
*y -= toolbar->GetClientSize().y;
}
}
if ( x )
{
wxToolBar *toolbar = GetToolBar();
if ( toolbar && toolbar->HasFlag(wxTB_RIGHT) )
{
*x -= toolbar->GetClientSize().x;
}
}
#endif
#if wxUSE_STATUSBAR
// adjust client area height to take the status bar into account
@ -328,6 +350,8 @@ void wxFrame::PositionStatusBar()
wxToolBar *toolbar = GetToolBar();
if( toolbar && toolbar->HasFlag( wxTB_BOTTOM ) )
h += toolbar->GetClientRect().height;
if( toolbar && toolbar->HasFlag( wxTB_RIGHT ) )
w += toolbar->GetClientRect().width;
#endif
int sw, sh;
m_frameStatusBar->GetSize(&sw, &sh);
@ -609,6 +633,11 @@ void wxFrame::PositionToolBar()
x = 0;
y = height - th;
}
else if( toolbar->HasFlag(wxTB_RIGHT) )
{
x = width - tw;
y = 0;
}
#if defined(WINCE_WITH_COMMANDBAR)
// We're using a commandbar - so we have to allow for it.
if (GetMenuBar() && GetMenuBar()->GetCommandBar())
@ -633,11 +662,18 @@ void wxFrame::PositionToolBar()
if( tx < 0 && ( -tx == tw ) )
tx = 0;
}
else if( toolbar->HasFlag(wxTB_RIGHT) )
{
if( ty < 0 && ( -ty == th ) )
ty = 0;
if( tx < 0 && ( -tx == tw ) )
tx = width - tw;
}
int desiredW = tw;
int desiredH = th;
if ( toolbar->GetWindowStyleFlag() & wxTB_VERTICAL )
if ( toolbar->IsVertical() )
{
desiredH = height;
}
@ -656,7 +692,7 @@ void wxFrame::PositionToolBar()
bool heightChanging wxDUMMY_INITIALIZE(true);
bool widthChanging wxDUMMY_INITIALIZE(true);
if ( toolbar->GetWindowStyleFlag() & wxTB_VERTICAL )
if ( toolbar->IsVertical() )
{
// It's OK if the current height is greater than what can be shown.
heightChanging = (desiredH > th) ;
@ -1084,7 +1120,7 @@ wxPoint wxFrame::GetClientAreaOrigin() const
{
pt.x += w;
}
else if( !( toolbar->GetWindowStyleFlag() & wxTB_BOTTOM ) )
else if( ( toolbar->GetWindowStyleFlag() & wxTB_TOP ) )
{
pt.y += h;
}

View File

@ -347,7 +347,7 @@ wxSize wxToolBar::DoGetBestSize() const
sizeBest.x *= GetToolsCount();
// reverse horz and vertical components if necessary
if ( HasFlag(wxTB_VERTICAL) )
if ( IsVertical() )
{
int t = sizeBest.x;
sizeBest.x = sizeBest.y;
@ -405,6 +405,9 @@ WXDWORD wxToolBar::MSWGetStyle(long style, WXDWORD *exstyle) const
if( style & wxTB_BOTTOM )
msStyle |= CCS_BOTTOM;
if ( style & wxTB_RIGHT )
msStyle |= CCS_RIGHT;
return msStyle;
}
@ -541,8 +544,6 @@ bool wxToolBar::Realize()
// nothing to do
return true;
const bool isVertical = HasFlag(wxTB_VERTICAL);
#ifdef wxREMAP_BUTTON_COLOURS
// don't change the values of these constants, they can be set from the
// user code via wxSystemOptions
@ -819,7 +820,7 @@ bool wxToolBar::Realize()
// don't add separators to the vertical toolbar with old comctl32.dll
// versions as they didn't handle this properly
if ( isVertical && tool->IsSeparator() &&
if ( IsVertical() && tool->IsSeparator() &&
wxApp::GetComCtl32Version() <= 472 )
{
continue;
@ -943,7 +944,7 @@ bool wxToolBar::Realize()
// get the items size for all items but for the horizontal ones we
// don't need to deal with the non controls
bool isControl = tool->IsControl();
if ( !isControl && !isVertical )
if ( !isControl && !IsVertical() )
continue;
// note that we use TB_GETITEMRECT and not TB_GETRECT because the
@ -1034,7 +1035,7 @@ bool wxToolBar::Realize()
}
int top;
if ( isVertical )
if ( IsVertical() )
{
left = 0;
top = y;
@ -1056,7 +1057,7 @@ bool wxToolBar::Realize()
// separators which we added just for aligning the controls
m_nButtons = index;
if ( !isVertical )
if ( !IsVertical() )
{
if ( m_maxRows == 0 )
// if not set yet, only one row
@ -1428,7 +1429,7 @@ bool wxToolBar::HandleSize(WXWPARAM WXUNUSED(wParam), WXLPARAM lParam)
{
int w, h;
if ( GetWindowStyle() & wxTB_VERTICAL )
if ( IsVertical() )
{
w = r.right - r.left;
if ( m_maxRows )