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

IP电话/视频会议

开发平台:

Visual C++

  1. /*
  2.  * interact.h
  3.  *
  4.  * Interactor ancestor class.
  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: interact.h,v $
  30.  * Revision 1.43  2000/01/10 02:25:24  craigs
  31.  * Added macro to allow multiple ancestors
  32.  *
  33.  * Revision 1.42  1999/07/18 15:07:12  robertj
  34.  * Fixed missing return type
  35.  *
  36.  * Revision 1.41  1999/03/10 03:49:51  robertj
  37.  * More documentation adjustments.
  38.  *
  39.  * Revision 1.40  1999/03/09 08:01:48  robertj
  40.  * Changed comments for doc++ support (more to come).
  41.  *
  42.  * Revision 1.39  1999/02/16 08:08:45  robertj
  43.  * MSVC 6.0 compatibility changes.
  44.  *
  45.  * Revision 1.38  1998/09/23 06:23:58  robertj
  46.  * Added open source copyright license.
  47.  *
  48.  * Revision 1.37  1996/05/15 10:08:20  robertj
  49.  * Added screen coordinate conversion functions with separate parameters.
  50.  *
  51.  * Revision 1.36  1996/04/30 12:33:33  robertj
  52.  * Changed "inPixels" boolean to enum for three coordinate systems.
  53.  *
  54.  * Revision 1.35  1995/12/23 03:44:14  robertj
  55.  * Added screen to local coordinate transforms.
  56.  * Added FindWindow() function
  57.  *
  58.  * Revision 1.34  1995/10/14 14:56:33  robertj
  59.  * Changed return values to references for efficency.
  60.  *
  61.  * Revision 1.33  1995/07/31 12:04:23  robertj
  62.  * Drag track documentation and semantic adjustment.
  63.  *
  64.  * Revision 1.32  1995/07/02 01:17:41  robertj
  65.  * Added drag tracking support.
  66.  * Removed OnDoubleClick() and added BOOL to OnMouseDown() for double click.
  67.  *
  68.  * Revision 1.31  1995/06/17 11:08:00  robertj
  69.  * Changed OnKeyDown to return BOOL indicating OnKeyInput is to be used.
  70.  * Documentation update.
  71.  *
  72.  * Revision 1.30  1995/06/04 12:42:46  robertj
  73.  * Redesign of caret driver functions (made a lot more common).
  74.  *
  75.  * Revision 1.29  1995/04/02 09:27:20  robertj
  76.  * Added "balloon" help.
  77.  *
  78.  * Revision 1.28  1995/03/14 12:41:36  robertj
  79.  * Updated documentation to use HTML codes.
  80.  *
  81.  * Revision 1.27  1995/02/19  04:19:09  robertj
  82.  * Added dynamically linked command processing.
  83.  *
  84.  * Revision 1.26  1995/02/05  00:48:40  robertj
  85.  * Documentation.
  86.  *
  87.  * Revision 1.25  1995/01/21  05:16:20  robertj
  88.  * Modified ShowAll so PScrollable does not change show state of scroll bars..
  89.  *
  90.  * Revision 1.24  1995/01/16  13:02:24  robertj
  91.  * Documentation.
  92.  *
  93.  * Revision 1.23  1995/01/15  04:54:51  robertj
  94.  * Fixed global cursor set logic.
  95.  *
  96.  * Revision 1.22  1995/01/06  10:43:48  robertj
  97.  * Changed PRealFont usage from pointer to reference.
  98.  *
  99.  * Revision 1.21  1995/01/02  12:24:58  robertj
  100.  * Documentation.
  101.  * Added global cursor setting for wait cursor.
  102.  *
  103.  * Revision 1.20  1994/12/21  11:53:10  robertj
  104.  * Documentation and variable normalisation.
  105.  *
  106.  * Revision 1.19  1994/12/14  11:17:07  robertj
  107.  * Changed PDIMENSION to be unsigned causing untold number of changes.
  108.  *
  109.  * Revision 1.18  1994/10/30  11:46:43  robertj
  110.  * Changed mechanism for doing notification callback functions.
  111.  *
  112.  * Revision 1.17  1994/10/23  04:45:47  robertj
  113.  * Added function to get the drawing bounds of an interactor.
  114.  * Allowed cursor position to be obtained in pixels as well as font coords.
  115.  *
  116.  * Revision 1.16  1994/08/23  11:32:52  robertj
  117.  * Oops
  118.  *
  119.  * Revision 1.15  1994/08/22  00:46:48  robertj
  120.  * Added pragma fro GNU C++ compiler.
  121.  *
  122.  * Revision 1.14  1994/08/21  23:43:02  robertj
  123.  * Added ability to get caret position in pixels.
  124.  * Created global class for list of interactors.
  125.  *
  126.  * Revision 1.13  1994/06/25  11:55:15  robertj
  127.  * Unix version synchronisation.
  128.  *
  129.  * Revision 1.12  1994/04/03  08:34:18  robertj
  130.  * Added help and focus functionality.
  131.  *
  132.  * Revision 1.11  1994/03/07  07:38:19  robertj
  133.  * Major enhancementsacross the board.
  134.  *
  135.  * Revision 1.10  1994/01/03  04:42:23  robertj
  136.  * Mass changes to common container classes and interactors etc etc etc.
  137.  *
  138.  * Revision 1.9  1993/12/16  06:20:57  robertj
  139.  * Changes to callback function definition due to GCC.
  140.  *
  141.  * Revision 1.8  1993/12/01  16:09:05  robertj
  142.  * Windows NT port.
  143.  *
  144.  * Revision 1.7  1993/09/27  16:35:25  robertj
  145.  * Removed special constructor for dialog resource loading.
  146.  *
  147.  * Revision 1.6  1993/08/27  18:17:47  robertj
  148.  * Added background colour manipulation.
  149.  *
  150.  * Revision 1.5  1993/08/24  00:27:59  robertj
  151.  * Added inPixels capability to validate/invalidate functions.
  152.  *
  153.  * Revision 1.4  1993/08/19  18:03:28  robertj
  154.  * Made coordinate transform functions public.
  155.  *
  156.  * Revision 1.3  1993/07/14  12:49:16  robertj
  157.  * Fixed RCS keywords.
  158.  *
  159.  */
  160. #define _PINTERACTOR
  161. #ifdef __GNUC__
  162. #pragma interface
  163. #endif
  164. class PApplication;
  165. class PInteractorCanvas;
  166. class PControl;
  167. class PBalloon;
  168. PLIST(PInteractorList, PInteractor);
  169. #ifndef PINTERACTOR_ANCESTOR
  170. #define PINTERACTOR_ANCESTOR public PObject
  171. #endif
  172. /**This class defines the common behaviour of all user interface interaction
  173.    entity. This may or may not be a "Window" depending on the definition of
  174.    that term in the target GUI.
  175.  */
  176. class PInteractor : PINTERACTOR_ANCESTOR
  177. {
  178.   PCLASSINFO(PInteractor, PObject);
  179.   public:
  180.     /** Create a a new interactor attaching it to the parent interactor.  */
  181.     PInteractor(
  182.       PInteractor * parent,  /// Interactor into which the interactor is placed.
  183.       BOOL hiddenChild = FALSE
  184.      /**Whether the "hidden" from the application. If this is TRUE then the
  185.          interactor is not added to the parents child interactor list, thus it
  186.          will not be visible as a "child" interactor of the parent and will
  187.          not be automatically deleted when the parent is deleted.
  188.        */
  189.     );
  190.     /** Destroy the interactor, and all its child interactors. */
  191.     virtual ~PInteractor();
  192.   /**@name Overrides from class PObject */
  193.    /**Determine if the two interactors are the same. As two instances can
  194.        never {bf be} the same interactor, this can never be EqualTo.
  195.        @return
  196.        Always #GreaterThan#.
  197.      */
  198.     virtual Comparison Compare(
  199.       const PObject & obj   /// Interactor to compare against.
  200.     ) const;
  201.   /**@name New functions for class */
  202.    /**Get the interactor layout that this interactor is contained in.
  203.        @return
  204.        pointer to parent interactor.
  205.      */
  206.     PInteractor * GetParent() const;
  207.    /**Determine if this interactor is a child or grandchild etc of the
  208.        interactor layout specified.
  209.        @return
  210.        TRUE if interactor is a child of #parent#.
  211.      */
  212.     BOOL IsChild(
  213.       PInteractor * parent    /// Interactor to check for parenthood.
  214.     ) const;
  215.    /**Get the number of children the interactor currently contains.
  216.        @return
  217.        number of child interactors.
  218.      */
  219.     PINDEX GetNumChildren();
  220.    /**Get access to the child interactor at the specified index. The order in
  221.        which child interactors are attached to a parent interactor is initially
  222.        in their construction order.
  223.        @return
  224.        reference to child interactor.
  225.      */
  226.     PInteractor & operator[](
  227.       PINDEX index    /// Ordinal position of the child interactor.
  228.     );
  229.    /**Update all command sources. This will go to the utimate parent, a
  230.        Ref{PTopLevelWindow}, and then recursively update every command
  231.        source, menu item or control, for being enabled or disabled. This uses
  232.        the Ref{PNotifier} function for each source to get the new state.
  233.        The Ref{PCommandSource} and Ref{PCommandSink} classes are usually
  234.        used in conjunction with this function to control commands such as menu
  235.        items and tool bars etc.
  236.      */
  237.     virtual void UpdateCommandSources();
  238.    /**Set the font to be used by default by this interactor. A canvas created
  239.        on this interactor will initially have this font selected.
  240.        
  241.        This also determines the coordinate system to be used for laying out
  242.        child interactors via the Ref{SetPosition()} and
  243.        Ref{SetDimensions()} functions. The coordinates used are 1/4 average
  244.        font width and 1/8 the font height.
  245.        
  246.        If the #toChildren# parameter is TRUE then the font is
  247.        propagated down to all child interactors and grandchild interactors etc.
  248.      */
  249.     virtual void SetFont(
  250.       const PFont & newFont, /// New font specification fo rthe interactor.
  251.       BOOL toChildren = TRUE
  252.         /// Flag to recursively change all child interactors.
  253.     );
  254.    /**Get the font to be used by default in all child interactors. A canvas
  255.        created on this interactor will initially have this font selected.
  256.        
  257.        This also determines the coordinate system to be used for laying out
  258.        child interactors via the Ref{SetPosition()} and
  259.        Ref{SetDimensions()} functions. The coordinates used are 1/4 average
  260.        font width and 1/8 the font height.
  261.        @return
  262.        Pointer to a realised font on a canvas for this interactor.
  263.      */
  264.     const PRealFont & GetFont();
  265.     /** Convert the layout X coordinate value to screen pixels. */
  266.     PDIMENSION ToPixelsDX(
  267.       PDIMENSION x    /// Horizontal dimension to convert.
  268.     ) const;
  269.     /** Convert the layout Y coordinate value to screen pixels. */
  270.     PDIMENSION ToPixelsDY(
  271.       PDIMENSION y    /// Vertical dimension to convert.
  272.     ) const;
  273.     /** Convert the layout X coordinate value to screen pixels. */
  274.     PORDINATE ToPixelsX(
  275.       PORDINATE x   /// Horizontal coordinate to convert.
  276.     ) const;
  277.     /** Convert the layout Y coordinate value to screen pixels. */
  278.     PORDINATE ToPixelsY(
  279.       PORDINATE y   /// Vertical coordinate to convert.
  280.     ) const;
  281.     /** Convert the layout dimension value to screen pixels. */
  282.     PDim ToPixels(
  283.       const PDim & dim    /// Dimensions to convert.
  284.     ) const;
  285.     /** Convert the layout point value to screen pixels. */
  286.     PPoint ToPixels(
  287.       const PPoint & pt   /// Position to convvert.
  288.     ) const;
  289.     /** Convert the layout rectange value to screen pixels. */
  290.     PRect ToPixels(
  291.       const PRect & r     /// Rectangle to convert.
  292.     ) const;
  293.     /** Convert the screen pixels to a layout X coordinate value. */
  294.     PDIMENSION FromPixelsDX(
  295.       PDIMENSION x    /// Horizontal dimension to convert.
  296.     ) const;
  297.     /** Convert the screen pixels to a layout Y coordinate value. */
  298.     PDIMENSION FromPixelsDY(
  299.       PDIMENSION y    /// Vertical dimension to convert.
  300.     ) const;
  301.     /** Convert the screen pixels to a layout X coordinate value. */
  302.     PORDINATE FromPixelsX(
  303.       PORDINATE x   /// Horizontal coordinate to convert.
  304.     ) const;
  305.     /** Convert the screen pixels to a layout Y coordinate value. */
  306.     PORDINATE FromPixelsY(
  307.       PORDINATE y   /// Vertical coordinate to convert.
  308.     ) const;
  309.     /** Convert the dimensions in screen pixels to layout coordinates. */
  310.     PDim FromPixels(
  311.       const PDim & dim    /// Dimensions to convert.
  312.     ) const;
  313.     /** Convert the point in screen pixels to layout coordinates. */
  314.     PPoint FromPixels(
  315.       const PPoint & pt   /// Position to convvert.
  316.     ) const;
  317.     /** Convert the rectangle in screen pixels to layout coordinates. */
  318.     PRect FromPixels(
  319.       const PRect & r     /// Rectangle to convert.
  320.     ) const;
  321.    /**Origin specification for the Ref{SetPosition()} function. This
  322.        determines how the horizontal and vertical position is interpreted to
  323.        the final placement of the interactor.
  324.        When scaling is used (eg #xOrigin = TopLeftParent#), the
  325.        coordinates used are 1/4 average font width and 1/8 the font height.
  326.        Note that some child interactors are clipped to be within their
  327.        parent. For these interactors, setting relative to the screen may cause
  328.        the interactor to become invisible.
  329.      */
  330.     enum PositionOrigin {
  331.      /**Position the left of the interactor relative to the left of the
  332.          screen and the top of the interactor relative to the top of the
  333.          screen.
  334.          
  335.          No scaling factor will be applied and x and y offset will be applied
  336.          in screen pixels. Offsets of zero will place the interactor in the
  337.          top left corner of the screen. Negative offsets will start to move
  338.          the interactor off the screen.
  339.        */
  340.       TopLeftScreen,
  341.      /**Position the centre of the interactor relative to the centre of the
  342.          screen in both the horizontal and vertical directions.
  343.          No scaling factor will be applied and x and y offset will be applied
  344.          in screen pixels. Offsets of zero will place the interactor in the
  345.          centre of the screen.
  346.        */
  347.       CentreScreen,
  348.      /**Position the right of the interactor relative to the right of the
  349.          screen and the bottom of the interactor relative to the bottom of the
  350.          screen.
  351.          
  352.          No scaling factor will be applied and x and y offset will be applied
  353.          in screen pixels. Offsets of zero will place the interactor in the
  354.          bottom right corner of the screen. Positive offsets will start to move
  355.          the interactor off the screen.
  356.        */
  357.       BottomRightScreen,
  358.      /**Position the left of the interactor relative to the left of the
  359.          parent internal area and the top of the interactor relative to the
  360.          top of the parents internal area.
  361.          
  362.          The coordinates are scaled according to the currently selected font
  363.          for the interactor. Offsets of zero will place the interactor in the
  364.          top left corner of the parent. Negative offsets will start to move
  365.          the interactor off the parent interactor.
  366.        */
  367.       TopLeftParent,
  368.      /**Position the centre of the interactor relative to the centre of the
  369.          parent internal area in both the horizontal and vertical directions.
  370.          
  371.          The coordinates are scaled according to the currently selected font
  372.          for the interactor. Offsets of zero will place the interactor in the
  373.          centre of the parent.
  374.        */
  375.       CentreParent,
  376.      /**Position the right of the interactor relative to the right of the
  377.          parent internal area and the bottom of the interactor relative to the
  378.          bottom of the parents internal area.
  379.          
  380.          The coordinates are scaled according to the currently selected font
  381.          for the interactor. Offsets of zero will place the interactor in the
  382.          bottom right corner of the parent. Positive offsets will start to move
  383.          the interactor off the parent interactor.
  384.        */
  385.       BottomRightParent,
  386.      /**Position the left of the interactor relative to the left of the
  387.          parent internal area and the top of the interactor relative to the
  388.          top of the parents internal area.
  389.          
  390.          No scaling factor will be applied and x and y offset will be applied
  391.          in screen pixels. Offsets of zero will place the interactor in the
  392.          top left corner of the parent. Negative offsets will start to move
  393.          the interactor off the parent interactor.
  394.        */
  395.       TopLeftPixels,
  396.      /**Position the centre of the interactor relative to the centre of the
  397.          parent internal area in both the horizontal and vertical directions.
  398.          
  399.          No scaling factor will be applied and x and y offset will be applied
  400.          in screen pixels. Offsets of zero will place the interactor in the
  401.          centre of the parent.
  402.        */
  403.       CentrePixels,
  404.      /**Position the right of the interactor relative to the right of the
  405.          parent internal area and the bottom of the interactor relative to the
  406.          bottom of the parents internal area.
  407.          
  408.          No scaling factor will be applied and x and y offset will be applied
  409.          in screen pixels. Offsets of zero will place the interactor in the
  410.          bottom right corner of the parent. Positive offsets will start to move
  411.          the interactor off the parent interactor.
  412.        */
  413.       BottomRightPixels
  414.     };
  415.     void SetPosition(
  416.       const PPoint & org,   /// Offset to apply to interactor.
  417.       PositionOrigin xOrigin = TopLeftParent,  /// Origin for horizontal offset.
  418.       PositionOrigin yOrigin = TopLeftParent   /// Origin for verical offset.
  419.     );
  420.    /**Set the position of the interactor. The #xOrigin# and
  421.        #yOrigin# parameters indicate the coordinate system to be
  422.        used for the offsets. If the font based layout coordinates are used
  423.        they will use the font of the {it parents} interactor. The
  424.        interactors font is {bf not} used.
  425.        Note that this sets the position of the exterior of the interactor,
  426.        including any decoration, eg title bars etc.
  427.        When scaling is used (eg #xOrigin = TopLeftParent#), the
  428.        coordinates used are 1/4 average font width and 1/8 the font height.
  429.        The user should not override this function. If some form of action is
  430.        required on changing the interactors position then the
  431.        Ref{_SetPosition()} function should be overridden.
  432.      */
  433.     void SetPosition(
  434.       PORDINATE x,          /// Horizontal offset to apply to interactor.
  435.       PORDINATE y,          /// Vertical offset to apply to interactor.
  436.       PositionOrigin xOrigin = TopLeftParent,  /// Origin for horizontal offset.
  437.       PositionOrigin yOrigin = TopLeftParent   /// Origin for verical offset.
  438.     );
  439.     /** Coordinate system used for position & dimensions */
  440.     enum CoordinateSystem {
  441.         /** Use interactor relative, font scaled coordinates. */
  442.       LocalCoords,
  443.         /** Use interactor relative coordinates in screen pixels. */
  444.       PixelCoords,
  445.         /** Use screen absolute coordinates */
  446.       ScreenCoords
  447.     };
  448.    /**Get the position of the interactor relative to its parent. If the
  449.        interactor has no parent, ie is a descendent of Ref{PTopLevelWindow},
  450.        then the position is always in absolute screen coordinates.
  451.         
  452.        If the #coords# parameter is #LocalCoords# then
  453.        the return value is in the coordinate system based in the interactors
  454.        current font. Otherwise it is returned in screen pixels.
  455.        
  456.        If the #coords# parameter is #PixelCoords# then
  457.        the coordinates are still relative to its parent, while the
  458.        #ScreenCoords# value will return realtive to the absolute
  459.        screen origin.
  460.        Note that this gets the position of the exterior of the interactor,
  461.        including any decoration, eg title bars etc.
  462.        When scaling is used (#coords == LocalCoords#), the
  463.        coordinates used are 1/4 average font width and 1/8 the font height.
  464.        @return
  465.        point for the interactors current position.
  466.      */
  467.     PPoint GetPosition(
  468.       CoordinateSystem coords   /// Coordinate system to use.
  469.     ) const;
  470.    /**Convert the point from the interactor relative coordinates to absolute
  471.        screen coordinates.
  472.         
  473.        If the #coords# parameter is #LocalCoords# then
  474.        the return value is in the coordinate system based in the interactors
  475.        current font. Otherwise it is returned in screen pixels.
  476.        
  477.        If the #coords# parameter is #PixelCoords# then
  478.        the coordinates are still relative to its parent, while the
  479.        #ScreenCoords# value will return realtive to the absolute
  480.        screen origin.
  481.        When scaling is used (#coords == LocalCoords#), the
  482.        coordinates used are 1/4 average font width and 1/8 the font height.
  483.        @return
  484.        point converted to absolute screen coordinates.
  485.      */
  486.     PPoint ToScreen(
  487.       PORDINATE x,
  488.       PORDINATE y,
  489.       CoordinateSystem coords
  490.     ) const;
  491.     PPoint ToScreen(
  492.       const PPoint & pt,        /// Coordinate to convert.
  493.       CoordinateSystem coords   /// Coordinate system to use.
  494.     ) const;
  495.    /**Convert the point from the absolute screen coordinates to interactor
  496.        relative coordinates.
  497.         
  498.        If the #coords# parameter is #LocalCoords# then
  499.        the return value is in the coordinate system based in the interactors
  500.        current font. Otherwise it is returned in screen pixels.
  501.        
  502.        If the #coords# parameter is #PixelCoords# then
  503.        the coordinates are still relative to its parent, while the
  504.        #ScreenCoords# value will return realtive to the absolute
  505.        screen origin.
  506.        When scaling is used (#coords == LocalCoords#), the
  507.        coordinates used are 1/4 average font width and 1/8 the font height.
  508.        @return
  509.        point converted from absolute screen coordinates.
  510.      */
  511.     PPoint FromScreen(
  512.       PORDINATE x,
  513.       PORDINATE y,
  514.       CoordinateSystem coords
  515.     ) const;
  516.     PPoint FromScreen(
  517.       const PPoint & pt,        /// Coordinate to convert.
  518.       CoordinateSystem coords   /// Coordinate system to use.
  519.     ) const;
  520.    /**Set the dimensions of the interactor. The new size is specified in
  521.        either the font based layout coordinates or in screen pixels as
  522.        specified by the #coords# parameter.
  523.        Note that this sets the dimension of the interior of the interactor,
  524.        excluding any decoration, eg title bars etc.
  525.        
  526.        When scaling is used (#coords == LocalCoords#), the
  527.        coordinates used are 1/4 average font width and 1/8 the font height.
  528.        The user should not override this function. If some form of action is
  529.        required on changing the interactors size then the
  530.        Ref{#_SetDimensions()#} function should be overridden.
  531.      */
  532.     void SetDimensions(
  533.       PDIMENSION width,         /// New width to apply to interactor.
  534.       PDIMENSION height,        /// New height to apply to interactor.
  535.       CoordinateSystem coords   /// Coordinate system to use.
  536.     );
  537.     void SetDimensions(
  538.       const PDim & dim,         /// New dimensions to apply to interactor.
  539.       CoordinateSystem coords   /// Coordinate system to use.
  540.     );
  541.    /**Get the dimensions of the interactor.
  542.        If the #coords# parameter is #LocalCoords# then
  543.        the return value is in the coordinate system based in the interactors
  544.        current font. Otherwise it is returned in screen pixels.
  545.        
  546.        If the #coords# parameter is #PixelCoords# then
  547.        the coordinates are still relative to its parent, while the
  548.        #ScreenCoords# value will return realtive to the absolute
  549.        screen origin.
  550.        Note that this gets the dimension of the interior of the interactor,
  551.        excluding any decoration, eg title bars etc.
  552.        
  553.        When scaling is used (#coords == LocalCoords#), the
  554.        coordinates used are 1/4 average font width and 1/8 the font height.
  555.        @return
  556.        dimensions for the interactors current size.
  557.      */
  558.     PDim GetDimensions(
  559.       CoordinateSystem coords   /// Coordinate system to use.
  560.     ) const;
  561.    /**Get the external bounds of the interactor. This includes things such as
  562.        title bars and borders etc. For most interactors this will be identical
  563.        to a rectangle formed from Ref{GetPosition()} and
  564.        Ref{GetDimensions()} as there are no external decorations to the
  565.        interactor.
  566.        If the coordinate system used is in pixels
  567.        (#coords == ScreenCoords#) then the position is in absolute
  568.        screen coordinates. Otherwise it uses the interactors own coordinate
  569.        system. This usually means negative values for the rectangles top left
  570.        corner.
  571.        When scaling is used (#coords == LocalCoords#), the
  572.        coordinates used are 1/4 average font width and 1/8 the font height.
  573.        @return
  574.        bounds rectangle for the interactor.
  575.      */
  576.     PRect GetStructureBounds(
  577.       CoordinateSystem coords   /// Coordinate system to use.
  578.     ) const;
  579.    /**Get the drawing bounds for the interactor. This is usually the internal
  580.        dimensions of the interactor. But could be other sizes depending on the
  581.        semantics of the interator. See Ref{PScrollable} for an example of the
  582.        drawing bounds being larger than the size of the interactor.
  583.        This function is used by the Ref{PInteractorCanvas} class to determine
  584.        the drawing bounds for the canvas.
  585.        When scaling is used (#coords == LocalCoords#), the
  586.        coordinates used are 1/4 average font width and 1/8 the font height.
  587.        @return
  588.        drawing bounds rectangle for the interactor.
  589.      */
  590.     virtual PRect GetDrawingBounds(
  591.       CoordinateSystem coords   /// Coordinate system to use.
  592.     ) const;
  593.    /**Options for the Ref{AutoAdjustBounds()} function. This controls how
  594.        the interactor will be repositioned and resized given a bounds
  595.        rectangle.
  596.          
  597.        For all #AdjustBounds# option, the bounds rectangle is
  598.        reduced by the size of the interactor just placed.
  599.      */
  600.     enum AutoAdjustType {
  601.      /**Set the interactors position and dimensions to the value specified in
  602.          the rectangle.
  603.        */
  604.       AdjustBounds,
  605.      /**Set the interactors position to the top left of the specified bounds
  606.          rectangle. The width of the interactor is set to the width of the
  607.          bounds rectangle and the height remains unchanged.
  608.        */
  609.       AdjustTop,
  610.      /**Set the interactors position to the bottom left of the specified
  611.          bounds rectangle. The width of the interactor is set to the width of
  612.          the bounds rectangle and the height remains unchanged.
  613.        */
  614.       AdjustBottom,
  615.      /**Set the interactors position to the top left of the specified bounds
  616.          rectangle. The height of the interactor is set to the height of the
  617.          bounds rectangle and the width remains unchanged.
  618.        */
  619.       AdjustLeft,
  620.      /**Set the interactors position to the bottom left of the specified
  621.          bounds rectangle. The width of the interactor is set to the width of
  622.          the bounds rectangle and the height remains unchanged.
  623.        */
  624.       AdjustRight,
  625.      /**Set the interactors position to the top right of the specified bounds
  626.          rectangle. The height of the interactor is set to the height of the
  627.          bounds rectangle and the width is set to the standard width for a
  628.          vertical scroll bar as defined by the
  629.          Ref{PApplication::GetVScrollWidth()} function.
  630.        */
  631.       AdjustVScrollOnly,
  632.      /**Set the interactors position to the bottom left of the specified
  633.          bounds rectangle. The width of the interactor is set to the width of
  634.          the bounds rectangle and the height is set to the standard height for
  635.          a horizontal scroll bar as defined by the
  636.          Ref{PApplication::GetHScrollHeight()} function.
  637.        */
  638.       AdjustHScrollOnly,
  639.      /**Set the interactors position to the top right of the specified bounds
  640.          rectangle. The height of the interactor is set to the height of the
  641.          bounds rectangle minus the height of a horizontal scroll bar. The
  642.          width is set to the standard width for a vertical scroll bar.
  643.          
  644.          This option is used when both scroll bars are to be used and they must
  645.          be placed in the usual manner, with a small unused area in the bottom
  646.          right corner of the parent interactor.
  647.        */
  648.       AdjustVScrollBeforeHScroll,
  649.      /**Set the interactors position to the bottom left of the specified
  650.          bounds rectangle. The width of the interactor is set to the width of
  651.          the bounds rectangle minus the width of a vertical scroll bar. The
  652.          height is set to the standard height for a horizontal scroll bar.
  653.          This option is used when both scroll bars are to be used and they must
  654.          be placed in the usual manner, with a small unused area in the bottom
  655.          right corner of the parent interactor.
  656.        */
  657.       AdjustHScrollAfterVScroll
  658.     };
  659.    /**Adjust the interactor relative to the specified bounds rect. The bounds
  660.        rectangle is the modified to remove the space that the interactor takes
  661.        up in the bounds. In this way successive calls to AutoAdjustBounds() on
  662.        child interactors by a parent can "tile" the interactors to correct
  663.        positions. For example, if a parent has a scroll bar, a button bar and
  664.        a status bar thes can be placed with three calls to AutoAdjustBounds()
  665.        in the Ref{PTitledWindow::OnResize()} function.
  666.      */
  667.     void AutoAdjustBounds(
  668.       PRect & bounds,  /// Bounds rectangle in which the interactor is adjusted.
  669.       AutoAdjustType type = AdjustBounds  /// Option for adjustment to be made.
  670.     );
  671.    /**Determine if the point specified is inside the interactors area. Note
  672.        that the border or other decorations in a window are included in the
  673.        area that consitutes the interactor
  674.        The point is usually in absolute screen coordinates, ie when
  675.        #coords# parameter is #ScreenCoords#, but may also
  676.        be relative to the interactors origin or scaled to the interactors font
  677.        based layout coordinates.
  678.        When scaling is used (#coords == LocalCoords#), the
  679.        coordinates used are 1/4 average font width and 1/8 the font height.
  680.        @return
  681.        TRUE if the point is within the interactor.
  682.      */
  683.     BOOL ContainsPoint(
  684.       const PPoint & pt,        /// Point in to check.
  685.       CoordinateSystem coords   /// Coordinate system to use.
  686.     ) const;
  687.    /**Find the interactor that is at the specified coordinates. The
  688.        interactor must be owned by the application.
  689.        The point is usually in absolute screen coordinates, ie when
  690.        #coords# parameter is #ScreenCoords#, but may also
  691.        be relative to the interactors origin or scaled to the interactors font
  692.        based layout coordinates.
  693.        When scaling is used (#coords == LocalCoords#), the
  694.        coordinates used are 1/4 average font width and 1/8 the font height.
  695.        @return
  696.        pointer to interactor at point or NULL if no interactor there.
  697.      */
  698.     PInteractor * FindInteractor(
  699.       const PPoint & pt,        /// Point to check.
  700.       CoordinateSystem coords   /// Coordinate system to use.
  701.     ) const;
  702.    /**Enable or disable the interactor. This will prevent all input from being
  703.        processed by the interactor. In some cases the visual appearance of the
  704.        interactor may change depending on the individual semantics of the
  705.        interactor. For example the text for a Ref{PTextButton} would appear
  706.        "greyed" out.
  707.        
  708.        Note if an PInteractor is disabled, all its children, grandchildren etc
  709.        will be disabled.
  710.      */
  711.     virtual void Enable(
  712.       BOOL enabled = TRUE   /// New state for input processing of interactor.
  713.     );
  714.    /**Disable the interactor, ignoring all input to it.
  715.        This is identical to calling #Enable(FALSE)#.
  716.      */
  717.     void Disable();
  718.    /**Determine if the interactor is enabled and input may be processed.
  719.        @return
  720.        TRUE if input processing enabled.
  721.      */
  722.     BOOL IsEnabled() const;
  723.    /**Show the interactor and all child and grandchild etc interactors.
  724.        This enabled the interactor tree in post order, ie all children have
  725.        their ShowAll() function called and then the interactor itself is shown
  726.        using the Ref{Show()} function.
  727.      */
  728.     virtual void ShowAll();
  729.    /**Show or hide the interactor. This will immediately remove the interactor
  730.        from view. Showing an interactor will cause content update events to
  731.        be queued for later call of the Ref{OnRedraw()} function. The actual
  732.        display may be delayed.
  733.      */
  734.     virtual void Show(
  735.       BOOL visible = TRUE   /// New state for the visibility of the interactor.
  736.     );
  737.    /**Hide the interactor from view.
  738.        This is identical to calling #Show(FALSE)#.
  739.      */
  740.     void Hide();
  741.    /**Determine if interactor may be visible. Note that this does not mean
  742.        that it is not obscured by another window on the screen. It simply means
  743.        that the interactor has had #Show(TRUE)# called last.
  744.        @return
  745.        TRUE if the interactor is shown.
  746.      */
  747.     BOOL IsVisible() const;
  748.    /**Bring the interactor to the top of any layering order for overlapping
  749.        windows or interactors. This only affects sibling interactors at a
  750.        particular level of the parent child hierarchy.
  751.        If the interactor is a Ref{PTopLevelWindow} then the "siblings" it
  752.        uses are other applications top level windows. This is equivalent to the
  753.        "activating" of an application that the user may do using mouse and
  754.        keyboard in the platform dependent manner.
  755.        
  756.        Note that this does not change the order of child interactors as
  757.        returned by the #Ref{operator[]}# function, only the screen
  758.        appearence is altered.
  759.      */
  760.     virtual void BringToTop();
  761.    /**Determine if the interactor is currently on top of any layering order
  762.        for overlapping windows or interactors. This compares against sibling
  763.        interactors at a particular level of the parent child hierarchy.
  764.        @return
  765.        TRUE if this interactor is the 
  766.      */
  767.     virtual BOOL IsOnTop() const;
  768.    /**Mark the area of the interactor as requiring a redraw. This adds the
  769.        specified rectangular area to an {it update region}. If this region
  770.        is not empty then a request to redraw that area of the interactor is
  771.        queued to be processed by the message handling system. At some time
  772.        later the Ref{OnRedraw()} function is called with its canvas clipping
  773.        region set to the update region.
  774.        The parameterless form will invalidate the entire interactor.
  775.        When scaling is used (#coords == LocalCoords#), the
  776.        coordinates used are 1/4 average font width and 1/8 the font height.
  777.        The user should not override this function. If some form of action is
  778.        required on changing the interactors update region then the
  779.        Ref{_Invalidate()} function should be overridden.
  780.      */
  781.     void Invalidate(
  782.       PORDINATE x,
  783.       /// X position of the top left corner of the rectangle to invalidate.
  784.       PORDINATE y,
  785.       /// Y position of the top left corner of the rectangle to invalidate.
  786.       PDIMENSION width,       /// Width of the rectangle to invalidate.
  787.       PDIMENSION height,      /// Height of the rectangle to invalidate.
  788.       CoordinateSystem coords /// Coordinate system to use.
  789.     );
  790.     void Invalidate(
  791.       const PPoint & topLeft,
  792.       /// X & Y position of the top left corner of the rectangle to invalidate.
  793.       const PDim & dim,
  794.       /// The width & height of the rectangle to invalidate.
  795.       CoordinateSystem coords   /// Coordinate system to use.
  796.     );
  797.     void Invalidate(
  798.       const PPoint & topLeft,
  799.       /// X & Y position of the top left corner of the rectangle to invalidate.
  800.       const PPoint & botRight,
  801.      /**X & Y position of the bottom right corner of the rectangle to
  802.          invalidate.
  803.        */
  804.       CoordinateSystem coords   /// Coordinate system to use.
  805.     );
  806.     void Invalidate(
  807.       const PRect & rect,       /// The rectangle to invalidate.
  808.       CoordinateSystem coords   /// Coordinate system to use.
  809.     );
  810.     void Invalidate();
  811.    /**Mark the area of the interactor as {bf not} requiring a redraw. This
  812.        subtracts the specified rectangular area from an {it update region}.
  813.        If this region is not empty then a request to redraw that area of the
  814.        interactor is queued to be processed by the message handling system. At
  815.        some time later the Ref{OnRedraw()} function is called with its
  816.        canvas clipping region set to the update region.
  817.        The parameterless form will validate the entire interactor.
  818.        When scaling is used (#coords == LocalCoords#), the
  819.        coordinates used are 1/4 average font width and 1/8 the font height.
  820.        The user should not override this function. If some form of action is
  821.        required on changing the interactors update region then the
  822.        Ref{_Validate()} function should be overridden.
  823.      */
  824.     void Validate(
  825.       PORDINATE x,
  826.       /// X position of the top left corner of the rectangle to validate.
  827.       PORDINATE y,
  828.       /// Y position of the top left corner of the rectangle to validate.
  829.       PDIMENSION width,       /// Width of the rectangle to validate.
  830.       PDIMENSION height,      /// Height of the rectangle to validate.
  831.       CoordinateSystem coords /// Coordinate system to use.
  832.     );
  833.     void Validate(
  834.       const PPoint & topLeft,
  835.       /// X & Y position of the top left corner of the rectangle  invalidate.
  836.       const PDim & dim,
  837.       /// The width & height of the rectangle to validate.
  838.       CoordinateSystem coords   /// Coordinate system to use.
  839.     );
  840.     void Validate(
  841.       const PPoint & topLeft,
  842.       /// X & Y position of the top left corner of the rectangle to validate.
  843.       const PPoint & botRight,
  844.      /**X & Y position of the bottom right corner of the rectangle to
  845.          invalidate.
  846.        */
  847.       CoordinateSystem coords   /// Coordinate system to use.
  848.     );
  849.     void Validate(
  850.       const PRect & rect,       /// The rectangle to validate.
  851.       CoordinateSystem coords   /// Coordinate system to use.
  852.     );
  853.     void Validate();
  854.    /**Force an immediate update of the window. This is used in conjuction with
  855.        the Ref{Invalidate()} and Ref{Validate()} functions. If the
  856.        {it update region} specified by these functions is empty then this
  857.        function does nothing, otherwise an update of the interactor contents
  858.        is made.
  859.        This will do a synchronous Ref{OnRedraw()} call and guarantees that
  860.        the screen is updated before returning. It us used to speed up the
  861.        interaction with the user by not waiting for the standard delayed
  862.        screen update.
  863.      */
  864.     void Update();
  865.    /**Grab the mouse for exclusive use by this interactor. All mouse input,
  866.        clicks etc will be directed to this interactor only regardless of the
  867.        position of the mouse cursor.
  868.        
  869.        Note that the cursor grab is a system wide resource and {bf must} be
  870.        released by the application or it is possible to lock up the user
  871.        interface for {bf all} applications!
  872.      */
  873.     void GrabMouse();
  874.    /**Relenquish the exclusive use of the mouse after a Ref{GrabMouse()}
  875.        call.
  876.        Note that the cursor grab is a system wide resource and {bf must} be
  877.        released by the application or it is possible to lock up the user
  878.        interface for {bf all} applications!
  879.      */
  880.     void ReleaseMouse();
  881.    /**Determine if this interactor currently has exclusive use of the mouse
  882.        pointer.
  883.        @return
  884.        TRUE if has currently grabbed the mouse pointer.
  885.      */
  886.     BOOL HasMouse() const;
  887.    /**Make this interactor have the user keyboard input focus. All keyboard
  888.        input will now be directed to this interactor.
  889.        Appropriate messages are sent to interactors for the focus change. The
  890.        previous interactor receives a call to Ref{OnLostFocus()} and the new
  891.        interactor receives a Ref{OnGainFocus()} call.
  892.      */
  893.     void GrabFocus();
  894.    /**Determine if this interactor currently has the keyboard focus.
  895.        Return: TRUE if has the current focus.
  896.      */
  897.     BOOL HasFocus() const;
  898.    /**Set the cursor to be used for this interactor. The cursor is
  899.        automatically set to this shape while the mouse is anywhere over this
  900.        interactors client area or while the mouse pointer has been "grabbed"
  901.        by the Ref{GrabMouse()} function.
  902.        A call to this function will reset the cursor to parent flag that may
  903.        be set by the Ref{SetCursorToParent()} function.
  904.      */
  905.     virtual void SetCursor(
  906.       const PCursor & newCursor   /// New shape for mouse cursor.
  907.     );
  908.    /**Get the current cursor shape that is being used whenever the mouse
  909.        pointer is over this interactor. This will be the cursor last set by the
  910.        Ref{SetCursor()} function and is {bf not} subject to the
  911.        Ref{SetCursorToParent()} mode.
  912.        @return
  913.        current cursor object for interactor.
  914.      */
  915.     PCursor GetCursor() const;
  916.    /**Set the cursor to always be whatever the interactors parent is using as
  917.        a cursor shape. If the parents cursor is subsequently changed then the
  918.        child interactors cursor is also changed.
  919.        This does not change the current cursor as last set by the
  920.        Ref{SetCursor()} function.
  921.      */
  922.     void SetCursorToParent(
  923.       BOOL useParent = TRUE  /// Flag for interactor to use parents cursor.
  924.     );
  925.    /**Set the current cursor to the new shape and set all child interactors to
  926.        temporarily use that cursor.
  927.        Note that subsequent calls to the SetAllCursors() and
  928.        Ref{SetWaitCursor()} functions are ignored until the corresponding
  929.        Ref{RestoreAllCursors()} function is called. That it these functions
  930.        may {bf not} be nested.
  931.      */
  932.     void SetAllCursors(
  933.       const PCursor & newCursor   /// New shape for mouse cursor.
  934.     );
  935.    /**Restore the current cursor and all child interactors cursor to parent
  936.        flags to the state as of the previous call to Ref{SetAllCursors()}.
  937.      */
  938.     void RestoreAllCursors();
  939.    /**Set the cursor for this interactor and all child interactors to the
  940.        platform dependent standard {it wait} cursor. This may be a watch or
  941.        and hourglass as determined by the platform.
  942.        This function is equivalent to calling
  943.        #SetAllCursors(PCursor(PSTD_ID_CURSOR_WAIT))#.
  944.      */
  945.     void SetWaitCursor();
  946.    /**Set the position of the cursor. As there is only one cursor for the
  947.        entire system this may affect other applications.
  948.        
  949.        The point is usually in absolute screen coordinates, ie when
  950.        #coords# parameter is #ScreenCoords#, but may also
  951.        be relative to the interactors origin or scaled to the interactors font
  952.        based layout coordinates.
  953.        Note, this may not be available on all platforms in which case it does
  954.        nothing. For this and other reasons of user interfcace design, it is not
  955.        recommended that this function be used.
  956.        When scaling is used (#coords == LocalCoords#), the
  957.        coordinates used are 1/4 average font width and 1/8 the font height.
  958.     
  959.        The user should not override this function. If some form of action is
  960.        required on changing the cursor position then the
  961.        Ref{_SetCursorPos()} function should be overridden.
  962.      */
  963.     void SetCursorPos(
  964.       PORDINATE x,              /// New X position of cursor.
  965.       PORDINATE y,              /// New Y position of cursor.
  966.       CoordinateSystem coords   /// Coordinate system to use.
  967.     );
  968.     void SetCursorPos(
  969.       const PPoint & pt,        /// New X & Y position of cursor.
  970.       CoordinateSystem coords   /// Coordinate system to use.
  971.     );
  972.    /**Get the current cursor position in the interactors coordinate system.
  973.        The point is usually in absolute screen coordinates, ie when
  974.        #coords# parameter is #ScreenCoords#, but may also
  975.        be relative to the interactors origin or scaled to the interactors font
  976.        based layout coordinates.
  977.        When scaling is used (#coords == LocalCoords#), the
  978.        coordinates used are 1/4 average font width and 1/8 the font height.
  979.      */
  980.     PPoint GetCursorPos(
  981.       CoordinateSystem coords   /// Coordinate system to use.
  982.     ) const;
  983.    /**Show or hide the mouse cursor. To be able to nest calls to this function
  984.        an internal count is used. Whenever #show# the display count
  985.        is incremented otherwise it is decremented. The cursor is displayed only
  986.        when the count is greater than or equal to zero. The count is initially
  987.        zero.
  988.      */
  989.     virtual void ShowCursor(
  990.       BOOL show = TRUE    /// Flag for showing or hiding the cursor.
  991.     );
  992.    /**Hide the mouse cursor, this is equivalent to
  993.        #ShowCursor(FALSE)#.
  994.      */
  995.     void HideCursor();
  996.    /**Set the text caret shape to be as specified.
  997.        The text caret is a small rectangle used to indicate the current
  998.        position for editing text strings. It should only be present in
  999.        interactors that contain the current keyboard focus.
  1000.      */
  1001.     void SetCaret(
  1002.       const PCaret & newCaret   /// New shape for the caret.
  1003.     );
  1004.    /**Get the current text caret shape.
  1005.        The text caret is a small rectangle used to indicate the current
  1006.        position for editing text strings. It should only be present in
  1007.        interactors that contain the current keyboard focus.
  1008.        @return
  1009.        current caret object for interactor.
  1010.      */
  1011.     PCaret GetCaret() const;
  1012.    /**Set the position of the text caret within the interactor.
  1013.        When scaling is used (#coords == LocalCoords#), the
  1014.        coordinates used are 1/4 average font width and 1/8 the font height.
  1015.     
  1016.        The user should not override this function. If some form of action is
  1017.        required on changing the interactors caret position then the
  1018.        Ref{_SetCaretPos()} function should be overridden.
  1019.      */
  1020.     void SetCaretPos(
  1021.       PORDINATE x,              /// New X position of caret.
  1022.       PORDINATE y,              /// New Y position of caret.
  1023.       CoordinateSystem coords   /// Coordinate system to use.
  1024.     );
  1025.     void SetCaretPos(
  1026.       const PPoint & pt,        /// New X & Y position of caret.
  1027.       CoordinateSystem coords   /// Coordinate system to use.
  1028.     );
  1029.    /**Get the position of the text caret within the interactor.
  1030.        When scaling is used (#coords == LocalCoords#), the
  1031.        coordinates used are 1/4 average font width and 1/8 the font height.
  1032.        @return
  1033.        current position of the text caret.
  1034.      */
  1035.     PPoint GetCaretPos(
  1036.       CoordinateSystem coords   /// Coordinate system to use.
  1037.     ) const;
  1038.    /**Show or hide the text caret. To be able to nest calls to this function
  1039.        an internal count is used. Whenever #show# the display count
  1040.        is incremented otherwise it is decremented. The caret is displayed only
  1041.        when the count is greater than or equal to zero. The count is initially
  1042.        zero.
  1043.      */
  1044.     virtual void ShowCaret(BOOL show = TRUE);
  1045.    /**Hide the text caret, this is equivalent to
  1046.        #ShowCaret(FALSE)#.
  1047.      */
  1048.     void HideCaret();
  1049.    /**Set the default foreground colour of the interactor.
  1050.     
  1051.        This will be the initial colour set in the Ref{PInteractorCanvas}
  1052.        instance created via a Ref{PDrawCanvas} creation or via
  1053.        Ref{OnRedraw()} function call by the system providing a
  1054.        Ref{PRedrawCanvas}.
  1055.        On creation of the interator this is set to the colour specified by the
  1056.        Ref{PApplication::GetWindowFgColour()} function.
  1057.      */
  1058.     virtual void SetForegroundColour(
  1059.       const PColour & newColour  /// New foreground colour for interactor.
  1060.     );
  1061.    /**Get the default foreground colour of the interactor.
  1062.     
  1063.        This will be the initial colour set in the Ref{PInteractorCanvas}
  1064.        instance created via a Ref{PDrawCanvas} creation or via
  1065.        Ref{OnRedraw()} function call by the system providing a
  1066.        Ref{PRedrawCanvas}.
  1067.        On creation of the interator this is set to the colour specified by the
  1068.        Ref{PApplication::GetWindowFgColour()} function.
  1069.        @return
  1070.        colour for foreground of interactor.
  1071.      */
  1072.     const PColour & GetForegroundColour() const;
  1073.    /**Set the default background colour of the interactor.
  1074.     
  1075.        This will be the initial colour set in the Ref{PInteractorCanvas}
  1076.        instance created via a Ref{PDrawCanvas} creation or via
  1077.        Ref{OnRedraw()} function call by the system providing a
  1078.        Ref{PRedrawCanvas}.
  1079.        On creation of the interator this is set to the colour specified by the
  1080.        Ref{PApplication::GetWindowBkColour()} function.
  1081.      */
  1082.     virtual void SetBackgroundColour(
  1083.       const PColour & newColour  /// New background colour for interactor.
  1084.     );
  1085.    /**Get the default background colour of the interactor.
  1086.     
  1087.        This will be the initial colour set in the Ref{PInteractorCanvas}
  1088.        instance created via a Ref{PDrawCanvas} creation or via
  1089.        Ref{OnRedraw()} function call by the system providing a
  1090.        Ref{PRedrawCanvas}.
  1091.        On creation of the interator this is set to the colour specified by the
  1092.        Ref{PApplication::GetWindowBkColour()} function.
  1093.        @return
  1094.        colour for background of interactor.
  1095.      */
  1096.     const PColour & GetBackgroundColour() const;
  1097.    /**Get the width of vertical border and height of horizontal border for
  1098.        this interactor.
  1099.        
  1100.        This may be one of several values depending on the type of the
  1101.        interactor. For example a Ref{PTitledWindow} would return a value as
  1102.        in the Ref{PApplication::GetTitledBorderSize()} function.
  1103.        If the interactor does not have a border then #PDim(0,0)# is
  1104.        returned.
  1105.        @return
  1106.        current width of borders on interactor.
  1107.      */
  1108.     PDim GetBorderSize() const;
  1109.    /**Get the colour of the interactors border.
  1110.     
  1111.        The actual colour returned is dependent on the type of interactor and
  1112.        the current mode of the interactor. For instance for a
  1113.        Ref{PTitledWindow} that is active, the value returned would be as
  1114.        specified by the Ref{PApplication::GetActiveBorderColour()} function.
  1115.        @return
  1116.        colour for the border of the interactor.
  1117.      */
  1118.     const PColour & GetBorderColour() const;
  1119.    /**Begin a mouse track operation, calling the Ref{OnMouseTrack()}
  1120.        function for each mouse move. The #interactor# parameter is
  1121.        the object on which the Ref{OnMouseTrack()} function is called.
  1122.        The first form will start to track a drag using the current interactor
  1123.        as the Ref{OnMouseTrack()} functions target object.
  1124.        The mouse pointer is automatically grabbed (via Ref{GrabMouse()})
  1125.        and released (via Ref{ReleaseMouse()}). A canvas may also be
  1126.        automatically created and deleted, and is provided to the
  1127.        Ref{OnMouseTrack()} function.
  1128.        @return
  1129.        Canvas created for the track operation.
  1130.      */
  1131.     PCanvas * StartMouseTrack(
  1132.       BOOL wantsCanvas = FALSE   /// Create a canvas for the track operation.
  1133.     );
  1134.     PCanvas * StartMouseTrack(
  1135.       PInteractor * interactor,  /// Interactor that is to be used for track.
  1136.       BOOL wantsCanvas = FALSE   /// Create a canvas for the track operation.
  1137.     );
  1138.     /**@name System callback functions. */
  1139.    /**The system calls this whenever the mouse moves over the interactors
  1140.        usable area.
  1141.      */
  1142.     virtual void OnMouseMove(
  1143.       PKeyCode button,
  1144.      /**This key code is used to determine the modifiers (eg shift, control
  1145.          etc) that were active while the mouse was moved over the interactor.
  1146.          The value part of the key code is irrelevent.
  1147.        */
  1148.       const PPoint & where
  1149.      /**The position of the mouse pointer provided in pixels with its origin
  1150.          at the top left of the interactor.
  1151.        */
  1152.     );
  1153.    /**The system calls this whenever a mouse button is pressed in the
  1154.        interactors usable area.
  1155.        The two system parameters Ref{PApplication::GetDoubleClickRect()} and
  1156.        Ref{PApplication::GetDoubleClickTime()} control what constitutes a
  1157.        double click.
  1158.      */
  1159.     virtual void OnMouseDown(
  1160.       PKeyCode button,
  1161.      /**This key code is used to determine which mouse button was pressed and
  1162.          what modifiers that were active at that time. The mouse button that
  1163.          caused this call back is in the value part of the key code. The
  1164.          modifiers may indicate other mouse buttons being down at the same
  1165.          time.
  1166.        */
  1167.       const PPoint & where,
  1168.      /**The position of the mouse pointer provided in pixels with its origin
  1169.          at the top left of the interactor.
  1170.        */
  1171.       BOOL doubleClick
  1172.       /// Is TRUE if the mouse down is the second click of a double click.
  1173.     );
  1174.    /**The system calls this whenever a mouse button is released in the
  1175.        interactors usable area.
  1176.      */
  1177.     virtual void OnMouseUp(
  1178.       PKeyCode button,
  1179.      /**This key code is used to determine which mouse button was pressed and
  1180.          what modifiers that were active at that time. The mouse button that
  1181.          caused this call back is in the value part of the key code. The
  1182.          modifiers may indicate other mouse buttons being down at the same
  1183.          time.
  1184.        */
  1185.       const PPoint & where
  1186.      /**The position of the mouse pointer provided in pixels with its origin
  1187.          at the top left of the interactor.
  1188.        */
  1189.     );
  1190.    /**The system calls this whenever a keyboard key was pressed and this
  1191.        interactor had the focus.
  1192.        The key code passed in this function is a platform independent
  1193.        representation of a key cap. No ASCII or ANSI translation is made.
  1194.        It may be assumed that the OnKeyDown() function occurs before the
  1195.        Ref{OnKeyInput()} function, but it should {bf not} be assumed
  1196.        that the Ref{OnKeyUp()} function occurs after Ref{OnKeyInput()}
  1197.        function.
  1198.        @return
  1199.        TRUE if the Ref{OnKeyInput()} function is to be called with the
  1200.        translated key value.
  1201.      */
  1202.     virtual BOOL OnKeyDown(
  1203.       PKeyCode key,   /// Key code representation of key that was pressed.
  1204.       unsigned repeat /// Count for auto-repeat.
  1205.     );
  1206.    /**The system calls this whenever a keyboard key was released and this
  1207.        interactor had the focus.
  1208.        The key code passed in this function is a platform independent
  1209.        representation of a key cap. No ASCII or ANSI translation is made.
  1210.        It may be assumed that the OnKeyDown() function occurs before the
  1211.        Ref{OnKeyInput()} function, but it should {bf not} be assumed
  1212.        that the Ref{OnKeyUp()} function occurs after Ref{OnKeyInput()}
  1213.        function.
  1214.      */
  1215.     virtual void OnKeyUp(
  1216.       PKeyCode key    /// Key code representation of key that was released.
  1217.     );
  1218.    /**The system calls this whenever a keyboard key was pressed and this
  1219.        interactor had the focus. The string is the translated ANSI
  1220.        representation of the key combination.
  1221.        It may be assumed that the OnKeyDown() function occurs before the
  1222.        Ref{OnKeyInput()} function, but it should {bf not} be assumed
  1223.        that the Ref{OnKeyUp()} function occurs after Ref{OnKeyInput()}
  1224.        function.
  1225.      */
  1226.     virtual void OnKeyInput(
  1227.       const PString & str  /// ANSI string representation for the key press.
  1228.     );
  1229.    /**The system calls this whenever the interactor is given the focus from
  1230.        another window in the system.
  1231.        This function is typically used to change the appearance of the
  1232.        interactor to indicate that it has the focus, for example in a
  1233.        Ref{PEditBox} control the text caret is shown.
  1234.      */
  1235.     virtual void OnGainFocus();
  1236.    /**The system calls this whenever the interactor had the focus and it has
  1237.        been changed to another window in the system.
  1238.        This function is typically used to change the appearance of the
  1239.        interactor to indicate that it no longer has the focus, for example in a
  1240.        Ref{PEditBox} control the text caret is hidden.
  1241.      */
  1242.     virtual void OnLostFocus();
  1243.    /**The system calls this whenever the interactor is given the focus the
  1244.        first time for a given Ref{PTitledWindow} or Ref{PInteractorLayout}.
  1245.        
  1246.        The interactor may have focus changed to interactors in other titled
  1247.        windows or interactor layouts but not to another interactor in the same
  1248.        window or layout before being approved by a call to
  1249.        Ref{OnEndInput()}.
  1250.        This is primarily used to do field level validation within dialogs etc.
  1251.      */
  1252.     virtual void OnStartInput();
  1253.    /**The system calls this whenever the system wishes to change focus to
  1254.        another interactor in a given Ref{PTitledWindow} or
  1255.        Ref{PInteractorLayout}.
  1256.        This function in conjunction with the keyboard focus changing and the
  1257.        Ref{SetFocusInteractor()} function controls the transfer of focus
  1258.        from one interactor in a logical group (eg dialog) to another. It is
  1259.        primarily used for field level validation. For example, the
  1260.        Ref{PIntegerEditBox} control uses this to prevent the user from
  1261.        exiting the control until a valid entry hash been made.
  1262.        Note that the focus {bf does} actually change with appropriate calls
  1263.        to the Ref{OnGainFocus()} and Ref{OnLostFocus()} functions. The
  1264.        focus gets set back to the original interactor when this function
  1265.        disallows the focus change.
  1266.        @return
  1267.        FALSE will prevent the focus change from occurring and TRUE allows the
  1268.        change.
  1269.      */
  1270.     virtual BOOL OnEndInput();
  1271.    /**The system calls this whenever it requires that the interactors usable
  1272.        area needs to be updated and redrawn.
  1273.        The canvas is usually a Ref{PRedrawCanvas} instance with its clip
  1274.        region set to the current update region as determined by the
  1275.        Ref{Invalidate()} and Ref{Validate()} functions as well as those
  1276.        areas that were obscured by overlapping windows.
  1277.      */
  1278.     virtual void OnRedraw(
  1279.       PCanvas & canvas   /// Canvas to use when drawing the interactor contents.
  1280.     );
  1281.    /**This function is called whenever a control needs to notify its parent
  1282.        interactor that somthing has happened to it. The default behaviour
  1283.        of this function is is to call the notify function contained in the
  1284.        control object itself.
  1285.      */
  1286.     virtual void OnControlNotify(
  1287.       PControl & control,     /// Control that provides the notification.
  1288.       int option              /// Options for the type of notification.
  1289.     );
  1290.    /**This function is called whenever a help select mode is activated and
  1291.        this interactor is selected.
  1292.      */
  1293.     virtual void OnSelectHelp();
  1294.    /**This function is called whenever a balloon help function for the
  1295.        interactor is required.
  1296.        @return
  1297.        Pointer to balloon window containing balloon help text.
  1298.      */
  1299.     virtual PBalloon * OnBalloonHelp();
  1300.    /**This function is called whenever a drag track is in progress. This is
  1301.        begun with a call to the Ref{StartMouseTrack()} function, which is
  1302.        typically called from within the Ref{OnMouseDown()} function.
  1303.        The #lastTrack# parameter can be used to for special action
  1304.        at the end of the track operation.
  1305.        The mouse pointer is automatically grabbed (via Ref{GrabMouse()})
  1306.        and released (via Ref{ReleaseMouse()}). The canvas provided is
  1307.        also automatically created and deleted.
  1308.      */
  1309.     virtual void OnMouseTrack(
  1310.       PCanvas * canvas,
  1311.       /// The canvas available while the drag operation is tracking.
  1312.       const PPoint & where,
  1313.      /**The position of the mouse pointer provided in pixels with its origin
  1314.          at the top left of the interactor.
  1315.        */
  1316.       BOOL lastTrack
  1317.       /// This is TRUE if the position is the last track of the drag operation.
  1318.     );
  1319.   protected:
  1320.     /** Special constructor used with PTopLevelWindow. */
  1321.     PInteractor();
  1322.   /**@name New functions for class */
  1323.    /**Set the position of the interactor. The #xOrigin# and
  1324.        #yOrigin# parameters indicate the coordinate system to be
  1325.        used for the offsets. If the font based layout coordinates are used
  1326.        they will use the font of the {it parents} interactor. The
  1327.        interactors font is {bf not} used.
  1328.        Note that this sets the position of the exterior of the interactor,
  1329.        including any decoration, eg title bars etc.
  1330.        When scaling is used (#coords == LocalCoords#), the
  1331.        coordinates used are 1/4 average font width and 1/8 the font height.
  1332.      */
  1333.     virtual void _SetPosition(
  1334.       PORDINATE x,             /// Horizontal offset to apply to interactor.
  1335.       PORDINATE y,             /// Vertical offset to apply to interactor.
  1336.       PositionOrigin xOrigin,  /// Origin for horizontal offset.
  1337.       PositionOrigin yOrigin   /// Origin for verical offset.
  1338.     );
  1339.    /**Set the dimensions of the interactor. The new size is specified in
  1340.        either the font based layout coordinates or in screen pixels as
  1341.        specified by the #coords# parameter.
  1342.        Note that this sets the dimension of the interior of the interactor,
  1343.        excluding any decoration, eg title bars etc.
  1344.        
  1345.        When scaling is used (#coords == LocalCoords#), the
  1346.        coordinates used are 1/4 average font width and 1/8 the font height.
  1347.      */
  1348.     virtual void _SetDimensions(
  1349.       PDIMENSION width,         /// New width to apply to interactor.
  1350.       PDIMENSION height,        /// New height to apply to interactor.
  1351.       CoordinateSystem coords   /// Coordinate system to use.
  1352.     );
  1353.    /**Mark the area of the interactor as requiring a redraw. This adds the
  1354.        specified rectangular area to an {it update region}. If this region
  1355.        is not empty then a request to redraw that area of the interactor is
  1356.        queued to be processed by the message handling system. At some time
  1357.        later the Ref{OnRedraw()} function is called with its canvas clipping
  1358.        region set to the update region.
  1359.        The parameterless form will invalidate the entire interactor.
  1360.        When scaling is used (#coords == LocalCoords#), the
  1361.        coordinates used are 1/4 average font width and 1/8 the font height.
  1362.      */
  1363.     virtual void _Invalidate(
  1364.       PORDINATE x,
  1365.       /// X position of the top left corner of the rectangle to invalidate.
  1366.       PORDINATE y,
  1367.       /// Y position of the top left corner of the rectangle to invalidate.
  1368.       PDIMENSION width,         /// Width of the rectangle to invalidate.
  1369.       PDIMENSION height,        /// Height of the rectangle to invalidate.
  1370.       CoordinateSystem coords   /// Coordinate system to use.
  1371.     );
  1372.    /**Mark the area of the interactor as {bf not} requiring a redraw. This
  1373.        subtracts the specified rectangular area from an {it update region}.
  1374.        If this region is not empty then a request to redraw that area of the
  1375.        interactor is queued to be processed by the message handling system. At
  1376.        some time later the Ref{OnRedraw()} function is called with its
  1377.        canvas clipping region set to the update region.
  1378.        The parameterless form will validate the entire interactor.
  1379.        When scaling is used (#coords == LocalCoords#), the
  1380.        coordinates used are 1/4 average font width and 1/8 the font height.
  1381.      */
  1382.     virtual void _Validate(
  1383.       PORDINATE x,
  1384.       /// X position of the top left corner of the rectangle to validate.
  1385.       PORDINATE y,
  1386.       /// Y position of the top left corner of the rectangle to validate.
  1387.       PDIMENSION width,         /// Width of the rectangle to validate.
  1388.       PDIMENSION height,        /// Height of the rectangle to validate.
  1389.       CoordinateSystem coords   /// Coordinate system to use.
  1390.     );
  1391.    /**Set the position of the cursor. As there is only one cursor for the
  1392.        entire system this may affect other applications.
  1393.        
  1394.        The point is usually in absolute screen coordinates, ie when
  1395.        #coords# parameter is #ScreenCoords#, but may also
  1396.        be relative to the interactors origin or scaled to the interactors font
  1397.        based layout coordinates.
  1398.        Note, this may not be available on all platforms in which case it does
  1399.        nothing. For this and other reasons of user interfcace design, it is not
  1400.        recommended that this function be used.
  1401.        When scaling is used (#coords == LocalCoords#), the
  1402.        coordinates used are 1/4 average font width and 1/8 the font height.
  1403.      */
  1404.     virtual void _SetCursorPos(
  1405.       PORDINATE x,              /// New X position of cursor.
  1406.       PORDINATE y,              /// New Y position of cursor.
  1407.       CoordinateSystem coords   /// Coordinate system to use.
  1408.     );
  1409.    /**Set the position of the text caret within the interactor.
  1410.        When scaling is used (#coords == LocalCoords#), the
  1411.        coordinates used are 1/4 average font width and 1/8 the font height.
  1412.      */
  1413.     virtual void _SetCaretPos(
  1414.       PORDINATE x,              /// New X position of caret.
  1415.       PORDINATE y,              /// New Y position of caret.
  1416.       CoordinateSystem coords   /// Coordinate system to use.
  1417.     );
  1418.    /**Set the child interactor that has the focus in the Ref{PTitledWindow}
  1419.        or Ref{PInteractorLayout}.
  1420.        The interactor set here may not actually have the focus. It is the
  1421.        interactor that will be given the focus if the parent interactor,
  1422.        eg a dialog, is given the focus. The dialog itself never requires the
  1423.        focus directly.
  1424.        The default behaviour is to pass the interactor on to its parent
  1425.        using its Ref{SetFocusInteractor()} function.
  1426.      */
  1427.     virtual void SetFocusInteractor(
  1428.       PInteractor * interactor    /// Interactor that received focus.
  1429.     );
  1430.    /**Get the child interactor that has the focus in the Ref{PTitledWindow}
  1431.        or Ref{PInteractorLayout}.
  1432.        The interactor returned here may not actually have the focus. It is
  1433.        the interactor that will be given the focus if the parent interactor,
  1434.        eg a dialog, is given the focus. The dialog itself never requires the
  1435.        focus directly.
  1436.        The default behaviour is to get the interactor from its parent
  1437.        using its Ref{GetFocusInteractor()} function.
  1438.        @return
  1439.        pointer to child or grandchild interactor that has focus.
  1440.      */
  1441.     virtual PInteractor * GetFocusInteractor() const;
  1442.    /**Scan through all child interactors and if they are a command source,
  1443.        execute their notification function to enable or disable the item.
  1444.        The default behaviour is to call Ref{UpdateCommandSources()} for all
  1445.        child interactors.
  1446.        This function is used internally by the library. It would normally not
  1447.        be called directly.
  1448.      */
  1449.     virtual void UpdateMyCommandSources();
  1450.     // Member variables
  1451.       /** The interactors owner application */
  1452.     PApplication * owner;
  1453.       /** The interactor layout that contains this interactor. */
  1454.     PInteractor * parent;
  1455.       /** The list of children in this interactor layout. */
  1456.     PInteractorList children;
  1457.       /** The font used by the interactor. */
  1458.     PRealFont font;
  1459.       
  1460.       /** Flag to indicate that the parent interactor layouts cursor should be
  1461.           used with this interactor. */
  1462.     enum {
  1463.       UseCurrentCursor, UseParentCursor, UseSetAllCursor, UseSetAllParentCursor
  1464.     } cursorMode;
  1465.       /** The normal mouse cursor to be used in this interactor. */
  1466.     PCursor cursor;
  1467.       /** The saved mouse cursor to be used in this interactor after a call to
  1468.           Ref{RestoreAllCursors()}. */
  1469.     PCursor savedCursor;
  1470.       /** The text caret to be used in this interactor. */
  1471.     PCaret caret;
  1472.       /** The current location of the caret (in pixels). */
  1473.     PPoint caretPosition;
  1474.       /** The current count for visibility of caret in interactor. */
  1475.     int caretVisible;
  1476.       /** The foreground colour used in this interactor */
  1477.     PColour foregroundColour;
  1478.       /** The background colour used in this interactor */
  1479.     PColour backgroundColour;
  1480.       /** The interactor used in the dracking of a drag operation, if NULL no
  1481.           drag track is happening. */
  1482.     PInteractor * mouseTrackInteractor;
  1483.       /** The canvas used in the dracking of a drag operation, if NULL no drag
  1484.           track is happening. */
  1485.     PInteractorCanvas * mouseTrackCanvas;
  1486.     friend class PInteractorCanvas;
  1487.     
  1488.   private:
  1489.     PInteractor(const PInteractor & interactor);
  1490.     PInteractor & operator=(const PInteractor & interactor);
  1491.       // Cannot make copies of the interactor
  1492.       
  1493.     
  1494.     virtual void _OnMouseMove(PKeyCode button, const PPoint & where);
  1495.    /* Internal function for on a mouse move, calls Ref{OnMouseMove()} or
  1496.        Ref{OnMouseTrack()}.
  1497.      */
  1498.     virtual void _OnMouseUp(PKeyCode button, const PPoint & where);
  1499.    /* Internal function for on a mouse move, calls Ref{OnMouseUp()} or
  1500.        Ref{OnMouseTrack()}.
  1501.      */
  1502. #ifdef DOC_PLUS_PLUS
  1503. };
  1504. #endif
  1505. // Class declaration continued in platform specific header file ///////////////