/*
 * Copyright 2009 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.uibinder.test.client;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.MouseOutEvent;
import com.google.gwt.event.dom.client.MouseOverEvent;
import com.google.gwt.event.logical.shared.CloseEvent;
import com.google.gwt.event.logical.shared.OpenEvent;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.shared.GwtEvent;
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.uibinder.client.UiTemplate;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FormPanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.TreeItem;
import com.google.gwt.user.client.ui.FormPanel.SubmitEvent;
import com.google.gwt.user.client.ui.Widget;

/**
 * A simple demo showing how UiHandler works.
 */
public class HandlerDemo extends Composite {

  @UiTemplate("HandlerDemo.ui.xml")
  interface MyUiBinder extends UiBinder<Widget, HandlerDemo> {
  }
  private static final MyUiBinder binder = GWT.create(MyUiBinder.class);

  @UiField FormPanel panelForm;
  @UiField TextBox textBoxValueChange;
  @UiField(provided = true) final CustomEventWidget<String> customEventWidget;

  public HandlerDemo() {
    this.customEventWidget = new CustomEventWidget<String>("a simple test");
    initWidget(binder.createAndBindUi(this));
  }

  @UiHandler("panelForm")
  public void doSubmit(SubmitEvent event) {
    eventMessage(event);
    event.cancel();
  }

  @UiHandler("textBoxValueChange")
  protected void doChangeValue(ValueChangeEvent<String> event) {
    eventMessage(event);
  }

  @UiHandler({"buttonClick", "labelClick"})
  void doClick(ClickEvent event) {
    eventMessage(event);
  }

  @UiHandler("buttonSubmit")
  @SuppressWarnings("unused")
  void doClickSubmit(ClickEvent ignored) {
    panelForm.submit();
  }

  @UiHandler("buttonMouseOut")
  void doMouseOut(MouseOutEvent event) {
    eventMessage(event);
  }

  @UiHandler("buttonMouseOver")
  void doMouseOver(MouseOverEvent event) {
    eventMessage(event);
  }

  @UiHandler("tree")
  void onTreeClose(CloseEvent<TreeItem> event) {
    eventMessage(event);
  }

  @UiHandler("tree")
  void onTreeOpen(OpenEvent<TreeItem> event) {
    eventMessage(event);
  }

  @UiHandler("customEventWidget")
  void onCustomEvent(CustomEvent<String> event) {
    eventMessage("CustomEventWidget clicked. Event throwing '"
        + event.getValue() + "'");
  }

  private void eventMessage(GwtEvent<?> event) {
    eventMessage(event.toDebugString());
  }

  private void eventMessage(String message) {
    Window.alert(message);
  }
}
