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

IP电话/视频会议

开发平台:

Visual C++

  1. /*
  2.  * clistbox.h
  3.  *
  4.  * Custom 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: clistbox.h,v $
  30.  * Revision 1.2  1999/11/16 06:51:41  robertj
  31.  * Created PCustomListBox to allow motif native code PStringListBox implementation
  32.  *
  33.  * Revision 1.1  1999/11/16 05:19:36  craigs
  34.  * Created PCustomListBox to allow native code PStringListBox implementation
  35.  *
  36.  *
  37.  */
  38. #define _PCUSTOMLISTBOX
  39. #ifdef __GNUC__
  40. #pragma interface
  41. #endif
  42. #ifndef _PLISTBOX
  43. #include <pwlib/listbox.h>
  44. #endif
  45. class PCustomListBox : public PListBox
  46. {
  47.   PCLASSINFO(PCustomListBox, PListBox);
  48.   public:
  49.     /** Create a custom list box with the specified options. */
  50.     PCustomListBox(
  51.       PInteractor * parent,     /// Interactor into which the control is placed.
  52.       StringSorting sorted = Sorted,
  53.      /**If set to #Sorted# then strings will be inserted in sorted
  54.          order. This requires that the Ref{PObject::Compare()} function
  55.          operate correctly for objects placed into the list box.
  56.        */
  57.       SelectType select = SingleSelect,
  58.      /**If set to #MultiSelect# then more than one item may be
  59.          selected at a time. Otherwise only zero or one item may be selected.
  60.        */
  61.       PDIMENSION columnWidth = 0,
  62.      /**If this parameter is zero then only one column with a vertical scroll
  63.          bar is displayed. If non-zero, then multiple columns of this width,
  64.          in font based coordinates, will be used and a horizontal scroll bar
  65.          displayed. 
  66.        */
  67.       BOOL deleteObj = TRUE
  68.      /**If this parameter is TRUE then when the list box is destroyed all
  69.          entries objects are deleted as well using the delete operator.
  70.          Similarly if Ref{DeleteEntry()} or Ref{DeleteAllEntries()} is
  71.          called the entry or entries are deleted, again using the delete
  72.          operator).
  73.        */
  74.     );
  75.     PCustomListBox(
  76.       PInteractor * parent,     /// Interactor into which the control is placed.
  77.       const PNotifier & notify,  /// Function to call when changes state.
  78.       StringSorting sorted = Sorted,
  79.      /**If set to #Sorted# then strings will be inserted in sorted
  80.          order. This requires that the Ref{PObject::Compare()} function
  81.          operate correctly for objects placed into the list box.
  82.        */
  83.       SelectType select = SingleSelect,
  84.      /**If set to #MultiSelect# then more than one item may be
  85.          selected at a time. Otherwise only zero or one item may be selected.
  86.        */
  87.       PDIMENSION columnWidth = 0,
  88.      /**If this parameter is zero then only one column with a vertical scroll
  89.          bar is displayed. If non-zero, then multiple columns of this width,
  90.          in font based coordinates, will be used and a horizontal scroll bar
  91.          displayed. 
  92.        */
  93.       BOOL deleteObj = TRUE
  94.      /**If this parameter is TRUE then when the list box is destroyed all
  95.          entries objects are deleted as well using the delete operator.
  96.          Similarly if Ref{DeleteEntry()} or Ref{DeleteAllEntries()} is
  97.          called the entry or entries are deleted, again using the delete
  98.          operator).
  99.        */
  100.     );
  101.     /** Create control from interactor layout with the specified control ID. */
  102.     PCustomListBox(
  103.       PInteractorLayout * parent, /// Interactor into which the box is placed.
  104.       PRESOURCE_ID ctlID,         /// Identifier for the control in the layout.
  105.       const PNotifier & notify,   /// Function to call when changes state.
  106.       PINDEX * valuePtr           /// Variable to change to the list box state.
  107.     );
  108.     /**@name New functions for class */
  109.    /**Add a new entry to the list box. If the sorted option was used this will
  110.        place the entry in the correct position. Otherwise it adds it to the
  111.        end of the list.
  112.        If the #update# parameter is FALSE then it is the users
  113.        responsibility to redraw the list box, ie call
  114.        Ref{PInteractor::Invalidate()} or Ref{PInteractor::Update()} some
  115.        time afterward. This is typically used if a large number of entries are
  116.        to be added to the list box in one go. The user would add the entries
  117.        and then call the Ref{PInteractor::Invalidate()} function on the list
  118.        box to force a redraw. This is much faster and tidier in appearance.
  119.        @return
  120.        the index that the entry was placed.
  121.      */
  122.     virtual PINDEX AddEntry(
  123.       PObject * obj,      /// New object to add to list box.
  124.       BOOL update = TRUE  /// Flag to indicate screen should be updated.
  125.     ) = 0;
  126.    /**Add a collection of new entries to the list box. Each element of the
  127.        collection is added in order using the Ref{AddEntry()} function. Thus,
  128.        for example, a sorted list string will be added in sorted order.
  129.      */
  130.     void AddEntries(
  131.       const PCollection & objects, /// New objects to add to list box.
  132.       BOOL update = TRUE          /// Flag to indicate screen should be updated.
  133.     );
  134.    /**Insert an entry at the specified location. If the sorted option was used
  135.        this will place the entry in the correct position, {bf not} that
  136.        specified by the #index# parameter.
  137.        If the #update# parameter is FALSE then it is the users
  138.        responsibility to redraw the list box, ie call
  139.        Ref{PInteractor::Invalidate()} or Ref{PInteractor::Update()} some
  140.        time afterward. This is typically used if a large number of entries are
  141.        to be added to the list box in one go. The user would add the entries
  142.        and then call the Ref{PInteractor::Invalidate()} function on the list
  143.        box to force a redraw. This is much faster and tidier in appearance.
  144.      */
  145.     virtual void InsertEntry(
  146.       PObject * obj,      /// New object to add to list box.
  147.       PINDEX index,       /// Index position in list box to insert entry.
  148.       BOOL update = TRUE  /// Flag to indicate screen should be updated.
  149.     ) = 0;
  150.    /**Find the entry in the list box starting at the entry after the specified
  151.        index. If the #index# parameter is #P_MAX_INDEX#
  152.        then searches the whole list from the beginning.
  153.        This uses the objects Ref{PObject::Compare()} function to test for
  154.        equality on the objects in the list.
  155.      */
  156.     virtual PINDEX FindEntry(
  157.       const PObject & obj,                /// Object value to search for.
  158.       PINDEX startIndex = P_MAX_INDEX     /// Starting index for the search.
  159.     ) const = 0;
  160.    /**Set the entry at the index position. If the index is beyond the end
  161.        of the list then simply adds the entry to the end of the list.
  162.        
  163.        If there was an existing entry at the index position then that entry
  164.        is removed and if the delet objects option selected it is also deleted
  165.        using the delete operator.
  166.        If the sorted option was used this will place the entry in the correct
  167.        position, {bf not} that specified by the #index#
  168.        parameter. Note the removal of the previous value still takes place.
  169.        If the #update# parameter is FALSE then it is the users
  170.        responsibility to redraw the list box, ie call
  171.        Ref{PInteractor::Invalidate()} or Ref{PInteractor::Update()} some
  172.        time afterward. This is typically used if a large number of entries are
  173.        to be changed in the list box in one go. The user would change the
  174.        entries and then call the Ref{PInteractor::Invalidate()} function on
  175.        the list box to force a redraw. This is much faster and tidier in
  176.        appearance.
  177.      */
  178.     virtual void SetEntry(
  179.       PObject * obj,      /// New object to add to list box.
  180.       PINDEX index,       /// Index position in list box to set entry.
  181.       BOOL update = TRUE  /// Flag to indicate screen should be updated.
  182.     ) = 0;
  183.    /**Get the entry at the index. If the index is beyond the end of the
  184.        list then returns NULL.
  185.        @return
  186.        pointer to the object placed in the list box at the index.
  187.      */
  188.     virtual const PObject * GetEntry(
  189.       PINDEX index    /// Index into the list for the entry to retrieve.
  190.     ) const = 0;
  191.     /**@name System callback functions. */
  192.    /**The system calls this whenever an object in the list needs to be
  193.        redrawn.
  194.      */
  195.     virtual void OnDrawEntry(
  196.       PINDEX index,       /// Index of entry to draw in the list box.
  197.       PObject & obj,      /// Object to draw for this entry in the list box.
  198.       PCanvas & canvas,   /// Canvas in which to draw the object entry.
  199.       const PRect & rect, /// Rectangle of canvas in which the item is drawn.
  200.       BOOL hasFocus,      /// Flag indicating the item has the focus.
  201.       BOOL isSelected     /// Flag indicating the item is selected.
  202.     ) = 0;
  203.    /**The system calls this whenever it needs to get the size of an object in
  204.        the list. The default function returns the full width of the list box
  205.        and the font size as the height.
  206.      */
  207.     virtual PDim OnMeasureEntry(
  208.       PINDEX index,       /// Index of entry to measure in the list box.
  209.       PObject & obj,      /// Object to measure for this entry in the list box.
  210.       PCanvas & canvas    /// Canvas in which to measure the object entry.
  211.     );
  212. #ifdef DOC_PLUS_PLUS
  213. };
  214. #endif
  215. // Class declaration continued in platform specific header file ///////////////