Name

ReplacePoint — Pseudo widget to replace parts of a dialog

Synopsis

ReplacePoint ( term child );
 

Parameters

term child

the child widget

Description

A ReplacePoint can be used to dynamically change parts of a dialog. It contains one widget. This widget can be replaced by another widget by calling ReplaceWidget( `id( id ), newchild ), where id is the the id of the new child widget of the replace point. The ReplacePoint widget itself has no further effect and no optical representation.

Usage

 	`ReplacePoint( `id( `rp ), `Empty() )

Examples

          {
    UI::OpenDialog(
	       `VBox(
		     `ReplacePoint(`id(`rp), `Label("This is a label")),
		     `PushButton(`id(`change), "Change")));
    UI::UserInput();
    UI::ReplaceWidget(`id(`rp), `PushButton("This is a PushButton"));
    UI::UserInput();
    UI::ReplaceWidget(`id(`rp), `CheckBox("This is a CheckBox"));
    UI::UserInput();
    UI::ReplaceWidget(`id(`rp), `HBox(`PushButton("Button1"), `PushButton("Button2")));
    UI::UserInput();
    UI::CloseDialog();
}

        
          // Typical usage example for tab widget
{
    term address_page =
	`VBox(
	      `Left( `Heading( "Address" ) ),
	      `VSpacing(),
	      `HCenter(
		       `HSquash(
				`VBox(
				      `HSpacing( 50 ),
				      `InputField( "Name" ),
				      `InputField( "E-Mail" ),
				      `InputField( "Phone" ),
				      `VSpacing(),
				      `MultiLineEdit( "Comments" ),
				      `VStretch()
				      )
				)
		       )
	      );

    term overview_page =
	`VBox(
	      `Left( `Heading( "DumbTab Widget Overview" ) ),
	      `VSpacing(),
	      `Label( "This kind of tab is pretty dumb - hence the name DumbTab.\n"
		      + "You need to do most everything yourself.\n"
		      + "Each tab behaves very much like a push button;\n"
		      + "the YCP application is notified when the user clicks on a tab.\n"
		      + "The application must take care to exchange the tab contents.\n"
		      + "\n"
		      + "Note: That means changes made in on tab are lost when switching\n"
		      + "the tabs, e.g. text entered here in the address tab.")
	      );

    term style_hints_page =
	`VBox(
	      `Left( `Heading( "GUI Style Hints" ) ),
	      `VSpacing(),
	      `Heading( "Using tabs is usually a result of poor dialog design." ),
	      `VSpacing(),
	      `Left(
		    `Label( "Tabs hide complexity, they do not resolve it.\n"
			    + "The problem remains just as complex as before,\n"
			    + "only the user can no longer see it."
			    )
		    )
	      );



    UI::OpenDialog(`opt(`defaultsize),
		   `VBox(
			 `DumbTab( [
				    `item(`id(`address  ), "&Address"  ),
				    `item(`id(`overview ), "&Overview" ),
				    `item(`id(`style    ), "GUI &Style Hints", true )	// true: selected
				    ],
				   `Left(
					 `Top(
					      `HVSquash(
							`VBox(
							      `VSpacing(0.3),
							      `HBox(
								    `HSpacing(1),
								    `ReplacePoint(`id(`tabContents ), style_hints_page )
								    )
							      )
							)
					      )
					 )
				   ),
			 `Right(`PushButton(`id(`close), "Cl&ose" ) )
			 )
		   );


    while ( true )
    {
	symbol widget = (symbol) UI::UserInput();

	if 	( widget == `close )	break;
	else if ( widget == `address	)	UI::ReplaceWidget(`tabContents,	address_page );
	else if ( widget == `overview	)	UI::ReplaceWidget(`tabContents,	overview_page );
	else if ( widget == `style	)	UI::ReplaceWidget(`tabContents,	style_hints_page );
    }

    UI::CloseDialog();
}

        
          {
    // Demo for postponed shortcut checking

    term b_kilroy 	= `PushButton(`opt(`hstretch), "&Kilroy");
    term b_was		= `PushButton(`opt(`hstretch), "&was");
    term b_here		= `PushButton(`opt(`hstretch), "&here");

    
    UI::OpenDialog(
	       `VBox(
		     `VSpacing( 0.3 ),
		     `HBox(
			   `HSpacing(),
			   `Label("Click on one of the upper buttons\n" +
				  "to exchange them." ),
			   `HSpacing()
			   ),
		     `VSpacing( 0.3 ),
		     `ReplacePoint(`id(1), b_kilroy	),
		     `ReplacePoint(`id(2), b_was	),
		     `ReplacePoint(`id(3), b_here	),
		     `VSpacing(`opt(`vstretch) ),
		     `Right( `PushButton( `id(`cancel), "&Quit" ) )
		     )
	       );


    any button = nil;

    y2milestone( "Initial state: 'Kilroy was here'" );
    button = UI::UserInput(); if ( button == `cancel ) return;

    UI::PostponeShortcutCheck();		// "&Kilroy" "&was" "&here"
    UI::ReplaceWidget(`id(1), b_was    );	// "&was" "&was" "&here"
    UI::ReplaceWidget(`id(2), b_kilroy );	// "&was" "&Kilroy" "&here"
    UI::CheckShortcuts();

    y2milestone( "After change: 'was Kilroy here'" );
    button = UI::UserInput(); if ( button == `cancel ) return;
    
    UI::PostponeShortcutCheck();		// "&was" "&Kilroy" "&here"
    UI::ReplaceWidget(`id(1), b_here   );	// "&here" "&Kilroy" "&here"
    UI::ReplaceWidget(`id(2), b_was    );	// "&here" "&was" "&here"
    UI::ReplaceWidget(`id(3), b_kilroy );	// "&here" "&was" "&Kilroy"
    UI::CheckShortcuts();

    y2milestone( "After change: 'here was Kilroy'" );
    button = UI::UserInput(); if ( button == `cancel ) return;

    UI::PostponeShortcutCheck();		// "&here" "&was" "&Kilroy"
    UI::ReplaceWidget(`id(1), b_kilroy );	// "&Kilroy" "&was" "&Kilroy"
    UI::ReplaceWidget(`id(3), b_here   );	// "&Kilroy" "&was" "&here"
    // Omitting UI::CheckShortcuts();

    y2milestone( "After change: back to 'Kilroy was here'" );
    y2milestone( "Expect complaint about missing UI::CheckShortcuts()" );
    button = UI::UserInput(); if ( button == `cancel ) return;


    y2milestone( "Expect shortcut conflict: '&was' vs. '&was'" );
    UI::ReplaceWidget(`id(1), b_was    );	// "&was" "&was" "&here"
    UI::ReplaceWidget(`id(2), b_kilroy );	// "&was" "&Kilroy" "&here"
    y2milestone( "Expect complaint about excess UI::CheckShortcuts()" );
    UI::CheckShortcuts();

    y2milestone( "After change: 'was Kilroy here'" );
    button = UI::UserInput(); if ( button == `cancel ) return;
    
	
    UI::CloseDialog();
}


        
          {

    /**
     * Return a text summary of existing buttons.
     **/
    define string Summary() ``{
	
	string summary = 
	    ( UI::WidgetExists(`id(`top    ) ) ? "Top button exists"      : "No top button"      ) +
	    ( UI::WidgetExists(`id(`center ) ) ? "\nCenter button exists" : "\nNo center button" )	+
	    ( UI::WidgetExists(`id(`bottom ) ) ? "\nBottom button exists" : "\nNo bottom button" );

	return summary;

    };

    /**
     * Remove button with given id and update summary.
     **/
    define void RemoveButton( term id ) ``{
	UI::ReplaceWidget( id, `Empty() );
	UI::ChangeWidget( `id(`summary), `Value, Summary() );
	UI::RecalcLayout();
    }


    /**
     * main
     **/
    
    UI::OpenDialog(
	       `VBox(
		     `ReplacePoint( `id(`rp_top    ), `PushButton(`id(`top    ), "Top Button"    ) ),
		     `ReplacePoint( `id(`rp_center ), `PushButton(`id(`center ), "Center Button" ) ),
		     `ReplacePoint( `id(`rp_bottom ), `PushButton(`id(`bottom ), "Bottom Button" ) ),
		     `VSpacing( 1 ),
		     `Label(`id(`summary), "" ),
		     `VSpacing( 1 ),
		     `PushButton(`id(`close), "&Close")
		     )
	       );

    // Better wait until now before doing the summary - it isn't much use before UI::OpenDialog()
    // since of course all UI::WidgetExists() calls return false until then.
    UI::ChangeWidget( `id(`summary), `Value, Summary() );
    UI::RecalcLayout();
    
    any button = nil;

    repeat
    {
	button = UI::UserInput();

	if	( button == `top    ) 	RemoveButton(`id(`rp_top    ) );
	else if	( button == `center )	RemoveButton(`id(`rp_center ) );
	else if	( button == `bottom )	RemoveButton(`id(`rp_bottom ) );
    } until ( button == `close );

    UI::CloseDialog();
}