X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/390015c0ee28d25b0b7e23c42a52733adcac334f..29281095c4959cbadfcc66efccf679c6c25c7dc7:/src/generic/statusbr.cpp diff --git a/src/generic/statusbr.cpp b/src/generic/statusbr.cpp index c5128995c8..55eb58cc4f 100644 --- a/src/generic/statusbr.cpp +++ b/src/generic/statusbr.cpp @@ -5,11 +5,11 @@ // Modified by: // Created: 01/02/97 // RCS-ID: $Id$ -// Copyright: (c) Julian Smart and Markus Holzem -// Licence: wxWindows license +// Copyright: (c) Julian Smart +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "statusbr.h" #endif @@ -29,6 +29,11 @@ #include "wx/dcclient.h" #endif +#ifdef __WXGTK20__ +#include "wx/gtk/private.h" +#include "wx/gtk/win_gtk.h" +#endif + #include "wx/statusbr.h" // we only have to do it here when we use wxStatusBarGeneric in addition to the @@ -44,8 +49,8 @@ BEGIN_EVENT_TABLE(wxStatusBarGeneric, wxWindow) EVT_PAINT(wxStatusBarGeneric::OnPaint) - EVT_SIZE(wxStatusBarGeneric::OnSize) - + EVT_LEFT_DOWN(wxStatusBarGeneric::OnLeftDown) + EVT_RIGHT_DOWN(wxStatusBarGeneric::OnRightDown) EVT_SYS_COLOUR_CHANGED(wxStatusBarGeneric::OnSysColourChanged) END_EVENT_TABLE() @@ -99,6 +104,8 @@ bool wxStatusBarGeneric::Create(wxWindow *parent, SetSize(-1, -1, -1, height); + SetFieldsCount(1); + return TRUE; } @@ -126,12 +133,16 @@ void wxStatusBarGeneric::SetStatusText(const wxString& text, int number) wxCHECK_RET( (number >= 0) && (number < m_nFields), _T("invalid status bar field index") ); - m_statusStrings[number] = text; + wxString oldText = m_statusStrings[number]; + if (oldText != text) + { + m_statusStrings[number] = text; - wxRect rect; - GetFieldRect(number, rect); + wxRect rect; + GetFieldRect(number, rect); - Refresh( TRUE, &rect ); + Refresh( TRUE, &rect ); + } } wxString wxStatusBarGeneric::GetStatusText(int n) const @@ -168,28 +179,41 @@ void wxStatusBarGeneric::SetStatusWidths(int n, const int widths_field[]) void wxStatusBarGeneric::OnPaint(wxPaintEvent& WXUNUSED(event) ) { - wxPaintDC dc(this); + wxPaintDC dc(this); + +#ifdef __WXGTK20__ + // Draw grip first + if (HasFlag( wxST_SIZEGRIP )) + { + int width, height; + GetClientSize(&width, &height); + + gtk_paint_resize_grip( m_widget->style, + GTK_PIZZA(m_wxwindow)->bin_window, + (GtkStateType) GTK_WIDGET_STATE (m_widget), + NULL, + m_widget, + "statusbar", + GDK_WINDOW_EDGE_SOUTH_EAST, + width-height-2, 1, height-2, height-3 ); + + } +#endif + if (GetFont().Ok()) + dc.SetFont(GetFont()); - int i; - if ( GetFont().Ok() ) - dc.SetFont(GetFont()); dc.SetBackgroundMode(wxTRANSPARENT); #ifdef __WXPM__ - wxColour vColor; + wxColour vColor; vColor = wxSystemSettings::GetColour(wxSYS_COLOUR_MENUBAR); ::WinFillRect(dc.m_hPS, &dc.m_vRclPaint, vColor.GetPixel()); #endif - for ( i = 0; i < m_nFields; i ++ ) - DrawField(dc, i); - - // VZ: again, what is this for? -#ifdef __WXMSW__ - dc.SetFont(wxNullFont); -#endif // MSW + for (int i = 0; i < m_nFields; i ++) + DrawField(dc, i); } void wxStatusBarGeneric::DrawFieldText(wxDC& dc, int i) @@ -222,8 +246,8 @@ void wxStatusBarGeneric::DrawFieldText(wxDC& dc, int i) void wxStatusBarGeneric::DrawField(wxDC& dc, int i) { - wxRect rect; - GetFieldRect(i, rect); + wxRect rect; + GetFieldRect(i, rect); // Draw border // Have grey background, plus 3-d border - @@ -280,12 +304,15 @@ bool wxStatusBarGeneric::GetFieldRect(int n, wxRect& rect) const GetClientSize(&width, &height); #endif - // we cache m_widthsAbs between calls normally but it's cleared when the - // status widths change so recompute it if needed - if ( m_widthsAbs.IsEmpty() ) + // we cache m_widthsAbs between calls and recompute it if client + // width has changed (or when it is initially empty) + if ( m_widthsAbs.IsEmpty() || (m_lastClientWidth != width) ) { wxConstCast(this, wxStatusBarGeneric)-> m_widthsAbs = CalculateAbsWidths(width); + // remember last width for which we have recomputed the widths in pixels + wxConstCast(this, wxStatusBarGeneric)-> + m_lastClientWidth = width; } rect.x = 0; @@ -307,7 +334,7 @@ bool wxStatusBarGeneric::GetFieldRect(int n, wxRect& rect) const void wxStatusBarGeneric::InitColours() { // Shadow colours -#if defined(__WIN95__) +#if defined(__WIN95__) || defined(__WXMAC__) wxColour mediumShadowColour(wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW)); m_mediumShadowPen = wxPen(mediumShadowColour, 1, wxSOLID); @@ -351,7 +378,7 @@ void wxStatusBarGeneric::SetMinHeight(int height) // current font wxClientDC dc(this); wxCoord y; - dc.GetTextExtent( _T("X"), NULL, &y ); + dc.GetTextExtent( wxT("X"), NULL, &y ); if ( height > (11*y)/10 ) { @@ -359,12 +386,73 @@ void wxStatusBarGeneric::SetMinHeight(int height) } } -void wxStatusBarGeneric::OnSize(wxSizeEvent& event) +void wxStatusBarGeneric::OnLeftDown(wxMouseEvent& event) { - // have to recompute the widths in pixels - m_widthsAbs.Empty(); +#ifdef __WXGTK20__ + int width, height; + GetClientSize(&width, &height); + + if (HasFlag( wxST_SIZEGRIP ) && (event.GetX() > width-height)) + { + GtkWidget *ancestor = gtk_widget_get_toplevel( m_widget ); - event.Skip(); + if (!GTK_IS_WINDOW (ancestor)) + return; + + GdkWindow *source = GTK_PIZZA(m_wxwindow)->bin_window; + + int org_x = 0; + int org_y = 0; + gdk_window_get_origin( source, &org_x, &org_y ); + + gtk_window_begin_resize_drag (GTK_WINDOW (ancestor), + GDK_WINDOW_EDGE_SOUTH_EAST, + 1, + org_x + event.GetX(), + org_y + event.GetY(), + 0); + } + else + { + event.Skip( TRUE ); + } +#else + event.Skip( TRUE ); +#endif +} + +void wxStatusBarGeneric::OnRightDown(wxMouseEvent& event) +{ +#ifdef __WXGTK20__ + int width, height; + GetClientSize(&width, &height); + + if (HasFlag( wxST_SIZEGRIP ) && (event.GetX() > width-height)) + { + GtkWidget *ancestor = gtk_widget_get_toplevel( m_widget ); + + if (!GTK_IS_WINDOW (ancestor)) + return; + + GdkWindow *source = GTK_PIZZA(m_wxwindow)->bin_window; + + int org_x = 0; + int org_y = 0; + gdk_window_get_origin( source, &org_x, &org_y ); + + gtk_window_begin_move_drag (GTK_WINDOW (ancestor), + 2, + org_x + event.GetX(), + org_y + event.GetY(), + 0); + } + else + { + event.Skip( TRUE ); + } +#else + event.Skip( TRUE ); +#endif } #endif // wxUSE_STATUSBAR