package prefuse.controls;
import java.awt.event.MouseEvent;
import java.util.Iterator;
import prefuse.visual.EdgeItem;
import prefuse.visual.NodeItem;
import prefuse.visual.VisualItem;
/**
* <p>
* A ControlListener that sets the highlighted status (using the
* {@link prefuse.visual.VisualItem#setHighlighted(boolean)
* VisualItem.setHighlighted} method) for nodes neighboring the node
* currently under the mouse pointer. The highlight flag might then be used
* by a color function to change node appearance as desired.
* </p>
*
* @author <a href="http://jheer.org">jeffrey heer</a>
*/
public class NeighborHighlightControl extends ControlAdapter {
private String activity = null;
private boolean highlightWithInvisibleEdge = false;
/**
* Creates a new highlight control.
*/
public NeighborHighlightControl() {
this(null);
}
/**
* Creates a new highlight control that runs the given activity
* whenever the neighbor highlight changes.
* @param activity the update Activity to run
*/
public NeighborHighlightControl(String activity) {
this.activity = activity;
}
/**
* @see prefuse.controls.Control#itemEntered(prefuse.visual.VisualItem, java.awt.event.MouseEvent)
*/
public void itemEntered(VisualItem item, MouseEvent e) {
if ( item instanceof NodeItem )
setNeighborHighlight((NodeItem)item, true);
}
/**
* @see prefuse.controls.Control#itemExited(prefuse.visual.VisualItem, java.awt.event.MouseEvent)
*/
public void itemExited(VisualItem item, MouseEvent e) {
if ( item instanceof NodeItem )
setNeighborHighlight((NodeItem)item, false);
}
/**
* Set the highlighted state of the neighbors of a node.
* @param n the node under consideration
* @param state the highlighting state to apply to neighbors
*/
protected void setNeighborHighlight(NodeItem n, boolean state) {
Iterator iter = n.edges();
while ( iter.hasNext() ) {
EdgeItem eitem = (EdgeItem)iter.next();
NodeItem nitem = eitem.getAdjacentItem(n);
if (eitem.isVisible() || highlightWithInvisibleEdge) {
eitem.setHighlighted(state);
nitem.setHighlighted(state);
}
}
if ( activity != null )
n.getVisualization().run(activity);
}
/**
* Indicates if neighbor nodes with edges currently not visible still
* get highlighted.
* @return true if neighbors with invisible edges still get highlighted,
* false otherwise.
*/
public boolean isHighlightWithInvisibleEdge() {
return highlightWithInvisibleEdge;
}
/**
* Determines if neighbor nodes with edges currently not visible still
* get highlighted.
* @param highlightWithInvisibleEdge assign true if neighbors with invisible
* edges should still get highlighted, false otherwise.
*/
public void setHighlightWithInvisibleEdge(boolean highlightWithInvisibleEdge) {
this.highlightWithInvisibleEdge = highlightWithInvisibleEdge;
}
} // end of class NeighborHighlightControl