001: package prefuse.action.animate;
002:
003: import java.util.Iterator;
004:
005: import prefuse.action.ItemAction;
006: import prefuse.action.layout.AxisLabelLayout;
007: import prefuse.data.tuple.TupleSet;
008: import prefuse.util.ColorLib;
009: import prefuse.visual.VisualItem;
010: import prefuse.visual.expression.StartVisiblePredicate;
011:
012: /**
013: * Animator that interpolates positions, colors, and visibility status for
014: * metric axes.
015: *
016: * @author <a href="http://jheer.org">jeffrey heer</a>
017: * @see prefuse.action.layout.AxisLabelLayout
018: */
019: public class AxisLabelAnimator extends ItemAction {
020:
021: /**
022: * Create a new AxisLabelAnimator.
023: */
024: protected AxisLabelAnimator() {
025: super ();
026: }
027:
028: /**
029: * Create a new AxisLabelAnimator for the given data group.
030: * @param group the data group to process
031: */
032: public AxisLabelAnimator(String group) {
033: super (group);
034: }
035:
036: /**
037: * @see prefuse.action.GroupAction#run(double)
038: */
039: public void run(double frac) {
040: if (frac == 0.0) {
041: setup();
042: } else if (frac == 1.0) {
043: finish();
044: } else {
045: super .run(frac);
046: }
047: TupleSet ts = m_vis.getGroup(m_group);
048: ts.putClientProperty(AxisLabelLayout.FRAC, new Double(frac));
049: }
050:
051: private void setup() {
052: // handle fade-in nodes
053: Iterator items = m_vis.visibleItems(m_group);
054: while (items.hasNext()) {
055: VisualItem item = (VisualItem) items.next();
056: if (!item.isStartVisible()) {
057: int efc = item.getEndFillColor();
058: int esc = item.getEndStrokeColor();
059: int etc = item.getEndTextColor();
060: item.setStartFillColor(ColorLib.setAlpha(efc, 0));
061: item.setStartStrokeColor(ColorLib.setAlpha(esc, 0));
062: item.setStartTextColor(ColorLib.setAlpha(etc, 0));
063: item.setStartVisible(true);
064: }
065: process(item, 0.0);
066: }
067:
068: // handle fade-out nodes
069: items = m_vis.items(m_group, StartVisiblePredicate.TRUE);
070: while (items.hasNext()) {
071: VisualItem item = (VisualItem) items.next();
072: if (!item.isEndVisible()) {
073: int sfc = item.getStartFillColor();
074: int ssc = item.getStartStrokeColor();
075: int stc = item.getStartTextColor();
076: item.setEndFillColor(ColorLib.setAlpha(sfc, 0));
077: item.setEndStrokeColor(ColorLib.setAlpha(ssc, 0));
078: item.setEndTextColor(ColorLib.setAlpha(stc, 0));
079: item.setVisible(true);
080: process(item, 0.0);
081: }
082: }
083: }
084:
085: private void finish() {
086: // set faded-out nodes to permanently invisible
087: Iterator items = m_vis.items(m_group,
088: StartVisiblePredicate.TRUE);
089: while (items.hasNext()) {
090: VisualItem item = (VisualItem) items.next();
091: if (!item.isEndVisible()) {
092: item.setVisible(false);
093: item.setStartVisible(false);
094: }
095: }
096:
097: // set faded-in nodes to permanently visible
098: items = m_vis.visibleItems(m_group);
099: while (items.hasNext()) {
100: VisualItem item = (VisualItem) items.next();
101: process(item, 1.0);
102: item.setStartFillColor(item.getEndFillColor());
103: item.setStartTextColor(item.getEndTextColor());
104: item.setStartStrokeColor(item.getEndStrokeColor());
105: }
106: }
107:
108: /**
109: * @see prefuse.action.ItemAction#process(prefuse.visual.VisualItem, double)
110: */
111: public void process(VisualItem item, double frac) {
112: double v = item.getStartX();
113: item.setX(v + frac * (item.getEndX() - v));
114: v = item.getStartY();
115: item.setY(v + frac * (item.getEndY() - v));
116: v = item.getDouble(VisualItem.STARTX2);
117: v = v + frac * (item.getDouble(VisualItem.ENDX2) - v);
118: item.setDouble(VisualItem.X2, v);
119: v = item.getDouble(VisualItem.STARTY2);
120: v = v + frac * (item.getDouble(VisualItem.ENDY2) - v);
121: item.setDouble(VisualItem.Y2, v);
122:
123: int c = ColorLib.interp(item.getStartStrokeColor(), item
124: .getEndStrokeColor(), frac);
125: item.setStrokeColor(c);
126:
127: int tc = ColorLib.interp(item.getStartTextColor(), item
128: .getEndTextColor(), frac);
129: item.setTextColor(tc);
130:
131: int fc = ColorLib.interp(item.getStartFillColor(), item
132: .getEndFillColor(), frac);
133: item.setFillColor(fc);
134: }
135:
136: } // end of class AxisLabelAnimator
|