| /* |
| * 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.Document; |
| import com.google.gwt.dom.client.Element; |
| import com.google.gwt.event.dom.client.ClickEvent; |
| import com.google.gwt.event.dom.client.ClickHandler; |
| import com.google.gwt.event.dom.client.MouseDownEvent; |
| import com.google.gwt.event.dom.client.MouseDownHandler; |
| import com.google.gwt.museum.client.common.AbstractIssue; |
| import com.google.gwt.user.client.Event; |
| import com.google.gwt.user.client.ui.Button; |
| import com.google.gwt.user.client.ui.DialogBox; |
| import com.google.gwt.user.client.ui.FlexTable; |
| import com.google.gwt.user.client.ui.Label; |
| import com.google.gwt.user.client.ui.SimplePanel; |
| import com.google.gwt.user.client.ui.VerticalPanel; |
| import com.google.gwt.user.client.ui.Widget; |
| |
| import java.util.HashMap; |
| import java.util.Map; |
| |
| /** |
| * Verify that events fire in all browsers. |
| */ |
| public class VisualsForDialogBox extends AbstractIssue { |
| |
| enum VisibleEvents { |
| mouseDown, mouseEnter, mouseLeave, mouseMove, mouseUp, captionMouseDown |
| } |
| |
| private final class VisibleDialogBox extends DialogBox { |
| private FlexTable layout = null; |
| |
| private final Map<VisibleEvents, Element> eventToElement = new HashMap<VisibleEvents, Element>(); |
| |
| private boolean maybeClose; |
| |
| public VisibleDialogBox() { |
| this(false); |
| } |
| |
| public VisibleDialogBox(boolean autoHide) { |
| this(autoHide, true); |
| } |
| |
| public VisibleDialogBox(boolean autoHide, boolean modal) { |
| super(autoHide, modal); |
| layout = new FlexTable(); |
| layout.setCellPadding(3); |
| layout.setBorderWidth(2); |
| layout.setHTML(0, 0, "<b>VisibleEvents</b>"); |
| layout.setHTML(0, 1, "<b>Status</b>"); |
| |
| final String style = "float:right; border: 1px solid blue; color:blue;" |
| + "font-weight:bold; font-size:85%"; |
| setHTML("I Gots a Close Box<div id='vis-closebox' style='" + style |
| + "'> X </div>"); |
| |
| for (VisibleEvents e : VisibleEvents.values()) { |
| eventToElement.put(e, addResultRow(e.name())); |
| } |
| add(layout); |
| } |
| |
| @Override |
| public void onBrowserEvent(Event event) { |
| switch (event.getTypeInt()) { |
| case Event.ONMOUSEDOWN: |
| if (isCloseBoxEvent(event)) { |
| maybeClose = true; |
| return; |
| } |
| break; |
| case Event.ONMOUSEUP: |
| if (maybeClose && isCloseBoxEvent(event)) { |
| maybeClose = false; |
| hide(); |
| return; |
| } |
| break; |
| } |
| maybeClose = false; |
| super.onBrowserEvent(event); |
| } |
| |
| @SuppressWarnings("deprecation") |
| @Override |
| public void onMouseDown(Widget sender, int x, int y) { |
| pass(VisibleEvents.mouseDown); |
| super.onMouseDown(sender, x, y); |
| } |
| |
| @SuppressWarnings("deprecation") |
| @Override |
| public void onMouseEnter(Widget sender) { |
| pass(VisibleEvents.mouseEnter); |
| sender.getElement().getStyle().setProperty("background", "yellow"); |
| super.onMouseEnter(sender); |
| } |
| |
| @SuppressWarnings("deprecation") |
| @Override |
| public void onMouseLeave(Widget sender) { |
| pass(VisibleEvents.mouseLeave); |
| sender.getElement().getStyle().setProperty("background", ""); |
| super.onMouseLeave(sender); |
| } |
| |
| @SuppressWarnings("deprecation") |
| @Override |
| public void onMouseMove(Widget sender, int x, int y) { |
| pass(VisibleEvents.mouseMove); |
| super.onMouseMove(sender, x, y); |
| } |
| |
| @SuppressWarnings("deprecation") |
| @Override |
| public void onMouseUp(Widget sender, int x, int y) { |
| pass(VisibleEvents.mouseUp); |
| super.onMouseUp(sender, x, y); |
| } |
| |
| 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; |
| } |
| |
| private boolean isCloseBoxEvent(Event event) { |
| return Document.get().getElementById("vis-closebox").isOrHasChild( |
| event.getTarget()); |
| } |
| } |
| |
| @Override |
| public Widget createIssue() { |
| // Create a few extra dialog boxes |
| final DialogBox dialog0 = showCustomDialog(true, true, false, "Dialog 0", |
| "I cannot be dragged or closed until Dialog 2 is closed", 0, 100); |
| final DialogBox dialog1 = showCustomDialog(true, false, false, "Dialog 1", |
| "I cannot be dragged or closed until Dialog 2 is closed", 0, 200); |
| final DialogBox dialog2 = showCustomDialog(false, false, true, "Dialog 2", |
| "I can be dragged", 0, 300); |
| final DialogBox dialog3 = showCustomDialog( |
| true, |
| false, |
| false, |
| "Dialog 3", |
| "I should auto close as soon as you click outside of me and Dialog 4 or greater", |
| 0, 400); |
| final DialogBox dialog4 = showCustomDialog(false, false, false, "Dialog 4", |
| "I can be dragged", 0, 500); |
| |
| final VisibleDialogBox dialog = showVisibleDialog(); |
| |
| SimplePanel panel = new SimplePanel() { |
| @Override |
| protected void onUnload() { |
| if (dialog.isAttached()) { |
| dialog.hide(); |
| dialog0.hide(); |
| dialog1.hide(); |
| dialog2.hide(); |
| dialog3.hide(); |
| dialog4.hide(); |
| } |
| } |
| }; |
| return panel; |
| } |
| |
| @Override |
| public String getInstructions() { |
| return "Confirm color change on mouse over caption, that the " |
| + "custom close box works, and that each mouse event fires. " |
| + "Verify that the text in each DialogBox is true."; |
| } |
| |
| @Override |
| public String getSummary() { |
| return "Legacy mouse event callbacks fire"; |
| } |
| |
| @Override |
| public boolean hasCSS() { |
| return false; |
| } |
| |
| private DialogBox showCustomDialog(boolean autoHide, |
| boolean previewAllEvents, boolean modal, String caption, String message, |
| int left, int top) { |
| final DialogBox dialog = new DialogBox(autoHide, modal); |
| dialog.setPreviewingAllNativeEvents(previewAllEvents); |
| |
| // Set the caption |
| caption += " (autoHide=" + dialog.isAutoHideEnabled(); |
| caption += ", previewAllEvents=" + dialog.isPreviewingAllNativeEvents(); |
| caption += ", modal=" + dialog.isModal() + ")"; |
| dialog.setText(caption); |
| |
| // Set the content |
| Label content = new Label(message); |
| if (autoHide || previewAllEvents) { |
| dialog.setWidget(content); |
| } else { |
| VerticalPanel vPanel = new VerticalPanel(); |
| vPanel.add(content); |
| vPanel.add(new Button("Close", new ClickHandler() { |
| public void onClick(ClickEvent event) { |
| dialog.hide(); |
| } |
| })); |
| dialog.setWidget(vPanel); |
| } |
| dialog.setPopupPosition(left, top); |
| dialog.show(); |
| return dialog; |
| } |
| |
| private VisibleDialogBox showVisibleDialog() { |
| final VisibleDialogBox dialog = new VisibleDialogBox(); |
| dialog.setModal(false); |
| dialog.center(); |
| dialog.getCaption().addMouseDownHandler(new MouseDownHandler() { |
| public void onMouseDown(MouseDownEvent event) { |
| dialog.pass(VisibleEvents.captionMouseDown); |
| } |
| }); |
| |
| return dialog; |
| } |
| } |