001: package prefuse.action.animate;
002:
003: import java.util.Iterator;
004:
005: import prefuse.action.GroupAction;
006: import prefuse.util.ColorLib;
007: import prefuse.visual.VisualItem;
008: import prefuse.visual.expression.StartVisiblePredicate;
009:
010: /**
011: * Animator that interpolates the visibility status of VisualItems. Items
012: * not currently visible but with end visibilty true are faded in, while
013: * items currently visible but with end visibility false are faded out and
014: * finally set to not visible.
015: *
016: * @author <a href="http://jheer.org">jeffrey heer</a>
017: */
018: public class VisibilityAnimator extends GroupAction {
019:
020: /**
021: * Create a new VisibilityAnimator that processes all data groups.
022: */
023: public VisibilityAnimator() {
024: super ();
025: }
026:
027: /**
028: * Create a new VisibilityAnimator that processes the specified group.
029: * @param group the data group to process.
030: */
031: public VisibilityAnimator(String group) {
032: super (group);
033: }
034:
035: /**
036: * @see prefuse.action.GroupAction#run(double)
037: */
038: public void run(double frac) {
039: if (frac == 0.0) {
040: setup();
041: } else if (frac == 1.0) {
042: finish();
043: }
044: }
045:
046: private void setup() {
047: // handle fade-in nodes
048: Iterator items = m_vis.visibleItems(m_group);
049: while (items.hasNext()) {
050: VisualItem item = (VisualItem) items.next();
051: if (!item.isStartVisible()) {
052: item.setStartFillColor(ColorLib.setAlpha(item
053: .getEndFillColor(), 0));
054: item.setStartStrokeColor(ColorLib.setAlpha(item
055: .getEndStrokeColor(), 0));
056: item.setStartTextColor(ColorLib.setAlpha(item
057: .getEndTextColor(), 0));
058: }
059: }
060:
061: // handle fade-out nodes
062: items = m_vis.items(m_group, StartVisiblePredicate.TRUE);
063: while (items.hasNext()) {
064: VisualItem item = (VisualItem) items.next();
065: if (!item.isEndVisible()) {
066: // fade-out case
067: item.setVisible(true);
068: item.setEndFillColor(ColorLib.setAlpha(item
069: .getStartFillColor(), 0));
070: item.setEndStrokeColor(ColorLib.setAlpha(item
071: .getStartStrokeColor(), 0));
072: item.setEndTextColor(ColorLib.setAlpha(item
073: .getStartTextColor(), 0));
074: }
075: }
076: }
077:
078: private void finish() {
079: // set faded-out nodes to permanently invisible
080: Iterator items = m_vis.items(m_group,
081: StartVisiblePredicate.TRUE);
082: while (items.hasNext()) {
083: VisualItem item = (VisualItem) items.next();
084: if (!item.isEndVisible()) {
085: item.setVisible(false);
086: item.setStartVisible(false);
087: }
088: }
089:
090: // set faded-in nodes to permanently visible
091: items = m_vis.visibleItems(m_group);
092: while (items.hasNext()) {
093: VisualItem item = (VisualItem) items.next();
094: if (!item.isStartVisible()) {
095: item.setStartVisible(true);
096: item.setStartFillColor(item.getEndFillColor());
097: item.setStartTextColor(item.getEndTextColor());
098: item.setStartStrokeColor(item.getEndStrokeColor());
099: }
100: }
101: }
102:
103: } // end of class VisibilityAnimator
|