a(Rich)List is a powerful and easy to use Tcl package which manages enriched items lists. As widgets, these items have options taking values and, as widgets, can execute actions.Following the need a Richlist can be viewed as a poor man class of objects, as a database table (each item being a row and each option name being a column) or as a structure description (each item being an occurence of the structure and each option being an element of the structure).The items can be grouped inside sublists. Each sublist could be viewed as a view on the table. The first sublist is created with the Richlist and the other sublists can be built from a simple list of items, from an index on a sublist or from set operations on the sublists (union, intersection, difference). An index on a sublist is as a table index and allows to access the items from the values of an option (search by pattern). So it is easy to create sublists that split the items set of the Richlist following the values taken by an option. Powerful operations allow to retrieve, modify and format the values of all or part ot the items of a sublist.The access to a sublist or an item is thru a reference. A sublist reference is a Tcl command allowing the access to the sublist actions. An item reference is a Tcl command allowing the access to the item options and actions.Callbacks associated to the Richlist allow to define actions on events. The init and dispose actions are called on init and destruction of the items. The unknown action is called when items try to call unknown actions.Demo result
Asia
China Beijing
India New Delhi
Japan Tokyo
Europe
England London
France Paris
Germany Berlin
Russia Moscow
North America
Canada Ottawa
Mexico Mexico City
USA Washington
South America
Brazil BrasiliaDemo source
# create the rich list
richlist create countries -country "" -continent "" -capital ""
# fill the rich list
set list \
{
{-country Brazil -continent "South America" -capital Brasilia}
{-country Canada -continent "North America" -capital Ottawa}
{-country China -continent Asia -capital Beijing}
{-country England -continent Europe -capital London}
{-country France -continent Europe -capital Paris}
{-country Germany -continent Europe -capital Berlin}
{-country India -continent Asia -capital "New Delhi"}
{-country Japan -continent Asia -capital Tokyo}
{-country Mexico -continent "North America" -capital "Mexico City"}
{-country Russia -continent Asia -capital Moscow}
{-country USA -continent "North America" -capital Washington}
}
foreach item $list { countries add [eval countries create $item] }
# update an item
[countries ref (-country|Russia)] config -continent Europe
# display the countries by continent
# create an index
countries index create -continent
# go thru all continents
foreach continent [countries values -continent] \
{
# get continent subset
set sublist($continent) [countries selection -continent $continent]
# display continent name
puts $continent
# sort continent sublist by countries & capitals names
$sublist($continent) sort {-country -capital} -dictionary
# display continent countries & capitals names
puts [$($continent) foreach item { $item cget -country -capital } \
\n {\t\t%-10s%s}]
}
