    /*
     * Copyright 2010 Google Inc.
     *
     * Licensed under the Apache License, Version 2.0 (the "License"); you may not
     * use this file except in compliance with the License. You may obtain a copy of
     * the License at
     *
     * http://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
     * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
     * License for the specific language governing permissions and limitations under
     * the License.
     */
    package com.google.gwt.sample.showcase.client.content.cell;

    import com.google.gwt.core.client.GWT;
    import com.google.gwt.event.dom.client.ClickEvent;
    import com.google.gwt.event.dom.client.ClickHandler;
    import com.google.gwt.i18n.client.DateTimeFormat;
    import com.google.gwt.i18n.client.DateTimeFormat.PredefinedFormat;
    import com.google.gwt.sample.showcase.client.content.cell.ContactDatabase.Category;
    import com.google.gwt.sample.showcase.client.content.cell.ContactDatabase.ContactInfo;
    import com.google.gwt.uibinder.client.UiBinder;
    import com.google.gwt.uibinder.client.UiField;
    import com.google.gwt.user.client.ui.Button;
    import com.google.gwt.user.client.ui.Composite;
    import com.google.gwt.user.client.ui.ListBox;
    import com.google.gwt.user.client.ui.TextArea;
    import com.google.gwt.user.client.ui.TextBox;
    import com.google.gwt.user.client.ui.Widget;
    import com.google.gwt.user.datepicker.client.DateBox;

    /**
     * A form used for editing contacts.
     */
    public class ContactInfoForm extends Composite {

      private static Binder uiBinder = GWT.create(Binder.class);

      interface Binder extends UiBinder<Widget, ContactInfoForm> {
      }

      @UiField
      TextArea addressBox;
      @UiField
      DateBox birthdayBox;
      @UiField
      ListBox categoryBox;
      @UiField
      Button createButton;
      @UiField
      TextBox firstNameBox;
      @UiField
      TextBox lastNameBox;
      @UiField
      Button updateButton;

      private ContactInfo contactInfo;

      public ContactInfoForm() {
        initWidget(uiBinder.createAndBindUi(this));
        DateTimeFormat dateFormat = DateTimeFormat.getFormat(
            PredefinedFormat.DATE_LONG);
        birthdayBox.setFormat(new DateBox.DefaultFormat(dateFormat));

        // Add the categories to the category box.
        final Category[] categories = ContactDatabase.get().queryCategories();
        for (Category category : categories) {
          categoryBox.addItem(category.getDisplayName());
        }

        // Initialize the contact to null.
        setContact(null);

        // Handle events.
        updateButton.addClickHandler(new ClickHandler() {
          public void onClick(ClickEvent event) {
            if (contactInfo == null) {
              return;
            }

            // Update the contact.
            contactInfo.setFirstName(firstNameBox.getText());
            contactInfo.setLastName(lastNameBox.getText());
            contactInfo.setAddress(addressBox.getText());
            contactInfo.setBirthday(birthdayBox.getValue());
            int categoryIndex = categoryBox.getSelectedIndex();
            contactInfo.setCategory(categories[categoryIndex]);

            // Update the views.
            ContactDatabase.get().refreshDisplays();
          }
        });
        createButton.addClickHandler(new ClickHandler() {
          public void onClick(ClickEvent event) {
            int categoryIndex = categoryBox.getSelectedIndex();
            Category category = categories[categoryIndex];
            contactInfo = new ContactInfo(category);
            contactInfo.setFirstName(firstNameBox.getText());
            contactInfo.setLastName(lastNameBox.getText());
            contactInfo.setAddress(addressBox.getText());
            contactInfo.setBirthday(birthdayBox.getValue());
            ContactDatabase.get().addContact(contactInfo);
            setContact(contactInfo);
          }
        });
      }

      public void setContact(ContactInfo contact) {
        this.contactInfo = contact;
        updateButton.setEnabled(contact != null);
        if (contact != null) {
          firstNameBox.setText(contact.getFirstName());
          lastNameBox.setText(contact.getLastName());
          addressBox.setText(contact.getAddress());
          birthdayBox.setValue(contact.getBirthday());
          Category category = contact.getCategory();
          Category[] categories = ContactDatabase.get().queryCategories();
          for (int i = 0; i < categories.length; i++) {
            if (category == categories[i]) {
              categoryBox.setSelectedIndex(i);
              break;
            }
          }
        }
      }
    }