TitlePanel


December 5, 2013 Maithilish

6.3. TitlePanel

TitlePanel displays the symbol name on selection by the user and uses a SimplePanel and Label.
Why a separate widget when a Label is suffice, and reason for this is with more and more widgets added to Snapshot events handling becomes complicated and with a separate widget we can wire events much more elegantly. Hence TitlePanel is pulled out as a separate widget with TitlePanel.ui.xml and TitlePanel.java.
Snapshot uses TitlePanel in Snapshot.ui.xml which earlier used a Label as placeholder for this widget.
in.fins.client.content/Snapshot.ui.xml

        <g:LayoutPanel ui:field="layout">
                <g:layer left='60%' width='40%' top='1%' height='5%'>
                      <!-- AutoSuggest -->
                </g:layer>
                <g:layer left='2%' width='50%' top='1%' height='5%'>
                        <f:TitlePanel />
                </g:layer>

Wire TitlePanel and AutoSuggest

TitlePanel has to listen to AutoSuggest and display the symbol name when user selects one. Instead of traditional event and handler method we use GWT EventBus infrastructure to avoid direct couple between these widgets. AutoSuggest fires a NameEvent to EventBus which in turn dispatches the event to TitlePanel. GWT EventBus mechanism is explained in detail in Section : EventBus

NameEvent.java defines NameEvent and NameHandler, and NameEvent holds the name selected by the user. Wire AutoSuggest and TitlePanel as follows.
First make TitlePanel as a handler of NameEvent.
in.fins.client.widget/TitlePanel.java

public class TitlePanel extends Composite  implements NameHandler{

...

        @Override
        public void onNameChange(NameEvent nameEvent) {
                log.fine("NameEvent " + nameEvent.getName());
                label.setText(nameEvent.getName());
        }

Next, register TitlePanel as a handler for NameEvent with EventBus.
in.fins.client.content/Snapshot.java

       @UiField
       TitlePanel titlePanel;

        public Snapshot() {
               initWidget(binder.createAndBindUi(this));
               autoSuggest.requestFocus();
               EventBus.get().addHandler(NameEvent.TYPE, titlePanel);

Finally, on selection fire NameEvent from AutoSuggest.
in.fins.client.widget/AutoSuggest.java

        @UiHandler("suggestBox")
        public void handleSelection(SelectionEvent<SuggestOracle.Suggestion> s) {
               log.fine("Selection : " + suggestBox.getText());
               EventBus.get().fireEvent(
                               new NameEvent(suggestBox.getText()));
               suggestBox.setText("");
        }

In Snapshot.java, we got hold of TitlePanel through @UiField to add the handler, and this is adequate as long as the number of widgets are few. Snapshot ends up with more than a dozen of widget and with so many UI fields it soon results in untidy code. Instead, we may use @UiFactory which is a convenient way to create the multiple instances of widgets. In the next section, we are going to look at different ways of widget initialization in UiBinder.