/* | |
* 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; | |
} | |
} |