From 5c371ae9187721421df1717537d431fdba88a94d Mon Sep 17 00:00:00 2001 From: tcarver <tjc> Date: Mon, 26 Nov 2012 15:21:18 +0000 Subject: [PATCH] add bamview image save option --- .../artemis/components/alignment/BamView.java | 12 ++ .../components/alignment/PrintBamView.java | 195 ++++++++++++++++++ 2 files changed, 207 insertions(+) create mode 100644 uk/ac/sanger/artemis/components/alignment/PrintBamView.java diff --git a/uk/ac/sanger/artemis/components/alignment/BamView.java b/uk/ac/sanger/artemis/components/alignment/BamView.java index 654e724fc..b576aa4a3 100644 --- a/uk/ac/sanger/artemis/components/alignment/BamView.java +++ b/uk/ac/sanger/artemis/components/alignment/BamView.java @@ -2917,6 +2917,18 @@ public class BamView extends JPanel } }); + + JMenuItem saveAs = new JMenuItem("Save As Image File (png/jpeg/svg) ..."); + fileMenu.add(saveAs); + saveAs.addActionListener(new ActionListener() + { + public void actionPerformed(ActionEvent e) + { + PrintBamView.print((JPanel)mainPanel.getParent()); + } + }); + + JMenuItem close = new JMenuItem("Close"); fileMenu.add(close); close.addActionListener(new ActionListener() diff --git a/uk/ac/sanger/artemis/components/alignment/PrintBamView.java b/uk/ac/sanger/artemis/components/alignment/PrintBamView.java new file mode 100644 index 000000000..806b394a3 --- /dev/null +++ b/uk/ac/sanger/artemis/components/alignment/PrintBamView.java @@ -0,0 +1,195 @@ +/* ProintBamView + * created: 2012 + * This file is part of Artemis + * + * Copyright(C) 2012 Genome Research Limited + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or(at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ +package uk.ac.sanger.artemis.components.alignment; + +import java.awt.Dimension; +import java.awt.Font; +import java.awt.Graphics2D; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.image.BufferedImage; +import java.awt.image.RenderedImage; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.io.UnsupportedEncodingException; +import java.io.Writer; + +import javax.swing.Box; +import javax.swing.JComboBox; +import javax.swing.JFileChooser; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JPanel; + +import org.apache.batik.dom.GenericDOMImplementation; +import org.apache.batik.svggen.SVGGeneratorContext; +import org.apache.batik.svggen.SVGGraphics2D; +import org.apache.batik.svggen.SVGGraphics2DIOException; +import org.w3c.dom.DOMImplementation; +import org.w3c.dom.Document; + +import uk.ac.sanger.artemis.Options; +import uk.ac.sanger.artemis.components.PrintArtemis; +import uk.ac.sanger.artemis.components.StickyFileChooser; + +public class PrintBamView +{ + /** + * Print to a jpeg or png file + */ + public static void print(JPanel containerPanel) + { + // file chooser + final StickyFileChooser fc = new StickyFileChooser(); + File fselect = new File(fc.getCurrentDirectory()+ + System.getProperty("file.separator")+ + "bamview.png"); + fc.setSelectedFile(fselect); + + // file name prefix + Box YBox = Box.createVerticalBox(); + JLabel labFormat = new JLabel("Select Format:"); + Font font = labFormat.getFont(); + labFormat.setFont(font.deriveFont(Font.BOLD)); + YBox.add(labFormat); + + Box bacross = Box.createHorizontalBox(); + final JComboBox formatSelect = new JComboBox(PrintArtemis.getImageFormats()); + formatSelect.setSelectedItem("png"); + formatSelect.addActionListener(new ActionListener() + { + public void actionPerformed(ActionEvent arg0) + { + String selected; + if(fc.getSelectedFile() != null) + { + selected = fc.getSelectedFile().getAbsolutePath(); + String fmts[] = PrintArtemis.getImageFormats(); + for(int i=0; i<fmts.length; i++) + selected = selected.replaceAll("."+fmts[i]+"$", ""); + } + else + selected = "bamview"; + + fc.setSelectedFile(new File(selected+"."+ + formatSelect.getSelectedItem())); + } + }); + + Dimension d = formatSelect.getPreferredSize(); + formatSelect.setMaximumSize(d); + bacross.add(Box.createHorizontalGlue()); + bacross.add(formatSelect); + YBox.add(bacross); + + // file prefix & format options + fc.setAccessory(formatSelect); + int n = fc.showSaveDialog(null); + if(n == JFileChooser.CANCEL_OPTION) + return; + + if(((String)formatSelect.getSelectedItem()).equals("svg")) + { + createSVG(fc.getSelectedFile(), containerPanel); + return; + } + + try + { + javax.imageio.ImageIO.write( + createImage(containerPanel), + (String)formatSelect.getSelectedItem(), + new File(fc.getSelectedFile().getAbsolutePath())); + } + catch(NoClassDefFoundError ex) + { + JOptionPane.showMessageDialog(null, + "This option requires Java 1.4 or higher."); + } + catch ( IOException e ) + { + System.out.println("Java 1.4+ is required"); + e.printStackTrace(); + } + } + + /** + * Scalable Vector Graphics (SVG) + * @param fout + * @param containerPanel + */ + private static void createSVG(final File fout, final JPanel containerPanel) + { + final DOMImplementation domImpl = + GenericDOMImplementation.getDOMImplementation(); + final Document doc = domImpl.createDocument( + "http://www.w3.org/2000/svg", "svg", null); + + SVGGeneratorContext ctx = SVGGeneratorContext.createDefault(doc); + ctx.setComment("Generated by BamView with Batik SVG Generator"); + final SVGGraphics2D svgG = new SVGGraphics2D(ctx, true); + svgG.setFont(Options.getOptions().getFont()); + svgG.setSVGCanvasSize( containerPanel.getSize() ); + containerPanel.paintAll(svgG); + + try + { + final Writer out = new OutputStreamWriter( + new FileOutputStream(fout), "UTF-8"); + svgG.stream(out, true); + } + catch (UnsupportedEncodingException e) + { + e.printStackTrace(); + } + catch (SVGGraphics2DIOException e) + { + e.printStackTrace(); + } + catch (FileNotFoundException e) + { + e.printStackTrace(); + } + + return; + } + + /** + * Returns a generated image + * @param pageIndex page number + * @return image + */ + private static RenderedImage createImage(final JPanel containerPanel) + { + // Create a buffered image in which to draw + BufferedImage bufferedImage = new BufferedImage( + containerPanel.getWidth(),containerPanel.getHeight(), + BufferedImage.TYPE_INT_RGB); + // Create a graphics contents on the buffered image + Graphics2D g2d = bufferedImage.createGraphics(); + containerPanel.paintAll(g2d); + return bufferedImage; + } +} \ No newline at end of file -- GitLab