#if wxUSE_STATUSBAR
+#include "wx/statusbr.h"
+
#ifndef WX_PRECOMP
- #include "wx/frame.h"
#include "wx/settings.h"
#include "wx/dcclient.h"
+ #include "wx/toplevel.h"
#endif
#ifdef __WXGTK20__
-#include "wx/gtk/private.h"
-#include "wx/gtk/win_gtk.h"
+ #include <gtk/gtk.h>
#endif
-#include "wx/statusbr.h"
-
// we only have to do it here when we use wxStatusBarGeneric in addition to the
// standard wxStatusBar class, if wxStatusBarGeneric is the same as
// wxStatusBar, then the corresponding IMPLEMENT_DYNAMIC_CLASS is already in
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;
long style,
const wxString& name)
{
+ style |= wxTAB_TRAVERSAL | wxFULL_REPAINT_ON_RESIZE;
if ( !wxWindow::Create(parent, id,
wxDefaultPosition, wxDefaultSize,
- style | wxTAB_TRAVERSAL, name) )
+ style, name) )
return false;
// The status bar should have a themed background
SetFont(*wxSMALL_FONT);
#endif
- // Set the height according to the font and the border size
- wxClientDC dc(this);
- dc.SetFont(GetFont());
-
wxCoord y;
- dc.GetTextExtent(_T("X"), NULL, &y );
+ {
+ // Set the height according to the font and the border size
+ wxClientDC dc(this);
+ dc.SetFont(GetFont());
+ dc.GetTextExtent(_T("X"), NULL, &y );
+ }
int height = (int)( (11*y)/10 + 2*GetBorderY());
SetSize(wxDefaultCoord, wxDefaultCoord, wxDefaultCoord, height);
return true;
}
-
wxSize wxStatusBarGeneric::DoGetBestSize() const
{
int 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];
wxRect rect;
GetFieldRect(number, rect);
- Refresh( true, &rect );
+ Refresh(true, &rect);
+
+ // it's common to show some text in the status bar before starting a
+ // relatively lengthy operation, ensure that the text is shown to the
+ // user immediately and not after the lengthy operation end
+ Update();
}
}
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);
}
+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);
- gtk_paint_resize_grip( m_widget->style,
- GTK_PIZZA(m_wxwindow)->bin_window,
+ 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, 1, height-2, height-3 );
-
+ 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);
}
wxString text(GetStatusText(i));
- long x = 0, y = 0;
+ wxCoord x = 0, y = 0;
dc.GetTextExtent(text, &x, &y);
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
// 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)
// 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.
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;
gdk_window_get_origin( source, &org_x, &org_y );
- gtk_window_begin_resize_drag (GTK_WINDOW (ancestor),
+ if (GetLayoutDirection() == wxLayout_RightToLeft)
+ {
+ gtk_window_begin_resize_drag (GTK_WINDOW (ancestor),
+ GDK_WINDOW_EDGE_SOUTH_WEST,
+ 1,
+ org_x - event.GetX() + GetSize().x ,
+ org_y + event.GetY(),
+ 0);
+ }
+ else
+ {
+ gtk_window_begin_resize_drag (GTK_WINDOW (ancestor),
GDK_WINDOW_EDGE_SOUTH_EAST,
1,
org_x + event.GetX(),
org_y + event.GetY(),
0);
+ }
}
else
{
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;