X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/01399dcd57e3bbbd05237451387e70d07a07aab4..9b66a1d31a32e9235792261db6ff755ce26ab5c1:/src/generic/statusbr.cpp?ds=inline diff --git a/src/generic/statusbr.cpp b/src/generic/statusbr.cpp index 44fa9ad078..77616a02f1 100644 --- a/src/generic/statusbr.cpp +++ b/src/generic/statusbr.cpp @@ -23,11 +23,11 @@ #ifndef WX_PRECOMP #include "wx/settings.h" #include "wx/dcclient.h" + #include "wx/toplevel.h" #endif #ifdef __WXGTK20__ #include - #include "wx/gtk/win_gtk.h" #endif // we only have to do it here when we use wxStatusBarGeneric in addition to the @@ -41,6 +41,14 @@ IMPLEMENT_DYNAMIC_CLASS(wxStatusBarGeneric, wxWindow) #endif // wxUSE_NATIVE_STATUSBAR +// Default status border dimensions +#define wxTHICK_LINE_BORDER 2 + + +// ---------------------------------------------------------------------------- +// wxStatusBarGeneric +// ---------------------------------------------------------------------------- + BEGIN_EVENT_TABLE(wxStatusBarGeneric, wxWindow) EVT_PAINT(wxStatusBarGeneric::OnPaint) EVT_LEFT_DOWN(wxStatusBarGeneric::OnLeftDown) @@ -48,9 +56,6 @@ BEGIN_EVENT_TABLE(wxStatusBarGeneric, wxWindow) EVT_SYS_COLOUR_CHANGED(wxStatusBarGeneric::OnSysColourChanged) END_EVENT_TABLE() -// Default status border dimensions -#define wxTHICK_LINE_BORDER 2 - void wxStatusBarGeneric::Init() { m_borderX = wxTHICK_LINE_BORDER; @@ -81,14 +86,14 @@ bool wxStatusBarGeneric::Create(wxWindow *parent, SetFont(*wxSMALL_FONT); #endif - wxCoord y; - { - // Set the height according to the font and the border size - wxClientDC dc(this); - dc.SetFont(GetFont()); + wxCoord y; + { + // Set the height according to the font and the border size + wxClientDC dc(this); + dc.SetFont(GetFont()); - dc.GetTextExtent(_T("X"), NULL, &y ); - } + dc.GetTextExtent(_T("X"), NULL, &y ); + } int height = (int)( (11*y)/10 + 2*GetBorderY()); SetSize(wxDefaultCoord, wxDefaultCoord, wxDefaultCoord, height); @@ -98,7 +103,6 @@ bool wxStatusBarGeneric::Create(wxWindow *parent, return true; } - wxSize wxStatusBarGeneric::DoGetBestSize() const { int width, height; @@ -120,25 +124,26 @@ void wxStatusBarGeneric::SetFieldsCount(int number, const int *widths) { wxASSERT_MSG( number >= 0, _T("negative number of fields in wxStatusBar?") ); - int i; - for(i = m_nFields; i < number; ++i) + // enlarge the m_statusStrings array if needed: + for (size_t i = m_panes.GetCount(); i < (size_t)number; ++i) m_statusStrings.Add( wxEmptyString ); - for (i = m_nFields - 1; i >= number; --i) - m_statusStrings.RemoveAt(i); + // shrink the m_statusStrings array if needed: + for (int j = (int)m_panes.GetCount() - 1; j >= number; --j) + m_statusStrings.RemoveAt(j); // forget the old cached pixel widths m_widthsAbs.Empty(); wxStatusBarBase::SetFieldsCount(number, widths); - wxASSERT_MSG( m_nFields == (int)m_statusStrings.GetCount(), - _T("This really should never happen, can we do away with m_nFields here?") ); + wxASSERT_MSG( m_panes.GetCount() == m_statusStrings.GetCount(), + _T("This really should never happen, can we do away with m_panes.GetCount() here?") ); } void wxStatusBarGeneric::SetStatusText(const wxString& text, int number) { - wxCHECK_RET( (number >= 0) && (number < m_nFields), + wxCHECK_RET( (number >= 0) && ((size_t)number < m_panes.GetCount()), _T("invalid status bar field index") ); wxString oldText = m_statusStrings[number]; @@ -160,7 +165,7 @@ void wxStatusBarGeneric::SetStatusText(const wxString& text, int number) wxString wxStatusBarGeneric::GetStatusText(int n) const { - wxCHECK_MSG( (n >= 0) && (n < m_nFields), wxEmptyString, + wxCHECK_MSG( (n >= 0) && ((size_t)n < m_panes.GetCount()), wxEmptyString, _T("invalid status bar field index") ); return m_statusStrings[n]; @@ -168,43 +173,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 - 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) - // MBN: this is incompatible with at least wxMSW and wxMAC and not - // documented, but let's keep it for now - ReinitWidths(); + // only set status widths when n == number of statuswindows + wxCHECK_RET( (size_t)n == m_panes.GetCount(), _T("status bar field count mismatch") ); // forget the old cached pixel widths m_widthsAbs.Empty(); - if ( !widths_field ) - { - // not an error, see the comment above - Refresh(); - return; - } - wxStatusBarBase::SetStatusWidths(n, widths_field); } +bool wxStatusBarGeneric::ShowsSizeGrip() const +{ + if ( !HasFlag(wxST_SIZEGRIP) ) + return false; + + wxTopLevelWindow * const + tlw = wxDynamicCast(wxGetTopLevelParent(GetParent()), wxTopLevelWindow); + return tlw && !tlw->IsMaximized() && tlw->HasFlag(wxRESIZE_BORDER); +} + void wxStatusBarGeneric::OnPaint(wxPaintEvent& WXUNUSED(event) ) { wxPaintDC dc(this); #ifdef __WXGTK20__ // Draw grip first - if (HasFlag( wxST_SIZEGRIP )) + if ( ShowsSizeGrip() ) { int width, height; GetClientSize(&width, &height); - + if (GetLayoutDirection() == wxLayout_RightToLeft) { gtk_paint_resize_grip( m_widget->style, - GTK_PIZZA(m_wxwindow)->bin_window, + GTKGetDrawingWindow(), (GtkStateType) GTK_WIDGET_STATE (m_widget), NULL, m_widget, @@ -215,7 +217,7 @@ void wxStatusBarGeneric::OnPaint(wxPaintEvent& WXUNUSED(event) ) else { gtk_paint_resize_grip( m_widget->style, - GTK_PIZZA(m_wxwindow)->bin_window, + GTKGetDrawingWindow(), (GtkStateType) GTK_WIDGET_STATE (m_widget), NULL, m_widget, @@ -224,21 +226,14 @@ void wxStatusBarGeneric::OnPaint(wxPaintEvent& WXUNUSED(event) ) width-height-2, 2, height-2, height-4 ); } } -#endif +#endif // __WXGTK20__ if (GetFont().Ok()) dc.SetFont(GetFont()); - dc.SetBackgroundMode(wxTRANSPARENT); + dc.SetBackgroundMode(wxBRUSHSTYLE_TRANSPARENT); -#ifdef __WXPM__ - wxColour vColor; - - vColor = wxSystemSettings::GetColour(wxSYS_COLOUR_MENUBAR); - ::WinFillRect(dc.m_hPS, &dc.m_vRclPaint, vColor.GetPixel()); -#endif - - for (int i = 0; i < m_nFields; i ++) + for (size_t i = 0; i < m_panes.GetCount(); i ++) DrawField(dc, i); } @@ -275,10 +270,7 @@ void wxStatusBarGeneric::DrawField(wxDC& dc, int i) wxRect rect; GetFieldRect(i, rect); - int style = wxSB_NORMAL; - if (m_statusStyles) - style = m_statusStyles[i]; - + int style = m_panes[i].nStyle; if (style != wxSB_FLAT) { // Draw border @@ -328,7 +320,7 @@ void wxStatusBarGeneric::DrawField(wxDC& dc, int i) // Get the position and size of the field's internal bounding rectangle bool wxStatusBarGeneric::GetFieldRect(int n, wxRect& rect) const { - wxCHECK_MSG( (n >= 0) && (n < m_nFields), false, + wxCHECK_MSG( (n >= 0) && ((size_t)n < m_panes.GetCount()), false, _T("invalid status bar field index") ); // FIXME: workarounds for OS/2 bugs have nothing to do here (VZ) @@ -368,23 +360,16 @@ bool wxStatusBarGeneric::GetFieldRect(int n, wxRect& rect) const // Initialize colours void wxStatusBarGeneric::InitColours() { - // Shadow colours -#if defined(__WXMSW__) || defined(__WXMAC__) - wxColour mediumShadowColour(wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW)); - m_mediumShadowPen = wxPen(mediumShadowColour, 1, wxSOLID); - - wxColour hilightColour(wxSystemSettings::GetColour(wxSYS_COLOUR_3DHILIGHT)); - m_hilightPen = wxPen(hilightColour, 1, wxSOLID); -#elif defined(__WXPM__) +#if defined(__WXPM__) m_mediumShadowPen = wxPen(wxColour(127, 127, 127), 1, wxSOLID); m_hilightPen = *wxWHITE_PEN; SetBackgroundColour(*wxLIGHT_GREY); SetForegroundColour(*wxBLACK); -#else - m_mediumShadowPen = *wxGREY_PEN; - m_hilightPen = *wxWHITE_PEN; -#endif +#else // !__WXPM__ + m_mediumShadowPen = wxPen(wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW)); + m_hilightPen = wxPen(wxSystemSettings::GetColour(wxSYS_COLOUR_3DHILIGHT)); +#endif // __WXPM__/!__WXPM__ } // Responds to colour changes, and passes event on to children. @@ -416,14 +401,14 @@ void wxStatusBarGeneric::OnLeftDown(wxMouseEvent& event) int width, height; GetClientSize(&width, &height); - if (HasFlag( wxST_SIZEGRIP ) && (event.GetX() > width-height)) + if ( ShowsSizeGrip() && (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; + GdkWindow *source = GTKGetDrawingWindow(); int org_x = 0; int org_y = 0; @@ -463,14 +448,14 @@ void wxStatusBarGeneric::OnRightDown(wxMouseEvent& event) int width, height; GetClientSize(&width, &height); - if (HasFlag( wxST_SIZEGRIP ) && (event.GetX() > width-height)) + if ( ShowsSizeGrip() && (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; + GdkWindow *source = GTKGetDrawingWindow(); int org_x = 0; int org_y = 0;