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

IP电话/视频会议

开发平台:

Visual C++

  1. /*
  2.  * slistbox.h
  3.  *
  4.  * String list box control.
  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: slistbox.h,v $
  30.  * Revision 1.24  1999/11/16 06:51:41  robertj
  31.  * Created PCustomListBox to allow motif native code PStringListBox implementation
  32.  *
  33.  * Revision 1.23  1999/11/16 05:19:36  craigs
  34.  * Created PCustomListBox to allow native code PStringListBox implementation
  35.  *
  36.  * Revision 1.22  1999/03/10 03:49:53  robertj
  37.  * More documentation adjustments.
  38.  *
  39.  * Revision 1.21  1999/03/09 08:01:50  robertj
  40.  * Changed comments for doc++ support (more to come).
  41.  *
  42.  * Revision 1.20  1999/02/16 08:08:46  robertj
  43.  * MSVC 6.0 compatibility changes.
  44.  *
  45.  * Revision 1.19  1998/12/01 12:55:58  robertj
  46.  * new directory structure.
  47.  *
  48.  * Revision 1.18  1998/10/16 11:08:12  robertj
  49.  * GNU compatibility.
  50.  *
  51.  * Revision 1.17  1998/09/23 06:29:04  robertj
  52.  * Added open source copyright license.
  53.  *
  54.  * Revision 1.16  1998/09/14 12:41:34  robertj
  55.  * Added tab stops to string output in list box.
  56.  *
  57.  * Revision 1.15  1995/10/14 15:05:24  robertj
  58.  * Added addition of colection as strings to box.
  59.  *
  60.  * Revision 1.14  1995/06/17 11:13:23  robertj
  61.  * Documentation update.
  62.  *
  63.  * Revision 1.13  1995/03/14 12:42:38  robertj
  64.  * Updated documentation to use HTML codes.
  65.  *
  66.  * Revision 1.12  1995/01/14  06:19:40  robertj
  67.  * Documentation
  68.  *
  69.  * Revision 1.11  1994/10/30  11:47:08  robertj
  70.  * Changed mechanism for doing notification callback functions.
  71.  *
  72.  * Revision 1.10  1994/08/23  11:32:52  robertj
  73.  * Oops
  74.  *
  75.  * Revision 1.9  1994/08/22  00:46:48  robertj
  76.  * Added pragma fro GNU C++ compiler.
  77.  *
  78.  * Revision 1.8  1994/06/25  11:55:15  robertj
  79.  * Unix version synchronisation.
  80.  *
  81.  * Revision 1.7  1994/04/03  08:34:18  robertj
  82.  * Added help and focus functionality.
  83.  *
  84.  * Revision 1.6  1994/03/07  07:38:19  robertj
  85.  * Major enhancementsacross the board.
  86.  *
  87.  * Revision 1.5  1994/01/03  04:42:23  robertj
  88.  * Mass changes to common container classes and interactors etc etc etc.
  89.  *
  90.  * Revision 1.4  1993/09/27  16:35:25  robertj
  91.  * Removed special constructor for dialog resource loading.
  92.  *
  93.  * Revision 1.3  1993/08/21  01:50:33  robertj
  94.  * Made Clone() function optional, default will assert if called.
  95.  *
  96.  * Revision 1.2  1993/07/14  12:49:16  robertj
  97.  * Fixed RCS keywords.
  98.  *
  99.  */
  100. #define _PSTRINGLISTBOX
  101. #ifdef __GNUC__
  102. #pragma interface
  103. #endif
  104. #ifndef _PLISTBOX
  105. #include <pwlib/listbox.h>
  106. #endif
  107. /**A scrollable list box control for selection of a one or more of
  108.    Ref{PString} objects.
  109.  */
  110. class PStringListBox : public PListBox
  111. {
  112.   PCLASSINFO(PStringListBox, PListBox);
  113.   public:
  114.     /** Create a list box with the specified options. */
  115.     PStringListBox(
  116.       PInteractor * parent,     /// Interactor into which the control is placed.
  117.       StringSorting sorted = Sorted,
  118.      /**If set to #Sorted# then strings will be inserted in sorted
  119.          order. This requires that the Ref{PObject::Compare()} function
  120.          operate correctly for objects placed into the list box.
  121.        */
  122.       SelectType select = SingleSelect,
  123.      /**If set to #MultiSelect# then more than one item may be
  124.          selected at a time. Otherwise only zero or one item may be selected.
  125.        */
  126.       PDIMENSION columnWidth = 0
  127.      /**If this parameter is zero then only one column with a vertical scroll
  128.          bar is displayed. If non-zero, then multiple columns of this width,
  129.          in font based coordinates, will be used and a horizontal scroll bar
  130.          displayed. 
  131.        */
  132.     );
  133.     /** Create control from interactor layout with the specified control ID. */
  134.     PStringListBox(
  135.       PInteractorLayout * parent, /// Interactor into which the box is placed.
  136.       PRESOURCE_ID ctlID,         /// Identifier for the control in the layout.
  137.       const PNotifier & notify,   /// Function to call when changes state.
  138.       PINDEX * valuePtr           /// Variable to change to the list box state.
  139.     );
  140.     /** Destroy the list box and all the strings it contains. */
  141.     virtual ~PStringListBox();
  142.   /**@name New functions for class */
  143.    /**Add a new entry to the list box. If the sorted option was used this will
  144.        place the entry in the correct position. Otherwise it adds it to the
  145.        end of the list.
  146.        If the #update# parameter is FALSE then it is the users
  147.        responsibility to redraw the list box, ie call
  148.        Ref{PInteractor::Invalidate()} or Ref{PInteractor::Update()} some
  149.        time afterward. This is typically used if a large number of entries are
  150.        to be added to the list box in one go. The user would add the entries
  151.        and then call the Ref{PInteractor::Invalidate()} function on the list
  152.        box to force a redraw. This is much faster and tidier in appearance.
  153.        @return
  154.        the index that the entry was placed.
  155.      */
  156.     virtual PINDEX AddString(
  157.       const PString & str,  /// String to add to the list box.
  158.       BOOL update = TRUE    /// Flag to indicate screen should be updated.
  159.     );
  160.    /**Add a collection of new entries to the list box. Each element of the
  161.        collection is added in order using the Ref{AddEntry()} function. Thus,
  162.        for example, a sorted list string will be added in sorted order.
  163.        If the collection is not of string objects then they are translated into
  164.        a string by the use of the Ref{operator<<} function.
  165.      */
  166.     void AddStrings(
  167.       const PCollection & objects, /// New objects to add to list box.
  168.       BOOL update = TRUE          /// Flag to indicate screen should be updated.
  169.     );
  170.    /**Insert an entry at the specified location. If the sorted option was used
  171.        this will place the entry in the correct position, {bf not} that
  172.        specified by the #index# parameter.
  173.        If the #update# parameter is FALSE then it is the users
  174.        responsibility to redraw the list box, ie call
  175.        Ref{PInteractor::Invalidate()} or Ref{PInteractor::Update()} some
  176.        time afterward. This is typically used if a large number of entries are
  177.        to be added to the list box in one go. The user would add the entries
  178.        and then call the Ref{PInteractor::Invalidate()} function on the list
  179.        box to force a redraw. This is much faster and tidier in appearance.
  180.      */
  181.     virtual void InsertString(
  182.       const PString & str,  /// String to insert into list box.
  183.       PINDEX index,         /// Index position in list box to insert entry.
  184.       BOOL update = TRUE    /// Flag to indicate screen should be updated.
  185.     );
  186.    
  187.    /**Delete the string from the list box. If the delete objects option was
  188.        selected then all the objects added to the list box are deleted as well.
  189.        If the #update# parameter is FALSE then it is the users
  190.        responsibility to redraw the list box, ie call
  191.        Ref{PInteractor::Invalidate()} or Ref{PInteractor::Update()} some
  192.        time afterward. This is typically used if a large number of entries are
  193.        to be deleted to the list box in one go. The user would delete the
  194.        entries and then call the Ref{PInteractor::Invalidate()} function on
  195.        the list box to force a redraw. This is much faster and tidier in
  196.        appearance.
  197.      */
  198.     virtual void DeleteString(
  199.       PINDEX index,       /// Index position in list box to delete entry.
  200.       BOOL update = TRUE  /// Flag to indicate screen should be updated.
  201.     );
  202.    /**Find the string in the list box starting at the string after the
  203.        specified index. If the #index# is #P_MAX_INDEX#
  204.        then searches the whole list.
  205.        
  206.        The #exact# flag indicates that the whole string must match
  207.        otherwise a string in the list box that matches up to the length of
  208.        the argument string will be found.
  209.      */
  210.     virtual PINDEX FindString(
  211.       const PString & str,  /// String to search for.
  212.       PINDEX startIndex = P_MAX_INDEX,    /// Starting index for the search.
  213.       BOOL exact = FALSE    /// Flag for search for exact string or substring.
  214.     ) const;
  215.    /**Set the string at the index position. If the index is beyond the end
  216.        of the list then simply adds the entry to the end of the list.
  217.        If there was an existing entry at the index position then that entry
  218.        is removed.
  219.        If the sorted option was used this will place the entry in the correct
  220.        position, {bf not} that specified by the #index#
  221.        parameter. Note the removal of the previous value still takes place.
  222.        If the #update# parameter is FALSE then it is the users
  223.        responsibility to redraw the list box, ie call
  224.        Ref{PInteractor::Invalidate()} or Ref{PInteractor::Update()} some
  225.        time afterward. This is typically used if a large number of entries are
  226.        to be changed in the list box in one go. The user would change the
  227.        entries and then call the Ref{PInteractor::Invalidate()} function on
  228.        the list box to force a redraw. This is much faster and tidier in
  229.        appearance.
  230.      */
  231.     void SetString(
  232.       const PString & str,   /// New string to set for the entry.
  233.       PINDEX index,       /// Index position in list box to set entry.
  234.       BOOL update = TRUE  /// Flag to indicate screen should be updated.
  235.     );
  236.    /**Get the string at the index. If the index is beyond the end of the
  237.        list then returns the empty string.
  238.        @return
  239.        string placed in the list box at the index.
  240.      */
  241.     virtual PString GetString(
  242.       PINDEX index    /// Index into the list for the string to retrieve.
  243.     ) const;
  244.    /**Get the selected string in a non-multiselect list box. This is
  245.        equivalent to going #GetString(GetSelection())#.
  246.        @return
  247.        string that is selected.
  248.      */
  249.     PString GetSelectedString() const;
  250.    /**Set the tab stop positions for strings in each row of the list box.
  251.        The first form sets all tab stops to be the same distance. There are an
  252.        infinite number of tab stops of this size.
  253.        The other forms set explicit tab stops for the specified positions. The
  254.        distance between the last two entries, or between 0 and the first array
  255.        entry if there is only one entry, is used for all subsequent tab stops.
  256.      */
  257.     void SetTabStops(
  258.       PDIMENSION tab          /// Repeated tab stop locations
  259.     );
  260.     void SetTabStops(
  261.       const PORDINATE * tabs, /// Array of tab stop positions
  262.       PINDEX count            /// Count of tab stops in the array.
  263.     );
  264.     void SetTabStops(
  265.       const PIntArray & tabs  /// Array of tab stop positions
  266.     );
  267.   protected:
  268.     PIntArray tabStops;
  269. #ifdef DOC_PLUS_PLUS
  270. };
  271. #endif
  272. // Class declaration continued in platform specific header file ///////////////