ulis, 2003-11-13. A pure Tcl package:

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

       China     Beijing
       India     New Delhi
       Japan     Tokyo
       England   London
       France    Paris
       Germany   Berlin
       Russia    Moscow
   North America
       Canada    Ottawa
       Mexico    Mexico City
       USA       Washington
   South America
       Brazil    Brasilia

Demo 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}]