package edu.washington.cs.oneswarm.ui.gwt.client.newui.utils; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.RootPanel; import com.google.gwt.user.client.DOM; import com.google.gwt.dom.client.Element; import com.google.gwt.user.client.Event; public class ResizablePanel extends VerticalPanel { private Element panelElement; private boolean moveIt = false; private List<ResizablePanelListener> listeners = new ArrayList<ResizablePanelListener>(); private boolean dragAndDrop = false; public ResizablePanel() { super(); DOM.sinkEvents(this.getElement(), Event.ONMOUSEDOWN | Event.ONMOUSEMOVE | Event.ONMOUSEUP | Event.ONMOUSEOVER); } @Override public void onBrowserEvent(Event event) { final int eventType = DOM.eventGetType(event); if (Event.ONMOUSEOVER == eventType) { if (isCursorResize(event)) { DOM.setStyleAttribute(this.getElement(), "cursor", "se-resize"); } else if (isCursorMove(event)) { DOM.setStyleAttribute(this.getElement(), "cursor", "se-resize"); } else { DOM.setStyleAttribute(this.getElement(), "cursor", "default"); } } if (Event.ONMOUSEDOWN == eventType) { if (isCursorResize(event)) { if (dragAndDrop == false) { dragAndDrop = true; event.preventDefault(); DOM.setCapture(this.getElement()); } } else if (isCursorMove(event)) { DOM.setCapture(this.getElement()); moveIt = true; event.preventDefault(); } } else if (Event.ONMOUSEMOVE == eventType) { if (!isCursorResize(event) && !isCursorMove(event)) { DOM.setStyleAttribute(this.getElement(), "cursor", "default"); } if (dragAndDrop == true) { int absX = DOM.eventGetClientX(event); int absY = DOM.eventGetClientY(event); int originalX = DOM.getAbsoluteLeft(this.getElement()); int originalY = DOM.getAbsoluteTop(this.getElement()); if (absY > originalY && absX > originalX) { Integer height = absY - originalY + 2; this.setHeight(height + "px"); Integer width = absX - originalX + 2; this.setWidth(width + "px"); notify(width, height); } } else if (moveIt == true) { RootPanel.get().setWidgetPosition(this, DOM.eventGetClientX(event), DOM.eventGetClientY(event)); } } else if (Event.ONMOUSEUP == eventType) { if (moveIt == true) { moveIt = false; DOM.releaseCapture(this.getElement()); } if (dragAndDrop == true) { dragAndDrop = false; DOM.releaseCapture(this.getElement()); } } } protected boolean isCursorResize(Event event) { int cursorY = DOM.eventGetClientY(event); int initialY = this.getAbsoluteTop(); int height = this.getOffsetHeight(); int cursorX = DOM.eventGetClientX(event); int initialX = this.getAbsoluteLeft(); int width = this.getOffsetWidth(); if (((initialX + width - 10) < cursorX && cursorX <= (initialX + width)) && ((initialY + height - 10) < cursorY && cursorY <= (initialY + height))) return true; else return false; } public void setMovingPanelElement(Element movingPanelElement) { this.panelElement = movingPanelElement; } protected boolean isCursorMove(Event event) { if (panelElement != null) { int cursorY = DOM.eventGetClientY(event); int initialY = panelElement.getAbsoluteTop(); int cursorX = DOM.eventGetClientX(event); int initialX = panelElement.getAbsoluteLeft(); if (initialY <= cursorY && initialX <= cursorX) return true; else return false; } else return false; } public void addResizeListener(ResizablePanelListener listener) { listeners.add(listener); } private void notify(int width, int height) { for (ResizablePanelListener i : listeners) { i.resized(width, height); } } }