X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fjalview%2Fio%2FHTMLOutput.java;h=eb44180a9095157205893ec98f1c05f6de52b2f3;hb=f4b18ae31d37e694b59875f26e0863179de248f1;hp=32d8a1f6163357ef7f98bc1ab0095d8ba445ecea;hpb=312a01c56639fe2d5a94a7918e6968955533afc5;p=jalview.git diff --git a/src/jalview/io/HTMLOutput.java b/src/jalview/io/HTMLOutput.java old mode 100755 new mode 100644 index 32d8a1f..eb44180 --- a/src/jalview/io/HTMLOutput.java +++ b/src/jalview/io/HTMLOutput.java @@ -1,381 +1,346 @@ -/* - * Jalview - A Sequence Alignment Editor and Viewer - * Copyright (C) 2006 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle - * - * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - */ -package jalview.io; - -import java.io.*; - -import java.awt.*; - -import jalview.datamodel.*; -import jalview.gui.*; - -public class HTMLOutput -{ - AlignViewport av; - SequenceRenderer sr; - FeatureRenderer fr; - Color color; - - public HTMLOutput(AlignViewport av, SequenceRenderer sr, FeatureRenderer fr1) - { - this.av = av; - this.sr = sr; - - fr = new FeatureRenderer(av); - fr.transferSettings(fr1); - - JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache. - getProperty( - "LAST_DIRECTORY"), new String[] - {"html"}, - new String[] - {"HTML files"}, "HTML files"); - - chooser.setFileView(new JalviewFileView()); - chooser.setDialogTitle("Save as HTML"); - chooser.setToolTipText("Save"); - - int value = chooser.showSaveDialog(null); - - if (value == JalviewFileChooser.APPROVE_OPTION) - { - String choice = chooser.getSelectedFile().getPath(); - jalview.bin.Cache.setProperty("LAST_DIRECTORY", - chooser.getSelectedFile().getParent()); - - try - { - PrintWriter out = new java.io.PrintWriter(new java.io.FileWriter( - choice)); - out.println(""); - out.println(""); - out.println(""); - - if (av.getWrapAlignment()) - { - drawWrappedAlignment(out); - } - else - { - drawUnwrappedAlignment(out); - } - - out.println("\n\n"); - out.close(); - jalview.util.BrowserLauncher.openURL("file:///" + choice); - } - catch (Exception ex) - { - ex.printStackTrace(); - } - } - } - - void drawUnwrappedAlignment(PrintWriter out) - { - out.println("
\n"); - out.println( - "\n"); - - ////////////// - SequenceI seq; - AlignmentI alignment = av.getAlignment(); - - // draws the top row, the measure rule - out.println(""); - - int i = 0; - - for (i = 10; i < (alignment.getWidth() - 10); i += 10) - { - out.println(""); - } - - out.println(""); - out.println(""); - - for (i = 0; i < alignment.getHeight(); i++) - { - seq = alignment.getSequenceAt(i); - - String id = seq.getDisplayId(av.getShowJVSuffix()); - - out.println(""); - - - for (int res = 0; res < seq.getLength(); res++) - { - if (!jalview.util.Comparison.isGap(seq.getCharAt(res))) - { - color = sr.getResidueBoxColour(seq, res); - - color = fr.findFeatureColour(color, seq, res); - } - else - color = Color.white; - - - if (color.getRGB() < -1) - { - out.println(""); - } - else - { - out.println(""); - } - } - - out.println(""); - } - - ////////////// - out.println("
" + i + "
|
" + i + - "
|
" + id + - "  " + - seq.getCharAt(res) + "" + seq.getCharAt(res) + "
"); - out.println("
"); - } - - void drawWrappedAlignment(PrintWriter out) - { - //////////////////////////////////// - /// How many sequences and residues can we fit on a printable page? - AlignmentI al = av.getAlignment(); - SequenceI seq; - String r; - String g; - String b; - - out.println("
\n"); - out.println( - "\n"); - - for (int startRes = 0; startRes < al.getWidth(); - startRes += av.getWrappedWidth()) - { - int endRes = startRes + av.getWrappedWidth(); - - if (endRes > al.getWidth()) - { - endRes = al.getWidth(); - } - - if(av.getScaleAboveWrapped()) - { - out.println(""); - - if (av.getScaleLeftWrapped()) - out.println(""); - else - out.println(""); - - - for (int i = startRes + 10; i < endRes; i += 10) - { - out.println(""); - } - - out.println(""); - } - - int startPos, endPos; - for (int s = 0; s < al.getHeight(); s++) - { - out.println(""); - seq = al.getSequenceAt(s); - - startPos = seq.findPosition( startRes ); - endPos = seq.findPosition( endRes )-1; - - String id = seq.getDisplayId(av.getShowJVSuffix()); - - out.println(""); - - - if(av.getScaleLeftWrapped()) - { - if(startPos > seq.getEnd() || endPos==0) - out.println(""); - else - out.println(""); - } - - - for (int res = startRes; res < endRes; res++) - { - if (!jalview.util.Comparison.isGap(seq.getCharAt(res))) - { - color = sr.getResidueBoxColour(seq, res); - - color = fr.findFeatureColour(color, seq, res); - } - else - color = Color.white; - - if (color.getRGB() < -1) - { - out.println(""); - } - else - { - out.println(""); - } - - - } - - if(av.getScaleRightWrapped() && - endRes < startRes + av.getWrappedWidth()) - { - out.println(""); - } - - - if(av.getScaleRightWrapped() && startPos " + endPos + - "  "); - } - - - out.println(""); - } - - if (endRes < al.getWidth()) - { - out.println(""); - } - } - - out.println("
  " + i + "
|
" + id + - "   " + startPos + - "  " + - seq.getCharAt(res) + "" + seq.getCharAt(res) + "" - +"  
"); - out.println("
"); - } - - public static String getImageMapHTML() - { - return new String( - "\n" - +"\n" - +"\n" - +"\n" - +"\n" - +"
\n" - +"\n"); - - } -} +/* + * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) + * Copyright (C) $$Year-Rel$$ The Jalview Authors + * + * This file is part of Jalview. + * + * Jalview 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 3 + * of the License, or (at your option) any later version. + * + * Jalview 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 Jalview. If not, see . + * The Jalview Authors are detailed in the 'AUTHORS' file. + */ +package jalview.io; + +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.URL; +import java.util.Objects; + +import jalview.api.AlignExportSettingsI; +import jalview.bin.Cache; +import jalview.datamodel.AlignExportSettingsAdapter; +import jalview.datamodel.AlignmentExportData; +import jalview.gui.AlignmentPanel; +import jalview.gui.IProgressIndicator; +import jalview.util.MessageManager; + +public abstract class HTMLOutput implements Runnable +{ + protected AlignmentPanel ap; + + /* + * key for progress or status messages + */ + protected long pSessionId; + + /* + * (optional) place to write progress messages to + */ + protected IProgressIndicator pIndicator; + + protected File generatedFile; + + String _bioJson = null; + + private String description; + + /** + * Constructor given an alignment panel (which should not be null) + * + * @param ap + * @param desc + */ + public HTMLOutput(AlignmentPanel ap, String desc) + { + this.ap = ap; + this.pIndicator = ap.alignFrame; + this.description = desc; + this.pSessionId = System.currentTimeMillis(); + } + + /** + * Gets the BioJSON data as a string, with lazy evaluation (first time called + * only). If the output format is configured not to embed BioJSON, returns + * null. + * + * @return + */ + public String getBioJSONData() + { + if (!isEmbedData()) + { + return null; + } + if (_bioJson == null) + { + AlignExportSettingsI options = new AlignExportSettingsAdapter(true); + AlignmentExportData exportData = ap.getAlignViewport() + .getAlignExportData(options); + _bioJson = new FormatAdapter(ap, options).formatSequences( + FileFormat.Json, exportData.getAlignment(), + exportData.getOmitHidden(), exportData.getStartEndPostions(), + ap.getAlignViewport().getAlignment().getHiddenColumns()); + } + + return _bioJson; + } + + /** + * Read a template file content as string + * + * @param file + * - the file to be read + * @return File content as String + * @throws IOException + */ + public static String readFileAsString(File file) throws IOException + { + InputStreamReader isReader = null; + BufferedReader buffReader = null; + StringBuilder sb = new StringBuilder(); + Objects.requireNonNull(file, "File must not be null!"); + @SuppressWarnings("deprecation") + URL url = file.toURL(); + if (url != null) + { + try + { + isReader = new InputStreamReader(url.openStream()); + buffReader = new BufferedReader(isReader); + String line; + String lineSeparator = System.getProperty("line.separator"); + while ((line = buffReader.readLine()) != null) + { + sb.append(line).append(lineSeparator); + } + + } catch (Exception ex) + { + ex.printStackTrace(); + } finally + { + if (isReader != null) + { + isReader.close(); + } + + if (buffReader != null) + { + buffReader.close(); + } + } + } + return sb.toString(); + } + + public static String getImageMapHTML() + { + return new String("\n" + "\n" + + "\n" + "\n" + "\n" + + "
\n" + + "\n"); + + } + + /** + * Prompts the user to choose an output file and returns the file path, or + * null on Cancel + * + * @return + */ + public String getOutputFile() + { + String selectedFile = null; + + // TODO: JAL-3048 generate html rendered view (requires SvgGraphics and/or + // Jalview HTML rendering system- probably not required for Jalview-JS) + JalviewFileChooser jvFileChooser = new JalviewFileChooser("html", + "HTML files"); + jvFileChooser.setFileView(new JalviewFileView()); + + jvFileChooser + .setDialogTitle(MessageManager.getString("label.save_as_html")); + jvFileChooser.setToolTipText(MessageManager.getString("action.save")); + + int fileChooserOpt = jvFileChooser.showSaveDialog(null); + if (fileChooserOpt == JalviewFileChooser.APPROVE_OPTION) + { + Cache.setProperty("LAST_DIRECTORY", + jvFileChooser.getSelectedFile().getParent()); + selectedFile = jvFileChooser.getSelectedFile().getPath(); + } + + return selectedFile; + } + + protected void setProgressMessage(String message) + { + if (pIndicator != null && !isHeadless()) + { + pIndicator.setProgressBar(message, pSessionId); + } + else + { + System.out.println(message); + } + } + + /** + * Answers true if HTML export is invoke in headless mode or false otherwise + * + * @return + */ + protected boolean isHeadless() + { + return System.getProperty("java.awt.headless") != null + && System.getProperty("java.awt.headless").equals("true"); + } + + /** + * This method provides implementation of consistent behaviour which should + * occur after a HTML file export. It MUST be called at the end of the + * exportHTML() method implementation. + */ + protected void exportCompleted() + { + if (isLaunchInBrowserAfterExport() && !isHeadless()) + { + /* + try + { + */ + jalview.util.BrowserLauncher.openURL("file:///" + getExportedFile()); + /* + } catch (IOException e) + { + e.printStackTrace(); + } + */ + } + } + + /** + * if this answers true then BioJSON data will be embedded to the exported + * HTML file otherwise it won't be embedded. + * + * @return + */ + public abstract boolean isEmbedData(); + + /** + * if this answers true then the generated HTML file is opened for viewing in + * a browser after its generation otherwise it won't be opened in a browser + * + * @return + */ + public abstract boolean isLaunchInBrowserAfterExport(); + + /** + * handle to the generated HTML file + * + * @return + */ + public File getExportedFile() + { + return generatedFile; + } + + public void exportHTML(String outputFile) + { + setProgressMessage(MessageManager.formatMessage( + "status.exporting_alignment_as_x_file", getDescription())); + try + { + if (outputFile == null) + { + /* + * prompt for output file + */ + outputFile = getOutputFile(); + if (outputFile == null) + { + setProgressMessage(MessageManager.formatMessage( + "status.cancelled_image_export_operation", + getDescription())); + return; + } + } + generatedFile = new File(outputFile); + } catch (Exception e) + { + setProgressMessage(MessageManager + .formatMessage("info.error_creating_file", getDescription())); + e.printStackTrace(); + return; + } + new Thread(this).start(); + + } + + /** + * Answers a short description of the image format suitable for display in + * messages + * + * @return + */ + protected final String getDescription() + { + return description; + } +} \ No newline at end of file