/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package com.eas.window; import com.google.gwt.dom.client.Document; import com.google.gwt.dom.client.Element; import com.google.gwt.event.dom.client.MouseDownEvent; import com.google.gwt.event.dom.client.MouseDownHandler; import com.google.gwt.event.dom.client.MouseEvent; import com.google.gwt.event.dom.client.MouseMoveEvent; import com.google.gwt.event.dom.client.MouseMoveHandler; import com.google.gwt.event.dom.client.MouseUpEvent; import com.google.gwt.event.dom.client.MouseUpHandler; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.ui.Widget; /** * * @author mg */ public abstract class DraggableDecoration extends Widget { protected int mouseScreenX; protected int mouseScreenY; protected double targetScrollLeft; protected double targetScrollTop; protected double targetWidth; protected double targetHeight; public DraggableDecoration(String... aClasses) { super(); Element e = Document.get().createDivElement(); setElement(e); for (String className : aClasses) { e.addClassName(className); } addDomHandler(new MouseDownHandler() { @Override public void onMouseDown(MouseDownEvent event) { DOM.setCapture(getElement()); event.preventDefault(); event.stopPropagation(); mouseScreenX = event.getScreenX(); mouseScreenY = event.getScreenY(); event.stopPropagation(); Widget target = getMovableTarget(); assert target != null : "movable target widget must present to accept position changes"; String tLeft = target.getElement().getStyle().getLeft(); targetScrollLeft = Double.parseDouble(tLeft.substring(0, tLeft.length() - 2)); String tTop = target.getElement().getStyle().getTop(); targetScrollTop = Double.parseDouble(tTop.substring(0, tTop.length() - 2)); target = getResizableTarget(); assert target != null : "resizable target widget must present to accept size changes"; String tWidth = target.getElement().getStyle().getWidth(); targetWidth = Double.parseDouble(tWidth.substring(0, tWidth.length() - 2)); String tHeight = target.getElement().getStyle().getHeight(); targetHeight = Double.parseDouble(tHeight.substring(0, tHeight.length() - 2)); mousePressed(); } }, MouseDownEvent.getType()); addDomHandler(new MouseUpHandler() { @Override public void onMouseUp(MouseUpEvent event) { event.preventDefault(); event.stopPropagation(); if (DOM.getCaptureElement() == getElement()) { DOM.releaseCapture(getElement()); int dx = event.getScreenX() - mouseScreenX; int dy = event.getScreenY() - mouseScreenY; changeTarget(getMovableTarget(), getResizableTarget(), dx, dy, event); } mouseReleased(); } }, MouseUpEvent.getType()); addDomHandler(new MouseMoveHandler() { @Override public void onMouseMove(MouseMoveEvent event) { if (DOM.getCaptureElement() == getElement()) { int dx = event.getScreenX() - mouseScreenX; int dy = event.getScreenY() - mouseScreenY; event.preventDefault(); event.stopPropagation(); if (dx != 0 || dy != 0) { mouseDragged(); } changeTarget(getMovableTarget(), getResizableTarget(), dx, dy, event); } } }, MouseMoveEvent.getType()); } public void assignMouseState(DraggableDecoration s) { mouseScreenX = s.mouseScreenX; mouseScreenY = s.mouseScreenY; targetScrollLeft = s.targetScrollLeft; targetScrollTop = s.targetScrollTop; targetWidth = s.targetWidth; targetHeight = s.targetHeight; } protected abstract void mousePressed(); protected abstract void mouseReleased(); protected abstract void mouseDragged(); protected abstract Widget getMovableTarget(); protected abstract Widget getResizableTarget(); protected abstract boolean changeTarget(Widget aMovableTarget, Widget aResizableTarget, int dx, int dy, MouseEvent<?> aEvent); @Override public void onAttach() { super.onAttach(); } @Override public void onDetach() { super.onDetach(); } }