From ecab4dba7d33782458d7cc8b91c981d03d7b9e37 Mon Sep 17 00:00:00 2001 From: Robert Roebling 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.45.2