package jas.hist; import jas.plot.Overlay; import jas.util.xml.HasXMLRepresentation; import java.util.Observable; class JASHist2DScatterData extends JASHist2DHistogramData { JASHist2DScatterData(final DataManager dm, final HasScatterPlotData ds) { super(dm,ds); dataSource = ds; } JASHistStyle createStyle() { return new JASHistScatterPlotStyle(); } boolean hasScatterPlotData() { return dataSource.hasScatterPlotData(); } public void setStyle(final JASHistStyle style) { if (!(style instanceof JASHistScatterPlotStyle)) throw new IllegalArgumentException("Style "+style.getClass()+" is not subclass of JASHistScatterPlotStyle"); if (this.style != null) this.style.deleteObserver(this); this.style = (JASHistScatterPlotStyle) style; this.style.addObserver(this); } Overlay createOverlay() { return new ScatterOverlay(this); } public void update(Observable o, Object arg) { // Dragons: Likely to be called by different thread if (o == dataSource) { parent.update((HistogramUpdate) arg, this); } else if (o == style) { parent.styleUpdate(this); } } void restartImage(final boolean newEnumNeeded) { if (overlay instanceof ScatterOverlay) { ((ScatterOverlay) overlay).restartImage(newEnumNeeded); } } void continueImage() { if (overlay instanceof ScatterOverlay) { ((ScatterOverlay) overlay).continueImage(); } } public JASHistStyle getStyle() { return style; } HasScatterPlotData dataSource; boolean dataChanged, resetSent, onNewAxis; // the data manager uses these flags // static final long serialVersionUID = 0/* ?? */; protected void calcZLimits() { if (((JASHistScatterPlotStyle) style).getDisplayAsScatterPlot()) return; else super.calcZLimits(); } public void writeAsXML(XMLPrintWriter pw, boolean snapshot) { String theXAxisType = pw.convertAxisTypeToString(dataSource.getXAxisType()); String theYAxisType = pw.convertAxisTypeToString(dataSource.getYAxisType()); pw.setAttribute("type","scatter2d"); pw.openTag("data2d"); int xBins = dataSource.getXBins(); double xLow = dataSource.getXMin(); double xHigh = dataSource.getXMax(); int yBins = dataSource.getYBins(); double yLow = dataSource.getYMin(); double yHigh = dataSource.getYMax(); if (snapshot) { double[][][] result = dataSource.rebin(xBins,xLow,xHigh,yBins,yLow,yHigh,true,hurry, style.getShowOverflow()); if (result == null) result = new double[1][xBins][yBins]; double[][] data = result[0]; pw.setAttribute("title",getTitle()); pw.setAttribute("dimensions","2"); pw.openTag("points"); final double[] d = new double[2]; if (dataSource.hasScatterPlotData()) { ScatterEnumeration se = dataSource.startEnumeration(); while (se.getNextPoint(d)) { pw.println(d[0] + "," + d[1]); } } pw.closeTag(); //output the x,y axis attributes pw.printPointDataAxisAttributes("x",theXAxisType);//5 string args pw.printPointDataAxisAttributes("y",theYAxisType); if (dataSource instanceof HasStatistics) { Statistics stats = ((HasStatistics) dataSource).getStatistics(); if (stats != null) { pw.openTag("statistics"); String[] names = stats.getStatisticNames(); for (int i=0; i<names.length; i++) { String name = names[i]; pw.setAttribute("name",name); String valueString = null; if (stats instanceof ExtendedStatistics) { Object value = ((ExtendedStatistics) stats).getExtendedStatistic(name); if (value != null) valueString = value.toString(); } if (valueString == null) valueString = String.valueOf(stats.getStatistic(name)); pw.setAttribute("value",valueString); pw.printTag("statistic"); } pw.closeTag(); } } } else // !snapshot { if (dataSource instanceof HasXMLRepresentation) { ((HasXMLRepresentation) dataSource).writeAsXML(pw); } else { if (dataSource instanceof HasDataSource) pw.setAttribute("name",dataSource.getClass().getName()); else pw.setAttribute("name","???"); pw.setAttribute("param","???"); pw.printTag("class"); } } /* //!PA - implement writing 2d string axis labels if and when we actually implement 2d string axes // (and watch out for min and max undef bug on string labels) if (theAxisType.equals("string")) { jas.hist.JASHistXMLUtils.writeTabs(pw, (indentLevel + 1)); pw.println("<axisLabels>"); String[] labels = getAxisLabels(); for (int i=0; i < labels.length; i++) { jas.hist.JASHistXMLUtils.writeTabs(pw, (indentLevel + 2)); pw.println("<axisLabel value=\"" + labels[i] + "\">"); } jas.hist.JASHistXMLUtils.writeTabs(pw, (indentLevel + 1)); pw.println("</axisLabels>"); } */ String histStyleName = JASHist2DHistogramStyle.getHistStyleName(style.getHistStyle()); pw.setAttribute("histStyle",histStyleName); if (histStyleName.equals("STYLE_COLORMAP")) { pw.setAttribute("colorMapScheme", JASHist2DHistogramStyle.getColorMapSchemeName(style.getColorMapScheme())); } pw.setAttribute("shapeColor", jas.util.ColorConverter.colorToString(style.getShapeColor())); pw.setAttribute("overflowBinColor", jas.util.ColorConverter.colorToString(style.getOverflowBinColor())); pw.setAttribute("startDataColor", jas.util.ColorConverter.colorToString(style.getStartDataColor())); pw.setAttribute("endDataColor", jas.util.ColorConverter.colorToString(style.getEndDataColor())); pw.setAttribute("showOverflow",style.getShowOverflow()); pw.setAttribute("showPlot",style.getShowPlot()); pw.setAttribute("displayAsScatterPlot", ((JASHistScatterPlotStyle) style).getDisplayAsScatterPlot()); pw.setAttribute("dataPointSize" , ((JASHistScatterPlotStyle) style).getDataPointSize()); pw.setAttribute("dataPointStyle" , ((JASHistScatterPlotStyle) style).getDataPointStyle()); pw.setAttribute("dataPointColor",jas.util.ColorConverter.colorToString(((JASHistScatterPlotStyle) style).getDataPointColor())); pw.printTag("style2d"); pw.closeTag(); } }