From: David Elliott Date: Thu, 14 Feb 2008 21:08:44 +0000 (+0000) Subject: Move wxWindowCocoaScrollView class into its own header. X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/19253261f5c6127f5448078295d4cbe1521d469f Move wxWindowCocoaScrollView class into its own header. (Equivalent of r51796 on the 2.8 branch) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@51797 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/cocoa/private/scrollview.h b/include/wx/cocoa/private/scrollview.h new file mode 100644 index 0000000000..dd2bdc1480 --- /dev/null +++ b/include/wx/cocoa/private/scrollview.h @@ -0,0 +1,129 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/cocoa/scrollview.h +// Purpose: wxWindowCocoaScrollView +// Author: David Elliott +// Modified by: +// Created: 2008/02/14 +// RCS-ID: $Id$ +// Copyright: (c) 2003- David Elliott +// Licence: wxWidgets licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_COCOA_SCROLLVIEW_H__ +#define _WX_COCOA_SCROLLVIEW_H__ + +@class NSScroller; + +// ======================================================================== +// wxWindowCocoaScrollView +// ======================================================================== +class wxWindowCocoaScrollView: protected wxCocoaNSView +{ + DECLARE_NO_COPY_CLASS(wxWindowCocoaScrollView) +public: + wxWindowCocoaScrollView(wxWindow *owner); + virtual ~wxWindowCocoaScrollView(); + inline WX_NSScrollView GetNSScrollView() { return m_cocoaNSScrollView; } + void ClientSizeToSize(int &width, int &height); + void DoGetClientSize(int *x, int *y) const; + void Encapsulate(); + void Unencapsulate(); + + // wxWindow calls this to do the work. Note that we don't have the refresh parameter + // because wxWindow handles that itself. + void SetScrollbar(int orientation, int position, int thumbSize, int range); + int GetScrollPos(wxOrientation orient); + void SetScrollPos(wxOrientation orient, int position); + int GetScrollRange(wxOrientation orient); + int GetScrollThumb(wxOrientation orient); + void ScrollWindow(int dx, int dy, const wxRect*); + void UpdateSizes(); + + void _wx_doScroller(NSScroller *sender); + +protected: + wxWindowCocoa *m_owner; + WX_NSScrollView m_cocoaNSScrollView; + virtual void Cocoa_FrameChanged(void); + virtual void Cocoa_synthesizeMouseMoved(void) {} + /*! + Flag as to whether we're scrolling for a native view or a custom + wxWindow. This controls the scrolling behavior. When providing + scrolling for a native view we don't catch scroller action messages + and thus don't send scroll events and we don't actually scroll the + window when the application calls ScrollWindow. + + When providing scrolling for a custom wxWindow, we make the NSScroller + send their action messages to us which we in turn package as wx window + scrolling events. At this point, the window will not physically be + scrolled. The application will most likely handle the event by calling + ScrollWindow which will do the real scrolling. On the other hand, + the application may instead not call ScrollWindow until some threshold + is reached. This causes the window to only scroll in steps which is + what, for instance, wxScrolledWindow does. + */ + bool m_isNativeView; + /*! + The range as the application code wishes to see it. That is, the + range from the last SetScrollbar call for the appropriate dimension. + The horizontal dimension is the first [0] element and the vertical + dimension the second [1] element. + + In wxMSW, a SCROLLINFO with nMin=0 and nMax=range-1 is used which + gives exactly range possible positions so long as nPage (which is + the thumb size) is less than or equal to 1. + */ + int m_scrollRange[2]; + /*! + The thumb size is intended to reflect the size of the visible portion + of the scrolled document. As the document size increases, the thumb + visible thumb size decreases. As document size decreases, the visible + thumb size increases. However, the thumb size on wx is defined in + terms of scroll units (which are effectively defined by the scroll + range) and so increasing the number of scroll units to reflect increased + document size will have the effect of decreasing the visible thumb + size even though the number doesn't change. + + It's also important to note that subtracting the thumb size from the + full range gives you the real range that can be used. Microsoft + defines nPos (the current scrolling position) to be within the range + from nMin to nMax - max(nPage - 1, 0). We know that wxMSW code always + sets nMin = 0 and nMax = range -1. So let's algebraically reduce the + definition of the maximum allowed position: + + Begin: + = nMax - max(nPage - 1, 0) + Substitute (range - 1) for nMax and thumbSize for nPage: + = range - 1 - max(thumbSize - 1, 0) + Add one inside the max conditional and subtract one outside of it: + = range - 1 - (max(thumbSize - 1 + 1, 1) - 1) + Reduce some constants: + = range - 1 - (max(thumbSize, 1) - 1) + Distribute the negative across the parenthesis: + = range - 1 - max(thumbSize, 1) + 1 + Reduce the constants: + = range - max(thumbSize, 1) + + Also keep in mind that thumbSize may never be greater than range but + can be equal to it. Thus for the smallest possible thumbSize there + are exactly range possible scroll positions (numbered from 0 to + range - 1) and for the largest possible thumbSize there is exactly + one possible scroll position (numbered 0). + */ + int m_scrollThumb[2]; + + /*! + The origin of the virtual coordinate space expressed in terms of client + coordinates. Starts at (0,0) and each call to ScrollWindow accumulates + into it. Thus if the user scrolls the window right (thus causing the + contents to move left with respect to the client origin, the + application code (typically wxScrolledWindow) will be called with + dx of -something, for example -20. This is added to m_virtualOrigin + and thus m_virtualOrigin will be (-20,0) in this example. + */ + wxPoint m_virtualOrigin; +private: + wxWindowCocoaScrollView(); +}; + +#endif //ndef _WX_COCOA_SCROLLVIEW_H__ diff --git a/src/cocoa/window.mm b/src/cocoa/window.mm index 8449277a89..bb25bcc333 100644 --- a/src/cocoa/window.mm +++ b/src/cocoa/window.mm @@ -25,6 +25,7 @@ #include "wx/cocoa/autorelease.h" #include "wx/cocoa/string.h" #include "wx/cocoa/trackingrectmanager.h" +#include "wx/cocoa/private/scrollview.h" #include "wx/mac/corefoundation/cfref.h" #include "wx/cocoa/ObjcRef.h" @@ -289,118 +290,6 @@ private: wxWindowCocoaHider(); }; -// ======================================================================== -// wxWindowCocoaScrollView -// ======================================================================== -class wxWindowCocoaScrollView: protected wxCocoaNSView -{ - DECLARE_NO_COPY_CLASS(wxWindowCocoaScrollView) -public: - wxWindowCocoaScrollView(wxWindow *owner); - virtual ~wxWindowCocoaScrollView(); - inline WX_NSScrollView GetNSScrollView() { return m_cocoaNSScrollView; } - void ClientSizeToSize(int &width, int &height); - void DoGetClientSize(int *x, int *y) const; - void Encapsulate(); - void Unencapsulate(); - - // wxWindow calls this to do the work. Note that we don't have the refresh parameter - // because wxWindow handles that itself. - void SetScrollbar(int orientation, int position, int thumbSize, int range); - int GetScrollPos(wxOrientation orient); - void SetScrollPos(wxOrientation orient, int position); - int GetScrollRange(wxOrientation orient); - int GetScrollThumb(wxOrientation orient); - void ScrollWindow(int dx, int dy, const wxRect*); - void UpdateSizes(); - - void _wx_doScroller(NSScroller *sender); - -protected: - wxWindowCocoa *m_owner; - WX_NSScrollView m_cocoaNSScrollView; - virtual void Cocoa_FrameChanged(void); - virtual void Cocoa_synthesizeMouseMoved(void) {} - /*! - Flag as to whether we're scrolling for a native view or a custom - wxWindow. This controls the scrolling behavior. When providing - scrolling for a native view we don't catch scroller action messages - and thus don't send scroll events and we don't actually scroll the - window when the application calls ScrollWindow. - - When providing scrolling for a custom wxWindow, we make the NSScroller - send their action messages to us which we in turn package as wx window - scrolling events. At this point, the window will not physically be - scrolled. The application will most likely handle the event by calling - ScrollWindow which will do the real scrolling. On the other hand, - the application may instead not call ScrollWindow until some threshold - is reached. This causes the window to only scroll in steps which is - what, for instance, wxScrolledWindow does. - */ - bool m_isNativeView; - /*! - The range as the application code wishes to see it. That is, the - range from the last SetScrollbar call for the appropriate dimension. - The horizontal dimension is the first [0] element and the vertical - dimension the second [1] element. - - In wxMSW, a SCROLLINFO with nMin=0 and nMax=range-1 is used which - gives exactly range possible positions so long as nPage (which is - the thumb size) is less than or equal to 1. - */ - int m_scrollRange[2]; - /*! - The thumb size is intended to reflect the size of the visible portion - of the scrolled document. As the document size increases, the thumb - visible thumb size decreases. As document size decreases, the visible - thumb size increases. However, the thumb size on wx is defined in - terms of scroll units (which are effectively defined by the scroll - range) and so increasing the number of scroll units to reflect increased - document size will have the effect of decreasing the visible thumb - size even though the number doesn't change. - - It's also important to note that subtracting the thumb size from the - full range gives you the real range that can be used. Microsoft - defines nPos (the current scrolling position) to be within the range - from nMin to nMax - max(nPage - 1, 0). We know that wxMSW code always - sets nMin = 0 and nMax = range -1. So let's algebraically reduce the - definition of the maximum allowed position: - - Begin: - = nMax - max(nPage - 1, 0) - Substitute (range - 1) for nMax and thumbSize for nPage: - = range - 1 - max(thumbSize - 1, 0) - Add one inside the max conditional and subtract one outside of it: - = range - 1 - (max(thumbSize - 1 + 1, 1) - 1) - Reduce some constants: - = range - 1 - (max(thumbSize, 1) - 1) - Distribute the negative across the parenthesis: - = range - 1 - max(thumbSize, 1) + 1 - Reduce the constants: - = range - max(thumbSize, 1) - - Also keep in mind that thumbSize may never be greater than range but - can be equal to it. Thus for the smallest possible thumbSize there - are exactly range possible scroll positions (numbered from 0 to - range - 1) and for the largest possible thumbSize there is exactly - one possible scroll position (numbered 0). - */ - int m_scrollThumb[2]; - - /*! - The origin of the virtual coordinate space expressed in terms of client - coordinates. Starts at (0,0) and each call to ScrollWindow accumulates - into it. Thus if the user scrolls the window right (thus causing the - contents to move left with respect to the client origin, the - application code (typically wxScrolledWindow) will be called with - dx of -something, for example -20. This is added to m_virtualOrigin - and thus m_virtualOrigin will be (-20,0) in this example. - */ - wxPoint m_virtualOrigin; -private: - wxWindowCocoaScrollView(); -}; - // ======================================================================== // wxDummyNSView // ========================================================================