...
It should be possible to define rules on how to attach a style to a particular plot object. Multiple rules might be applied to a given style. It should be possible to apply rules to:
- object type: hep.aida.IHistogram1D, org.myproject.MyData1D
- object path: with path expressions like "MC/**"
- plot order: a specific order position, 0, 7 or a cyclical recurrence (3) -> every third plot
- action: like printing (plots for printing might require less details)
- category: "experiment=GLAST, quality=preliminary"
Style Registry
A style registry combines the styles and rules from different style stores and provides the right set of styles (with the appropriate Style Order) for a given plot object.
...
We have to define the order in which the styles are applied to an object:
- passed style (when plotting)
- explicit in annotation (like labels)
- implicit:
- action
- category
- plot order
- path
- type
Style Editor
GUI front end for viewing and editing individual styles or combinations of styles.
We already have a first version of the style editor. We need to add the possibility to view the information contained in a style registry, i.e. the chain of styles contributing to a given object and the set of rules that have contributed to it.
Comments to AIDA Styles
- does isVisible() belong to IBaseStyle?
- can we plot an object by passing only an IDataStyle (rather than an IPlotterStyle)?
Ideas for Implementation
...
Code Block |
---|
package hep.aida.ref.plotter.style.registry; import hep.aida.IPlotterStyle; public interface IStyleRegistry { // To work with Style Stores String[] getAvailableStoreNames(); IStyleStore getStore(String storeName); // To work with categories, this can be a separate service // Available category keys are filled from Rules of all available Stores String[] getAvailableCategoryKeys(); String[] getAvailableCategoryValues(String categoryKey); String getCategoryCurrentValue(String categoryKey); void setCategoryCurrentValue(String categoryKey, String categoryValue); // Following methods are used to obtain cumulative IPlotterStyle // for particular plotter, region, object, action, and (possibly) categories IPlotterStyle getStyleForState(IPlotterState state); } |
...
Code Block |
---|
package hep.aida.ref.plotter.style.registry; import hep.aida.IPlotterStyle; /** * This interface can be implemented as "In-Memory" copy of persistent * facility, or as keeping live connections and committing any change * immediately. */ public interface IStyleStore { // Key for AIDA type of object that the Style is going to be used with public static String STYLE_PREVIEW_TYPE = "STYLE_PREVIEW_TYPE"; // Key for Style name public static String STYLE_STORE_NAME = "STYLE_STORE_NAME"; String getStoreName(); String getStoreType(); boolean isReadOnly(); // Manage Styles boolean hasStyle(String styleName); void addStyle(String styleName, IPlotterStyle style); void addStyle(String styleName, IPlotterStyle style, IStyleRule rule); IPlotterStyle getStyle(String styleName); /** * Remove Style and Rule associated with it from the Store */ IPlotterStyle removeStyle(String styleName); String[] getAllStyleNames(); // Create new Rule for this Store - Store acts as a Rule Factory IStyleRule createRule(); // Manage Rules - only one rule per style is allowed IStyleRule getRuleForStyle(String styleName); void setRuleForStyle(String styleName, IStyleRule rule); void removeRuleForStyle(String styleName); /** * Write all information from Store to the undelying persistent * facility: XML file, database, etc. */ void commit(); /** * Close all connections and free all resources. * Store is not usable after this method is executed. */ void close(); } |
...
Code Block |
---|
package hep.aida.ref.plotter.style.registry; public interface IStyleRule { public static String PATH = "Path"; public static String OBJECT = "Object"; public static String OBJECTTYPE = "ObjectType"; public static String NULL = "Null"; public static String ATTRIBUTE = "attribute(\"\")"; public static String OVERLAYINDEX = "OverlayIndex"; public static String OVERLAYTOTAL = "OverlayTotal"; public static String REGIONINDEX = "RegionIndex"; public static String REGIONTOTAL = "RegionTotal"; String getDescription(); // Evaluates the Rule boolean ruleApplies(IPlotterState state); } |
...
- CLASS
- Plotted object is exactly instance of specified class
- Plotted object is derived from specified class
- PATH
- Path contains specified sub-path
- Case sensitive
- NOT Case sensitive
- Regular expression
- Path contains specified sub-path
- ORDER
- Absolute number of overlaid plots, like 3-rd
- Position in the recurring sequence, like 4-th out of 7
- ATTRIBUTE: match "key=value" pair
- Case sensitive
- NOT Case sensitive
- ACTION: match action name
- Case sensitive
- NOT Case sensitive
- CATEGORY: match "key=value" pair
- Case sensitive
- NOT Case sensitive
...
Code Block |
---|
package hep.aida.ref.plotter.style.registry; /** * This object encapsulates information about relevant * IPlotterRegion, object, and actions. * It is used for obtaining implicit IPlotterStyle */ import java.util.Map; public interface IPlotterState { static String ATTRIBUTE_KEY_PREFIX = "IPlotterState"; Object getObject(); String getObjectPath(); int getOverlayIndex(); int getOverlayTotal(); int getRegionIndex(); int getRegionTotal(); String getAttribute(String key); Map getAttributes(); void clear(); } |