X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4c51a665c649f7579fb39e62070cef4f66b3210d..268fba466fe490eea7eba5b426a221fee5e57b8e:/src/generic/statusbr.cpp diff --git a/src/generic/statusbr.cpp b/src/generic/statusbr.cpp index 691cd520e1..7dc2839535 100644 --- a/src/generic/statusbr.cpp +++ b/src/generic/statusbr.cpp @@ -181,9 +181,15 @@ void wxStatusBarGeneric::SetStatusWidths(int n, const int widths_field[]) wxStatusBarBase::SetStatusWidths(n, widths_field); // update cache - int width; - GetClientSize(&width, &m_lastClientHeight); - m_widthsAbs = CalculateAbsWidths(width); + DoUpdateFieldWidths(); +} + +void wxStatusBarGeneric::DoUpdateFieldWidths() +{ + m_lastClientSize = GetClientSize(); + + // recompute the cache of the field widths if the status bar width has changed + m_widthsAbs = CalculateAbsWidths(m_lastClientSize.x); } bool wxStatusBarGeneric::ShowsSizeGrip() const @@ -275,7 +281,7 @@ void wxStatusBarGeneric::DrawField(wxDC& dc, int i, int textHeight) GetFieldRect(i, rect); if (rect.GetWidth() <= 0) - return; // happens when the status bar is shrinked in a very small area! + return; // happens when the status bar is shrunk in a very small area! int style = m_panes[i].GetStyle(); if (style != wxSB_FLAT) @@ -325,6 +331,16 @@ bool wxStatusBarGeneric::GetFieldRect(int n, wxRect& rect) const wxCHECK_MSG( (n >= 0) && ((size_t)n < m_panes.GetCount()), false, wxT("invalid status bar field index") ); + // We can be called from the user-defined EVT_SIZE handler in which case + // the widths haven't been updated yet and we need to do it now. This is + // not very efficient as we keep testing the size but there is no other way + // to make the code needing the up-to-date fields sizes in its EVT_SIZE to + // work. + if ( GetClientSize().x != m_lastClientSize.x ) + { + const_cast(this)->DoUpdateFieldWidths(); + } + if (m_widthsAbs.IsEmpty()) return false; @@ -335,7 +351,7 @@ bool wxStatusBarGeneric::GetFieldRect(int n, wxRect& rect) const rect.y = m_borderY; rect.width = m_widthsAbs[n] - 2*m_borderX; - rect.height = m_lastClientHeight - 2*m_borderY; + rect.height = m_lastClientSize.y - 2*m_borderY; return true; } @@ -348,7 +364,7 @@ int wxStatusBarGeneric::GetFieldFromPoint(const wxPoint& pt) const // NOTE: we explicitly don't take in count the borders since they are only // useful when rendering the status text, not for hit-test computations - if (pt.y <= 0 || pt.y >= m_lastClientHeight) + if (pt.y <= 0 || pt.y >= m_lastClientSize.y) return wxNOT_FOUND; int x = 0; @@ -414,9 +430,9 @@ void wxStatusBarGeneric::OnPaint(wxPaintEvent& WXUNUSED(event) ) GdkWindowEdge edge = GetLayoutDirection() == wxLayout_RightToLeft ? GDK_WINDOW_EDGE_SOUTH_WEST : GDK_WINDOW_EDGE_SOUTH_EAST; - gtk_paint_resize_grip( m_widget->style, + gtk_paint_resize_grip(gtk_widget_get_style(m_widget), GTKGetDrawingWindow(), - (GtkStateType) GTK_WIDGET_STATE (m_widget), + gtk_widget_get_state(m_widget), NULL, m_widget, "statusbar", @@ -525,18 +541,11 @@ void wxStatusBarGeneric::OnRightDown(wxMouseEvent& event) #endif } -void wxStatusBarGeneric::OnSize(wxSizeEvent& WXUNUSED(event)) +void wxStatusBarGeneric::OnSize(wxSizeEvent& event) { - // FIXME: workarounds for OS/2 bugs have nothing to do here (VZ) - int width; -#ifdef __WXPM__ - GetSize(&width, &m_lastClientHeight); -#else - GetClientSize(&width, &m_lastClientHeight); -#endif + DoUpdateFieldWidths(); - // recompute the cache of the field widths if the status bar width has changed - m_widthsAbs = CalculateAbsWidths(width); + event.Skip(); } #endif // wxUSE_STATUSBAR