From 71e030352d74e4e6aed28cfcb0ea6edf3d17af6e Mon Sep 17 00:00:00 2001
From: Vadim Zeitlin <vadim@wxwidgets.org>
Date: Sun, 14 Oct 2001 21:38:58 +0000
Subject: [PATCH] 1. added wxStatusBarUniv 2. several bug fixes to
 wxSpinButton/wxSpinCtrl

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@11991 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
---
 distrib/msw/tmake/filelist.txt |  40 ++---
 docs/latex/wx/statusbr.tex     | 149 +++++++++--------
 include/wx/statusbr.h          | 112 +++++++------
 include/wx/string.h            |   2 +
 include/wx/univ/inphand.h      |   1 +
 include/wx/univ/menu.h         |  18 +--
 include/wx/univ/renderer.h     |  48 ++++--
 include/wx/univ/setup.h        |   8 +-
 include/wx/univ/statusbr.h     | 108 +++++++++++++
 include/wx/univ/toplevel.h     |   9 +-
 samples/statbar/statbar.cpp    |  28 ++--
 src/common/framecmn.cpp        |  11 --
 src/common/statbar.cpp         | 186 +++++++++++++++++++++
 src/common/string.cpp          |  10 ++
 src/generic/spinctlg.cpp       |  17 +-
 src/generic/statusbr.cpp       |  23 ++-
 src/msw/frame.cpp              |  11 --
 src/msw/statbr95.cpp           |   2 -
 src/msw/window.cpp             |   5 +-
 src/univ/framuniv.cpp          |   7 +-
 src/univ/statusbr.cpp          | 283 ++++++++++++++++++++++++++++++++
 src/univ/themes/gtk.cpp        |  30 +++-
 src/univ/themes/win32.cpp      | 288 ++++++++++++++++++++++++---------
 src/univ/topluniv.cpp          |  16 +-
 src/wxUniv.dsp                 |  97 ++++++-----
 25 files changed, 1152 insertions(+), 357 deletions(-)
 create mode 100644 include/wx/univ/statusbr.h
 create mode 100644 src/common/statbar.cpp
 create mode 100644 src/univ/statusbr.cpp

diff --git a/distrib/msw/tmake/filelist.txt b/distrib/msw/tmake/filelist.txt
index dbeeb7d64e..c301287e44 100644
--- a/distrib/msw/tmake/filelist.txt
+++ b/distrib/msw/tmake/filelist.txt
@@ -10,24 +10,24 @@
 #  BaseOnly	/src/common but only needed for the wxBase compilation
 #  Generic	/src/generic
 #  Common	/src/common
-#  MSW		/src/msw
-#  Mac		/src/mac for Mac OS X with Apple Developer Tools
+#  MSW	/src/msw
+#  Mac	/src/mac for Mac OS X with Apple Developer Tools
 #  Motif	/src/motif
-#  Univ		/src/univ or src/univ/themes
-#  Unix		/src/unix
-#  GTK		/src/gtk
-#  MGL		/src/mgl
-#  OS2		/src/os2
-#  HTML		/src/html
+#  Univ	/src/univ or src/univ/themes
+#  Unix	/src/unix
+#  GTK	/src/gtk
+#  MGL	/src/mgl
+#  OS2	/src/os2
+#  HTML	/src/html
 #
 # 'H' suffix means these are headers, not .cpp files
 #
-#  WXH		/include/wx
-#  GTKH		/include/wx/gtk
-#  MacH		/include/wx/mac
+#  WXH	/include/wx
+#  GTKH	/include/wx/gtk
+#  MacH	/include/wx/mac
 #  MotifH	/include/wx/motif
-#  MSWH		/include/wx/msw
-#  OS2H		/include/wx/os2
+#  MSWH	/include/wx/msw
+#  OS2H	/include/wx/os2
 #  GenericH	/include/wx/generic
 #  HtmlH	/include/wx/html
 #  ProtoH	/include/wx/protocol
@@ -36,27 +36,28 @@
 #
 # 'R' suffix means these are resource files
 #
-#  MacR		/src/mac
+#  MacR	/src/mac
 #
 # The third column may be empty or contain some additional info about this
 # file (only compile it in 16bit mode, don't compile it with this or that
 # compiler, &c)
 #
 # Known flags:
-#  Base		makes part of the base library too
+#  Base	makes part of the base library too
 #  NotWin32	not used under Win32, but used under Win16
 #  Win32Only	only can be compiled under Win32
 #  Generic	generic code which might be used instead of native one
-#  OLE		OLE file (needs Win32 and a decent compiler)
+#  OLE	OLE file (needs Win32 and a decent compiler)
 #  Socket	Socket file (currently doesn't compile under Win16)
 #  NotMSW	Not required for the MSW port
 #  NotMac	Not required for the MAC port under Mac OS X
 #  NotMGL	Not required for the MGL port
 #  NotGTK	Not required for the GTK port
-#  NotX		Not required for the Motif port
+#  NotX	Not required for the Motif port
 #  NotOS2	Not required for the os2Pm port
+#  NotUniv	Not required for the wxUniversal
 #  LowLevel	Low level GUI toolkit file, used by wxUniversal as well
-#  Theme        implements a wxUniv theme
+#  Theme	implements a wxUniv theme
 ###############################################################################
 
 # File name 	Type	Flags
@@ -207,6 +208,7 @@ sckstrm.cpp	Common	Socket,Base
 serbase.cpp	Common	Base
 sizer.cpp	Common
 socket.cpp	Common	Socket,Base
+statbar.cpp	Common
 strconv.cpp	Common	Base
 stream.cpp	Common	Base
 string.cpp	Common	Base
@@ -383,6 +385,7 @@ statbmp.cpp	Univ
 statbox.cpp	Univ
 statline.cpp	Univ
 stattext.cpp	Univ
+statusbr.cpp	Univ
 textctrl.cpp	Univ
 theme.cpp	Univ
 gtk.cpp	Univ	Theme
@@ -1410,6 +1413,7 @@ statbmp.h	UnivH
 statbox.h	UnivH
 statline.h	UnivH
 stattext.h	UnivH
+statusbr.h	UnivH
 textctrl.h	UnivH
 theme.h	UnivH
 window.h	UnivH
diff --git a/docs/latex/wx/statusbr.tex b/docs/latex/wx/statusbr.tex
index 7c1c99b309..6985cc883e 100644
--- a/docs/latex/wx/statusbr.tex
+++ b/docs/latex/wx/statusbr.tex
@@ -135,68 +135,71 @@ The status field string if the field is valid, otherwise the empty string.
 
 \helpref{wxStatusBar::SetStatusText}{wxstatusbarsetstatustext}
 
-\membersection{wxStatusBar::DrawField}\label{wxstatusbardrawfield}
-
-\func{virtual void}{DrawField}{\param{wxDC\& }{dc}, \param{int }{i}}
-
-Draws a field, including shaded borders and text.
-
-\wxheading{Parameters}
-
-\docparam{dc}{The device context to draw onto.}
-
-\docparam{i}{The field to be drawn.}
-
-\wxheading{See also}
-
-\helpref{wxStatusBar::DrawFieldText}{wxstatusbardrawfieldtext}
-
-\membersection{wxStatusBar::DrawFieldText}\label{wxstatusbardrawfieldtext}
-
-\func{virtual void}{DrawFieldText}{\param{wxDC\& }{dc}, \param{int }{i}}
-
-Draws a field's text.
-
-\wxheading{Parameters}
-
-\docparam{dc}{The device context to draw onto.}
-
-\docparam{i}{The field whose text is to be drawn.}
-
-\wxheading{See also}
-
-\helpref{wxStatusBar::DrawField}{wxstatusbardrawfield}
-
-\membersection{wxStatusBar::InitColours}\label{wxstatusbarinitcolours}
-
-\func{virtual void}{InitColours}{\void}
-
-Sets up the background colour and shading pens using suitable system colours (Windows) or tasteful shades
-of grey (other platforms).
-
-\wxheading{Remarks}
-
-This function is called when the window is created, and also
-from \helpref{wxStatusBar::OnSysColourChanged}{wxstatusbaronsyscolourchanged} on Windows.
-
-\wxheading{See also}
-
-\helpref{wxStatusBar::OnSysColourChanged}{wxstatusbaronsyscolourchanged}
-
-\membersection{wxStatusBar::OnSysColourChanged}\label{wxstatusbaronsyscolourchanged}
-
-\func{void}{OnSysColourChanged}{\param{wxSysColourChangedEvent\& }{event}}
-
-Handles a system colour change by calling \helpref{wxStatusBar::InitColours}{wxstatusbarinitcolours},
-and refreshes the window.
-
-\wxheading{Parameters}
-
-\docparam{event}{The colour change event.}
-
-\wxheading{See also}
-
-\helpref{wxStatusBar::InitColours}{wxstatusbarinitcolours}
+%% VZ: these functions are not in wxStatusBar API, these are just
+%%     implementation details of wxStatusBarGeneric
+%%
+%% \membersection{wxStatusBar::DrawField}\label{wxstatusbardrawfield}
+%% 
+%% \func{virtual void}{DrawField}{\param{wxDC\& }{dc}, \param{int }{i}}
+%% 
+%% Draws a field, including shaded borders and text.
+%% 
+%% \wxheading{Parameters}
+%% 
+%% \docparam{dc}{The device context to draw onto.}
+%% 
+%% \docparam{i}{The field to be drawn.}
+%% 
+%% \wxheading{See also}
+%% 
+%% \helpref{wxStatusBar::DrawFieldText}{wxstatusbardrawfieldtext}
+%% 
+%% \membersection{wxStatusBar::DrawFieldText}\label{wxstatusbardrawfieldtext}
+%% 
+%% \func{virtual void}{DrawFieldText}{\param{wxDC\& }{dc}, \param{int }{i}}
+%% 
+%% Draws a field's text.
+%% 
+%% \wxheading{Parameters}
+%% 
+%% \docparam{dc}{The device context to draw onto.}
+%% 
+%% \docparam{i}{The field whose text is to be drawn.}
+%% 
+%% \wxheading{See also}
+%% 
+%% \helpref{wxStatusBar::DrawField}{wxstatusbardrawfield}
+%% 
+%% \membersection{wxStatusBar::InitColours}\label{wxstatusbarinitcolours}
+%% 
+%% \func{virtual void}{InitColours}{\void}
+%% 
+%% Sets up the background colour and shading pens using suitable system colours (Windows) or tasteful shades
+%% of grey (other platforms).
+%% 
+%% \wxheading{Remarks}
+%% 
+%% This function is called when the window is created, and also
+%% from \helpref{wxStatusBar::OnSysColourChanged}{wxstatusbaronsyscolourchanged} on Windows.
+%% 
+%% \wxheading{See also}
+%% 
+%% \helpref{wxStatusBar::OnSysColourChanged}{wxstatusbaronsyscolourchanged}
+%% 
+%% \membersection{wxStatusBar::OnSysColourChanged}\label{wxstatusbaronsyscolourchanged}
+%% 
+%% \func{void}{OnSysColourChanged}{\param{wxSysColourChangedEvent\& }{event}}
+%% 
+%% Handles a system colour change by calling \helpref{wxStatusBar::InitColours}{wxstatusbarinitcolours},
+%% and refreshes the window.
+%% 
+%% \wxheading{Parameters}
+%% 
+%% \docparam{event}{The colour change event.}
+%% 
+%% \wxheading{See also}
+%% 
+%% \helpref{wxStatusBar::InitColours}{wxstatusbarinitcolours}
 
 \membersection{wxStatusBar::SetFieldsCount}\label{wxstatusbarsetfieldscount}
 
@@ -246,15 +249,27 @@ Sets the text for one field.
 
 \func{virtual void}{SetStatusWidths}{\param{int}{ n}, \param{int *}{widths}}
 
-Sets the widths of the fields in the status line.
+Sets the widths of the fields in the status line. There are two types of
+fields: fixed widths one and variable width fields. For the fixed width fields
+you should specify their (constant) width in pixels. For the variable width
+fields, specify a negative number which indicates how should the field expand:
+the space left for all variable width fields is divided between them according
+to the absolute value of this number. A variable width field with width of $-2$
+gets twice as much of it as a field with width $-1$ and so on.
+
+For example, to create one fixed width field of width $50$ in the right part of
+the status bar and two more fields which get $66$\% and $33$\% of the remaining
+space correspondingly, you should use an array containing $-2$, $-1$ and $100$.
 
 \wxheading{Parameters}
 
-\docparam{n}{The number of fields in the status bar.}
+\docparam{n}{The number of fields in the status bar. Must be equal to the
+number passed to \helpref{SetFieldsCount}{wxstatusbarsetfieldscount} the last
+time it was called.}
 
-\docparam{widths}{Must contain an array of {\it n} integers, each of which is a status field width
-in pixels. A value of -1 indicates that the field is variable width; at least one
-field must be -1. You should delete this array after calling {\bf SetStatusWidths}.}
+\docparam{widths}{Contains an array of {\it n} integers, each of which is
+either an absolute status field width in pixels if positive or indicates a
+variable width field if negative}
 
 \wxheading{Remarks}
 
diff --git a/include/wx/statusbr.h b/include/wx/statusbr.h
index 56e9096737..adc1bf5946 100644
--- a/include/wx/statusbr.h
+++ b/include/wx/statusbr.h
@@ -12,6 +12,10 @@
 #ifndef _WX_STATUSBR_H_BASE_
 #define _WX_STATUSBR_H_BASE_
 
+#ifdef __GNUG__
+    #pragma interface "statbar.h"
+#endif
+
 #include "wx/window.h"
 
 #if wxUSE_STATUSBAR
@@ -23,19 +27,37 @@
 class WXDLLEXPORT wxStatusBarBase : public wxWindow
 {
 public:
-    wxStatusBarBase() { m_statusWidths = NULL; }
+    wxStatusBarBase();
+
+    virtual ~wxStatusBarBase();
+
+    // field count
+    // -----------
 
-    // get/set the number of fields
-    virtual void SetFieldsCount(int number = 1,
-                                const int *widths = (const int *) NULL) = 0;
+    // set the number of fields and call SetStatusWidths(widths) if widths are
+    // given
+    virtual void SetFieldsCount(int number = 1, const int *widths = NULL);
     int GetFieldsCount() const { return m_nFields; }
 
-    // get/set the text of the given field
+    // field text
+    // ----------
+
     virtual void SetStatusText(const wxString& text, int number = 0) = 0;
     virtual wxString GetStatusText(int number = 0) const = 0;
 
-    // set status line widths (n should be the same as field count)
-    virtual void SetStatusWidths(int n, const int widths[]) = 0;
+    // fields widths
+    // -------------
+
+    // set status field widths as absolute numbers: positive widths mean that
+    // the field has the specified absolute width, negative widths are
+    // interpreted as the sizer options, i.e. the extra space (total space
+    // minus the sum of fixed width fields) is divided between the fields with
+    // negative width according to the abs value of the width (field with width
+    // -2 grows twice as much as one with width -1 &c)
+    virtual void SetStatusWidths(int n, const int widths[]);
+
+    // geometry
+    // --------
 
     // Get the position and size of the field's internal bounding rectangle
     virtual bool GetFieldRect(int i, wxRect& rect) const = 0;
@@ -51,54 +73,54 @@ public:
     virtual bool AcceptsFocus() const { return FALSE; }
 
 protected:
-    int     m_nFields;      // the current number of fields
-    int    *m_statusWidths; // the width (if !NULL) of the fields
+    // set the widths array to NULL
+    void InitWidths();
+
+    // free the status widths arrays
+    void FreeWidths();
+
+    // reset the widths
+    void ReinitWidths() { FreeWidths(); InitWidths(); }
+
+    // calculate the real field widths for the given total available size
+    wxArrayInt CalculateAbsWidths(wxCoord widthTotal) const;
+
+    // the current number of fields
+    int        m_nFields;
+
+    // the widths of the fields in pixels if !NULL, all fields have the same
+    // width otherwise
+    int       *m_statusWidths;
 };
 
-#if defined(__WIN32__) && wxUSE_NATIVE_STATUSBAR
-    #include "wx/msw/statbr95.h"
+// ----------------------------------------------------------------------------
+// include the actual wxStatusBar class declaration
+// ----------------------------------------------------------------------------
+
+#if defined(__WXUNIVERSAL__)
+    #define wxStatusBarUniv wxStatusBar
+    #define sm_classwxStatusBarUniv sm_classwxStatusBar
 
-    typedef wxStatusBar95 wxStatusBarReal;
+    #include "wx/univ/statusbr.h"
+#elif defined(__WIN32__) && wxUSE_NATIVE_STATUSBAR
+    #define wxStatusBar95 wxStatusBar
+    #define sm_classwxStatusBar95 sm_classwxStatusBar
+
+    #include "wx/msw/statbr95.h"
 #elif defined(__WXMAC__)
+    #define wxStatusBarMac wxStatusBar
+    #define sm_classwxStatusBarMac sm_classwxStatusBar
+
     #include "wx/generic/statusbr.h"
     #include "wx/mac/statusbr.h"
-
-    typedef wxStatusBarMac wxStatusBarReal;
 #else
-    #include "wx/generic/statusbr.h"
+    #define wxStatusBarGeneric wxStatusBar
+    #define sm_classwxStatusBarGeneric sm_classwxStatusBar
 
-    typedef wxStatusBarGeneric wxStatusBarReal;
+    #include "wx/generic/statusbr.h"
 #endif
 
-// we can't just typedef wxStatusBar to be one of 95/Generic because we should
-// be able to forward declare it (done in several places) and because wxWin
-// RTTI wouldn't work then
-class WXDLLEXPORT wxStatusBar : public wxStatusBarReal
-{
-public:
-    wxStatusBar() { }
-    wxStatusBar(wxWindow *parent,
-                wxWindowID id,
-                const wxPoint& WXUNUSED(pos) = wxDefaultPosition,
-                const wxSize& WXUNUSED(size) = wxDefaultSize,
-                long style = wxST_SIZEGRIP,
-                const wxString& name = wxPanelNameStr)
-    {
-        Create(parent, id, style, name);
-    }
-    wxStatusBar(wxWindow *parent,
-                wxWindowID id,
-                long style,
-                const wxString& name = wxPanelNameStr)
-    {
-        Create(parent, id, style, name);
-    }
-
-private:
-    DECLARE_DYNAMIC_CLASS(wxStatusBar)
-};
-
-#endif
+#endif // wxUSE_STATUSBAR
 
 #endif
     // _WX_STATUSBR_H_BASE_
diff --git a/include/wx/string.h b/include/wx/string.h
index 31a9a2b30c..dc244ec1d8 100644
--- a/include/wx/string.h
+++ b/include/wx/string.h
@@ -1035,6 +1035,8 @@ public:
   size_t Add(const wxString& str);
     // add new element at given position
   void Insert(const wxString& str, size_t uiIndex);
+    // expand the array to have count elements
+  void SetCount(size_t count);
     // remove first item matching this value
   void Remove(const wxChar *sz);
     // remove item by index
diff --git a/include/wx/univ/inphand.h b/include/wx/univ/inphand.h
index d26a6e9ea4..ea16294242 100644
--- a/include/wx/univ/inphand.h
+++ b/include/wx/univ/inphand.h
@@ -35,6 +35,7 @@
 #define wxINP_HANDLER_SCROLLBAR         _T("scrollbar")
 #define wxINP_HANDLER_SLIDER            _T("slider")
 #define wxINP_HANDLER_SPINBTN           _T("spinbtn")
+#define wxINP_HANDLER_STATUSBAR         _T("statusbar")
 #define wxINP_HANDLER_TEXTCTRL          _T("textctrl")
 #define wxINP_HANDLER_TOPLEVEL          _T("toplevel")
 
diff --git a/include/wx/univ/menu.h b/include/wx/univ/menu.h
index 1f507c6303..3daa74e772 100644
--- a/include/wx/univ/menu.h
+++ b/include/wx/univ/menu.h
@@ -26,24 +26,10 @@
 class WXDLLEXPORT wxMenuInfo;
 WX_DECLARE_OBJARRAY(wxMenuInfo, wxMenuInfoArray);
 
-class wxPopupMenuWindow;
-
+class WXDLLEXPORT wxMenuGeometryInfo;
+class WXDLLEXPORT wxPopupMenuWindow;
 class WXDLLEXPORT wxRenderer;
 
-// ----------------------------------------------------------------------------
-// wxMenu helper classes, used in implementation only
-// ----------------------------------------------------------------------------
-
-// used by wxRenderer
-class WXDLLEXPORT wxMenuGeometryInfo
-{
-public:
-    // get the total size of the menu
-    virtual wxSize GetSize() const = 0;
-
-    virtual ~wxMenuGeometryInfo();
-};
-
 // ----------------------------------------------------------------------------
 // wxMenu
 // ----------------------------------------------------------------------------
diff --git a/include/wx/univ/renderer.h b/include/wx/univ/renderer.h
index cfcdccf9c8..a22d6466f6 100644
--- a/include/wx/univ/renderer.h
+++ b/include/wx/univ/renderer.h
@@ -44,6 +44,16 @@ class WXDLLEXPORT wxGauge;
 #include "wx/gdicmn.h"
 #include "wx/scrolbar.h"            // for wxScrollBar::Element
 
+// helper class used by wxMenu-related functions
+class WXDLLEXPORT wxMenuGeometryInfo
+{
+public:
+    // get the total size of the menu
+    virtual wxSize GetSize() const = 0;
+
+    virtual ~wxMenuGeometryInfo();
+};
+
 // ----------------------------------------------------------------------------
 // wxRenderer: abstract renderers interface
 // ----------------------------------------------------------------------------
@@ -220,7 +230,6 @@ public:
                                  int step = 1,
                                  int flags = 0) = 0;
 
-#if wxUSE_MENUS
     // draw a menu bar item
     virtual void DrawMenuBarItem(wxDC& dc,
                                  const wxRect& rect,
@@ -244,7 +253,14 @@ public:
     virtual void DrawMenuSeparator(wxDC& dc,
                                    wxCoord y,
                                    const wxMenuGeometryInfo& geomInfo) = 0;
-#endif
+
+    // draw a status bar field: wxCONTROL_ISDEFAULT bit in the flags is
+    // interpreted specially and means "draw the status bar grip" here
+    virtual void DrawStatusField(wxDC& dc,
+                                 const wxRect& rect,
+                                 const wxString& label,
+                                 int flags = 0) = 0;
+
     // draw complete frame/dialog titlebar
     virtual void DrawFrameTitleBar(wxDC& dc,
                                    const wxRect& rect,
@@ -253,7 +269,7 @@ public:
                                    int flags,
                                    int specialButton = 0,
                                    int specialButtonFlags = 0) = 0;
-                                   
+
     // draw frame borders
     virtual void DrawFrameBorder(wxDC& dc,
                                  const wxRect& rect,
@@ -373,7 +389,6 @@ public:
     // get the size of one progress bar step (in horz and vertical directions)
     virtual wxSize GetProgressBarStep() const = 0;
 
-#if wxUSE_MENUS
     // get the size of rectangle to use in the menubar for the given text rect
     virtual wxSize GetMenuBarItemSize(const wxSize& sizeText) const = 0;
 
@@ -384,19 +399,25 @@ public:
     // the returned pointer must be deleted by the caller
     virtual wxMenuGeometryInfo *GetMenuGeometry(wxWindow *win,
                                                 const wxMenu& menu) const = 0;
-#endif
+
+    // get the borders around the status bar fields (x and y fields of the
+    // return value) and also, optionally, the border between the fields
+    virtual wxSize GetStatusBarBorders(wxCoord *borderBetweenFields) const = 0;
 
     // get client area rectangle of top level window (i.e. subtract
     // decorations from given rectangle)
     virtual wxRect GetFrameClientArea(const wxRect& rect, int flags) const = 0;
+
     // get size of whole top level window, given size of its client area size
     virtual wxSize GetFrameTotalSize(const wxSize& clientSize, int flags) const = 0;
+
     // get titlebar icon size
     virtual wxSize GetFrameIconSize() const = 0;
+
     // returns one of wxHT_TOPLEVEL_XXX constants
     virtual int HitTestFrame(const wxRect& rect,
                              const wxPoint& pt,
-                             int flags) const = 0;
+                             int flags = 0) const = 0;
 
     // virtual dtor for any base class
     virtual ~wxRenderer();
@@ -599,7 +620,6 @@ public:
                                  int flags = 0)
         { m_renderer->DrawSliderTicks(dc, rect, sizeThumb, orient,
                                       start, end, start, flags); }
-#if wxUSE_MENUS
 
     virtual void DrawMenuBarItem(wxDC& dc,
                                  const wxRect& rect,
@@ -621,7 +641,13 @@ public:
                                    wxCoord y,
                                    const wxMenuGeometryInfo& geomInfo)
         { m_renderer->DrawMenuSeparator(dc, y, geomInfo); }
-#endif
+
+    virtual void DrawStatusField(wxDC& dc,
+                                 const wxRect& rect,
+                                 const wxString& label,
+                                 int flags = 0)
+        { m_renderer->DrawStatusField(dc, rect, label, flags); }
+
     virtual void DrawFrameTitleBar(wxDC& dc,
                                    const wxRect& rect,
                                    const wxString& title,
@@ -629,7 +655,7 @@ public:
                                    int flags,
                                    int specialButton = 0,
                                    int specialButtonFlag = 0)
-        { m_renderer->DrawFrameTitleBar(dc, rect, title, icon, flags, 
+        { m_renderer->DrawFrameTitleBar(dc, rect, title, icon, flags,
                                         specialButton, specialButtonFlag); }
     virtual void DrawFrameBorder(wxDC& dc,
                                  const wxRect& rect,
@@ -717,13 +743,13 @@ public:
         { return m_renderer->GetSliderThumbSize(rect, orient); }
     virtual wxSize GetProgressBarStep() const
         { return m_renderer->GetProgressBarStep(); }
-#if wxUSE_MENUS
     virtual wxSize GetMenuBarItemSize(const wxSize& sizeText) const
         { return m_renderer->GetMenuBarItemSize(sizeText); }
     virtual wxMenuGeometryInfo *GetMenuGeometry(wxWindow *win,
                                                 const wxMenu& menu) const
         { return m_renderer->GetMenuGeometry(win, menu); }
-#endif
+    virtual wxSize GetStatusBarBorders(wxCoord *borderBetweenFields) const
+        { return m_renderer->GetStatusBarBorders(borderBetweenFields); }
     virtual wxRect GetFrameClientArea(const wxRect& rect, int flags) const
         { return m_renderer->GetFrameClientArea(rect, flags); }
     virtual wxSize GetFrameTotalSize(const wxSize& clientSize, int flags) const
diff --git a/include/wx/univ/setup.h b/include/wx/univ/setup.h
index b115ff9e58..d03467448f 100644
--- a/include/wx/univ/setup.h
+++ b/include/wx/univ/setup.h
@@ -98,7 +98,7 @@
 #define wxUSE_STATLINE     1
 #define wxUSE_STATTEXT     1
 #define wxUSE_STATBMP      1
-#define wxUSE_STATUSBAR    0
+#define wxUSE_STATUSBAR    1
 #define wxUSE_TEXTCTRL     1
 #define wxUSE_TOOLTIPS     0
 #define wxUSE_TREECTRL     0
@@ -121,7 +121,7 @@
 #define wxUSE_FILEDLG 0
 #define wxUSE_COLOURDLG 0
 #define wxUSE_CHOICEDLG 0
-#define wxUSE_NUMBERDLG 0
+#define wxUSE_NUMBERDLG 1
 #define wxUSE_STARTUP_TIPS 0
 #define wxUSE_MSGDLG       1
 #define wxUSE_SPLITTER     1
@@ -252,7 +252,7 @@
 #define wxUSE_STATLINE     1
 #define wxUSE_STATTEXT     1
 #define wxUSE_STATBMP      1
-#define wxUSE_STATUSBAR    0
+#define wxUSE_STATUSBAR    1
 #define wxUSE_TEXTCTRL     1
 #define wxUSE_TOOLTIPS     0
 #define wxUSE_TREECTRL     0
@@ -275,7 +275,7 @@
 #define wxUSE_COLOURDLG 0
 #define wxUSE_TEXTDLG 0
 #define wxUSE_CHOICEDLG 0
-#define wxUSE_NUMBERDLG 0
+#define wxUSE_NUMBERDLG 1
 #define wxUSE_STARTUP_TIPS 0
 #define wxUSE_MSGDLG       1
 #define wxUSE_SPLITTER     1
diff --git a/include/wx/univ/statusbr.h b/include/wx/univ/statusbr.h
new file mode 100644
index 0000000000..804029fbc1
--- /dev/null
+++ b/include/wx/univ/statusbr.h
@@ -0,0 +1,108 @@
+///////////////////////////////////////////////////////////////////////////////
+// Name:        wx/univ/statusbr.h
+// Purpose:     wxStatusBarUniv: wxStatusBar for wxUniversal declaration
+// Author:      Vadim Zeitlin
+// Modified by:
+// Created:     14.10.01
+// RCS-ID:      $Id$
+// Copyright:   (c) 2001 SciTech Software, Inc. (www.scitechsoft.com)
+// Licence:     wxWindows licence
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef _WX_UNIV_STATUSBR_H_
+#define _WX_UNIV_STATUSBR_H_
+
+#ifdef __GNUG__
+    #pragma interface "univstatusbr.h"
+#endif
+
+// ----------------------------------------------------------------------------
+// wxStatusBar: a window near the bottom of the frame used for status info
+// ----------------------------------------------------------------------------
+
+class WXDLLEXPORT wxStatusBarUniv : public wxStatusBarBase,
+                                    public wxInputConsumer
+{
+public:
+    wxStatusBarUniv() { Init(); }
+
+    wxStatusBarUniv(wxWindow *parent,
+                    wxWindowID id = -1,
+                    long style = 0,
+                    const wxString& name = wxPanelNameStr)
+    {
+        Init();
+
+        (void)Create(parent, id, style, name);
+    }
+
+    bool Create(wxWindow *parent,
+                wxWindowID id = -1,
+                long style = 0,
+                const wxString& name = wxPanelNameStr);
+
+    // set field count/widths
+    virtual void SetFieldsCount(int number = 1, const int *widths = NULL);
+    virtual void SetStatusWidths(int n, const int widths[]);
+
+    // get/set the text of the given field
+    virtual void SetStatusText(const wxString& text, int number = 0);
+    virtual wxString GetStatusText(int number = 0) const;
+
+    // Get the position and size of the field's internal bounding rectangle
+    virtual bool GetFieldRect(int i, wxRect& rect) const;
+
+    // sets the minimal vertical size of the status bar
+    virtual void SetMinHeight(int height);
+
+    // get the dimensions of the horizontal and vertical borders
+    virtual int GetBorderX() const;
+    virtual int GetBorderY() const;
+
+protected:
+    // recalculate the field widths
+    void OnSize(wxSizeEvent& event);
+
+    // draw the statusbar
+    virtual void DoDraw(wxControlRenderer *renderer);
+
+    // wxInputConsumer pure virtual
+    virtual wxWindow *GetInputWindow() const
+        { return wxConstCast(this, wxStatusBar); }
+
+    // tell them about our preferred height
+    virtual wxSize DoGetBestSize() const;
+
+    // override DoSetSize() to prevent the status bar height from changing
+    virtual void DoSetSize(int x, int y,
+                           int width, int height,
+                           int sizeFlags = wxSIZE_AUTO);
+
+    // get the (fixed) status bar height
+    wxCoord GetHeight() const;
+
+    // get the rectangle containing all the fields and the border between them
+    //
+    // also updates m_widthsAbs if necessary
+    wxRect GetTotalFieldRect(wxCoord *borderBetweenFields);
+
+    // refresh the given field
+    void RefreshField(int i);
+
+    // common part of all ctors
+    void Init();
+
+private:
+    // the status fields strings
+    wxArrayString m_statusText;
+
+    // the absolute status fields widths
+    wxArrayInt m_widthsAbs;
+
+    DECLARE_DYNAMIC_CLASS(wxStatusBarUniv)
+    DECLARE_EVENT_TABLE()
+    WX_DECLARE_INPUT_CONSUMER()
+};
+
+#endif // _WX_UNIV_STATUSBR_H_
+
diff --git a/include/wx/univ/toplevel.h b/include/wx/univ/toplevel.h
index 60ff4e0fa8..ef740f21d7 100644
--- a/include/wx/univ/toplevel.h
+++ b/include/wx/univ/toplevel.h
@@ -35,7 +35,7 @@ enum
     wxTOPLEVEL_BUTTON_MAXIMIZE = 0x02000000,
     wxTOPLEVEL_BUTTON_ICONIZE =  0x04000000,
     wxTOPLEVEL_BUTTON_RESTORE  = 0x08000000,
-    wxTOPLEVEL_BUTTON_HELP     = 0x10000000,    
+    wxTOPLEVEL_BUTTON_HELP     = 0x10000000,
 };
 
 // frame hit test return values:
@@ -115,14 +115,15 @@ public:
 
     // implementation from now on
     // --------------------------
-    
+
     // tests for frame's part at given point
     long HitTest(const wxPoint& pt) const;
 
-protected:
     virtual bool PerformAction(const wxControlAction& action,
                                long numArg = -1,
                                const wxString& strArg = wxEmptyString);
+
+protected:
     // handle titlebar button click event
     virtual void ClickTitleBarButton(long button);
 
@@ -133,7 +134,7 @@ protected:
 
     // common part of all ctors
     void Init();
-    
+
     void RefreshTitleBar();
     void OnNcPaint(wxPaintEvent& event);
 
diff --git a/samples/statbar/statbar.cpp b/samples/statbar/statbar.cpp
index 1d9ded23ac..12405daf5f 100644
--- a/samples/statbar/statbar.cpp
+++ b/samples/statbar/statbar.cpp
@@ -341,16 +341,20 @@ void MyFrame::OnSetStatusFields(wxCommandEvent& WXUNUSED(event))
     // SetFieldsCount() with the same number of fields should be ok
     if ( nFields != -1 )
     {
-        // we set the widths only for 2 of them, otherwise let all the fields
-        // have equal width (the default behaviour)
-        const int *widths = NULL;
-        if ( nFields == 2 )
+        static const int widthsFor2Fields[] = { 200, -1 };
+        static const int widthsFor3Fields[] = { -1, -2, -1 };
+        static const int widthsFor4Fields[] = { 100, -1, 100, -2, 100 };
+
+        static const int *widths[] =
         {
-            static const int widthsFor2Fields[2] = { 200, -1 };
-            widths = widthsFor2Fields;
-        }
+            NULL,               // 1 field: default
+            widthsFor2Fields,   // 2 fields: 1 fixed, 1 var
+            widthsFor3Fields,   // 3 fields: 3 var
+            widthsFor4Fields,   // 4 fields: 3 fixed, 2 vars
+            NULL                // 5 fields: default (all have same width)
+        };
 
-        sb->SetFieldsCount(nFields, widths);
+        sb->SetFieldsCount(nFields, widths[nFields - 1]);
 
         wxLogStatus(this,
                     wxString::Format(wxT("Status bar now has %ld fields"),
@@ -447,7 +451,9 @@ MyStatusBar::MyStatusBar(wxWindow *parent)
 #ifdef USE_STATIC_BITMAP
     m_statbmp = new wxStaticBitmap(this, -1, wxIcon(green_xpm));
 #else
-    m_statbmp = new wxBitmapButton(this, -1, CreateBitmapForButton());
+    m_statbmp = new wxBitmapButton(this, -1, CreateBitmapForButton(),
+                                   wxDefaultPosition, wxDefaultSize,
+                                   wxBU_EXACTFIT);
 #endif
 
     m_timer.Start(1000);
@@ -497,11 +503,7 @@ void MyStatusBar::OnSize(wxSizeEvent& event)
     m_checkbox->SetSize(rect.x + 2, rect.y + 2, rect.width - 4, rect.height - 4);
 
     GetFieldRect(Field_Bitmap, rect);
-#ifdef USE_BUTTON_FOR_BITMAP
-    wxSize size(BITMAP_SIZE_X, BITMAP_SIZE_Y);
-#else
     wxSize size = m_statbmp->GetSize();
-#endif
 
     m_statbmp->Move(rect.x + (rect.width - size.x) / 2,
                     rect.y + (rect.height - size.y) / 2);
diff --git a/src/common/framecmn.cpp b/src/common/framecmn.cpp
index 4b12d0e9a3..55ce182110 100644
--- a/src/common/framecmn.cpp
+++ b/src/common/framecmn.cpp
@@ -244,17 +244,6 @@ wxStatusBar *wxFrameBase::OnCreateStatusBar(int number,
 {
     wxStatusBar *statusBar = new wxStatusBar(this, id, style, name);
 
-    // Set the height according to the font and the border size
-    wxClientDC dc(statusBar);
-    dc.SetFont(statusBar->GetFont());
-
-    wxCoord y;
-    dc.GetTextExtent( "X", NULL, &y );
-
-    int height = (int)( (11*y)/10 + 2*statusBar->GetBorderY());
-
-    statusBar->SetSize( -1, -1, -1, height );
-
     statusBar->SetFieldsCount(number);
 
     return statusBar;
diff --git a/src/common/statbar.cpp b/src/common/statbar.cpp
new file mode 100644
index 0000000000..bd3a277d88
--- /dev/null
+++ b/src/common/statbar.cpp
@@ -0,0 +1,186 @@
+///////////////////////////////////////////////////////////////////////////////
+// Name:        common/statbar.cpp
+// Purpose:     wxStatusBarBase implementation
+// Author:      Vadim Zeitlin
+// Modified by:
+// Created:     14.10.01
+// RCS-ID:      $Id$
+// Copyright:   (c) 2001 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
+// License:     wxWindows license
+///////////////////////////////////////////////////////////////////////////////
+
+// ============================================================================
+// declarations
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// headers
+// ----------------------------------------------------------------------------
+
+#ifdef __GNUG__
+    #pragma implementation "statbar.h"
+#endif
+
+// For compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+    #pragma hdrstop
+#endif
+
+#ifndef WX_PRECOMP
+    #include "wx/statusbr.h"
+#endif //WX_PRECOMP
+
+#if wxUSE_STATUSBAR
+
+// ============================================================================
+// wxStatusBarBase implementation
+// ============================================================================
+
+IMPLEMENT_DYNAMIC_CLASS(wxStatusBar, wxWindow)
+
+// ----------------------------------------------------------------------------
+// ctor/dtor
+// ----------------------------------------------------------------------------
+
+wxStatusBarBase::wxStatusBarBase()
+{
+    m_nFields = 0;
+
+    InitWidths();
+}
+
+wxStatusBarBase::~wxStatusBarBase()
+{
+    FreeWidths();
+}
+
+// ----------------------------------------------------------------------------
+// widths array handling
+// ----------------------------------------------------------------------------
+
+void wxStatusBarBase::InitWidths()
+{
+    m_statusWidths = NULL;
+}
+
+void wxStatusBarBase::FreeWidths()
+{
+    delete [] m_statusWidths;
+}
+
+// ----------------------------------------------------------------------------
+// field widths
+// ----------------------------------------------------------------------------
+
+void wxStatusBarBase::SetFieldsCount(int number, const int *widths)
+{
+    wxCHECK_RET( number > 0, _T("invalid field number in SetFieldsCount") );
+
+    bool refresh = FALSE;
+
+    if ( number != m_nFields )
+    {
+        m_nFields = number;
+
+        ReinitWidths();
+
+        refresh = TRUE;
+    }
+    //else: keep the old m_statusWidths if we had them
+
+    if ( widths )
+    {
+        SetStatusWidths(number, widths);
+
+        // already done from SetStatusWidths()
+        refresh = FALSE;
+    }
+
+    if ( refresh )
+        Refresh();
+}
+
+void wxStatusBarBase::SetStatusWidths(int WXUNUSED_UNLESS_DEBUG(n),
+                                      const int widths[])
+{
+    wxCHECK_RET( widths, _T("NULL pointer in SetStatusWidths") );
+
+    wxASSERT_MSG( n == m_nFields, _T("field number mismatch") );
+
+    if ( !m_statusWidths )
+        m_statusWidths = new int[m_nFields];
+
+    for ( int i = 0; i < m_nFields; i++ )
+    {
+        m_statusWidths[i] = widths[i];
+    }
+
+    // update the display after the widths changed
+    Refresh();
+}
+
+wxArrayInt wxStatusBarBase::CalculateAbsWidths(wxCoord widthTotal) const
+{
+    wxArrayInt widths;
+
+    if ( m_statusWidths == NULL )
+    {
+        // default: all fields have the same width
+        int nWidth = widthTotal / m_nFields;
+        for ( int i = 0; i < m_nFields; i++ )
+        {
+            widths.Add(nWidth);
+        }
+    }
+    else // have explicit status widths
+    {
+        // calculate the total width of all the fixed width fields and the
+        // total number of var field widths counting with multiplicity
+        int nTotalWidth = 0,
+            nVarCount = 0,
+            i;
+        for ( i = 0; i < m_nFields; i++ )
+        {
+            if ( m_statusWidths[i] >= 0 )
+            {
+                nTotalWidth += m_statusWidths[i];
+            }
+            else
+            {
+                nVarCount += -m_statusWidths[i];
+            }
+        }
+
+        // the amount of extra width we have per each var width field
+        int nVarWidth;
+        if ( nVarCount )
+        {
+            int widthExtra = widthTotal - nTotalWidth;
+            nVarWidth = widthExtra > 0 ? widthExtra / nVarCount : 0;
+        }
+        else // no var width fields at all
+        {
+            nVarWidth = 0;
+        }
+
+        // do fill the array
+        for ( i = 0; i < m_nFields; i++ )
+        {
+            if ( m_statusWidths[i] >= 0 )
+            {
+                widths.Add(m_statusWidths[i]);
+            }
+            else
+            {
+                widths.Add(-m_statusWidths[i]*nVarWidth);
+            }
+        }
+    }
+
+    return widths;
+}
+
+#endif // wxUSE_STATUSBAR
+
diff --git a/src/common/string.cpp b/src/common/string.cpp
index c7ce4c3d1c..3fdcf1e0de 100644
--- a/src/common/string.cpp
+++ b/src/common/string.cpp
@@ -2156,6 +2156,16 @@ void wxArrayString::Insert(const wxString& str, size_t nIndex)
   m_nCount++;
 }
 
+// expand the array
+void wxArrayString::SetCount(size_t count)
+{
+    Alloc(count);
+
+    wxString s;
+    while ( m_nCount < count )
+        m_pItems[m_nCount++] = (wxChar *)s.c_str();
+}
+
 // removes item from array (by index)
 void wxArrayString::Remove(size_t nIndex)
 {
diff --git a/src/generic/spinctlg.cpp b/src/generic/spinctlg.cpp
index cea2e0b054..ebe1b3760b 100644
--- a/src/generic/spinctlg.cpp
+++ b/src/generic/spinctlg.cpp
@@ -69,13 +69,13 @@ protected:
 
         event.Skip();
     }
-    
+
     bool ProcessEvent(wxEvent &event)
     {
         // Hand button down events to wxSpinCtrl. Doesn't work.
         if (event.GetEventType() == wxEVT_LEFT_DOWN && m_spin->ProcessEvent( event ))
             return TRUE;
-            
+
         return wxTextCtrl::ProcessEvent( event );
     }
 
@@ -101,7 +101,7 @@ public:
     {
         m_spin = spin;
 
-        SetWindowStyle(style);
+        SetWindowStyle(style | wxSP_VERTICAL);
     }
 
 protected:
@@ -155,6 +155,17 @@ bool wxSpinCtrl::Create(wxWindow *parent,
         return FALSE;
     }
 
+    // the string value overrides the numeric one (for backwards compatibility
+    // reasons and also because it is simpler to satisfy the string value which
+    // comes much sooner in the list of arguments and leave the initial
+    // parameter unspecified)
+    if ( !value.empty() )
+    {
+        long l;
+        if ( value.ToLong(&l) )
+            initial = l;
+    }
+
     SetBackgroundColour(*wxRED);
     m_text = new wxSpinCtrlText(this, value);
     m_btn = new wxSpinCtrlButton(this, style);
diff --git a/src/generic/statusbr.cpp b/src/generic/statusbr.cpp
index e1739aa5c3..8880c2ebac 100644
--- a/src/generic/statusbr.cpp
+++ b/src/generic/statusbr.cpp
@@ -36,10 +36,6 @@
 
 IMPLEMENT_DYNAMIC_CLASS(wxStatusBarGeneric, wxWindow)
 
-#if !defined(__WIN32__) || !wxUSE_NATIVE_STATUSBAR
-    IMPLEMENT_DYNAMIC_CLASS(wxStatusBar, wxStatusBarGeneric)
-#endif // Win32 && wxUSE_NATIVE_STATUSBAR
-
 BEGIN_EVENT_TABLE(wxStatusBarGeneric, wxWindow)
     EVT_PAINT(wxStatusBarGeneric::OnPaint)
     EVT_SYS_COLOUR_CHANGED(wxStatusBarGeneric::OnSysColourChanged)
@@ -64,8 +60,6 @@ wxStatusBarGeneric::~wxStatusBarGeneric()
         SetFont(wxNullFont);
 #   endif // MSW
 
-    if ( m_statusWidths )
-        delete[] m_statusWidths;
     if ( m_statusStrings )
         delete[] m_statusStrings;
 }
@@ -93,6 +87,17 @@ bool wxStatusBarGeneric::Create(wxWindow *parent,
 
   SetFont(m_defaultStatusBarFont);
 
+  // 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 );
+
+  int height = (int)( (11*y)/10 + 2*GetBorderY());
+
+  SetSize(-1, -1, -1, height);
+
   return success;
 }
 
@@ -104,12 +109,6 @@ void wxStatusBarGeneric::SetFieldsCount(int number, const int *widths)
 
         delete[] m_statusStrings;
         m_statusStrings = new wxString[number];
-
-#if 0 // VZ: what is this for?
-        int i;
-        for (i = 0; i < number; i++)
-            m_statusStrings[i] = "";
-#endif
     }
 
     SetStatusWidths(number, widths);
diff --git a/src/msw/frame.cpp b/src/msw/frame.cpp
index abb54f3ef5..fc5e2f5a53 100644
--- a/src/msw/frame.cpp
+++ b/src/msw/frame.cpp
@@ -231,17 +231,6 @@ wxStatusBar *wxFrameMSW::OnCreateStatusBar(int number,
         statusBar = new wxStatusBar(this, id, style, name);
     }
 
-    // Set the height according to the font and the border size
-    wxClientDC dc(statusBar);
-    dc.SetFont(statusBar->GetFont());
-
-    wxCoord y;
-    dc.GetTextExtent(_T("X"), NULL, &y );
-
-    int height = (int)( (11*y)/10 + 2*statusBar->GetBorderY());
-
-    statusBar->SetSize(-1, -1, -1, height);
-
     statusBar->SetFieldsCount(number);
 
     return statusBar;
diff --git a/src/msw/statbr95.cpp b/src/msw/statbr95.cpp
index 6fc87c0d1c..b0f3413153 100644
--- a/src/msw/statbr95.cpp
+++ b/src/msw/statbr95.cpp
@@ -45,7 +45,6 @@
 // ----------------------------------------------------------------------------
 
 IMPLEMENT_DYNAMIC_CLASS(wxStatusBar95, wxWindow);
-IMPLEMENT_DYNAMIC_CLASS(wxStatusBar, wxStatusBar95)
 
 // ----------------------------------------------------------------------------
 // macros
@@ -127,7 +126,6 @@ bool wxStatusBar95::Create(wxWindow *parent,
 
 wxStatusBar95::~wxStatusBar95()
 {
-    delete [] m_statusWidths;
 }
 
 void wxStatusBar95::CopyFieldsWidth(const int widths[])
diff --git a/src/msw/window.cpp b/src/msw/window.cpp
index 742aa707aa..dc8a956358 100644
--- a/src/msw/window.cpp
+++ b/src/msw/window.cpp
@@ -2562,7 +2562,10 @@ long wxWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam
             break;
 #endif // __WIN32__
 
-#ifdef __WXUNIVERSAL__
+            // unfortunately this doesn't really work as then window which
+            // doesn't accept focus doesn't get any mouse events neither which
+            // means it can't get any input at all
+#if 0 //def __WXUNIVERSAL__
         case WM_NCHITTEST:
             // we shouldn't allow the windows which don't want to get focus to
             // get it
diff --git a/src/univ/framuniv.cpp b/src/univ/framuniv.cpp
index 19b2c610cb..4f5bca178c 100644
--- a/src/univ/framuniv.cpp
+++ b/src/univ/framuniv.cpp
@@ -77,7 +77,7 @@ void wxFrame::OnSize(wxSizeEvent& event)
 }
 
 void wxFrame::SendSizeEvent()
-{    
+{
     wxSizeEvent event(GetSize(), GetId());
     event.SetEventObject(this);
     GetEventHandler()->ProcessEvent(event);
@@ -117,9 +117,8 @@ void wxFrame::PositionStatusBar()
 {
     if ( m_frameStatusBar )
     {
-        wxCoord heightBar = m_frameStatusBar->GetSize().y;
-        m_frameStatusBar->SetSize(0, GetClientSize().y,
-                                  GetClientSize().x, heightBar);
+        wxSize size = GetClientSize();
+        m_frameStatusBar->SetSize(0, size.y, size.x, -1);
     }
 }
 
diff --git a/src/univ/statusbr.cpp b/src/univ/statusbr.cpp
new file mode 100644
index 0000000000..679e664bce
--- /dev/null
+++ b/src/univ/statusbr.cpp
@@ -0,0 +1,283 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        univ/statusbr.cpp
+// Purpose:     wxStatusBar implementation
+// Author:      Vadim Zeitlin
+// Modified by:
+// Created:     14.10.01
+// RCS-ID:      $Id$
+// Copyright:   (c) 2000 SciTech Software, Inc. (www.scitechsoft.com)
+// Licence:     wxWindows license
+/////////////////////////////////////////////////////////////////////////////
+
+// ============================================================================
+// declarations
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// headers
+// ----------------------------------------------------------------------------
+
+#ifdef __GNUG__
+    #pragma implementation "univstatusbr.h"
+#endif
+
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+    #pragma hdrstop
+#endif
+
+#if wxUSE_STATUSBAR
+
+#ifndef WX_PRECOMP
+#endif
+
+#include "wx/statusbr.h"
+
+#include "wx/univ/renderer.h"
+
+// ============================================================================
+// implementation
+// ============================================================================
+
+BEGIN_EVENT_TABLE(wxStatusBarUniv, wxStatusBarBase)
+    EVT_SIZE(wxStatusBarUniv::OnSize)
+
+    WX_EVENT_TABLE_INPUT_CONSUMER(wxStatusBarUniv)
+END_EVENT_TABLE()
+
+WX_FORWARD_TO_INPUT_CONSUMER(wxStatusBarUniv)
+
+// ----------------------------------------------------------------------------
+// creation
+// ----------------------------------------------------------------------------
+
+void wxStatusBarUniv::Init()
+{
+}
+
+bool wxStatusBarUniv::Create(wxWindow *parent,
+                             wxWindowID id,
+                             long style,
+                             const wxString& name)
+{
+    if ( !wxWindow::Create(parent, id,
+                           wxDefaultPosition, wxDefaultSize,
+                           style, name) )
+    {
+        return FALSE;
+    }
+
+    SetFieldsCount(1);
+
+    CreateInputHandler(wxINP_HANDLER_STATUSBAR);
+
+    SetSize(DoGetBestSize());
+
+    return TRUE;
+}
+
+// ----------------------------------------------------------------------------
+// drawing
+// ----------------------------------------------------------------------------
+
+wxRect wxStatusBarUniv::GetTotalFieldRect(wxCoord *borderBetweenFields)
+{
+    // determine the space we have for the fields
+    wxSize sizeBorders = m_renderer->GetStatusBarBorders(borderBetweenFields);
+
+    wxRect rect = GetClientRect();
+
+    // no, don't do this - the borders are meant to be inside this rect
+    //rect.Deflate(sizeBorders.x, sizeBorders.y);
+
+    // recalc the field widths if needed
+    if ( m_widthsAbs.IsEmpty() )
+    {
+        // the total width for the fields doesn't include the borders between
+        // them
+        m_widthsAbs = CalculateAbsWidths(rect.width -
+                                         *borderBetweenFields*(m_nFields - 1));
+    }
+
+    return rect;
+}
+
+void wxStatusBarUniv::DoDraw(wxControlRenderer *renderer)
+{
+    // get the fields rect
+    wxCoord borderBetweenFields;
+    wxRect rect = GetTotalFieldRect(&borderBetweenFields);
+
+    // prepare the DC
+    wxDC& dc = renderer->GetDC();
+    dc.SetFont(wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT));
+
+    // do draw the fields
+    int flags = IsEnabled() ? 0 : wxCONTROL_DISABLED;
+    for ( int n = 0; n < m_nFields; n++ )
+    {
+        rect.width = m_widthsAbs[n];
+
+        if ( IsExposed(rect) )
+        {
+            // the size grip may be drawn only on the last field and only if we
+            // have the corresponding style and even then only if we really can
+            // resize this frame
+            if ( n == m_nFields - 1 &&
+                 HasFlag(wxST_SIZEGRIP) &&
+                 GetParent()->HasFlag(wxRESIZE_BORDER) )
+            {
+                // NB: we use wxCONTROL_ISDEFAULT for this because it doesn't
+                //     have any meaning for the status bar otherwise anyhow
+                //     (it's still ugly, of course, but there are too few flags
+                //     to squander them for things like this)
+                flags |= wxCONTROL_ISDEFAULT;
+            }
+
+            m_renderer->DrawStatusField(dc, rect, m_statusText[n], flags);
+        }
+
+        rect.x += rect.width + borderBetweenFields;
+    }
+}
+
+void wxStatusBarUniv::RefreshField(int i)
+{
+    wxRect rect;
+    if ( GetFieldRect(i, rect) )
+    {
+        RefreshRect(rect);
+    }
+}
+
+// ----------------------------------------------------------------------------
+// fields text
+// ----------------------------------------------------------------------------
+
+void wxStatusBarUniv::SetStatusText(const wxString& text, int number)
+{
+    wxCHECK_RET( number >= 0 && number < m_nFields,
+                 _T("invalid status bar field index in SetStatusText()") );
+
+    if ( text == m_statusText[number] )
+    {
+        // nothing changed
+        return;
+    }
+
+    m_statusText[number] = text;
+
+    RefreshField(number);
+}
+
+wxString wxStatusBarUniv::GetStatusText(int number) const
+{
+    wxCHECK_MSG( number >= 0 && number < m_nFields, _T(""),
+                 _T("invalid status bar field index") );
+
+    return m_statusText[number];
+}
+
+// ----------------------------------------------------------------------------
+// fields count/widths
+// ----------------------------------------------------------------------------
+
+void wxStatusBarUniv::SetFieldsCount(int number, const int *widths)
+{
+    wxStatusBarBase::SetFieldsCount(number, widths);
+
+    m_statusText.SetCount(number);
+    m_widthsAbs.Empty();
+}
+
+void wxStatusBarUniv::SetStatusWidths(int n, const int widths[])
+{
+    wxStatusBarBase::SetStatusWidths(n, widths);
+
+    m_widthsAbs.Empty();
+}
+
+// ----------------------------------------------------------------------------
+// geometry
+// ----------------------------------------------------------------------------
+
+void wxStatusBarUniv::OnSize(wxSizeEvent& event)
+{
+    // invalidate the widths, we'll have to recalc them
+    m_widthsAbs.Empty();
+
+    // refresh entirely, shouldn't matter much as the statusbar is quick to
+    // redraw and it would be difficult to avoid it as we'd need to find out
+    // which fields exactly were affected...
+    Refresh();
+
+    event.Skip();
+}
+
+bool wxStatusBarUniv::GetFieldRect(int n, wxRect& rect) const
+{
+    wxCHECK_MSG( n >= 0 && n < m_nFields, FALSE,
+                 _T("invalid field index in GetFieldRect()") );
+
+    // this is a fix for a bug exhibited by the statbar sample: if
+    // GetFieldRect() is called from the derived class OnSize() handler, then
+    // our geometry info is wrong as our OnSize() didn't invalidate m_widthsAbs
+    // yet - so recalc it just in case
+    wxStatusBarUniv *self = wxConstCast(this, wxStatusBarUniv);
+    self->m_widthsAbs.Empty();
+
+    wxCoord borderBetweenFields;
+    rect = self->GetTotalFieldRect(&borderBetweenFields);
+    for ( int i = 0; i <= n; i++ )
+    {
+        rect.width = m_widthsAbs[i];
+
+        if ( i < n )
+            rect.x += rect.width + borderBetweenFields;
+    }
+
+    return TRUE;
+}
+
+wxCoord wxStatusBarUniv::GetHeight() const
+{
+    wxClientDC dc(wxConstCast(this, wxStatusBarUniv));
+    dc.SetFont(wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT));
+
+    return dc.GetCharHeight() + 2*GetBorderY();
+}
+
+wxSize wxStatusBarUniv::DoGetBestSize() const
+{
+    return wxSize(100, GetHeight());
+}
+
+void wxStatusBarUniv::DoSetSize(int x, int y,
+                                int width, int WXUNUSED(height),
+                                int sizeFlags)
+{
+    wxStatusBarBase::DoSetSize(x, y, width, GetHeight(), sizeFlags);
+}
+
+// ----------------------------------------------------------------------------
+// misc
+// ----------------------------------------------------------------------------
+
+void wxStatusBarUniv::SetMinHeight(int WXUNUSED(height))
+{
+    // nothing to do here, we don't support it - and why would we?
+}
+
+int wxStatusBarUniv::GetBorderX() const
+{
+    return m_renderer->GetStatusBarBorders(NULL).x;
+}
+
+int wxStatusBarUniv::GetBorderY() const
+{
+    return m_renderer->GetStatusBarBorders(NULL).y;
+}
+
+#endif // wxUSE_STATUSBAR
+
diff --git a/src/univ/themes/gtk.cpp b/src/univ/themes/gtk.cpp
index 776d9cd4e7..f7d2c1f91f 100644
--- a/src/univ/themes/gtk.cpp
+++ b/src/univ/themes/gtk.cpp
@@ -188,7 +188,6 @@ public:
         // we don't have the ticks in GTK version
     }
 
-#if wxUSE_MENUS
     virtual void DrawMenuBarItem(wxDC& dc,
                                  const wxRect& rect,
                                  const wxString& label,
@@ -205,7 +204,11 @@ public:
     virtual void DrawMenuSeparator(wxDC& dc,
                                    wxCoord y,
                                    const wxMenuGeometryInfo& geomInfo);
-#endif
+
+    virtual void DrawStatusField(wxDC& dc,
+                                 const wxRect& rect,
+                                 const wxString& label,
+                                 int flags = 0);
 
     virtual void DrawFrameTitleBar(wxDC& dc,
                                    const wxRect& rect,
@@ -285,12 +288,13 @@ public:
     virtual wxSize GetSliderThumbSize(const wxRect& rect,
                                       wxOrientation orient) const;
     virtual wxSize GetProgressBarStep() const { return wxSize(16, 32); }
-#if wxUSE_MENUS
 
     virtual wxSize GetMenuBarItemSize(const wxSize& sizeText) const;
     virtual wxMenuGeometryInfo *GetMenuGeometry(wxWindow *win,
                                                 const wxMenu& menu) const;
-#endif
+
+    virtual wxSize GetStatusBarBorders(wxCoord *borderBetweenFields) const;
+
     // helpers for "wxBitmap wxColourScheme::Get()"
     void DrawCheckBitmap(wxDC& dc, const wxRect& rect);
     void DrawUncheckBitmap(wxDC& dc, const wxRect& rect, bool isPressed);
@@ -1817,7 +1821,6 @@ void wxGTKRenderer::DrawSliderThumb(wxDC& dc,
     DrawShadedRect(dc, &rect, m_penDarkGrey, m_penHighlight);
 }
 
-#if wxUSE_MENUS
 // ----------------------------------------------------------------------------
 // menu and menubar
 // ----------------------------------------------------------------------------
@@ -1862,7 +1865,22 @@ wxMenuGeometryInfo *wxGTKRenderer::GetMenuGeometry(wxWindow *win,
 
     return NULL;
 }
-#endif // wxUSE_MENUS
+
+// ----------------------------------------------------------------------------
+// status bar
+// ----------------------------------------------------------------------------
+
+wxSize wxGTKRenderer::GetStatusBarBorders(wxCoord *borderBetweenFields) const
+{
+    return wxSize(0, 0);
+}
+
+void wxGTKRenderer::DrawStatusField(wxDC& dc,
+                                    const wxRect& rect,
+                                    const wxString& label,
+                                    int flags)
+{
+}
 
 // ----------------------------------------------------------------------------
 // combobox
diff --git a/src/univ/themes/win32.cpp b/src/univ/themes/win32.cpp
index 911234b009..b87fbd89bf 100644
--- a/src/univ/themes/win32.cpp
+++ b/src/univ/themes/win32.cpp
@@ -73,6 +73,11 @@ static const int FRAME_TITLEBAR_HEIGHT             = 18;
 static const int FRAME_BUTTON_WIDTH                = 16;
 static const int FRAME_BUTTON_HEIGHT               = 14;
 
+static const size_t NUM_STATUSBAR_GRIP_BANDS = 3;
+static const size_t WIDTH_STATUSBAR_GRIP_BAND = 4;
+static const size_t STATUSBAR_GRIP_SIZE =
+    WIDTH_STATUSBAR_GRIP_BAND*NUM_STATUSBAR_GRIP_BANDS;
+
 enum IndicatorType
 {
     IndicatorType_Check,
@@ -255,7 +260,6 @@ public:
                                  int end,
                                  int step = 1,
                                  int flags = 0);
-#if wxUSE_MENUS
 
     virtual void DrawMenuBarItem(wxDC& dc,
                                  const wxRect& rect,
@@ -273,7 +277,12 @@ public:
     virtual void DrawMenuSeparator(wxDC& dc,
                                    wxCoord y,
                                    const wxMenuGeometryInfo& geomInfo);
-#endif
+
+    virtual void DrawStatusField(wxDC& dc,
+                                 const wxRect& rect,
+                                 const wxString& label,
+                                 int flags = 0);
+
     // titlebars
     virtual void DrawFrameTitleBar(wxDC& dc,
                                    const wxRect& rect,
@@ -351,11 +360,12 @@ public:
                                       wxOrientation orient) const;
     virtual wxSize GetProgressBarStep() const { return wxSize(16, 32); }
 
-#if wxUSE_MENUS
     virtual wxSize GetMenuBarItemSize(const wxSize& sizeText) const;
     virtual wxMenuGeometryInfo *GetMenuGeometry(wxWindow *win,
                                                 const wxMenu& menu) const;
-#endif
+
+    virtual wxSize GetStatusBarBorders(wxCoord *borderBetweenFields) const;
+
 protected:
     // helper of DrawLabel() and DrawCheckOrRadioButton()
     void DoDrawLabel(wxDC& dc,
@@ -459,9 +469,9 @@ private:
           m_penDarkGrey,
           m_penLightGrey,
           m_penHighlight;
-          
+
     wxFont m_titlebarFont;
-    
+
     // titlebar icons:
     wxBitmap m_bmpFrameButtons[FrameButton_Max];
 
@@ -542,6 +552,29 @@ public:
                            bool pressed);
 };
 
+class wxWin32StatusBarInputHandler : public wxStdInputHandler
+{
+public:
+    wxWin32StatusBarInputHandler(wxInputHandler *handler);
+
+    virtual bool HandleMouse(wxInputConsumer *consumer,
+                             const wxMouseEvent& event);
+
+    virtual bool HandleMouseMove(wxInputConsumer *consumer,
+                                 const wxMouseEvent& event);
+
+protected:
+    // is the given point over the statusbar grip?
+    bool IsOnGrip(wxWindow *statbar, const wxPoint& pt) const;
+
+private:
+    // the cursor we had replaced with the resize one
+    wxCursor m_cursorOld;
+
+    // was the mouse over the grip last time we checked?
+    bool m_isOnGrip;
+};
+
 // ----------------------------------------------------------------------------
 // wxWin32ColourScheme: uses (default) Win32 colours
 // ----------------------------------------------------------------------------
@@ -1152,6 +1185,10 @@ wxInputHandler *wxWin32Theme::GetInputHandler(const wxString& control)
         else if ( control == wxINP_HANDLER_NOTEBOOK )
             handler = new wxStdNotebookInputHandler(GetDefaultInputHandler());
 #endif // wxUSE_NOTEBOOK
+#if wxUSE_STATUSBAR
+        else if ( control == wxINP_HANDLER_STATUSBAR )
+            handler = new wxWin32StatusBarInputHandler(GetDefaultInputHandler());
+#endif // wxUSE_STATUSBAR
         else if ( control == wxINP_HANDLER_TOPLEVEL )
             handler = new wxStdFrameInputHandler(GetDefaultInputHandler());
         else
@@ -1254,7 +1291,7 @@ wxColour wxWin32ColourScheme::Get(wxWin32ColourScheme::StdColour col) const
 
         case CONTROL_TEXT_DISABLED_SHADOW:
         case SHADOW_OUT:        return wxColour(GetSysColor(COLOR_BTNSHADOW));
-        
+
         case TITLEBAR:          return wxColour(GetSysColor(COLOR_INACTIVECAPTION));
         case TITLEBAR_ACTIVE:   return wxColour(GetSysColor(COLOR_ACTIVECAPTION));
         case TITLEBAR_TEXT:     return wxColour(GetSysColor(COLOR_CAPTIONTEXT));
@@ -1320,7 +1357,7 @@ wxWin32Renderer::wxWin32Renderer(const wxColourScheme *scheme)
 
     m_colHighlight = wxSCHEME_COLOUR(scheme, SHADOW_HIGHLIGHT);
     m_penHighlight = wxPen(m_colHighlight, 0, wxSOLID);
-    
+
     m_titlebarFont = wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT);
     m_titlebarFont.SetWeight(wxFONTWEIGHT_BOLD);
 
@@ -1493,7 +1530,7 @@ wxWin32Renderer::wxWin32Renderer(const wxColourScheme *scheme)
 
         m_bmpArrows[Arrow_Pressed][n] = m_bmpArrows[Arrow_Normal][n];
     }
-    
+
     // init the frame buttons bitmaps
     m_bmpFrameButtons[FrameButton_Close] = wxBitmap(frame_button_close_xpm);
     m_bmpFrameButtons[FrameButton_Minimize] = wxBitmap(frame_button_minimize_xpm);
@@ -2599,8 +2636,6 @@ void wxWin32Renderer::DrawSliderTicks(wxDC& dc,
 // menu and menubar
 // ----------------------------------------------------------------------------
 
-#if wxUSE_MENUS
-
 // wxWin32MenuGeometryInfo: the wxMenuGeometryInfo used by wxWin32Renderer
 class WXDLLEXPORT wxWin32MenuGeometryInfo : public wxMenuGeometryInfo
 {
@@ -2625,12 +2660,10 @@ private:
     // the height of a normal (not separator) item
     wxCoord m_heightItem;
 
-    friend wxMenuGeometryInfo *wxWin32Renderer::
-                GetMenuGeometry(wxWindow *, const wxMenu&) const;
+    friend wxMenuGeometryInfo *
+        wxWin32Renderer::GetMenuGeometry(wxWindow *, const wxMenu&) const;
 };
 
-#endif // wxUSE_MENUS
-
 // FIXME: all constants are hardcoded but shouldn't be
 static const wxCoord MENU_LEFT_MARGIN = 9;
 static const wxCoord MENU_RIGHT_MARGIN = 18;
@@ -2650,10 +2683,6 @@ static const wxCoord MENU_SEPARATOR_HEIGHT = 3;
 // the size of the standard checkmark bitmap
 static const wxCoord MENU_CHECK_SIZE = 9;
 
-// we can't implement these methods without wxMenuGeometryInfo implementation
-// which we don't have if !wxUSE_MENUS
-#if wxUSE_MENUS
-
 void wxWin32Renderer::DrawMenuBarItem(wxDC& dc,
                                       const wxRect& rectOrig,
                                       const wxString& label,
@@ -2865,48 +2894,81 @@ wxMenuGeometryInfo *wxWin32Renderer::GetMenuGeometry(wxWindow *win,
     return gi;
 }
 
-#else // !wxUSE_MENUS
+// ----------------------------------------------------------------------------
+// status bar
+// ----------------------------------------------------------------------------
 
-/*
-void wxWin32Renderer::DrawMenuBarItem(wxDC& WXUNUSED(dc),
-                                      const wxRect& WXUNUSED(rectOrig),
-                                      const wxString& WXUNUSED(label),
-                                      int WXUNUSED(flags),
-                                      int WXUNUSED(indexAccel))
-{
-}
+static const wxCoord STATBAR_BORDER_X = 2;
+static const wxCoord STATBAR_BORDER_Y = 2;
 
-void wxWin32Renderer::DrawMenuItem(wxDC& WXUNUSED(dc),
-                                   wxCoord WXUNUSED(y),
-                                   const wxMenuGeometryInfo& WXUNUSED(gi),
-                                   const wxString& WXUNUSED(label),
-                                   const wxString& WXUNUSED(accel),
-                                   const wxBitmap& WXUNUSED(bitmap),
-                                   int WXUNUSED(flags),
-                                   int WXUNUSED(indexAccel))
+wxSize wxWin32Renderer::GetStatusBarBorders(wxCoord *borderBetweenFields) const
 {
-}
+    if ( borderBetweenFields )
+        *borderBetweenFields = 2;
 
-void wxWin32Renderer::DrawMenuSeparator(wxDC& WXUNUSED(dc),
-                                        wxCoord WXUNUSED(y),
-                                        const wxMenuGeometryInfo& WXUNUSED(gi))
-{
+    return wxSize(STATBAR_BORDER_X, STATBAR_BORDER_Y);
 }
 
-wxSize wxWin32Renderer::GetMenuBarItemSize(const wxSize& size) const
+void wxWin32Renderer::DrawStatusField(wxDC& dc,
+                                      const wxRect& rect,
+                                      const wxString& label,
+                                      int flags)
 {
-    return size;
-}
+    wxRect rectIn;
 
-wxMenuGeometryInfo *
-wxWin32Renderer::GetMenuGeometry(wxWindow *WXUNUSED(win),
-                                 const wxMenu& WXUNUSED(menu)) const
-{
-    return NULL;
-}
-*/
+    if ( flags & wxCONTROL_ISDEFAULT )
+    {
+        // draw the size grip: it is a normal rect except that in the lower
+        // right corner we have several bands which may be used for dragging
+        // the status bar corner
+        //
+        // each band consists of 4 stripes: m_penHighlight, double
+        // m_penDarkGrey and transparent one
+        wxCoord x2 = rect.GetRight(),
+                y2 = rect.GetBottom();
 
-#endif // wxUSE_MENUS/!wxUSE_MENUS
+        // draw the upper left part of the rect normally
+        dc.SetPen(m_penDarkGrey);
+        dc.DrawLine(rect.GetLeft(), rect.GetTop(), rect.GetLeft(), y2);
+        dc.DrawLine(rect.GetLeft() + 1, rect.GetTop(), x2, rect.GetTop());
+
+        // draw the grey stripes of the grip
+        size_t n;
+        wxCoord ofs = WIDTH_STATUSBAR_GRIP_BAND - 1;
+        for ( n = 0; n < NUM_STATUSBAR_GRIP_BANDS; n++, ofs += WIDTH_STATUSBAR_GRIP_BAND )
+        {
+            dc.DrawLine(x2 - ofs + 1, y2 - 1, x2, y2 - ofs);
+            dc.DrawLine(x2 - ofs, y2 - 1, x2, y2 - ofs - 1);
+        }
+
+        // draw the white stripes
+        dc.SetPen(m_penHighlight);
+        ofs = WIDTH_STATUSBAR_GRIP_BAND + 1;
+        for ( n = 0; n < NUM_STATUSBAR_GRIP_BANDS; n++, ofs += WIDTH_STATUSBAR_GRIP_BAND )
+        {
+            dc.DrawLine(x2 - ofs + 1, y2 - 1, x2, y2 - ofs);
+        }
+
+        // draw the remaining rect boundaries
+        ofs -= WIDTH_STATUSBAR_GRIP_BAND;
+        dc.DrawLine(x2, rect.GetTop(), x2, y2 - ofs + 1);
+        dc.DrawLine(rect.GetLeft(), y2, x2 - ofs + 1, y2);
+
+        rectIn = rect;
+        rectIn.Deflate(1);
+
+        rectIn.width -= STATUSBAR_GRIP_SIZE;
+    }
+    else // normal pane
+    {
+        DrawBorder(dc, wxBORDER_STATIC, rect, flags, &rectIn);
+    }
+
+    rectIn.Deflate(STATBAR_BORDER_X, STATBAR_BORDER_Y);
+
+    wxDCClipper clipper(dc, rectIn);
+    DrawLabel(dc, label, rectIn, flags, wxALIGN_LEFT | wxALIGN_CENTRE_VERTICAL);
+}
 
 // ----------------------------------------------------------------------------
 // combobox
@@ -3104,10 +3166,10 @@ int wxWin32Renderer::PixelToScrollbar(const wxScrollBar *scrollbar,
 int wxWin32Renderer::HitTestFrame(const wxRect& rect, const wxPoint& pt, int flags) const
 {
     wxRect client = GetFrameClientArea(rect, flags);
-    
+
     if ( client.Inside(pt) )
         return wxHT_TOPLEVEL_CLIENT_AREA;
-    
+
     if ( flags & wxTOPLEVEL_TITLEBAR )
     {
         wxRect client = GetFrameClientArea(rect, flags & ~wxTOPLEVEL_TITLEBAR);
@@ -3117,11 +3179,11 @@ int wxWin32Renderer::HitTestFrame(const wxRect& rect, const wxPoint& pt, int fla
             if ( wxRect(client.GetPosition(), GetFrameIconSize()).Inside(pt) )
                 return wxHT_TOPLEVEL_ICON;
         }
-        
+
         wxRect btnRect(client.GetRight() - 2 - FRAME_BUTTON_WIDTH,
                        client.GetTop() + (FRAME_TITLEBAR_HEIGHT-FRAME_BUTTON_HEIGHT)/2,
                        FRAME_BUTTON_WIDTH, FRAME_BUTTON_HEIGHT);
-        
+
         if ( flags & wxTOPLEVEL_BUTTON_CLOSE )
         {
             if ( btnRect.Inside(pt) )
@@ -3160,7 +3222,7 @@ int wxWin32Renderer::HitTestFrame(const wxRect& rect, const wxPoint& pt, int fla
     if ( (flags & wxTOPLEVEL_BORDER) && !(flags & wxTOPLEVEL_MAXIMIZED) )
     {
         // we are certainly at one of borders, lets decide which one:
-        
+
         int border = 0;
         // dirty trick, relies on the way wxHT_TOPLEVEL_XXX are defined!
         if ( pt.x < client.x )
@@ -3173,7 +3235,7 @@ int wxWin32Renderer::HitTestFrame(const wxRect& rect, const wxPoint& pt, int fla
             border |= wxHT_TOPLEVEL_BORDER_S;
         return border;
     }
-    
+
     return wxHT_NOWHERE;
 }
 
@@ -3195,12 +3257,12 @@ void wxWin32Renderer::DrawFrameTitleBar(wxDC& dc,
         if ( flags & wxTOPLEVEL_ICON )
             DrawFrameIcon(dc, rect, icon, flags);
         DrawFrameTitle(dc, rect, title, flags);
-        
+
         wxRect client = GetFrameClientArea(rect, flags & ~wxTOPLEVEL_TITLEBAR);
         wxCoord x,y;
         x = client.GetRight() - 2 - FRAME_BUTTON_WIDTH;
         y = client.GetTop() + (FRAME_TITLEBAR_HEIGHT-FRAME_BUTTON_HEIGHT)/2;
-        
+
         if ( flags & wxTOPLEVEL_BUTTON_CLOSE )
         {
             DrawFrameButton(dc, x, y, wxTOPLEVEL_BUTTON_CLOSE,
@@ -3244,9 +3306,9 @@ void wxWin32Renderer::DrawFrameBorder(wxDC& dc,
                                       int flags)
 {
     if ( !(flags & wxTOPLEVEL_BORDER) ) return;
-    
+
     wxRect r(rect);
-    
+
     DrawShadedRect(dc, &r, m_penLightGrey, m_penBlack);
     DrawShadedRect(dc, &r, m_penHighlight, m_penDarkGrey);
     DrawShadedRect(dc, &r, m_penLightGrey, m_penLightGrey);
@@ -3260,13 +3322,13 @@ void wxWin32Renderer::DrawFrameBackground(wxDC& dc,
 {
     if ( !(flags & wxTOPLEVEL_TITLEBAR) ) return;
 
-    wxColour col = (flags & wxTOPLEVEL_ACTIVE) ? 
+    wxColour col = (flags & wxTOPLEVEL_ACTIVE) ?
                    wxSCHEME_COLOUR(m_scheme, TITLEBAR_ACTIVE) :
                    wxSCHEME_COLOUR(m_scheme, TITLEBAR);
 
     wxRect r = GetFrameClientArea(rect, flags & ~wxTOPLEVEL_TITLEBAR);
     r.height = FRAME_TITLEBAR_HEIGHT;
-    
+
     DrawBackground(dc, col, r);
 }
 
@@ -3281,7 +3343,7 @@ void wxWin32Renderer::DrawFrameTitle(wxDC& dc,
         r.x += FRAME_TITLEBAR_HEIGHT;
     else
         r.x += 1;
-    
+
     dc.SetFont(m_titlebarFont);
     dc.SetTextForeground(wxSCHEME_COLOUR(m_scheme, TITLEBAR_TEXT));
     dc.DrawLabel(title, wxNullBitmap, r, wxALIGN_LEFT | wxALIGN_CENTRE_VERTICAL);
@@ -3317,8 +3379,8 @@ void wxWin32Renderer::DrawFrameButton(wxDC& dc,
         default:
             wxFAIL_MSG(wxT("incorrect button specification"));
     }
-    
-    if ( flags & wxCONTROL_PRESSED )    
+
+    if ( flags & wxCONTROL_PRESSED )
     {
         DrawShadedRect(dc, &r, m_penBlack, m_penHighlight);
         DrawShadedRect(dc, &r, m_penDarkGrey, m_penLightGrey);
@@ -3342,7 +3404,7 @@ wxRect wxWin32Renderer::GetFrameClientArea(const wxRect& rect,
 
     if ( (flags & wxTOPLEVEL_BORDER) && !(flags & wxTOPLEVEL_MAXIMIZED) )
     {
-        int border = (flags & wxTOPLEVEL_RESIZEABLE) ? 
+        int border = (flags & wxTOPLEVEL_RESIZEABLE) ?
                         RESIZEABLE_FRAME_BORDER_THICKNESS :
                         FRAME_BORDER_THICKNESS;
         r.Inflate(-border);
@@ -3363,7 +3425,7 @@ wxSize wxWin32Renderer::GetFrameTotalSize(const wxSize& clientSize,
 
     if ( (flags & wxTOPLEVEL_BORDER) && !(flags & wxTOPLEVEL_MAXIMIZED) )
     {
-        int border = (flags & wxTOPLEVEL_RESIZEABLE) ? 
+        int border = (flags & wxTOPLEVEL_RESIZEABLE) ?
                         RESIZEABLE_FRAME_BORDER_THICKNESS :
                         FRAME_BORDER_THICKNESS;
         s.x += 2*border;
@@ -3495,11 +3557,15 @@ bool wxWin32InputHandler::HandleMouse(wxInputConsumer *control,
                                       const wxMouseEvent& event)
 {
     // clicking on the control gives it focus
-    if ( event.ButtonDown() && wxWindow::FindFocus() != control->GetInputWindow() )
+    if ( event.ButtonDown() )
     {
-        control->GetInputWindow()->SetFocus();
+        wxWindow *win = control->GetInputWindow();
+        if ( wxWindow::FindFocus() != control->GetInputWindow() )
+        {
+            win->SetFocus();
 
-        return TRUE;
+            return TRUE;
+        }
     }
 
     return FALSE;
@@ -3749,3 +3815,81 @@ bool wxWin32TextCtrlInputHandler::HandleKey(wxInputConsumer *control,
     return wxStdTextCtrlInputHandler::HandleKey(control, event, pressed);
 }
 
+// ----------------------------------------------------------------------------
+// wxWin32StatusBarInputHandler
+// ----------------------------------------------------------------------------
+
+wxWin32StatusBarInputHandler::
+wxWin32StatusBarInputHandler(wxInputHandler *handler)
+    : wxStdInputHandler(handler)
+{
+    m_isOnGrip = FALSE;
+}
+
+bool wxWin32StatusBarInputHandler::IsOnGrip(wxWindow *statbar,
+                                            const wxPoint& pt) const
+{
+    if ( statbar->HasFlag(wxST_SIZEGRIP) &&
+            statbar->GetParent()->HasFlag(wxRESIZE_BORDER) )
+    {
+        wxSize sizeSbar = statbar->GetSize();
+
+        return (sizeSbar.x - pt.x) < STATUSBAR_GRIP_SIZE &&
+               (sizeSbar.y - pt.y) < STATUSBAR_GRIP_SIZE;
+    }
+
+    return FALSE;
+}
+
+bool wxWin32StatusBarInputHandler::HandleMouse(wxInputConsumer *consumer,
+                                               const wxMouseEvent& event)
+{
+    if ( event.Button(1) )
+    {
+        if ( event.ButtonDown(1) )
+        {
+            wxWindow *statbar = consumer->GetInputWindow();
+
+            if ( IsOnGrip(statbar, event.GetPosition()) )
+            {
+                wxTopLevelWindow *tlw = wxDynamicCast(statbar->GetParent(),
+                                                      wxTopLevelWindow);
+                if ( tlw )
+                {
+                    tlw->PerformAction(wxACTION_TOPLEVEL_RESIZE,
+                                       wxHT_TOPLEVEL_BORDER_SE);
+
+                    statbar->SetCursor(m_cursorOld);
+
+                    return TRUE;
+                }
+            }
+        }
+    }
+
+    return wxStdInputHandler::HandleMouse(consumer, event);
+}
+
+bool wxWin32StatusBarInputHandler::HandleMouseMove(wxInputConsumer *consumer,
+                                                   const wxMouseEvent& event)
+{
+    wxWindow *statbar = consumer->GetInputWindow();
+
+    bool isOnGrip = IsOnGrip(statbar, event.GetPosition());
+    if ( isOnGrip != m_isOnGrip )
+    {
+        m_isOnGrip = isOnGrip;
+        if ( isOnGrip )
+        {
+            m_cursorOld = statbar->GetCursor();
+            statbar->SetCursor(wxCURSOR_SIZENWSE);
+        }
+        else
+        {
+            statbar->SetCursor(m_cursorOld);
+        }
+    }
+
+    return wxStdInputHandler::HandleMouseMove(consumer, event);
+}
+
diff --git a/src/univ/topluniv.cpp b/src/univ/topluniv.cpp
index 556873599f..c68373a528 100644
--- a/src/univ/topluniv.cpp
+++ b/src/univ/topluniv.cpp
@@ -365,13 +365,13 @@ bool wxTopLevelWindow::PerformAction(const wxControlAction& action,
         ClickTitleBarButton(numArg);
         return TRUE;
     }
-    
+
     else if ( action == wxACTION_TOPLEVEL_MOVE )
     {
         InteractiveMove(wxINTERACTIVE_MOVE);
         return TRUE;
     }
-    
+
     else if ( action == wxACTION_TOPLEVEL_RESIZE )
     {
         int flags = wxINTERACTIVE_RESIZE;
@@ -386,7 +386,7 @@ bool wxTopLevelWindow::PerformAction(const wxControlAction& action,
         InteractiveMove(flags);
         return TRUE;
     }
-    
+
     else
         return FALSE;
 }
@@ -486,25 +486,25 @@ bool wxStdFrameInputHandler::HandleMouseMove(wxInputConsumer *consumer,
     }
     else if ( consumer->GetInputWindow()->GetWindowStyle() & wxRESIZE_BORDER )
     {
-        wxTopLevelWindow *win = wxStaticCast(consumer->GetInputWindow(), 
+        wxTopLevelWindow *win = wxStaticCast(consumer->GetInputWindow(),
                                              wxTopLevelWindow);
         long hit = win->HitTest(event.GetPosition());
-        
+
         if ( hit != m_winHitTest )
         {
             m_winHitTest = hit;
-            
+
             if ( m_borderCursorOn )
             {
                 m_borderCursorOn = FALSE;
                 win->SetCursor(m_origCursor);
             }
-            
+
             if ( hit & wxHT_TOPLEVEL_ANY_BORDER )
             {
                 m_borderCursorOn = TRUE;
                 wxCursor cur;
-            
+
                 switch (hit)
                 {
                     case wxHT_TOPLEVEL_BORDER_N:
diff --git a/src/wxUniv.dsp b/src/wxUniv.dsp
index 7953d45543..2a21340399 100644
--- a/src/wxUniv.dsp
+++ b/src/wxUniv.dsp
@@ -49,7 +49,7 @@ BSC32=bscmake.exe
 # ADD BSC32 /nologo
 LIB32=link.exe -lib
 # ADD BASE LIB32 /nologo
-# ADD LIB32 /nologo /out:"..\lib\wxuniv.lib"
+# ADD LIB32 /nologo
 
 !ELSEIF  "$(CFG)" == "wxUniv - Win32 Debug"
 
@@ -197,6 +197,11 @@ SOURCE=.\common\event.cpp
 # End Source File
 # Begin Source File
 
+SOURCE=.\common\extended.c
+# SUBTRACT CPP /YX /Yc /Yu
+# End Source File
+# Begin Source File
+
 SOURCE=.\common\fddlgcmn.cpp
 # End Source File
 # Begin Source File
@@ -453,6 +458,10 @@ SOURCE=.\common\socket.cpp
 # End Source File
 # Begin Source File
 
+SOURCE=.\common\statbar.cpp
+# End Source File
+# Begin Source File
+
 SOURCE=.\common\strconv.cpp
 # End Source File
 # Begin Source File
@@ -501,6 +510,11 @@ SOURCE=.\common\txtstrm.cpp
 # End Source File
 # Begin Source File
 
+SOURCE=.\common\unzip.c
+# SUBTRACT CPP /YX /Yc /Yu
+# End Source File
+# Begin Source File
+
 SOURCE=.\common\url.cpp
 # End Source File
 # Begin Source File
@@ -551,18 +565,6 @@ SOURCE=.\common\zipstrm.cpp
 
 SOURCE=.\common\zstream.cpp
 # End Source File
-
-# Begin Source File
-
-SOURCE=.\common\extended.c
-# SUBTRACT CPP /YX /Yc /Yu
-# End Source File
-# Begin Source File
-
-SOURCE=.\common\unzip.c
-# SUBTRACT CPP /YX /Yc /Yu
-# End Source File
-
 # End Group
 # Begin Group "Generic Files"
 
@@ -709,10 +711,6 @@ SOURCE=.\generic\splitter.cpp
 # End Source File
 # Begin Source File
 
-SOURCE=.\generic\statusbr.cpp
-# End Source File
-# Begin Source File
-
 SOURCE=.\generic\tabg.cpp
 # End Source File
 # Begin Source File
@@ -743,7 +741,6 @@ SOURCE=.\generic\treelay.cpp
 
 SOURCE=.\generic\wizard.cpp
 # End Source File
-
 # End Group
 # Begin Group "wxHTML Files"
 
@@ -828,18 +825,12 @@ SOURCE=.\html\m_tables.cpp
 
 SOURCE=.\html\winpars.cpp
 # End Source File
-
 # End Group
 # Begin Group "MSW Files"
 
 # PROP Default_Filter ""
 # Begin Source File
 
-SOURCE=.\msw\dummy.cpp
-# ADD CPP /Yc"wx/wxprec.h"
-# End Source File
-# Begin Source File
-
 SOURCE=.\msw\app.cpp
 # End Source File
 # Begin Source File
@@ -904,6 +895,11 @@ SOURCE=.\msw\dir.cpp
 # End Source File
 # Begin Source File
 
+SOURCE=.\msw\dummy.cpp
+# ADD CPP /Yc"wx/wxprec.h"
+# End Source File
+# Begin Source File
+
 SOURCE=.\msw\evtloop.cpp
 # End Source File
 # Begin Source File
@@ -928,6 +924,16 @@ SOURCE=.\msw\gdiobj.cpp
 # End Source File
 # Begin Source File
 
+SOURCE=.\msw\gsocket.c
+# SUBTRACT CPP /YX /Yc /Yu
+# End Source File
+# Begin Source File
+
+SOURCE=.\msw\gsockmsw.c
+# SUBTRACT CPP /YX /Yc /Yu
+# End Source File
+# Begin Source File
+
 SOURCE=.\msw\icon.cpp
 # End Source File
 # Begin Source File
@@ -994,22 +1000,22 @@ SOURCE=.\msw\utilsexc.cpp
 
 SOURCE=.\msw\window.cpp
 # End Source File
+# End Group
+# Begin Group "Universal Files"
 
+# PROP Default_Filter ""
+# Begin Group "Theme Files"
+
+# PROP Default_Filter ""
 # Begin Source File
 
-SOURCE=.\msw\gsocket.c
-# SUBTRACT CPP /YX /Yc /Yu
+SOURCE=.\univ\themes\gtk.cpp
 # End Source File
 # Begin Source File
 
-SOURCE=.\msw\gsockmsw.c
-# SUBTRACT CPP /YX /Yc /Yu
+SOURCE=.\univ\themes\win32.cpp
 # End Source File
-
 # End Group
-# Begin Group "Universal Files"
-
-# PROP Default_Filter ""
 # Begin Source File
 
 SOURCE=.\univ\bmpbuttn.cpp
@@ -1120,6 +1126,10 @@ SOURCE=.\univ\stattext.cpp
 # End Source File
 # Begin Source File
 
+SOURCE=.\univ\statusbr.cpp
+# End Source File
+# Begin Source File
+
 SOURCE=.\univ\textctrl.cpp
 # End Source File
 # Begin Source File
@@ -1134,20 +1144,6 @@ SOURCE=.\univ\topluniv.cpp
 
 SOURCE=.\univ\winuniv.cpp
 # End Source File
-
-# Begin Group "Theme Files"
-
-# PROP Default_Filter ""
-# Begin Source File
-
-SOURCE=.\univ\themes\gtk.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\univ\themes\win32.cpp
-# End Source File
-
-# End Group
 # End Group
 # Begin Group "Headers"
 
@@ -1158,7 +1154,9 @@ SOURCE=.\univ\themes\win32.cpp
 # Begin Source File
 
 SOURCE=..\include\wx\univ\setup.h
+
 !IF  "$(CFG)" == "wxUniv - Win32 Release"
+
 # Begin Custom Build - Creating wx/setup.h from $(InputPath)
 InputPath=..\include\wx\univ\setup.h
 
@@ -1166,7 +1164,9 @@ InputPath=..\include\wx\univ\setup.h
 	copy $(InputPath) ..\lib\univ\wx\setup.h
 
 # End Custom Build
+
 !ELSEIF  "$(CFG)" == "wxUniv - Win32 Debug"
+
 # Begin Custom Build - Creating wx/setup.h from $(InputPath)
 InputPath=..\include\wx\univ\setup.h
 
@@ -1174,7 +1174,9 @@ InputPath=..\include\wx\univ\setup.h
 	copy $(InputPath) ..\lib\univd\wx\setup.h
 
 # End Custom Build
+
 !ENDIF 
+
 # End Source File
 # End Group
 # Begin Group "Common"
@@ -2064,7 +2066,6 @@ SOURCE=..\include\wx\zipstrm.h
 
 SOURCE=..\include\wx\zstream.h
 # End Source File
-
 # End Group
 # Begin Group "MSW"
 
@@ -2221,7 +2222,6 @@ SOURCE=..\include\wx\generic\treectlg.h
 
 SOURCE=..\include\wx\generic\wizard.h
 # End Source File
-
 # End Group
 # Begin Group "HTML"
 
@@ -2278,7 +2278,6 @@ SOURCE=..\include\wx\html\m_templ.h
 
 SOURCE=..\include\wx\html\winpars.h
 # End Source File
-
 # End Group
 # Begin Group "Universal"
 
-- 
2.50.0

