]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/statusbr.cpp
64/32 bit fixes
[wxWidgets.git] / src / generic / statusbr.cpp
index 5517573f79a2bfd38e0644931d219c484457f61a..ea0ce7e59dca6b8e119153465dcf2f640bbcfa38 100644 (file)
 
 #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
@@ -67,9 +66,10 @@ bool wxStatusBarGeneric::Create(wxWindow *parent,
                                 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
@@ -81,13 +81,14 @@ bool wxStatusBarGeneric::Create(wxWindow *parent,
     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);
@@ -148,7 +149,12 @@ void wxStatusBarGeneric::SetStatusText(const wxString& text, int 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();
     }
 }
 
@@ -184,41 +190,57 @@ void wxStatusBarGeneric::SetStatusWidths(int n, const int widths_field[])
     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);
 
-#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 ++)
         DrawField(dc, i);
 }
@@ -232,7 +254,7 @@ void wxStatusBarGeneric::DrawFieldText(wxDC& dc, int i)
 
     wxString text(GetStatusText(i));
 
-    long x = 0, y = 0;
+    wxCoord x = 0, y = 0;
 
     dc.GetTextExtent(text, &x, &y);
 
@@ -349,23 +371,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.
@@ -397,25 +412,37 @@ 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;
         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
     {
@@ -432,14 +459,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;