Name

Table — Multicolumn table widget

Synopsis

Table ( term  header ,
  list  items );

Parameters

term header

the headers of the columns

Options

immediate

make `notify trigger immediately when the selected item changes

keepSorting

keep the insertion order - don't let the user sort manually by clicking

Optional Arguments

list items

the items contained in the selection box

Properties

integer CurrentItem

the ID of the currently selected item

list(item) Items

a list of all table items

item Item(id)

read: a single item ( string or term )

integer|string Item(id,column)

write: replacement for one specific cell ( see example )

Description

A Table widget is a generalization of the SelectionBox. Information is displayed in a number of columns. Each column has a header. The number of columns and their titles are described by the first argument, which is a term with the symbol header. For each column you add a string specifying its title. For example `header( "Name", "Price" ) creates the two columns "Name" and "Price".

The second argument is an optional list of items ( rows ) that are inserted in the table. Each item has the form `item( `id( id ), first column, second column, ... ). For each column one argument has to be specified, which must be of type void, string or integer. Strings are being left justified, integer right and a nil denote an empty cell, just as the empty string.

Usage

 	`Table( `header( "Game", "Highscore" ), [ `item( `id(1), "xkobo", "1708" ) ] )

Examples

          {
    UI::OpenDialog(
	       `VBox(
		     `Label("Today's menu"),
		     `Table(
			    `header("Name", "Price"),
			    [
			     `item(`id(1), "Chili",		6),
			     `item(`id(2), "Salami Baguette",	nil),
			     `item(`id(3), "Spaghetti",		8),
			     `item(`id(4), "Steak Sandwich",	12)
			    ]
			    ),
		     `PushButton("&OK")
		     )
	       );
    UI::UserInput();
    UI::CloseDialog();
}


          
          {
    UI::OpenDialog(
	       `VBox(
		     `Label("Today's menu"),
		     `HSpacing(40),	// make the table and thus the dialog wider
		     `HBox(
			   `VSpacing(10),	// make the table higher
			   `Table(
				  `id(`table), `opt(`keepSorting),
				  `header("Name", `Right("Price"), `Center("Rating")),
				  [
				   `item(`id(0), "Steak Sandwich",	12,  "+++"),
				   `item(`id(1), "Salami Baguette",	nil, "-"  ),
				   `item(`id(2), "Chili",		6,   "--" ),
				   `item(`id(3), "Spaghetti",		8,   "+"  )
				  ]
				  )
			   ),
		     `HBox(
			   `HCenter(`PushButton(`id(`next), "&Next")),
			   `PushButton(`id(`cancel), "&Close")
			   )
		     )
	       );

    UI::ChangeWidget(`id(`table), `CurrentItem, 2);
    
    while (UI::UserInput() != `cancel)
    {
	UI::ChangeWidget(`id(`table), `CurrentItem, 
		     ((integer) UI::QueryWidget(`id(`table), `CurrentItem) + 1) % 4);
    }
    
    UI::CloseDialog();
}


          
          {
    list itemlist1 =
	[
	 `item(`id(3), "Spaghetti",	  8),
	 `item(`id(4), "Steak Sandwich",  12),
	 `item(`id(1), "Chili",           6),
	 `item(`id(2), "Salami Baguette", nil)
	];

    list itemlist2 =
	[
	 `item(`id(0), "Mercedes",	60000),
	 `item(`id(1), "AUDI",		50000),
	 `item(`id(2), "VW",		40000),
	 `item(`id(3), "BMW",		60000),
	 `item(`id(3), "Porsche",	80000)
	];

    list itemslists = [ itemlist1, itemlist2 ];

    integer listnum = 0;

    UI::OpenDialog(
	       `VBox(
		     `Label("Prices"),
		     `HSpacing(40),	// make the table and thus the dialog wide enough
		     `HBox(
			   `VSpacing(10),
			   `Table(`id(`table), `header("Name", "price"), itemlist1)
			   ),
		     `HBox(
			   `HCenter(`PushButton(`id(`next), "Change &Table Contents")),
			   `PushButton(`id(`cancel), "&Close")
			   )
		     )
	       );

    while (UI::UserInput() != `cancel)
    {
	listnum = 1 - listnum;
	UI::ChangeWidget(`id(`table), `Items, select(itemslists, listnum, nil));
    }
    
    UI::CloseDialog();
}


          
          {
    UI::OpenDialog(
	       `VBox(
		     `Label("Today's menu"),
		     `HSpacing(40),	// make the table and thus the dialog wider
		     `HBox(
			   `VSpacing(10),	// make the table higher
			   `Table(`id(`table),
				  `header("Name", "Price"),
				  [
				   `item(`id(1), "Chili",	    6),
				   `item(`id(2), "Salami Baguette", nil),
				   `item(`id(3), "Spaghetti",	    8),
				   `item(`id(4), "Steak Sandwich",  12)
				  ]
				  )
			   ),
		     `HBox(
			   `HCenter(`PushButton("&Lookup")),
			   `PushButton(`id(`cancel), "&Close" )
			   )
		     )
	       );

    while (UI::UserInput() != `cancel)
    {
	any id = UI::QueryWidget(`id(`table), `CurrentItem);
	if (is(id, integer)) {
	    string text = sformat("Line: %1", UI::QueryWidget(`id(`table), `Item(id)));
	    UI::OpenDialog(
		       `VBox(
			     `Label(text),
			     `PushButton("&OK")
			     )
		       );
	    UI::UserInput();
	    UI::CloseDialog();
	}
    }

    UI::CloseDialog();
}


          
          {
    UI::OpenDialog(
	       `VBox(
		     `HSpacing(50),	// make the dialog wider
		     `Label("Double-click any item to increase the number."),
		     `HBox(
			   `VSpacing(10),	// make the table higher
			   `Table(`id(`table),
				  `opt(`notify),
				  `header("Name", "Amount"),
				  [
				   `item(`id(1), "Chili",		0),
				   `item(`id(2), "Salami Baguette",	0),
				   `item(`id(3), "Spaghetti",		0),
				   `item(`id(4), "Steak Sandwich",	0)
				  ]
				  )
			   ),
		     `PushButton(`id(`cancel), "&Close")
		     )
	       );
    
    while ( UI::UserInput() != `cancel)
    {
	integer current_item  = (integer) UI::QueryWidget(`id(`table), `CurrentItem);
	integer current_value = tointeger(select((list) UI::QueryWidget(`id(`table), `Item(current_item)), 2, 1));
	UI::ChangeWidget(`id(`table), `Item(current_item, 1), current_value+1);
    }

    UI::CloseDialog();
}