package prefuse.action.assignment;
import java.awt.Font;
import java.util.logging.Logger;
import prefuse.action.EncoderAction;
import prefuse.data.expression.Predicate;
import prefuse.data.expression.parser.ExpressionParser;
import prefuse.util.FontLib;
import prefuse.visual.VisualItem;
/**
* <p>Assignment Action that assigns font values to VisualItems.
* By default, a FontAction simply sets each VisualItem to use a default
* 10 point sans-serif font (10 point sans-serif). Clients can change this
* default value to achieve uniform font assignment, or can add any number
* of additional rules for font assignment.
* Rules are specified by a Predicate instance which, if returning true, will
* trigger that rule, causing either the provided font value or the result of
* a delegate FontAction to be applied. Rules are evaluated in the order in
* which they are added to the FontAction, so earlier rules will have
* precedence over rules added later.
* </p>
*
* <p>In addition, subclasses can simply override {@link #getFont(VisualItem)}
* to achieve custom font assignment. In some cases, this may be the simplest
* or most flexible approach.</p>
*
* @author <a href="http://jheer.org">jeffrey heer</a>
*/
public class FontAction extends EncoderAction {
protected Font defaultFont = FontLib.getFont("SansSerif",Font.PLAIN,10);
/**
* Create a new FontAction that processes all data groups.
*/
public FontAction() {
super();
}
/**
* Create a new FontAction that processes the specified group.
* @param group the data group to process
*/
public FontAction(String group) {
super(group);
}
/**
* Create a new FontAction that processes the specified group.
* @param group the data group to process
* @param defaultFont the default Font to assign
*/
public FontAction(String group, Font defaultFont) {
super(group);
this.defaultFont = defaultFont;
}
// ------------------------------------------------------------------------
/**
* Set the default font to be assigned to items. Items will be assigned
* the default font if they do not match any registered rules.
* @param f the default font to use
*/
public void setDefaultFont(Font f) {
defaultFont = f;
}
/**
* Get the default font assigned to items.
* @return the default font
*/
public Font getDefaultFont() {
return defaultFont;
}
/**
* Add a font mapping rule to this FontAction. VisualItems that match
* the provided predicate will be assigned the given font value (assuming
* they do not match an earlier rule).
* @param p the rule Predicate
* @param font the font
*/
public void add(Predicate p, Font font) {
super.add(p, font);
}
/**
* Add a font mapping rule to this FontAction. VisualItems that match
* the provided expression will be assigned the given font value (assuming
* they do not match an earlier rule). The provided expression String will
* be parsed to generate the needed rule Predicate.
* @param expr the expression String, should parse to a Predicate.
* @param font the font
* @throws RuntimeException if the expression does not parse correctly or
* does not result in a Predicate instance.
*/
public void add(String expr, Font font) {
Predicate p = (Predicate)ExpressionParser.parse(expr);
super.add(p, font);
}
/**
* Add a font mapping rule to this FontAction. VisualItems that match
* the provided predicate will be assigned the font value returned by
* the given FontAction's getFont() method.
* @param p the rule Predicate
* @param f the delegate FontAction to use
*/
public void add(Predicate p, FontAction f) {
super.add(p, f);
}
/**
* Add a font mapping rule to this FontAction. VisualItems that match
* the provided expression will be assigned the given font value (assuming
* they do not match an earlier rule). The provided expression String will
* be parsed to generate the needed rule Predicate.
* @param expr the expression String, should parse to a Predicate.
* @param f the delegate FontAction to use
* @throws RuntimeException if the expression does not parse correctly or
* does not result in a Predicate instance.
*/
public void add(String expr, FontAction f) {
Predicate p = (Predicate)ExpressionParser.parse(expr);
super.add(p, f);
}
// ------------------------------------------------------------------------
/**
* @see prefuse.action.ItemAction#process(prefuse.visual.VisualItem, double)
*/
public void process(VisualItem item, double frac) {
Font f = getFont(item);
Font o = item.getFont();
item.setStartFont(o);
item.setEndFont(f);
item.setFont(f);
}
/**
* Returns the Font to use for a given VisualItem. Subclasses should
* override this method to perform customized font assignment.
* @param item the VisualItem for which to get the Font
* @return the Font for the given item
*/
public Font getFont(VisualItem item) {
Object o = lookup(item);
if ( o != null ) {
if ( o instanceof FontAction ) {
return ((FontAction)o).getFont(item);
} else if ( o instanceof Font ) {
return (Font)o;
} else {
Logger.getLogger(this.getClass().getName())
.warning("Unrecognized Object from predicate chain.");
}
}
return defaultFont;
}
} // end of class FontAction