package org.signalml.plugin.bookreporter.ui; import java.awt.Color; import java.awt.Graphics2D; import java.awt.Paint; import java.awt.geom.AffineTransform; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.HashMap; import javax.imageio.ImageIO; import javax.swing.JFileChooser; import javax.swing.JOptionPane; import javax.swing.filechooser.FileNameExtensionFilter; import org.jfree.chart.ChartPanel; import org.jfree.chart.JFreeChart; import org.jfree.chart.axis.ValueAxis; import org.jfree.chart.plot.CombinedDomainXYPlot; import org.jfree.chart.plot.XYPlot; import org.jfree.chart.renderer.xy.XYItemRenderer; import org.signalml.app.document.TagDocument; import org.signalml.domain.tag.StyledTagSet; import org.signalml.plugin.export.SignalMLException; /** * @author piotr@develancer.pl */ public class BookReporterResultFrame extends javax.swing.JFrame { private static final Color[] COLORS = { Color.getHSBColor(0.00f, 0.8f, 0.8f), Color.getHSBColor(0.25f, 0.8f, 0.8f), Color.getHSBColor(0.50f, 0.8f, 0.8f), Color.getHSBColor(0.70f, 0.8f, 0.8f), Color.getHSBColor(0.90f, 0.8f, 0.8f) }; private final BookReporterChartExportDialog exportDialog; private final CombinedDomainXYPlot plot; private final JFreeChart chart; private final HashMap<String, Paint> colors; private StyledTagSet tags; private int nextColor = 0; /** * Creates new form BookReporterResultFrame */ public BookReporterResultFrame() { initComponents(); exportDialog = new BookReporterChartExportDialog(this, true); plot = new CombinedDomainXYPlot(); chart = new JFreeChart(plot); colors = new HashMap<String, Paint>(); tags = null; chart.setBackgroundPaint(Color.WHITE); ChartPanel chartPanel = new ChartPanel(chart); chartPanelContainer.add(chartPanel); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { jPanel1 = new javax.swing.JPanel(); pngSaveButton = new javax.swing.JButton(); tagsSaveButton = new javax.swing.JButton(); chartPanelContainer = new javax.swing.JPanel(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); setTitle("Book reporting result"); setMinimumSize(new java.awt.Dimension(300, 300)); pngSaveButton.setText("Export diagram as PNG"); pngSaveButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { pngSaveButtonActionPerformed(evt); } }); tagsSaveButton.setText("Export tags"); tagsSaveButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { tagsSaveButtonActionPerformed(evt); } }); javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); jPanel1.setLayout(jPanel1Layout); jPanel1Layout.setHorizontalGroup( jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel1Layout.createSequentialGroup() .addComponent(pngSaveButton) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(tagsSaveButton)) ); jPanel1Layout.setVerticalGroup( jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(pngSaveButton) .addComponent(tagsSaveButton)) ); chartPanelContainer.setBackground(java.awt.Color.white); chartPanelContainer.setLayout(new java.awt.GridLayout(0, 1)); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(chartPanelContainer, javax.swing.GroupLayout.DEFAULT_SIZE, 419, Short.MAX_VALUE) .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(chartPanelContainer, javax.swing.GroupLayout.DEFAULT_SIZE, 400, Short.MAX_VALUE)) ); pack(); }// </editor-fold>//GEN-END:initComponents private void pngSaveButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_pngSaveButtonActionPerformed exportDialog.setVisible(true); { File outputFile = exportDialog.getSelectedFile(); if (outputFile != null) { BufferedImage image = this.generateBufferedImage(exportDialog.getPixelWidth(), exportDialog.getPixelHeight(), exportDialog.getScale()); try { ImageIO.write(image, "png", outputFile); JOptionPane.showMessageDialog(this, "Image was saved successfully!", "Image saved to file", JOptionPane.INFORMATION_MESSAGE); } catch (IOException ex) { JOptionPane.showMessageDialog(this, ex.getMessage(), "Error saving image", JOptionPane.ERROR_MESSAGE); } } } }//GEN-LAST:event_pngSaveButtonActionPerformed private void tagsSaveButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tagsSaveButtonActionPerformed JFileChooser fileChooser = new JFileChooser(); fileChooser.setFileFilter(new FileNameExtensionFilter("tag files", "tag")); if (fileChooser.showSaveDialog(this) == JFileChooser.APPROVE_OPTION) { File outputFile = fileChooser.getSelectedFile(); if (outputFile != null) { try { TagDocument document = new TagDocument(tags); try { document.setBackingFile(outputFile); document.saveDocument(); JOptionPane.showMessageDialog(this, "Tags were saved successfully!", "Tags saved to file", JOptionPane.INFORMATION_MESSAGE); } catch (IOException ex) { JOptionPane.showMessageDialog(this, ex.getMessage(), "Error saving tags", JOptionPane.ERROR_MESSAGE); } } catch (SignalMLException ex) { JOptionPane.showMessageDialog(this, ex.getMessage(), "Error processing tags", JOptionPane.ERROR_MESSAGE); } } } }//GEN-LAST:event_tagsSaveButtonActionPerformed public void addPlotToPanel(XYPlot plot) { this.plot.add(plot); String key = (String) plot.getDataset().getSeriesKey(0); Paint existingColor = colors.get(key); XYItemRenderer renderer = plot.getRenderer(); if (existingColor == null) { existingColor = COLORS[nextColor]; nextColor = (nextColor + 1) % COLORS.length; colors.put(key, existingColor); } else { renderer.setSeriesVisibleInLegend(0, false); } renderer.setSeriesPaint(0, existingColor); } public void setTags(StyledTagSet tags) { this.tags = tags; tagsSaveButton.setEnabled(this.tags != null); } public void setTimeAxis(ValueAxis timeAxis) { if (timeAxis != null) { this.plot.setDomainAxis(timeAxis); } } private BufferedImage generateBufferedImage(int width, int height, float scale) { double widthForDraw = width / scale; double heightForDraw = height / scale; BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics2D graphics = image.createGraphics(); AffineTransform saved = graphics.getTransform(); graphics.transform(AffineTransform.getScaleInstance(scale, scale)); chart.draw(graphics, new Rectangle2D.Double(0, 0, widthForDraw, heightForDraw)); graphics.setTransform(saved); graphics.dispose(); return image; } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JPanel chartPanelContainer; private javax.swing.JPanel jPanel1; private javax.swing.JButton pngSaveButton; private javax.swing.JButton tagsSaveButton; // End of variables declaration//GEN-END:variables }