package com.netifera.platform.ui.graphs;
import java.awt.Cursor;
import java.awt.event.MouseEvent;
import java.awt.geom.Point2D;
import java.util.Iterator;
import javax.swing.SwingUtilities;
import prefuse.Display;
import prefuse.controls.ControlAdapter;
import prefuse.visual.AggregateItem;
import prefuse.visual.VisualItem;
/**
* Interactive drag control that is "aggregate-aware"
*/
class AggregateDragControl extends ControlAdapter {
private VisualItem activeItem;
protected Point2D down = new Point2D.Double();
protected Point2D temp = new Point2D.Double();
protected boolean dragged;
/**
* Creates a new drag control that issues repaint requests as an item is
* dragged.
*/
public AggregateDragControl() {
}
/**
* @see prefuse.controls.Control#itemEntered(prefuse.visual.VisualItem,
* java.awt.event.MouseEvent)
*/
public void itemEntered(VisualItem item, MouseEvent e) {
Display d = (Display) e.getSource();
d.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
activeItem = item;
if (!(item instanceof AggregateItem))
setFixed(item, true);
}
/**
* @see prefuse.controls.Control#itemExited(prefuse.visual.VisualItem,
* java.awt.event.MouseEvent)
*/
public void itemExited(VisualItem item, MouseEvent e) {
if (activeItem == item) {
activeItem = null;
setFixed(item, false);
}
Display d = (Display) e.getSource();
d.setCursor(Cursor.getDefaultCursor());
}
/**
* @see prefuse.controls.Control#itemPressed(prefuse.visual.VisualItem,
* java.awt.event.MouseEvent)
*/
public void itemPressed(VisualItem item, MouseEvent e) {
if (!SwingUtilities.isLeftMouseButton(e))
return;
dragged = false;
Display d = (Display) e.getComponent();
d.getAbsoluteCoordinate(e.getPoint(), down);
if (item instanceof AggregateItem)
setFixed(item, true);
}
/**
* @see prefuse.controls.Control#itemReleased(prefuse.visual.VisualItem,
* java.awt.event.MouseEvent)
*/
public void itemReleased(VisualItem item, MouseEvent e) {
if (!SwingUtilities.isLeftMouseButton(e))
return;
if (dragged) {
activeItem = null;
setFixed(item, false);
dragged = false;
}
}
/**
* @see prefuse.controls.Control#itemDragged(prefuse.visual.VisualItem,
* java.awt.event.MouseEvent)
*/
public void itemDragged(VisualItem item, MouseEvent e) {
if (!SwingUtilities.isLeftMouseButton(e))
return;
dragged = true;
Display d = (Display) e.getComponent();
d.getAbsoluteCoordinate(e.getPoint(), temp);
double dx = temp.getX() - down.getX();
double dy = temp.getY() - down.getY();
move(item, dx, dy);
down.setLocation(temp);
}
protected/* static */void setFixed(VisualItem item, boolean fixed) {
if (item instanceof AggregateItem) {
Iterator<?> items = ((AggregateItem) item).items();
while (items.hasNext()) {
setFixed((VisualItem) items.next(), fixed);
}
} else {
item.setFixed(fixed);
}
}
protected/* static */void move(VisualItem item, double dx, double dy) {
if (item instanceof AggregateItem) {
Iterator<?> items = ((AggregateItem) item).items();
while (items.hasNext()) {
move((VisualItem) items.next(), dx, dy);
}
} else {
double x = item.getX();
double y = item.getY();
item.setStartX(x);
item.setStartY(y);
item.setX(x + dx);
item.setY(y + dy);
item.setEndX(x + dx);
item.setEndY(y + dy);
}
}
}