X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c94bdf2a19b4a3f5d958f491814a383ac7ef4ffb..8f71e657f32c352ce11d05902bbd60f428249687:/src/generic/statusbr.cpp diff --git a/src/generic/statusbr.cpp b/src/generic/statusbr.cpp index 2af087cb6b..7dc2839535 100644 --- a/src/generic/statusbr.cpp +++ b/src/generic/statusbr.cpp @@ -53,13 +53,14 @@ // GTK+ signal handler // ---------------------------------------------------------------------------- -#if defined( __WXGTK20__ ) && GTK_CHECK_VERSION(2,12,0) +#if defined( __WXGTK20__ ) +#if GTK_CHECK_VERSION(2,12,0) extern "C" { static -gboolean statusbar_query_tooltip(GtkWidget *widget, +gboolean statusbar_query_tooltip(GtkWidget* WXUNUSED(widget), gint x, gint y, - gboolean keyboard_mode, + gboolean WXUNUSED(keyboard_mode), GtkTooltip *tooltip, wxStatusBar* statbar) { @@ -71,11 +72,16 @@ gboolean statusbar_query_tooltip(GtkWidget *widget, if (!statbar->GetField(n).IsEllipsized()) return FALSE; // no, it's not useful - gtk_tooltip_set_text(tooltip, wxGTK_CONV_SYS(statbar->GetStatusText(n))); + const wxString& str = statbar->GetStatusText(n); + if (str.empty()) + return FALSE; + + gtk_tooltip_set_text(tooltip, wxGTK_CONV_SYS(str)); return TRUE; } } #endif +#endif // ---------------------------------------------------------------------------- // wxStatusBarGeneric @@ -123,14 +129,16 @@ bool wxStatusBarGeneric::Create(wxWindow *parent, SetSize(wxDefaultCoord, wxDefaultCoord, wxDefaultCoord, height); SetFieldsCount(1); - -#if defined( __WXGTK20__ ) && GTK_CHECK_VERSION(2,12,0) - if (HasFlag(wxST_SHOW_TIPS) && !gtk_check_version(2,12,0)) + +#if defined( __WXGTK20__ ) +#if GTK_CHECK_VERSION(2,12,0) + if (HasFlag(wxSTB_SHOW_TIPS) && !gtk_check_version(2,12,0)) { - g_object_set(m_widget, "has-tooltip", TRUE, NULL); - g_signal_connect(m_widget, "query-tooltip", - G_CALLBACK(statusbar_query_tooltip), this); + g_object_set(m_widget, "has-tooltip", TRUE, NULL); + g_signal_connect(m_widget, "query-tooltip", + G_CALLBACK(statusbar_query_tooltip), this); } +#endif #endif return true; @@ -152,53 +160,41 @@ wxSize wxStatusBarGeneric::DoGetBestSize() const return wxSize(width, height); } -void wxStatusBarGeneric::SetFieldsCount(int number, const int *widths) -{ - wxASSERT_MSG( number >= 0, _T("negative number of fields in wxStatusBar?") ); - - // this will result in a call to SetStatusWidths() and thus an update to our - // m_widthsAbs cache - wxStatusBarBase::SetFieldsCount(number, widths); -} - -void wxStatusBarGeneric::SetStatusText(const wxString& text, int number) +void wxStatusBarGeneric::DoUpdateStatusText(int number) { - wxCHECK_RET( (number >= 0) && ((size_t)number < m_panes.GetCount()), - _T("invalid status bar field index") ); - - wxString oldText = GetStatusText(number); - if (oldText != text) - { - wxStatusBarBase::SetStatusText(text, number); - - wxRect rect; - GetFieldRect(number, rect); + wxRect rect; + GetFieldRect(number, rect); - Refresh(true, &rect); + Refresh(true, &rect); - // it's common to show some text in the status bar before starting a - // relatively lengthy operation, ensure that the text is shown to the - // user immediately and not after the lengthy operation end - Update(); - } + // it's common to show some text in the status bar before starting a + // relatively lengthy operation, ensure that the text is shown to the + // user immediately and not after the lengthy operation end + Update(); } void wxStatusBarGeneric::SetStatusWidths(int n, const int widths_field[]) { // 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(), wxT("status bar field count mismatch") ); 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 { - if ( !HasFlag(wxST_SIZEGRIP) ) + if ( !HasFlag(wxSTB_SIZEGRIP) ) return false; wxTopLevelWindow * const @@ -238,16 +234,34 @@ void wxStatusBarGeneric::DrawFieldText(wxDC& dc, const wxRect& rect, int i, int } // eventually ellipsize the text so that it fits the field width - text = wxControl::Ellipsize( - text, dc, - GetLayoutDirection() == wxLayout_RightToLeft ? wxELLIPSIZE_START : wxELLIPSIZE_END, - maxWidth, - wxELLIPSIZE_EXPAND_TAB); - // Ellipsize() will do something only if necessary - // update the ellipsization status for this pane; this is used to decide - // whether a tooltip should be shown or not for this pane - SetEllipsizedFlag(i, text != GetStatusText(i)); + wxEllipsizeMode ellmode = (wxEllipsizeMode)-1; + if (HasFlag(wxSTB_ELLIPSIZE_START)) ellmode = wxELLIPSIZE_START; + else if (HasFlag(wxSTB_ELLIPSIZE_MIDDLE)) ellmode = wxELLIPSIZE_MIDDLE; + else if (HasFlag(wxSTB_ELLIPSIZE_END)) ellmode = wxELLIPSIZE_END; + + if (ellmode == (wxEllipsizeMode)-1) + { + // if we have the wxSTB_SHOW_TIPS we must set the ellipsized flag even if + // we don't ellipsize the text but just truncate it + if (HasFlag(wxSTB_SHOW_TIPS)) + SetEllipsizedFlag(i, dc.GetTextExtent(text).GetWidth() > maxWidth); + + dc.SetClippingRegion(rect); + } + else + { + text = wxControl::Ellipsize(text, dc, + ellmode, + maxWidth, + wxELLIPSIZE_FLAGS_EXPAND_TABS); + // Ellipsize() will do something only if necessary + + // update the ellipsization status for this pane; this is used later to + // decide whether a tooltip should be shown or not for this pane + // (if we have wxSTB_SHOW_TIPS) + SetEllipsizedFlag(i, text != GetStatusText(i)); + } #if defined( __WXGTK__ ) || defined(__WXMAC__) xpos++; @@ -256,6 +270,9 @@ void wxStatusBarGeneric::DrawFieldText(wxDC& dc, const wxRect& rect, int i, int // draw the text dc.DrawText(text, xpos, ypos); + + if (ellmode == (wxEllipsizeMode)-1) + dc.DestroyClippingRegion(); } void wxStatusBarGeneric::DrawField(wxDC& dc, int i, int textHeight) @@ -264,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) @@ -312,7 +329,17 @@ void wxStatusBarGeneric::DrawField(wxDC& dc, int i, int textHeight) bool wxStatusBarGeneric::GetFieldRect(int n, wxRect& rect) const { wxCHECK_MSG( (n >= 0) && ((size_t)n < m_panes.GetCount()), false, - _T("invalid status bar field index") ); + 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; @@ -324,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; } @@ -334,10 +361,10 @@ int wxStatusBarGeneric::GetFieldFromPoint(const wxPoint& pt) const if (m_widthsAbs.IsEmpty()) return wxNOT_FOUND; - // NOTE: we explicitely don't take in count the borders since they are only + // 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; @@ -345,7 +372,7 @@ int wxStatusBarGeneric::GetFieldFromPoint(const wxPoint& pt) const { if (pt.x > x && pt.x < x+m_widthsAbs[i]) return i; - + x += m_widthsAbs[i]; } @@ -403,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", @@ -514,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