SearchView.java
package com.itmill.toolkit.demo.tutorial.addressbook.ui;

import com.itmill.toolkit.demo.tutorial.addressbook.AddressBookApplication;
import com.itmill.toolkit.demo.tutorial.addressbook.data.PersonContainer;
import com.itmill.toolkit.demo.tutorial.addressbook.data.SearchFilter;
import com.itmill.toolkit.ui.Button;
import com.itmill.toolkit.ui.CheckBox;
import com.itmill.toolkit.ui.FormLayout;
import com.itmill.toolkit.ui.NativeSelect;
import com.itmill.toolkit.ui.Panel;
import com.itmill.toolkit.ui.TextField;
import com.itmill.toolkit.ui.Button.ClickEvent;
import com.itmill.toolkit.ui.Button.ClickListener;
import com.itmill.toolkit.ui.Window.Notification;

public class SearchView extends Panel {

  private TextField tf;
  private NativeSelect fieldToSearch;
  private CheckBox saveSearch;
  private TextField searchName;
  private AddressBookApplication app;

  public SearchView(final AddressBookApplication app) {
    this.app = app;
    addStyleName("view");
    
    setCaption("Search contacts");
    setSizeFull();

    /* Use a FormLayout as main layout for this Panel */
    FormLayout formLayout = new FormLayout();
    setLayout(formLayout);

    /* Create UI components */
    tf = new TextField("Search term");
    fieldToSearch = new NativeSelect("Field to search");
    saveSearch = new CheckBox("Save search");
    searchName = new TextField("Search name");
    Button search = new Button("Search");

    /* Initialize fieldToSearch */
    for (int i = 0; i < PersonContainer.NATURAL_COL_ORDER.length; i++) {
      fieldToSearch.addItem(PersonContainer.NATURAL_COL_ORDER[i]);
      fieldToSearch.setItemCaption(PersonContainer.NATURAL_COL_ORDER[i],
          PersonContainer.COL_HEADERS_ENGLISH[i]);
    }

    fieldToSearch.setValue("lastName");
    fieldToSearch.setNullSelectionAllowed(false);

    /* Initialize save checkbox */
    saveSearch.setValue(true);
    saveSearch.setImmediate(true);
    saveSearch.addListener(new ClickListener() {
      public void buttonClick(ClickEvent event) {
        searchName.setVisible(event.getButton().booleanValue());
      }
    });

    search.addListener(new Button.ClickListener() {
      public void buttonClick(ClickEvent event) {
        performSearch();
      }

    });

    /* Add all the created components to the form */
    addComponent(tf);
    addComponent(fieldToSearch);
    addComponent(saveSearch);
    addComponent(searchName);
    addComponent(search);
  }

  private void performSearch() {
    String searchTerm = (Stringtf.getValue();
    if (searchTerm == null || searchTerm.equals("")) {
      getWindow().showNotification("Search term cannot be empty!",
          Notification.TYPE_WARNING_MESSAGE);
      return;
    }

    SearchFilter searchFilter = new SearchFilter(fieldToSearch.getValue(),
        searchTerm, (StringsearchName.getValue());
    if (saveSearch.booleanValue()) {
      if (searchName.getValue() == null
          || searchName.getValue().equals("")) {
        getWindow().showNotification(
            "Please enter a name for your search!",
            Notification.TYPE_WARNING_MESSAGE);
        return;
      }
      app.saveSearch(searchFilter);
    }
    app.search(searchFilter);
  }

}