X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fjalview%2Fio%2FBioJsHTMLOutput.java;h=db43a3f7bf1a17bcd2eca81f6249ab2450566b7f;hb=25aaaa87042b3f507ad4348120df7dd073182759;hp=d4c9ba058525ea1d16d6ea4d7bae78e7af39978c;hpb=c958992ac5ee0846e647e74d1bc0599c039c00d4;p=jalview.git diff --git a/src/jalview/io/BioJsHTMLOutput.java b/src/jalview/io/BioJsHTMLOutput.java index d4c9ba0..db43a3f 100644 --- a/src/jalview/io/BioJsHTMLOutput.java +++ b/src/jalview/io/BioJsHTMLOutput.java @@ -1,20 +1,26 @@ package jalview.io; +import jalview.api.FeaturesDisplayedI; import jalview.datamodel.AlignmentI; +import jalview.datamodel.SequenceFeature; import jalview.datamodel.SequenceI; +import jalview.exceptions.NoFileSelectedException; import jalview.gui.AlignViewport; import jalview.gui.AlignmentPanel; import jalview.gui.FeatureRenderer; -import jalview.gui.SequenceRenderer; import jalview.json.binding.v1.BioJsAlignmentPojo; +import jalview.json.binding.v1.BioJsFeaturePojo; import jalview.json.binding.v1.BioJsSeqPojo; +import jalview.schemes.ColourSchemeProperty; import jalview.util.MessageManager; +import java.awt.Color; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.URL; +import java.util.ArrayList; import com.json.JSONException; @@ -22,92 +28,154 @@ public class BioJsHTMLOutput { private AlignViewport av; - private FeatureRenderer fr; + private jalview.api.FeatureRenderer fr; - public BioJsHTMLOutput(AlignmentPanel ap, SequenceRenderer sr, + private String globalColorScheme; + + private FeaturesDisplayedI displayedFeatures; + + private String jalviewVersion; + + private String webStartLaunchServletUrl = "http://www.jalview.org/services/launchApp"; + + public BioJsHTMLOutput(AlignmentPanel ap, FeatureRenderer fr1) { - this.av = ap.av; - this.fr = new FeatureRenderer(ap); - fr.transferSettings(fr1); - exportAsBioJsHtml(); + + jalviewVersion = jalview.bin.Cache.getProperty("VERSION"); + webStartLaunchServletUrl = jalview.bin.Cache.getDefault( + "www.jalview.org", "http://www.jalview.org") + + "/services/launchApp"; + if (ap != null) + { + this.av = ap.av; + this.globalColorScheme = ColourSchemeProperty.getColourName(av + .getGlobalColourScheme()); + this.fr = ap.cloneFeatureRenderer(); + displayedFeatures = av.getFeaturesDisplayed(); + } } - private void exportAsBioJsHtml() + private void exportJalviewAlignmentAsBioJsHtmlFile() { try { - JalviewFileChooser jvFileChooser = getJalviewFileChooserOption(); - int fileChooserOpt = jvFileChooser.showSaveDialog(null); - if (fileChooserOpt == JalviewFileChooser.APPROVE_OPTION) - { - jalview.bin.Cache.setProperty("LAST_DIRECTORY", jvFileChooser - .getSelectedFile().getParent()); - String selectedFile = jvFileChooser.getSelectedFile().getPath(); - String generartedBioJs = generateBioJsAlignmentData(av - .getAlignment()); - PrintWriter out = new java.io.PrintWriter(new java.io.FileWriter( - selectedFile)); - out.print(generartedBioJs); - out.close(); - jalview.util.BrowserLauncher.openURL("file:///" + selectedFile); - } - } catch (Exception ex) + String outputFile = getOutputFile(); + String jalviewAlignmentJson = getJalviewAlignmentAsJsonString(av + .getAlignment()); + String bioJSTemplateString = getBioJsTemplateAsString(this); + String generatedBioJsWithJalviewAlignmentAsJson = bioJSTemplateString + .replaceAll( +"#sequenceData#", jalviewAlignmentJson) + .toString(); + + PrintWriter out = new java.io.PrintWriter(new java.io.FileWriter( + outputFile)); + out.print(generatedBioJsWithJalviewAlignmentAsJson); + out.flush(); + out.close(); + jalview.util.BrowserLauncher.openURL("file:///" + outputFile); + } catch (NoFileSelectedException ex) + { + // do noting if no file was selected + } catch (Exception e) { - ex.printStackTrace(); + e.printStackTrace(); } } - private JalviewFileChooser getJalviewFileChooserOption() + public String getOutputFile() throws NoFileSelectedException { - JalviewFileChooser chooser = new JalviewFileChooser( + String selectedFile = null; + JalviewFileChooser jvFileChooser = new JalviewFileChooser( jalview.bin.Cache.getProperty("LAST_DIRECTORY"), new String[] { "html" }, new String[] { "HTML files" }, "HTML files"); - chooser.setFileView(new JalviewFileView()); + jvFileChooser.setFileView(new JalviewFileView()); // TODO uncomment when supported by MassageManager - chooser.setDialogTitle(MessageManager + jvFileChooser.setDialogTitle(MessageManager .getString("label.save_as_biojs_html")); - chooser.setDialogTitle("save as BioJs HTML"); - chooser.setToolTipText(MessageManager.getString("action.save")); + jvFileChooser.setDialogTitle("save as BioJs 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 chooser; + return selectedFile; } - private String generateBioJsAlignmentData(AlignmentI alignment) + public String getJalviewAlignmentAsJsonString(AlignmentI alignment) throws IOException, JSONException { BioJsAlignmentPojo bjsAlignment = new BioJsAlignmentPojo(); + + bjsAlignment.setGlobalColorScheme(getGlobalColorScheme()); + bjsAlignment.setJalviewVersion(jalviewVersion); + bjsAlignment.setWebStartUrl(webStartLaunchServletUrl); + int count = 0; for (SequenceI seq : alignment.getSequences()) { StringBuilder name = new StringBuilder(); name.append(seq.getName()).append("/").append(seq.getStart()) .append("-").append(seq.getEnd()); - bjsAlignment.getSeqs().add( - new BioJsSeqPojo(String.valueOf(++count), name.toString(), - seq.getSequenceAsString())); - } - String seqs = new com.json.JSONObject(bjsAlignment).getString("seqs"); - // String bioJSTemplate = new String( - // java.nio.file.Files.readAllBytes(java.nio.file.Paths - // .get("resources/templates/BioJSTemplate.txt"))); - String bioJSTemplate = getBioJsTemplateAsString(alignment); + BioJsSeqPojo seqPojo = new BioJsSeqPojo(); + seqPojo.setId(String.valueOf(++count)); + seqPojo.setEnd(seq.getEnd()); + seqPojo.setStart(seq.getStart()); + seqPojo.setName(name.toString()); + seqPojo.setSeq(seq.getSequenceAsString()); - return bioJSTemplate.replaceAll("#sequenceData#", seqs).replaceAll( - "#scheme#", "zappo"); - } + SequenceFeature[] seqFeatures = seq.getDatasetSequence() + .getSequenceFeatures(); + if (seqFeatures != null) + { + ArrayList bjsSeqFeatures = new ArrayList(); + for (SequenceFeature sf : seqFeatures) + { + if (displayedFeatures != null + && displayedFeatures.isVisible(sf.getType())) + { + + // TODO: translate graduated/complex colourschemes to biojs model + String featureColour = jalview.util.Format.getHexString(fr + .findFeatureColour(Color.white, seq, + seq.findIndex(sf.getBegin()))); + BioJsFeaturePojo bjsFeature = new BioJsFeaturePojo(); + bjsFeature.setFillColor(featureColour); + bjsFeature.setXstart(seq.findIndex(sf.getBegin()) - 1); + bjsFeature.setXend(seq.findIndex(sf.getEnd())); + bjsFeature.setText(sf.getType()); + bjsSeqFeatures.add(bjsFeature); + } + } + seqPojo.setFeatures(bjsSeqFeatures); + } + bjsAlignment.getSeqs().add(seqPojo); + } + return new com.json.JSONObject(bjsAlignment).toString() + .replaceAll("xstart", "xStart").replaceAll("xend", "xEnd"); + } - public static String getBioJsTemplateAsString(AlignmentI bio) + public static String getBioJsTemplateAsString(Object currentObj) throws IOException { InputStreamReader isReader = null; BufferedReader buffReader = null; StringBuilder sb = new StringBuilder(); - URL url = bio.getClass().getResource( + URL url = currentObj.getClass().getResource( "/templates/BioJSTemplate.txt"); if (url != null) { @@ -138,8 +206,17 @@ public class BioJsHTMLOutput } } } - return sb.toString(); } + public String getGlobalColorScheme() + { + return globalColorScheme; + } + + public void setGlobalColorScheme(String globalColorScheme) + { + this.globalColorScheme = globalColorScheme; + } + }