Tk::MListbox - Multicolumn Listbox. |
Tk::MListbox - Multicolumn Listbox.
use Tk::MListbox; $ml = $parent->MListbox (<options>);
Tk::MListbox is a multicolumn Listbox widget with builtin capabilites for sorting, resizing and repositioning of the columns.
Sorting is done by clicking on one of the column headings in the widget. The first click will sort the data with the selected column as key, a new click will reverse the sort order.
The columns may be resized by dragging a separator line which is drawn between each column.
A column's position in the widget might be changed by dragging it's heading left or right.
Tk::MListbox is used in a way similar to the standard Listbox, but in stead of scalar values MListbox operates on lists of data. In addition to methods for accessing the data in the MListbox, the widget offer methods for manipulation of the individual columns.
=head1 AUTHOR
Hans Jorgen Helgesen, hans_helgesen@hotmail.com (from March 2000: hans.helgesen@novit.no)
-background -foreground -relief -takefocus -borderwidth -heigh -selectbackground -cursor -highlightbackground -selectborderwidth -xscrollcommand -exportselection -highlightcolor -selectforeground -yscrollcommand -font -highlightthickness -setgrid
See the Tk::options manpage for details of the standard options.
Tk::MListbox requires Tk::Pane. (and basic Perl/Tk of course....)
This option is useful if the application wants to store the widget layout for later retrieval. The widget layout can be obtained by the callback by calling the method columnPackInfo().
Default: 1
Default: 1
Note that you can also specify -resizeable on a column by column basis. See the COLUMNS section below.
Default is ``browse''. See the Tk::Listbox manpage.
Default: black
Note that you can also specify -separatorcolor on a column by column basis. See the COLUMNS section below.
Default: 1
Note that you can also specify -separatorwidth on a column by column basis. See the COLUMNS section below.
Default: 1
Note that you can also specify -sortable on a column by column basis. See COLUMNS below.
The MListbox widget is a collection of MLColumn widgets.
Each MLColumn contains a Listbox, a heading and the separator bar.
The columns are created and maintained through the -columns
option or the column methods of the widget. The columns are indexed
from 0 and up. Initially, column 0 is the leftmost column of the
widget. The column indices are not changed when the columns
are moved or hidden. The only ways to change the column indices
are to call columnInsert(), columnDelete()
or configure(-column).
Each column has its own set of options which might be passed to MListbox::configure(-columns), MListbox::insert(), MListbox::columnConfigure() or MLColumn::configure().
The following code snippets are all equal:
1. $ml=$mw->MListbox(-columns=>[[-text=>'Heading1', -sortable=>0], [-text=>'Heading2']]);
2. $ml=$mw->MListbox; $ml->columnInsert(0,-text=>'Heading1', -sortable=>0); $ml->columnInsert(0,-text=>'Heading2');
3. $ml=$mw->MListbox; $c=$ml->columnInsert(0,-text=>'Heading1'); $ml->columnInsert(0,-text=>'Heading2'); $c->configure(-sortable=>0);
4. $ml=$mw->MListbox; $ml->columnInsert(0,-text=>'Heading1'); $ml->columnInsert(0,-text=>'Heading2'); $ml->columnConfigure(0,-sortable=>0);
(See the columnConfigure()
method below for details on column options).
All column methods expects one or two column indices as arguments.
The column indices might be an integer (between 0 and the number
of columns minus one), 'end' for the last column, or a reference
to the MLColumn widget (obtained by calling MListbox->columnGet()
or by storing the return value from MListbox->columnInsert()).
(Methods for accessing and manipulating individual columns in the MListbox widget)
The following column options are supported:
Specifies a callback to use when sorting the MListbox with this column as key. The callback will be called with two scalar arguments, each a value from this particular column. The callback should return an integer less than, equal to, or greater than 0, depending on how the tow arguments are ordered. If for example the column should be sorted by numerical value:
-comparecommand => sub { $_[0] <=> $_[1]}
The default is to sort the columns alphabetically.
Specifies the text to be used in the heading button of the column.
A value of 1 indicates that it is okay for the user to resize this column by dragging the separator. 0 disables this function.
Default: 1
Specifies the color of the separator line, default is black.
Specifies the width of the separator line in pixels. Default is 1.
A value of 1 indicates that it is okay for the user to sort the data by clicking this column's heading. 0 disables this function.
Default: 1
All previous column indices greater than last (or first if last is omitted) are decremented by the number of columns deleted.
Hiding a column is equal to calling $ml->columnGet(index)->packForget. The column is not deleted, all data are still available, and the column indices remain the same.
See also the columnShow()
method below.
If column index exists, the new column will be placed to the left of this column. All previous column indices equal to or greater than index will be incremented by one.
Returns the newly created MLColumn widget.
(See the columnConfigure()
method above for details on column options).
This method is most useful if used together with the
columnPackInfo()
method.
columnPack()
above). Only indices of columns that
are currently shown (not hidden) will be returned. The first element
in the returned array represents the leftmost column.
This method may be used in conjunction with columnPack()
to save
and restore the column configuration.
columnHide()
method above).
The column to show is specified by index.
By default, the column is pack'ed at the rigthmost end of the MListbox widget. This might be overridden by specifying one of the following options:
Place the column after (to the right of) the column specified by index.
Place the column before (to the left of) the column specified by index.
(Methods for accessing and manipulating rows of data)
Many of the methods for MListbox take one or more indices as arguments. See the Tk::Listbox manpage for a description of row indices.
The returned elements are all array references. The referenced arrays contains one element for each column of the MListbox.
This method is provided for convenience, since retrieving a single
row with the get()
method might produce some ugly code.
The following two code snippets are equal:
1. @row=$ml->getRow(0);
2. @row=@{($ml->get(0))[0]};
=item $ml->sort(I<descending>, I<columnindex>...)
Sorts the content of the MListbox. If descending is a true value, the sort order will be descending. The default is ascending sort.
If columnindex is specified, the sort will be done with the specified column as key. You can specify as many columnindex arguments as you wish. Sorting is done on the first column, then on the second, etc...
The default is to sort the data on all columns of the listbox, with column 0 as the first sort key, column 1 as the second, etc.
Most other Tk::Listbox methods works for the MListbox widget. This includes the methods activate, cget, curselection, index, nearest, see, selectionXXX, size, xview, yview.
Apart from ``pane'', the MListbox widget has no subwidgets,
except for the variable number of MLColumns, which obviously
cannot be advertised. The MLColumn widgets might be obtained
by calling the columnGet()
or columnInsert()
methods.
The MLColumn widget (which represents a single column in the MListbox) advertises the following subwidgets:
Example: If you want to change the background color of the heading of column 4:
$ml->columnGet(4)->Subwidget("heading") ->configure(-background=>'blue');
Calling $ml->bind(...)
probably makes little sense, since the call does not
specify whether the binding should apply to the listbox, the header button
or the separator line between each column.
In stead of the ordinary bind, the following methods should be used:
The binding is stored in the widget, and if you create a new column
by calling $ml->columnInsert(), all bindings created by $ml->bindSubwidgets()
are automatically copied to the new column.
The callback is called with the MListbox widget as first argument, and the index of the column where the event occured as the second argument.
NOTE that $ml->bindSubwidgets()
does not support all of Tk's callback formats.
The following are supported:
\&subname sub { code } [ \&subname, arguments...] [ sub { code }, arguments...]
If sequence is undefined, then the return value is a list whose elements are all the sequences for which there exist bindings for subwidget.
If sequence is specified without callback, then the callback currently bound to sequence is returned, or an empty string is returned if there is no binding for sequence.
If sequence is specified, and callback is an empty string, then the current binding for sequence is destroyed, leaving sequence unbound. An empty string is returned.
An empty string is returned in all other cases.
Tk::MListbox - Multicolumn Listbox. |