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

IP电话/视频会议

开发平台:

Visual C++

  1. /*
  2.  * listview.h
  3.  *
  4.  * List View control classes.
  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: listview.h,v $
  30.  * Revision 1.5  1999/03/10 03:49:52  robertj
  31.  * More documentation adjustments.
  32.  *
  33.  * Revision 1.4  1999/03/09 08:01:48  robertj
  34.  * Changed comments for doc++ support (more to come).
  35.  *
  36.  * Revision 1.3  1998/09/23 06:24:07  robertj
  37.  * Added open source copyright license.
  38.  *
  39.  * Revision 1.2  1998/09/22 15:07:20  robertj
  40.  * Added OnDraw functions.
  41.  *
  42.  * Revision 1.1  1998/09/21 13:58:48  robertj
  43.  * Initial revision
  44.  *
  45.  */
  46. #define _PLISTVIEW
  47. #ifdef __GNUC__
  48. #pragma interface
  49. #endif
  50. class PListViewControl;
  51. /**This class is the ancestor for all elements added to the PListViewControl
  52.    class.
  53.  */
  54. class PListViewItem : public PObject
  55. {
  56.   PCLASSINFO(PListViewItem, PObject);
  57.   public:
  58.    /**Get the string representation of the list view element column.
  59.        @return
  60.        String for column.
  61.      */
  62.     virtual PString GetColumn(
  63.       PINDEX column
  64.     ) const = 0;
  65. };
  66. /**A scrollable list view control for selection of a one or more of items. The
  67.    items are PListViewItem descendents.
  68.  */
  69. class PListViewControl : public PControl
  70. {
  71.   PCLASSINFO(PListViewControl, PControl);
  72.   public:
  73.     /** Options on creation of the list view control. */
  74.     enum Styles {
  75.       /// Show headings at the top of each column.
  76.       ShowHeadings    = 0x01,
  77.       /// Allow the heading to be a "button" which sorts by that column when clicked.
  78.       CanHeadingSort  = 0x02,
  79.       /// Only allow one item to be selected at a time.
  80.       SingleSelection = 0x04
  81.     };
  82.     /** Create a list view control. */
  83.     PListViewControl(
  84.       PInteractor * parent,     /// Interactor into which the control is placed.
  85.       unsigned styles = ShowHeadings, /// Bits from the Styles enum.
  86.       PINDEX columnCount = 1,         /// Number of columns in view.
  87.       const char * const * headings = NULL /// Strings for column headings
  88.     );
  89.   /**@name PNotifier codes */
  90.    /**Notification codes passed to the PNotifier function when the specified
  91.        notification events occur.
  92.      */
  93.     enum {
  94.       /// A new entry was selected or deselected.
  95.       NewSelection = NotifyChange, 
  96.       /// An entry was double clicked.
  97.       DoubleClick,                 
  98.       /// A right button click was made on an item
  99.       RightClick                   
  100.     };
  101.     /**@name Overrides from class PInteractor */
  102.    /**Set the default foreground or text colour of the interactor.
  103.      */
  104.     virtual void SetForegroundColour(
  105.       const PColour & newColour  /// New background colour for interactor.
  106.     );
  107.    /**Set the background colour of the interactor.
  108.      */
  109.     virtual void SetBackgroundColour(
  110.       const PColour & newColour  /// New background colour for interactor.
  111.     );
  112.     /**@name Overrides from class PControl */
  113.    /**This function transfers the value of the control to or from the variable
  114.        pointed to by the value pointer member variable.
  115.      */
  116.     virtual void TransferValue(
  117.       int option 
  118.      /**Transfer value option. When this is -1 when the function transfers
  119.          the value from the value pointer into the control. This is called in
  120.          Ref{PDialog::OnInit()} function. When option is zero then the
  121.          function transfers the value from the control to the value pointer
  122.          variable. This is called just before the callback function every time
  123.          the list view value changes.
  124.        */
  125.     );
  126.     /**@name New functions for class */
  127.     /** Set flag to delete entry objects using delete operator. */
  128.     void AllowDeleteObjects(
  129.       BOOL yes = TRUE   /// New flag for deleting entries in list view.
  130.     );
  131.    /**Reset flag to delete entry objects using delete operator. This is
  132.        equivalent to #AllowDeleteObjects(FALSE)#.
  133.      */
  134.     void DisallowDeleteObjects() { AllowDeleteObjects(FALSE); }
  135.    /**Add a new entry to the end of the list view.
  136.        If the #update# parameter is FALSE then it is the users
  137.        responsibility to redraw the list view, ie call
  138.        Ref{PInteractor::Invalidate()} or Ref{PInteractor::Update()} some
  139.        time afterward. This is typically used if a large number of entries are
  140.        to be added to the list view in one go. The user would add the entries
  141.        and then call the Ref{PInteractor::Invalidate()} function on the list
  142.        view to force a redraw. This is much faster and tidier in appearance.
  143.        @return
  144.        the index that the entry was placed.
  145.      */
  146.     PINDEX AddEntry(
  147.       PListViewItem * obj, /// New object to add to list view.
  148.       BOOL update = TRUE   /// Flag to indicate screen should be updated.
  149.     );
  150.    /**Add a collection of new entries to the list view. Each element of the
  151.        collection is added in order using the Ref{AddEntry()} function.
  152.      */
  153.     void AddEntries(
  154.       const PCollection & objects, /// New objects to add to list view.
  155.       BOOL update = TRUE          /// Flag to indicate screen should be updated.
  156.     );
  157.    /**Insert an entry at the specified location, ie before that entry.
  158.        If the #update# parameter is FALSE then it is the users
  159.        responsibility to redraw the list view, ie call
  160.        Ref{PInteractor::Invalidate()} or Ref{PInteractor::Update()} some
  161.        time afterward. This is typically used if a large number of entries are
  162.        to be added to the list view in one go. The user would add the entries
  163.        and then call the Ref{PInteractor::Invalidate()} function on the list
  164.        view to force a redraw. This is much faster and tidier in appearance.
  165.      */
  166.     void InsertEntry(
  167.       PListViewItem * obj, /// New object to add to list view.
  168.       PINDEX index,        /// Index position in list view to insert entry.
  169.       BOOL update = TRUE   /// Flag to indicate screen should be updated.
  170.     );
  171.    /**Delete the entry from the list view. If the delete objects option was
  172.        selected then the object added to the list view is deleted as well.
  173.        If the #update# parameter is FALSE then it is the users
  174.        responsibility to redraw the list view, 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 deleted to the list view in one go. The user would delete the
  178.        entries and then call the Ref{PInteractor::Invalidate()} function on
  179.        the list view to force a redraw. This is much faster and tidier in
  180.        appearance.
  181.      */
  182.     void DeleteEntry(
  183.       PINDEX index,       /// Index position in list view to delete entry.
  184.       BOOL update = TRUE  /// Flag to indicate screen should be updated.
  185.     );
  186.    /**Delete all of the entries in the list view. If the delete objects option
  187.        was selected then all the objects added to the list view are deleted as
  188.        well.
  189.        If the #update# parameter is FALSE then it is the users
  190.        responsibility to redraw the list view, ie call
  191.        Ref{PInteractor::Invalidate()} or Ref{PInteractor::Update()} some
  192.        time afterward. This is typically used if entries are to be added to the
  193.        list view immediately after deleting then. This is much faster and tidier
  194.        in appearance.
  195.      */
  196.     void DeleteAllEntries(
  197.       BOOL update = TRUE  /// Flag to indicate screen should be updated.
  198.     );
  199.    /**Find the entry in the list view starting at the entry after the specified
  200.        index. If the #index# parameter is #P_MAX_INDEX#
  201.        then searches the whole list from the beginning.
  202.        This uses the objects Ref{PObject::Compare()} function to test for
  203.        equality on the objects in the list.
  204.      */
  205.     PINDEX FindEntry(
  206.       const PListViewItem & obj,        /// Object value to search for.
  207.       PINDEX startIndex = P_MAX_INDEX   /// Starting index for the search.
  208.     ) const;
  209.    /**Update the entry on in the list view. This is used when the
  210.        PListViewItem descendent is changed and the internal cache of the
  211.        column strings needs to be updated.
  212.      */
  213.     void UpdateEntry(
  214.       PINDEX index,         /// Index position in list view to set entry.
  215.       BOOL update = TRUE    /// Flag to indicate screen should be updated.
  216.     );
  217.    /**Set the entry at the index position. If the index is beyond the end
  218.        of the list then simply adds the entry to the end of the list.
  219.        
  220.        If there was an existing entry at the index position then that entry
  221.        is removed and if the delet objects option selected it is also deleted
  222.        using the delete operator.
  223.        If the #update# parameter is FALSE then it is the users
  224.        responsibility to redraw the list view, ie call
  225.        Ref{PInteractor::Invalidate()} or Ref{PInteractor::Update()} some
  226.        time afterward. This is typically used if a large number of entries are
  227.        to be changed in the list view in one go. The user would change the
  228.        entries and then call the Ref{PInteractor::Invalidate()} function on
  229.        the list view to force a redraw. This is much faster and tidier in
  230.        appearance.
  231.      */
  232.     void SetEntry(
  233.       PListViewItem * obj,  /// New object to add to list view.
  234.       PINDEX index,         /// Index position in list view to set entry.
  235.       BOOL update = TRUE    /// Flag to indicate screen should be updated.
  236.     );
  237.    /**Get the entry at the index. If the index is beyond the end of the
  238.        list then returns NULL.
  239.        @return
  240.        pointer to the object placed in the list view at the index.
  241.      */
  242.     PListViewItem * GetEntry(
  243.       PINDEX index    /// Index into the list for the entry to retrieve.
  244.     ) const;
  245.    /**Get the count of the number of items in the list of entries in the
  246.        list view.
  247.        @return
  248.        number of entries.
  249.      */
  250.     PINDEX GetCount() const;
  251.    /**Get the index of the list view entry that is currently visible at the
  252.        top of the list.
  253.        @return
  254.        index position of the list views top entry.
  255.      */
  256.     PINDEX GetTopIndex() const;
  257.    /**Add a new column to the list view. The current entries of the list view
  258.        are scanned and the column populated from the entries. If the
  259.        #before# parameter is P_MAX_INDEX then the column is added
  260.        to the right of all current columns.
  261.        If the #update# parameter is FALSE then it is the users
  262.        responsibility to redraw the list view, ie call
  263.        Ref{PInteractor::Invalidate()} or Ref{PInteractor::Update()} some
  264.        time afterward.
  265.      */
  266.     void InsertColumn(
  267.       const PString & heading,      /// Heading text for the column
  268.       PINDEX before = P_MAX_INDEX,  /// Index of column to insert before
  269.       BOOL update = TRUE      /// Flag to indicate screen should be updated.
  270.     );
  271.    /**Delete an existing column. Note you cannot delete column zero. This
  272.        function will assert if an attempt to do so is made. Deleting columns
  273.        beyond the last column is silently ignored.
  274.        If the #update# parameter is FALSE then it is the users
  275.        responsibility to redraw the list view, ie call
  276.        Ref{PInteractor::Invalidate()} or Ref{PInteractor::Update()} some
  277.        time afterward.
  278.      */
  279.     void DeleteColumn(
  280.       PINDEX column,      /// Index of column to delete
  281.       BOOL update = TRUE  /// Flag to indicate screen should be updated.
  282.     );
  283.    /**Get the number of columns that are in the list view.
  284.        @return
  285.        number of columns.
  286.      */
  287.     PINDEX GetColumnCount();
  288.    /**Set the heading string for the column.
  289.      */
  290.     void SetColumnHeading(
  291.       PINDEX column,        /// Index of column to change
  292.       const PString & str   /// New heading for column
  293.     );
  294.    /**Get the width of the column in the list view. If the column is not
  295.        present then zero is returned.
  296.        @return
  297.        dimension of the column.
  298.      */
  299.     PDIMENSION GetColumnWidth(
  300.       PINDEX column           /// Which column to get width
  301.     );
  302.    /**Set the new width of column in the list view. The first form will scan
  303.        all entries in the column and assure the column is as wide as the
  304.        widest string in the column. The second form set the width to the
  305.        specified value.
  306.     
  307.        If the #newWidth# parameter is zero, then the column is set
  308.        to the minimium width required to contain the longest string in the
  309.        column.
  310.        If the #update# parameter is FALSE then it is the users
  311.        responsibility to redraw the list view, ie call
  312.        Ref{PInteractor::Invalidate()} or Ref{PInteractor::Update()} some
  313.        time afterward.
  314.      */
  315.     void SetColumnWidth(
  316.       PINDEX column,           /// Which column to adjust
  317.       PDIMENSION newWidth = 0, /// New width for the columns in the list view.
  318.       BOOL update = TRUE       /// Flag to indicate screen should be updated.
  319.     );
  320.    /**Get the width of the string as used in the list view. The result may be
  321.        used in the SetColumnWidth() function.
  322.        @return
  323.        dimension of the string.
  324.      */
  325.     PDIMENSION GetStringWidth(
  326.       const PString & str   /// String to get the width of
  327.     );
  328.    /**Set the current selection to the entry specified by the index.
  329.     
  330.        If the multiple selection option is used then this will deselect all
  331.        other items and only have the specified entry selected.
  332.        If the #index# parameter is beyond the end of the list view
  333.        then all entries are deselected.
  334.      */
  335.     void SetSelection(
  336.       PINDEX index  /// Index of entry to become the single selection.
  337.     );
  338.    /**Get the current selection index. If the list view has the multi-select
  339.        option this only indicates the item that has the focus.
  340.        @return
  341.        currently selected item or P_MAX_INDEX if nothing selected.
  342.      */
  343.     PINDEX GetSelection() const;
  344.    /**Set the selection state of the list view item. If the list view is not a
  345.        multi-select then deselects all others before selecting or deselecting
  346.        the item specified.
  347.        If the #update# parameter is FALSE then it is the users
  348.        responsibility to redraw the list view, ie call
  349.        Ref{PInteractor::Invalidate()} or Ref{PInteractor::Update()} some
  350.        time afterward. This is typically used if a large number of entries are
  351.        to be changed in the list view in one go. The user would change the
  352.        entries and then call the Ref{PInteractor::Invalidate()} function on
  353.        the list view to force a redraw. This is much faster and tidier in
  354.        appearance.
  355.      */
  356.     void Select(
  357.       PINDEX index,       /// Index position in list view to select.
  358.       BOOL update = TRUE, /// Flag to indicate screen should be updated.
  359.       BOOL sel = TRUE     /// State in which to set the entries selection.
  360.     );
  361.    /**Reset the selection state of the list view item. This is equivalent to
  362.        #Select(index, FALSE, update)#.
  363.        If the list view was not multi select then all entries a deselected.
  364.      */
  365.     void Deselect(
  366.       PINDEX index,       /// Index position in list view to select.
  367.       BOOL update = TRUE  /// Flag to indicate screen should be updated.
  368.       ) { Select(index, update, FALSE); }
  369.       /** Get the selection state of the list view item. */
  370.     BOOL IsSelected(
  371.       PINDEX index    /// Index of entry to check for being selected.
  372.     ) const;
  373.    /**Get the number of list view items that are selected. This would only be
  374.        one or zero is the single selection option is used.
  375.        @return
  376.        total items selected in list view.
  377.      */
  378.     PINDEX GetSelCount() const;
  379.    /**Get the current value pointer associated with the control. The variable
  380.        pointed to by this is autamatically updated with the current value of
  381.        the list view.
  382.        @return
  383.        value pointer associated with the control.
  384.      */
  385.     PINDEX * GetValuePointer() const { return (PINDEX *)PControl::GetValuePointer(); }
  386.    /**Set the current value pointer associated with the control. The variable
  387.        pointed to by this is autamatically updated with the current value of
  388.        the list view.
  389.      */
  390.     void SetValuePointer(
  391.       PINDEX * ptr  /// New value pointer to associate with the control.
  392.       ) { PControl::SetValuePointer(ptr); }
  393.    /**This callback is executed whenever the user clicks on a column heading.
  394.        The default behaviour is to sort the entries by that column, provided
  395.        that the CanHeadingSort style was used in the creation of the list view.
  396.      */
  397.     virtual void OnColumnClick(
  398.       PINDEX column       /// Column that was clicked.
  399.     );
  400.    /**This callback is executed whenever the user clicks the right mouse
  401.        button on an item. This allows a conext menu, for example, to be
  402.        displayed.
  403.        The default behaviour does nothing.
  404.      */
  405.     virtual void OnRightClick(
  406.       PINDEX index         /// Index of item that was clicked.
  407.     );
  408.    /**This callback is executed whenever the user starts to drag an item in
  409.        list view.
  410.        The default behaviour does nothing.
  411.      */
  412.     virtual void OnBeginDrag(
  413.       BOOL rightButton,     /// The drag was begun using the right button.
  414.       PINDEX index         /// Index of item that was dragged.
  415.     );
  416.    /**Thus callback is executed before draw operation on the contents of the
  417.        list view. If the #completed# flag is FALSE then you have
  418.        the opportunity to alter the canvas before the control is cleared. When
  419.        this flag is TRUE, the drawing has completed and you have the chance to
  420.        draw things over the top of already drawn items.
  421.        Note that the return value is only examined on the first call, when the
  422.        #completed# flag is FALSE. Also no furter calls to
  423.        OnDrawControl() or OnDrawEntry() are made if FALSE is returned.
  424.        The default behaviour simply returns FALSE.
  425.        @return
  426.        TRUE if custom drawing of each entry is required.
  427.      */
  428.     virtual BOOL OnDrawControl(
  429.       PCanvas & canvas,   /// Canvas in which to draw the object entry.
  430.       BOOL completed      /// Indication that the drawing has completed.
  431.     );
  432.    /**The system calls this whenever an object in the list needs to be
  433.        redrawn. The redraw is optional depending on the return value. The
  434.        function may simply alter the drawing characteristics of the canvas,
  435.        e.g. font, and return FALSE.
  436.        If the #column# field is P_MAX_INDEX, then the function is
  437.        being called before the draw of any of the columns.
  438.        The default behaviour simply returns FALSE.
  439.        @return
  440.        TRUE if drawn locally, FALSE is control is to continue drawing entry.
  441.      */
  442.     virtual BOOL OnDrawEntry(
  443.       PINDEX index,       /// Index of entry to draw in the list view.
  444.       PINDEX column,      /// Index of column to draw in the list view.
  445.       PListViewItem & obj,// Object to draw for this entry in the list view.
  446.       PCanvas & canvas,   /// Canvas in which to draw the object entry.
  447.       unsigned flags      /// Flags indicating is selected or has focus, etc.
  448.     );
  449.   protected:
  450.     /** Values from the Styles enum for the creation of the list view. */
  451.     unsigned defaultStyles;
  452.     /** Number of columns in list view. */
  453.     PINDEX numColumns;
  454.     /** Flag to indicate objects placed in list should be deleted when removed. */
  455.     BOOL deleteObjects;
  456.   private:
  457.     // New functions for class
  458.     void Construct();
  459.       // Common constructor code
  460. #ifdef DOC_PLUS_PLUS
  461. };
  462. #endif
  463. // Class declaration continued in platform specific header file ///////////////