package prefuse.action.animate; import java.util.Iterator; import prefuse.action.ItemAction; import prefuse.action.layout.AxisLabelLayout; import prefuse.data.tuple.TupleSet; import prefuse.util.ColorLib; import prefuse.visual.VisualItem; import prefuse.visual.expression.StartVisiblePredicate; /** * Animator that interpolates positions, colors, and visibility status for * metric axes. * * @author <a href="http://jheer.org">jeffrey heer</a> * @see prefuse.action.layout.AxisLabelLayout */ public class AxisLabelAnimator extends ItemAction { /** * Create a new AxisLabelAnimator. */ protected AxisLabelAnimator() { super(); } /** * Create a new AxisLabelAnimator for the given data group. * @param group the data group to process */ public AxisLabelAnimator(String group) { super(group); } /** * @see prefuse.action.GroupAction#run(double) */ public void run(double frac) { if ( frac == 0.0 ) { setup(); } else if ( frac == 1.0 ) { finish(); } else { super.run(frac); } TupleSet ts = m_vis.getGroup(m_group); ts.putClientProperty(AxisLabelLayout.FRAC, new Double(frac)); } private void setup() { // handle fade-in nodes Iterator items = m_vis.visibleItems(m_group); while ( items.hasNext() ) { VisualItem item = (VisualItem) items.next(); if ( !item.isStartVisible() ) { int efc = item.getEndFillColor(); int esc = item.getEndStrokeColor(); int etc = item.getEndTextColor(); item.setStartFillColor(ColorLib.setAlpha(efc,0)); item.setStartStrokeColor(ColorLib.setAlpha(esc,0)); item.setStartTextColor(ColorLib.setAlpha(etc,0)); item.setStartVisible(true); } process(item, 0.0); } // handle fade-out nodes items = m_vis.items(m_group, StartVisiblePredicate.TRUE); while ( items.hasNext() ) { VisualItem item = (VisualItem) items.next(); if ( !item.isEndVisible() ) { int sfc = item.getStartFillColor(); int ssc = item.getStartStrokeColor(); int stc = item.getStartTextColor(); item.setEndFillColor(ColorLib.setAlpha(sfc,0)); item.setEndStrokeColor(ColorLib.setAlpha(ssc,0)); item.setEndTextColor(ColorLib.setAlpha(stc,0)); item.setVisible(true); process(item, 0.0); } } } private void finish() { // set faded-out nodes to permanently invisible Iterator items = m_vis.items(m_group, StartVisiblePredicate.TRUE); while ( items.hasNext() ) { VisualItem item = (VisualItem) items.next(); if ( !item.isEndVisible() ) { item.setVisible(false); item.setStartVisible(false); } } // set faded-in nodes to permanently visible items = m_vis.visibleItems(m_group); while ( items.hasNext() ) { VisualItem item = (VisualItem) items.next(); process(item, 1.0); item.setStartFillColor(item.getEndFillColor()); item.setStartTextColor(item.getEndTextColor()); item.setStartStrokeColor(item.getEndStrokeColor()); } } /** * @see prefuse.action.ItemAction#process(prefuse.visual.VisualItem, double) */ public void process(VisualItem item, double frac) { double v = item.getStartX(); item.setX(v + frac*(item.getEndX()-v)); v = item.getStartY(); item.setY(v + frac*(item.getEndY()-v)); v = item.getDouble(VisualItem.STARTX2); v = v + frac*(item.getDouble(VisualItem.ENDX2)-v); item.setDouble(VisualItem.X2, v); v = item.getDouble(VisualItem.STARTY2); v = v + frac*(item.getDouble(VisualItem.ENDY2)-v); item.setDouble(VisualItem.Y2, v); int c = ColorLib.interp(item.getStartStrokeColor(), item.getEndStrokeColor(), frac); item.setStrokeColor(c); int tc = ColorLib.interp(item.getStartTextColor(), item.getEndTextColor(), frac); item.setTextColor(tc); int fc = ColorLib.interp(item.getStartFillColor(), item.getEndFillColor(), frac); item.setFillColor(fc); } } // end of class AxisLabelAnimator