/* * Copyright 2015 JBoss, by Red Hat, 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 org.uberfire.client.docks.view; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Document; import com.google.gwt.dom.client.Element; import com.google.gwt.dom.client.Style; 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.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.user.client.Event; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.FlowPanel; import org.uberfire.client.resources.WebAppResource; import org.uberfire.client.workbench.docks.UberfireDockPosition; import org.uberfire.mvp.ParameterizedCommand; public class DockResizeBar extends FlowPanel { private static WebAppResource CSS = GWT.create(WebAppResource.class); private Element glassElem = null; private boolean mouseDown; private double offset; private ParameterizedCommand<Double> resizeCommand; private DocksBar docksBar; public DockResizeBar(final DocksBar docksBar) { super(); this.docksBar = docksBar; sinkEvents(Event.ONMOUSEDOWN | Event.ONMOUSEUP | Event.ONMOUSEMOVE | Event.ONDBLCLICK); getElement().addClassName(CSS.CSS().resizableBar()); setupGlassElement(); setupMouseHandlers(docksBar); } public void setup(ParameterizedCommand<Double> resizeCommand) { this.resizeCommand = resizeCommand; } private void setupMouseHandlers(final DocksBar docksBar) { addDomHandler(new MouseMoveHandler() { @Override public void onMouseMove(MouseMoveEvent event) { if (mouseDown) { setupMoveIcon(); resizeCommand.execute(calculateDockSize(event, docksBar)); event.preventDefault(); } } }, MouseMoveEvent.getType()); addDomHandler(new MouseOverHandler() { @Override public void onMouseOver(MouseOverEvent event) { setupMoveIcon(); } }, MouseOverEvent.getType()); addDomHandler(new MouseDownHandler() { @Override public void onMouseDown(MouseDownEvent event) { setupMoveIcon(); mouseDown = true; int width = Math.max(Window.getClientWidth(), Document.get().getScrollWidth()); int height = Math.max(Window.getClientHeight(), Document.get().getScrollHeight()); glassElem.getStyle().setHeight(height, Style.Unit.PX); glassElem.getStyle().setWidth(width, Style.Unit.PX); Document.get().getBody().appendChild(glassElem); buildOffset(event); Event.setCapture(getElement()); event.preventDefault(); } }, MouseDownEvent.getType()); addDomHandler(new MouseUpHandler() { @Override public void onMouseUp(MouseUpEvent event) { getElement().getStyle().setProperty("cursor", "default"); mouseDown = false; glassElem.removeFromParent(); Event.releaseCapture(getElement()); } }, MouseUpEvent.getType()); } private void setupGlassElement() { //This is a special div to prevent select elements in parent widgets during resize glassElem = Document.get().createDivElement(); glassElem.getStyle().setPosition(Style.Position.ABSOLUTE); glassElem.getStyle().setTop(0, Style.Unit.PX); glassElem.getStyle().setLeft(0, Style.Unit.PX); glassElem.getStyle().setMargin(0, Style.Unit.PX); glassElem.getStyle().setPadding(0, Style.Unit.PX); glassElem.getStyle().setBorderWidth(0, Style.Unit.PX); glassElem.getStyle().setProperty("background", "white"); glassElem.getStyle().setProperty("backgroundColor", "red"); glassElem.getStyle().setOpacity(0.0); } private void setupMoveIcon() { UberfireDockPosition position = docksBar.getPosition(); if (position == UberfireDockPosition.SOUTH) { getElement().getStyle().setProperty("cursor", "ns-resize"); } else { getElement().getStyle().setProperty("cursor", "ew-resize"); } } private double calculateDockSize(MouseMoveEvent event, DocksBar docksBar) { UberfireDockPosition position = docksBar.getPosition(); if (position == UberfireDockPosition.WEST) { return docksBar.getExpandedBarSize() + (event.getClientX() - getAbsoluteLeft()); } if (position == UberfireDockPosition.EAST) { return docksBar.getExpandedBarSize() + (getAbsoluteLeft() - event.getClientX()); } if (position == UberfireDockPosition.SOUTH) { return docksBar.getExpandedBarSize() + (getAbsoluteTop() - event.getClientY()); } return docksBar.getExpandedBarSize(); } private void buildOffset(MouseDownEvent event) { offset = event.getClientX() - getAbsoluteLeft(); } }