From 633d67bb494d556fb1793e48fa54c90952bf063a Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Wed, 9 Feb 2000 18:23:37 +0000 Subject: [PATCH] fixed fatal bug in wxStatusBar::SetFieldsCount(), added demo of it to the sample git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@5931 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- samples/statbar/statbar.cpp | 58 ++++++++++++++++++++++++++------ src/generic/statusbr.cpp | 66 +++++++++++++++++++++---------------- 2 files changed, 86 insertions(+), 38 deletions(-) diff --git a/samples/statbar/statbar.cpp b/samples/statbar/statbar.cpp index ca2cfcda3e..96b55de7b8 100644 --- a/samples/statbar/statbar.cpp +++ b/samples/statbar/statbar.cpp @@ -44,6 +44,7 @@ #include "wx/statbmp.h" #include "wx/menu.h" #include "wx/msgdlg.h" + #include "wx/textdlg.h" #endif #include "wx/datetime.h" @@ -82,6 +83,7 @@ public: void UpdateClock(); // event handlers + void OnTimer(wxTimerEvent& event) { UpdateClock(); } void OnSize(wxSizeEvent& event); void OnToggleClock(wxCommandEvent& event); @@ -95,16 +97,7 @@ private: Field_Max }; - class MyTimer : public wxTimer - { - public: - MyTimer(MyStatusBar *statbar) {m_statbar = statbar; } - - virtual void Notify() { m_statbar->UpdateClock(); } - - private: - MyStatusBar *m_statbar; - } m_timer; + wxTimer m_timer; wxCheckBox *m_checkbox; wxStaticBitmap *m_statbmp; @@ -123,6 +116,8 @@ public: // event handlers (these functions should _not_ be virtual) void OnQuit(wxCommandEvent& event); void OnAbout(wxCommandEvent& event); + + void OnSetStatusFields(wxCommandEvent& event); void OnRecreateStatusBar(wxCommandEvent& event); private: @@ -151,6 +146,7 @@ enum { // menu items StatusBar_Quit = 1, + StatusBar_SetFields, StatusBar_Recreate, StatusBar_About, StatusBar_Checkbox = 1000 @@ -168,6 +164,7 @@ static const int BITMAP_SIZE_Y = 15; // simple menu events like this the static method is much simpler. BEGIN_EVENT_TABLE(MyFrame, wxFrame) EVT_MENU(StatusBar_Quit, MyFrame::OnQuit) + EVT_MENU(StatusBar_SetFields, MyFrame::OnSetStatusFields) EVT_MENU(StatusBar_Recreate, MyFrame::OnRecreateStatusBar) EVT_MENU(StatusBar_About, MyFrame::OnAbout) END_EVENT_TABLE() @@ -175,6 +172,7 @@ END_EVENT_TABLE() BEGIN_EVENT_TABLE(MyStatusBar, wxStatusBar) EVT_SIZE(MyStatusBar::OnSize) EVT_CHECKBOX(StatusBar_Checkbox, MyStatusBar::OnToggleClock) + EVT_TIMER(-1, MyStatusBar::OnTimer) END_EVENT_TABLE() // Create a new application object: this macro will allow wxWindows to create @@ -231,6 +229,8 @@ MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size) menuFile->Append(StatusBar_Quit, "E&xit\tAlt-X", "Quit this program"); wxMenu *statbarMenu = new wxMenu; + statbarMenu->Append(StatusBar_SetFields, "&Set field count\tCtrl-C", + "Set the number of status bar fields"); statbarMenu->Append(StatusBar_Recreate, "&Recreate\tCtrl-R", "Toggle status bar format"); @@ -294,6 +294,44 @@ void MyFrame::DoCreateStatusBar(MyFrame::StatBarKind kind) } // event handlers +void MyFrame::OnSetStatusFields(wxCommandEvent& WXUNUSED(event)) +{ + wxStatusBar *sb = GetStatusBar(); + + long nFields = wxGetNumberFromUser + ( + "Select the number of fields in the status bar", + "Fields:", + "wxWindows statusbar sample", + sb->GetFieldsCount(), + 1, 5, + this + ); + + // we don't check if the number changed at all on purpose: calling + // SetFieldsCount() with the same number of fields should be ok + if ( nFields != -1 ) + { + // we set the widths only for 2 of them, otherwise let all the fields + // have equal width (the default behaviour) + const int *widths = NULL; + if ( nFields == 2 ) + { + static const int widthsFor2Fields[2] = { 200, -1 }; + widths = widthsFor2Fields; + } + + sb->SetFieldsCount(nFields, widths); + + wxLogStatus(this, + wxString::Format("Status bar now has %ld fields", nFields)); + } + else + { + wxLogStatus(this, "Cancelled"); + } +} + void MyFrame::OnRecreateStatusBar(wxCommandEvent& WXUNUSED(event)) { DoCreateStatusBar(m_statbarKind == StatBar_Custom ? StatBar_Default diff --git a/src/generic/statusbr.cpp b/src/generic/statusbr.cpp index ac3656e433..753ff1677b 100644 --- a/src/generic/statusbr.cpp +++ b/src/generic/statusbr.cpp @@ -98,32 +98,31 @@ bool wxStatusBarGeneric::Create(wxWindow *parent, void wxStatusBarGeneric::SetFieldsCount(int number, const int *widths) { - m_nFields = number; - - if ( m_statusWidths ) - delete[] m_statusWidths; + if ( number != m_nFields ) + { + m_nFields = number; - if ( m_statusStrings ) delete[] m_statusStrings; + m_statusStrings = new wxString[number]; - m_statusStrings = new wxString[number]; - - int i; - for (i = 0; i < number; i++) - m_statusStrings[i] = ""; +#if 0 // VZ: what is this for? + int i; + for (i = 0; i < number; i++) + m_statusStrings[i] = ""; +#endif + } - if ( widths ) - SetStatusWidths(number, widths); + SetStatusWidths(number, widths); } void wxStatusBarGeneric::SetStatusText(const wxString& text, int number) { - if ((number < 0) || (number >= m_nFields)) - return; + wxCHECK_RET( (number >= 0) && (number < m_nFields), + _T("invalid status bar field index") ); - m_statusStrings[number] = text; + m_statusStrings[number] = text; - Refresh(); + Refresh(); } wxString wxStatusBarGeneric::GetStatusText(int n) const @@ -136,29 +135,40 @@ wxString wxStatusBarGeneric::GetStatusText(int n) const void wxStatusBarGeneric::SetStatusWidths(int n, const int widths_field[]) { - // only set status widths, when n == number of statuswindows - if (n == m_nFields) - { - // only set status widths, + // only set status widths, when n == number of statuswindows + wxCHECK_RET( n == m_nFields, _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) + delete [] m_statusWidths; + + if ( !widths_field ) + { + // not an error, see the comment above + m_statusWidths = (int *)NULL; + + return; + } + + int i; + + // VZ: this doesn't do anything as is_variable is unused later +#if 0 // when one window (minimum) is variable (width <= 0) bool is_variable = FALSE; - int i; for (i = 0; i < m_nFields; i++) { - if (widths_field[i] <= 0) is_variable = TRUE; + if (widths_field[i] <= 0) + is_variable = TRUE; } - - // if there are old widths, delete them - if (m_statusWidths) - delete [] m_statusWidths; +#endif // 0 // set widths m_statusWidths = new int[n]; for (i = 0; i < m_nFields; i++) { - m_statusWidths[i] = widths_field[i]; + m_statusWidths[i] = widths_field[i]; } - } } void wxStatusBarGeneric::OnPaint(wxPaintEvent& WXUNUSED(event) ) -- 2.45.2