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

IP电话/视频会议

开发平台:

Visual C++

  1. /*
  2.  * listbox.h
  3.  *
  4.  * 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: listbox.h,v $
  30.  * Revision 1.26  1999/11/16 06:51:41  robertj
  31.  * Created PCustomListBox to allow motif native code PStringListBox implementation
  32.  *
  33.  * Revision 1.25  1999/11/16 05:19:36  craigs
  34.  * Created PCustomListBox to allow native code PStringListBox implementation
  35.  *
  36.  * Revision 1.24  1999/03/10 03:49:52  robertj
  37.  * More documentation adjustments.
  38.  *
  39.  * Revision 1.23  1999/03/09 08:01:48  robertj
  40.  * Changed comments for doc++ support (more to come).
  41.  *
  42.  * Revision 1.22  1999/02/16 08:08:45  robertj
  43.  * MSVC 6.0 compatibility changes.
  44.  *
  45.  * Revision 1.21  1998/09/23 06:24:05  robertj
  46.  * Added open source copyright license.
  47.  *
  48.  * Revision 1.20  1995/10/14 14:57:43  robertj
  49.  * Added addition of colection as strings to box.
  50.  *
  51.  * Revision 1.19  1995/06/17 11:12:42  robertj
  52.  * Documentation update.
  53.  *
  54.  * Revision 1.18  1995/03/14 12:41:40  robertj
  55.  * Updated documentation to use HTML codes.
  56.  *
  57.  * Revision 1.17  1995/02/19  04:19:13  robertj
  58.  * Added dynamically linked command processing.
  59.  *
  60.  * Revision 1.16  1995/01/14  06:22:48  robertj
  61.  * Documentation
  62.  *
  63.  * Revision 1.15  1995/01/02  12:15:15  robertj
  64.  * Documentation
  65.  *
  66.  * Revision 1.14  1994/10/30  11:46:47  robertj
  67.  * Changed mechanism for doing notification callback functions.
  68.  *
  69.  * Revision 1.13  1994/08/23  11:32:52  robertj
  70.  * Oops
  71.  *
  72.  * Revision 1.12  1994/08/22  00:46:48  robertj
  73.  * Added pragma fro GNU C++ compiler.
  74.  *
  75.  * Revision 1.11  1994/06/25  11:55:15  robertj
  76.  * Unix version synchronisation.
  77.  *
  78.  * Revision 1.10  1994/04/03  08:34:18  robertj
  79.  * Added help and focus functionality.
  80.  *
  81.  * Revision 1.9  1994/03/07  07:38:19  robertj
  82.  * Major enhancementsacross the board.
  83.  *
  84.  * Revision 1.8  1994/01/15  02:50:29  robertj
  85.  * Moved control contructors to common and added a platform dependent Construct() function.
  86.  *
  87.  * Revision 1.7  1994/01/03  04:42:23  robertj
  88.  * Mass changes to common container classes and interactors etc etc etc.
  89.  *
  90.  * Revision 1.6  1993/12/16  02:02:52  robertj
  91.  * As can delete objects in listbox, objects should not be const.
  92.  *
  93.  * Revision 1.5  1993/12/15  21:10:10  robertj
  94.  * Added optional deletion of objects in the list box.
  95.  *
  96.  * Revision 1.4  1993/09/27  16:35:25  robertj
  97.  * Removed special constructor for dialog resource loading.
  98.  *
  99.  * Revision 1.3  1993/07/15  04:23:39  robertj
  100.  * Added optional update screen parameter to list box modification functions.
  101.  *
  102.  * Revision 1.2  1993/07/14  12:49:16  robertj
  103.  * Fixed RCS keywords.
  104.  *
  105.  */
  106. #define _PLISTBOX
  107. #ifdef __GNUC__
  108. #pragma interface
  109. #endif
  110. /**A scrollable list box control for selection of a one or more of items. The
  111.    application writer should not normally descend from this class directly but
  112.    descend from either the PStringListBox or PCustomListBox class.
  113.  */
  114. class PListBox : public PControl
  115. {
  116.   PCLASSINFO(PListBox, PControl);
  117.   public:
  118.    /**Option used when constructing a list box for whether the list box
  119.        entries are sorted or unsorted.
  120.      */
  121.     enum StringSorting {
  122.       /// Entries are added to list in any order.
  123.       NotSorted,  
  124.       /// Entries are added to list in correct sorted position.
  125.       Sorted      
  126.     };
  127.    /**Option used when constructing a list box for whether the list box
  128.        may have single or multiple entries selected.
  129.      */
  130.     enum SelectType {
  131.       /// Only zero or one entry may be selected at a time.
  132.       SingleSelect,   
  133.       /// Any number of entries may be selected.
  134.       MultiSelect     
  135.     };
  136.     /** Create a list box with the specified options. */
  137.     PListBox(
  138.       PInteractor * parent,     /// Interactor into which the control is placed.
  139.       StringSorting sorted = Sorted,
  140.      /**If set to #Sorted# then strings will be inserted in sorted
  141.          order. This requires that the Ref{PObject::Compare()} function
  142.          operate correctly for objects placed into the list box.
  143.        */
  144.       SelectType select = SingleSelect,
  145.      /**If set to #MultiSelect# then more than one item may be
  146.          selected at a time. Otherwise only zero or one item may be selected.
  147.        */
  148.       PDIMENSION columnWidth = 0,
  149.      /**If this parameter is zero then only one column with a vertical scroll
  150.          bar is displayed. If non-zero, then multiple columns of this width,
  151.          in font based coordinates, will be used and a horizontal scroll bar
  152.          displayed. 
  153.        */
  154.       BOOL deleteObj = TRUE
  155.      /**If this parameter is TRUE then when the list box is destroyed all
  156.          entries objects are deleted as well using the delete operator.
  157.          Similarly if Ref{DeleteEntry()} or Ref{DeleteAllEntries()} is
  158.          called the entry or entries are deleted, again using the delete
  159.          operator).
  160.        */
  161.     );
  162.     PListBox(
  163.       PInteractor * parent,     /// Interactor into which the control is placed.
  164.       const PNotifier & notify,  /// Function to call when changes state.
  165.       StringSorting sorted = Sorted,
  166.      /**If set to #Sorted# then strings will be inserted in sorted
  167.          order. This requires that the Ref{PObject::Compare()} function
  168.          operate correctly for objects placed into the list box.
  169.        */
  170.       SelectType select = SingleSelect,
  171.      /**If set to #MultiSelect# then more than one item may be
  172.          selected at a time. Otherwise only zero or one item may be selected.
  173.        */
  174.       PDIMENSION columnWidth = 0,
  175.      /**If this parameter is zero then only one column with a vertical scroll
  176.          bar is displayed. If non-zero, then multiple columns of this width,
  177.          in font based coordinates, will be used and a horizontal scroll bar
  178.          displayed. 
  179.        */
  180.       BOOL deleteObj = TRUE
  181.      /**If this parameter is TRUE then when the list box is destroyed all
  182.          entries objects are deleted as well using the delete operator.
  183.          Similarly if Ref{DeleteEntry()} or Ref{DeleteAllEntries()} is
  184.          called the entry or entries are deleted, again using the delete
  185.          operator).
  186.        */
  187.     );
  188.     /** Create control from interactor layout with the specified control ID. */
  189.     PListBox(
  190.       PInteractorLayout * parent, /// Interactor into which the box is placed.
  191.       PRESOURCE_ID ctlID,         /// Identifier for the control in the layout.
  192.       const PNotifier & notify,   /// Function to call when changes state.
  193.       PINDEX * valuePtr           /// Variable to change to the list box state.
  194.     );
  195.     /** Destroy the list box and all its contents. */
  196.     virtual ~PListBox();
  197.   /**@name PNotifier codes */
  198.    /**Notification codes passed to the PNotifier function when the specified
  199.        notification events occur.
  200.      */
  201.     enum {
  202.       /// A new entry was selected or deselected.
  203.       NewSelection = NotifyChange, 
  204.       /// An entry was double clicked.
  205.       DoubleClick                  
  206.     };
  207.     /**@name Overrides from class PControl */
  208.    /**This function transfers the value of the control to or from the variable
  209.        pointed to by the value pointer member variable.
  210.      */
  211.     virtual void TransferValue(
  212.       int option 
  213.      /**Transfer value option. When this is -1 when the function transfers
  214.          the value from the value pointer into the control. This is called in
  215.          Ref{PDialog::OnInit()} function. When option is zero then the
  216.          function transfers the value from the control to the value pointer
  217.          variable. This is called just before the callback function every time
  218.          the list box value changes.
  219.        */
  220.     );
  221.     /**@name New functions for class */
  222.     /** Set flag to delete entry objects using delete operator. */
  223.     virtual void AllowDeleteObjects(
  224.       BOOL yes = TRUE   /// New flag for deleting entries in list box.
  225.     );
  226.    /**Reset flag to delete entry objects using delete operator. This is
  227.        equivalent to #AllowDeleteObjects(FALSE)#.
  228.      */
  229.     virtual void DisallowDeleteObjects();
  230.    /**Delete the entry from the list box. If the delete objects option was
  231.        selected then all the objects added to the list box are deleted as well.
  232.        If the #update# parameter is FALSE then it is the users
  233.        responsibility to redraw the list box, ie call
  234.        Ref{PInteractor::Invalidate()} or Ref{PInteractor::Update()} some
  235.        time afterward. This is typically used if a large number of entries are
  236.        to be deleted to the list box in one go. The user would delete the
  237.        entries and then call the Ref{PInteractor::Invalidate()} function on
  238.        the list box to force a redraw. This is much faster and tidier in
  239.        appearance.
  240.      */
  241.     virtual void DeleteEntry(
  242.       PINDEX index,       /// Index position in list box to delete entry.
  243.       BOOL update = TRUE  /// Flag to indicate screen should be updated.
  244.     );
  245.    /**Delete all of the entries in the list box. If the delete objects option
  246.        was selected then all the objects added to the list box are deleted as
  247.        well.
  248.        If the #update# parameter is FALSE then it is the users
  249.        responsibility to redraw the list box, ie call
  250.        Ref{PInteractor::Invalidate()} or Ref{PInteractor::Update()} some
  251.        time afterward. This is typically used if entries are to be added to the
  252.        list box immediately after deleting then. This is much faster and tidier
  253.        in appearance.
  254.      */
  255.     virtual void DeleteAllEntries(
  256.       BOOL update = TRUE  /// Flag to indicate screen should be updated.
  257.     );
  258.    /**Get the count of the number of items in the list of entries in the
  259.        list box.
  260.        @return
  261.        number of entries.
  262.      */
  263.     virtual PINDEX GetCount() const;
  264.    /**Set the index of the list box entry that is currently visible at the
  265.        top of the list. The list is scrolled accordingly.
  266.        If the #update# parameter is FALSE then it is the users
  267.        responsibility to redraw the list box, ie call
  268.        Ref{PInteractor::Invalidate()} or Ref{PInteractor::Update()} some
  269.        time afterward.
  270.      */
  271.     virtual void SetTopIndex(
  272.       PINDEX index,       /// Index position in list box to make the top item.
  273.       BOOL update = TRUE  /// Flag to indicate screen should be updated.
  274.     );
  275.    /**Get the index of the list box entry that is currently visible at the
  276.        top of the list.
  277.        @return
  278.        index position of the list boxes top entry.
  279.      */
  280.     virtual PINDEX GetTopIndex() const;
  281.    /**Set the new width of columns in the list box.
  282.     
  283.        Note that the list box must have been created with a non-zero width in
  284.        the first place for this to work. It only allows the width to be
  285.        readjusted.
  286.        For the same reason the function will assert if the
  287.        #newWidth# parameter is zero.
  288.        If the #update# parameter is FALSE then it is the users
  289.        responsibility to redraw the list box, ie call
  290.        Ref{PInteractor::Invalidate()} or Ref{PInteractor::Update()} some
  291.        time afterward.
  292.      */
  293.     virtual void SetColumnWidth(
  294.       PDIMENSION newWidth,    /// New width for the columns in the list box.
  295.       BOOL update = TRUE      /// Flag to indicate screen should be updated.
  296.     );
  297.    /**Set the current selection to the entry specified by the index.
  298.     
  299.        If the multiple selection option is used then this will deselect all
  300.        other items and only have the specified entry selected.
  301.        If the #index# parameter is beyond the end of the list box
  302.        then all entries are deselected.
  303.      */
  304.     virtual void SetSelection(
  305.       PINDEX index  /// Index of entry to become the single selection.
  306.     );
  307.    /**Get the current selection index. If the list box has the multi-select
  308.        option this only indicates the item that has the focus.
  309.        @return
  310.        currently selected item or P_MAX_INDEX if nothing selected.
  311.      */
  312.     virtual PINDEX GetSelection() const;
  313.    /**Set the selection state of the list box item. If the list box is not a
  314.        multi-select then deselects all others before selecting or deselecting
  315.        the item specified.
  316.        If the #update# parameter is FALSE then it is the users
  317.        responsibility to redraw the list box, ie call
  318.        Ref{PInteractor::Invalidate()} or Ref{PInteractor::Update()} some
  319.        time afterward. This is typically used if a large number of entries are
  320.        to be changed in the list box in one go. The user would change the
  321.        entries and then call the Ref{PInteractor::Invalidate()} function on
  322.        the list box to force a redraw. This is much faster and tidier in
  323.        appearance.
  324.      */
  325.     virtual void Select(
  326.       PINDEX index,       /// Index position in list box to select.
  327.       BOOL update = TRUE, /// Flag to indicate screen should be updated.
  328.       BOOL sel = TRUE     /// State in which to set the entries selection.
  329.     );
  330.    /**Reset the selection state of the list box item. This is equivalent to
  331.        #Select(index, FALSE, update)#.
  332.        If the list box was not multi select then all entries a deselected.
  333.      */
  334.     virtual void Deselect(
  335.       PINDEX index,       /// Index position in list box to select.
  336.       BOOL update = TRUE  /// Flag to indicate screen should be updated.
  337.     );
  338.       /** Get the selection state of the list box item. */
  339.     virtual BOOL IsSelected(
  340.       PINDEX index    /// Index of entry to check for being selected.
  341.     ) const;
  342.    /**Get the number of list box items that are selected. This would only be
  343.        one or zero unless multiple selection option is used.
  344.        @return
  345.        total items selected in list box.
  346.      */
  347.     virtual PINDEX GetSelCount() const;
  348.    /**Get the current value pointer associated with the control. The variable
  349.        pointed to by this is autamatically updated with the current value of
  350.        the list box.
  351.        @return
  352.        value pointer associated with the control.
  353.      */
  354.     virtual PINDEX * GetValuePointer() const;
  355.    /**Set the current value pointer associated with the control. The variable
  356.        pointed to by this is autamatically updated with the current value of
  357.        the list box.
  358.      */
  359.     virtual void SetValuePointer(
  360.       PINDEX * ptr  /// New value pointer to associate with the control.
  361.     );
  362.   protected:
  363.     // Member variables
  364.     /** Flag indicating list is sorted. */
  365.     BOOL sort;
  366.     /** Flag indicating the list may have multiple selections. */
  367.     BOOL multi;
  368.     /** Width of multi-column list box. */
  369.     PDIMENSION width;
  370.     /** Flag to indicate objects placed in list should be deleted when removed. */
  371.     BOOL deleteObjects;
  372.   private:
  373.     // New functions for class
  374.     void Construct();
  375.       // Common constructor code
  376. #ifdef DOC_PLUS_PLUS
  377. };
  378. #endif
  379. // Class declaration continued in platform specific header file ///////////////