Package com.google.gwt.museum.client.defaultmuseum

Source Code of com.google.gwt.museum.client.defaultmuseum.VisualsForEventsFiring

/*
* 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.museum.client.defaultmuseum;

import com.google.gwt.dom.client.NativeEvent;
import com.google.gwt.event.dom.client.BlurEvent;
import com.google.gwt.event.dom.client.BlurHandler;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.ContextMenuEvent;
import com.google.gwt.event.dom.client.ContextMenuHandler;
import com.google.gwt.event.dom.client.DoubleClickEvent;
import com.google.gwt.event.dom.client.DoubleClickHandler;
import com.google.gwt.event.dom.client.ErrorEvent;
import com.google.gwt.event.dom.client.ErrorHandler;
import com.google.gwt.event.dom.client.FocusEvent;
import com.google.gwt.event.dom.client.FocusHandler;
import com.google.gwt.event.dom.client.HasChangeHandlers;
import com.google.gwt.event.dom.client.HasContextMenuHandlers;
import com.google.gwt.event.dom.client.HasDoubleClickHandlers;
import com.google.gwt.event.dom.client.HasMouseWheelHandlers;
import com.google.gwt.event.dom.client.KeyDownEvent;
import com.google.gwt.event.dom.client.KeyDownHandler;
import com.google.gwt.event.dom.client.KeyPressEvent;
import com.google.gwt.event.dom.client.KeyPressHandler;
import com.google.gwt.event.dom.client.KeyUpEvent;
import com.google.gwt.event.dom.client.KeyUpHandler;
import com.google.gwt.event.dom.client.LoadEvent;
import com.google.gwt.event.dom.client.LoadHandler;
import com.google.gwt.event.dom.client.MouseDownEvent;
import com.google.gwt.event.dom.client.MouseDownHandler;
import com.google.gwt.event.dom.client.MouseMoveEvent;
import com.google.gwt.event.dom.client.MouseMoveHandler;
import com.google.gwt.event.dom.client.MouseOutEvent;
import com.google.gwt.event.dom.client.MouseOutHandler;
import com.google.gwt.event.dom.client.MouseOverEvent;
import com.google.gwt.event.dom.client.MouseOverHandler;
import com.google.gwt.event.dom.client.MouseUpEvent;
import com.google.gwt.event.dom.client.MouseUpHandler;
import com.google.gwt.event.dom.client.MouseWheelEvent;
import com.google.gwt.event.dom.client.MouseWheelHandler;
import com.google.gwt.event.dom.client.ScrollEvent;
import com.google.gwt.event.dom.client.ScrollHandler;
import com.google.gwt.event.logical.shared.ResizeEvent;
import com.google.gwt.event.logical.shared.ResizeHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.museum.client.common.AbstractIssue;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.user.client.ui.FlexTable.FlexCellFormatter;

import java.util.HashMap;
import java.util.Map;

/**
* Verify that events fire in all browsers.
*/
public class VisualsForEventsFiring extends AbstractIssue {
  private static class CustomImage extends Image implements
      HasDoubleClickHandlers, HasContextMenuHandlers {
    public HandlerRegistration addContextMenuHandler(ContextMenuHandler handler) {
      return addDomHandler(handler, ContextMenuEvent.getType());
    }

    public HandlerRegistration addDoubleClickHandler(DoubleClickHandler handler) {
      return addDomHandler(handler, DoubleClickEvent.getType());
    }
  }

  private static class CustomScrollPanel extends ScrollPanel implements
      HasMouseWheelHandlers {
    public CustomScrollPanel(Widget content) {
      super(content);
    }

    public HandlerRegistration addMouseWheelHandler(MouseWheelHandler handler) {
      return addDomHandler(handler, MouseWheelEvent.getType());
    }
  }

  private static class CustomTextBox extends TextBox implements
      HasChangeHandlers {
    public HandlerRegistration addChangeHandler(ChangeHandler handler) {
      return addDomHandler(handler, ChangeEvent.getType());
    }
  }

  private static final int WINDOW_EVENT_SCROLL = -1;
  private static final int WINDOW_EVENT_RESIZE = -2;
  private static final int WINDOW_EVENT_CLOSING = -3;
  private static final int VELOCITY_EVENT = -4;

  /**
   * The main grid used for layout.
   */
  private FlexTable layout = null;

  private Map<Integer, Integer> eventMap = new HashMap<Integer, Integer>();

  @Override
  public Widget createIssue() {
    // Create a grid to hold all of the tests
    eventMap.clear();
    layout = new FlexTable();
    layout.setCellPadding(3);
    layout.setBorderWidth(2);
    layout.setHTML(0, 0, "<b>Action to Perform</b>");
    layout.setHTML(0, 1, "<b>Event</b>");
    layout.setHTML(0, 2, "<b>Status</b>");

    prepMouseEvents();
    prepKeyboardEvents();
    prepScrollAndMouseWheelEvents();
    prepLoadEvents();
    prepWindowEvents();

    // The following are not testable or not supported in all browsers
    // onlosecapture

    return layout;
  }

  @Override
  public String getInstructions() {
    return "Use the Widgets below to verify that all events fire in all "
        + "browsers.  To test an event, perform the action require to trigger "
        + "the event using the provided widget.";
  }

  @Override
  public String getSummary() {
    return "Events fire in current browsers";
  }

  @Override
  public boolean hasCSS() {
    return false;
  }

  /**
   * Add a test that is dependent on a previous test.
   *
   * @param eventType the type of event defined in {@link Event}
   * @param eventName the name of the event
   * @return the index of the test
   */
  private int addDependentTest(int eventType, String eventName) {
    // Find the last test
    int numRows = layout.getRowCount();
    eventMap.put(new Integer(eventType), new Integer(numRows));
    for (int i = numRows - 1; i > 0; i--) {
      if (layout.getCellCount(i) == 3) {
        FlexCellFormatter formatter = layout.getFlexCellFormatter();
        int rowSpan = formatter.getRowSpan(i, 0);
        formatter.setRowSpan(i, 0, rowSpan + 1);
        break;
      }
    }
    layout.setText(numRows, 0, eventName);
    layout.setText(numRows, 1, "?");
    return numRows;
  }

  /**
   * Add a new test that tests one or more events.
   *
   * @param eventType the type of event defined in {@link Event}
   * @param eventName the name of the event
   * @param trigger the widget that triggers the events
   * @return the index of the test
   */
  private int addTest(int eventType, String eventName, Widget trigger) {
    int numRows = layout.getRowCount();
    eventMap.put(new Integer(eventType), new Integer(numRows));
    layout.setWidget(numRows, 0, trigger);
    layout.setText(numRows, 1, eventName);
    layout.setText(numRows, 2, "?");

    FlexCellFormatter formatter = layout.getFlexCellFormatter();
    formatter.setVerticalAlignment(numRows, 0,
        HasVerticalAlignment.ALIGN_MIDDLE);
    formatter.setHorizontalAlignment(numRows, 0,
        HasHorizontalAlignment.ALIGN_CENTER);
    return numRows;
  }

  /**
   * Mark the event as passed.
   *
   * @param event the event that was triggered
   */
  private void passTest(NativeEvent event) {
    passTest(Event.as(event).getTypeInt());
  }

  /**
   * Mark the event as passed.
   *
   * @param eventType the event type that was triggered
   */
  private void passTest(int eventType) {
    int rowIndex = eventMap.get(new Integer(eventType));
    if (layout.getCellCount(rowIndex) == 3) {
      layout.setHTML(rowIndex, 2, "pass");
    } else {
      layout.setHTML(rowIndex, 1, "pass");
    }
  }

  private void prepKeyboardEvents() {
    // Setup a text box to trigger the events
    CustomTextBox textBox = new CustomTextBox();

    // Setup the tests
    textBox.setText("Type a letter");
    addTest(Event.ONKEYDOWN, "keydown", textBox);
    addDependentTest(Event.ONKEYPRESS, "keypress");
    addDependentTest(Event.ONKEYUP, "keyup");
    addDependentTest(Event.ONFOCUS, "focus");
    addDependentTest(Event.ONBLUR, "blur");
    addDependentTest(Event.ONCHANGE, "change");

    // Add event handlers
    textBox.addKeyDownHandler(new KeyDownHandler() {
      public void onKeyDown(KeyDownEvent event) {

        event.isAltKeyDown();
        event.isControlKeyDown();
        event.isShiftKeyDown();
        event.isMetaKeyDown();
        assert event.getNativeKeyCode() > 0;
        passTest(event.getNativeEvent());
      }
    });
    textBox.addKeyUpHandler(new KeyUpHandler() {
      public void onKeyUp(KeyUpEvent event) {
        event.isAltKeyDown();
        event.isControlKeyDown();
        event.isShiftKeyDown();
        event.isMetaKeyDown();
        assert event.getNativeKeyCode() > 0;
        passTest(event.getNativeEvent());
      }
    });
    textBox.addKeyPressHandler(new KeyPressHandler() {
      public void onKeyPress(KeyPressEvent event) {
        event.isAltKeyDown();
        event.isControlKeyDown();
        event.isShiftKeyDown();
        event.isMetaKeyDown();
        assert event.getCharCode() > 0;
        passTest(event.getNativeEvent());
      }
    });
    textBox.addFocusHandler(new FocusHandler() {
      public void onFocus(FocusEvent event) {
        passTest(event.getNativeEvent());
      }
    });
    textBox.addBlurHandler(new BlurHandler() {
      public void onBlur(BlurEvent event) {
        passTest(event.getNativeEvent());
      }
    });
    textBox.addChangeHandler(new ChangeHandler() {
      public void onChange(ChangeEvent event) {
        passTest(event.getNativeEvent());
      }
    });
  }

  private void prepLoadEvents() {
    // Create an image to trigger events
    final CustomImage loadable = new CustomImage();

    // Setup the tests
    addTest(Event.ONERROR, "error", loadable);
    addDependentTest(Event.ONLOAD, "load");
    addDependentTest(Event.ONCONTEXTMENU, "contextMenu");
    addDependentTest(Event.ONDBLCLICK, "dblclick");

    // Add the handlers
    loadable.addErrorHandler(new ErrorHandler() {
      public void onError(ErrorEvent event) {
        loadable.setUrl("issues/images/gwtLogo.png");
        passTest(event.getNativeEvent());
      }
    });
    loadable.addLoadHandler(new LoadHandler() {
      public void onLoad(LoadEvent event) {
        passTest(event.getNativeEvent());
      }
    });
    loadable.addDoubleClickHandler(new DoubleClickHandler() {
      public void onDoubleClick(DoubleClickEvent event) {
        passTest(event.getNativeEvent());
      }
    });
    loadable.addContextMenuHandler(new ContextMenuHandler() {
      public void onContextMenu(ContextMenuEvent event) {
        passTest(event.getNativeEvent());
      }
    });

    // Trigger the events
    loadable.setUrl("imageDoesNotExist.abc");
  }

  private void prepMouseEvents() {
    // Create a button to trigger events
    final Button button = new Button("Click me, move over me") {
      @Override
      public void onBrowserEvent(Event event) {
        super.onBrowserEvent(event);

        // Verify that values associated with events are defined. For some
        // values, we just want to make sure we can get them without any
        // errors.
        assert event.getClientX() > 0;
        assert event.getClientY() > 0;
        assert event.getScreenX() > 0;
        assert event.getScreenY() > 0;
        event.getAltKey();
        event.getCtrlKey();
        event.getShiftKey();
        event.getMetaKey();
      }
    };

    // Setup the tests
    addTest(Event.ONCLICK, "click", button);
    addDependentTest(Event.ONMOUSEDOWN, "mousedown");
    addDependentTest(Event.ONMOUSEUP, "mouseup");
    addDependentTest(Event.ONMOUSEOVER, "mouseover");
    addDependentTest(Event.ONMOUSEOUT, "mouseout");
    addDependentTest(Event.ONMOUSEMOVE, "mousemove");

    // Add event handlers
    button.addClickHandler(new ClickHandler() {
      public void onClick(ClickEvent event) {
        passTest(event.getNativeEvent());
      }
    });
    button.addMouseDownHandler(new MouseDownHandler() {
      public void onMouseDown(MouseDownEvent event) {
        event.getNativeButton();
        passTest(event.getNativeEvent());
      }
    });
    button.addMouseUpHandler(new MouseUpHandler() {
      public void onMouseUp(MouseUpEvent event) {
        event.getNativeButton();
        passTest(event.getNativeEvent());
      }
    });
    button.addMouseMoveHandler(new MouseMoveHandler() {
      public void onMouseMove(MouseMoveEvent event) {
        passTest(event.getNativeEvent());
      }
    });
    button.addMouseOutHandler(new MouseOutHandler() {
      public void onMouseOut(MouseOutEvent event) {
        NativeEvent nativeEvent = event.getNativeEvent();
        assert nativeEvent.getRelatedEventTarget() != null;
        assert nativeEvent.getEventTarget() != null;
        if (button.getElement().equals(nativeEvent.getEventTarget())
            && button.getElement().getParentElement().equals(
                nativeEvent.getRelatedEventTarget())) {
          passTest(nativeEvent);
        }
      }
    });
    button.addMouseOverHandler(new MouseOverHandler() {
      public void onMouseOver(MouseOverEvent event) {
        NativeEvent nativeEvent = event.getNativeEvent();
        assert nativeEvent.getRelatedEventTarget() != null;
        assert nativeEvent.getEventTarget() != null;
        if (button.getElement().equals(nativeEvent.getEventTarget())
            && button.getElement().getParentElement().equals(
                nativeEvent.getRelatedEventTarget())) {
          passTest(nativeEvent);
        }
      }
    });
  }

  private void prepScrollAndMouseWheelEvents() {
    // Create a widget to trigger events
    String scrollableMessage = "Scroll to the bottom<br>(using mouse wheel<br>"
        + "if supported)";
    HTML scrollableContents = new HTML(scrollableMessage);
    scrollableContents.setPixelSize(400, 400);
    scrollableContents.getElement().getStyle().setProperty("textAlign", "left");
    CustomScrollPanel scrollable = new CustomScrollPanel(scrollableContents);

    // Setup the tests
    scrollable.setAlwaysShowScrollBars(true);
    scrollable.setPixelSize(200, 100);
    addTest(Event.ONSCROLL, "scroll", scrollable);
    addDependentTest(Event.ONMOUSEWHEEL, "mousewheel");

    // Display the mouse wheel velocity
    final int velocityIndex = addDependentTest(VELOCITY_EVENT, "velocityY");

    // Add event handlers
    scrollable.addScrollHandler(new ScrollHandler() {
      public void onScroll(ScrollEvent event) {
        passTest(event.getNativeEvent());
      }
    });
    scrollable.addMouseWheelHandler(new MouseWheelHandler() {
      public void onMouseWheel(MouseWheelEvent event) {
        event.getClientX();
        event.getClientY();
        event.getScreenX();
        event.getScreenY();
        int velocityY = event.getDeltaY();
        layout.setText(velocityIndex, 1, velocityY + "");
        passTest(event.getNativeEvent());
      }
    });
  }

  private void prepWindowEvents() {
    Label windowLabel = new Label("Window level events");

    // Setup the tests
    addTest(WINDOW_EVENT_SCROLL, "window.onscroll", windowLabel);
    addDependentTest(WINDOW_EVENT_RESIZE, "window.onresize");
    addDependentTest(WINDOW_EVENT_CLOSING, "window.onbeforeunload");

    // Add event handlers
    Window.addWindowScrollHandler(new Window.ScrollHandler() {
      public void onWindowScroll(Window.ScrollEvent event) {
        passTest(WINDOW_EVENT_SCROLL);
      }
    });
    Window.addResizeHandler(new ResizeHandler() {
      public void onResize(ResizeEvent event) {
        passTest(WINDOW_EVENT_RESIZE);
      }
    });
    Window.addWindowClosingHandler(new Window.ClosingHandler() {
      public void onWindowClosing(Window.ClosingEvent event) {
        event.setMessage("Stay and verify that window.onbeforeunload() has passed");
        passTest(WINDOW_EVENT_CLOSING);
      }
    });
  }
}
TOP

Related Classes of com.google.gwt.museum.client.defaultmuseum.VisualsForEventsFiring

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.