/*
 * 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.dynatablerf.client.widgets;

import com.google.gwt.core.client.GWT;
import com.google.gwt.editor.client.IsEditor;
import com.google.gwt.editor.client.adapters.OptionalFieldEditor;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.requestfactory.shared.Receiver;
import com.google.gwt.sample.dynatablerf.shared.DynaTableRequestFactory;
import com.google.gwt.sample.dynatablerf.shared.PersonProxy;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.Widget;

/**
 * This demonstrates how an editor can be constructed to handle optional fields.
 * The Person domain object's mentor property is initially <code>null</code>.
 * This type delegates editing control to an instance of the
 * {@link OptionalValueEditor} adapter class.
 */
public class MentorSelector extends Composite implements
    IsEditor<OptionalFieldEditor<PersonProxy, NameLabel>> {

  interface Binder extends UiBinder<Widget, MentorSelector> {
  }

  @UiField
  Button choose;

  @UiField
  Button clear;

  @UiField
  NameLabel nameLabel;

  private final OptionalFieldEditor<PersonProxy, NameLabel> editor;
  private final DynaTableRequestFactory factory;

  public MentorSelector(DynaTableRequestFactory factory) {
    this.factory = factory;
    initWidget(GWT.<Binder> create(Binder.class).createAndBindUi(this));
    editor = OptionalFieldEditor.of(nameLabel);
  }

  public OptionalFieldEditor<PersonProxy, NameLabel> asEditor() {
    return editor;
  }

  public void setEnabled(boolean enabled) {
    choose.setEnabled(enabled);
    clear.setEnabled(enabled);
  }

  @Override
  protected void onUnload() {
    nameLabel.cancelSubscription();
  }

  @UiHandler("choose")
  void onChoose(ClickEvent event) {
    setEnabled(false);
    factory.schoolCalendarRequest().getRandomPerson().to(
        new Receiver<PersonProxy>() {
          @Override
          public void onSuccess(PersonProxy response) {
            setValue(response);
            setEnabled(true);
          }
        }).fire();
  }

  @UiHandler("clear")
  void onClear(ClickEvent event) {
    setValue(null);
  }

  /**
   * This method is not called by the Editor framework.
   */
  private void setValue(PersonProxy person) {
    editor.setValue(person);
    nameLabel.setVisible(person != null);
  }
}
