scrollab.h
上传用户:hzhsqp
上传日期:2007-01-06
资源大小:1600k
文件大小:12k
源码类别:

IP电话/视频会议

开发平台:

Visual C++

  1. /*
  2.  * scrollab.h
  3.  *
  4.  * Scrollable interactor classes.
  5.  *
  6.  * Portable Windows Library
  7.  *
  8.  * Copyright (c) 1993-1998 Equivalence Pty. Ltd.
  9.  *
  10.  * The contents of this file are subject to the Mozilla Public License
  11.  * Version 1.0 (the "License"); you may not use this file except in
  12.  * compliance with the License. You may obtain a copy of the License at
  13.  * http://www.mozilla.org/MPL/
  14.  *
  15.  * Software distributed under the License is distributed on an "AS IS"
  16.  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
  17.  * the License for the specific language governing rights and limitations
  18.  * under the License.
  19.  *
  20.  * The Original Code is Portable Windows Library.
  21.  *
  22.  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
  23.  *
  24.  * Portions are Copyright (C) 1993 Free Software Foundation, Inc.
  25.  * All Rights Reserved.
  26.  *
  27.  * Contributor(s): ______________________________________.
  28.  *
  29.  * $Log: scrollab.h,v $
  30.  * Revision 1.20  1999/03/10 03:49:53  robertj
  31.  * More documentation adjustments.
  32.  *
  33.  * Revision 1.19  1999/03/09 08:01:50  robertj
  34.  * Changed comments for doc++ support (more to come).
  35.  *
  36.  * Revision 1.18  1999/02/16 08:08:46  robertj
  37.  * MSVC 6.0 compatibility changes.
  38.  *
  39.  * Revision 1.17  1998/09/23 06:28:57  robertj
  40.  * Added open source copyright license.
  41.  *
  42.  * Revision 1.16  1996/04/30 12:33:41  robertj
  43.  * Changed "inPixels" boolean to enum for three coordinate systems.
  44.  *
  45.  * Revision 1.15  1995/06/17 11:13:16  robertj
  46.  * Documentation update.
  47.  *
  48.  * Revision 1.14  1995/03/14 12:42:31  robertj
  49.  * Updated documentation to use HTML codes.
  50.  *
  51.  * Revision 1.13  1995/01/21  05:16:25  robertj
  52.  * Modified ShowAll so PScrollable does not change show state of scroll bars..
  53.  *
  54.  * Revision 1.12  1995/01/14  06:19:36  robertj
  55.  * Documentation
  56.  *
  57.  * Revision 1.11  1994/10/30  11:47:04  robertj
  58.  * Changed mechanism for doing notification callback functions.
  59.  *
  60.  * Revision 1.10  1994/10/23  04:55:29  robertj
  61.  * Major implementation.
  62.  *
  63.  * Revision 1.9  1994/08/23  11:32:52  robertj
  64.  * Oops
  65.  *
  66.  * Revision 1.8  1994/08/22  00:46:48  robertj
  67.  * Added pragma fro GNU C++ compiler.
  68.  *
  69.  * Revision 1.7  1994/06/25  11:55:15  robertj
  70.  * Unix version synchronisation.
  71.  *
  72.  * Revision 1.6  1994/04/20  12:17:44  robertj
  73.  * Some implementation.
  74.  *
  75.  * Revision 1.5  1994/04/01  14:15:44  robertj
  76.  * Added some PScrollable functionality.
  77.  *
  78.  * Revision 1.4  1994/03/07  07:38:19  robertj
  79.  * Major enhancementsacross the board.
  80.  *
  81.  * Revision 1.3  1994/01/03  04:42:23  robertj
  82.  * Mass changes to common container classes and interactors etc etc etc.
  83.  *
  84.  * Revision 1.2  1993/07/14  12:49:16  robertj
  85.  * Fixed RCS keywords.
  86.  *
  87.  */
  88. #define _PSCROLLABLE
  89. #ifdef __GNUC__
  90. #pragma interface
  91. #endif
  92. class PHorizontalScrollBar;
  93. class PVerticalScrollBar;
  94. class PScrollable;
  95. /**An interactor that has support for scroll bars so that its logical contents
  96.    may be larger than the drawable bounds. This works in conjunction with the
  97.    Ref{PScrollable} class to produce a scrolling interactor.
  98.    The bounds returned by a Ref{PCanvas} attached to an interactor normally
  99.    indicate the size of the internal area of the window. With a scrollable
  100.    interactor the PCanvas may return a larger dimension, as set by the
  101.    Ref{PScrollable::SetScrollRange()} function.
  102.    The canvas does not know (or care) what is visible and this interactor
  103.    handles the necessary coordinate adjustments and and bitblt's for
  104.    scrolling around a large drawable area.
  105.    
  106.    Note that the last child interactor that is a descendent of the
  107.    Ref{PScrollable} class is the contents" that is scrolled by the scroller.
  108.  */
  109. class PScroller : public PInteractor
  110. {
  111.   PCLASSINFO(PScroller, PInteractor);
  112.   public:
  113.    /**Create an interactor that has scroll bars and will automatically scroll
  114.        a Ref{PScrollable} interactor when scrolled by the user.
  115.      */
  116.     PScroller(
  117.       PInteractor * parent  /// Interactor into which the scroller is put.
  118.     );
  119.   /**@name New functions for class */
  120.    /**Get the scrollable that the scroller scrolls. If no Ref{PScrollable} 
  121.        interactor has been created with this instance of PScroller as its
  122.        parent, this function will assert.
  123.        @return
  124.        reference to contents of scroller interactor.
  125.      */
  126.     PScrollable & GetContents();
  127.    /**Get the vertical scroll bar in the scroller. This will allow the user
  128.        to customise the usage of the scroller, eg hide the scroll bar as only
  129.        one dimension is scrollable.
  130.     
  131.        @return
  132.        reference to vertical scroll bar.
  133.      */
  134.     PVerticalScrollBar & GetVerticalScrollBar() const;
  135.    /**Get the horizontal scroll bar in the scroller. This will allow the user
  136.        to customise the usage of the scroller, eg hide the scroll bar as only
  137.        one dimension is scrollable.
  138.     
  139.        @return
  140.        reference to horizontal scroll bar.
  141.      */
  142.     PHorizontalScrollBar & GetHorizontalScrollBar() const;
  143.   protected:
  144.   /**@name Overrides from class PInteractor */
  145.    /**Show the interactor and all child and grandchild etc interactors.
  146.        This enabled the interactor tree in post order, ie all children have
  147.        their Ref{PInteractor::ShowAll()} function called and then the
  148.        interactor itself is shown using the Ref{PInteractor::Show()}
  149.        function.
  150.      */
  151.     virtual void ShowAll();
  152.    /**Set the dimensions of the scroller interactor. This will automatically
  153.        adjust the position and dimensions of the scroll bars and the contents
  154.        interactor.
  155.        When scaling is used (#coords == LocalCoords#), the
  156.        coordinates used are 1/4 average font width and 1/8 the font height.
  157.      */
  158.     virtual void _SetDimensions(
  159.       PDIMENSION width,         /// New width for scroller.
  160.       PDIMENSION height,        /// New height for scroller.
  161.       CoordinateSystem coords   /// Coordinate system to use.
  162.     );
  163.     /**@name Member variables */
  164.     /** Vertical scroll bar child interactors for scrollable window */
  165.     PVerticalScrollBar   * vScroll;
  166.     /** Horizontal scroll bar child interactors for scrollable window */
  167.     PHorizontalScrollBar * hScroll;
  168.   private:
  169.     PDECLARE_NOTIFIER(PScrollBar, PScroller, ScrollBarNotify);
  170.     // Callback function for scoll bars
  171.   friend class PScrollable;
  172. };
  173. /**An interactor that has its logical contents larger than the drawable
  174.    bounds. This works in conjunction with the Ref{PScroller} class to produce
  175.    a scrolling interactor.
  176.    The bounds returned by a Ref{PCanvas} attached to an interactor normally
  177.    indicate the size of the internal area of the window. With a scrollable
  178.    interactor the PCanvas may return a larger dimension, as set by the
  179.    Ref{SetScrollRange()} function.
  180.    The canvas does not know (or care) what is visible and this interactor
  181.    handles the necessary coordinate adjustments and and bitblt's for
  182.    scrolling around a large drawable area.
  183.    The scrolling mechanism can operate in minimum "quanta". This is smallest
  184.    number of pixels that can be scrolled. This is set by the {it scale
  185.    factor} of the scrollable interactor. For example, a text editor would
  186.    only ever scroll in whole lines or character widths. So the scale factor
  187.    is set to the number of pixels for the height of a line and width of a
  188.    character.
  189.    
  190.    Note that the last child interactor that is a descendent of the
  191.    Ref{PScrollable} class is the contents" that is scrolled by the
  192.    Ref{PScroller}.
  193.  */
  194. class PScrollable : public PInteractor
  195. {
  196.   PCLASSINFO(PScrollable, PInteractor);
  197.   public:
  198.    /**Create a scrollable interactor that will be scrolled by the parent
  199.        Ref{PScroller} class.
  200.      */
  201.     PScrollable(
  202.       PScroller * parent    /// Scroller class that scrolls the scrollable.
  203.     );
  204.   /**@name Overrides from class PInteractor */
  205.    /**Get the drawing bounds for the scrollable interactor. This yields the
  206.        size of the drawable area that the Ref{PInteractorCanvas} will use as
  207.        its drawing bounds.
  208.        When scaling is used (#coords == LocalCoords#), the
  209.        coordinates used are 1/4 average font width and 1/8 the font height.
  210.        @return
  211.        drawing bounds rectangle for the interactor.
  212.      */
  213.     virtual PRect GetDrawingBounds(
  214.       CoordinateSystem coords   /// Coordinate system to use.
  215.     ) const;
  216.   /**@name New functions for class */
  217.    /**Set the range in which the scrollable is scrolled. This gives the
  218.        minimum and maximum scroll range in both vertical and horizontal
  219.        directions.
  220.      */
  221.     void SetScrollRange(
  222.       const PRect & rect    /// Rectangle for the scrolling limits.
  223.     );
  224.    /**Get the range in which the scrollable is scrolled. This gives the
  225.        minimum and maximum scroll range in both vertical and horizontal
  226.        directions.
  227.     
  228.        @return
  229.        rectangle for the scrolling limits.
  230.      */
  231.     PRect GetScrollRange() const;
  232.    /**Set the scaling factor in pixels for the scroll range. This determines
  233.        the minimum "quanta" for scrolling. Each scroll bar unit will scroll
  234.        the contents by this many pixels in each direction.
  235.      */
  236.     void SetScaleFactor(
  237.       PORDINATE x,    /// Set horizontal scale factor.
  238.       PORDINATE y     /// Set vertical sccroll factor.
  239.     );
  240.     void SetScaleFactor(
  241.       const PPoint & scale    /// Set scale factor in both dimensions.
  242.     );
  243.    /**Get the scaling factor in pixels for the scroll range. This determines
  244.        the minimum "quanta" for scrolling. Each scroll bar unit will scroll
  245.        the contents by this many pixels in each direction.
  246.        @return
  247.        scale factor in each dimension.
  248.      */
  249.     PPoint GetScaleFactor() const;
  250.    /**Get the current origin of the scrollable in the scrolling units. This
  251.        must be multiplied by the scale factor to yield a number of pixels to
  252.        scroll.
  253.        @return
  254.        the current origin for the scrollable area
  255.      */
  256.     PPoint GetOrigin() const;
  257.    /**Scroll the scrollable contents to the new origin specified. The origin
  258.        is in the scrolling units. This must be multiplied by the scale factor
  259.        to yield a number of pixels.
  260.      */
  261.     void ScrollTo(
  262.       PORDINATE x,    /// Horizontal position to scroll to.
  263.       PORDINATE y     /// Vertical position to scroll to.
  264.     );
  265.     void ScrollTo(
  266.       const PPoint & newOrg   /// New position to scroll to.
  267.     );
  268.    /**Scroll the scrollable contents by the amount specified. The delta to
  269.        scroll is in the scrolling units. This must be multiplied by the scale
  270.        factor to yield a number of pixels.
  271.      */
  272.     void ScrollBy(
  273.       PORDINATE dx,   /// Amount to scroll horizontally.
  274.       PORDINATE dy    /// Amount to scroll vertically.
  275.     );
  276.     void ScrollBy(
  277.       const PPoint & delta    /// Amount to scroll.
  278.     );
  279.   /**@name System callback functions. */
  280.    /**The system (via the PScroller class) calls this whenever the user has
  281.        scrolled the window in one of the two dimensions. The origin variable
  282.        will be already be updated to its new position. The old position can
  283.        be calculated by subtracting the delta value to it.
  284.        
  285.        The default behaviour of this function is to do the bitblt of the
  286.        interactors contents by the scrolled amount and invalidate the area
  287.        "exposed" by the scrolling.
  288.      */
  289.     virtual void OnScroll(
  290.       const PPoint & delta    /// Amount the scrollable was scrolled.
  291.     );
  292.   protected:
  293.   /**@name Member variables */
  294.     /** The range in which the scrollable is scrolled. */
  295.     PRect scrollRange;
  296.     /** Scaling factor in pixels of the scrollBounds. */
  297.     PPoint scaleFactor;
  298.    /**Origin into the virtual bounds rectangle that the top left corner of
  299.        the interactor is currently displaying.
  300.      */
  301.     PPoint origin;
  302. };
  303. // End of file ///////////////////////////////////////////////////////////////