From bced985eb03eb774a1e5337ed8b1fa7d662d11a3 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Mon, 21 Sep 2009 13:00:23 +0000 Subject: [PATCH] Add a test of precisely sized status bar fields. Modify the status bar sample to use two fields of just the right size for their contents to confirm that this doesn't work correctly under at least MSW currently (see #10696). Notice that we need two fields because the behaviour/problem is different for the last field and all the other ones. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@61991 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- samples/statbar/statbar.cpp | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/samples/statbar/statbar.cpp b/samples/statbar/statbar.cpp index d01af49259..8afb461b09 100644 --- a/samples/statbar/statbar.cpp +++ b/samples/statbar/statbar.cpp @@ -100,6 +100,7 @@ public: #endif void OnSize(wxSizeEvent& event); void OnToggleClock(wxCommandEvent& event); + void OnIdle(wxIdleEvent& event); private: // toggle the state of the status bar controls @@ -110,7 +111,9 @@ private: Field_Text, Field_Checkbox, Field_Bitmap, + Field_NumLockIndicator, Field_Clock, + Field_CapsLockIndicator, Field_Max }; @@ -278,6 +281,7 @@ BEGIN_EVENT_TABLE(MyStatusBar, wxStatusBar) #if wxUSE_TIMER EVT_TIMER(wxID_ANY, MyStatusBar::OnTimer) #endif + EVT_IDLE(MyStatusBar::OnIdle) END_EVENT_TABLE() // Create a new application object: this macro will allow wxWidgets to create @@ -877,6 +881,9 @@ MyAboutDialog::MyAboutDialog(wxWindow *parent) #pragma warning(disable: 4355) #endif +static const char *numlockIndicators[] = { "OFF", "NUM" }; +static const char *capslockIndicators[] = { "", "CAPS" }; + MyStatusBar::MyStatusBar(wxWindow *parent, long style) : wxStatusBar(parent, wxID_ANY, style, "MyStatusBar") #if wxUSE_TIMER @@ -886,7 +893,18 @@ MyStatusBar::MyStatusBar(wxWindow *parent, long style) , m_checkbox(NULL) #endif { - static const int widths[Field_Max] = { -1, 150, BITMAP_SIZE_X, 100 }; + // compute the size needed for num lock indicator pane + wxClientDC dc(this); + wxSize sizeNumLock = dc.GetTextExtent(numlockIndicators[0]); + sizeNumLock.IncTo(dc.GetTextExtent(numlockIndicators[1])); + + int widths[Field_Max]; + widths[Field_Text] = -1; // growable + widths[Field_Checkbox] = 150; + widths[Field_Bitmap] = BITMAP_SIZE_X; + widths[Field_NumLockIndicator] = sizeNumLock.x; + widths[Field_Clock] = 100; + widths[Field_CapsLockIndicator] = dc.GetTextExtent(capslockIndicators[1]).x; SetFieldsCount(Field_Max); SetStatusWidths(Field_Max, widths); @@ -961,6 +979,16 @@ void MyStatusBar::OnToggleClock(wxCommandEvent& WXUNUSED(event)) DoToggle(); } +void MyStatusBar::OnIdle(wxIdleEvent& event) +{ + SetStatusText(numlockIndicators[wxGetKeyState(WXK_NUMLOCK)], + Field_NumLockIndicator); + SetStatusText(capslockIndicators[wxGetKeyState(WXK_CAPITAL)], + Field_CapsLockIndicator); + + event.Skip(); +} + void MyStatusBar::DoToggle() { #if wxUSE_CHECKBOX