MLB: Multi-column listbox

OBSOLETE -- this needs to be reviewed

This is intended to behave much like a regular listbox except it contains
multiple, separate columns of data.  The columns scroll together so that each
row N in a column is associated with the same rows N in all the other columns.

The width of each column can be adjusted separately and saved as part of a
standard widget preference.

When a row is selected in a column, that column becomes the "master" column.
All other columns become "slaves" to the master.  The corresponding rows in
the slave columns will be highlighted to match the selected column(s) in the
master.


External Procedures:
------------------------------------------
mlb::mlb {w args}		Creates a new multi-column listbox
    All arguments not among those enumerated below are passed along to the
    underlying frame widget.

Arguments:
    w:	The name of the new widget to create
    
Shortcuts:	(none)

Switches:
    -highlight	The color to use when marking slave columns to match the
        selection in the master column.

    -frame	Specify a list of arguments/switches to pass to the underlying
        frame (like borderwidth, relief, etc.).
        
    -summary	A boolean value determines whether to show summary fields at the
        bottom of each column.  If a boolean value is given, the user can show
        or hide the summaries from the context menu.  If the value is "never"
        the user does not have the option to show the summary fields.
        
    -sort	If "none", no sorting buttons will be shown in the column 
        titles.  If "local" sorting buttons will be shown and the widget will
        attempt to sort data according to field sort criteria when the user
        presses the sort buttons.  If some other value is given, no sorting 
        will be done and the value is expected to be a tcl script to execute
        when the user presses a sort button.  This should allow an external
        sort routine to be used.
        
    -autosize	Attempt to automatically size each column width for the data
        it contains.
        
    -initialize	If specified, this contains a list of data to enter into the
        list when the widget is created.
    
    -display	Specify a list of field tags to be displayed initially when
        the widget is created.  This overrides the -hide switches that may
        be specified in the field descriptions.
        
    -resort	If "clear", the widget will not resort when data is inserted
        into the list.  Otherwise, if true, the widget will resort according
        to current column sorting button states each time new data is 
        inserted into the list.  If false, no resorting will be done.
    
    -field	Specify a list of arguments needed to define a column (or
        field).  These are specified below under the "add" procedure.
		
        -mb		This specifies a menubutton to add to the mbar.  The 
	menubutton will be built according to the data structure which you
	specify as the switch value.  That data structure will be interpreted
	by the "mb" widget command described below.

------------------------------------------
mlb::add {w args}		add a new column (field)
    This call is not really available externally.  But is included here to 
    document the valid arguments to the "-field" switch above.
    
Shortcuts:	tag, title, width

Switches:
    -tag	A unique name to identify this column
    
    -title	The title to show at the top of the column.  This will default
        to a capitalized version of the tag.
    
    -width	The default width in pixels of the column.  This should not
        normally be needed since the widths will be saved as preferences.  The
        user settings will become somewhat permanent once the widget is used
        for the first time.
    
    -invisible	Set to true to make this field non-displayable.  It will still
        retain data internally.

    -hide	Set to true to make this field initially not displayed.  The
        user can select the field for display manually if wanted.
    
    -maxwidth	Maximum width in pixels this column can be.  This can be helpful
        with fields that may contain very large data that you don't want to 
        have auto-adjust to an unreasonable width.
        
    -sort	The type of data sorting to do on this column (dictionary, 
        ascii, integer, etc.)  See the tcl lsort command for sorting types.


Widget Command {widget_name command args}:
------------------------------------------
If the command argument is other than what is enumerated below, the command
is passed down to the underlying frame widget.

Command:
    w		Return the name of the widget.

    need to document these
    
    cget, configure	These are just like standard TK behavior.  Any
	queries not relevant at the dew level are passed down to the
	underlying entry widget.
