📄 visualization.java
字号:
Expression e = ExpressionParser.parse(expr);
if ( !(e instanceof Predicate) || ExpressionParser.getError()!=null )
return Collections.EMPTY_LIST.iterator();
return items(group, (Predicate)e);
}
/**
* Get an iterator over all items in the given group which match the given
* Predicate filter.
* @param group the visual data group to iterate over
* @param filter a Predicate indicating which items should be included in
* the iteration.
* @return a filtered iterator over VisualItems
*/
public Iterator items(String group, Predicate filter) {
if ( ALL_ITEMS.equals(group) )
return items(filter);
TupleSet t = getGroup(group);
return ( t==null ? Collections.EMPTY_LIST.iterator()
: t.tuples(filter) );
}
// ------------------------------------------------------------------------
// Batch Methods
/**
* Set a data field value for all items in a given data group matching a
* given filter predicate.
* @param group the visual data group name
* @param p the filter predicate determining which items to modify
* @param field the data field / column name to set
* @param val the value to set
*/
public void setValue(String group, Predicate p, String field, Object val) {
Iterator items = items(group, p);
while ( items.hasNext() ) {
VisualItem item = (VisualItem)items.next();
item.set(field, val);
}
}
/**
* Sets the visbility status for all items in a given data group matching
* a given filter predicate.
* @param group the visual data group name
* @param p the filter predicate determining which items to modify
* @param value the visibility value to set
*/
public void setVisible(String group, Predicate p, boolean value) {
Iterator items = items(group, p);
while ( items.hasNext() ) {
VisualItem item = (VisualItem)items.next();
item.setVisible(value);
}
}
/**
* Sets the interactivity status for all items in a given data group
* matching a given filter predicate.
* @param group the visual data group name
* @param p the filter predicate determining which items to modify
* @param value the interactivity value to set
*/
public void setInteractive(String group, Predicate p, boolean value) {
Iterator items = items(group, p);
while ( items.hasNext() ) {
VisualItem item = (VisualItem)items.next();
item.setInteractive(value);
}
}
// ------------------------------------------------------------------------
// Action Methods
/**
* Add a data processing Action to this Visualization. The Action will be
* updated to use this Visualization in its data processing.
* @param name the name of the Action
* @param action the Action to add
*/
public Action putAction(String name, Action action) {
action.setVisualization(this);
m_actions.put(name, action);
return action;
}
/**
* Get the data processing Action with the given name.
* @param name the name of the Action
* @return the requested Action, or null if the name was not found
*/
public Action getAction(String name) {
return (Action)m_actions.get(name);
}
/**
* Remove a data processing Action registered with this visualization.
* If the removed action is currently running, it will be canceled.
* The visualization reference held by the removed Action will be set to
* null.<br/>
* <strong>NOTE:</strong> Errors may occur if the removed Action is
* included in an "always run after" relation with another registered
* Action that has not been removed from this visualization. It is the
* currently the responsibility of clients to avoid this situation.
* @param name the name of the Action
* @return the removed Action, or null if no action was found
*/
public Action removeAction(String name) {
// TODO: create registry of always run after relations to automatically
// resolve action references?
Action a = getAction(name);
if ( a != null ) {
a.cancel();
m_actions.remove(name);
a.setVisualization(null);
}
return a;
}
/**
* Schedule the Action with the given name to run immediately. The running
* of all Actions is managed by the
* {@link prefuse.activity.ActivityManager}, which runs in a dedicated
* thread.
* @param action the name of the Action to run
* @return the Action scheduled to run
*/
public Activity run(String action) {
return m_actions.run(action);
}
/**
* Schedule the Action with the given name to run after the specified
* delay. The running of all Actions is managed by the
* {@link prefuse.activity.ActivityManager}, which runs in a dedicated
* thread.
* @param action the name of the Action to run
* @param delay the amount of time to wait, in milliseconds, before
* running the Action
* @return the Action scheduled to run
*/
public Activity runAfter(String action, long delay) {
return m_actions.runAt(action, System.currentTimeMillis()+delay);
}
/**
* Schedule the Action with the given name to run at the specified
* time. The running of all Actions is managed by the
* {@link prefuse.activity.ActivityManager}, which runs in a dedicated
* thread.
* @param action the name of the Action to run
* @param startTime the absolute system time, in milliseconds since the
* epoch, at which to run the Action.
* @return the Action scheduled to run
*/
public Activity runAt(String action, long startTime) {
return m_actions.runAt(action, startTime);
}
/**
* Schedule the Action with the given name to run after another Action
* finishes running. This relationship will only hold for one round of
* scheduling. If the "before" Action is run a second time, the "after"
* action will not be run a second time. The running of all Actions is
* managed by the {@link prefuse.activity.ActivityManager}, which runs
* in a dedicated thread.
* @param before the name of the Action to wait for
* @param after the name of the Action to run after the first one finishes
* @return the Action scheduled to run after the first one finishes
*/
public Activity runAfter(String before, String after) {
return m_actions.runAfter(before, after);
}
/**
* Schedule the Action with the given name to always run after another Action
* finishes running. The running of all Actions is managed by the
* {@link prefuse.activity.ActivityManager}, which runs in a dedicated
* thread.
* @param before the name of the Action to wait for
* @param after the name of the Action to run after the first one finishes
* @return the Action scheduled to always run after the first one finishes
*/
public Activity alwaysRunAfter(String before, String after) {
return m_actions.alwaysRunAfter(before, after);
}
/**
* Cancel the Action with the given name, if it has been scheduled.
* @param action the name of the Action to cancel
* @return the canceled Action
*/
public Activity cancel(String action) {
return m_actions.cancel(action);
}
// ------------------------------------------------------------------------
// Renderers
/**
* Set the RendererFactory used by this Visualization. The RendererFactory
* is responsible for providing the Renderer instances used to draw
* the VisualItems.
* @param rf the RendererFactory to use.
*/
public void setRendererFactory(RendererFactory rf) {
invalidateAll();
m_renderers = rf;
}
/**
* Get the RendererFactory used by this Visualization.
* @return this Visualization's RendererFactory
*/
public RendererFactory getRendererFactory() {
return m_renderers;
}
/**
* Get the renderer for the given item. Consults this visualization's
* {@link prefuse.render.RendererFactory} and returns the result.
* @param item the item to retreive the renderer for
* @return the {@link prefuse.render.Renderer} for drawing the
* given item
*/
public Renderer getRenderer(VisualItem item) {
if ( item.getVisualization() != this ) {
throw new IllegalArgumentException(
"Input item not a member of this visualization.");
}
return m_renderers.getRenderer(item);
}
/**
* Issue a repaint request, causing all displays associated with this
* visualization to be repainted.
*/
public synchronized void repaint() {
Iterator items = items(ValidatedPredicate.FALSE);
while ( items.hasNext() ) {
((VisualItem)items.next()).validateBounds();
}
for ( int i=0; i<m_displays.size(); ++i ) {
getDisplay(i).repaint();
}
}
/**
* Get the bounding rectangle for all items in the given group.
* @param group the visual data group
* @return the bounding box of the items
*/
public Rectangle2D getBounds(String group) {
return getBounds(group, new Rectangle2D.Double());
}
/**
* Get the bounding rectangle for all items in the given group.
* @param group the visual data group name
* @param r a rectangle in which to store the computed bounding box
* @return the input rectangle r, updated to hold the computed
* bounding box
*/
public Rectangle2D getBounds(String group, Rectangle2D r) {
Iterator iter = visibleItems(group);
if ( iter.hasNext() ) {
VisualItem item = (VisualItem)iter.next();
r.setRect(item.getBounds());
}
while ( iter.hasNext() ) {
VisualItem item = (VisualItem)iter.next();
Rectangle2D.union(item.getBounds(), r, r);
}
return r;
}
// ------------------------------------------------------------------------
// Displays
/**
* Get the number of displays associated with this visualization.
* @return the number of displays
*/
public int getDisplayCount() {
return m_displays.size();
}
/**
* Add a display to this visualization. Called automatically by the
* {@link prefuse.Display#setVisualization(Visualization)} method.
* @param display the Display to add
*/
void addDisplay(Display display) {
m_displays.add(display);
}
/**
* Get the display at the given list index. Displays are numbered by the
* order in which they are added to this visualization.
* @param idx the list index
* @return the Display at the given index
*/
public Display getDisplay(int idx) {
return (Display)m_displays.get(idx);
}
/**
* Remove a display from this visualization.
* @param display the display to remove
* @return true if the display was removed, false if it was not found
*/
boolean removeDisplay(Display display) {
return m_displays.remove(display);
}
/**
* Report damage to associated displays, indicating a region that will need
* to be redrawn.
* @param item the item responsible for the damage
* @param region the damaged region, in item-space coordinates
*/
public void damageReport(VisualItem item, Rectangle2D region) {
for ( int i=0; i<m_displays.size(); ++i ) {
Display d = getDisplay(i);
if ( d.getPredicate().getBoolean(item) ) {
d.damageReport(region);
}
}
}
} // end of class Visualization
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -