]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/statusbr.cpp
compilation fix for old SDKs (VC6...) which don't define HDM_SETBITMAPMARGIN/Header_S...
[wxWidgets.git] / src / generic / statusbr.cpp
index 44fa9ad078fb59cf9a70dfd961f9f6bd4e9f64dd..77616a02f1f506e55f068d46e748f3ba20c76a71 100644 (file)
 #ifndef WX_PRECOMP
     #include "wx/settings.h"
     #include "wx/dcclient.h"
+    #include "wx/toplevel.h"
 #endif
 
 #ifdef __WXGTK20__
     #include <gtk/gtk.h>
-    #include "wx/gtk/win_gtk.h"
 #endif
 
 // we only have to do it here when we use wxStatusBarGeneric in addition to the
     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;