TixTList is the Tabular Listbox Widget. It displays a list of items in a tabular format. For example the TixTList widget in figure 3-1 displays files in a directory in rows and columns.
(Figure 3-1) Files Displayed in a TixTList Widget in a Tabular Format
(Figure 3-2) Employee Names Displayed in a TixTList Widget
TixTList does all what the standard Tk listbox widget can do, i.e, it displays a list of items. However, TixTList is superior to the listbox widget is many respects. First, TixTList allows you to display the items in a two dimensional format. This way, you can display more items at a time. Usually, the user can locate the desired items much faster in a two dimensional list than the one dimensional list displayed by the Tk listbox widget.
In addition, while the Tk listbox widget can only display text items, the TixTList widget can display a multitude of types of items: text, images and widgets. Also, while you can use only one font and one color in a listbox widget, you can use many different fonts and colors in a TixTList widget. In figure 3-1 , we use graphical images inside a tixTList widget to represent file objects. In figure 3-2 , we display the names of all employees of a hypothetical company. Notice the use of a bold font to highlight all employees whose first name is Joe.
Before we rush to discuss how to create the items inside a TixTList widget, let's first spend some time on a very important topic about the Tix library: the repationship between the display items and their host widgets.
We can better define the terms by taking a quick preview of the
TixHList widget, which will be covered in details in the next
chapter. Let's compare the items displayed on the two widgets in
figure 3-3 . If we take a close look at the item
that shows the usr
directory in the TixTList widget on the left
versus the TixHList widget on the right, we can see that this item
appears exactly the same on both widgets.
If fact, all the items in these two widgets are of the same type: they all display an image next to a textual name. The only difference between these two widgets is how these items are arranged. The TixTList widget arranges the items in rows and columns, while the TixHList widget arranges the items in a hierachical format.
With this observation in mind, we can see a separation of tasks berween the widgets and the items they display. We call the TixHList and TixTList widgets in figure 3-3 host widgets: their task is to arrange the items according to their particular rules. However, they don't really care what these items display; they just treat the items as rectangle boxes. In contrast, these items, which are called display items in Tix terminology, controls the visual information they display, such as the images, text strings, colors, fonts, etc. However, they don't really care where on the host widget they will appear.
(Figure 3-3) The Same Type of Items Displayed in a TixTList (left) and a TixHList(right)
It is easy to see the advantages of seperating the display items from their host widgets. First, the display items are easy to learn. Since they are the same across different types of widgets. Once you learn about a type of display items, you will know how to use them in all Tix widgets that support display items (currently these include TixHList, TixTList and the spreadsheet widget TixGrid, but the number is growing). In contrast, if you want to create a text item for the Tk widgets, you will find out that the listbox, text, canvas and entry widget each have a different method of creating and manipulating text items, and it is quite annoying to learn each of them individually.
Second, the hosts widgets that use display items are extensible.
Because of the separation of task, the host widgets are not involved
in the implementation details of the display items. Therefore, if
you add a new type of display items, such as a animation
type
that displays live video, the host widgets will gladly take them in
and display them. You don't need to modify the existing host widgets
at all. In contrast, if you want to display graphical images in the
existing Tk listbox widgets, you'd better set aside 100 hours to
rewrite it completely!
Third, display items are good for writers of host widgets. Because now they just need to implement the arrangement policy of the host widgets. They don't need to worry about drawing at all because it is all handled by the display items. This is a significant saving in code because a widget that does not use display items has to spend 30% of its C code to do the drawing.
The appearance of a display item is controlled by a set of
attributes. For example, the text
attribute controls the text
string displayed on the item and the font
attribute specifies
what font should be used.
Usually, each of the attributes falls into one of two categroies: `` individual'' or `` collective''. For example, each of the items inside a TixTList widget may display a different text string; therefore we call the text string an individual attribute. However, in most cases, the items share the same color, font and spacing and we call these collective attributes.
One question concerns where we keep the collective attribute for the
display items. Certainly, we can keep a font
attribute for
each item, but this is not really an efficient solution. In fact, if
all the items have the same font, we would be keeping a duplicated
copy of the same font for each of the items we create. Since a host
widget may have many thousands of items, keeping thousands of
dupilcated copys of the same font, or any other collective
attributes, would be very wasteful.
(Figure 3-4) Relationship Between Display Items and Display Styles
To advoid the unnecessary duplication of resources, Tix stores the
collective attributes in special objects called display
styles. The relationship between display items and their styles is
depicted in figure 3-4 . Each item holds its own
copy of the individual attributes, such as text
. However, the
collective attributes are stored in the style objects. Each item has
a special style
attribute that tells it which style it should
use. In figure 3-4 , since items a and b
are assigned the same style, therefore, they share the same font and
color. Item c is assigned a different style, thus, it uses a
different font than a and b.
Now it's time to put our knowledge about host widgets, display items
and display styles into practice. The following example code creates
two items in a TixTList widget using the insert
method:
{0.0cm}
{0.2cm}tixTList .t pack .t.t insert end -itemtype text -text "First Item" -underline 0 .t insert end -itemtype text -text "Second Item" -underline 0
set picture [image create bitmap -file picture.xbm] .t insert end -itemtype image -image $picture
As we can see, the insert
method of TixTList is very
similar to the insert
method of the standard Tk listbox
widget: it inserts a new item into the TixTList widget. The first
argument it takes is the location of the new item. For example
0
indicates the first location in the list, 1
indicates the
second location, and so on. Also the special keyword end
indicates the end of the list.
Then, we can use the -itemtype
switch to specify the type of
display item we want to create. There are currently four types of
items to choose from: text
, image
, imagetext
and
window
. In the above example, we create two items of the type
text
and one item of the type image
. The subsequent
arguments to the insert
method set the configuration options
of the individual attributes of the new item. The available
options for these items are listed in figures ???
through ???.
Note that in the above example, if we want to control the foreground color of the text items, we cannot issue commands such as:
because.t insert end -itemtype text -text "First Item" -foreground black
-foreground
is not an individual attribute of the text
item. Instead, it is a collective attribute and must be accessed
using a display style object. To do that we can use the command
tixItemStyle
to create display styles, as shown in the following
example:
set style1 [tixDisplayStyle text -font 8x13] set style2 [tixDisplayStyle text -font 8x13bold]tixTList .t; pack .t
.t insert end -itemtype text -text "First Item" -underline 0
-style $style1 .t insert end -itemtype text -text "Second Item" -underline 0
-style $style2 .t insert end -itemtype text -text "Third Item" -underline 0
-style $style1
The first argument of tixDisplayStyle
specify the type
of style we want to create. Each type of display item needs its own
type of display styles. Therefore, for example, we cannot create a
style of type text
and assign it to an item of type
image
. The subsequent arguments to tixDisplayStyle
set the
configuration options of the collective attributes defined by this
style. A complete list of the configuration options of each type of
the display style is in figures ??? through
???.
The tixDisplayStyle
command returns the names of the newly
created styles to us and we use the variables style1
and
style2
to store these names. We can then assign the styles to the
display items by using the names of the styles. As shown in figure
3-5 , by assing these two styles to the
-style
option of the display items, we assigned a medium-weight
font to the first and third item and a bold font to the second item.
Three text
items in a TixTList
The text
items with fonts switched(Figure 3-5) Two Display Styles With Different Fonts
The name of the style returned by tixDisplayStyle
is also the
name of a command which we can use to control the style. For
example, we can use the following commands to switch the fonts in
the two styles we created in the above example:
After the execution of the above command, the font in the second item in the TixTList widget becomes medium-weight and the font in the first and third items becomes bold, as shown in figure 3-5 .$style1 configure -font 8x13bold $style2 configure -font 8x13
You can configure the individual attributes of the items using the
entryconfigure
method. There is also the entrycget method for
querying the attributes of the items. To delete
the items, you
can use the delete method. In the following example, we use these
two methods to change the first and third items to display the text
strings One
and Two
and change the third item to use the
style $style2
. Then we delete the second item using the
delete
command.
.t entryconfigure 0 -text One .t entryconfigure 2 -text Two .t delete 1
There are three options that controls the layout of the items in the
TixTList widget. The -orientation
option can be set to either
vertical or horizontal. When -orientation
is set to
vertical
, the items are laid out vertically from top down and
wrapped to the next column when the bottom is reached (see figure
3-6 ). The opposite layout policy is chosen if
-orientation
is set to horizontal
(see figure
3-6 ).
When the -orientation
option is set to vertical
,
normally the number of columns displayed depends on the number of
items in the TixTList widget: the more items there are, the more
columns will there be. However, we can use the -columns
option
to control the number of columns: the items will be wrapped in a way
so that the number of columns produced will be exactly as dicated by
the -columns
option.
One use of the -columns
option is to specify the same layout
policy as that of the standard Tk listbox widget. We can do this by
setting -orientation
to vertical and -columns
to
1
. This way we can get a replacement listbox widget that can
display multiple fonts and colors and graphics!
The counterpart of the -columns
option is the -rows
option, which is used for the same purpose when the
-orientation
option is set to horizontal
.
Vertical Orientation
Horizontal Orientation (Figure 3-6) The
-orientation
option of the TixSelect Widget
You can handle the events in a TList widget using the
-browsecmd
and -command
options. The meanings of these two
options are silimar to their meanings in other Tix widgets such as
the ComboBox. Usually, the command specified by -browsecmd
is
called when the user clicks or drags the mouse over the items or
presses the arrow keys. The command specified by -command
is
called when the user double-clicks or presses the Return key. These
commands are called with one extra argument --- the index of the
currently ``active'' item, which is usually the item under the mouse
cursor.
The -selectmode
option controls how many items the user can
select at one time. In the single
and browse
mode, the
user can select only one item at a time. In the multiple
and
extended
mode, the user can select multiple items; the
extended
mode allows disjoint selections while the multiple
mode does not.
Normally, the user selects the items using the mouse or the
keyboard. You can find out which items the user has selected with
the info selection
method, which returns a list of the
currently selected items. You can also set the selection using the
selection set
method. For example, the command .tlist
selection set 3
selects the item whose index is 3
. The
command .tlist selection set 2 10
selects all the items at
index 2
through 10
. The method selection clear
empties the selection.