/**
   * The UiBinder interface used by this example.
   */
  interface Binder extends UiBinder<Widget, CwCellBrowser> {
  }

  /**
   * The constants used in this Content Widget.
   */
  public static interface CwConstants extends Constants {
    String cwCellBrowserDescription();

    String cwCellBrowserName();
  }

  /**
   * The CellBrowser.
   */
  @UiField(provided = true)
  CellBrowser cellBrowser;

  /**
   * The label that shows selected names.
   */
  @UiField
  Label selectedLabel;

  /**
   * Initialize this example.
   */
  @Override
  public Widget onInitialize() {
    final MultiSelectionModel<ContactInfo> selectionModel = new MultiSelectionModel<ContactInfo>(ContactDatabase.ContactInfo.KEY_PROVIDER);
    selectionModel.addSelectionChangeHandler(
        new SelectionChangeEvent.Handler() {
          public void onSelectionChange(SelectionChangeEvent event) {
            StringBuilder sb = new StringBuilder();
            boolean first = true;
            List<ContactInfo> selected = new ArrayList<ContactInfo>(
                selectionModel.getSelectedSet());
            Collections.sort(selected);
            for (ContactInfo value : selected) {
              if (first) {
                first = false;
              } else {
                sb.append(", ");
              }
              sb.append(value.getFullName());
            }
            selectedLabel.setText(sb.toString());
          }
        });

    cellBrowser = new CellBrowser(
        new ContactTreeViewModel(selectionModel), null);
    cellBrowser.setAnimationEnabled(true);

    // Create the UiBinder.
    Binder uiBinder = GWT.create(Binder.class);
    Widget widget = uiBinder.createAndBindUi(this);
    return widget;
  }