package tv.dyndns.kishibe.qmaclone.client.ui;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import com.google.gwt.dom.client.ImageElement;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.DomEvent;
import com.google.gwt.event.dom.client.HasAllMouseHandlers;
import com.google.gwt.event.dom.client.HasClickHandlers;
import com.google.gwt.event.dom.client.HasMouseWheelHandlers;
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.logical.shared.ResizeEvent;
import com.google.gwt.event.logical.shared.ResizeHandler;
import com.google.gwt.event.shared.EventHandler;
import com.google.gwt.event.shared.GwtEvent;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.PopupPanel;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.widgetideas.graphics.client.CanvasGradient;
import com.google.gwt.widgetideas.graphics.client.Color;
import com.google.gwt.widgetideas.graphics.client.GWTCanvas;
/**
* {@link PopupPanel} を用いて全面に表示される {@link GWTCanvas} 。 {@link Widget} の左上の座標を基準座標として表示する。
*
* @author nodchip
*/
public class PopupCanvas implements HasClickHandlers, HasAllMouseHandlers, HasMouseWheelHandlers {
private final Map<EventHandler, DomEvent.Type<EventHandler>> eventHandlers = new HashMap<EventHandler, DomEvent.Type<EventHandler>>();
private final Widget offset;
private int width;
private int height;
private final PopupPanel popupPanel;
private GWTCanvas canvas;
private HandlerRegistration resizeHandlerRegistration;
private HandlerRegistration scrollHandlerRegistration;
public PopupCanvas(Widget offset, int width, int height) {
this.offset = offset;
this.width = width;
this.height = height;
popupPanel = new PopupPanel(false, false);
popupPanel.setStyleName("popup-canvas-background");
prepare();
}
public void prepare() {
canvas = new GWTCanvas(width, height);
popupPanel.setWidget(canvas);
for (Entry<EventHandler, DomEvent.Type<EventHandler>> entry : eventHandlers.entrySet()) {
canvas.addDomHandler(entry.getKey(), entry.getValue());
}
}
// 以下PopupPanelより
/**
* 画面上に表示する。 描画メソッドはこのメソッドを呼んだ後でないと効果がない。
*/
public void show() {
updatePopupPosition();
popupPanel.show();
resizeHandlerRegistration = Window.addResizeHandler(new ResizeHandler() {
@Override
public void onResize(ResizeEvent event) {
updatePopupPosition();
}
});
scrollHandlerRegistration = Window.addWindowScrollHandler(new Window.ScrollHandler() {
public void onWindowScroll(com.google.gwt.user.client.Window.ScrollEvent event) {
updatePopupPosition();
}
});
}
private void updatePopupPosition() {
popupPanel.setPopupPosition(offset.getAbsoluteLeft(), offset.getAbsoluteTop());
}
public void hide() {
if (scrollHandlerRegistration != null) {
scrollHandlerRegistration.removeHandler();
scrollHandlerRegistration = null;
}
if (resizeHandlerRegistration != null) {
resizeHandlerRegistration.removeHandler();
resizeHandlerRegistration = null;
}
popupPanel.hide();
}
public int getPopupLeft() {
return popupPanel.getPopupLeft();
}
public int getPopupTop() {
return popupPanel.getPopupTop();
}
public void setPopupPosition(int left, int top) {
popupPanel.setPopupPosition(left, top);
}
// 以下GWTCanvasより
public void arc(double x, double y, double radius, double startAngle, double endAngle,
boolean antiClockwise) {
canvas.arc(x, y, radius, startAngle, endAngle, antiClockwise);
}
public void beginPath() {
canvas.beginPath();
}
public void clear() {
canvas.clear();
}
public void closePath() {
canvas.closePath();
}
public CanvasGradient createLinearGradient(double x0, double y0, double x1, double y1) {
return canvas.createLinearGradient(x0, y0, x1, y1);
}
public CanvasGradient createRadialGradient(double x0, double y0, double r0, double x1,
double y1, double r1) {
return canvas.createRadialGradient(x0, y0, r0, x1, y1, r1);
}
public void cubicCurveTo(double cp1x, double cp1y, double cp2x, double cp2y, double x, double y) {
canvas.cubicCurveTo(cp1x, cp1y, cp2x, cp2y, x, y);
}
public void drawImage(ImageElement img, double offsetX, double offsetY) {
canvas.drawImage(img, offsetX, offsetY);
}
public void drawImage(ImageElement img, double offsetX, double offsetY, double width,
double height) {
canvas.drawImage(img, offsetX, offsetY, width, height);
}
public void drawImage(ImageElement img, double sourceX, double sourceY, double sourceWidth,
double sourceHeight, double destX, double destY, double destWidth, double destHeight) {
canvas.drawImage(img, sourceX, sourceY, sourceWidth, sourceHeight, destX, destY, destWidth,
destHeight);
}
public void fill() {
canvas.fill();
}
public void fillRect(double startX, double startY, double width, double height) {
canvas.fillRect(startX, startY, width, height);
}
public int getCoordHeight() {
return canvas.getCoordHeight();
}
public int getCoordWidth() {
return canvas.getCoordWidth();
}
public double getGlobalAlpha() {
return canvas.getGlobalAlpha();
}
public String getGlobalCompositeOperation() {
return canvas.getGlobalCompositeOperation();
}
public String getLineCap() {
return canvas.getLineCap();
}
public String getLineJoin() {
return canvas.getLineJoin();
}
public double getLineWidth() {
return canvas.getLineWidth();
}
public double getMiterLimit() {
return canvas.getMiterLimit();
}
public void lineTo(double x, double y) {
canvas.lineTo(x, y);
}
public void moveTo(double x, double y) {
canvas.moveTo(x, y);
}
public void quadraticCurveTo(double cpx, double cpy, double x, double y) {
canvas.quadraticCurveTo(cpx, cpy, x, y);
}
public void rect(double startX, double startY, double width, double height) {
canvas.rect(startX, startY, width, height);
}
public void resize(int width, int height) {
this.width = width;
this.height = height;
canvas.resize(width, height);
}
public void restoreContext() {
canvas.restoreContext();
}
public void rotate(double angle) {
canvas.rotate(angle);
}
public void saveContext() {
canvas.saveContext();
}
public void scale(double x, double y) {
canvas.scale(x, y);
}
public void setBackgroundColor(Color color) {
canvas.setBackgroundColor(color);
}
public void setCoordHeight(int height) {
canvas.setCoordHeight(height);
}
public void setCoordSize(int width, int height) {
canvas.setCoordSize(width, height);
}
public void setCoordWidth(int width) {
canvas.setCoordWidth(width);
}
public void setFillStyle(CanvasGradient grad) {
canvas.setFillStyle(grad);
}
public void setFillStyle(Color color) {
canvas.setFillStyle(color);
}
public void setGlobalAlpha(double alpha) {
canvas.setGlobalAlpha(alpha);
}
public void setGlobalCompositeOperation(String globalCompositeOperation) {
canvas.setGlobalCompositeOperation(globalCompositeOperation);
}
public void setLineCap(String lineCap) {
canvas.setLineCap(lineCap);
}
public void setLineJoin(String lineJoin) {
canvas.setLineJoin(lineJoin);
}
public void setLineWidth(double width) {
canvas.setLineWidth(width);
}
public void setMiterLimit(double miterLimit) {
canvas.setMiterLimit(miterLimit);
}
public void setPixelHeight(int height) {
canvas.setPixelHeight(height);
}
public void setPixelWidth(int width) {
canvas.setPixelWidth(width);
}
public void setStrokeStyle(CanvasGradient grad) {
canvas.setStrokeStyle(grad);
}
public void setStrokeStyle(Color color) {
canvas.setStrokeStyle(color);
}
public void stroke() {
canvas.stroke();
}
public void strokeRect(double startX, double startY, double width, double height) {
canvas.strokeRect(startX, startY, width, height);
}
public void transform(double m11, double m12, double m21, double m22, double dx, double dy) {
canvas.transform(m11, m12, m21, m22, dx, dy);
}
public void translate(double x, double y) {
canvas.translate(x, y);
}
@Override
public void fireEvent(GwtEvent<?> event) {
canvas.fireEvent(event);
}
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
public HandlerRegistration addMouseDownHandler(MouseDownHandler handler) {
eventHandlers.put(handler, (DomEvent.Type) MouseDownEvent.getType());
if (canvas != null) {
canvas.addDomHandler(handler, MouseDownEvent.getType());
}
return null;
}
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
public HandlerRegistration addMouseUpHandler(MouseUpHandler handler) {
eventHandlers.put(handler, (DomEvent.Type) MouseUpEvent.getType());
if (canvas != null) {
canvas.addDomHandler(handler, MouseUpEvent.getType());
}
return null;
}
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
public HandlerRegistration addMouseOutHandler(MouseOutHandler handler) {
eventHandlers.put(handler, (DomEvent.Type) MouseOutEvent.getType());
if (canvas != null) {
canvas.addDomHandler(handler, MouseOutEvent.getType());
}
return null;
}
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
public HandlerRegistration addMouseOverHandler(MouseOverHandler handler) {
eventHandlers.put(handler, (DomEvent.Type) MouseOverEvent.getType());
if (canvas != null) {
canvas.addDomHandler(handler, MouseOverEvent.getType());
}
return null;
}
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
public HandlerRegistration addMouseMoveHandler(MouseMoveHandler handler) {
eventHandlers.put(handler, (DomEvent.Type) MouseMoveEvent.getType());
if (canvas != null) {
canvas.addDomHandler(handler, MouseMoveEvent.getType());
}
return null;
}
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
public HandlerRegistration addMouseWheelHandler(MouseWheelHandler handler) {
eventHandlers.put(handler, (DomEvent.Type) MouseWheelEvent.getType());
if (canvas != null) {
canvas.addDomHandler(handler, MouseWheelEvent.getType());
}
return null;
}
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
public HandlerRegistration addClickHandler(ClickHandler handler) {
eventHandlers.put(handler, (DomEvent.Type) ClickEvent.getType());
if (canvas != null) {
canvas.addDomHandler(handler, ClickEvent.getType());
}
return null;
}
}