]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/statusbr.cpp
Add (currently unimplemented) missing wxRegion constructors for wxRegionGeneric.
[wxWidgets.git] / src / generic / statusbr.cpp
index 7e9e7791ff67582fd845ec2b14eeb388e01bd5b6..bd1f7f50a88c76747626995bbb8d7d94b0a388f6 100644 (file)
     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;
@@ -98,20 +103,19 @@ bool wxStatusBarGeneric::Create(wxWindow *parent,
     return true;
 }
 
-
 wxSize wxStatusBarGeneric::DoGetBestSize() const
 {
     int width, height;
+    wxCoord y;
 
     // best width is the width of the parent
     GetParent()->GetClientSize(&width, NULL);
 
-    // best height is as calculated above in Create
+    // best height is as calculated above in Create()
     wxClientDC dc((wxWindow*)this);
     dc.SetFont(GetFont());
-    wxCoord y;
-    dc.GetTextExtent(_T("X"), NULL, &y );
-    height = (int)( (11*y)/10 + 2*GetBorderY());
+    dc.GetTextExtent(_T("X"), NULL, &y);
+    height = (int)((11*y)/10 + 2*GetBorderY());
 
     return wxSize(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,25 +173,12 @@ 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);
 }
 
@@ -200,51 +192,6 @@ bool wxStatusBarGeneric::ShowsSizeGrip() const
     return tlw && !tlw->IsMaximized() && tlw->HasFlag(wxRESIZE_BORDER);
 }
 
-void wxStatusBarGeneric::OnPaint(wxPaintEvent& WXUNUSED(event) )
-{
-    wxPaintDC dc(this);
-
-#ifdef __WXGTK20__
-    // Draw grip first
-    if ( ShowsSizeGrip() )
-    {
-        int width, height;
-        GetClientSize(&width, &height);
-
-        if (GetLayoutDirection() == wxLayout_RightToLeft)
-        {
-            gtk_paint_resize_grip( m_widget->style,
-                               GTKGetDrawingWindow(),
-                               (GtkStateType) GTK_WIDGET_STATE (m_widget),
-                               NULL,
-                               m_widget,
-                               "statusbar",
-                               GDK_WINDOW_EDGE_SOUTH_WEST,
-                               2, 2, height-2, height-4 );
-        }
-        else
-        {
-            gtk_paint_resize_grip( m_widget->style,
-                               GTKGetDrawingWindow(),
-                               (GtkStateType) GTK_WIDGET_STATE (m_widget),
-                               NULL,
-                               m_widget,
-                               "statusbar",
-                               GDK_WINDOW_EDGE_SOUTH_EAST,
-                               width-height-2, 2, height-2, height-4 );
-        }
-    }
-#endif // __WXGTK20__
-
-    if (GetFont().Ok())
-        dc.SetFont(GetFont());
-
-    dc.SetBackgroundMode(wxBRUSHSTYLE_TRANSPARENT);
-
-    for (int i = 0; i < m_nFields; i ++)
-        DrawField(dc, i);
-}
-
 void wxStatusBarGeneric::DrawFieldText(wxDC& dc, int i)
 {
     int leftMargin = 2;
@@ -255,11 +202,10 @@ void wxStatusBarGeneric::DrawFieldText(wxDC& dc, int i)
     wxString text(GetStatusText(i));
 
     wxCoord x = 0, y = 0;
-
     dc.GetTextExtent(text, &x, &y);
 
     int xpos = rect.x + leftMargin;
-    int ypos = (int) (((rect.height - y) / 2 ) + rect.y + 0.5) ;
+    int ypos = (int) (((rect.height - y) / 2 ) + rect.y + 0.5);
 
 #if defined( __WXGTK__ ) || defined(__WXMAC__)
     xpos++;
@@ -278,10 +224,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
@@ -294,7 +237,7 @@ void wxStatusBarGeneric::DrawField(wxDC& dc, int i)
 
         dc.SetPen((style == wxSB_RAISED) ? m_mediumShadowPen : m_hilightPen);
 
-    #ifndef __WXPM__
+#ifndef __WXPM__
 
         // Right and bottom lines
         dc.DrawLine(rect.x + rect.width, rect.y,
@@ -309,7 +252,7 @@ void wxStatusBarGeneric::DrawField(wxDC& dc, int i)
                rect.x, rect.y);
         dc.DrawLine(rect.x, rect.y,
             rect.x + rect.width, rect.y);
-    #else
+#else
 
         dc.DrawLine(rect.x + rect.width, rect.height + 2,
                     rect.x, rect.height + 2);
@@ -328,10 +271,10 @@ void wxStatusBarGeneric::DrawField(wxDC& dc, int i)
     DrawFieldText(dc, i);
 }
 
-  // Get the position and size of the field's internal bounding rectangle
+// 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)
@@ -344,20 +287,17 @@ bool wxStatusBarGeneric::GetFieldRect(int n, wxRect& rect) const
 
     // 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) )
+    if ( m_widthsAbs.IsEmpty() || m_lastClientWidth != width )
     {
-        wxConstCast(this, wxStatusBarGeneric)->
-            m_widthsAbs = CalculateAbsWidths(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;
+        wxConstCast(this, wxStatusBarGeneric)->m_lastClientWidth = width;
     }
 
     rect.x = 0;
     for ( int i = 0; i < n; i++ )
-    {
         rect.x += m_widthsAbs[i];
-    }
 
     rect.x += m_borderX;
     rect.y = m_borderY;
@@ -383,15 +323,6 @@ void wxStatusBarGeneric::InitColours()
 #endif // __WXPM__/!__WXPM__
 }
 
-// Responds to colour changes, and passes event on to children.
-void wxStatusBarGeneric::OnSysColourChanged(wxSysColourChangedEvent& event)
-{
-    InitColours();
-
-    // Propagate the event to the non-top-level children
-    wxWindow::OnSysColourChanged(event);
-}
-
 void wxStatusBarGeneric::SetMinHeight(int height)
 {
     // check that this min height is not less than minimal height for the
@@ -406,6 +337,65 @@ void wxStatusBarGeneric::SetMinHeight(int height)
     }
 }
 
+
+// ----------------------------------------------------------------------------
+// wxStatusBarGeneric - event handlers
+// ----------------------------------------------------------------------------
+
+void wxStatusBarGeneric::OnPaint(wxPaintEvent& WXUNUSED(event) )
+{
+    wxPaintDC dc(this);
+
+#ifdef __WXGTK20__
+    // Draw grip first
+    if ( ShowsSizeGrip() )
+    {
+        int width, height;
+        GetClientSize(&width, &height);
+
+        if (GetLayoutDirection() == wxLayout_RightToLeft)
+        {
+            gtk_paint_resize_grip( m_widget->style,
+                               GTKGetDrawingWindow(),
+                               (GtkStateType) GTK_WIDGET_STATE (m_widget),
+                               NULL,
+                               m_widget,
+                               "statusbar",
+                               GDK_WINDOW_EDGE_SOUTH_WEST,
+                               2, 2, height-2, height-4 );
+        }
+        else
+        {
+            gtk_paint_resize_grip( m_widget->style,
+                               GTKGetDrawingWindow(),
+                               (GtkStateType) GTK_WIDGET_STATE (m_widget),
+                               NULL,
+                               m_widget,
+                               "statusbar",
+                               GDK_WINDOW_EDGE_SOUTH_EAST,
+                               width-height-2, 2, height-2, height-4 );
+        }
+    }
+#endif // __WXGTK20__
+
+    if (GetFont().IsOk())
+        dc.SetFont(GetFont());
+
+    dc.SetBackgroundMode(wxBRUSHSTYLE_TRANSPARENT);
+
+    for (size_t i = 0; i < m_panes.GetCount(); i ++)
+        DrawField(dc, i);
+}
+
+// Responds to colour changes, and passes event on to children.
+void wxStatusBarGeneric::OnSysColourChanged(wxSysColourChangedEvent& event)
+{
+    InitColours();
+
+    // Propagate the event to the non-top-level children
+    wxWindow::OnSysColourChanged(event);
+}
+
 void wxStatusBarGeneric::OnLeftDown(wxMouseEvent& event)
 {
 #ifdef __WXGTK20__