Name

MultiSelectionBox — Selection box that allows selecton of multiple items

Synopsis

MultiSelectionBox ( string  label ,
  list  items );

Parameters

string label

Options

shrinkable

make the widget very small

Optional Arguments

list items

the items initially contained in the selection box

Properties

string Label

The label above the list describing what it is all about

string CurrentItem

The item that currently has the keyboard focus

id_list SelectedItems

The items that are currently selected

id_list Items

The items that are displayed

Description

The MultiSelectionBox displays a ( scrollable ) list of items from which any number (even nothing!) can be selected. Use the MultiSelectionBox's SelectedItems property to find out which.

Each item can be specified either as a simple string or as `item( ... ) which includes an ( optional ) ID and an (optional) 'selected' flag that specifies the initial selected state ('not selected', i.e. 'false', is default).

Usage

 	`MultiSelectionBox( `id( `topping ), "select pizza toppings:", [ "Salami", `item( `id( `cheese ), "Cheese", true ) ] )

Examples

          {
    // Simple MultiSelectionBox example:
    //
    // All items are simple strings, none has an ID, no item preselected.
    
    UI::OpenDialog(
	       `VBox( 
		     `MultiSelectionBox( "Select pizza toppings:",
					 [
					  "Cheese",
					  "Tomatoes",
					  "Mushrooms",
					  "Onions",
					  "Salami",
					  "Ham"
					 ] ),
		     `PushButton("&OK")
		     )
	       );
    UI::UserInput();
    UI::CloseDialog();
}

        
          {
    // More realistic MultiSelectionBox example:
    //
    // Items have IDs, some are preselected.
    // Notice 'false' is default anyway for the selection state,
    // so you may or may not explicitly specify that.
    
    UI::OpenDialog(
	       `VBox( 
		     `MultiSelectionBox( "Select pizza toppings:",
					 [
					  `item( `id(`cheese   	), "Cheese"	, true  ),
					  `item( `id(`tomatoes 	), "Tomatoes"	, true  ),
					  `item( `id(`mush     	), "Mushrooms"	, false ),
					  `item( `id(`onions	), "Onions" 	),
					  `item( `id(`sausage	), "Salami" 	),
					  `item( `id(`pork	), "Ham"	)
					 ] ),
		     `PushButton( `opt(`default), "&OK")
		     )
	       );
    UI::UserInput();
    UI::CloseDialog();
}

          
          {
    // Advanced MultiSelectionBox example:
    //
    // Retrieve the list of selected items and output it.
    
    UI::OpenDialog(
	       `VBox( 
		     `MultiSelectionBox( `id(`toppings), "Select pizza toppings:",
					 [
					  `item( `id(`cheese   	), "Cheese"	, true  ),
					  `item( `id(`tomatoes 	), "Tomatoes"	, true  ),
					  `item( `id(`mush     	), "Mushrooms"	, false ),
					  `item( `id(`onions	), "Onions" 	),
					  `item( `id(`sausage	), "Salami" 	),
					  `item( `id(`pork	), "Ham"	)
					 ] ),
		     `PushButton( `opt(`default), "&OK")
		     )
	       );
    UI::UserInput();
    list selected_items = (list) UI::QueryWidget( `id(`toppings), `SelectedItems );
    
    // Remember to retrieve the widget's data _before_ the dialog is closed,
    // i.e. before it is destroyed!
    
    UI::CloseDialog();

    
    
    // Concatenate the list of selected toppings to one multi-line string.
    
    string pizza_description = "";

    foreach ( `topping, selected_items, ``{
	pizza_description = sformat( "%1\n%2", pizza_description, topping );
    } );


    // Open a new dialog to echo the selection.
    
    UI::OpenDialog(
	       `VBox(
		     `Label( "Your pizza will come with:\n" ),
		     `Label( pizza_description ),
		     `PushButton( `opt(`default), "&OK" )
		     )
	       );
    UI::UserInput();
    UI::CloseDialog();
}

        
          // Example showing how to replace SelectionBox items
{

    list all_toppings =
	[
	 "Cheese",
	 "Ham",
	 "Mushrooms",
	 "Pepperoni",
	 "Rucola",
	 "Salami",
	 "Tomatoes",
	 "Tuna"
	 ];

    list veggie_toppings =
	[
	 "Cheese",
	 "Mushrooms",
	 "Pepperoni",
	 "Rucola",
	 "Tomatoes"
	 ];

    UI::OpenDialog(`HBox(`VSpacing(15),	// layout trick: force minimum height
			 `VBox(
			       `HSpacing(25),	// force minimum width
			       `MultiSelectionBox(`id(`toppings), "Toppings:", all_toppings ),
			       `Left( `CheckBox(`id(`veggie), `opt(`notify), "&Vegetarian" ) ),
			       `PushButton(`id(`ok), "&OK" )
			       )
			 )
		   );

    symbol button = nil;

    do
    {
	button = (symbol) UI::UserInput();

	if ( button == `veggie )
	{
	    boolean vegetarian = (boolean) UI::QueryWidget(`veggie, `Value );

	    if ( vegetarian )	UI::ChangeWidget(`toppings, `Items, veggie_toppings );
	    else		UI::ChangeWidget(`toppings, `Items, all_toppings );
	}
	
    } while ( button != `ok );

    list<string> order = (list<string>) UI::QueryWidget(`toppings, `SelectedItems );
    UI::CloseDialog();


    //
    // Show the result
    //

    
    UI::OpenDialog(`VBox(
			 `Label( sformat( "Your order: %1", mergestring( order, ", " ) ) ),
			 `PushButton(`opt(`default), "&OK" )
			 )
		   );
    UI::UserInput();
    UI::CloseDialog();
}

        
          // Example showing how to replace SelectionBox items
{

    list all_toppings =
	[
	 `item(`id( "Cheese"	), "Cheese",	true ),
	 `item(`id( "Tomatoes"	), "Tomatoes",	true ),
	 `item(`id( "Ham"	), "Ham"	),
	 `item(`id( "Mushrooms"	), "Mushrooms"	),
	 `item(`id( "Pepperoni"	), "Pepperoni"	),
	 `item(`id( "Rucola"	), "Rucola"	),
	 `item(`id( "Salami"	), "Salami"	),
	 `item(`id( "Tuna"	), "Tuna"	)
	 ];

    list veggie_toppings =
	[
	 `item(`id( "Cheese"	), "Cheese",	true ),
	 `item(`id( "Tomatoes"	), "Tomatoes",	true ),
	 `item(`id( "Mushrooms"	), "Mushrooms"	),
	 `item(`id( "Pepperoni"	), "Pepperoni"	),
	 `item(`id( "Rucola"	), "Rucola"	)
	 ];

    UI::OpenDialog(`HBox(`VSpacing(15),	// layout trick: force minimum height
			 `VBox(
			       `HSpacing(25),	// force minimum width
			       `MultiSelectionBox(`id(`toppings), "Toppings:", all_toppings ),
			       `Left( `CheckBox(`id(`veggie), `opt(`notify), "&Vegetarian" ) ),
			       `PushButton(`id(`ok), "&OK" )
			       )
			 )
		   );

    symbol button = nil;

    do
    {
	button = (symbol) UI::UserInput();

	if ( button == `veggie )
	{
	    boolean vegetarian = (boolean) UI::QueryWidget(`veggie, `Value );

	    if ( vegetarian )	UI::ChangeWidget(`toppings, `Items, veggie_toppings );
	    else		UI::ChangeWidget(`toppings, `Items, all_toppings );
	}
	
    } while ( button != `ok );

    list<string> order = (list<string>) UI::QueryWidget(`toppings, `SelectedItems );
    UI::CloseDialog();


    //
    // Show the result
    //

    
    UI::OpenDialog(`VBox(
			 `Label( sformat( "Your order: %1", mergestring( order, ", " ) ) ),
			 `PushButton(`opt(`default), "&OK" )
			 )
		   );
    UI::UserInput();
    UI::CloseDialog();
}