X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fio%2FHTMLOutput.java;fp=src%2Fjalview%2Fio%2FHTMLOutput.java;h=68f3e2c0d1280c1516daa099d137e85998cd7bea;hb=2595e9d4ee0dbbd3406a98c4e49a61ccde806479;hp=df0dc06ff87249ee72c95e99551b592b5553511d;hpb=e20075ba805d744d7cc4976e2b8d5e5840fb0a8d;p=jalview.git diff --git a/src/jalview/io/HTMLOutput.java b/src/jalview/io/HTMLOutput.java index df0dc06..68f3e2c 100755 --- a/src/jalview/io/HTMLOutput.java +++ b/src/jalview/io/HTMLOutput.java @@ -1,302 +1,147 @@ -/* - * 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 jalview.datamodel.AlignmentI; -import jalview.datamodel.SequenceI; -import jalview.gui.AlignViewport; +import jalview.api.AlignExportSettingI; +import jalview.datamodel.AlignmentExportData; +import jalview.exceptions.NoFileSelectedException; import jalview.gui.AlignmentPanel; -import jalview.gui.FeatureRenderer; -import jalview.gui.SequenceRenderer; +import jalview.gui.IProgressIndicator; import jalview.util.MessageManager; -import java.awt.Color; -import java.awt.Font; -import java.io.PrintWriter; +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.URL; +import java.util.Objects; -public class HTMLOutput +public abstract class HTMLOutput implements Runnable { - AlignViewport av; + protected AlignmentPanel ap; - SequenceRenderer sr; + protected long pSessionId; - jalview.renderer.seqfeatures.FeatureRenderer fr; + protected IProgressIndicator pIndicator; - Color color; + protected File generatedFile; - public HTMLOutput(AlignmentPanel ap, SequenceRenderer sr, - FeatureRenderer fr1) + public HTMLOutput(AlignmentPanel ap) { - this.av = ap.av; - this.sr = sr; - - fr = new FeatureRenderer(ap); - 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(MessageManager.getString("label.save_as_html")); - chooser.setToolTipText(MessageManager.getString("action.save")); - - int value = chooser.showSaveDialog(null); - - if (value == JalviewFileChooser.APPROVE_OPTION) + if (ap != null) { - 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(); - } + this.ap = ap; + this.pIndicator = ap.alignFrame; } } - void drawUnwrappedAlignment(PrintWriter out) + public String getBioJSONData() { - out.println("
\n"); - out.println("\n"); - - // //////////// - SequenceI seq; - AlignmentI alignment = av.getAlignment(); - - // draws the top row, the measure rule - out.println(""); - - int i = 0; + return getBioJSONData(null); + } - for (i = 10; i < (alignment.getWidth() - 10); i += 10) + public String getBioJSONData(AlignExportSettingI exportSettings) + { + if (!isEmbedData()) { - out.println(""); + return null; } - - out.println(""); - out.println(""); - - for (i = 0; i < alignment.getHeight(); i++) + if (exportSettings == null) { - seq = alignment.getSequenceAt(i); - - String id = seq.getDisplayId(av.getShowJVSuffix()); - - out.println(""); - - for (int res = 0; res < seq.getLength(); res++) + exportSettings = new AlignExportSettingI() { - if (!jalview.util.Comparison.isGap(seq.getCharAt(res))) + @Override + public boolean isExportHiddenSequences() { - color = sr.getResidueBoxColour(seq, res); + return true; + } - color = fr.findFeatureColour(color, seq, res); + @Override + public boolean isExportHiddenColumns() + { + return true; } - else + + @Override + public boolean isExportAnnotations() { - color = Color.white; + return true; } - if (color.getRGB() < -1) + @Override + public boolean isExportFeatures() { - out.println(""); + return true; } - else + + @Override + public boolean isExportGroups() { - out.println(""); + return true; } - } - out.println(""); + @Override + public boolean isCancelled() + { + return false; + } + }; } - - // //////////// - out.println("
" + i + "
|
" + i - + "
|
" + id + "  " - + seq.getCharAt(res) + "" + seq.getCharAt(res) + "
"); - out.println("
"); + AlignmentExportData exportData = jalview.gui.AlignFrame + .getAlignmentForExport(FileFormat.Json, + ap.getAlignViewport(), exportSettings); + String bioJSON = new FormatAdapter(ap, exportData.getSettings()) + .formatSequences(FileFormat.Json, exportData.getAlignment(), + exportData.getOmitHidden(), exportData + .getStartEndPostions(), ap.getAlignViewport() + .getColumnSelection()); + return bioJSON; } - void drawWrappedAlignment(PrintWriter out) + /** + * 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 { - // ////////////////////////////////// - // / 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()) + 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) { - int endRes = startRes + av.getWrappedWidth(); - - if (endRes > al.getWidth()) - { - endRes = al.getWidth(); - } - - if (av.getScaleAboveWrapped()) + try { - out.println(""); - - if (av.getScaleLeftWrapped()) + isReader = new InputStreamReader(url.openStream()); + buffReader = new BufferedReader(isReader); + String line; + String lineSeparator = System.getProperty("line.separator"); + while ((line = buffReader.readLine()) != null) { - out.println(""); + sb.append(line).append(lineSeparator); } - 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++) + + } catch (Exception ex) { - 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()) + ex.printStackTrace(); + } finally + { + if (isReader != null) { - out.println(""); + isReader.close(); } - - if (av.getScaleRightWrapped() && startPos < endPos) + + if (buffReader != null) { - out.println(""); + buffReader.close(); } - - out.println(""); - } - - if (endRes < al.getWidth()) - { - out.println(""); } } - - out.println("
  " + i + "
|
" + id + "   " + startPos + "  " - + seq.getCharAt(res) + "" + seq.getCharAt(res) + "" - + "   " + endPos + "  
"); - out.println("
"); + return sb.toString(); } public static String getImageMapHTML() @@ -386,4 +231,120 @@ public class HTMLOutput + "initToolTips(); //-->\n"); } -} + + public String getOutputFile() throws NoFileSelectedException + { + String selectedFile = null; + if (pIndicator != null && !isHeadless()) + { + pIndicator.setProgressBar(MessageManager.formatMessage( + "status.waiting_for_user_to_select_output_file", "HTML"), + pSessionId); + } + + 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) + { + jalview.bin.Cache.setProperty("LAST_DIRECTORY", jvFileChooser + .getSelectedFile().getParent()); + selectedFile = jvFileChooser.getSelectedFile().getPath(); + } + else + { + throw new NoFileSelectedException("No file was selected."); + } + 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 before a HTML file export. It MUST be called at the start of the + * exportHTML() method implementation. + */ + protected void exportStarted() + { + pSessionId = System.currentTimeMillis(); + } + + /** + * 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 abstract File getExportedFile(); + + /** + * This is the main method to handle the HTML generation. + * + * @param outputFile + * the file path of the generated HTML + */ + public abstract void exportHTML(String outputFile); +} \ No newline at end of file