/* * Copyright 2011 Red Hat, Inc. and/or its affiliates. * * 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.ext.wires.core.grids.client.widget.layer.pinning.impl; import com.ait.lienzo.client.core.event.NodeMouseDownEvent; import com.ait.lienzo.client.core.event.NodeMouseMoveEvent; import com.ait.lienzo.client.core.event.NodeMouseOutEvent; import com.ait.lienzo.client.core.event.NodeMouseUpEvent; import com.ait.lienzo.client.core.mediator.AbstractMediator; import com.ait.lienzo.client.core.mediator.IEventFilter; import com.ait.lienzo.client.core.shape.Viewport; import com.ait.lienzo.client.core.types.Point2D; import com.ait.lienzo.client.core.types.Transform; import com.google.gwt.dom.client.Style; import com.google.gwt.event.shared.GwtEvent; import org.uberfire.ext.wires.core.grids.client.widget.layer.GridLayer; import org.uberfire.ext.wires.core.grids.client.widget.layer.pinning.TransformMediator; /** * This a fork of {@link com.ait.lienzo.client.core.mediator.MousePanMediator} however this implementation does not * stop the propagation of NodeMouseEvents to other listeners. Lienzo's implementation causes other NodeMouseMoveHandler, * NodeMouseDownHandler and NodeMouseUpHandler to miss receipt of Events. This implementation also restricts * transformations according to a {@link TransformMediator}. */ public class RestrictedMousePanMediator extends AbstractMediator { private final GridLayer gridLayer; private TransformMediator transformMediator; private Point2D m_last = new Point2D(); private boolean m_dragging = false; private Transform m_inverseTransform = null; public RestrictedMousePanMediator(final GridLayer gridLayer) { this.gridLayer = gridLayer; } public boolean isDragging() { return m_dragging; } public TransformMediator getTransformMediator() { return this.transformMediator; } public void setTransformMediator(final TransformMediator transformMediator) { this.transformMediator = transformMediator; } @Override public void cancel() { m_dragging = false; setCursor(Style.Cursor.DEFAULT); } protected void setCursor(final Style.Cursor cursor) { final Viewport viewport = gridLayer.getViewport(); viewport.getElement().getStyle().setCursor(cursor); } @Override public boolean handleEvent(final GwtEvent<?> event) { if (event.getAssociatedType() == NodeMouseMoveEvent.getType()) { if (m_dragging) { onMouseMove((NodeMouseMoveEvent) event); } return false; } else if (event.getAssociatedType() == NodeMouseDownEvent.getType()) { final IEventFilter filter = getEventFilter(); if ((null == filter) || (false == filter.isEnabled()) || (filter.test(event))) { onMouseDown((NodeMouseDownEvent) event); } return false; } else if (event.getAssociatedType() == NodeMouseUpEvent.getType()) { if (m_dragging) { onMouseUp((NodeMouseUpEvent) event); } } else if (event.getAssociatedType() == NodeMouseOutEvent.getType()) { cancel(); } return false; } protected void onMouseDown(final NodeMouseDownEvent event) { m_last = new Point2D(event.getX(), event.getY()); m_dragging = true; Transform transform = getTransform(); if (transform == null) { setTransform(transform = new Transform()); } m_inverseTransform = transform.getInverse(); m_inverseTransform.transform(m_last, m_last); setCursor(Style.Cursor.MOVE); } protected void onMouseMove(final NodeMouseMoveEvent event) { final Point2D curr = new Point2D(event.getX(), event.getY()); m_inverseTransform.transform(curr, curr); double deltaX = curr.getX() - m_last.getX(); double deltaY = curr.getY() - m_last.getY(); Transform newTransform = getTransform().copy().translate(deltaX, deltaY); if (transformMediator != null) { newTransform = transformMediator.adjust(newTransform, gridLayer.getVisibleBounds()); } setTransform(newTransform); m_last = curr; if (isBatchDraw()) { getViewport().getScene().batch(); } else { getViewport().getScene().draw(); } } protected void onMouseUp(final NodeMouseUpEvent event) { cancel(); } }