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;
{
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();
+
+ exportJalviewAlignmentAsBioJsHtmlFile();
+ }
}
- 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<BioJsFeaturePojo> bjsSeqFeatures = new ArrayList<BioJsFeaturePojo>();
+ 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)
{
}
}
}
-
return sb.toString();
}
+ public String getGlobalColorScheme()
+ {
+ return globalColorScheme;
+ }
+
+ public void setGlobalColorScheme(String globalColorScheme)
+ {
+ this.globalColorScheme = globalColorScheme;
+ }
+
}