allow the user to pass NULL for the status widths; this was a feature supported by generic and MSW status bar but was not documented; document it; add menu item in the statbar sample for testing it

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@57693 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Francesco Montorsi
2008-12-31 17:07:30 +00:00
parent 2ffeccb3b7
commit 54e18afcca
4 changed files with 66 additions and 47 deletions

View File

@@ -112,6 +112,8 @@ public:
/** /**
Saves the current field text in a per field stack, and sets the field text Saves the current field text in a per field stack, and sets the field text
to the string passed as argument. to the string passed as argument.
@see PopStatusText()
*/ */
void PushStatusText(const wxString& string, int field = 0); void PushStatusText(const wxString& string, int field = 0);
@@ -164,7 +166,7 @@ public:
/** /**
Sets the widths of the fields in the status line. There are two types of Sets the widths of the fields in the status line. There are two types of
fields: fixed widths one and variable width fields. For the fixed width fields fields: @b fixed widths and @b variable width fields. For the fixed width fields
you should specify their (constant) width in pixels. For the variable width you should specify their (constant) width in pixels. For the variable width
fields, specify a negative number which indicates how the field should expand: fields, specify a negative number which indicates how the field should expand:
the space left for all variable width fields is divided between them according the space left for all variable width fields is divided between them according
@@ -182,6 +184,7 @@ public:
Contains an array of n integers, each of which is either an Contains an array of n integers, each of which is either an
absolute status field width in pixels if positive or indicates a absolute status field width in pixels if positive or indicates a
variable width field if negative. variable width field if negative.
The special value @NULL means that all fields should get the same width.
@remarks The widths of the variable fields are calculated from the total @remarks The widths of the variable fields are calculated from the total
width of all fields, minus the sum of widths of the width of all fields, minus the sum of widths of the

View File

@@ -49,16 +49,19 @@
#include "wx/datetime.h" #include "wx/datetime.h"
#include "wx/numdlg.h" #include "wx/numdlg.h"
// define this for the platforms which don't support wxBitmapButton (such as // define this for the platforms which don't support wxBitmapButton (such as
// Motif), else a wxBitmapButton will be used // Motif), else a wxBitmapButton will be used
#ifdef __WXMOTIF__ #ifdef __WXMOTIF__
#define USE_STATIC_BITMAP
#endif
//#define USE_MDI_PARENT_FRAME 1 //#define USE_MDI_PARENT_FRAME 1
#ifdef USE_MDI_PARENT_FRAME #ifdef USE_MDI_PARENT_FRAME
#include "wx/mdi.h" #include "wx/mdi.h"
#endif // USE_MDI_PARENT_FRAME #endif // USE_MDI_PARENT_FRAME
#define USE_STATIC_BITMAP
#endif
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// resources // resources
@@ -150,6 +153,7 @@ class MyFrame : public wxMDIParentFrame
void OnQuit(wxCommandEvent& event); void OnQuit(wxCommandEvent& event);
void OnAbout(wxCommandEvent& event); void OnAbout(wxCommandEvent& event);
void OnResetFieldsWidth(wxCommandEvent& event);
void OnSetStatusFields(wxCommandEvent& event); void OnSetStatusFields(wxCommandEvent& event);
void OnRecreateStatusBar(wxCommandEvent& event); void OnRecreateStatusBar(wxCommandEvent& event);
void OnSetStyleNormal(wxCommandEvent& event); void OnSetStyleNormal(wxCommandEvent& event);
@@ -163,6 +167,8 @@ private:
StatBar_Custom, StatBar_Custom,
StatBar_Max StatBar_Max
} m_statbarKind; } m_statbarKind;
void OnUpdateResetFieldsWidth(wxUpdateUIEvent& event);
void OnUpdateSetStatusFields(wxUpdateUIEvent& event); void OnUpdateSetStatusFields(wxUpdateUIEvent& event);
void OnUpdateStatusBarToggle(wxUpdateUIEvent& event); void OnUpdateStatusBarToggle(wxUpdateUIEvent& event);
void OnUpdateSetStyleNormal(wxUpdateUIEvent& event); void OnUpdateSetStyleNormal(wxUpdateUIEvent& event);
@@ -198,6 +204,7 @@ enum
// menu items // menu items
StatusBar_Quit = 1, StatusBar_Quit = 1,
StatusBar_SetFields, StatusBar_SetFields,
StatusBar_ResetFieldsWidth,
StatusBar_Recreate, StatusBar_Recreate,
StatusBar_About, StatusBar_About,
StatusBar_Toggle, StatusBar_Toggle,
@@ -225,12 +232,15 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame)
#endif #endif
EVT_MENU(StatusBar_Quit, MyFrame::OnQuit) EVT_MENU(StatusBar_Quit, MyFrame::OnQuit)
EVT_MENU(StatusBar_SetFields, MyFrame::OnSetStatusFields) EVT_MENU(StatusBar_SetFields, MyFrame::OnSetStatusFields)
EVT_MENU(StatusBar_ResetFieldsWidth, MyFrame::OnResetFieldsWidth)
EVT_MENU(StatusBar_Recreate, MyFrame::OnRecreateStatusBar) EVT_MENU(StatusBar_Recreate, MyFrame::OnRecreateStatusBar)
EVT_MENU(StatusBar_About, MyFrame::OnAbout) EVT_MENU(StatusBar_About, MyFrame::OnAbout)
EVT_MENU(StatusBar_Toggle, MyFrame::OnStatusBarToggle) EVT_MENU(StatusBar_Toggle, MyFrame::OnStatusBarToggle)
EVT_MENU(StatusBar_SetStyleNormal, MyFrame::OnSetStyleNormal) EVT_MENU(StatusBar_SetStyleNormal, MyFrame::OnSetStyleNormal)
EVT_MENU(StatusBar_SetStyleFlat, MyFrame::OnSetStyleFlat) EVT_MENU(StatusBar_SetStyleFlat, MyFrame::OnSetStyleFlat)
EVT_MENU(StatusBar_SetStyleRaised, MyFrame::OnSetStyleRaised) EVT_MENU(StatusBar_SetStyleRaised, MyFrame::OnSetStyleRaised)
EVT_UPDATE_UI(StatusBar_ResetFieldsWidth, MyFrame::OnUpdateResetFieldsWidth)
EVT_UPDATE_UI(StatusBar_Toggle, MyFrame::OnUpdateStatusBarToggle) EVT_UPDATE_UI(StatusBar_Toggle, MyFrame::OnUpdateStatusBarToggle)
EVT_UPDATE_UI(StatusBar_SetFields, MyFrame::OnUpdateSetStatusFields) EVT_UPDATE_UI(StatusBar_SetFields, MyFrame::OnUpdateSetStatusFields)
EVT_UPDATE_UI(StatusBar_SetStyleNormal, MyFrame::OnUpdateSetStyleNormal) EVT_UPDATE_UI(StatusBar_SetStyleNormal, MyFrame::OnUpdateSetStyleNormal)
@@ -314,10 +324,6 @@ MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
wxMenu *statbarMenu = new wxMenu; wxMenu *statbarMenu = new wxMenu;
statbarMenu->Append(StatusBar_SetFields, _T("&Set field count\tCtrl-C"), statbarMenu->Append(StatusBar_SetFields, _T("&Set field count\tCtrl-C"),
_T("Set the number of status bar fields")); _T("Set the number of status bar fields"));
statbarMenu->Append(StatusBar_Toggle, _T("&Toggle Status Bar"),
_T("Toggle the status bar display"), true);
statbarMenu->Append(StatusBar_Recreate, _T("&Recreate\tCtrl-R"),
_T("Toggle status bar format"));
wxMenu *statbarStyleMenu = new wxMenu; wxMenu *statbarStyleMenu = new wxMenu;
statbarStyleMenu->Append(StatusBar_SetStyleNormal, _T("&Normal"), _T("Sets the style of the first field to normal (sunken) look"), true); statbarStyleMenu->Append(StatusBar_SetStyleNormal, _T("&Normal"), _T("Sets the style of the first field to normal (sunken) look"), true);
@@ -325,6 +331,15 @@ MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
statbarStyleMenu->Append(StatusBar_SetStyleRaised, _T("&Raised"), _T("Sets the style of the first field to raised look"), true); statbarStyleMenu->Append(StatusBar_SetStyleRaised, _T("&Raised"), _T("Sets the style of the first field to raised look"), true);
statbarMenu->Append(StatusBar_SetStyle, _T("Field style"), statbarStyleMenu); statbarMenu->Append(StatusBar_SetStyle, _T("Field style"), statbarStyleMenu);
statbarMenu->Append(StatusBar_ResetFieldsWidth, _T("Reset field widths"),
_T("Sets all fields to the same width"));
statbarMenu->AppendSeparator();
statbarMenu->Append(StatusBar_Toggle, _T("&Toggle Status Bar"),
_T("Toggle the status bar display"), true);
statbarMenu->Append(StatusBar_Recreate, _T("&Recreate\tCtrl-R"),
_T("Toggle status bar format"));
wxMenu *helpMenu = new wxMenu; wxMenu *helpMenu = new wxMenu;
helpMenu->Append(StatusBar_About, _T("&About...\tCtrl-A"), _T("Show about dialog")); helpMenu->Append(StatusBar_About, _T("&About...\tCtrl-A"), _T("Show about dialog"));
@@ -453,6 +468,26 @@ void MyFrame::OnSetStatusFields(wxCommandEvent& WXUNUSED(event))
} }
} }
void MyFrame::OnUpdateResetFieldsWidth(wxUpdateUIEvent& event)
{
// only allow the settings of the number of status fields for the default
// status bar
wxStatusBar *sb = GetStatusBar();
event.Enable(sb == m_statbarDefault);
}
void MyFrame::OnResetFieldsWidth(wxCommandEvent& WXUNUSED(event))
{
wxStatusBar *pStat = GetStatusBar();
if (pStat)
{
int n = pStat->GetFieldsCount();
pStat->SetStatusWidths(n, NULL);
for (int i=0; i<n; i++)
pStat->SetStatusText("same size", i);
}
}
void MyFrame::OnUpdateStatusBarToggle(wxUpdateUIEvent& event) void MyFrame::OnUpdateStatusBarToggle(wxUpdateUIEvent& event)
{ {
event.Check(GetStatusBar() != NULL); event.Check(GetStatusBar() != NULL);
@@ -619,7 +654,8 @@ MyStatusBar::MyStatusBar(wxWindow *parent)
m_timer.Start(1000); m_timer.Start(1000);
#endif #endif
SetMinHeight(BITMAP_SIZE_Y); SetMinHeight(120);//wxMax(m_statbmp->GetBestSize().GetHeight(),
// m_checkbox->GetBestSize().GetHeight()));
UpdateClock(); UpdateClock();
} }
@@ -638,16 +674,16 @@ MyStatusBar::~MyStatusBar()
#endif #endif
} }
#define BMP_BUTTON_SIZE_X 10
#define BMP_BUTTON_SIZE_Y 10
wxBitmap MyStatusBar::CreateBitmapForButton(bool on) wxBitmap MyStatusBar::CreateBitmapForButton(bool on)
{ {
static const int BMP_BUTTON_SIZE_X = 10; wxBitmap bitmap(BMP_BUTTON_SIZE_X+1, BMP_BUTTON_SIZE_Y+1);
static const int BMP_BUTTON_SIZE_Y = 9;
wxBitmap bitmap(BMP_BUTTON_SIZE_X, BMP_BUTTON_SIZE_Y);
wxMemoryDC dc; wxMemoryDC dc;
dc.SelectObject(bitmap); dc.SelectObject(bitmap);
dc.SetBrush(on ? *wxGREEN_BRUSH : *wxRED_BRUSH); dc.SetBrush(on ? *wxGREEN_BRUSH : *wxRED_BRUSH);
dc.SetBackground(*wxLIGHT_GREY_BRUSH); dc.SetBackgroundMode(wxBRUSHSTYLE_TRANSPARENT);
dc.Clear(); dc.Clear();
dc.DrawEllipse(0, 0, BMP_BUTTON_SIZE_X, BMP_BUTTON_SIZE_Y); dc.DrawEllipse(0, 0, BMP_BUTTON_SIZE_X, BMP_BUTTON_SIZE_Y);
dc.SelectObject(wxNullBitmap); dc.SelectObject(wxNullBitmap);

View File

@@ -71,8 +71,6 @@ void wxStatusBarBase::SetFieldsCount(int number, const int *widths)
{ {
wxCHECK_RET( number > 0, _T("invalid field number in SetFieldsCount") ); wxCHECK_RET( number > 0, _T("invalid field number in SetFieldsCount") );
bool refresh = false;
if ( (size_t)number > m_panes.GetCount() ) if ( (size_t)number > m_panes.GetCount() )
{ {
wxStatusBarPane newPane; wxStatusBarPane newPane;
@@ -88,31 +86,28 @@ void wxStatusBarBase::SetFieldsCount(int number, const int *widths)
m_panes.RemoveAt(number, m_panes.GetCount()-number); m_panes.RemoveAt(number, m_panes.GetCount()-number);
} }
refresh = true; // SetStatusWidths will automatically refresh
if ( widths )
{
SetStatusWidths(number, widths); SetStatusWidths(number, widths);
// already done from SetStatusWidths()
refresh = false;
}
if ( refresh )
Refresh();
} }
void wxStatusBarBase::SetStatusWidths(int WXUNUSED_UNLESS_DEBUG(n), void wxStatusBarBase::SetStatusWidths(int WXUNUSED_UNLESS_DEBUG(n),
const int widths[]) const int widths[])
{ {
wxCHECK_RET( widths, _T("NULL pointer in SetStatusWidths") );
wxASSERT_MSG( (size_t)n == m_panes.GetCount(), _T("field number mismatch") ); wxASSERT_MSG( (size_t)n == m_panes.GetCount(), _T("field number mismatch") );
if (widths == NULL)
{
// special value meaning: override explicit pane widths and make them all
// of the same size
m_bSameWidthForAllPanes = true;
}
else
{
for ( size_t i = 0; i < m_panes.GetCount(); i++ ) for ( size_t i = 0; i < m_panes.GetCount(); i++ )
m_panes[i].nWidth = widths[i]; m_panes[i].nWidth = widths[i];
m_bSameWidthForAllPanes = false; m_bSameWidthForAllPanes = false;
}
// update the display after the widths changed // update the display after the widths changed
Refresh(); Refresh();

View File

@@ -176,24 +176,9 @@ void wxStatusBarGeneric::SetStatusWidths(int n, const int widths_field[])
// only set status widths when n == number of statuswindows // only set status widths when n == number of statuswindows
wxCHECK_RET( (size_t)n == m_panes.GetCount(), _T("status bar field count mismatch") ); wxCHECK_RET( (size_t)n == m_panes.GetCount(), _T("status bar field count mismatch") );
// delete the old widths in any case - this function may be used to reset
// the widths to the default (all equal)
// MBN: this is incompatible with at least wxMSW and wxMAC and not
// documented, but let's keep it for now
m_bSameWidthForAllPanes = true;
// FM: what MBN's comment is saying is that allowing widths_field = NULL
// only for wxStatusBarGeneric is not documented...
// forget the old cached pixel widths // forget the old cached pixel widths
m_widthsAbs.Empty(); m_widthsAbs.Empty();
if ( !widths_field )
{
// not an error, see the comment above
Refresh();
return;
}
wxStatusBarBase::SetStatusWidths(n, widths_field); wxStatusBarBase::SetStatusWidths(n, widths_field);
} }