/*
* Copyright 2007 - 2017 the original author or authors.
*
* 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 net.sf.jailer.ui.graphical_view;
import java.awt.Shape;
import java.awt.event.MouseEvent;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import prefuse.Display;
import prefuse.controls.AbstractZoomControl;
import prefuse.util.ColorLib;
import prefuse.util.display.DisplayLib;
import prefuse.util.ui.UILib;
import prefuse.visual.VisualItem;
/**
* Zoom control for model view.
*
* @author Ralf Wisser
*/
public class ZoomBoxControl extends AbstractZoomControl {
/**
* Label of Zoom-box item.
*/
public static final String BOX_ITEM_LABEL = "$ZOOMBOX";
/**
* The renderer for the zoom box.
*/
private ZoomBoxRenderer zoomBoxRenderer;
/**
* Zoom drag box as visual item.
*/
private VisualItem boxItem;
/**
* Point at which dragging was started.
*/
private Point2D down = null;
/**
* Current mouse position.
*/
private Point2D current = null;
/**
* Mouse button to be used for zooming.
*/
private int button = RIGHT_MOUSE_BUTTON;
/**
* Constructor.
*
* @param visualGraph the visual model graph
*/
public ZoomBoxControl() {
zoomBoxRenderer = new ZoomBoxRenderer();
}
/**
* @see java.awt.event.MouseListener#mousePressed(java.awt.event.MouseEvent)
*/
public void mousePressed(MouseEvent e) {
if ( UILib.isButtonPressed(e, button) ) {
Display display = (Display)e.getComponent();
if (display.isTranformInProgress()) {
return;
}
down = new Point2D.Float();
current = null;
display.getAbsoluteCoordinate(e.getPoint(), down);
}
}
/**
* Overridden to hide zoom box if no mouse button is pressed.
*/
@Override
public void mouseMoved(MouseEvent e) {
if (!UILib.isButtonPressed(e, button) ) {
hideZoomBox();
}
}
/**
* @see java.awt.event.MouseMotionListener#mouseDragged(java.awt.event.MouseEvent)
*/
public void mouseDragged(MouseEvent e) {
if (UILib.isButtonPressed(e, button) ) {
Display display = (Display)e.getComponent();
if (display.isTranformInProgress() || down == null) {
hideZoomBox();
return;
}
current = new Point2D.Float();
display.getAbsoluteCoordinate(e.getPoint(), current);
if (boxItem != null) {
boxItem.setVisible(true);
boxItem.setValidated(false);
boxItem.getVisualization().repaint();
}
}
}
/**
* Hides zoom box.
*/
private void hideZoomBox() {
if (down != null || current != null) {
down = null;
current = null;
if (boxItem != null) {
boxItem.setValidated(false);
boxItem.getVisualization().repaint();
}
}
}
/**
* @see java.awt.event.MouseListener#mouseReleased(java.awt.event.MouseEvent)
*/
public void mouseReleased(MouseEvent e) {
if ( UILib.isButtonPressed(e, button) ) {
if (down != null && current != null) {
Display display = (Display)e.getComponent();
DisplayLib.fitViewToBounds(display, getZoomBoxBounds(200), 500);
}
hideZoomBox();
}
}
/**
* @see prefuse.controls.Control#itemPressed(prefuse.visual.VisualItem, java.awt.event.MouseEvent)
*/
public void itemPressed(VisualItem item, MouseEvent e) {
if ( m_zoomOverItem )
mousePressed(e);
}
/**
* @see prefuse.controls.Control#itemDragged(prefuse.visual.VisualItem, java.awt.event.MouseEvent)
*/
public void itemDragged(VisualItem item, MouseEvent e) {
if ( m_zoomOverItem )
mouseDragged(e);
}
/**
* @see prefuse.controls.Control#itemReleased(prefuse.visual.VisualItem, java.awt.event.MouseEvent)
*/
public void itemReleased(VisualItem item, MouseEvent e) {
if ( m_zoomOverItem )
mouseReleased(e);
}
/**
* Gets bounding rectangle of zoom box.
*
* @return bounding rectangle of zoom box
*/
private Rectangle2D getZoomBoxBounds(double minWidth) {
Rectangle2D bounds = new Rectangle2D.Double();
if (down == null || current == null) {
bounds.setRect(0, 0, 0, 0);
} else {
bounds.setRect(Math.min(down.getX(), current.getX()), Math.min(down.getY(), current.getY()), Math.max(minWidth, Math.abs(down.getX() - current.getX())), Math.max(minWidth, Math.abs(down.getY() - current.getY())));
}
return bounds;
}
/**
* Gets the renderer for the zoom box.
*
* @return the renderer for the zoom box
*/
public ZoomBoxRenderer getRenderer() {
return zoomBoxRenderer;
}
/**
* Renders the zoom box.
*/
public class ZoomBoxRenderer extends prefuse.render.ShapeRenderer {
public boolean locatePoint(Point2D p, VisualItem item) {
return false;
}
protected Shape getRawShape(VisualItem item) {
Rectangle2D bounds = getZoomBoxBounds(1);
return rectangle(bounds.getX(), bounds.getY(), bounds.getWidth(), bounds.getHeight());
}
public void setBounds(VisualItem item) {
Rectangle2D bounds = getZoomBoxBounds(1);
item.setBounds(bounds.getX(), bounds.getY(), bounds.getWidth(), bounds.getHeight());
}
public boolean isBoxItem(VisualItem item) {
if (BOX_ITEM_LABEL.equals(item.getString("label"))) {
boxItem = item;
item.setFillColor(ColorLib.rgba(150, 150, 255, 100));
return true;
}
return false;
}
}
}