// 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
#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
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()
SetSize(-1, -1, -1, height);
+ SetFieldsCount(1);
+
return TRUE;
}
+
+wxSize wxStatusBarGeneric::DoGetBestSize() const
+{
+ int width, height;
+
+ // best width is the width of the parent
+ GetParent()->GetClientSize(&width, NULL);
+
+ // 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());
+
+ return wxSize(width, height);
+}
+
void wxStatusBarGeneric::SetFieldsCount(int number, const int *widths)
{
wxASSERT_MSG( number >= 0, _T("negative number of fields in wxStatusBar?") );
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
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)
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 -
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;
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);
// current font
wxClientDC dc(this);
wxCoord y;
- dc.GetTextExtent( _T("X"), NULL, &y );
+ dc.GetTextExtent( wxT("X"), NULL, &y );
if ( height > (11*y)/10 )
{
}
}
-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 );
+
+ 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
+}
- event.Skip();
+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