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