/* * Copyright 2008 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.Element; import com.google.gwt.museum.client.common.AbstractIssue; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.ui.AbsolutePanel; import com.google.gwt.user.client.ui.FlexTable; import com.google.gwt.user.client.ui.FocusPanel; import com.google.gwt.user.client.ui.MouseListener; import com.google.gwt.user.client.ui.MouseListenerCollection; import com.google.gwt.user.client.ui.Widget; import java.util.HashMap; import java.util.Map; /** * Ensure the ListenerWrapper for mouse still works like the old listeners did. */ @SuppressWarnings("deprecation") public class Issue3186 extends AbstractIssue { enum VisibleEvents { mouseDown, mouseEnter, mouseLeave, mouseMove, mouseUp } private final class TestWidget extends FocusPanel { private class Control implements MouseListener { int controlX; int controlY; int controlMouseEnter; int controlMouseLeave; public void onMouseDown(Widget sender, int x, int y) { this.controlX = x; this.controlY = y; } public void onMouseEnter(Widget sender) { ++controlMouseEnter; } public void onMouseLeave(Widget sender) { ++controlMouseLeave; } public void onMouseMove(Widget sender, int x, int y) { this.controlX = x; this.controlY = y; } public void onMouseUp(Widget sender, int x, int y) { this.controlX = x; this.controlY = y; } } private class Current implements MouseListener { private int mouseEnterCount; private int mouseLeaveCount; public void onMouseDown(Widget sender, int x, int y) { check(x, y, VisibleEvents.mouseDown); } public void onMouseEnter(Widget sender) { ++mouseEnterCount; if (mouseEnterCount != control.controlMouseEnter) { fail("recieved:" + mouseEnterCount + " events, expected:" + control.controlMouseEnter, VisibleEvents.mouseEnter); } else { pass(VisibleEvents.mouseEnter); } sender.getElement().getStyle().setProperty("background", "yellow"); } public void onMouseLeave(Widget sender) { ++mouseLeaveCount; if (mouseLeaveCount != control.controlMouseLeave) { fail("recieved:" + mouseLeaveCount + " events, expected:" + control.controlMouseLeave, VisibleEvents.mouseLeave); } else { pass(VisibleEvents.mouseLeave); } sender.getElement().getStyle().setProperty("background", ""); } public void onMouseMove(Widget sender, int x, int y) { check(x, y, VisibleEvents.mouseMove); } public void onMouseUp(Widget sender, int x, int y) { check(x, y, VisibleEvents.mouseUp); } private void check(int x, int y, VisibleEvents event) { String errorReport = getErrorReport(x, y); if (errorReport == null) { eventToElement.get(event).setInnerHTML( "<span style='color:green'>pass</span>"); } else { fail(errorReport, event); } } private String getErrorReport(int x, int y) { String errorReport = null; if (x != control.controlX) { errorReport = "wanted x: " + control.controlX + " actual x" + x; } else if (y != control.controlY) { errorReport += "wanted y: " + control.controlY + " actual y" + y; } return errorReport; } } private FlexTable layout = null; private MouseListenerCollection collection = new MouseListenerCollection(); private Control control = new Control(); private Current current = new Current(); private final Map<VisibleEvents, Element> eventToElement = new HashMap<VisibleEvents, Element>(); public TestWidget() { layout = new FlexTable(); layout.setCellPadding(3); layout.setBorderWidth(2); layout.setHTML(0, 0, "<b>MouseEvents</b>"); layout.setHTML(0, 1, "<b>Status</b>"); for (VisibleEvents e : VisibleEvents.values()) { eventToElement.put(e, addResultRow(e.name())); } add(layout); this.addMouseListener(current); collection.add(control); } public void fail(String errorReport, VisibleEvents event) { eventToElement.get(event).setInnerHTML( "<span style='color:red'>" + errorReport + "</span>"); } @Override public void onBrowserEvent(Event event) { collection.fireMouseEvent(this, event); super.onBrowserEvent(event); } public void pass(VisibleEvents event) { eventToElement.get(event).setInnerHTML( "<span style='color:green'>pass</span>"); } private Element addResultRow(String eventName) { int row = layout.getRowCount(); layout.setHTML(row, 0, eventName); layout.setHTML(row, 1, "<span style='color:red'>?</span>"); Element cell = layout.getCellFormatter().getElement(row, 1); return cell; } } @Override public Widget createIssue() { AbsolutePanel p = new AbsolutePanel(); p.setHeight("500px"); p.setWidth("500px"); final TestWidget dialog = showTestWidget(); p.add(dialog, 100, 100); return p; } @Override public String getInstructions() { return "move your mouse around "; } @Override public String getSummary() { return "mouse listeners work the same"; } @Override public boolean hasCSS() { return false; } private TestWidget showTestWidget() { final TestWidget dialog = new TestWidget(); return dialog; } }