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)
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;
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);
}
{
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];
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];
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);
}
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;
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++;
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
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,
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);
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)
// 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;
#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
}
}
+
+// ----------------------------------------------------------------------------
+// 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__