Java tutorial
/* * TemporalAnalysisFrame.java * * Copyright (C) 2002-2009 Alexei Drummond and Andrew Rambaut * * This file is part of BEAST. * See the NOTICE file distributed with this work for additional * information regarding copyright ownership and licensing. * * BEAST is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * BEAST is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with BEAST; if not, write to the * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, * Boston, MA 02110-1301 USA */ package dr.app.tracer.analysis; import com.lowagie.text.Document; import com.lowagie.text.DocumentException; import com.lowagie.text.pdf.DefaultFontMapper; import com.lowagie.text.pdf.PdfContentByte; import com.lowagie.text.pdf.PdfTemplate; import com.lowagie.text.pdf.PdfWriter; import dr.app.tracer.application.TracerFileMenuHandler; import dr.stats.Variate; import jam.framework.AuxilaryFrame; import jam.framework.DocumentFrame; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.geom.Rectangle2D; import java.io.*; public class TemporalAnalysisFrame extends AuxilaryFrame implements TracerFileMenuHandler { private int binCount; private double minTime; private double maxTime; private boolean rangeSet; TemporalAnalysisPlotPanel temporalAnalysisPlotPanel = null; public TemporalAnalysisFrame(DocumentFrame frame, String title, int binCount) { this(frame, title, binCount, 0.0, 0.0); rangeSet = false; } public TemporalAnalysisFrame(DocumentFrame frame, String title, int binCount, double minTime, double maxTime) { super(frame); setTitle(title); this.binCount = binCount; this.minTime = minTime; this.maxTime = maxTime; rangeSet = true; temporalAnalysisPlotPanel = new TemporalAnalysisPlotPanel(this); setContentsPanel(temporalAnalysisPlotPanel); getSaveAction().setEnabled(false); getSaveAsAction().setEnabled(false); getCutAction().setEnabled(false); getCopyAction().setEnabled(true); getPasteAction().setEnabled(false); getDeleteAction().setEnabled(false); getSelectAllAction().setEnabled(false); getFindAction().setEnabled(false); getZoomWindowAction().setEnabled(false); } public void initializeComponents() { setSize(new java.awt.Dimension(640, 480)); } public void addDemographic(String title, Variate.D xData, Variate.D yDataMean, Variate.D yDataMedian, Variate.D yDataUpper, Variate.D yDataLower, double timeMean, double timeMedian, double timeUpper, double timeLower) { if (!rangeSet) { throw new RuntimeException("Range not set"); } if (getTitle().length() == 0) { setTitle(title); } temporalAnalysisPlotPanel.addDemographicPlot(title, xData, yDataMean, yDataMedian, yDataUpper, yDataLower, timeMean, timeMedian, timeUpper, timeLower); setVisible(true); } public void addDensity(String title, Variate.D xData, Variate.D yData) { if (!rangeSet) { throw new RuntimeException("Range not set"); } temporalAnalysisPlotPanel.addDensityPlot(title, xData, yData); setVisible(true); } public boolean useExportAction() { return true; } public JComponent getExportableComponent() { return temporalAnalysisPlotPanel.getExportableComponent(); } public void doCopy() { java.awt.datatransfer.Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); java.awt.datatransfer.StringSelection selection = new java.awt.datatransfer.StringSelection( this.toString()); clipboard.setContents(selection, selection); } public int getBinCount() { return binCount; } public double getMinTime() { if (!rangeSet) { throw new RuntimeException("Range not set"); } return minTime; } public double getMaxTime() { if (!rangeSet) { throw new RuntimeException("Range not set"); } return maxTime; } public void setRange(double minTime, double maxTime) { if (rangeSet) { throw new RuntimeException("Range already set"); } this.minTime = minTime; this.maxTime = maxTime; rangeSet = true; } public boolean isRangeSet() { return rangeSet; } public final void doExportData() { FileDialog dialog = new FileDialog(this, "Export Data...", FileDialog.SAVE); dialog.setVisible(true); if (dialog.getFile() != null) { File file = new File(dialog.getDirectory(), dialog.getFile()); try { FileWriter writer = new FileWriter(file); writer.write(toString()); writer.close(); } catch (IOException ioe) { JOptionPane.showMessageDialog(this, "Unable to write file: " + ioe, "Unable to write file", JOptionPane.ERROR_MESSAGE); } } } public final void doExportPDF() { FileDialog dialog = new FileDialog(this, "Export PDF Image...", FileDialog.SAVE); dialog.setVisible(true); if (dialog.getFile() != null) { File file = new File(dialog.getDirectory(), dialog.getFile()); Rectangle2D bounds = temporalAnalysisPlotPanel.getExportableComponent().getBounds(); Document document = new Document( new com.lowagie.text.Rectangle((float) bounds.getWidth(), (float) bounds.getHeight())); try { // step 2 PdfWriter writer; writer = PdfWriter.getInstance(document, new FileOutputStream(file)); // step 3 document.open(); // step 4 PdfContentByte cb = writer.getDirectContent(); PdfTemplate tp = cb.createTemplate((float) bounds.getWidth(), (float) bounds.getHeight()); Graphics2D g2d = tp.createGraphics((float) bounds.getWidth(), (float) bounds.getHeight(), new DefaultFontMapper()); temporalAnalysisPlotPanel.getExportableComponent().print(g2d); g2d.dispose(); cb.addTemplate(tp, 0, 0); } catch (DocumentException de) { JOptionPane.showMessageDialog(this, "Error writing PDF file: " + de, "Export PDF Error", JOptionPane.ERROR_MESSAGE); } catch (FileNotFoundException e) { JOptionPane.showMessageDialog(this, "Error writing PDF file: " + e, "Export PDF Error", JOptionPane.ERROR_MESSAGE); } document.close(); } } public String toString() { StringBuffer buffer = new StringBuffer(); java.util.List<TemporalAnalysisPlotPanel.AnalysisData> analyses = temporalAnalysisPlotPanel .getAnalysisData(); // Sources line for (TemporalAnalysisPlotPanel.AnalysisData analysis : analyses) { // first \t is for the time buffer.append("\t").append(analysis.title); if (analysis.isDemographic) { // demographic generate 4 values buffer.append("\t\t\t"); } } buffer.append("\n"); buffer.append("Time"); for (TemporalAnalysisPlotPanel.AnalysisData analysis : analyses) { if (analysis.isDemographic) { buffer.append("\tMean\tMedian\tUpper\tLower"); } else { buffer.append("\t"); } } buffer.append("\n"); Variate timeScale = temporalAnalysisPlotPanel.getTimeScale(); for (int i = 0; i < timeScale.getCount(); i++) { buffer.append(String.valueOf(timeScale.get(i))); for (TemporalAnalysisPlotPanel.AnalysisData analysis : analyses) { if (analysis.isDemographic) { buffer.append("\t"); buffer.append(String.valueOf(analysis.yDataMean.get(i))); buffer.append("\t"); buffer.append(String.valueOf(analysis.yDataMedian.get(i))); buffer.append("\t"); buffer.append(String.valueOf(analysis.yDataUpper.get(i))); buffer.append("\t"); buffer.append(String.valueOf(analysis.yDataLower.get(i))); } else { buffer.append("\t"); buffer.append(String.valueOf(analysis.yDataMean.get(i))); } } buffer.append("\n"); } return buffer.toString(); } public Action getExportDataAction() { return exportDataAction; } public Action getExportPDFAction() { return exportPDFAction; } private AbstractAction exportDataAction = new AbstractAction("Export Data...") { public void actionPerformed(ActionEvent ae) { doExportData(); } }; private AbstractAction exportPDFAction = new AbstractAction("Export PDF...") { public void actionPerformed(ActionEvent ae) { doExportPDF(); } }; }