From ecab4dba7d33782458d7cc8b91c981d03d7b9e37 Mon Sep 17 00:00:00 2001
From: Robert Roebling <robert@roebling.de>
Date: Fri, 15 Oct 1999 14:59:44 +0000
Subject: [PATCH]   scrolling of foreign windowsplus sample

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@4000 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
---
 configure.in                    |   1 +
 include/wx/generic/scrolwin.h   | 143 +++++++++---------
 samples/scrollsub/.cvsignore    |   1 +
 samples/scrollsub/Makefile.in   |  21 +++
 samples/scrollsub/makefile.b32  |  16 ++
 samples/scrollsub/makefile.bcc  |  19 +++
 samples/scrollsub/makefile.dos  |  17 +++
 samples/scrollsub/makefile.g95  |  16 ++
 samples/scrollsub/makefile.twn  |  43 ++++++
 samples/scrollsub/makefile.vc   |  18 +++
 samples/scrollsub/makefile.wat  |  15 ++
 samples/scrollsub/scrollsub.cpp | 252 ++++++++++++++++++++++++++++++++
 samples/scrollsub/scrollsub.def |   7 +
 samples/scrollsub/scrollsub.rc  |   2 +
 src/generic/scrolwin.cpp        | 241 ++++++++++++++++--------------
 wxGTK.spec                      |   2 +-
 16 files changed, 632 insertions(+), 182 deletions(-)
 create mode 100644 samples/scrollsub/.cvsignore
 create mode 100644 samples/scrollsub/Makefile.in
 create mode 100644 samples/scrollsub/makefile.b32
 create mode 100644 samples/scrollsub/makefile.bcc
 create mode 100644 samples/scrollsub/makefile.dos
 create mode 100644 samples/scrollsub/makefile.g95
 create mode 100644 samples/scrollsub/makefile.twn
 create mode 100644 samples/scrollsub/makefile.vc
 create mode 100644 samples/scrollsub/makefile.wat
 create mode 100644 samples/scrollsub/scrollsub.cpp
 create mode 100644 samples/scrollsub/scrollsub.def
 create mode 100644 samples/scrollsub/scrollsub.rc

diff --git a/configure.in b/configure.in
index 014e565706..99d0b12495 100644
--- a/configure.in
+++ b/configure.in
@@ -3000,6 +3000,7 @@ AC_OUTPUT([
             samples/resource/Makefile
             samples/sashtest/Makefile
             samples/scroll/Makefile
+            samples/scrollsub/Makefile
             samples/splitter/Makefile
             samples/text/Makefile
             samples/thread/Makefile
diff --git a/include/wx/generic/scrolwin.h b/include/wx/generic/scrolwin.h
index cc1f9c3249..13c5a2d9f5 100644
--- a/include/wx/generic/scrolwin.h
+++ b/include/wx/generic/scrolwin.h
@@ -23,109 +23,112 @@ WXDLLEXPORT_DATA(extern const wxChar*) wxPanelNameStr;
 
 class WXDLLEXPORT wxScrolledWindow : public wxPanel
 {
-  DECLARE_ABSTRACT_CLASS(wxScrolledWindow)
-
 public:
-  wxScrolledWindow();
-  inline wxScrolledWindow(wxWindow *parent, wxWindowID id = -1,
+    wxScrolledWindow();
+    inline wxScrolledWindow(wxWindow *parent, wxWindowID id = -1,
            const wxPoint& pos = wxDefaultPosition,
            const wxSize& size = wxDefaultSize,
            long style = wxHSCROLL|wxVSCROLL,
            const wxString& name = wxPanelNameStr)
-  {
+    {
       Create(parent, id, pos, size, style, name);
-  }
+    }
 
-  ~wxScrolledWindow() { }
+    ~wxScrolledWindow();
 
-  bool Create(wxWindow *parent, wxWindowID id,
+    bool Create(wxWindow *parent, wxWindowID id,
            const wxPoint& pos = wxDefaultPosition,
            const wxSize& size = wxDefaultSize,
            long style = wxHSCROLL|wxVSCROLL,
            const wxString& name = wxPanelNameStr);
 
-  // Set client size
-  // Should take account of scrollbars
-//  virtual void SetClientSize(int width, int size);
-
-  // Is the window retained?
-//  inline bool IsRetained(void) const;
-
-  // Number of pixels per user unit (0 or -1 for no scrollbar)
-  // Length of virtual canvas in user units
-  // Length of page in user units
-  virtual void SetScrollbars(int pixelsPerUnitX, int pixelsPerUnitY,
+    // Normally the wxScrolledWindow will scroll itself, but in 
+    // some rare occasions you might want it to scroll another 
+    // window (e.g. a child of it in order to scroll only a portion 
+    // the area between the scrollbars (spreadsheet: only cell area
+    // will move). 
+    virtual void SetTargetWindow( wxWindow *target );
+    virtual wxWindow *GetTargetWindow();
+
+    // Number of pixels per user unit (0 or -1 for no scrollbar)
+    // Length of virtual canvas in user units
+    // Length of page in user units
+    virtual void SetScrollbars(int pixelsPerUnitX, int pixelsPerUnitY,
                              int noUnitsX, int noUnitsY,
                              int xPos = 0, int yPos = 0,
 			     bool noRefresh = FALSE );
 
-  // Physically scroll the window
-  virtual void Scroll(int x_pos, int y_pos);
+    // Physically scroll the window
+    virtual void Scroll(int x_pos, int y_pos);
 
 #if WXWIN_COMPATIBILITY
-  virtual void GetScrollUnitsPerPage(int *x_page, int *y_page) const;
-  virtual void CalcUnscrolledPosition(int x, int y, float *xx, float *yy) const ;
+    virtual void GetScrollUnitsPerPage(int *x_page, int *y_page) const;
+    virtual void CalcUnscrolledPosition(int x, int y, float *xx, float *yy) const ;
 #endif
 
-  int GetScrollPageSize(int orient) const ;
-  void SetScrollPageSize(int orient, int pageSize);
+    int GetScrollPageSize(int orient) const ;
+    void SetScrollPageSize(int orient, int pageSize);
 
-  virtual void GetScrollPixelsPerUnit(int *x_unit, int *y_unit) const;
-  // Enable/disable Windows scrolling in either direction.
-  // If TRUE, wxWindows scrolls the canvas and only a bit of
-  // the canvas is invalidated; no Clear() is necessary.
-  // If FALSE, the whole canvas is invalidated and a Clear() is
-  // necessary. Disable for when the scroll increment is used
-  // to actually scroll a non-constant distance
-  virtual void EnableScrolling(bool x_scrolling, bool y_scrolling);
+    virtual void GetScrollPixelsPerUnit(int *x_unit, int *y_unit) const;
+    
+    // Enable/disable Windows scrolling in either direction.
+    // If TRUE, wxWindows scrolls the canvas and only a bit of
+    // the canvas is invalidated; no Clear() is necessary.
+    // If FALSE, the whole canvas is invalidated and a Clear() is
+    // necessary. Disable for when the scroll increment is used
+    // to actually scroll a non-constant distance
+    virtual void EnableScrolling(bool x_scrolling, bool y_scrolling);
 
-  // Get the view start
-  virtual void ViewStart(int *x, int *y) const;
+    // Get the view start
+    virtual void ViewStart(int *x, int *y) const;
 
-  // Actual size in pixels when scrolling is taken into account
-  virtual void GetVirtualSize(int *x, int *y) const;
+    // Actual size in pixels when scrolling is taken into account
+    virtual void GetVirtualSize(int *x, int *y) const;
 
-  // Set the scale factor, used in PrepareDC
-  void SetScale(double xs, double ys) { m_scaleX = xs; m_scaleY = ys; }
-  double GetScaleX() const { return m_scaleX; }
-  double GetScaleY() const { return m_scaleY; }
+    // Set the scale factor, used in PrepareDC
+    void SetScale(double xs, double ys) { m_scaleX = xs; m_scaleY = ys; }
+    double GetScaleX() const { return m_scaleX; }
+    double GetScaleY() const { return m_scaleY; }
 
-  virtual void CalcScrolledPosition(int x, int y, int *xx, int *yy) const ;
-  virtual void CalcUnscrolledPosition(int x, int y, int *xx, int *yy) const ;
+    virtual void CalcScrolledPosition(int x, int y, int *xx, int *yy) const ;
+    virtual void CalcUnscrolledPosition(int x, int y, int *xx, int *yy) const ;
 
-  // Adjust the scrollbars
-  virtual void AdjustScrollbars(void);
+    // Adjust the scrollbars
+    virtual void AdjustScrollbars(void);
 
-  // Override this function to draw the graphic (or just process EVT_PAINT)
-  virtual void OnDraw(wxDC& WXUNUSED(dc)) {};
+    // Override this function to draw the graphic (or just process EVT_PAINT)
+    virtual void OnDraw(wxDC& WXUNUSED(dc)) {};
 
-  // Override this function if you don't want to have wxScrolledWindow
-  // automatically change the origin according to the scroll position.
-  virtual void PrepareDC(wxDC& dc);
+    // Override this function if you don't want to have wxScrolledWindow
+    // automatically change the origin according to the scroll position.
+    virtual void PrepareDC(wxDC& dc);
 
-  // implementation from now on
-  void OnScroll(wxScrollWinEvent& event);
-  void OnSize(wxSizeEvent& event);
-  void OnPaint(wxPaintEvent& event);
+    // implementation from now on
+    void OnScroll(wxScrollWinEvent& event);
+    void OnSize(wxSizeEvent& event);
+    void OnPaint(wxPaintEvent& event);
 
-  // Calculate scroll increment
-  virtual int CalcScrollInc(wxScrollWinEvent& event);
+    // Calculate scroll increment
+    virtual int CalcScrollInc(wxScrollWinEvent& event);
 
 protected:
-  int                   m_xScrollPixelsPerLine;
-  int                   m_yScrollPixelsPerLine;
-  bool                  m_xScrollingEnabled;
-  bool                  m_yScrollingEnabled;
-  int                   m_xScrollPosition;
-  int                   m_yScrollPosition;
-  int                   m_xScrollLines;
-  int                   m_yScrollLines;
-  int                   m_xScrollLinesPerPage;
-  int                   m_yScrollLinesPerPage;
-  double                m_scaleX;
-  double                m_scaleY;
-
-DECLARE_EVENT_TABLE()
+    wxWindow             *m_targetWindow;
+    int                   m_xScrollPixelsPerLine;
+    int                   m_yScrollPixelsPerLine;
+    bool                  m_xScrollingEnabled;
+    bool                  m_yScrollingEnabled;
+    int                   m_xScrollPosition;
+    int                   m_yScrollPosition;
+    int                   m_xScrollLines;
+    int                   m_yScrollLines;
+    int                   m_xScrollLinesPerPage;
+    int                   m_yScrollLinesPerPage;
+    double                m_scaleX;
+    double                m_scaleY;
+
+private:
+    DECLARE_EVENT_TABLE()
+    DECLARE_ABSTRACT_CLASS(wxScrolledWindow)
 };
 
 #endif
diff --git a/samples/scrollsub/.cvsignore b/samples/scrollsub/.cvsignore
new file mode 100644
index 0000000000..8b13789179
--- /dev/null
+++ b/samples/scrollsub/.cvsignore
@@ -0,0 +1 @@
+
diff --git a/samples/scrollsub/Makefile.in b/samples/scrollsub/Makefile.in
new file mode 100644
index 0000000000..b3c334a75e
--- /dev/null
+++ b/samples/scrollsub/Makefile.in
@@ -0,0 +1,21 @@
+#
+# File:		makefile.unx
+# Author:	Julian Smart
+# Created:	1998
+# Updated:	
+# Copyright:	(c) 1998 Julian Smart
+#
+# "%W% %G%"
+#
+# Makefile for scrollsub example (UNIX).
+
+top_srcdir = @top_srcdir@
+top_builddir = ../..
+program_dir = samples/scrollsub
+
+PROGRAM=scrollsub
+
+OBJECTS=$(PROGRAM).o
+
+include ../../src/makeprog.env
+
diff --git a/samples/scrollsub/makefile.b32 b/samples/scrollsub/makefile.b32
new file mode 100644
index 0000000000..c76d86361a
--- /dev/null
+++ b/samples/scrollsub/makefile.b32
@@ -0,0 +1,16 @@
+#
+# File:		makefile.b32
+# Author:	Julian Smart
+# Created:	1999
+# Updated:	
+# Copyright:
+#
+# Makefile : Builds sample for 32-bit BC++
+
+WXDIR = $(WXWIN)
+
+TARGET=scrollsub
+OBJECTS = $(TARGET).obj
+
+!include $(WXDIR)\src\makeprog.b32
+
diff --git a/samples/scrollsub/makefile.bcc b/samples/scrollsub/makefile.bcc
new file mode 100644
index 0000000000..2662075f2e
--- /dev/null
+++ b/samples/scrollsub/makefile.bcc
@@ -0,0 +1,19 @@
+#
+# File:		makefile.bcc
+# Author:	Julian Smart
+# Created:	1998
+# Updated:	
+#
+# Builds a BC++ 16-bit sample
+
+!if "$(WXWIN)" == ""
+!error You must define the WXWIN variable in autoexec.bat, e.g. WXWIN=c:\wx
+!endif
+
+WXDIR = $(WXWIN)
+
+TARGET=scrollsub
+OBJECTS=$(TARGET).obj
+
+!include $(WXDIR)\src\makeprog.bcc
+
diff --git a/samples/scrollsub/makefile.dos b/samples/scrollsub/makefile.dos
new file mode 100644
index 0000000000..8cbdf39db7
--- /dev/null
+++ b/samples/scrollsub/makefile.dos
@@ -0,0 +1,17 @@
+#
+# File:		makefile.dos
+# Author:	Julian Smart
+# Created:	1998
+# Updated:	
+#
+# Makefile : Builds 16-bit sample, VC++ 1.5
+# Use FINAL=1 argument to nmake to build final version with no debugging
+# info
+
+WXDIR = $(WXWIN)
+
+TARGET=scrollsub
+OBJECTS=$(TARGET).obj
+
+!include $(WXDIR)\src\makeprog.msc
+
diff --git a/samples/scrollsub/makefile.g95 b/samples/scrollsub/makefile.g95
new file mode 100644
index 0000000000..478c653287
--- /dev/null
+++ b/samples/scrollsub/makefile.g95
@@ -0,0 +1,16 @@
+#
+# File:         makefile.g95
+# Author:       Julian Smart
+# Created:      1999
+# Updated:
+# Copyright:    (c) Julian Smart, 1999
+#
+# Makefile for wxWindows sample (Cygwin/Mingw32).
+
+WXDIR = ../..
+
+TARGET=scrollsub
+OBJECTS = $(TARGET).o
+
+include $(WXDIR)/src/makeprog.g95
+
diff --git a/samples/scrollsub/makefile.twn b/samples/scrollsub/makefile.twn
new file mode 100644
index 0000000000..48c00e2567
--- /dev/null
+++ b/samples/scrollsub/makefile.twn
@@ -0,0 +1,43 @@
+#
+# File:		makefile.unx
+# Author:	Julian Smart
+# Created:	1993
+# Updated:	
+# Copyright:	(c) 1993, AIAI, University of Edinburgh
+#
+# "%W% %G%"
+#
+# Makefile for scrollsub example (UNIX).
+
+WXDIR = ../..
+
+# All common UNIX compiler flags and options are now in
+# this central makefile.
+include $(WXDIR)/src/maketwin.env
+
+OBJECTS = $(OBJDIR)/scrollsub.$(OBJSUFF) $(OBJDIR)/scroll_resources.$(OBJSUFF)
+
+all:    $(OBJDIR) scrollsub$(GUISUFFIX)$(EXESUFF)
+
+wx:
+
+$(OBJDIR):
+	mkdir $(OBJDIR)
+
+scrollsub$(GUISUFFIX)$(EXESUFF):	$(OBJECTS) $(WXLIB)
+	$(CC) $(LDFLAGS) -o scrollsub$(GUISUFFIX)$(EXESUFF) $(OBJECTS) $(LDLIBS)
+
+$(OBJDIR)/scrollsub.$(OBJSUFF):	scrollsub.$(SRCSUFF)
+	$(CC) -c $(CPPFLAGS) -o $@ scrollsub.$(SRCSUFF)
+
+scroll_resources.c:  scrollsub.rc
+	$(RESCOMP) $(RCINPUTSWITCH) scrollsub.rc $(RCOUTPUTSWITCH) scroll_resources.c $(RESFLAGS)
+
+$(OBJDIR)/scroll_resources.$(OBJSUFF):	scroll_resources.c
+	$(CC) -c $(CPPFLAGS) -o $@ scroll_resources.c
+
+#$(OBJDIR)/scroll_resources.o:  scrollsub.rc
+#	$(RESCOMP) $(RCINPUTSWITCH) scrollsub.rc $(RCOUTPUTSWITCH) $(OBJDIR)/scroll_resources.o $(RESFLAGS)
+
+clean:
+	rm -f $(OBJECTS) scrollsub$(GUISUFFIX).exe core *.rsc *.res
diff --git a/samples/scrollsub/makefile.vc b/samples/scrollsub/makefile.vc
new file mode 100644
index 0000000000..7220b6719f
--- /dev/null
+++ b/samples/scrollsub/makefile.vc
@@ -0,0 +1,18 @@
+#
+# File:		makefile.vc
+# Author:	Julian Smart
+# Created:	1999
+# Updated:	
+# Copyright:	(c) Julian Smart
+#
+# Makefile : Builds sample (VC++, WIN32)
+# Use FINAL=1 argument to nmake to build final version with no debug info.
+
+# Set WXDIR for your system
+WXDIR = $(WXWIN)
+
+PROGRAM=scrollsub
+OBJECTS = $(PROGRAM).obj
+
+!include $(WXDIR)\src\makeprog.vc
+
diff --git a/samples/scrollsub/makefile.wat b/samples/scrollsub/makefile.wat
new file mode 100644
index 0000000000..b64d0c9a09
--- /dev/null
+++ b/samples/scrollsub/makefile.wat
@@ -0,0 +1,15 @@
+#
+# Makefile for WATCOM
+#
+# Created by Julian Smart, January 1999
+# 
+#
+
+WXDIR = $(%WXWIN)
+
+PROGRAM = scrollsub
+OBJECTS = $(PROGRAM).obj
+
+!include $(WXDIR)\src\makeprog.wat
+
+
diff --git a/samples/scrollsub/scrollsub.cpp b/samples/scrollsub/scrollsub.cpp
new file mode 100644
index 0000000000..da86fbb5ac
--- /dev/null
+++ b/samples/scrollsub/scrollsub.cpp
@@ -0,0 +1,252 @@
+/*
+ * Program: scrollsub
+ *
+ * Author: Robert Roebling
+ *
+ * Copyright: (C) 1999, Robert Roebling
+ *
+ */
+
+// For compilers that support precompilation, includes "wx/wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+
+#ifndef WX_PRECOMP
+#include "wx/wx.h"
+#endif
+
+#include "wx/image.h"
+#include "wx/listctrl.h"
+#include "wx/sizer.h"
+#include "wx/log.h"
+
+
+// derived classes
+
+class MyFrame;
+class MyScrolledWindow;
+class MyCanvas;
+class MyApp;
+
+// MyScrolledWindow
+
+class MyScrolledWindow: public wxScrolledWindow
+{
+public:
+    MyScrolledWindow() {}
+    MyScrolledWindow( wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size );
+    ~MyScrolledWindow();
+    void OnPaint( wxPaintEvent &event );
+
+private:
+    MyCanvas    *m_canvas;
+
+    DECLARE_DYNAMIC_CLASS(MyScrolledWindow)
+    DECLARE_EVENT_TABLE()
+};
+
+// MyCanvas
+
+class MyCanvas: public wxPanel
+{
+public:
+    MyCanvas() {}
+    MyCanvas( wxScrolledWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size );
+    ~MyCanvas();
+    void OnPaint( wxPaintEvent &event );
+
+private:
+    wxScrolledWindow   *m_owner;
+
+    DECLARE_DYNAMIC_CLASS(MyCanvas)
+    DECLARE_EVENT_TABLE()
+};
+
+// MyFrame
+
+class MyFrame: public wxFrame
+{
+public:
+    MyFrame();
+
+    void OnAbout( wxCommandEvent &event );
+    void OnQuit( wxCommandEvent &event );
+
+    wxScrolledWindow   *m_scrolled;
+    wxTextCtrl         *m_log;
+
+private:
+    DECLARE_DYNAMIC_CLASS(MyFrame)
+    DECLARE_EVENT_TABLE()
+};
+
+// MyApp
+
+class MyApp: public wxApp
+{
+public:
+    virtual bool OnInit();
+};
+
+// main program
+
+IMPLEMENT_APP(MyApp)
+
+// MyScrolledWindow
+
+IMPLEMENT_DYNAMIC_CLASS(MyScrolledWindow, wxScrolledWindow)
+
+BEGIN_EVENT_TABLE(MyScrolledWindow, wxScrolledWindow)
+  EVT_PAINT(        MyScrolledWindow::OnPaint)
+END_EVENT_TABLE()
+
+MyScrolledWindow::MyScrolledWindow( wxWindow *parent, wxWindowID id,
+                    const wxPoint &pos, const wxSize &size )
+        : wxScrolledWindow( parent, id, pos, size, wxSUNKEN_BORDER, "test canvas" )
+{
+    m_canvas = new MyCanvas( this, -1, wxDefaultPosition, wxDefaultSize );
+    
+    SetTargetWindow( m_canvas );
+
+    SetBackgroundColour( "WHEAT" );
+  
+    SetCursor( wxCursor( wxCURSOR_HAND ) );
+    
+    
+    wxBoxSizer *topsizer = new wxBoxSizer( wxVERTICAL );
+    
+    topsizer->Add( m_canvas, 1, wxEXPAND|wxALL, 30 );
+
+    SetAutoLayout( TRUE );
+    SetSizer( topsizer );
+}
+
+MyScrolledWindow::~MyScrolledWindow()
+{
+}
+
+void MyScrolledWindow::OnPaint( wxPaintEvent &WXUNUSED(event) )
+{
+    wxPaintDC dc( this );
+
+    wxSize size( GetClientSize() );
+    
+    long w,h;
+    dc.GetTextExtent( wxT("Headline"), &w, &h );
+
+    dc.DrawText( wxT("Headline"), long (size.x / 2 - w / 2), 10 );
+}
+
+// MyCanvas
+
+IMPLEMENT_DYNAMIC_CLASS(MyCanvas, wxPanel)
+
+BEGIN_EVENT_TABLE(MyCanvas, wxPanel)
+  EVT_PAINT(      MyCanvas::OnPaint)
+END_EVENT_TABLE()
+
+MyCanvas::MyCanvas( wxScrolledWindow *parent, wxWindowID id,
+                    const wxPoint &pos, const wxSize &size )
+        : wxPanel( parent, id, pos, size, wxSUNKEN_BORDER, "test canvas" )
+{
+    m_owner = parent;
+    
+    (void)new wxButton( this, -1, "Hallo I", wxPoint(20,20), wxSize(100,30) );
+    (void)new wxButton( this, -1, "Hallo II", wxPoint(220,20), wxSize(100,30) );
+
+    SetBackgroundColour( *wxWHITE );
+  
+    SetCursor( wxCursor( wxCURSOR_IBEAM ) );
+}
+
+MyCanvas::~MyCanvas()
+{
+}
+
+void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) )
+{
+    wxPaintDC dc( this );
+    m_owner->PrepareDC( dc );
+
+    dc.DrawText( "Some text", 140, 140 );
+  
+    dc.DrawRectangle( 100, 160, 200, 200 );
+    
+    dc.SetBrush( *wxTRANSPARENT_BRUSH );
+    
+    dc.DrawRectangle( 10, 10, 480, 980 );
+}
+
+
+// MyFrame
+
+const int ID_QUIT  = 108;
+const int ID_ABOUT = 109;
+
+IMPLEMENT_DYNAMIC_CLASS( MyFrame, wxFrame )
+
+BEGIN_EVENT_TABLE(MyFrame,wxFrame)
+  EVT_MENU    (ID_ABOUT, MyFrame::OnAbout)
+  EVT_MENU    (ID_QUIT,  MyFrame::OnQuit)
+END_EVENT_TABLE()
+
+MyFrame::MyFrame()
+       : wxFrame( (wxFrame *)NULL, -1, "wxScrolledWindow sample",
+                  wxPoint(20,20), wxSize(470,500) )
+{
+    wxMenu *file_menu = new wxMenu();
+    file_menu->Append( ID_ABOUT, "&About..");
+    file_menu->Append( ID_QUIT, "E&xit\tAlt-X");
+
+    wxMenuBar *menu_bar = new wxMenuBar();
+    menu_bar->Append(file_menu, "&File");
+
+    SetMenuBar( menu_bar );
+
+    CreateStatusBar(2);
+    int widths[] = { -1, 100 };
+    SetStatusWidths( 2, widths );
+
+    m_scrolled = new MyScrolledWindow( this, -1, wxPoint(0,0), wxSize(100,100) );
+    m_scrolled->SetScrollbars( 10, 10, 50, 100 );
+  
+    m_log = new wxTextCtrl( this, -1, "This is the log window.\n", wxPoint(0,0), wxSize(100,100), wxTE_MULTILINE );
+    wxLog *old_log = wxLog::SetActiveTarget( new wxLogTextCtrl( m_log ) );
+    delete old_log;
+    
+    wxBoxSizer *topsizer = new wxBoxSizer( wxVERTICAL );
+    
+    topsizer->Add( m_scrolled, 1, wxEXPAND );
+    topsizer->Add( m_log, 0, wxEXPAND );
+
+    SetAutoLayout( TRUE );
+    SetSizer( topsizer );
+}
+
+void MyFrame::OnQuit( wxCommandEvent &WXUNUSED(event) )
+{
+  Close( TRUE );
+}
+
+void MyFrame::OnAbout( wxCommandEvent &WXUNUSED(event) )
+{
+  (void)wxMessageBox( "wxScroll demo II\n"
+                      "Robert Roebling (c) 1998",
+                      "About wxScroll II Demo", wxICON_INFORMATION | wxOK );
+}
+
+//-----------------------------------------------------------------------------
+// MyApp
+//-----------------------------------------------------------------------------
+
+bool MyApp::OnInit()
+{
+    wxFrame *frame = new MyFrame();
+    frame->Show( TRUE );
+
+    return TRUE;
+}
+
diff --git a/samples/scrollsub/scrollsub.def b/samples/scrollsub/scrollsub.def
new file mode 100644
index 0000000000..040673a083
--- /dev/null
+++ b/samples/scrollsub/scrollsub.def
@@ -0,0 +1,7 @@
+NAME         ScrollSub
+DESCRIPTION  'ScrollSub wxWindows application'
+EXETYPE      WINDOWS
+CODE         PRELOAD MOVEABLE DISCARDABLE
+DATA         PRELOAD MOVEABLE MULTIPLE
+HEAPSIZE     4048
+STACKSIZE    16000
diff --git a/samples/scrollsub/scrollsub.rc b/samples/scrollsub/scrollsub.rc
new file mode 100644
index 0000000000..82bdf07561
--- /dev/null
+++ b/samples/scrollsub/scrollsub.rc
@@ -0,0 +1,2 @@
+#include "wx/msw/wx.rc"
+
diff --git a/src/generic/scrolwin.cpp b/src/generic/scrolwin.cpp
index 81a4a152de..b3646bef6a 100644
--- a/src/generic/scrolwin.cpp
+++ b/src/generic/scrolwin.cpp
@@ -80,6 +80,8 @@ bool wxScrolledWindow::Create(wxWindow *parent, wxWindowID id,
     m_yScrollLinesPerPage = 0;
     m_scaleX = 1.0;
     m_scaleY = 1.0;
+    
+    m_targetWindow = this;
 
     return wxPanel::Create(parent, id, pos, size, style, name);
 }
@@ -147,7 +149,7 @@ void wxScrolledWindow::SetScrollbars (int pixelsPerUnitX, int pixelsPerUnitY,
     AdjustScrollbars();
    
     if (do_refresh && !noRefresh) 
-	Refresh(); 
+	m_targetWindow->Refresh(); 
    
 #ifdef __WXMSW__
    // Necessary?
@@ -155,6 +157,21 @@ void wxScrolledWindow::SetScrollbars (int pixelsPerUnitX, int pixelsPerUnitY,
 #endif
 }
 
+wxScrolledWindow::~wxScrolledWindow()
+{
+}
+
+void wxScrolledWindow::SetTargetWindow( wxWindow *target )
+{
+    wxASSERT_MSG( target, wxT("target window must not be NULL") );
+    m_targetWindow = target;
+}
+
+wxWindow *wxScrolledWindow::GetTargetWindow()
+{
+    return m_targetWindow;
+}
+
 void wxScrolledWindow::OnScroll(wxScrollWinEvent& event)
 {
     int orient = event.GetOrientation();
@@ -185,130 +202,132 @@ void wxScrolledWindow::OnScroll(wxScrollWinEvent& event)
     if (orient == wxHORIZONTAL)
     {
        if (m_xScrollingEnabled)
-            ScrollWindow(-m_xScrollPixelsPerLine * nScrollInc, 0, (const wxRect *) NULL);
+            m_targetWindow->ScrollWindow(-m_xScrollPixelsPerLine * nScrollInc, 0, (const wxRect *) NULL);
        else
-            Refresh();
+            m_targetWindow->Refresh();
     }
     else
     {
         if (m_yScrollingEnabled)
-            ScrollWindow(0, -m_yScrollPixelsPerLine * nScrollInc, (const wxRect *) NULL);
+            m_targetWindow->ScrollWindow(0, -m_yScrollPixelsPerLine * nScrollInc, (const wxRect *) NULL);
         else
-            Refresh();
+            m_targetWindow->Refresh();
   }
 }
 
 int wxScrolledWindow::CalcScrollInc(wxScrollWinEvent& event)
 {
-  int pos = event.GetPosition();
-  int orient = event.GetOrientation();
+    int pos = event.GetPosition();
+    int orient = event.GetOrientation();
 
-  int nScrollInc = 0;
-  switch (event.GetEventType())
-  {
-    case wxEVT_SCROLLWIN_TOP:
+    int nScrollInc = 0;
+    switch (event.GetEventType())
     {
-      if (orient == wxHORIZONTAL)
-        nScrollInc = - m_xScrollPosition;
-      else
-        nScrollInc = - m_yScrollPosition;
-      break;
-    }
-    case wxEVT_SCROLLWIN_BOTTOM:
-    {
-      if (orient == wxHORIZONTAL)
-        nScrollInc = m_xScrollLines - m_xScrollPosition;
-      else
-        nScrollInc = m_yScrollLines - m_yScrollPosition;
-      break;
-    }
-    case wxEVT_SCROLLWIN_LINEUP:
-    {
-      nScrollInc = -1;
-      break;
-    }
-    case wxEVT_SCROLLWIN_LINEDOWN:
-    {
-      nScrollInc = 1;
-      break;
-    }
-    case wxEVT_SCROLLWIN_PAGEUP:
-    {
-      if (orient == wxHORIZONTAL)
-        nScrollInc = -GetScrollPageSize(wxHORIZONTAL);
-      else
-        nScrollInc = -GetScrollPageSize(wxVERTICAL);
-      break;
-    }
-    case wxEVT_SCROLLWIN_PAGEDOWN:
-    {
-      if (orient == wxHORIZONTAL)
-        nScrollInc = GetScrollPageSize(wxHORIZONTAL);
-      else
-        nScrollInc = GetScrollPageSize(wxVERTICAL);
-      break;
-    }
-    case wxEVT_SCROLLWIN_THUMBTRACK:
-    {
-      if (orient == wxHORIZONTAL)
-        nScrollInc = pos - m_xScrollPosition;
-      else
-        nScrollInc = pos - m_yScrollPosition;
-      break;
-    }
-    default:
-    {
-      break;
+        case wxEVT_SCROLLWIN_TOP:
+        {
+            if (orient == wxHORIZONTAL)
+                nScrollInc = - m_xScrollPosition;
+            else
+                nScrollInc = - m_yScrollPosition;
+            break;
+        }
+        case wxEVT_SCROLLWIN_BOTTOM:
+        {
+            if (orient == wxHORIZONTAL)
+                nScrollInc = m_xScrollLines - m_xScrollPosition;
+            else
+                nScrollInc = m_yScrollLines - m_yScrollPosition;
+            break;
+        }
+        case wxEVT_SCROLLWIN_LINEUP:
+        {
+            nScrollInc = -1;
+            break;
+        }
+        case wxEVT_SCROLLWIN_LINEDOWN:
+        {
+            nScrollInc = 1;
+            break;
+        }
+        case wxEVT_SCROLLWIN_PAGEUP:
+        {
+            if (orient == wxHORIZONTAL)
+                nScrollInc = -GetScrollPageSize(wxHORIZONTAL);
+            else
+                nScrollInc = -GetScrollPageSize(wxVERTICAL);
+            break;
+        }
+        case wxEVT_SCROLLWIN_PAGEDOWN:
+        {
+            if (orient == wxHORIZONTAL)
+                nScrollInc = GetScrollPageSize(wxHORIZONTAL);
+            else
+                nScrollInc = GetScrollPageSize(wxVERTICAL);
+            break;
+        }
+        case wxEVT_SCROLLWIN_THUMBTRACK:
+        {
+            if (orient == wxHORIZONTAL)
+                nScrollInc = pos - m_xScrollPosition;
+            else
+                nScrollInc = pos - m_yScrollPosition;
+            break;
+        }
+        default:
+        {
+            break;
+        }
     }
-  }
 
-  if (orient == wxHORIZONTAL)
-  {
-    if (m_xScrollPixelsPerLine > 0) {
-      int w, h;
-      GetClientSize(&w, &h);
-
-      int nMaxWidth = m_xScrollLines*m_xScrollPixelsPerLine;
-      int noPositions = (int) ( ((nMaxWidth - w)/(float)m_xScrollPixelsPerLine) + 0.5 );
-      if (noPositions < 0)
-	noPositions = 0;
-
-      if ( (m_xScrollPosition + nScrollInc) < 0 )
-	nScrollInc = -m_xScrollPosition; // As -ve as we can go
-      else if ( (m_xScrollPosition + nScrollInc) > noPositions )
-	nScrollInc = noPositions - m_xScrollPosition; // As +ve as we can go
+    if (orient == wxHORIZONTAL)
+    {
+        if (m_xScrollPixelsPerLine > 0) 
+        {
+            int w, h;
+            m_targetWindow->GetClientSize(&w, &h);
+
+            int nMaxWidth = m_xScrollLines*m_xScrollPixelsPerLine;
+            int noPositions = (int) ( ((nMaxWidth - w)/(double)m_xScrollPixelsPerLine) + 0.5 );
+            if (noPositions < 0)
+	        noPositions = 0;
+
+            if ( (m_xScrollPosition + nScrollInc) < 0 )
+	        nScrollInc = -m_xScrollPosition; // As -ve as we can go
+            else if ( (m_xScrollPosition + nScrollInc) > noPositions )
+	        nScrollInc = noPositions - m_xScrollPosition; // As +ve as we can go
+        }
+        else
+            m_targetWindow->Refresh();
     }
     else
-      Refresh();
-  }
-  else
-  {
-    if (m_yScrollPixelsPerLine > 0) {
-      int w, h;
-      GetClientSize(&w, &h);
+    {
+        if (m_yScrollPixelsPerLine > 0) 
+	{
+            int w, h;
+            m_targetWindow->GetClientSize(&w, &h);
       
-      int nMaxHeight = m_yScrollLines*m_yScrollPixelsPerLine;
-      int noPositions = (int) ( ((nMaxHeight - h)/(float)m_yScrollPixelsPerLine) + 0.5 );
-      if (noPositions < 0)
-	noPositions = 0;
+            int nMaxHeight = m_yScrollLines*m_yScrollPixelsPerLine;
+            int noPositions = (int) ( ((nMaxHeight - h)/(double)m_yScrollPixelsPerLine) + 0.5 );
+            if (noPositions < 0)
+	        noPositions = 0;
       
-      if ( (m_yScrollPosition + nScrollInc) < 0 )
-	nScrollInc = -m_yScrollPosition; // As -ve as we can go
-      else if ( (m_yScrollPosition + nScrollInc) > noPositions )
-	nScrollInc = noPositions - m_yScrollPosition; // As +ve as we can go
+            if ( (m_yScrollPosition + nScrollInc) < 0 )
+	        nScrollInc = -m_yScrollPosition; // As -ve as we can go
+            else if ( (m_yScrollPosition + nScrollInc) > noPositions )
+	        nScrollInc = noPositions - m_yScrollPosition; // As +ve as we can go
+        }
+        else
+            m_targetWindow->Refresh();
     }
-    else
-      Refresh();
-  }
 
-  return nScrollInc;
+    return nScrollInc;
 }
 
 // Adjust the scrollbars - new version.
 void wxScrolledWindow::AdjustScrollbars()
 {
     int w, h;
-    GetClientSize(&w, &h);
+    m_targetWindow->GetClientSize(&w, &h);
     
     int oldXScroll = m_xScrollPosition;
     int oldYScroll = m_yScrollPosition;
@@ -317,7 +336,7 @@ void wxScrolledWindow::AdjustScrollbars()
     {
 	// Calculate page size i.e. number of scroll units you get on the
 	// current client window
-        int noPagePositions = (int) ( (w/(float)m_xScrollPixelsPerLine) + 0.5 );
+        int noPagePositions = (int) ( (w/(double)m_xScrollPixelsPerLine) + 0.5 );
         if (noPagePositions < 1) noPagePositions = 1;
 
         // Correct position if greater than extent of canvas minus
@@ -339,7 +358,7 @@ void wxScrolledWindow::AdjustScrollbars()
     {
 	// Calculate page size i.e. number of scroll units you get on the
 	// current client window
-        int noPagePositions = (int) ( (h/(float)m_yScrollPixelsPerLine) + 0.5 );
+        int noPagePositions = (int) ( (h/(double)m_yScrollPixelsPerLine) + 0.5 );
         if (noPagePositions < 1) noPagePositions = 1;
 
         // Correct position if greater than extent of canvas minus
@@ -360,17 +379,17 @@ void wxScrolledWindow::AdjustScrollbars()
     if (oldXScroll != m_xScrollPosition)
     {
        if (m_xScrollingEnabled)
-            ScrollWindow( m_xScrollPixelsPerLine * (oldXScroll-m_xScrollPosition), 0, (const wxRect *) NULL );
+            m_targetWindow->ScrollWindow( m_xScrollPixelsPerLine * (oldXScroll-m_xScrollPosition), 0, (const wxRect *) NULL );
        else
-            Refresh();
+            m_targetWindow->Refresh();
     }
     
     if (oldYScroll != m_yScrollPosition)
     {
         if (m_yScrollingEnabled)
-            ScrollWindow( 0, m_yScrollPixelsPerLine * (oldYScroll-m_yScrollPosition), (const wxRect *) NULL );
+            m_targetWindow->ScrollWindow( 0, m_yScrollPixelsPerLine * (oldYScroll-m_yScrollPosition), (const wxRect *) NULL );
         else
-            Refresh();
+            m_targetWindow->Refresh();
     }
 }
 
@@ -452,7 +471,7 @@ void wxScrolledWindow::Scroll( int x_pos, int y_pos )
         ((y_pos == -1) || (y_pos == m_yScrollPosition))) return;
   
     int w, h;
-    GetClientSize(&w, &h);
+    m_targetWindow->GetClientSize(&w, &h);
 
     if (x_pos != -1)
     {
@@ -461,7 +480,7 @@ void wxScrolledWindow::Scroll( int x_pos, int y_pos )
     
 	// Calculate page size i.e. number of scroll units you get on the
 	// current client window
-        int noPagePositions = (int) ( (w/(float)m_xScrollPixelsPerLine) + 0.5 );
+        int noPagePositions = (int) ( (w/(double)m_xScrollPixelsPerLine) + 0.5 );
         if (noPagePositions < 1) noPagePositions = 1;
 
         // Correct position if greater than extent of canvas minus
@@ -469,9 +488,9 @@ void wxScrolledWindow::Scroll( int x_pos, int y_pos )
         m_xScrollPosition = wxMin( m_xScrollLines-noPagePositions, m_xScrollPosition );
         m_xScrollPosition = wxMax( 0, m_xScrollPosition );
       
-        SetScrollPos( wxHORIZONTAL, m_xScrollPosition, TRUE );
+        m_targetWindow->SetScrollPos( wxHORIZONTAL, m_xScrollPosition, TRUE );
 	
-	ScrollWindow( (old_x-m_xScrollPosition)*m_xScrollPixelsPerLine, 0 );
+	m_targetWindow->ScrollWindow( (old_x-m_xScrollPosition)*m_xScrollPixelsPerLine, 0 );
     }
     if (y_pos != -1)
     {
@@ -480,7 +499,7 @@ void wxScrolledWindow::Scroll( int x_pos, int y_pos )
 	
 	// Calculate page size i.e. number of scroll units you get on the
 	// current client window
-        int noPagePositions = (int) ( (h/(float)m_yScrollPixelsPerLine) + 0.5 );
+        int noPagePositions = (int) ( (h/(double)m_yScrollPixelsPerLine) + 0.5 );
         if (noPagePositions < 1) noPagePositions = 1;
 
         // Correct position if greater than extent of canvas minus
@@ -488,9 +507,9 @@ void wxScrolledWindow::Scroll( int x_pos, int y_pos )
         m_yScrollPosition = wxMin( m_yScrollLines-noPagePositions, m_yScrollPosition );
         m_yScrollPosition = wxMax( 0, m_yScrollPosition );
 	
-        SetScrollPos( wxVERTICAL, m_yScrollPosition, TRUE );
+        m_targetWindow->SetScrollPos( wxVERTICAL, m_yScrollPosition, TRUE );
 	
-	ScrollWindow( 0, (old_y-m_yScrollPosition)*m_yScrollPixelsPerLine );
+	m_targetWindow->ScrollWindow( 0, (old_y-m_yScrollPosition)*m_yScrollPixelsPerLine );
     }
     
     
diff --git a/wxGTK.spec b/wxGTK.spec
index f90e6e65f7..19682dac18 100644
--- a/wxGTK.spec
+++ b/wxGTK.spec
@@ -34,7 +34,7 @@ Header files for the wxGTK, the GTK+ 1.2 port of the wxWindows library.
 
 %prep
 %setup -n wxGTK
-./configure --prefix=%{pref} --enable-threads --disable-std_iostreams
+./configure --prefix=%{pref} --enable-threads --disable-std_iostreams --disable-newgrid
 
 %build
 make
-- 
2.50.0

