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

IP电话/视频会议

开发平台:

Visual C++

  1. /*
  2.  * ansiterm.h
  3.  *
  4.  * ANSI text terminal emulator interactor for GUI.
  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: ansiterm.h,v $
  30.  * Revision 1.23  1999/03/09 08:01:47  robertj
  31.  * Changed comments for doc++ support (more to come).
  32.  *
  33.  * Revision 1.22  1999/02/16 08:08:27  robertj
  34.  * MSVC 6.0 compatibility changes.
  35.  *
  36.  * Revision 1.21  1998/12/12 00:41:59  robertj
  37.  * Added capability to get text lines out of scroll back buffer.
  38.  *
  39.  * Revision 1.20  1998/09/23 06:19:16  robertj
  40.  * Added open source copyright license.
  41.  *
  42.  * Revision 1.19  1996/05/15 10:14:36  robertj
  43.  * Rewrite of terminal to make descendant only require single character output function.
  44.  *
  45.  * Revision 1.18  1996/04/30 12:33:29  robertj
  46.  * Changed "inPixels" boolean to enum for three coordinate systems.
  47.  *
  48.  * Revision 1.17  1996/04/29 12:18:18  robertj
  49.  * Added local echo capability to terminal.
  50.  *
  51.  * Revision 1.16  1995/11/20 11:02:29  robertj
  52.  * Fixed bugs in non-adjustable rows and columns mode.
  53.  *
  54.  * Revision 1.15  1995/08/24 12:58:29  robertj
  55.  * Fixed bug in font selection.
  56.  * Implemented copy/paste.
  57.  *
  58.  * Revision 1.14  1995/07/31 12:15:39  robertj
  59.  * Removed PContainer from PChannel ancestor.
  60.  *
  61.  * Revision 1.13  1995/07/02 01:16:30  robertj
  62.  * Removed OnDoubleClick() and added BOOL to OnMouseDown() for double click.
  63.  *
  64.  * Revision 1.12  1995/06/17 11:07:58  robertj
  65.  * Changed OnKeyDown to return BOOL indicating OnKeyInput is to be used.
  66.  * Documentation update.
  67.  *
  68.  * Revision 1.11  1995/06/04 08:41:41  robertj
  69.  * Some minor speedups.
  70.  *
  71.  * Revision 1.10  1995/03/14 12:40:56  robertj
  72.  * Updated documentation to use HTML codes.
  73.  *
  74.  * Revision 1.9  1994/11/24  11:48:23  robertj
  75.  * Documentation.
  76.  *
  77.  * Revision 1.8  1994/10/23  03:49:45  robertj
  78.  * Added functions to set terminal options.
  79.  * Implemented scrolling to ne PScrollable.
  80.  * Improved terminal channel class.
  81.  *
  82.  * Revision 1.7  1994/08/23  11:32:52  robertj
  83.  * Oops
  84.  *
  85.  * Revision 1.6  1994/08/22  00:46:48  robertj
  86.  * Added pragma fro GNU C++ compiler.
  87.  *
  88.  * Revision 1.5  1994/07/27  06:03:00  robertj
  89.  * Synchronisation
  90.  *
  91.  * Revision 1.4  1994/07/25  03:33:13  robertj
  92.  * Changed variables to int for better platform independence.
  93.  *
  94.  * Revision 1.3  1994/07/17  10:46:06  robertj
  95.  * Major redesign to use list instead of array to allow for bigger buffer.
  96.  *
  97.  * Revision 1.2  1994/06/25  11:55:15  robertj
  98.  * Unix version synchronisation.
  99.  *
  100.  * Revision 1.1  1994/04/01  14:27:01  robertj
  101.  * Initial revision
  102.  *
  103.  */
  104. #ifndef _ANSITERM_H
  105. #define _ANSITERM_H
  106. #ifdef __GNUC__
  107. #pragma interface
  108. #endif
  109. /** This class is an interactor that emulates a serial terminal. This is an
  110.     abstract class that has specific terminal emulators descended from it eg
  111.     the ref{PAnsiTerminal} class.
  112.     A descendent class should implement the ref{Write()} function or
  113.     ref{ProcessCharacter()} function to output characters to the terminal
  114.     lines implemented by PTerminal. The descendent may also wish to implement
  115.     the ref{PInteractor::OnKeyDown()} and ref{Reset()} functions for any
  116.     special keys supported by the terminal or initialisation required when the
  117.     terminal is reset.
  118. */
  119. class PTerminal : public PScrollable
  120. {
  121.   PCLASSINFO(PTerminal, PScrollable);
  122.   public:
  123.   /**@name Construction */
  124.   //@{
  125.     /**Create a terminal interactor, contained within a scroller window.
  126.        This always creates a Reset() terminal. */
  127.     PTerminal(
  128.       PScroller * parent,
  129.       /**ref{PScroller} class that the terminal class interactor must be
  130.          placed in. The PScroller contains the scroll bars etc and communicates
  131.          with the ref{PScrollable} to do scrolling functions.
  132.        */
  133.       ostream * kbd = NULL
  134.       /**Stream to send all keyboard input and other output, eg cursor
  135.          position generated by the PTerminal.
  136.        */
  137.     );
  138.   //@}
  139.   /**@name Overrides from class PInteractor */
  140.   //@{
  141.     /**Set the font to be used by default by this interactor. A canvas created
  142.        on this interactor will initially have this font selected.
  143.        
  144.        This also determines the coordinate system to be used for laying out
  145.        child interactors via the ref{SetPosition()} and
  146.        ref{SetDimensions()} functions. The coordinates used are 1/4 average
  147.        font width and 1/8 the font height.
  148.        
  149.        If the #toChildren# parameter is TRUE then the font is
  150.        propagated down to all child interactors and grandchild interactors etc.
  151.      */
  152.     virtual void SetFont(
  153.       const PFont & newFont, /// New font specification fo rthe interactor.
  154.       BOOL toChildren = TRUE
  155.         /// Flag to recursively change all child interactors.
  156.     );
  157.   //@}
  158.   /**@name New functions for class */
  159.   //@{
  160.     /**Reset the terminal. This clears the terminal virtual screen, wipes the
  161.        scoll back buffer, resets internal terminal options (eg wrap at end of
  162.        line) to default states and clears any modes the terminal is in.
  163.      */
  164.     virtual void Reset();
  165.     /**Write characters to the terminal. This must be defined by the
  166.        descendent class of the PTerminal. It should do all interpretation of
  167.        the input data stream for the terminal protocol. This usually involves
  168.        a state machine of some description.
  169.      */
  170.     virtual void Write(
  171.       const char * buf,
  172.         /// Pointer to the buffer of characters to place onto the terminal.
  173.       PINDEX len
  174.         /// Length of the buffer of characters.
  175.     );
  176.     /**Write a string to the terminal. This executes the Write() function
  177.        that takes a buffer pointer and length.
  178.      */
  179.     void Write(
  180.       const PString & str /// String to write to the terminal.
  181.     ) { Write(str, str.GetLength()); }
  182.     /**Determine if there is a selection active in the terminal.
  183.        @return
  184.        TRUE if there is a selection active, FALSE if no selection has been
  185.        made.
  186.      */
  187.     virtual BOOL HasSelection() const;
  188.     /**Get the lines of text that was selected in the terminal window.
  189.        @return
  190.        A string containing the lines of text in the selected region. The line
  191.        separators are always n.
  192.      */
  193.     virtual PString GetSelection() const;
  194.     /** Set the selected lines in the terminal window. */
  195.     virtual void SetSelection(
  196.       PINDEX startRow,    /// Starting row of the selected block
  197.       PINDEX startColumn, /// Starting column of the selected block
  198.       PINDEX finishRow,   /// Finishing row of the selected block
  199.       PINDEX finishColumn /// Finishing column of the selected block
  200.     );
  201.     /**Set the output stream to receive all keyboard input or protocol
  202.        responses from terminal emulation.
  203.      */
  204.     void SetKeyboardStream(
  205.       ostream * out
  206.         /// Stream to output keyboard data entered into the terminal emulator.
  207.     );
  208.     /**Get the text in the specified row. The trailing blanks are trimmed but
  209.        leading blanks are included.
  210.        @return
  211.        String for the terminal row text.
  212.      */
  213.     PString GetRow(PINDEX idx) const;
  214.     /**Get the maximum number of rows that are saved "scroll back" buffer of
  215.        the terminal.
  216.        @return
  217.        Max number of rows in the buffer.
  218.      */
  219.     PINDEX GetTotalRows() const { return rowData.GetSize(); }
  220.     /**Get the maximum number of rows that are saved "scroll back" buffer of
  221.        the terminal.
  222.        @return
  223.        Max number of rows in the buffer.
  224.      */
  225.     PINDEX GetMaxSavedRows() const { return maxSavedRows; }
  226.     /**Set the number of rows in the terminal. This will resize the interactor
  227.        to fit the specified number of rows.
  228.      */
  229.     void SetMaxSavedRows(
  230.       PINDEX newRows /// New number of rows
  231.     );
  232.     /**Get the number of rows in terminal.
  233.        @return
  234.        Number of rows visible in the window
  235.      */
  236.     PINDEX GetRows() const { return rows; }
  237.     /* Set the number of rows in the terminal. This will resize the interactor
  238.        to fit the specified number of rows.
  239.      */
  240.     void SetRows(
  241.       PINDEX newRows /// New number of rows
  242.     );
  243.     /**Get the number of columns in terminal.
  244.        @return
  245.        Number of columns visible in the window
  246.      */
  247.     PINDEX GetColumns() const { return columns; }
  248.     /**Set the number of columns in the terminal. This will resize the
  249.        interactor to fit the specified number of rows.
  250.      */
  251.     void SetColumns(
  252.       PINDEX newColumns /// New number of columns
  253.     );
  254.     /**Get the variable row/columns flag for the terminal. This flag controls
  255.        if the rows/columns of the terminal emulator are fixed or change
  256.        whenever the size of the interactor changes.
  257.        @return
  258.        Current value of the flag.
  259.      */
  260.     BOOL GetVariableRowColumns() const { return variableRowColumns; }
  261.     /**Set the variable row/columns flag for the terminal. This flag controls
  262.        if the rows/columns of the terminal emulator are fixed or change
  263.        whenever the size of the interactor changes.
  264.      */
  265.     void SetVariableRowColumns(
  266.       BOOL b /// New value of the flag
  267.     );
  268.     /**Get the block cursor flag for the terminal. This flag controls if
  269.        the cursor (caret) of the terminal emulator is a full block or a single
  270.        horizontal line.
  271.        @return
  272.        Current value of the flag.
  273.      */
  274.     BOOL GetBlockCursor() const { return blockCursor; }
  275.     /**Set the block cursor flag for the terminal. This flag controls if the
  276.        cursor (caret) of the terminal emulator is a full block or a single
  277.        horizontal line.
  278.      */
  279.     void SetBlockCursor(
  280.       BOOL b /// New value of the flag
  281.     );
  282.     /**Get the wrap at end of line flag for the terminal. This flag controls
  283.        if the terminal emulator wraps around if text is output when the cursor
  284.        is at the end of the line.
  285.        @return
  286.        Current value of the flag.
  287.      */
  288.     BOOL GetWrapEOL() const { return wrapEOL; }
  289.     /**Set the wrap at end of line flag for the terminal. This flag controls
  290.        if the terminal emulator wraps around if text is output when the
  291.        cursor is at the end of the line.
  292.      */
  293.     void SetWrapEOL(
  294.       BOOL b /// New value of the flag
  295.     ) { wrapEOL = b; }
  296.     /**Get the output line feed on return flag for the terminal. This flag
  297.        controls if the terminal emulator does a line feed every time a
  298.        carriage return is received.
  299.        @return
  300.        Current value of the flag.
  301.      */
  302.     BOOL GetLineFeedOnReturn() const { return lineFeedOnReturn; }
  303.     /**Set the output return on line feed flag for the terminal. This flag
  304.        controls if the terminal emulator does a line feed every time a
  305.        carriage return is received.
  306.      */
  307.     void SetLineFeedOnReturn(
  308.       BOOL b /// New value of the flag
  309.     ) { lineFeedOnReturn = b; }
  310.     /**Get the output return on line feed flag for the terminal. This flag
  311.        controls if the terminal emulator does a carriage return every time a
  312.        line feed is received.
  313.        @return
  314.        Current value of the flag.
  315.      */
  316.     BOOL GetReturnOnLineFeed() const { return returnOnLineFeed; }
  317.     /**Set the output return on line feed flag for the terminal. This flag
  318.        controls if the terminal emulator does a carriage return every time a
  319.        line feed is received.
  320.      */
  321.     void SetReturnOnLineFeed(
  322.       BOOL b /// New value of the flag
  323.     ) { returnOnLineFeed = b; }
  324.     /**Get the local echo flag for the terminal. This flag controls if the
  325.        terminal emulator displays every character typed within it into its own
  326.        input stream.
  327.        @return
  328.        Current value of the flag.
  329.      */
  330.     BOOL GetLocalEcho() const { return localEcho; }
  331.     /**Set the local echo flag for the terminal. This flag controls if the
  332.        terminal emulator displays every character typed within it into its own
  333.        input stream.
  334.      */
  335.     void SetLocalEcho(
  336.       BOOL b /// New value of the flag
  337.     ) { localEcho = b; }
  338.   //@}
  339.   protected:
  340.   /**@name Overrides from class PInteractor */
  341.   //@{
  342.     /**Set the dimensions of the interactor. The new size is specified
  343.        in layout coordinates. The user may override this function if checks for
  344.        maximum or minimum size are required. Note that this sets the dimension
  345.        of the interior of the interactor, excluding any external decoration
  346.        (eg title bars).
  347.      */
  348.     virtual void _SetDimensions(
  349.       PDIMENSION width,  /// New width of interactor
  350.       PDIMENSION height, /// New height of interactor
  351.       CoordinateSystem coords /// Coordinate system to use.
  352.     );
  353.     /**The system calls this whenever a mouse button is depressed in the
  354.        interactors drawable area (ie not in title bars etc).
  355.      */
  356.     virtual void OnMouseDown(
  357.       PKeyCode button,
  358.       /**Key code that specifies which mouse button and which modifiers (shift,
  359.          control etc) were active at the time.
  360.        */
  361.       const PPoint & where,
  362.       /**The position of the mouse pointer provided in pixels with its origin
  363.          at the top left of the interactor.
  364.        */
  365.       BOOL doubleClick
  366.       /// Is TRUE if the mouse down is the second click of a double click.
  367.     );
  368.     /**This function is called whenever a drag track is in progress. This is
  369.        begun with a call to the ref{StartMouseTrack()} function, which is
  370.        typically called from within the ref{OnMouseDown()} function.
  371.        The #lastTrack# parameter can be used to for special action
  372.        at the end of the track operation.
  373.        The mouse pointer is automatically grabbed (via ref{GrabMouse()})
  374.        and released (via ref{ReleaseMouse()}). The canvas provided is
  375.        also automatically created and deleted.
  376.      */
  377.     virtual void OnMouseTrack(
  378.       PCanvas * canvas,
  379.       /// The canvas available while the drag operation is tracking.
  380.       const PPoint & where,
  381.       /**The position of the mouse pointer provided in pixels with its origin
  382.          at the top left of the interactor.
  383.        */
  384.       BOOL lastTrack
  385.       /// This is TRUE if the position is the last track of the drag operation.
  386.     );
  387.     /**The system calls this whenever a keyboard key was pressed and this
  388.        interactor had the focus. The string is the translated ANSI
  389.        representation of the key combination.
  390.      */
  391.     virtual void OnKeyInput(
  392.       const PString & str /// Translated key code.
  393.     );
  394.     /**The system calls this whenever it requires that the interactors
  395.        drawable area needs to be updated and redrawn.
  396.      */
  397.     virtual void OnRedraw(
  398.       PCanvas & canvas /// Canvas for drawing into the interactor
  399.     );
  400.   //@}
  401.     // Sub-structures
  402.     struct Attribute {
  403.       unsigned inverse:1;
  404.       unsigned bold:1;
  405.       unsigned underline:1;
  406.       unsigned blink:1;
  407.       unsigned fgColor:4;
  408.       unsigned bkColor:4;
  409.       unsigned selected:1;
  410.     };      // Current display attribute for terminal
  411.     class Row : public PObject
  412.     {
  413.       PCLASSINFO(Row, PObject);
  414.       public:
  415.         Row(Attribute attribute);
  416.         void Draw(PTerminal * term,
  417.                                 PCanvas & canvas, PINDEX line, PINDEX lastCol);
  418.         void Scroll(PTerminal * term, PCanvas & canvas,
  419.                           PINDEX line, PINDEX left, PINDEX right, int columns);
  420.         void SetCell(PINDEX column, char ch, Attribute attribute)
  421.           { ascii[column] = ch; attrib[column] = attribute; }
  422.         void AdjustSelection(PINDEX start, PINDEX finish, BOOL select);
  423.         PString GetText() const;
  424.         PString GetSelection() const;
  425.         enum { MaxColumns = 250 };
  426.       private:
  427.         Attribute attrib[MaxColumns];
  428.         char      ascii[MaxColumns];
  429.     };
  430.     friend class Row;
  431.   /**@name New functions for class */
  432.   //@{
  433.     /**Process a character using the state machine for the terminal type.
  434.      */
  435.     virtual void ProcessCharacter(
  436.       PDrawCanvas & canvas, /// Canvas used for updating the interactor
  437.       char c                /// Character to process
  438.     );
  439.     /**Get the Row object in which the current cursor is located.
  440.        @return
  441.        Reference to the Row object that the cursor is in.
  442.      */
  443.     Row & GetCursorRow();
  444.     /**Adjust the caret/cursor position. This changes the internal location
  445.        of the cursor clipped to the current scrolling region and window
  446.        bounds. The ref{PCaret} is also updated.
  447.      */
  448.     void AdjustCaretPosition(
  449.       int dLine, /// Amount to move the cursor vertically.
  450.       int dCol   /// Amount to move the cursor horizontally.
  451.     );
  452.     /**Move the caret/cursor position assuring that internal updates are made
  453.        beforehand. This changes the internal location of the cursor clipped
  454.        to the current scrolling region and window bounds. The ref{PCaret} is
  455.        also updated.
  456.      */
  457.     void MoveCaretPosition(
  458.       PDrawCanvas & canvas, /// Canvas used for updating the interactor
  459.       int dLine,            /// Amount to move the cursor vertically.
  460.       int dCol              /// Amount to move the cursor horizontally.
  461.     );
  462.     /**Scroll the section of the terminal erasing any part that is exposed
  463.        by the scroll to spaces in the current attribute.
  464.      */
  465.     void ScrollLines(
  466.       PDrawCanvas & canvas, /// Canvas used for updating the interactor.
  467.       PINDEX top,           /// The top line of the scrolled region.
  468.       PINDEX bottom,        /// The bottom line of the scrolled region.
  469.       int lines             /// The number of lines to scroll.
  470.     );
  471.     /**Adjust the cells selected in the terminal window.
  472.      */
  473.     void AdjustSelection(
  474.       PCanvas & canvas,  /// Canvas for updating the screen.
  475.       PINDEX start,      /// Start point of selection.
  476.       PINDEX finish,     /// End point of selection.
  477.       BOOL select        /// Whther region is being selected or deselected.
  478.     );
  479.   //@}
  480.     // Member variables
  481.     PLIST(RowList, Row);
  482.     /**List of Row objects that constitute the terminal screen and the scroll
  483.        back buffer.
  484.      */
  485.     RowList rowData;
  486.     /// Maximum number of lines to save in the scroll back buffer.
  487.     PINDEX maxSavedRows;
  488.     /// Width of a cell in the terminal screen in pixels.
  489.     PDIMENSION cellWidth;
  490.     /// Height of a cell in the terminal screen in pixels.
  491.     PDIMENSION cellHeight;
  492.     /// Number of rows in the terminal screen.
  493.     PINDEX rows;
  494.     /// Number of columns in the terminal screen.
  495.     PINDEX columns;
  496.     /// Number of columns visible in the terminal screen.
  497.     PINDEX columnsVisible;
  498.     /// Number of rows visible in the terminal screen.
  499.     PINDEX rowsVisible;
  500.     /// Position of the top of the scroll region.
  501.     PINDEX scrollTop;
  502.     /// Position of the bottom of the scroll region.
  503.     PINDEX scrollBottom;
  504.     /// Row of the current cursor position.
  505.     PINDEX cursorRow;
  506.     /// Column of the current cursor position.
  507.     PINDEX cursorColumn;
  508.     /// Current attribute for new characters in terminal.
  509.     Attribute attribute;
  510.     /**The variable row/columns flag for the terminal. This flag controls if
  511.        the rows/columns of the terminal emulator are fixed or change whenever
  512.        the size of the interactor changes.
  513.      */
  514.     BOOL variableRowColumns;
  515.     /**The block cursor flag for the terminal. This flag controls if the
  516.        cursor (caret) of the terminal emulator is a full block or a single
  517.        horizontal line.
  518.      */
  519.     BOOL blockCursor;
  520.     /**The wrap at end of line flag for the terminal. This flag controls if
  521.        the terminal emulator wraps around if text is output when the cursor is
  522.        at the end of the line.
  523.      */
  524.     BOOL wrapEOL;
  525.     /**The output line feed on return flag for the terminal. This flag controls
  526.        if the terminal emulator does a line feed every time a carriage return
  527.        is received.
  528.      */
  529.     BOOL lineFeedOnReturn;
  530.     /**The output return on line feed flag for the terminal. This flag controls
  531.        if the terminal emulator does a carriage return every time a line feed
  532.        is received.
  533.      */
  534.     BOOL returnOnLineFeed;
  535.     /**The local echo flag for the terminal. This flag controls if the
  536.        terminal emulator displays every character typed within it into its own
  537.        input stream.
  538.      */
  539.     BOOL localEcho;
  540.     /**The stream to which data received by the terminals emulation of the
  541.        keyboard is sent.
  542.      */
  543.     ostream * keyboard;
  544.     /**Column for start of delayed screen output text. Characters may be output
  545.        into internal structures but not displayed in the interactor until
  546.        later. This algorithm is designed to improve performance by avoiding
  547.        outputing each individual character through the display canvas.
  548.      */
  549.     PINDEX updateColumn;
  550.     /**Starting position and current position for mouse selection of text in
  551.        the terminal window.
  552.      */
  553.     PINDEX anchor, selection;
  554.     /// Indicate that the selection is in columns, not whole lines.
  555.     BOOL columnModeSelection;
  556. };
  557. /**An interactor that emulates an ANSI terminal. This is a descendent of the
  558.    ref{PTerminal} class. This largely resembles the DEC VT100 in its
  559.    operation but has some extra ANSI codes implemented.
  560. */
  561. class PAnsiTerminal : public PTerminal
  562. {
  563.   PCLASSINFO(PAnsiTerminal, PTerminal);
  564.   public:
  565.   /**@name Construction */
  566.   //@{
  567.     /**Create an ANSI terminal interactor, contained within a scroller window.
  568.        This always creates a Reset() terminal.
  569.      */
  570.     PAnsiTerminal(
  571.       PScroller * parent,
  572.       /**ref{PScroller} class that the terminal class interactor must be
  573.          placed in. The PScroller contains the scroll bars etc and communicates
  574.          with the ref{PScrollable} to do scrolling functions.
  575.        */
  576.       ostream * kbd = NULL
  577.       /**Stream to send all keyboard input and other output, eg cursor position
  578.          generated by the PTerminal.
  579.        */
  580.     );
  581.   //@}
  582.   /**@name Overrides from class PTerminal */
  583.   //@{
  584.     virtual void Reset();
  585.     /* Reset the terminal emulation.  This clears the terminal virtual screen,
  586.        wipes the scoll back buffer, resets internal terminal options (eg wrap
  587.        at end of line) to default states and clears any modes the terminal is
  588.        in.
  589.      */
  590.   //@}
  591.   protected:
  592.   /**@name Overrides from class PInteractor */
  593.   //@{
  594.     /**The system calls this whenever a key has been pressed with the
  595.        interactor having the focus. This provides a raw code for the key
  596.        before any translation to ASCII.
  597.      */
  598.     virtual BOOL OnKeyDown(
  599.       PKeyCode key,   /// The key code that was pressed.
  600.       unsigned repeat /// The repeat count if the key is auto-repeating.
  601.     );
  602.   //@}
  603.   /**@name Overrides from class PTerminal */
  604.   //@{
  605.     /** Process incoming stream of data. */
  606.     void ProcessCharacter(
  607.       PDrawCanvas & canvas, /// Canvas to draw new characters
  608.       char ch               /// Character to process.
  609.     );
  610.   //@}
  611.     // Member variables
  612.     enum { MaxParameters = 10 };
  613.     BOOL       inEscapeSequence;
  614.     BOOL       inParameter;
  615.     PINDEX     parameter[MaxParameters];
  616.     PINDEX     numParameters;
  617.     PINDEX     savedCursorRow;
  618.     PINDEX     savedCursorColumn;
  619. };
  620. /**This class is a standard ref{PChannel} which may output to a
  621.    ref{PTerminal} emulation interactor. As PChannel is descended from
  622.    iostream all the standard << and >> operators may be used to output to a
  623.    window.
  624. */
  625. class PTerminalChannel : public PChannel
  626. {
  627.   PCLASSINFO(PTerminalChannel, PChannel);
  628.   public:
  629.   /**@name Construction */
  630.   //@{
  631.     /**Create a terminal interactor channel with no interactor. This is
  632.        provided so that instances of this class (eg as member fields) can be
  633.        declared before the ref{PTerminal} is created.
  634.      */
  635.     PTerminalChannel();
  636.     /**Create a terminal interactor channel connected to a terminal emulator
  637.        interactor.
  638.      */
  639.     PTerminalChannel(
  640.       PTerminal & term
  641.       /**The ref{PTerminal} descendent that implements the terminal emulation
  642.          interactor window.
  643.       */
  644.     );
  645.     ~PTerminalChannel();
  646.     // Close the terminal channel when destroyed.
  647.   //@}
  648.   /**@name Overrides from class PChannel */
  649.   //@{
  650.     /**Determine if the channel is currently open and may be read from or
  651.        written to.
  652.        @return
  653.        TRUE if the channel is open.
  654.      */
  655.     virtual BOOL IsOpen() const;
  656.     /**Get the name given to the channel that is currently open. This returns
  657.        the class name of the ref{PTerminal} descendent that is attached to
  658.        the channel.
  659.        @return
  660.        Name of the channel.
  661.      */
  662.     virtual PString GetName() const;
  663.       
  664.     /**Low level read from the channel. This reads whatever is available as
  665.        entered via the keyboard when the ref{PTerminal} had the focus.
  666.        @return
  667.        TRUE if the function successfully read at least one character of data
  668.        from the channel.
  669.      */
  670.     virtual BOOL Read(
  671.       void * buf, /// The buffer into which to put read characters.
  672.       PINDEX len  /// The maximum number of characters to read.
  673.     );
  674.     /**Low level write to the channel. This passes data through directly to
  675.        the Write() function of ref{PTerminal}.
  676.        @return
  677.        TRUE if all the data specified was successfully written to the channel.
  678.      */
  679.     virtual BOOL Write(
  680.       const void * buf, /// The buffer from which to write characters.
  681.       PINDEX len        /// The maximum number of characters to write.
  682.     );
  683.     /**Close the channel. This simply disconnects the current ref{PTerminal} 
  684.        from the channel and leaves it disconnected. Any reading or writing
  685.        after this function has been executed and before a call to Open() has
  686.        been made will assert.
  687.        @return
  688.        TRUE if the channel closed without error.
  689.      */
  690.     virtual BOOL Close();
  691.   //@}
  692.   /**@name New functions for class */
  693.   //@{
  694.     /**Open the ref{PTerminalChannel} using a ref{PTerminal} descendent.
  695.        This "connects" the channel to an interactor. This will override any
  696.        previous connection made.
  697.      */
  698.     BOOL Open(
  699.       PTerminal & term
  700.       /**The ref{PTerminal} descendent that implements the terminal emulation
  701.          interactor window.
  702.        */
  703.     );
  704.   //@}
  705.   private:
  706.     PTerminal     * terminal;
  707.     PStringStream   readBuf;
  708. };
  709. #endif
  710. // End Of File ///////////////////////////////////////////////////////////////