package hep.aida.ref.plotter; /* * JASPlotterRegion.java * * Created on September 27, 2002, 2:21 PM */ import hep.aida.IAnnotation; import hep.aida.IAxisStyle; import hep.aida.IBaseHistogram; import hep.aida.IBoxStyle; import hep.aida.ICloud; import hep.aida.IDataPointSet; import hep.aida.IDataStyle; import hep.aida.IFillStyle; import hep.aida.IFunction; import hep.aida.IHistogram; import hep.aida.IInfo; import hep.aida.ILineStyle; import hep.aida.IMarkerStyle; import hep.aida.IPlottable; import hep.aida.IPlotter; import hep.aida.IPlotterLayout; import hep.aida.IPlotterRegion; import hep.aida.IPlotterStyle; import hep.aida.IProfile; import hep.aida.ref.AidaUtils; import hep.aida.ref.Annotation; import hep.aida.ref.function.RangeSet; import hep.aida.ref.plotter.adapter.AIDAAdapter; import hep.aida.ref.plotter.adapter.AIDACloudAdapter1D; import hep.aida.ref.plotter.adapter.AIDACloudAdapter2D; import hep.aida.ref.plotter.adapter.AIDADataPointSetAdapter; import hep.aida.ref.plotter.adapter.AIDA1DAdapterWithAxisLabels; import hep.aida.ref.plotter.adapter.AIDAHistogramAdapter1D; import hep.aida.ref.plotter.adapter.AIDAHistogramAdapter2D; import hep.aida.ref.plotter.adapter.AIDAProfileAdapter; import hep.aida.ref.plotter.adapter.CanSetData; import hep.aida.ref.plotter.adapter.CanSetStyle; import hep.aida.ref.plotter.style.registry.IGlobalIndexProvider; import hep.aida.ref.plotter.style.registry.IPlotterState; import hep.aida.ref.plotter.style.registry.IStyleRegistry; import hep.aida.ref.plotter.style.registry.IStyleRule; import hep.aida.ref.plotter.style.registry.PlotterState; import hep.aida.ref.plotter.style.registry.StyleRegistry; import jas.hist.CustomOverlay; import jas.hist.DataSource; import jas.hist.JASHist; import jas.hist.JASHist1DFunctionStyle; import jas.hist.JASHist1DHistogramStyle; import jas.hist.JASHist2DHistogramStyle; import jas.hist.JASHistAxis; import jas.hist.JASHistData; import jas.hist.JASHistScatterPlotStyle; import jas.hist.JASHistStyle; import jas.hist.Rebinnable1DHistogramData; import jas.hist.StatisticsBlock; import jas.hist.normalization.AreaNormalizer; import jas.hist.normalization.EntriesNormalizer; import jas.hist.normalization.MaxBinNormalizer; import jas.hist.normalization.Normalizer; import jas.hist.normalization.RelativeNormalizer; import jas.hist.normalization.SimpleNormalizer; import jas.plot.EditableLabel; import jas.plot.Legend; import jas.plot.MovableObject; import jas.plot.Title; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Point; import java.awt.datatransfer.Clipboard; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.print.PrinterException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.swing.JMenuItem; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.SwingUtilities; import org.freehep.application.Application; import org.freehep.application.PrintHelper; import org.freehep.application.studio.Studio; import org.freehep.swing.ColorConverter; import org.freehep.swing.popup.HasPopupItems; import org.freehep.util.FreeHEPLookup; import org.freehep.util.export.ExportDialog; import org.freehep.util.export.VectorGraphicsTransferable; /** * Implementation of PlotterRegion * @author tonyj * @version $Id: PlotterRegion.java 13788 2010-11-24 19:43:56Z turri $ */ public class PlotterRegion implements IPlotterRegion, StyleListener { private static final String[] emptyArray = new String[0]; private JASHist plot; private JPanel panel; private ArrayList dataStyleList = new ArrayList(); private ArrayList dataList = new ArrayList(); private IPlotterStyle plotterStyle = new PlotterStyle(); private IPlotterLayout plotterLayout = new PlotterLayout(); private IInfo info = new Info(); private List queue = new ArrayList(); private String regionTitle = null; static final String[] styleKeys = {"AxisLabel", "AxisScale", "AxisType"}; static final String[] stylePars = {Style.AXIS_LABEL, Style.AXIS_SCALE, Style.AXIS_TYPE}; static final String overlayKey = "customOverlay"; static final String timeZoneKey = "timeZone"; static final String xAxisLabelsKey = "xAxisLabels"; public final int REPLACE = 0; public final int OVERLAY = 1; public final int ADD = 2; public final int STACK = 3; public static final String USE_EXACT_STYLE = "USE_EXACT_STYLE"; private int defaultMode = OVERLAY; private String[] parameters = {"xAxisLowerLimit", "xAxisUpperLimit", "yAxisLowerLimit", "yAxisUpperLimit"}; private IPlotter plotter; private StyleListener styleListener; public PlotterRegion(JPanel panel,IPlotter plotter) { this.panel = panel; panel.setLayout(new BorderLayout()); panel.setOpaque(false); this.plotter = plotter; String styleName = "RegionStyle"; if (plotter != null) styleName = "RegionStyle."; //+plotter.currentRegionNumber(); if (plotterStyle != null) plotterStyle.setParameter(Style.PLOTTER_STYLE_NAME, styleName); this.styleListener = this; if (FreeHEPLookup.instance().lookup(StyleRegistry.class) == null) FreeHEPLookup.instance().add(StyleRegistry.getStyleRegistry()); } public PlotterRegion(IPlotter plotter) { this(new JPanel(), plotter); } public IPlotterStyle getStyleForNumber(int num) { return ((DataStyleEntry) dataStyleList.get(num)).style(); } public IPlotterStyle getStyleForName(String name) { IPlotterStyle st = null; int n = dataStyleList.size(); for (int i=0; i<n; i++) { if (((DataStyleEntry) dataStyleList.get(i)).data().getTitle().equals(name)) { st = ((DataStyleEntry) dataStyleList.get(i)).style(); break; } } return st; } public JASHistData getDataForName(String name) { JASHistData st = null; int n = dataStyleList.size(); for (int i=0; i<n; i++) { if (((DataStyleEntry) dataStyleList.get(i)).data().getTitle().equals(name)) { st = ((DataStyleEntry) dataStyleList.get(i)).data(); break; } } return st; } public String[] getAllDataNames() { int n = dataStyleList.size(); String[] tmp = new String[n]; for (int i=0; i<n; i++) tmp[i] = ((DataStyleEntry) dataStyleList.get(i)).data().getTitle(); return tmp; } JPanel getPanel() { return panel; } public String[] availableParameterOptions(String str) { return emptyArray; } public String[] availableParameters() { return parameters; } public void setParameter(String str) { } public void setParameter(String str, String str1) { } public String parameterValue(String str) { if ( str.equals( parameters[0] ) ) return String.valueOf( getPlot().getXAxis().getMin() ); if ( str.equals( parameters[1] ) ) return String.valueOf( getPlot().getXAxis().getMax() ); if ( str.equals( parameters[2] ) ) return String.valueOf( getPlot().getYAxis().getMin() ); if ( str.equals( parameters[3] ) ) return String.valueOf( getPlot().getYAxis().getMax() ); return null; } // StyleListener method public void styleChanged(BaseStyle style) { for ( int i = 0; i < dataStyleList.size(); i++ ) { DataStyleEntry dse = (DataStyleEntry) dataStyleList.get(i); if (style == dse.style()) { invokeOnSwingThread(dse); } } } public IPlotterStyle style() { String styleName = "RegionStyle"; if (plotter != null) styleName = "RegionStyle."+plotter.currentRegionNumber(); if (plotterStyle != null) plotterStyle.setParameter(Style.PLOTTER_STYLE_NAME, styleName); return plotterStyle; } public void setStyle(IPlotterStyle style) { if (plotterStyle != null && style != plotterStyle) { plotterStyle.reset(); } if ( style != plotterStyle) { this.plotterStyle = style; String styleName = "RegionStyle"; if (plotter != null) styleName = "RegionStyle."+plotter.currentRegionNumber(); if (plotterStyle != null) plotterStyle.setParameter(Style.PLOTTER_STYLE_NAME, styleName); refresh(); } } public void applyStyle(IPlotterStyle style) { setStyle( style ); //refresh(); } public void setTitle(String title) { invokeOnSwingThread(new TitleChanged(title)); } public String title() { return regionTitle; } public void setXLimits() throws java.lang.IllegalArgumentException { setXLimits(Double.NaN, Double.NaN); } public void setXLimits(double min) { setXLimits(min, Double.NaN); } public void setXLimits(double min, double max) throws java.lang.IllegalArgumentException { Runnable run = new LimitsChanged(LimitsChanged.XAXIS,min,max); if ( getPlot() == null || getPlot().getNumberOfDataSources() == 0 ) addToQueue( run ); else invokeOnSwingThread(run); } public void setYLimits() throws java.lang.IllegalArgumentException { setYLimits(Double.NaN, Double.NaN); } public void setYLimits(double min) { setYLimits(min, Double.NaN); } public void setYLimits(double min, double max) throws java.lang.IllegalArgumentException { setYLimits("Y0", min, max); } public void setYLimits(String axisString) { setYLimits(axisString, Double.NaN, Double.NaN); } public void setYLimits(String axisString, double min) { setYLimits(axisString, min, Double.NaN); } public void setYLimits(String axisString, double min, double max) throws java.lang.IllegalArgumentException { int axis = 0; int limitsAxis = LimitsChanged.YAXIS; if (axisString != null && axisString.trim().equalsIgnoreCase("Y1")) { axis = 1; limitsAxis = LimitsChanged.YAXIS1; } if ( getPlot() == null || getPlot().getNumberOfDataSources() == 0 ) throw new RuntimeException("No plot available"); if ( getPlot().getYAxis(axis) == null ) throw new RuntimeException("Y Axis #"+axis+" has not been created yet"); Runnable run = new LimitsChanged(limitsAxis,min,max); if ( getPlot() == null || getPlot().getNumberOfDataSources() == 0 ) addToQueue( run ); else invokeOnSwingThread(run); } public void setZLimits() throws java.lang.IllegalArgumentException { setZLimits(Double.NaN, Double.NaN); } public void setZLimits(double min) { setZLimits(min, Double.NaN); } public void setZLimits(double min, double max) throws java.lang.IllegalArgumentException { Runnable run = new LimitsChanged(LimitsChanged.ZAXIS,min,max); if ( getPlot() == null || getPlot().getNumberOfDataSources() == 0 ) addToQueue( run ); else invokeOnSwingThread(run); } /** * Get the min limit of x. */ public double xLimitMin() { if ( getPlot() == null || getPlot().getNumberOfDataSources() == 0 ) throw new RuntimeException("No plot available"); return getPlot().getXAxis().getMin(); } /** * Get the max limit of x. */ public double xLimitMax() { if ( getPlot() == null || getPlot().getNumberOfDataSources() == 0 ) throw new RuntimeException("No plot available"); return getPlot().getXAxis().getMax(); } /** * Get the min limit of y. */ public double yLimitMin() { return yLimitMin("Y0"); } public double yLimitMin(String axisString) { int axis = 0; if (axisString != null && axisString.trim().equalsIgnoreCase("Y1")) axis = 1; if ( getPlot() == null || getPlot().getNumberOfDataSources() == 0 ) throw new RuntimeException("No plot available"); if ( getPlot().getYAxis(axis) == null ) throw new RuntimeException("Y Axis #"+axis+" has not been created yet"); return getPlot().getYAxis(axis).getMin(); } /** * Get the max limit of y. */ public double yLimitMax() { return yLimitMax("Y0"); } public double yLimitMax(String axisString) { int axis = 0; if (axisString != null && axisString.trim().equalsIgnoreCase("Y1")) axis = 1; if ( getPlot() == null || getPlot().getNumberOfDataSources() == 0 ) throw new RuntimeException("No plot available"); if ( getPlot().getYAxis(axis) == null ) throw new RuntimeException("Y Axis #"+axis+" has not been created yet"); return getPlot().getYAxis(axis).getMax(); } /** * Get the min limit of z. */ public double zLimitMin() { throw new UnsupportedOperationException(); } /** * Get the max limit of z. */ public double zLimitMax() { throw new UnsupportedOperationException(); } private synchronized void addToQueue( Runnable run ) { if ( queue == null ) queue = new ArrayList(); queue.add( run ); } public IInfo info() { return info; } public void setInfo(IInfo info) { this.info = info; } public void clear() { invokeOnSwingThread(new ClearRegion()); } public void plot(IPlottable plottable) throws IllegalArgumentException { invokeOnSwingThread(new AddRemove(true,this,plottable)); } public void plot(IPlottable plottable, String options) throws IllegalArgumentException { invokeOnSwingThread(new AddRemove(true,this,plottable, null, options)); } public void plot(IPlottable plottable, IPlotterStyle style) throws IllegalArgumentException { invokeOnSwingThread(new AddRemove(true,this,plottable,style)); } public void plot(IPlottable plottable, IPlotterStyle style, String options) throws IllegalArgumentException { invokeOnSwingThread(new AddRemove(true,this,plottable,style, options)); } public void plot(IBaseHistogram iBaseHistogram) { invokeOnSwingThread(new AddRemove(true,this,iBaseHistogram)); } public void plot(IBaseHistogram iBaseHistogram, IPlotterStyle style) { invokeOnSwingThread(new AddRemove(true,this,iBaseHistogram,style)); } public void plot(IBaseHistogram iBaseHistogram, String options) { invokeOnSwingThread(new AddRemove(true,this,iBaseHistogram, null, options)); } public void plot(IBaseHistogram iBaseHistogram, IPlotterStyle style, String options) { invokeOnSwingThread(new AddRemove(true,this,iBaseHistogram,style, options)); } public void plot(IDataPointSet iDataPointSet) { invokeOnSwingThread(new AddRemove(true,this,iDataPointSet)); } public void plot(IDataPointSet iDataPointSet, IPlotterStyle style) { invokeOnSwingThread(new AddRemove(true,this,iDataPointSet,style)); } public void plot(IDataPointSet iDataPointSet, String options) { invokeOnSwingThread(new AddRemove(true,this,iDataPointSet,null, options)); } public void plot(IDataPointSet iDataPointSet, IPlotterStyle style, String options) { invokeOnSwingThread(new AddRemove(true,this,iDataPointSet,style,options)); } public void plot(IFunction iFunction) { invokeOnSwingThread(new AddRemove(true,this,iFunction)); } public void plot(IFunction iFunction, IPlotterStyle style) { invokeOnSwingThread(new AddRemove(true,this,iFunction, style)); } public void plot(IFunction iFunction, String options) { invokeOnSwingThread(new AddRemove(true,this,iFunction,null,options)); } public void plot(IFunction iFunction, IPlotterStyle style, String options) { invokeOnSwingThread(new AddRemove(true,this,iFunction, style,options)); } public void remove(IDataPointSet iDataPointSet) { invokeOnSwingThread(new AddRemove(false,this,iDataPointSet)); } public void remove(IFunction iFunction) { invokeOnSwingThread(new AddRemove(false,this,iFunction)); } public void remove(IBaseHistogram iBaseHistogram) { invokeOnSwingThread(new AddRemove(false,this,iBaseHistogram)); } public void remove(IPlottable plottable) throws IllegalArgumentException { invokeOnSwingThread(new AddRemove(false,this,plottable)); } public void setPlot( JASHist plot ) { this.plot = plot; } public JASHist getPlot() { return plot; } public void setLayout(hep.aida.IPlotterLayout iPlotterLayout) { this.plotterLayout = iPlotterLayout; } public hep.aida.IPlotterLayout layout() { return plotterLayout; } public void add(Object thing, IPlotterStyle style, int mode) { add( thing, style, mode, thing, null ); } public void add(Object thing, IPlotterStyle style, String options) { int mode = getMode(options); add( thing, style, mode, thing, options ); } public void add(Object thing, IPlotterStyle style, int mode, String options) { add( thing, style, mode, thing, options ); } public void add(Object thing, IPlotterStyle style, int mode, Object data) { add(thing, style, mode, data, null); } public void add(Object thing, IPlotterStyle userStyle, int mode, Object data, String options) { if (mode != REPLACE && mode != OVERLAY) throw new UnsupportedOperationException(); if (mode != OVERLAY && ( (getPlot() != null && getPlot().getNumberOfDataSources() > 0) || (dataList != null && dataList.size() > 0) || (dataStyleList != null && dataStyleList.size() > 0) ) ) removeAllObjectsFromRegion(); if (getPlot() == null) createPlot(); DataSource ds = null; String title = null; if ( thing instanceof DataSource ) ds = (DataSource) thing; else { if (thing instanceof IHistogram) ds = AIDAAdapter.create((IHistogram) thing); else if (thing instanceof ICloud) ds = AIDAAdapter.create((ICloud) thing); else if (thing instanceof IFunction) ds = AIDAAdapter.create((IFunction) thing); else if (thing instanceof IProfile) ds = AIDAAdapter.create((IProfile) thing); else if (thing instanceof IDataPointSet) ds = AIDAAdapter.create((IDataPointSet) thing); else throw new IllegalArgumentException("Cannot plot object "+thing); } boolean keepUserStyle = (options != null && (options.indexOf(USE_EXACT_STYLE) >= 0 || options.toUpperCase().indexOf(USE_EXACT_STYLE) >= 0)); PlotterStyle style = null; if ( userStyle == null || userStyle == plotterStyle ) style = new PlotterStyle(); //else if (!keepUserStyle) else style = new PlotterStyle( (PlotterStyle) userStyle ); // Set Global Index for this style if (!((PlotterStyle) style).parameter(Style.PLOTTER_STYLE_INDEX).isParameterValueSet()) { IGlobalIndexProvider ip = (IGlobalIndexProvider) FreeHEPLookup.instance().lookup(IGlobalIndexProvider.class); int globalIndex = ip.getIndex(); ((PlotterStyle) style).setParameter(Style.PLOTTER_STYLE_INDEX, String.valueOf(globalIndex)); } //System.out.flush(); //System.out.println("\n\n\n\n*****************************************"); //System.out.println("*** add :: title="+ds.getTitle()); //System.out.println("***\t mode="+mode+", keepUserStyle="+keepUserStyle+", index="+style.parameterValue(Style.PLOTTER_STYLE_INDEX)); if (!keepUserStyle) { if (!((PlotterStyle) style).parameter(Style.PLOTTER_STYLE_NAME).isParameterValueSet()) { ((PlotterStyle) style).setParameter(Style.PLOTTER_STYLE_NAME, ds.getTitle()); } style = (PlotterStyle) applyDefaultStyles(data, style, options); } // Has to be called only after "applyDefaultStyles" // As it needs correct setup of parent styles setDefaultsFromData(ds,data, style); applyStyleBeforeAdding(style, ds); if ( style != null && style != plotterStyle ) handleLabels(style); JASHistData jasHistData = getPlot().addData(ds); String range = getRange(options); if ( range != null ) { RangeSet rangeSet = new RangeSet(range); jasHistData.setXBounds(rangeSet.lowerBounds()[0],rangeSet.upperBounds()[0]); } //The lists with the data and the style applied to DataStyleEntry dataStyleEntry = new DataStyleEntry(jasHistData, style, mode); // ( (PlotterStyle) style).addStyleListener(styleListener); dataList.add(data); dataStyleList.add(dataStyleEntry); // Apply axis limits: // FIXME: For backward compatibility - if limits are not setup // in the IAxisStyle, try use top-level IPlotterStyle limits String xAxisLowerLimitStr = style.xAxisStyle().parameterValue(Style.AXIS_LOWER_LIMIT); if (xAxisLowerLimitStr == null) xAxisLowerLimitStr = style.parameterValue("xAxisLowerLimit"); String xAxisUpperLimitStr = style.xAxisStyle().parameterValue(Style.AXIS_UPPER_LIMIT); if (xAxisUpperLimitStr == null) xAxisUpperLimitStr = style.parameterValue("xAxisUpperLimit"); double xAxisLowerLimit = xAxisLowerLimitStr != null ? Double.valueOf(xAxisLowerLimitStr).doubleValue() : Double.NaN; double xAxisUpperLimit = xAxisUpperLimitStr != null ? Double.valueOf(xAxisUpperLimitStr).doubleValue() : Double.NaN; if ( ! Double.isNaN(xAxisLowerLimit) || ! Double.isNaN(xAxisUpperLimit) ) { getPlot().getXAxis().setRange(xAxisLowerLimit, xAxisUpperLimit); } String yAxisString = style.yAxisStyle().parameterValue("yAxis"); int yAxisIndex = 0; if (yAxisString != null && yAxisString.trim().equalsIgnoreCase("Y1")) yAxisIndex = 1; if ( getPlot().getYAxis(yAxisIndex) == null ) throw new RuntimeException("Y Axis #"+yAxisIndex+" has not been created yet"); // FIXME: For backward compatibility - if limits are not setup // in the IAxisStyle, try use top-level IPlotterStyle limits String yAxisLowerLimitStr = style.yAxisStyle().parameterValue(Style.AXIS_LOWER_LIMIT); if (yAxisLowerLimitStr == null) yAxisLowerLimitStr = style.parameterValue("yAxisLowerLimit"); String yAxisUpperLimitStr = style.yAxisStyle().parameterValue(Style.AXIS_UPPER_LIMIT); if (yAxisUpperLimitStr == null) yAxisUpperLimitStr = style.parameterValue("yAxisUpperLimit"); double yAxisLowerLimit = yAxisLowerLimitStr != null ? Double.valueOf(yAxisLowerLimitStr).doubleValue() : Double.NaN; double yAxisUpperLimit = yAxisUpperLimitStr != null ? Double.valueOf(yAxisUpperLimitStr).doubleValue() : Double.NaN; if ( ! Double.isNaN(yAxisLowerLimit) || ! Double.isNaN(yAxisUpperLimit) ) { getPlot().getYAxis(yAxisIndex).setRange(yAxisLowerLimit, yAxisUpperLimit); } //Invoke here all the setLimits commands after the first data souce //has been added. This way we make sure the axis has been created if ( getPlot().getNumberOfDataSources() == 1 ) { if ( queue != null ) { Iterator iter; synchronized (this) { iter = queue.iterator(); queue = null; } for (; iter.hasNext();) { Runnable run = (Runnable) iter.next(); invokeOnSwingThread(run); } } } // The title has to be set before applying the styles! if ( regionTitle != null ) getPlot().setTitle( regionTitle ); if ( getPlot().getTitle() == null ) { getPlot().setTitle(ds.getTitle()); regionTitle = ds.getTitle(); } // else { // String newTitle = ds.getTitle(); // if ( mode == OVERLAY ) { // String tmpTitle = getPlot().getTitle(); // if ( tmpTitle != null ) // newTitle = tmpTitle+" - "+newTitle; // } // getPlot().setTitle(newTitle); // } applyStyle(jasHistData, style); //boolean isShowing = getPlot().isShowing(); //jasHistData.show(isShowing); jasHistData.show(true); applyStyleAfterShow(jasHistData, style); if (mode == OVERLAY) refreshStyles(); else { //Add this PlotterRegion as the listener to the style. ( (PlotterStyle) style).addStyleListener(styleListener); } } // This method checks if data has set any of the // following: axisScale, axisType, axisLabel, customOverlay, timeZone public IPlotterStyle setDefaultsFromData(DataSource ds, Object thing, IPlotterStyle style) { IAnnotation an = null; int dimension = 0; if ( thing instanceof IBaseHistogram) { an = (IAnnotation) ((IBaseHistogram) thing).annotation(); dimension = ((IBaseHistogram) thing).dimension(); } else if ( thing instanceof IDataPointSet) { an= (IAnnotation) ((IDataPointSet) thing).annotation(); dimension = ((IDataPointSet) thing).dimension(); } else { // Nothing to do for IFunction and unknown types return style; } String prefix = "x"; IAxisStyle xAxisStyle = style.xAxisStyle(); int size = an.size(); for (int k=0; k<size; k++) { String key = an.key(k) ; for (int i=0; i<styleKeys.length; i++) { if (key.equalsIgnoreCase((prefix + styleKeys[i]))) { try { String val = an.value(key); if (val != null && !((BaseStyle) xAxisStyle).isParameterSet(stylePars[i])) xAxisStyle.setParameter(stylePars[i], val); } catch (IllegalArgumentException e) {} } } } prefix = "y"; IAxisStyle yAxisStyle = style.yAxisStyle(); size = an.size(); for (int k=0; k<size; k++) { String key = an.key(k); for (int i=0; i<styleKeys.length; i++) { if (key.equalsIgnoreCase((prefix + styleKeys[i]))) { try { String val = an.value(key); if (val != null && !((BaseStyle) yAxisStyle).isParameterSet(stylePars[i])) yAxisStyle.setParameter(stylePars[i], val); } catch (IllegalArgumentException e) {} } } } // Set Overlay and Time Zone, if present size = an.size(); for (int k=0; k<size; k++) { String key = an.key(k); if (key.equalsIgnoreCase(overlayKey)) { try { String val = an.value(key); String oldVal = null; if (((BaseStyle) style.dataStyle()).isParameterSet(overlayKey)) oldVal = style.dataStyle().parameterValue(overlayKey); if (val != null && oldVal == null) style.dataStyle().setParameter(overlayKey, val); } catch (IllegalArgumentException e) {} } else if (key.equalsIgnoreCase(timeZoneKey)) { try { String val = an.value(key); String oldVal = null; if (((BaseStyle) style.dataStyle()).isParameterSet(timeZoneKey)) oldVal = style.dataStyle().parameterValue(timeZoneKey); if (val != null && oldVal == null) style.dataStyle().setParameter(timeZoneKey, val); } catch (Exception e2) { e2.printStackTrace();} } } if ( an.hasKey(xAxisLabelsKey) && ds instanceof AIDA1DAdapterWithAxisLabels ) { AIDA1DAdapterWithAxisLabels aga = (AIDA1DAdapterWithAxisLabels)ds; aga.setAxisType(DataSource.STRING); String axisLabels = an.value(xAxisLabelsKey); aga.setAxisLabels(axisLabels.split("\t")); } return style; } // Transferes x and y axis labels from the current plot to the newer style // before getPlot().addData(ds) erases them public void handleLabels(IPlotterStyle style) { // do X axis JASHistAxis xHistAxis = getPlot().getXAxis(); String oldXLabel = xHistAxis.getLabel(); IAxisStyle xAxisStyle = style.xAxisStyle(); String xAxisLabel = xAxisStyle.label(); boolean xLabelIsSet = xAxisLabel != null && !xAxisLabel.equals("") && ((BaseStyle) xAxisStyle).isParameterSet(Style.AXIS_LABEL); if (!xLabelIsSet && oldXLabel != null && !oldXLabel.equals("")) xAxisStyle.setLabel(oldXLabel); // do Y axis JASHistAxis yHistAxis = getPlot().getYAxis(); String oldYLabel = yHistAxis.getLabel(); IAxisStyle yAxisStyle = style.yAxisStyle(); String yAxisLabel = yAxisStyle.label(); boolean yLabelIsSet = yAxisLabel != null && !yAxisLabel.equals("") && ((BaseStyle) yAxisStyle).isParameterSet(Style.AXIS_LABEL); if (!yLabelIsSet && oldYLabel != null && !oldYLabel.equals("")) yAxisStyle.setLabel(oldYLabel); } IPlotterStyle getImplicitStyle(Object thing) { //Set a style specific to a plot. // This is the default style for an IDataPointSet. // A more generic way of doing this is needed. IPlotterStyle implicitStyle = null; if ( thing instanceof IDataPointSet ) implicitStyle = new DataPointSetPlotterStyle(); else if ( thing instanceof IProfile ) implicitStyle = new DataPointSetPlotterStyle(); else if (thing instanceof IPlotterState) { IStyleRegistry registry = (IStyleRegistry) FreeHEPLookup.instance().lookup(IStyleRegistry.class); if (registry != null) implicitStyle = registry.getStyleForState((IPlotterState) thing); } return implicitStyle; } IPlotterState createAndFillPlotterState(Object data, String options) { PlotterState state = new PlotterState(); // fill in region and overlay information if (plotter != null) state.setRegionIndex(plotter.currentRegionNumber()); if (plotter != null) state.setRegionTotal(plotter.numberOfRegions()); state.setOverlayTotal(dataStyleList.size()+1); state.setOverlayIndex(getPlot().getNumberOfDataSources()); // Overwrite with values from options if (options != null && !options.trim().equals("")) { Map optionsMap = AidaUtils.parseOptions( options ); Object tmp = optionsMap.get(IStyleRule.OVERLAY_INDEX); if (tmp != null) { try { int index = Integer.parseInt((String) tmp); state.setOverlayIndex(index); } catch (Exception e) { e.printStackTrace(); } } tmp = optionsMap.get(IStyleRule.OVERLAY_TOTAL); if (tmp != null) { try { int index = Integer.parseInt((String) tmp); state.setOverlayTotal(index); } catch (Exception e) { e.printStackTrace(); } } } state.setObject(data); // fill in info about object and any possible info from the Annotation IAnnotation an = null; if ( data instanceof IDataPointSet ) an = ((IDataPointSet) data).annotation(); else if ( data instanceof IBaseHistogram ) an = ((IBaseHistogram) data).annotation(); else if ( data instanceof IFunction ) an = ((IFunction) data).annotation(); if (an == null) return state; for (int i=0; i<an.size(); i++) { String key = an.key(i); if (key.toLowerCase().startsWith(IPlotterState.ATTRIBUTE_KEY_PREFIX.toLowerCase())) { String value = an.value(key); int index = IPlotterState.ATTRIBUTE_KEY_PREFIX.length(); String stateKey = key.substring(index+1); state.setAttribute(stateKey, value); } } // fill in the Path if (an.hasKey(Annotation.fullPathKey)) state.setObjectPath(an.value(Annotation.fullPathKey)); // Use Categories do it last so it overwrites all other settings IStyleRegistry registry = (IStyleRegistry) FreeHEPLookup.instance().lookup(IStyleRegistry.class); if (registry != null) { String[] catKeys = registry.getAvailableCategoryKeys(); if (catKeys != null) { for (int i=0; i<catKeys.length; i++) { String key = catKeys[i]; if (key == null || key.trim().equals("")) continue; String value = registry.getCategoryCurrentValue(key); if (value != null) state.setAttribute(key, value); } } } //System.out.println("Options: "+options); //System.out.println("PlotterState:\n"+state.toString()); return state; } // style here must be PlotterStyle and can not be NULL public IPlotterStyle applyDefaultStyles( Object data, IPlotterStyle style ) { return applyDefaultStyles(data, style, null); } public IPlotterStyle applyDefaultStyles( Object data, IPlotterStyle style, String options ) { ArrayList list = new ArrayList(3); // Add Region style to the Style if ( style() != null) list.add(style()); // Add Plotter style to the Style if ( plotter != null && plotter.style() != null) list.add(plotter.style()); //Use IStyleRegistry, if present IPlotterStyle implicitStyle = null; IStyleRegistry registry = (IStyleRegistry) FreeHEPLookup.instance().lookup(IStyleRegistry.class); if (registry == null) { implicitStyle = getImplicitStyle(data); if (implicitStyle != null) list.add(implicitStyle); } else { implicitStyle = getImplicitStyle(createAndFillPlotterState(data, options)); if (implicitStyle == null) { implicitStyle = getImplicitStyle(data); if (implicitStyle != null) list.add(implicitStyle); } else { List parents = ((PlotterStyle) implicitStyle).parentList(); for (int k=0; k<parents.size(); k++) { Object obj = parents.get(k); if (obj != null) list.add(obj); } ((PlotterStyle) implicitStyle).reset(); } } // Add all parents to the style ((PlotterStyle) style).setParentList(list); return style; } public void applyStyleBeforeAdding(IPlotterStyle style, DataSource ds) { //This MUST not be moved from here. The axis type has to be set before adding the //data source to the jasHist String xAxisType = style.xAxisStyle().parameterValue("type"); if ( xAxisType != null ) if ( xAxisType.equalsIgnoreCase("date") ) { //It used to be that the line below did the trick for setting the axis type. //It is no longer the case. The axis type is now changed on the data source. //getPlot().getXAxis().setAxisType( 3 ); if ( ds instanceof AIDADataPointSetAdapter ) ( (AIDADataPointSetAdapter) ds ).setAxisType(3); if ( ds instanceof AIDACloudAdapter1D ) ( (AIDACloudAdapter1D) ds ).setAxisType(3); if ( ds instanceof AIDAHistogramAdapter1D ) ( (AIDAHistogramAdapter1D) ds ).setAxisType(3); if ( ds instanceof AIDACloudAdapter2D ) ( (AIDACloudAdapter2D) ds ).setXAxisType(3); if ( ds instanceof AIDAHistogramAdapter2D ) ( (AIDAHistogramAdapter2D) ds ).setXAxisType(3); } String yAxisType = style.yAxisStyle().parameterValue("type"); if ( yAxisType != null ) if ( yAxisType.equals("date") ) { if ( ds instanceof AIDACloudAdapter2D ) ( (AIDACloudAdapter2D) ds ).setYAxisType(3); if ( ds instanceof AIDAHistogramAdapter2D ) ( (AIDAHistogramAdapter2D) ds ).setYAxisType(3); } } public void applyStyleAfterShow(JASHistData jasHistData, IPlotterStyle style) { if ( getPlot().getShowLegend() > 0 ) { Legend legend = getPlot().getLegend(); placeMovableObject((MovableObject)legend, style.legendBoxStyle().boxStyle()); } if ( getPlot().getShowStatistics() ) { StatisticsBlock stat = getPlot().getStats(); String visibleStat = style.statisticsBoxStyle().visibleStatistics(); if ( visibleStat != null ) { String[] statNames = stat.getStatNames(); ArrayList list = new ArrayList(); for ( int i = 0; i < statNames.length; i++ ) { String name = statNames[i]; if ( visibleStat.length() < i+1 || visibleStat.charAt(i) == '1' ) { list.add(name); } } if ( list.size() > 0 ) { String[] visibleLines = new String[list.size()]; for ( int i = 0; i < list.size(); i++ ) { visibleLines[i] = (String) list.get(i); } stat.setSelectedEntries(visibleLines); } } placeMovableObject((MovableObject)stat, style.statisticsBoxStyle().boxStyle()); } } public void applyStyle(JASHistData jasHistData, IPlotterStyle style) { //long t0 = System.currentTimeMillis(); int overlayIndex = getOverlayIndex(style); int globalIndex = -1; if (style instanceof PlotterStyle) { try { globalIndex = Integer.parseInt(style.parameterValue(Style.PLOTTER_STYLE_INDEX)); } catch (Exception e) { e.printStackTrace(); } } //Set the type of error for a profile plot DataSource ds = jasHistData.getDataSource(); String profileErrors = style.dataStyle().parameterValue("profileErrors"); if ( profileErrors != null && ds instanceof AIDAProfileAdapter ) { if ( profileErrors.equals("errorOnMean") || profileErrors.equals("1") ) ( (AIDAProfileAdapter) ds ).setErrorMode( AIDAProfileAdapter.USE_ERROR_ON_MEAN ); else if ( profileErrors.equals("spread") || profileErrors.equals("0") ) ( (AIDAProfileAdapter) ds ).setErrorMode( AIDAProfileAdapter.USE_SPREAD ); } // Style options for the plot region //**** NORMALIZATION ****// String normString = style.dataStyle().parameterValue(Style.DATA_NORMALIZATION); int n = dataStyleList.size(); //System.out.println("\n*** normString="+normString+", overlayIndex="+overlayIndex+", n="+n); if (n <= 1 || overlayIndex == 0) { // no normalization } else { // Always normalize to the very first plot in the region Normalizer normalizer = null; DataSource firstDS = ((DataStyleEntry) dataStyleList.get(0)).data().getDataSource(); DataSource currentDS = jasHistData.getDataSource(); if (firstDS instanceof Rebinnable1DHistogramData) { if (normString.toLowerCase().equals("none")) { normalizer = new SimpleNormalizer(1.0); } else if (normString.toLowerCase().equals("entries")) { normalizer = new RelativeNormalizer(new EntriesNormalizer(currentDS), new EntriesNormalizer(firstDS)); } else if (normString.toLowerCase().equals("maxbin")) { normalizer = new RelativeNormalizer(new MaxBinNormalizer(currentDS), new MaxBinNormalizer(firstDS)); } else if (normString.toLowerCase().equals("area")) { normalizer = new RelativeNormalizer(new AreaNormalizer(currentDS), new AreaNormalizer(firstDS)); } if (normalizer != null) jasHistData.setNormalization(normalizer); //System.out.println("\tfirstDS="+firstDS.getTitle()+", :: "+firstDS.getClass()+", normalizer="+normalizer); } } //**** LEGEND ****// boolean showLegendSet = true; if (style.legendBoxStyle() instanceof BaseStyle) { showLegendSet = ((BaseStyle) style.legendBoxStyle()).isParameterSet(Style.IS_VISIBLE); } boolean showLegend = style.legendBoxStyle().isVisible(); if ( !showLegendSet ) getPlot().setShowLegend(JASHist.LEGEND_AUTOMATIC); else if ( showLegend ) getPlot().setShowLegend(JASHist.LEGEND_ALWAYS); else getPlot().setShowLegend(JASHist.LEGEND_NEVER); if ( getPlot().getShowLegend() > 0 ) { Legend legend = getPlot().getLegend(); if ( legend != null ) legend.setFont( PlotterFontUtil.getFont( style.legendBoxStyle().textStyle() ) ); } jasHistData.setShowLegend(style.dataStyle().isShownInLegendBox()); //**** STATISTICS BOX ****// // Is the statistics box showing? getPlot().setShowStatistics( style.statisticsBoxStyle().isVisible() ); if ( getPlot().getShowStatistics() ) { StatisticsBlock stat = getPlot().getStats(); if ( stat != null ) stat.setFont( PlotterFontUtil.getFont( style.statisticsBoxStyle().textStyle() ) ); } // Choose whether to show the data statistics jasHistData.setShowStatistics(style.dataStyle().isShownInStatisticsBox()); //****** TITLE *******// if ( getPlot().getTitleObject() != null ) getPlot().getTitleObject().setVisible( style.titleStyle().isVisible() ); Title titleObj = getPlot().getTitleObject(); if ( titleObj != null ) { titleObj.setFont( PlotterFontUtil.getFont(style.titleStyle().textStyle()) ); String colorStr = style.titleStyle().textStyle().color(); if ( colorStr != null ) try { Color color = ColorConverter.get(colorStr); color = getTransparentColor(color, style.titleStyle().textStyle().opacity()); titleObj.setForeground( color ); } catch ( Exception cce ){ throw new RuntimeException(cce); } // Should this be executed on the Swing thread? // This should also be done for legend and stat box? if ( titleObj.isShowing() ) getPlot().setTitleObject(titleObj); } //********** BACKGROUND - FOREGROND - DATA AREA COLORS ********// // No rotation for the background, data area, and foreground colors String backgroundColor = style.regionBoxStyle().backgroundStyle().color(); if ( backgroundColor != null ) try { Color color = ColorConverter.get(backgroundColor); getPlot().setBackground( color ); } catch ( Exception cce ){ throw new RuntimeException(cce); } String foregroundColor = style.regionBoxStyle().foregroundStyle().color(); if ( foregroundColor != null ) try { Color color = ColorConverter.get(foregroundColor); getPlot().setForegroundColor( color ); } catch ( Exception cce ){ throw new RuntimeException(cce); } String dataAreaColor = style.dataBoxStyle().backgroundStyle().color(); if ( dataAreaColor != null ) try { Color color = ColorConverter.get(dataAreaColor); getPlot().setDataAreaColor( color ); } catch ( Exception cce ){ throw new RuntimeException(cce); } //********* DATA AREA BORDER TYPE ****************// String dataAreaBorderType = style.dataBoxStyle().borderStyle().borderType(); if ( dataAreaBorderType != null ) { if ( dataAreaBorderType == "bevelIn" || dataAreaBorderType == "0" ) getPlot().setDataAreaBorderType(1); else if ( dataAreaBorderType == "bevelOut" || dataAreaBorderType == "1" ) getPlot().setDataAreaBorderType(2); else if ( dataAreaBorderType == "etched" || dataAreaBorderType == "2" ) getPlot().setDataAreaBorderType(3); else if ( dataAreaBorderType == "line" || dataAreaBorderType == "3" ) getPlot().setDataAreaBorderType(4); else if ( dataAreaBorderType == "shadow" || dataAreaBorderType == "4" ) getPlot().setDataAreaBorderType(5); else getPlot().setDataAreaBorderType(0); } //************ X AXIS STYLE *******************// JASHistAxis xAxis = getPlot().getXAxis(); IAxisStyle xAxisStyle = style.xAxisStyle(); String xAxisLabel = xAxisStyle.label(); boolean setXLabel = xAxisLabel != null && ((BaseStyle) xAxisStyle).isParameterSet(Style.AXIS_LABEL); if (setXLabel) xAxis.setLabel( xAxisLabel ); boolean xAllowZeroSuppression = Boolean.valueOf(xAxisStyle.parameterValue("allowZeroSuppression")).booleanValue(); xAxis.setAllowSuppressedZero( xAllowZeroSuppression ); EditableLabel xlabel = xAxis.getLabelObject(); if ( xlabel != null ) { xlabel.setFont( PlotterFontUtil.getFont( xAxisStyle.labelStyle() ) ); String xAxisLabelColor = xAxisStyle.labelStyle().color(); if ( xAxisLabelColor != null ) try { Color color = ColorConverter.get(xAxisLabelColor); color = getTransparentColor(color, xAxisStyle.labelStyle().opacity()); xlabel.setForeground( color ); } catch ( Exception cce ){ throw new RuntimeException(cce); } boolean verticalLabel = Boolean.valueOf(xAxisStyle.parameterValue(Style.AXIS_VERTICAL_LABEL)).booleanValue(); xlabel.setRotated(verticalLabel); if ( xlabel.isShowing() ) xAxis.setLabelObject( xlabel ); } xAxis.setFont( PlotterFontUtil.getFont( xAxisStyle.tickLabelStyle() ) ); String xAxisScale = xAxisStyle.scaling(); if ( xAxisScale != null ) xAxis.setLogarithmic(xAxisScale.startsWith("log")); String xAxisTickLabelColor = xAxisStyle.tickLabelStyle().color(); if ( xAxisTickLabelColor != null ) try { Color color = ColorConverter.get(xAxisTickLabelColor); color = getTransparentColor(color, xAxisStyle.tickLabelStyle().opacity()); xAxis.setAxisColor(color); } catch ( Exception cce ){ throw new RuntimeException(cce); } String xAxisLineColor = xAxisStyle.lineStyle().color(); if ( xAxisLineColor != null ) try { Color color = ColorConverter.get(xAxisLineColor); color = getTransparentColor(color, xAxisStyle.lineStyle().opacity()); xAxis.setAxisColor( color ); } catch ( Exception cce ){ throw new RuntimeException(cce); } float xAxisLineWidth = lineThickness(xAxisStyle.lineStyle().thickness()); if ( xAxisLineWidth >= 0 ) try { xAxis.setAxisWidth(xAxisLineWidth); } catch ( Exception cce ){ throw new RuntimeException(cce); } String xAxisTextColor = xAxisStyle.labelStyle().color(); if ( xAxisTextColor != null ) try { Color color = ColorConverter.get(xAxisTextColor); color = getTransparentColor(color, xAxisStyle.labelStyle().opacity()); xAxis.setTextColor( color ); } catch ( Exception cce ){ throw new RuntimeException(cce); } //************ Y AXIS STYLE *******************// IAxisStyle yAxisStyle = style.yAxisStyle(); String yAxisString = yAxisStyle.parameterValue("yAxis"); int yAxisIndex = 0; if (yAxisString != null && yAxisString.trim().equalsIgnoreCase("Y1")) yAxisIndex = 1; if ( getPlot().getYAxis(yAxisIndex) == null ) throw new RuntimeException("Y Axis #"+yAxisIndex+" has not been created yet"); JASHistAxis yAxis = getPlot().getYAxis(yAxisIndex); String yAxisLabel = yAxisStyle.label(); boolean setYLabel = yAxisLabel != null && ((BaseStyle) yAxisStyle).isParameterSet(Style.AXIS_LABEL); if (setYLabel) yAxis.setLabel( yAxisLabel ); boolean yAllowZeroSuppression = Boolean.valueOf(yAxisStyle.parameterValue("allowZeroSuppression")).booleanValue(); yAxis.setAllowSuppressedZero( yAllowZeroSuppression ); EditableLabel ylabel = yAxis.getLabelObject(); if ( ylabel != null ) { ylabel.setFont( PlotterFontUtil.getFont( yAxisStyle.labelStyle() ) ); String yAxisLabelColor = yAxisStyle.labelStyle().color(); if ( yAxisLabelColor != null ) try { Color color = ColorConverter.get(yAxisLabelColor); color = getTransparentColor(color, yAxisStyle.labelStyle().opacity()); ylabel.setForeground( color ); } catch ( Exception cce ){ throw new RuntimeException(cce); } boolean verticalLabel = Boolean.valueOf(yAxisStyle.parameterValue(Style.AXIS_VERTICAL_LABEL)).booleanValue(); ylabel.setRotated(verticalLabel); if ( ylabel.isShowing() ) yAxis.setLabelObject( ylabel ); } yAxis.setFont( PlotterFontUtil.getFont( yAxisStyle.tickLabelStyle() ) ); String yAxisScale = yAxisStyle.scaling(); if ( yAxisScale != null ) yAxis.setLogarithmic(yAxisScale.startsWith("log")); String yAxisTickLabelColor = yAxisStyle.tickLabelStyle().color(); if ( yAxisTickLabelColor != null ) try { Color color = ColorConverter.get(yAxisTickLabelColor); color = getTransparentColor(color, yAxisStyle.tickLabelStyle().opacity()); yAxis.setAxisColor(color); } catch ( Exception cce ){ throw new RuntimeException(cce); } String yAxisLineColor = yAxisStyle.lineStyle().color(); if ( yAxisLineColor != null ) try { Color color = ColorConverter.get(yAxisLineColor); color = getTransparentColor(color, yAxisStyle.lineStyle().opacity()); yAxis.setAxisColor( color ); } catch ( Exception cce ){ throw new RuntimeException(cce); } float yAxisLineWidth = lineThickness(yAxisStyle.lineStyle().thickness()); if ( yAxisLineWidth >= 0 ) try { yAxis.setAxisWidth(yAxisLineWidth); } catch ( Exception cce ){ throw new RuntimeException(cce); } String yAxisTextColor = yAxisStyle.labelStyle().color(); if ( yAxisTextColor != null ) try { Color color = ColorConverter.get(yAxisTextColor); color = getTransparentColor(color, yAxisStyle.labelStyle().opacity()); yAxis.setTextColor( color ); } catch ( Exception cce ){ throw new RuntimeException(cce); } // Set position of Y Axis for this DataSource String yAxisValue = yAxisStyle.parameterValue("yAxis"); if ( yAxisValue != null ) try { int yAxisID = (yAxisValue.equalsIgnoreCase("Y1")) ? JASHistData.YAXIS_RIGHT : JASHistData.YAXIS_LEFT; jasHistData.setYAxis(yAxisID); } catch ( Exception cce ){ throw new RuntimeException(cce); } JASHistStyle histStyle = jasHistData.getStyle(); //************ FUNCTIONS *************// if ( histStyle instanceof JASHist1DFunctionStyle ) { JASHist1DFunctionStyle fs = (JASHist1DFunctionStyle) histStyle; IDataStyle dataStyle = style.dataStyle(); String functionLineColor = dataStyle.outlineStyle().color(); if ( functionLineColor != null ) try { Color color = ColorConverter.get(functionLineColor); fs.setLineColor(color); } catch ( Exception cce ){ throw new RuntimeException(cce); } String lineType = dataStyle.outlineStyle().lineType(); if (dataStyle.outlineStyle() instanceof LineStyle) lineType = ((LineStyle) dataStyle.outlineStyle()).lineType(globalIndex, overlayIndex); fs.setLineStyle( lineType(lineType) ); fs.setLineWidth( lineThickness(dataStyle.outlineStyle().thickness()) ); jasHistData.show(dataStyle.outlineStyle().isVisible()); } //************ TIME ZONE *************// String timeZoneID = style.dataStyle().parameterValue(timeZoneKey); if (timeZoneID != null) { try { java.util.TimeZone tz = java.util.TimeZone.getTimeZone(timeZoneID); if (tz != null) histStyle.setTimeZone(tz); } catch ( Exception tze ) { tze.printStackTrace(); } } //************ CUSTOM OVERLAYS *************// String overlayClass = style.dataStyle().parameterValue(overlayKey); if (overlayClass == null) { } CustomOverlay customOverlay = null; if ( overlayClass != null ) { try { Class coClass = Class.forName(overlayClass); customOverlay = (CustomOverlay) coClass.newInstance(); if (customOverlay instanceof CanSetData) ((CanSetData) customOverlay).setData(jasHistData); histStyle.setCustomOverlay(customOverlay); //System.out.println("PlotterRegion.applyStyle CustomOverlay: customOverlay="+customOverlay); } catch ( Exception coe ){ coe.printStackTrace(); } } //************ 1D HISTOGRAMS *************// if ( histStyle instanceof JASHist1DHistogramStyle ) { JASHist1DHistogramStyle hs = (JASHist1DHistogramStyle) histStyle; if (customOverlay != null && customOverlay instanceof CanSetStyle) ((CanSetStyle) customOverlay).setStyle(hs); IDataStyle dataStyle = style.dataStyle(); boolean vis = dataStyle.fillStyle().isVisible(); boolean set = ((BaseStyle) dataStyle.fillStyle()).isParameterSet("isVisible"); hs.setShowHistogramBars( dataStyle.lineStyle().isVisible() ); hs.setHistogramFill( dataStyle.fillStyle().isVisible() ); hs.setShowErrorBars( dataStyle.errorBarStyle().isVisible() ); hs.setShowDataPoints( dataStyle.markerStyle().isVisible() ); hs.setShowLinesBetweenPoints( dataStyle.outlineStyle().isVisible() ); IFillStyle dataFillStyle = dataStyle.fillStyle(); ILineStyle dataLineStyle = dataStyle.lineStyle(); IMarkerStyle dataMarkerStyle = dataStyle.markerStyle(); //By default the histogram's fill color, the contour of the histogram bar and //the line between the points are taken from the line color. If the fill color is set //and the histogram's bars are filled, the different color is used. Same for the //line between the points. // Set Colors here, including defaults String dataLineColor = dataLineStyle.color(); String dataFillColor = dataFillStyle.color(); String dataLineBetweenPointsColor = dataStyle.outlineStyle().color(); String dataMarkerColor = dataMarkerStyle.color(); String errorBarsColor = dataStyle.errorBarStyle().color(); if (dataFillStyle instanceof BrushStyle) { dataFillColor = ((BrushStyle) dataFillStyle).color(globalIndex, overlayIndex); if (dataMarkerColor == null || !((BrushStyle) dataMarkerStyle).isParameterSet(Style.BRUSH_COLOR, true)) dataMarkerColor = dataFillColor; if (dataLineBetweenPointsColor == null || !((BrushStyle) dataStyle.outlineStyle()).isParameterSet(Style.BRUSH_COLOR, true)) dataLineBetweenPointsColor = dataFillColor; if (dataLineColor == null || !((BrushStyle) dataLineStyle).isParameterSet(Style.BRUSH_COLOR, true)) { dataLineColor = null; // Let JASHist defaults handle not set dataLineColor and errorBarsColor for now /* if (dataStyle.fillStyle().isVisible()) { dataLineColor = "black"; } else { dataLineColor = dataFillColor; } */ } // By default the error bars have the same color as the plot's line. if (errorBarsColor == null || !((BrushStyle) dataStyle.errorBarStyle()).isParameterSet(Style.BRUSH_COLOR, true)) { errorBarsColor = dataLineColor; } } //if ( dataFillColor != null && hs.getHistogramFill() ) if ( dataFillColor != null ) try { Color color = ColorConverter.get(dataFillColor); color = getTransparentColor(color, dataFillStyle.opacity()); hs.setHistogramBarColor( color ); } catch ( Exception cce ){ throw new RuntimeException(cce); } if ( dataLineColor != null ) try { Color color = ColorConverter.get(dataLineColor); color = getTransparentColor(color, dataLineStyle.opacity()); hs.setHistogramBarLineColor(color); } catch ( Exception cce ){ throw new RuntimeException(cce); } if ( dataLineBetweenPointsColor != null ) try { Color color = ColorConverter.get(dataLineBetweenPointsColor); hs.setLineColor(color); } catch ( Exception cce ){ throw new RuntimeException(cce); } if ( dataMarkerColor != null ) try { Color color = ColorConverter.get(dataMarkerColor); color = getTransparentColor(color, dataMarkerStyle.opacity()); hs.setDataPointColor( color ); //hs.setErrorBarColor( color ); } catch ( Exception cce ){ throw new RuntimeException(cce); } try { if ( errorBarsColor != null ) { Color color = ColorConverter.get(errorBarsColor); color = getTransparentColor(color, dataStyle.errorBarStyle().opacity()); hs.setErrorBarColor( color ); } } catch ( Exception cce ){ throw new RuntimeException(cce); } // Set the line types String dataLineType = dataLineStyle.lineType(); if (dataLineStyle instanceof LineStyle) dataLineType = ((LineStyle) dataLineStyle).lineType(globalIndex, overlayIndex); hs.setHistogramBarLineStyle( lineType(dataLineType) ); hs.setHistogramBarLineWidth( lineThickness(dataLineStyle.thickness()) ); String lineType = dataStyle.outlineStyle().lineType(); if (dataStyle.outlineStyle() instanceof LineStyle) lineType = ((LineStyle) dataStyle.outlineStyle()).lineType(globalIndex, overlayIndex); hs.setLinesBetweenPointsStyle( lineType(lineType) ); hs.setLinesBetweenPointsWidth( lineThickness(dataStyle.outlineStyle().thickness()) ); String dataMarkerShape = dataMarkerStyle.shape(); if (dataMarkerStyle instanceof MarkerStyle) dataMarkerShape = ((MarkerStyle) dataMarkerStyle).shape(globalIndex, overlayIndex); if ( dataMarkerShape != null ) hs.setDataPointStyle( markerShape( dataMarkerShape ) ); hs.setDataPointSize( dataMarkerStyle.size() ); // Set the error bars line type String errorLineType = dataStyle.outlineStyle().lineType(); if (dataStyle.errorBarStyle() instanceof LineStyle) errorLineType = ((LineStyle) dataStyle.errorBarStyle()).lineType(globalIndex, overlayIndex); hs.setErrorBarStyle( lineType(errorLineType) ); hs.setErrorBarWidth( lineThickness(dataStyle.errorBarStyle().thickness()) ); // Set the error bars decoration ILineStyle errorBarSt = dataStyle.errorBarStyle(); try { String tmp = errorBarSt.parameterValue(Style.ERRORBAR_DECORATION); if (tmp != null && !tmp.trim().equals("") ) { float tmpFl = Float.parseFloat(tmp); hs.setErrorBarDecoration(tmpFl); } else { hs.setErrorBarDecoration(-1.0f); } } catch ( Exception cce ){ throw new RuntimeException(cce); } } //********* 2D HISTOGRAMS ***************// if ( histStyle instanceof JASHistScatterPlotStyle ) { JASHistScatterPlotStyle sphs = (JASHistScatterPlotStyle) histStyle; IMarkerStyle dataMarkerStyle = style.dataStyle().markerStyle(); String dataMarkerShape = dataMarkerStyle.shape(); if (dataMarkerStyle instanceof MarkerStyle) dataMarkerShape = ((MarkerStyle) dataMarkerStyle).shape(globalIndex, overlayIndex); if ( dataMarkerShape != null ) sphs.setDataPointStyle( markerShapeScatter(dataMarkerShape) ); sphs.setDataPointSize( dataMarkerStyle.size() ); String dataMarkerColor = dataMarkerStyle.color(); if (dataMarkerStyle instanceof BrushStyle) dataMarkerColor = ((BrushStyle) dataMarkerStyle).color(globalIndex, overlayIndex); if ( dataMarkerColor != null ) try { Color color = ColorConverter.get(dataMarkerColor); color = getTransparentColor(color, dataMarkerStyle.opacity()); sphs.setDataPointColor( color ); } catch ( Exception cce ){ throw new RuntimeException(cce); } sphs.setDisplayAsScatterPlot(Boolean.valueOf( style.parameterValue("showAsScatterPlot") ).booleanValue() ); } boolean isBinned2D = false; boolean showZHB = true; if ( histStyle instanceof JASHist2DHistogramStyle ) { if ( histStyle instanceof JASHistScatterPlotStyle ) { if ( ( (JASHistScatterPlotStyle) histStyle ).getDisplayAsScatterPlot() ) isBinned2D = true; } else isBinned2D = true; // See if need to draw bins with height == 0 try { String tmpSt = style.dataStyle().fillStyle().parameterValue(Style.FILL_SHOW_ZERO_HEIGHT_BINS); if (tmpSt.trim().equalsIgnoreCase("true")) showZHB = true; else showZHB = false; } catch (Exception cce) { throw new RuntimeException(cce); } } if ( isBinned2D ) { JASHist2DHistogramStyle hs = (JASHist2DHistogramStyle) histStyle; String hist2DStyle = style.parameterValue("hist2DStyle"); if ( hist2DStyle != null ) { if ( hist2DStyle.equals( "box" ) || hist2DStyle.equals("0") ) hs.setHistStyle(0); else if ( hist2DStyle.equals( "ellipse" ) || hist2DStyle.equals("1") ) hs.setHistStyle(1); else if ( hist2DStyle.equals( "colorMap" ) || hist2DStyle.equals("2") ) hs.setHistStyle(2); else hs.setHistStyle(0); } String colorMapScheme = style.dataStyle().fillStyle().parameterValue("colorMapScheme"); if ( colorMapScheme != null ) { if ( colorMapScheme.equals("warm") || colorMapScheme.equals("0") ) hs.setColorMapScheme(hs.COLORMAP_WARM); else if ( colorMapScheme.equals("cool") || colorMapScheme.equals("1") ) hs.setColorMapScheme(hs.COLORMAP_COOL); else if ( colorMapScheme.equals("thermal") || colorMapScheme.equals("2") ) hs.setColorMapScheme(hs.COLORMAP_THERMAL); else if ( colorMapScheme.equals("rainbow") || colorMapScheme.equals("3") ) hs.setColorMapScheme(hs.COLORMAP_RAINBOW); else if ( colorMapScheme.equals("grayscale") || colorMapScheme.equals("4") ) hs.setColorMapScheme(hs.COLORMAP_GRAYSCALE); else if ( colorMapScheme.equals("userdefined") || colorMapScheme.equals("5") ) { hs.setColorMapScheme(hs.COLORMAP_USERDEFINED); String startColor = style.dataStyle().fillStyle().parameterValue("startColor"); String endColor = style.dataStyle().fillStyle().parameterValue("endColor"); try { hs.setStartDataColor(startColor == null ? Color.WHITE : ColorConverter.get(startColor)); } catch (ColorConverter.ColorConversionException x) { hs.setStartDataColor(Color.WHITE); } try { hs.setEndDataColor(endColor == null ? Color.BLACK : ColorConverter.get(endColor)); } catch (ColorConverter.ColorConversionException x) { hs.setStartDataColor(Color.BLACK); } } else hs.setColorMapScheme(0); } String shapeColor = style.dataStyle().markerStyle().color(); if (style.dataStyle().markerStyle() instanceof BrushStyle) shapeColor = ((BrushStyle) style.dataStyle().markerStyle()).color(globalIndex, overlayIndex); if ( shapeColor != null ) try { Color color = ColorConverter.get(shapeColor); color = getTransparentColor(color, style.dataStyle().markerStyle().opacity()); hs.setShapeColor(color); } catch ( Exception cce ){ throw new RuntimeException(cce); } String logZ = style.zAxisStyle().scaling(); if ( logZ != null ) hs.setLogZ(logZ.toLowerCase().startsWith("log")); // Show or not bins with height==0 hs.setShowZeroHeightBins(showZHB); } jasHistData.show(style.dataStyle().isVisible()); //long t1 = System.currentTimeMillis(); //System.out.println("\tapplyStyle :: title="+jasHistData.getTitle()+", time="+(t1-t0)); } private Color getTransparentColor(Color c, double alpha) { if ( alpha == -1 || alpha < 0 || alpha > 1 ) return c; int t = (int)(255*alpha); return new Color(c.getRed(),c.getGreen(), c.getBlue(), t); } private float lineThickness(String thickness) { return Float.parseFloat(thickness)/(float)2.; } private float lineThickness(int thickness) { return ((float)thickness)/(float)2.; } private int lineType(String lineType) { if ( lineType == null || lineType.equals("solid") || lineType.equals("0") ) return JASHist1DHistogramStyle.SOLID; if ( lineType.equals("dotted") || lineType.equals("1") ) return JASHist1DHistogramStyle.DOTTED; if ( lineType.equals("dashed") || lineType.equals("2") ) return JASHist1DHistogramStyle.DASHED; if ( lineType.equals("dotdash") || lineType.equals("3") ) return JASHist1DHistogramStyle.DOTDASH; else return JASHist1DHistogramStyle.SOLID; } private int markerShape( String markerShape ) { if ( markerShape.equals("dot") || markerShape.equals("0") ) return 0; else if ( markerShape.equals("box") || markerShape.equals("1") ) return 1; else if ( markerShape.equals("triangle") || markerShape.equals("2") ) return 2; else if ( markerShape.equals("diamond") || markerShape.equals("3") ) return 3; else if ( markerShape.equals("star") || markerShape.equals("4") ) return 4; else if ( markerShape.equals("verticalLine") || markerShape.equals("5") ) return 5; else if ( markerShape.equals("horizontalLine") || markerShape.equals("6") ) return 6; else if ( markerShape.equals("cross") || markerShape.equals("7") ) return 7; else if ( markerShape.equals("circle") || markerShape.equals("8") ) return 8; else if ( markerShape.equals("square") || markerShape.equals("9") ) return 9; else return 0; } private int markerShapeScatter( String markerShape ) { if ( markerShape.equals("box") || markerShape.equals("1") ) return 0; else if ( markerShape.equals("triangle") || markerShape.equals("2") ) return 1; else if ( markerShape.equals("diamond") || markerShape.equals("3") ) return 2; else if ( markerShape.equals("star") || markerShape.equals("4") ) return 3; else if ( markerShape.equals("verticalLine") || markerShape.equals("5") ) return 4; else if ( markerShape.equals("horizontalLine") || markerShape.equals("6") ) return 5; else if ( markerShape.equals("cross") || markerShape.equals("7") ) return 6; else if ( markerShape.equals("square") || markerShape.equals("9") ) return 7; else return 0; } void removeAllObjectsFromRegion() { //Fix to JAS-270 It used to be that nData = getPlot().getNumberOfDataSources(), but this //did not take into account the functions: getPlot().get1DFunctions() int nData = dataList.size(); ArrayList tmpDataList = (ArrayList) dataList.clone(); for ( int i = 0; i < nData; i++ ) removeObj( tmpDataList.get(i), false ); rebuild(); } public void removeObjectFromRegion(Object thing) { removeObj(thing,true); } void removeObj(Object thing, boolean rebuild) { int thingIndex = dataList.indexOf(thing); boolean removed = false; for (int i=0; i<dataStyleList.size(); i++) { DataStyleEntry dse = (DataStyleEntry) dataStyleList.get(i); if (thing == dse.data()) { dse.cleanUp(); removeDataSourceFromRegion( (DataSource) dse.data().getDataSource() ); dataStyleList.remove(i); removed = true; break; } } if (!removed) { DataStyleEntry dse = (DataStyleEntry) dataStyleList.get(thingIndex); dse.cleanUp(); removeDataSourceFromRegion( (DataSource) dse.data().getDataSource() ); dataStyleList.remove(thingIndex); removed = true; } dataList.remove(thingIndex); if ( rebuild && dataList.size() > 0 ) rebuild(); } public void removeDataSourceFromRegion( DataSource ds ) { } public void refresh() { rebuild(); } int getOverlayIndex(IPlotterStyle style) { int overlayIndex = 0; ArrayList tmpDataStyleList = (ArrayList) dataStyleList.clone(); for ( int i = 0; i < tmpDataStyleList.size(); i++ ) { DataStyleEntry dse = (DataStyleEntry) tmpDataStyleList.get(i); PlotterStyle ps = (PlotterStyle) dse.style(); if (ps == style) overlayIndex = i; } //System.out.println("PlotterRegion.getOverlayIndex :: "+overlayIndex); return overlayIndex; } public void refreshStyles() { ArrayList tmpDataList = (ArrayList) dataList.clone(); ArrayList tmpDataStyleList = (ArrayList) dataStyleList.clone(); String options = IStyleRule.OVERLAY_TOTAL+"="+tmpDataList.size(); List list = null; for ( int i = 0; i < tmpDataList.size(); i++ ) { Object dataObj = tmpDataList.get(i); DataStyleEntry dse = (DataStyleEntry) tmpDataStyleList.get(i); PlotterStyle ps = (PlotterStyle) dse.style(); // Remove this PlotterRegion as listener to all styles ps.removeStyleListener(styleListener); ps.setParentList(list); String tmp = options+", "+IStyleRule.OVERLAY_INDEX+"="+i; PlotterStyle style = (PlotterStyle) applyDefaultStyles(dataObj, ps, tmp); styleChanged(style); } // Set this PlotterRegion as listener to all styles again // after styles have been updated for ( int i = 0; i < tmpDataList.size(); i++ ) { DataStyleEntry dse = (DataStyleEntry) tmpDataStyleList.get(i); PlotterStyle ps = (PlotterStyle) dse.style(); ps.addStyleListener(styleListener); } } private void rebuild() { invokeOnSwingThread( new RebuildRegion() ); } public void clearRegion() { removeAllObjectsFromRegion(); JASHist plot = getPlot(); if (plot != null) { panel.remove(plot); plot.destroy(); setPlot(null); regionTitle = null; } setStyle(new PlotterStyle()); } private void createPlot() { plot = new JASHistPlot((DummyPlotter)plotter); plot.setShowStatistics(true); panel.add(plot,BorderLayout.CENTER); panel.revalidate(); } private static void invokeOnSwingThread(Runnable run) { //long t0 = System.currentTimeMillis(); if (SwingUtilities.isEventDispatchThread()) run.run(); else { try { SwingUtilities.invokeAndWait(run); } catch (java.lang.reflect.InvocationTargetException x) { x.printStackTrace(); } catch (InterruptedException x) { x.printStackTrace(); } } //long t1 = System.currentTimeMillis(); //System.out.println("\tinvokeOnSwingThread :: isEventDispatchThread="+SwingUtilities.isEventDispatchThread()+", class="+run.getClass()+", time="+(t1-t0)); } public void addToRegion(Object thing, IPlotterStyle styleObj, String options) { add(thing,styleObj, options); } private String getRange(String options) { if ( options != null ) { Map optionsMap = AidaUtils.parseOptions( options ); return (String) optionsMap.get("range"); } return null; } public int getMode(String options) { if ( options == null ) return defaultMode(); Map optionsMap = AidaUtils.parseOptions( options ); String mode = (String) optionsMap.get("mode"); return modeConversion(mode); } private int modeConversion( String mode ) { if ( mode != null ) { if ( mode.equals("replace") ) return REPLACE; else if ( mode.equals("overlay") ) return OVERLAY; else if ( mode.equals("add") ) return ADD; else if ( mode.equals("stack") ) return STACK; } return defaultMode(); } public void setDefaultMode( String value ) { defaultMode = modeConversion( value ); } int defaultMode() { return defaultMode; } private void placeMovableObject(MovableObject movableObject, IBoxStyle boxStyle) { if ( ! Double.isNaN(boxStyle.x()) && ! Double.isNaN(boxStyle.y()) ) movableObject.moveMovableObject((int) boxStyle.x(), (int) boxStyle.y()); if ( ! Double.isNaN(boxStyle.width()) && ! Double.isNaN(boxStyle.height()) ) movableObject.resizeMovableObject((int) boxStyle.width(), (int) boxStyle.height()); } //******************************************// // Methods needed by the FPlotter interface // //******************************************// /* public void plot(Object data, int options) { plot(data,options,plotterStyle); } public void plot(Object data, int options, Object style) { } public void remove(Object data) { } public void clearPlotter() { } public java.awt.Component viewable() { return getPlot(); } */ //*****************************************// private static class AddRemove implements Runnable { private boolean add; private PlotterRegion region; private Object thing; private IPlotterStyle styleObj; private String options; AddRemove(boolean add, PlotterRegion region, Object thing) { this( add, region, thing, null); } AddRemove(boolean add, PlotterRegion region, Object thing, IPlotterStyle styleObj) { this(add, region, thing, styleObj, null); } AddRemove(boolean add, PlotterRegion region, Object thing, IPlotterStyle styleObj, String options) { this.add = add; this.region = region; this.thing = thing; this.styleObj = styleObj; this.options = options; } public void run() { if (add) region.addToRegion(thing, styleObj, options); else region.removeObjectFromRegion(thing); region.panel.repaint(); } } private class ClearRegion implements Runnable { public void run() { clearRegion(); } } private class LimitsChanged implements Runnable { final static int XAXIS = 0; final static int YAXIS = 1; final static int YAXIS1 = 11; final static int ZAXIS = 2; private int axis; private double min; private double max; LimitsChanged(int axis, double min, double max) { this.axis = axis; this.min = min; this.max = max; } public void run() { if (getPlot() != null) { JASHistAxis plotAxis = null; if (axis == XAXIS) plotAxis = getPlot().getXAxis(); else if (axis == YAXIS) plotAxis = getPlot().getYAxis(0); else if (axis == YAXIS1) plotAxis = getPlot().getYAxis(1); //TODO: What about the Z axis? if (plotAxis != null) { if (Double.isNaN(min) && Double.isNaN(max)) plotAxis.setRangeAutomatic(true); else { if (Double.isNaN(min)) min = plotAxis.getMin(); if (Double.isNaN(max)) max = plotAxis.getMax(); plotAxis.setRange(min,max); } } } } } private class TitleChanged implements Runnable { TitleChanged(String title) { regionTitle = title; } public void run() { if (getPlot() == null) createPlot(); getPlot().setTitle(regionTitle); } } private class RebuildRegion implements Runnable { public void run() { if (getPlot() != null) getPlot().removeAllData(); //Create first a copy of the dataList and of the dataStyleList. ArrayList tmpDataList = (ArrayList) dataList.clone(); ArrayList tmpDataStyleList = (ArrayList) dataStyleList.clone(); dataList.clear(); dataStyleList.clear(); List list = null; String options = IStyleRule.OVERLAY_TOTAL+"="+tmpDataList.size(); for ( int i = 0; i < tmpDataList.size(); i++ ) { Object dataObj = tmpDataList.get(i); DataStyleEntry dse = (DataStyleEntry) tmpDataStyleList.get(i); //dse.cleanUp(); PlotterStyle ps = (PlotterStyle) dse.style(); ps.removeStyleListener(styleListener); ps.removeAllParents(); String tmp = options+", "+IStyleRule.OVERLAY_INDEX+"="+i; add( dse.data().getDataSource(), ps, dse.mode(), dataObj, tmp); } } } private class DataStyleEntry implements Runnable { private JASHistData jasHistData; private IPlotterStyle style; private int mode; DataStyleEntry( JASHistData jasHistData , IPlotterStyle style, int mode ) { setData(jasHistData); setStyle(style); this.mode = mode; } IPlotterStyle style() { return style; } JASHistData data() { return jasHistData; } void setStyle( IPlotterStyle style ) { this.style = style; } void setData( JASHistData jasHistData ) { this.jasHistData = jasHistData; } int mode() { return mode; } void cleanUp() { ( (PlotterStyle) style ).removeStyleListener(styleListener); style.reset(); } public void run() { applyStyle(data(), style()); } } private class JASHistPlot extends JASHist implements HasPopupItems, ActionListener { private DummyPlotter plotter; private Component parent; protected JASHistPlot(DummyPlotter plotter) { setShowStatistics(true); setBackground(java.awt.Color.white); setAllowPopupMenus(false); this.plotter = plotter; this.parent = (Component) SwingUtilities.getAncestorOfClass(Component.class,plotter.panel()); } public void actionPerformed(ActionEvent actionEvent) { String command = actionEvent.getActionCommand(); if (command.equals("saveRegion")) { ExportDialog dlg = new ExportDialog(null,true); dlg.showExportDialog(parent, "Save As...", JASHistPlot.this, "plot"); } else if (command.equals("copyRegion")) { Clipboard cb = JASHistPlot.this.getToolkit().getSystemClipboard(); VectorGraphicsTransferable t = new VectorGraphicsTransferable(JASHistPlot.this); cb.setContents(t,t); } else if (command.equals("printRegion")) { Studio studio = (Studio) Application.getApplication(); try { PrintHelper ph = new PrintHelper(JASHistPlot.this, studio); ph.print(); } catch (PrinterException x) { studio.error("Error printing plot",x); } } else if (command.equals("savePlotter")) { ExportDialog dlg = new ExportDialog(null,true); dlg.showExportDialog(parent, "Save As...", plotter.panel(), "plotter"); } else if (command.equals("copyPlotter")) { Clipboard cb = JASHistPlot.this.getToolkit().getSystemClipboard(); VectorGraphicsTransferable t = new VectorGraphicsTransferable(plotter.panel()); cb.setContents(t,t); } else if (command.equals("printPlotter")) { Studio studio = (Studio) Application.getApplication(); try { PrintHelper ph = new PrintHelper(plotter.panel(), studio); ph.print(); } catch (PrinterException x) { studio.error("Error printing plot",x); } } } public JPopupMenu modifyPopupMenu(JPopupMenu menu,Component source,Point p) { for (Component c=source; c != null; c = c.getParent()) { if (c instanceof jas.plot.HasPopupItems) ((jas.plot.HasPopupItems) c).modifyPopupMenu(menu, source); } // Do some work on the menu! for (int i=0; i<menu.getComponentCount();i++) { Object item = menu.getComponent(i); if (item instanceof JMenuItem) { JMenuItem mItem = (JMenuItem) item; String name = mItem.getText(); // if (name.indexOf("function") >= 0) menu.remove(i--); // else if (name.equals("Fit")) menu.remove(i--); if (name.indexOf("Advanced") >= 0) menu.remove(i--); else if (name.equals("Save Plot As...")) menu.remove(i--); // else if (name.equals("Save Plot As...")) menu.remove(i--); else if (name.equals("Print")) menu.remove(i--); else if (name.equals("Copy Plot to Clipboard...")) menu.remove(i--); } } menu.addSeparator(); JMenuItem item = new JMenuItem("Copy Plot Region"); item.setActionCommand("copyRegion"); item.addActionListener(this); menu.add(item); item = new JMenuItem("Copy Plotter"); item.setActionCommand("copyPlotter"); item.addActionListener(this); menu.add(item); item = new JMenuItem("Save Plot Region As..."); item.setActionCommand("saveRegion"); item.addActionListener(this); menu.add(item); item = new JMenuItem("Save Plotter As..."); item.setActionCommand("savePlotter"); item.addActionListener(this); menu.add(item); /* item = new JMenuItem("Print Plot Region"); item.setActionCommand("printRegion"); item.addActionListener(this); menu.add(item); item = new JMenuItem("Print Plotter"); item.setActionCommand("printPlotter"); item.addActionListener(this); menu.add(item); */ return menu; } } }