blob: 666450b6168262a8681edde307daa8378b072b58 [file] [log] [blame]
/*
* 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;
}
}