X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fbin%2FJalviewLite.java;h=75b0add8c24a519380a694c7dc2342b74c2468a0;hb=4f4671d6ef1cb82d03fa9959f4e46d692babc1ef;hp=ef1e16e17d7ae1d3519146f2326af57390a234ed;hpb=aced09c4feeaf3406269442c14e54abeeb4cad81;p=jalview.git diff --git a/src/jalview/bin/JalviewLite.java b/src/jalview/bin/JalviewLite.java index ef1e16e..75b0add 100644 --- a/src/jalview/bin/JalviewLite.java +++ b/src/jalview/bin/JalviewLite.java @@ -1,6 +1,6 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2) - * Copyright (C) 2014 The Jalview Authors + * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) + * Copyright (C) $$Year-Rel$$ The Jalview Authors * * This file is part of Jalview. * @@ -20,30 +20,44 @@ */ package jalview.bin; +import jalview.analysis.AlignmentUtils; +import jalview.api.AlignFrameI; +import jalview.api.AlignViewportI; +import jalview.api.JalviewApp; import jalview.api.StructureSelectionManagerProvider; import jalview.appletgui.AlignFrame; import jalview.appletgui.AlignViewport; import jalview.appletgui.EmbmenuFrame; import jalview.appletgui.FeatureSettings; +import jalview.appletgui.SplitFrame; import jalview.datamodel.Alignment; import jalview.datamodel.AlignmentI; import jalview.datamodel.AlignmentOrder; import jalview.datamodel.ColumnSelection; +import jalview.datamodel.HiddenColumns; import jalview.datamodel.PDBEntry; -import jalview.datamodel.Sequence; import jalview.datamodel.SequenceGroup; import jalview.datamodel.SequenceI; import jalview.io.AnnotationFile; import jalview.io.AppletFormatAdapter; +import jalview.io.DataSourceType; +import jalview.io.FileFormatI; +import jalview.io.FileFormats; import jalview.io.FileParse; import jalview.io.IdentifyFile; -import jalview.io.JnetAnnotationMaker; +import jalview.io.NewickFile; import jalview.javascript.JSFunctionExec; import jalview.javascript.JalviewLiteJsApi; import jalview.javascript.JsCallBack; +import jalview.javascript.MouseOverStructureListener; +import jalview.renderer.seqfeatures.FeatureRenderer; import jalview.structure.SelectionListener; +import jalview.structure.SelectionSource; import jalview.structure.StructureSelectionManager; +import jalview.structure.VamsasSource; +import jalview.util.ColorUtils; import jalview.util.MessageManager; +import jalview.viewmodel.AlignmentViewport; import java.applet.Applet; import java.awt.Button; @@ -57,13 +71,14 @@ import java.awt.event.ActionEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.BufferedReader; +import java.io.IOException; import java.io.InputStreamReader; import java.net.URL; +import java.util.ArrayList; import java.util.Hashtable; -import java.util.StringTokenizer; +import java.util.List; import java.util.Vector; -import netscape.javascript.JSException; import netscape.javascript.JSObject; /** @@ -72,23 +87,40 @@ import netscape.javascript.JSObject; * @author $author$ * @version $Revision: 1.92 $ */ -public class JalviewLite extends Applet implements - StructureSelectionManagerProvider, JalviewLiteJsApi +@SuppressWarnings("serial") +public class JalviewLite extends Applet + implements StructureSelectionManagerProvider, JalviewLiteJsApi, + JalviewApp { + public JalviewLite() + { + appLoader = new JalviewAppLoader(debug); + } + private static final String TRUE = "true"; + + private static final String FALSE = "false"; + public StructureSelectionManager getStructureSelectionManager() { return StructureSelectionManager.getStructureSelectionManager(this); } + @Override + public StructureSelectionManagerProvider getStructureSelectionManagerProvider() + { + return this; + } + // ///////////////////////////////////////// - // The following public methods maybe called + // The following public methods may be called // externally, eg via javascript in HTML page /* * (non-Javadoc) * * @see jalview.bin.JalviewLiteJsApi#getSelectedSequences() */ + @Override public String getSelectedSequences() { return getSelectedSequencesFrom(getDefaultTargetFrame()); @@ -99,6 +131,7 @@ public class JalviewLite extends Applet implements * * @see jalview.bin.JalviewLiteJsApi#getSelectedSequences(java.lang.String) */ + @Override public String getSelectedSequences(String sep) { return getSelectedSequencesFrom(getDefaultTargetFrame(), sep); @@ -111,7 +144,8 @@ public class JalviewLite extends Applet implements * jalview.bin.JalviewLiteJsApi#getSelectedSequencesFrom(jalview.appletgui * .AlignFrame) */ - public String getSelectedSequencesFrom(AlignFrame alf) + @Override + public String getSelectedSequencesFrom(AlignFrameI alf) { return getSelectedSequencesFrom(alf, separator); // ""+0x00AC); } @@ -123,17 +157,19 @@ public class JalviewLite extends Applet implements * jalview.bin.JalviewLiteJsApi#getSelectedSequencesFrom(jalview.appletgui * .AlignFrame, java.lang.String) */ - public String getSelectedSequencesFrom(AlignFrame alf, String sep) + @Override + public String getSelectedSequencesFrom(AlignFrameI alf, String sep) { StringBuffer result = new StringBuffer(""); if (sep == null || sep.length() == 0) { sep = separator; // "+0x00AC; } - if (alf.viewport.getSelectionGroup() != null) + if (((AlignFrame) alf).viewport.getSelectionGroup() != null) { - SequenceI[] seqs = alf.viewport.getSelectionGroup() - .getSequencesInOrder(alf.viewport.getAlignment()); + SequenceI[] seqs = ((AlignFrame) alf).viewport.getSelectionGroup() + .getSequencesInOrder( + ((AlignFrame) alf).viewport.getAlignment()); for (int i = 0; i < seqs.length; i++) { @@ -151,6 +187,7 @@ public class JalviewLite extends Applet implements * @see jalview.bin.JalviewLiteJsApi#highlight(java.lang.String, * java.lang.String, java.lang.String) */ + @Override public void highlight(String sequenceId, String position, String alignedPosition) { @@ -164,12 +201,13 @@ public class JalviewLite extends Applet implements * @see jalview.bin.JalviewLiteJsApi#highlightIn(jalview.appletgui.AlignFrame, * java.lang.String, java.lang.String, java.lang.String) */ - public void highlightIn(final AlignFrame alf, final String sequenceId, + @Override + public void highlightIn(final AlignFrameI alf, final String sequenceId, final String position, final String alignedPosition) { // TODO: could try to highlight in all alignments if alf==null jalview.analysis.SequenceIdMatcher matcher = new jalview.analysis.SequenceIdMatcher( - alf.viewport.getAlignment().getSequencesArray()); + ((AlignFrame) alf).viewport.getAlignment().getSequencesArray()); final SequenceI sq = matcher.findIdMatch(sequenceId); if (sq != null) { @@ -185,9 +223,8 @@ public class JalviewLite extends Applet implements final StructureSelectionManagerProvider me = this; final int pos = apos; // use vamsas listener to broadcast to all listeners in scope - if (alignedPosition != null - && (alignedPosition.trim().length() == 0 || alignedPosition - .toLowerCase().indexOf("false") > -1)) + if (alignedPosition != null && (alignedPosition.trim().length() == 0 + || alignedPosition.toLowerCase().indexOf("false") > -1)) { java.awt.EventQueue.invokeLater(new Runnable() { @@ -220,6 +257,7 @@ public class JalviewLite extends Applet implements * @see jalview.bin.JalviewLiteJsApi#select(java.lang.String, * java.lang.String) */ + @Override public void select(String sequenceIds, String columns) { selectIn(getDefaultTargetFrame(), sequenceIds, columns, separator); @@ -231,6 +269,7 @@ public class JalviewLite extends Applet implements * @see jalview.bin.JalviewLiteJsApi#select(java.lang.String, * java.lang.String, java.lang.String) */ + @Override public void select(String sequenceIds, String columns, String sep) { selectIn(getDefaultTargetFrame(), sequenceIds, columns, sep); @@ -242,7 +281,8 @@ public class JalviewLite extends Applet implements * @see jalview.bin.JalviewLiteJsApi#selectIn(jalview.appletgui.AlignFrame, * java.lang.String, java.lang.String) */ - public void selectIn(AlignFrame alf, String sequenceIds, String columns) + @Override + public void selectIn(AlignFrameI alf, String sequenceIds, String columns) { selectIn(alf, sequenceIds, columns, separator); } @@ -253,7 +293,8 @@ public class JalviewLite extends Applet implements * @see jalview.bin.JalviewLiteJsApi#selectIn(jalview.appletgui.AlignFrame, * java.lang.String, java.lang.String, java.lang.String) */ - public void selectIn(final AlignFrame alf, String sequenceIds, + @Override + public void selectIn(final AlignFrameI alf, String sequenceIds, String columns, String sep) { if (sep == null || sep.length() == 0) @@ -269,13 +310,13 @@ public class JalviewLite extends Applet implements } } // deparse fields - String[] ids = separatorListToArray(sequenceIds, sep); - String[] cols = separatorListToArray(columns, sep); + String[] ids = JalviewAppLoader.separatorListToArray(sequenceIds, sep); + String[] cols = JalviewAppLoader.separatorListToArray(columns, sep); final SequenceGroup sel = new SequenceGroup(); final ColumnSelection csel = new ColumnSelection(); - AlignmentI al = alf.viewport.getAlignment(); + AlignmentI al = ((AlignFrame) alf).viewport.getAlignment(); jalview.analysis.SequenceIdMatcher matcher = new jalview.analysis.SequenceIdMatcher( - alf.viewport.getAlignment().getSequencesArray()); + ((AlignFrame) alf).viewport.getAlignment().getSequencesArray()); int start = 0, end = al.getWidth(), alw = al.getWidth(); boolean seqsfound = true; if (ids != null && ids.length > 0) @@ -316,8 +357,8 @@ public class JalviewLite extends Applet implements from--; } catch (NumberFormatException ex) { - System.err - .println("ERROR: Couldn't parse first integer in range element column selection string '" + System.err.println( + "ERROR: Couldn't parse first integer in range element column selection string '" + cl + "' - format is 'from-to'"); return; } @@ -327,8 +368,8 @@ public class JalviewLite extends Applet implements to--; } catch (NumberFormatException ex) { - System.err - .println("ERROR: Couldn't parse second integer in range element column selection string '" + System.err.println( + "ERROR: Couldn't parse second integer in range element column selection string '" + cl + "' - format is 'from-to'"); return; } @@ -394,8 +435,8 @@ public class JalviewLite extends Applet implements } else { - System.err - .println("ERROR: Couldn't parse integer from point selection element of column selection string '" + System.err.println( + "ERROR: Couldn't parse integer from point selection element of column selection string '" + cl + "'"); return; } @@ -445,15 +486,11 @@ public class JalviewLite extends Applet implements SequenceI rs = sel.getSequenceAt(0); start = rs.findIndex(start); end = rs.findIndex(end); - if (csel != null) + List cs = new ArrayList<>(csel.getSelected()); + csel.clear(); + for (Integer selectedCol : cs) { - Vector cs = csel.getSelected(); - csel.clear(); - for (int csi = 0, csiS = cs.size(); csi < csiS; csi++) - { - csel.addElement(rs.findIndex(((Integer) cs.elementAt(csi)) - .intValue())); - } + csel.addElement(rs.findIndex(selectedCol)); } } sel.setStartRes(start); @@ -463,7 +500,8 @@ public class JalviewLite extends Applet implements @Override public void run() { - alf.select(sel, csel); + ((AlignFrame) alf).select(sel, csel, ((AlignFrame) alf) + .getAlignViewport().getAlignment().getHiddenColumns()); } }); } @@ -476,7 +514,9 @@ public class JalviewLite extends Applet implements * jalview.bin.JalviewLiteJsApi#getSelectedSequencesAsAlignment(java.lang. * String, java.lang.String) */ - public String getSelectedSequencesAsAlignment(String format, String suffix) + @Override + public String getSelectedSequencesAsAlignment(String format, + String suffix) { return getSelectedSequencesAsAlignmentFrom(getDefaultTargetFrame(), format, suffix); @@ -489,26 +529,30 @@ public class JalviewLite extends Applet implements * jalview.bin.JalviewLiteJsApi#getSelectedSequencesAsAlignmentFrom(jalview * .appletgui.AlignFrame, java.lang.String, java.lang.String) */ - public String getSelectedSequencesAsAlignmentFrom(AlignFrame alf, + @Override + public String getSelectedSequencesAsAlignmentFrom(AlignFrameI alf, String format, String suffix) { try { - boolean seqlimits = suffix.equalsIgnoreCase("true"); - if (alf.viewport.getSelectionGroup() != null) + FileFormatI theFormat = FileFormats.getInstance().forName(format); + boolean seqlimits = suffix.equalsIgnoreCase(TRUE); + if (((AlignFrame) alf).viewport.getSelectionGroup() != null) { // JBPNote: getSelectionAsNewSequence behaviour has changed - this // method now returns a full copy of sequence data // TODO consider using getSequenceSelection instead here - String reply = new AppletFormatAdapter().formatSequences(format, - new Alignment(alf.viewport.getSelectionAsNewSequence()), + String reply = new AppletFormatAdapter().formatSequences(theFormat, + new Alignment(((AlignFrame) alf).viewport + .getSelectionAsNewSequence()), seqlimits); return reply; } - } catch (Exception ex) + } catch (IllegalArgumentException ex) { ex.printStackTrace(); - return "Error retrieving alignment in " + format + " format. "; + return "Error retrieving alignment, possibly invalid format specifier: " + + format; } return ""; } @@ -518,6 +562,7 @@ public class JalviewLite extends Applet implements * * @see jalview.bin.JalviewLiteJsApi#getAlignmentOrder() */ + @Override public String getAlignmentOrder() { return getAlignmentOrderFrom(getDefaultTargetFrame()); @@ -530,7 +575,8 @@ public class JalviewLite extends Applet implements * jalview.bin.JalviewLiteJsApi#getAlignmentOrderFrom(jalview.appletgui.AlignFrame * ) */ - public String getAlignmentOrderFrom(AlignFrame alf) + @Override + public String getAlignmentOrderFrom(AlignFrameI alf) { return getAlignmentOrderFrom(alf, separator); } @@ -542,9 +588,11 @@ public class JalviewLite extends Applet implements * jalview.bin.JalviewLiteJsApi#getAlignmentOrderFrom(jalview.appletgui.AlignFrame * , java.lang.String) */ - public String getAlignmentOrderFrom(AlignFrame alf, String sep) + @Override + public String getAlignmentOrderFrom(AlignFrameI alf, String sep) { - AlignmentI alorder = alf.getAlignViewport().getAlignment(); + AlignmentI alorder = ((AlignFrame) alf).getAlignViewport() + .getAlignment(); String[] order = new String[alorder.getHeight()]; for (int i = 0; i < order.length; i++) { @@ -559,6 +607,7 @@ public class JalviewLite extends Applet implements * @see jalview.bin.JalviewLiteJsApi#orderBy(java.lang.String, * java.lang.String) */ + @Override public String orderBy(String order, String undoName) { return orderBy(order, undoName, separator); @@ -570,6 +619,7 @@ public class JalviewLite extends Applet implements * @see jalview.bin.JalviewLiteJsApi#orderBy(java.lang.String, * java.lang.String, java.lang.String) */ + @Override public String orderBy(String order, String undoName, String sep) { return orderAlignmentBy(getDefaultTargetFrame(), order, undoName, sep); @@ -582,15 +632,17 @@ public class JalviewLite extends Applet implements * jalview.bin.JalviewLiteJsApi#orderAlignmentBy(jalview.appletgui.AlignFrame, * java.lang.String, java.lang.String, java.lang.String) */ - public String orderAlignmentBy(AlignFrame alf, String order, + @Override + public String orderAlignmentBy(AlignFrameI alf, String order, String undoName, String sep) { - String[] ids = separatorListToArray(order, sep); + String[] ids = JalviewAppLoader.separatorListToArray(order, sep); SequenceI[] sqs = null; if (ids != null && ids.length > 0) { jalview.analysis.SequenceIdMatcher matcher = new jalview.analysis.SequenceIdMatcher( - alf.viewport.getAlignment().getSequencesArray()); + ((AlignFrame) alf).viewport.getAlignment() + .getSequencesArray()); int s = 0; sqs = new SequenceI[ids.length]; for (int i = 0; i < ids.length; i++) @@ -630,7 +682,7 @@ public class JalviewLite extends Applet implements final String _undoName = undoName; // TODO: deal with synchronization here: cannot raise any events until after // this has returned. - return alf.sortBy(aorder, _undoName) ? "true" : ""; + return ((AlignFrame) alf).sortBy(aorder, _undoName) ? TRUE : ""; } /* @@ -638,9 +690,10 @@ public class JalviewLite extends Applet implements * * @see jalview.bin.JalviewLiteJsApi#getAlignment(java.lang.String) */ + @Override public String getAlignment(String format) { - return getAlignmentFrom(getDefaultTargetFrame(), format, "true"); + return getAlignmentFrom(getDefaultTargetFrame(), format, TRUE); } /* @@ -650,9 +703,10 @@ public class JalviewLite extends Applet implements * jalview.bin.JalviewLiteJsApi#getAlignmentFrom(jalview.appletgui.AlignFrame, * java.lang.String) */ - public String getAlignmentFrom(AlignFrame alf, String format) + @Override + public String getAlignmentFrom(AlignFrameI alf, String format) { - return getAlignmentFrom(alf, format, "true"); + return getAlignmentFrom(alf, format, TRUE); } /* @@ -661,6 +715,7 @@ public class JalviewLite extends Applet implements * @see jalview.bin.JalviewLiteJsApi#getAlignment(java.lang.String, * java.lang.String) */ + @Override public String getAlignment(String format, String suffix) { return getAlignmentFrom(getDefaultTargetFrame(), format, suffix); @@ -673,20 +728,23 @@ public class JalviewLite extends Applet implements * jalview.bin.JalviewLiteJsApi#getAlignmentFrom(jalview.appletgui.AlignFrame, * java.lang.String, java.lang.String) */ - public String getAlignmentFrom(AlignFrame alf, String format, + @Override + public String getAlignmentFrom(AlignFrameI alf, String format, String suffix) { try { - boolean seqlimits = suffix.equalsIgnoreCase("true"); + boolean seqlimits = suffix.equalsIgnoreCase(TRUE); - String reply = new AppletFormatAdapter().formatSequences(format, - alf.viewport.getAlignment(), seqlimits); + FileFormatI theFormat = FileFormats.getInstance().forName(format); + String reply = new AppletFormatAdapter().formatSequences(theFormat, + ((AlignFrame) alf).viewport.getAlignment(), seqlimits); return reply; - } catch (Exception ex) + } catch (IllegalArgumentException ex) { ex.printStackTrace(); - return "Error retrieving alignment in " + format + " format. "; + return "Error retrieving alignment, possibly invalid format specifier: " + + format; } } @@ -695,6 +753,7 @@ public class JalviewLite extends Applet implements * * @see jalview.bin.JalviewLiteJsApi#loadAnnotation(java.lang.String) */ + @Override public void loadAnnotation(String annotation) { loadAnnotationFrom(getDefaultTargetFrame(), annotation); @@ -707,17 +766,20 @@ public class JalviewLite extends Applet implements * jalview.bin.JalviewLiteJsApi#loadAnnotationFrom(jalview.appletgui.AlignFrame * , java.lang.String) */ - public void loadAnnotationFrom(AlignFrame alf, String annotation) + @Override + public void loadAnnotationFrom(AlignFrameI alf, String annotation) { - if (new AnnotationFile().readAnnotationFile(alf.getAlignViewport() - .getAlignment(), annotation, AppletFormatAdapter.PASTE)) + if (new AnnotationFile().annotateAlignmentView( + ((AlignFrame) alf).getAlignViewport(), + annotation, DataSourceType.PASTE)) { - alf.alignPanel.fontChanged(); - alf.alignPanel.setScrollValues(0, 0); + ((AlignFrame) alf).alignPanel.fontChanged(); + ((AlignFrame) alf).alignPanel.setScrollValues(0, 0); } else { - alf.parseFeaturesFile(annotation, AppletFormatAdapter.PASTE); + ((AlignFrame) alf).parseFeaturesFile(annotation, + DataSourceType.PASTE); } } @@ -726,6 +788,7 @@ public class JalviewLite extends Applet implements * * @see jalview.bin.JalviewLiteJsApi#loadAnnotation(java.lang.String) */ + @Override public void loadFeatures(String features, boolean autoenabledisplay) { loadFeaturesFrom(getDefaultTargetFrame(), features, autoenabledisplay); @@ -738,10 +801,12 @@ public class JalviewLite extends Applet implements * jalview.bin.JalviewLiteJsApi#loadAnnotationFrom(jalview.appletgui.AlignFrame * , java.lang.String) */ - public boolean loadFeaturesFrom(AlignFrame alf, String features, + @Override + public boolean loadFeaturesFrom(AlignFrameI alf, String features, boolean autoenabledisplay) { - return alf.parseFeaturesFile(features, AppletFormatAdapter.PASTE, + return ((AlignFrame) alf).parseFeaturesFile(features, + DataSourceType.PASTE, autoenabledisplay); } @@ -750,6 +815,7 @@ public class JalviewLite extends Applet implements * * @see jalview.bin.JalviewLiteJsApi#getFeatures(java.lang.String) */ + @Override public String getFeatures(String format) { return getFeaturesFrom(getDefaultTargetFrame(), format); @@ -762,9 +828,10 @@ public class JalviewLite extends Applet implements * jalview.bin.JalviewLiteJsApi#getFeaturesFrom(jalview.appletgui.AlignFrame, * java.lang.String) */ - public String getFeaturesFrom(AlignFrame alf, String format) + @Override + public String getFeaturesFrom(AlignFrameI alf, String format) { - return alf.outputFeatures(false, format); + return ((AlignFrame) alf).outputFeatures(false, format); } /* @@ -772,6 +839,7 @@ public class JalviewLite extends Applet implements * * @see jalview.bin.JalviewLiteJsApi#getAnnotation() */ + @Override public String getAnnotation() { return getAnnotationFrom(getDefaultTargetFrame()); @@ -784,9 +852,10 @@ public class JalviewLite extends Applet implements * jalview.bin.JalviewLiteJsApi#getAnnotationFrom(jalview.appletgui.AlignFrame * ) */ - public String getAnnotationFrom(AlignFrame alf) + @Override + public String getAnnotationFrom(AlignFrameI alf) { - return alf.outputAnnotations(false); + return ((AlignFrame) alf).outputAnnotations(false); } /* @@ -794,6 +863,7 @@ public class JalviewLite extends Applet implements * * @see jalview.bin.JalviewLiteJsApi#newView() */ + @Override public AlignFrame newView() { return newViewFrom(getDefaultTargetFrame()); @@ -804,6 +874,7 @@ public class JalviewLite extends Applet implements * * @see jalview.bin.JalviewLiteJsApi#newView(java.lang.String) */ + @Override public AlignFrame newView(String name) { return newViewFrom(getDefaultTargetFrame(), name); @@ -814,9 +885,10 @@ public class JalviewLite extends Applet implements * * @see jalview.bin.JalviewLiteJsApi#newViewFrom(jalview.appletgui.AlignFrame) */ - public AlignFrame newViewFrom(AlignFrame alf) + @Override + public AlignFrame newViewFrom(AlignFrameI alf) { - return alf.newView(null); + return ((AlignFrame) alf).newView(null); } /* @@ -825,9 +897,10 @@ public class JalviewLite extends Applet implements * @see jalview.bin.JalviewLiteJsApi#newViewFrom(jalview.appletgui.AlignFrame, * java.lang.String) */ - public AlignFrame newViewFrom(AlignFrame alf, String name) + @Override + public AlignFrame newViewFrom(AlignFrameI alf, String name) { - return alf.newView(name); + return ((AlignFrame) alf).newView(name); } /* @@ -836,21 +909,22 @@ public class JalviewLite extends Applet implements * @see jalview.bin.JalviewLiteJsApi#loadAlignment(java.lang.String, * java.lang.String) */ + @Override public AlignFrame loadAlignment(String text, String title) { - Alignment al = null; + AlignmentI al = null; - String format = new IdentifyFile().Identify(text, - AppletFormatAdapter.PASTE); try { - al = new AppletFormatAdapter().readFile(text, - AppletFormatAdapter.PASTE, format); + FileFormatI format = new IdentifyFile().identify(text, + DataSourceType.PASTE); + al = new AppletFormatAdapter().readFile(text, DataSourceType.PASTE, + format); if (al.getHeight() > 0) { return new AlignFrame(al, this, title, false); } - } catch (java.io.IOException ex) + } catch (IOException ex) { ex.printStackTrace(); } @@ -862,12 +936,13 @@ public class JalviewLite extends Applet implements * * @see jalview.bin.JalviewLiteJsApi#setMouseoverListener(java.lang.String) */ + @Override public void setMouseoverListener(String listener) { setMouseoverListener(currentAlignFrame, listener); } - private Vector javascriptListeners = new Vector(); + private Vector javascriptListeners = new Vector<>(); /* * (non-Javadoc) @@ -876,28 +951,31 @@ public class JalviewLite extends Applet implements * jalview.bin.JalviewLiteJsApi#setMouseoverListener(jalview.appletgui.AlignFrame * , java.lang.String) */ - public void setMouseoverListener(AlignFrame af, String listener) + @Override + public void setMouseoverListener(AlignFrameI af, String listener) { if (listener != null) { listener = listener.trim(); if (listener.length() == 0) { - System.err - .println("jalview Javascript error: Ignoring empty function for mouseover listener."); + System.err.println( + "jalview Javascript error: Ignoring empty function for mouseover listener."); return; } } jalview.javascript.MouseOverListener mol = new jalview.javascript.MouseOverListener( - this, af, listener); + this, (AlignFrame) af, listener, debug); javascriptListeners.addElement(mol); StructureSelectionManager.getStructureSelectionManager(this) .addStructureViewerListener(mol); if (debug) { System.err.println("Added a mouseover listener for " - + ((af == null) ? "All frames" : "Just views for " - + af.getAlignViewport().getSequenceSetId())); + + ((af == null) ? "All frames" + : "Just views for " + + ((AlignFrame) af).getAlignViewport() + .getSequenceSetId())); System.err.println("There are now " + javascriptListeners.size() + " listeners in total."); } @@ -908,6 +986,7 @@ public class JalviewLite extends Applet implements * * @see jalview.bin.JalviewLiteJsApi#setSelectionListener(java.lang.String) */ + @Override public void setSelectionListener(String listener) { setSelectionListener(null, listener); @@ -920,39 +999,48 @@ public class JalviewLite extends Applet implements * jalview.bin.JalviewLiteJsApi#setSelectionListener(jalview.appletgui.AlignFrame * , java.lang.String) */ - public void setSelectionListener(AlignFrame af, String listener) + @Override + public void setSelectionListener(AlignFrameI af, String listener) { if (listener != null) { listener = listener.trim(); if (listener.length() == 0) { - System.err - .println("jalview Javascript error: Ignoring empty function for selection listener."); + System.err.println( + "jalview Javascript error: Ignoring empty function for selection listener."); return; } } jalview.javascript.JsSelectionSender mol = new jalview.javascript.JsSelectionSender( - this, af, listener); + this, (AlignFrame) af, listener, debug); javascriptListeners.addElement(mol); StructureSelectionManager.getStructureSelectionManager(this) .addSelectionListener(mol); if (debug) { System.err.println("Added a selection listener for " - + ((af == null) ? "All frames" : "Just views for " - + af.getAlignViewport().getSequenceSetId())); + + ((af == null) ? "All frames" + : "Just views for " + + ((AlignFrame) af).getAlignViewport() + .getSequenceSetId())); System.err.println("There are now " + javascriptListeners.size() + " listeners in total."); } } - /* - * (non-Javadoc) - * + /** + * Callable from javascript to register a javascript function to pass events + * to a structure viewer. + * + * @param listener + * the name of a javascript function + * @param modelSet + * a token separated list of PDB file names listened for * @see jalview.bin.JalviewLiteJsApi#setStructureListener(java.lang.String, - * java.lang.String) + * java.lang.String) */ + @Override public void setStructureListener(String listener, String modelSet) { if (listener != null) @@ -960,13 +1048,13 @@ public class JalviewLite extends Applet implements listener = listener.trim(); if (listener.length() == 0) { - System.err - .println("jalview Javascript error: Ignoring empty function for selection listener."); + System.err.println( + "jalview Javascript error: Ignoring empty function for selection listener."); return; } } - jalview.javascript.MouseOverStructureListener mol = new jalview.javascript.MouseOverStructureListener( - this, listener, separatorListToArray(modelSet)); + MouseOverStructureListener mol = new MouseOverStructureListener(this, + listener, separatorListToArray(modelSet), debug); javascriptListeners.addElement(mol); StructureSelectionManager.getStructureSelectionManager(this) .addStructureViewerListener(mol); @@ -986,7 +1074,8 @@ public class JalviewLite extends Applet implements * jalview.bin.JalviewLiteJsApi#removeJavascriptListener(jalview.appletgui * .AlignFrame, java.lang.String) */ - public void removeJavascriptListener(AlignFrame af, String listener) + @Override + public void removeJavascriptListener(AlignFrameI af, String listener) { if (listener != null) { @@ -1001,9 +1090,8 @@ public class JalviewLite extends Applet implements { Object lstn = javascriptListeners.elementAt(ms); JsCallBack lstner = (JsCallBack) lstn; - if ((af == null || lstner.getAlignFrame() == af) - && (listener == null || lstner.getListenerFunction().equals( - listener))) + if ((af == null || lstner.getAlignFrame() == af) && (listener == null + || lstner.getListenerFunction().equals(listener))) { javascriptListeners.removeElement(lstner); msSize--; @@ -1035,12 +1123,14 @@ public class JalviewLite extends Applet implements } } + @Override public void stop() { System.err.println("Applet " + getName() + " stop()."); tidyUp(); } + @Override public void destroy() { System.err.println("Applet " + getName() + " destroy()."); @@ -1080,11 +1170,10 @@ public class JalviewLite extends Applet implements } if (jsFunctionExec != null) { - jsFunctionExec.stopQueue(); - jsFunctionExec.jvlite = null; + jsFunctionExec.tidyUp(); + jsFunctionExec = null; } initialAlignFrame = null; - jsFunctionExec = null; javascriptListeners = null; StructureSelectionManager.release(this); } @@ -1097,8 +1186,9 @@ public class JalviewLite extends Applet implements * @see jalview.bin.JalviewLiteJsApi#mouseOverStructure(java.lang.String, * java.lang.String, java.lang.String) */ - public void mouseOverStructure(final String pdbResNum, - final String chain, final String pdbfile) + @Override + public void mouseOverStructure(final String pdbResNum, final String chain, + final String pdbfile) { final StructureSelectionManagerProvider me = this; java.awt.EventQueue.invokeLater(new Runnable() @@ -1113,9 +1203,9 @@ public class JalviewLite extends Applet implements chain, pdbfile); if (debug) { - System.err.println("mouseOver for '" + pdbResNum - + "' in chain '" + chain + "' in structure '" + pdbfile - + "'"); + System.err + .println("mouseOver for '" + pdbResNum + "' in chain '" + + chain + "' in structure '" + pdbfile + "'"); } } catch (NumberFormatException e) { @@ -1134,7 +1224,8 @@ public class JalviewLite extends Applet implements * jalview.bin.JalviewLiteJsApi#scrollViewToIn(jalview.appletgui.AlignFrame, * java.lang.String, java.lang.String) */ - public void scrollViewToIn(final AlignFrame alf, final String topRow, + @Override + public void scrollViewToIn(final AlignFrameI alf, final String topRow, final String leftHandColumn) { java.awt.EventQueue.invokeLater(new Runnable() @@ -1144,8 +1235,8 @@ public class JalviewLite extends Applet implements { try { - alf.scrollTo(new Integer(topRow).intValue(), new Integer( - leftHandColumn).intValue()); + ((AlignFrame) alf).scrollTo(new Integer(topRow).intValue(), + new Integer(leftHandColumn).intValue()); } catch (Exception ex) { @@ -1166,7 +1257,7 @@ public class JalviewLite extends Applet implements * .AlignFrame, java.lang.String) */ @Override - public void scrollViewToRowIn(final AlignFrame alf, final String topRow) + public void scrollViewToRowIn(final AlignFrameI alf, final String topRow) { java.awt.EventQueue.invokeLater(new Runnable() @@ -1176,7 +1267,7 @@ public class JalviewLite extends Applet implements { try { - alf.scrollToRow(new Integer(topRow).intValue()); + ((AlignFrame) alf).scrollToRow(new Integer(topRow).intValue()); } catch (Exception ex) { @@ -1197,7 +1288,7 @@ public class JalviewLite extends Applet implements * .AlignFrame, java.lang.String) */ @Override - public void scrollViewToColumnIn(final AlignFrame alf, + public void scrollViewToColumnIn(final AlignFrameI alf, final String leftHandColumn) { java.awt.EventQueue.invokeLater(new Runnable() @@ -1208,12 +1299,13 @@ public class JalviewLite extends Applet implements { try { - alf.scrollToColumn(new Integer(leftHandColumn).intValue()); + ((AlignFrame) alf) + .scrollToColumn(new Integer(leftHandColumn).intValue()); } catch (Exception ex) { - System.err - .println("Couldn't parse integer arguments (leftHandColumn='" + System.err.println( + "Couldn't parse integer arguments (leftHandColumn='" + leftHandColumn + "')"); ex.printStackTrace(); } @@ -1233,7 +1325,10 @@ public class JalviewLite extends Applet implements String file = "No file"; - Button launcher = new Button("Start Jalview"); + String file2 = null; + + Button launcher = new Button( + MessageManager.getString("label.start_jalview")); /** * The currentAlignFrame is static, it will change if and when the user @@ -1251,9 +1346,9 @@ public class JalviewLite extends Applet implements boolean embedded = false; - private boolean checkForJmol = true; + boolean checkForJmol = true; - private boolean checkedForJmol = false; // ensure we don't check for jmol + boolean checkedForJmol = false; // ensure we don't check for jmol // every time the app is re-inited @@ -1262,14 +1357,18 @@ public class JalviewLite extends Applet implements private boolean alignPdbStructures = false; /** - * use an external structure viewer exclusively (no jmols or MCViews will be + * use an external structure viewer exclusively (no jmols or mc_views will be * opened by JalviewLite itself) */ public boolean useXtrnalSviewer = false; + public JalviewAppLoader appLoader; + + public AlignFrame loaderFrame; + public static boolean debug = false; - static String builddate = null, version = null; + static String builddate = null, version = null, installation = null; private static void initBuildDetails() { @@ -1277,14 +1376,15 @@ public class JalviewLite extends Applet implements { builddate = "unknown"; version = "test"; + installation = "applet"; java.net.URL url = JalviewLite.class .getResource("/.build_properties"); if (url != null) { try { - BufferedReader reader = new BufferedReader(new InputStreamReader( - url.openStream())); + BufferedReader reader = new BufferedReader( + new InputStreamReader(url.openStream())); String line; while ((line = reader.readLine()) != null) { @@ -1296,6 +1396,10 @@ public class JalviewLite extends Applet implements { builddate = line.substring(line.indexOf("=") + 1); } + if (line.indexOf("INSTALLATION") > -1) + { + installation = line.substring(line.indexOf("=") + 1); + } } } catch (Exception ex) { @@ -1311,6 +1415,12 @@ public class JalviewLite extends Applet implements return builddate; } + public static String getInstallation() + { + initBuildDetails(); + return installation; + } + public static String getVersion() { initBuildDetails(); @@ -1322,9 +1432,10 @@ public class JalviewLite extends Applet implements /** * init method for Jalview Applet */ + @Override public void init() { - // remove any handlers that might be hanging around from an earlier instance + debug = TRUE.equalsIgnoreCase(getParameter("debug")); try { if (debug) @@ -1340,33 +1451,24 @@ public class JalviewLite extends Applet implements } catch (Exception ex) { - System.err - .println("Warning: No JalviewLite javascript callbacks available."); + System.err.println( + "Warning: No JalviewLite javascript callbacks available."); if (debug) { ex.printStackTrace(); } } - /** - * turn on extra applet debugging - */ - String dbg = getParameter("debug"); - if (dbg != null) - { - debug = dbg.toLowerCase().equals("true"); - } + if (debug) { - System.err.println("JalviewLite Version " + getVersion()); System.err.println("Build Date : " + getBuildDate()); - + System.err.println("Installation : " + getInstallation()); } String externalsviewer = getParameter("externalstructureviewer"); if (externalsviewer != null) { - useXtrnalSviewer = externalsviewer.trim().toLowerCase() - .equals("true"); + useXtrnalSviewer = externalsviewer.trim().toLowerCase().equals(TRUE); } /** * if true disable the check for jmol @@ -1374,7 +1476,7 @@ public class JalviewLite extends Applet implements String chkforJmol = getParameter("nojmol"); if (chkforJmol != null) { - checkForJmol = !chkforJmol.equals("true"); + checkForJmol = !chkforJmol.equals(TRUE); } /** * get the separator parameter if present @@ -1392,9 +1494,13 @@ public class JalviewLite extends Applet implements } else { - throw new Error(MessageManager.getString("error.invalid_separator_parameter")); + throw new Error(MessageManager + .getString("error.invalid_separator_parameter")); } } + + // Background color + int r = 255; int g = 255; int b = 255; @@ -1414,65 +1520,33 @@ public class JalviewLite extends Applet implements b = 255; } } + setBackground(new Color(r, g, b)); + param = getParameter("label"); if (param != null) { launcher.setLabel(param); } - setBackground(new Color(r, g, b)); - file = getParameter("file"); if (file == null) { - // Maybe the sequences are added as parameters - StringBuffer data = new StringBuffer("PASTE"); - int i = 1; - while ((file = getParameter("sequence" + i)) != null) - { - data.append(file.toString() + "\n"); - i++; - } - if (data.length() > 5) - { - file = data.toString(); - } + file = appLoader.getPastedSequence(this); } - - final JalviewLite jvapplet = this; - if (getParameter("embedded") != null - && getParameter("embedded").equalsIgnoreCase("true")) + if (getDefaultParameter("enableSplitFrame", true)) { - // Launch as embedded applet in page - embedded = true; - LoadingThread loader = new LoadingThread(file, jvapplet); - loader.start(); + file2 = getParameter("file2"); } - else if (file != null) + + embedded = (TRUE.equalsIgnoreCase(getParameter("embedded")) + || file != null + && FALSE.equalsIgnoreCase(getParameter("showbutton"))); + if (embedded) { - if (getParameter("showbutton") == null - || !getParameter("showbutton").equalsIgnoreCase("false")) - { - // Add the JalviewLite 'Button' to the page - add(launcher); - launcher.addActionListener(new java.awt.event.ActionListener() - { - public void actionPerformed(ActionEvent e) - { - LoadingThread loader = new LoadingThread(file, jvapplet); - loader.start(); - } - }); - } - else - { - // Open jalviewLite immediately. - LoadingThread loader = new LoadingThread(file, jvapplet); - loader.start(); - } + startLoading(); } - else + else if (file == null) { // jalview initialisation with no alignment. loadAlignment() method can // still be called to open new alignments. @@ -1480,6 +1554,24 @@ public class JalviewLite extends Applet implements fileFound = false; callInitCallback(); } + else + { + add(launcher); + launcher.addActionListener(new java.awt.event.ActionListener() + { + @Override + public void actionPerformed(ActionEvent e) + { + startLoading(); + } + }); + } + } + + protected void startLoading() + { + LoadingThread loader = new LoadingThread(file, file2, this); + loader.start(); } private void initLiveConnect() @@ -1511,7 +1603,7 @@ public class JalviewLite extends Applet implements { notFailed = true; } - } catch (JSException jsex) + } catch (Exception jsex) { System.err.println("Attempt " + tries + " to access LiveConnect javascript failed."); @@ -1519,7 +1611,7 @@ public class JalviewLite extends Applet implements } } - private void callInitCallback() + void callInitCallback() { String initjscallback = getParameter("oninit"); if (initjscallback == null) @@ -1545,9 +1637,9 @@ public class JalviewLite extends Applet implements try { // do onInit with the JS executor thread - new JSFunctionExec(this).executeJavascriptFunction(true, - initjscallback, null, "Calling oninit callback '" - + initjscallback + "'."); + new JSFunctionExec(this, debug).executeJavascriptFunction(true, + initjscallback, null, + "Calling oninit callback '" + initjscallback + "'."); } catch (Exception e) { System.err.println("Exception when executing _oninit callback '" @@ -1585,6 +1677,7 @@ public class JalviewLite extends Applet implements frame.setTitle(title); frame.addWindowListener(new WindowAdapter() { + @Override public void windowClosing(WindowEvent e) { if (frame instanceof AlignFrame) @@ -1609,6 +1702,7 @@ public class JalviewLite extends Applet implements frame.dispose(); } + @Override public void windowActivated(WindowEvent e) { if (frame instanceof AlignFrame) @@ -1646,6 +1740,7 @@ public class JalviewLite extends Applet implements * @param g * graphics context */ + @Override public void paint(Graphics g) { if (!fileFound) @@ -1655,8 +1750,8 @@ public class JalviewLite extends Applet implements g.fillRect(0, 0, getSize().width, getSize().height); g.setColor(Color.red); g.drawString( - MessageManager.getString("label.jalview_cannot_open_file"), - 5, 15); + MessageManager.getString("label.jalview_cannot_open_file"), 5, + 15); g.drawString("\"" + file + "\"", 5, 30); } else if (embedded) @@ -1697,6 +1792,7 @@ public class JalviewLite extends Applet implements { private boolean running = false; + @Override public void run() { if (running || checkedForJmol) @@ -1715,8 +1811,8 @@ public class JalviewLite extends Applet implements } if (!jmolAvailable) { - System.out - .println("Jmol not available - Using MCview for structures"); + System.out.println( + "Jmol not available - Using mc_view for structures"); } } catch (java.lang.ClassNotFoundException ex) { @@ -1727,8 +1823,8 @@ public class JalviewLite extends Applet implements jmolAvailable = false; if (debug) { - System.err - .println("Skipping Jmol check. Will use MCView (probably)"); + System.err.println( + "Skipping Jmol check. Will use mc_view (probably)"); } } checkedForJmol = true; @@ -1744,27 +1840,19 @@ public class JalviewLite extends Applet implements class LoadingThread extends Thread { /** - * State variable: File source - */ - String file; - - /** * State variable: protocol for access to file source */ - String protocol; + DataSourceType protocol; - /** - * State variable: format of file source - */ - String format; + String _file; // alignment file or URL spec - String _file; + String _file2; // second alignment file or URL spec JalviewLite applet; - private void dbgMsg(String msg) + public void dbgMsg(String msg) { - if (applet.debug) + if (JalviewLite.debug) { System.err.println(msg); } @@ -1774,35 +1862,25 @@ public class JalviewLite extends Applet implements * update the protocol state variable for accessing the datasource located * by file. * - * @param file + * @param path * @return possibly updated datasource string */ - public String setProtocolState(String file) + public String resolveFileProtocol(String path) { - if (file.startsWith("PASTE")) - { - file = file.substring(5); - protocol = AppletFormatAdapter.PASTE; - } - else if (inArchive(file)) - { - protocol = AppletFormatAdapter.CLASSLOADER; - } - else - { - file = addProtocol(file); - protocol = AppletFormatAdapter.URL; - } - dbgMsg("Protocol identified as '" + protocol + "'"); - return file; + + String[] ret = new String[] { path }; + protocol = JalviewAppLoader.resolveFileProtocol(applet, ret); + return ret[0]; } - public LoadingThread(String _file, JalviewLite _applet) + public LoadingThread(String file, String file2, JalviewLite _applet) { - this._file = _file; + this._file = file; + this._file2 = file2; applet = _applet; } + @Override public void run() { LoadJmolThread jmolchecker = new LoadJmolThread(); @@ -1816,25 +1894,121 @@ public class JalviewLite extends Applet implements } catch (Exception e) { } - ; } startLoading(); // applet.callInitCallback(); } + /** + * Load the alignment and any related files as specified by applet + * parameters + */ private void startLoading() { - AlignFrame newAlignFrame; - dbgMsg("Loading thread started with:\n>>file\n" + _file + ">>endfile"); - file = setProtocolState(_file); + dbgMsg("Loading thread started with:\n>>file\n" + _file + + ">>endfile"); - format = new jalview.io.IdentifyFile().Identify(file, protocol); - dbgMsg("File identified as '" + format + "'"); dbgMsg("Loading started."); - Alignment al = null; + + AlignFrame newAlignFrame = readAlignment(_file); + AlignFrame newAlignFrame2 = readAlignment(_file2); + if (newAlignFrame != null) + { + addToDisplay(newAlignFrame, newAlignFrame2); + applet.loaderFrame = newAlignFrame; + appLoader.load(applet); + } + else + { + fileFound = false; + applet.remove(launcher); + applet.repaint(); + callInitCallback(); + } + } + + /** + * Add an AlignFrame to the display; or if two are provided, a SplitFrame. + * + * @param af + * @param af2 + */ + public void addToDisplay(AlignFrame af, AlignFrame af2) + { + if (af2 != null) + { + AlignmentI al1 = af.viewport.getAlignment(); + AlignmentI al2 = af2.viewport.getAlignment(); + AlignmentI cdna = al1.isNucleotide() ? al1 : al2; + AlignmentI prot = al1.isNucleotide() ? al2 : al1; + if (AlignmentUtils.mapProteinAlignmentToCdna(prot, cdna)) + { + al2.alignAs(al1); + SplitFrame sf = new SplitFrame(af, af2); + sf.addToDisplay(embedded, JalviewLite.this); + return; + } + else + { + String msg = "Could not map any sequence in " + af2.getTitle() + + " as " + + (al1.isNucleotide() ? "protein product" : "cDNA") + + " for " + af.getTitle(); + System.err.println(msg); + } + } + + af.addToDisplay(embedded); + } + + /** + * Read the alignment file (from URL, text 'paste', or archive by + * classloader). + * + * @return + */ + protected AlignFrame readAlignment(String fileParam) + { + if (fileParam == null) + { + return null; + } + String resolvedFile = resolveFileProtocol(fileParam); + AlignmentI al = null; try { - al = new AppletFormatAdapter().readFile(file, protocol, format); + FileFormatI format = new IdentifyFile().identify(resolvedFile, + protocol); + dbgMsg("File identified as '" + format + "'"); + al = new AppletFormatAdapter().readFile(resolvedFile, protocol, + format); + if ((al != null) && (al.getHeight() > 0)) + { + dbgMsg("Successfully loaded file."); + al.setDataset(null); + AlignFrame newAlignFrame = new AlignFrame(al, applet, + resolvedFile, embedded, false); + newAlignFrame.setTitle(resolvedFile); + if (initialAlignFrame == null) + { + initialAlignFrame = newAlignFrame; + } + // update the focus. + currentAlignFrame = newAlignFrame; + + if (protocol == DataSourceType.PASTE) + { + newAlignFrame.setTitle(MessageManager + .formatMessage("label.sequences_from", new Object[] + { applet.getDocumentBase().toString() })); + } + + newAlignFrame.statusBar.setText(MessageManager.formatMessage( + "label.successfully_loaded_file", new Object[] + { resolvedFile })); + + return newAlignFrame; + } } catch (java.io.IOException ex) { dbgMsg("File load exception."); @@ -1843,9 +2017,9 @@ public class JalviewLite extends Applet implements { try { - FileParse fp = new FileParse(file, protocol); + FileParse fp = new FileParse(resolvedFile, protocol); String ln = null; - dbgMsg(">>>Dumping contents of '" + file + "' " + "(" + dbgMsg(">>>Dumping contents of '" + resolvedFile + "' " + "(" + protocol + ")"); while ((ln = fp.nextLine()) != null) { @@ -1854,517 +2028,60 @@ public class JalviewLite extends Applet implements dbgMsg(">>>Dump finished."); } catch (Exception e) { - System.err - .println("Exception when trying to dump the content of the file parameter."); + System.err.println( + "Exception when trying to dump the content of the file parameter."); e.printStackTrace(); } } } - if ((al != null) && (al.getHeight() > 0)) - { - dbgMsg("Successfully loaded file."); - newAlignFrame = new AlignFrame(al, applet, file, embedded); - if (initialAlignFrame == null) - { - initialAlignFrame = newAlignFrame; - } - // update the focus. - currentAlignFrame = newAlignFrame; - - if (protocol == jalview.io.AppletFormatAdapter.PASTE) - { - newAlignFrame.setTitle(MessageManager.formatMessage( - "label.sequences_from", new String[] - { applet.getDocumentBase().toString() })); - } - - newAlignFrame.statusBar.setText(MessageManager.formatMessage( - "label.successfully_loaded_file", new String[] - { file })); - - String treeFile = applet.getParameter("tree"); - if (treeFile == null) - { - treeFile = applet.getParameter("treeFile"); - } + return null; + } - if (treeFile != null) - { - try - { - treeFile = setProtocolState(treeFile); - /* - * if (inArchive(treeFile)) { protocol = - * AppletFormatAdapter.CLASSLOADER; } else { protocol = - * AppletFormatAdapter.URL; treeFile = addProtocol(treeFile); } - */ - jalview.io.NewickFile fin = new jalview.io.NewickFile(treeFile, - protocol); - - fin.parse(); - - if (fin.getTree() != null) - { - newAlignFrame.loadTree(fin, treeFile); - dbgMsg("Successfuly imported tree."); - } - else - { - dbgMsg("Tree parameter did not resolve to a valid tree."); - } - } catch (Exception ex) - { - ex.printStackTrace(); - } - } + } - /* - * Try to load T-Coffee score file - */ - String sScoreFile = applet.getParameter("scoreFile"); - if (sScoreFile != null && !"".equals(sScoreFile)) - { - try - { - if (debug) - { - System.err - .println("Attempting to load T-COFFEE score file from the scoreFile parameter"); - } - if (!newAlignFrame.loadScoreFile(sScoreFile)) - { - System.err - .println("Failed to parse T-COFFEE parameter as a valid score file ('" - + sScoreFile + "')"); - } - } catch (Exception e) - { - System.err.printf("Cannot read score file: '%s'. Cause: %s \n", - sScoreFile, e.getMessage()); - } - } + /** + * @return the default alignFrame acted on by the public applet methods. May + * return null with an error message on System.err indicating the + * fact. + */ + public AlignFrame getDefaultTargetFrame() + { + if (currentAlignFrame != null) + { + return currentAlignFrame; + } + if (initialAlignFrame != null) + { + return initialAlignFrame; + } + System.err.println( + "Implementation error: Jalview Applet API cannot work out which AlignFrame to use."); + return null; + } - // /////////////////////////// - // modify display of features - // we do this before any features have been loaded, ensuring any hidden - // groups are hidden when features first displayed - // - // hide specific groups - // - String param = applet.getParameter("hidefeaturegroups"); - if (param != null) - { - newAlignFrame.setFeatureGroupState(separatorListToArray(param), - false); - // applet.setFeatureGroupStateOn(newAlignFrame, param, false); - } - // show specific groups - param = applet.getParameter("showfeaturegroups"); - if (param != null) - { - newAlignFrame.setFeatureGroupState(separatorListToArray(param), - true); - // applet.setFeatureGroupStateOn(newAlignFrame, param, true); - } - // and now load features - param = applet.getParameter("features"); - if (param != null) - { - param = setProtocolState(param); + /** + * separator used for separatorList + */ + protected String separator = "" + ((char) 0x00AC); // the default used to be + // '|' but many sequence + // IDS include pipes. - newAlignFrame.parseFeaturesFile(param, protocol); - } + /** + * set to enable the URL based javascript execution mechanism + */ + private boolean jsfallbackEnabled = false; - param = applet.getParameter("showFeatureSettings"); - if (param != null && param.equalsIgnoreCase("true")) - { - newAlignFrame.viewport.showSequenceFeatures(true); - new FeatureSettings(newAlignFrame.alignPanel); - } - - param = applet.getParameter("annotations"); - if (param != null) - { - param = setProtocolState(param); - - if (new AnnotationFile().readAnnotationFile( - newAlignFrame.viewport.getAlignment(), param, protocol)) - { - newAlignFrame.alignPanel.fontChanged(); - newAlignFrame.alignPanel.setScrollValues(0, 0); - } - else - { - System.err - .println("Annotations were not added from annotation file '" - + param + "'"); - } - - } - - param = applet.getParameter("jnetfile"); - if (param != null) - { - try - { - param = setProtocolState(param); - jalview.io.JPredFile predictions = new jalview.io.JPredFile( - param, protocol); - JnetAnnotationMaker.add_annotation(predictions, - newAlignFrame.viewport.getAlignment(), 0, false); // false==do - // not - // add - // sequence - // profile - // from - // concise - // output - newAlignFrame.alignPanel.fontChanged(); - newAlignFrame.alignPanel.setScrollValues(0, 0); - } catch (Exception ex) - { - ex.printStackTrace(); - } - } - /* - * Undocumented for 2.6 - * - related to JAL-434 - */ - applet.setAlignPdbStructures(getDefaultParameter("alignpdbfiles", - false)); - /* - * - * - * - * - * - */ - - int pdbFileCount = 0; - // Accumulate pdbs here if they are heading for the same view (if - // alignPdbStructures is true) - Vector pdbs = new Vector(); - // create a lazy matcher if we're asked to - jalview.analysis.SequenceIdMatcher matcher = (applet - .getDefaultParameter("relaxedidmatch", false)) ? new jalview.analysis.SequenceIdMatcher( - newAlignFrame.getAlignViewport().getAlignment() - .getSequencesArray()) : null; - - do - { - if (pdbFileCount > 0) - { - param = applet.getParameter("PDBFILE" + pdbFileCount); - } - else - { - param = applet.getParameter("PDBFILE"); - } - - if (param != null) - { - PDBEntry pdb = new PDBEntry(); - - String seqstring; - SequenceI[] seqs = null; - String[] chains = null; - - StringTokenizer st = new StringTokenizer(param, " "); - - if (st.countTokens() < 2) - { - String sequence = applet.getParameter("PDBSEQ"); - if (sequence != null) - seqs = new SequenceI[] - { matcher == null ? (Sequence) newAlignFrame - .getAlignViewport().getAlignment() - .findName(sequence) : matcher.findIdMatch(sequence) }; - - } - else - { - param = st.nextToken(); - Vector tmp = new Vector(); - Vector tmp2 = new Vector(); - - while (st.hasMoreTokens()) - { - seqstring = st.nextToken(); - StringTokenizer st2 = new StringTokenizer(seqstring, "="); - if (st2.countTokens() > 1) - { - // This is the chain - tmp2.addElement(st2.nextToken()); - seqstring = st2.nextToken(); - } - tmp.addElement(matcher == null ? (Sequence) newAlignFrame - .getAlignViewport().getAlignment() - .findName(seqstring) : matcher - .findIdMatch(seqstring)); - } - - seqs = new SequenceI[tmp.size()]; - tmp.copyInto(seqs); - if (tmp2.size() == tmp.size()) - { - chains = new String[tmp2.size()]; - tmp2.copyInto(chains); - } - } - param = setProtocolState(param); - - if (// !jmolAvailable - // && - protocol == AppletFormatAdapter.CLASSLOADER - && !useXtrnalSviewer) - { - // Re: JAL-357 : the bug isn't a problem if we are using an - // external viewer! - // TODO: verify this Re: - // https://mantis.lifesci.dundee.ac.uk/view.php?id=36605 - // This exception preserves the current behaviour where, even if - // the local pdb file was identified in the class loader - protocol = AppletFormatAdapter.URL; // this is probably NOT - // CORRECT! - param = addProtocol(param); // - } - - pdb.setFile(param); - - if (seqs != null) - { - for (int i = 0; i < seqs.length; i++) - { - if (seqs[i] != null) - { - ((Sequence) seqs[i]).addPDBId(pdb); - } - else - { - if (JalviewLite.debug) - { - // this may not really be a problem but we give a warning - // anyway - System.err - .println("Warning: Possible input parsing error: Null sequence for attachment of PDB (sequence " - + i + ")"); - } - } - } - - if (!alignPdbStructures) - { - newAlignFrame.newStructureView(applet, pdb, seqs, chains, - protocol); - } - else - { - pdbs.addElement(new Object[] - { pdb, seqs, chains, new String(protocol) }); - } - } - } - - pdbFileCount++; - } while (param != null || pdbFileCount < 10); - if (pdbs.size() > 0) - { - SequenceI[][] seqs = new SequenceI[pdbs.size()][]; - PDBEntry[] pdb = new PDBEntry[pdbs.size()]; - String[][] chains = new String[pdbs.size()][]; - String[] protocols = new String[pdbs.size()]; - for (int pdbsi = 0, pdbsiSize = pdbs.size(); pdbsi < pdbsiSize; pdbsi++) - { - Object[] o = (Object[]) pdbs.elementAt(pdbsi); - pdb[pdbsi] = (PDBEntry) o[0]; - seqs[pdbsi] = (SequenceI[]) o[1]; - chains[pdbsi] = (String[]) o[2]; - protocols[pdbsi] = (String) o[3]; - } - newAlignFrame.alignedStructureView(applet, pdb, seqs, chains, - protocols); - - } - } - else - { - fileFound = false; - applet.remove(launcher); - applet.repaint(); - } - callInitCallback(); - } - - /** - * Discovers whether the given file is in the Applet Archive - * - * @param file - * String - * @return boolean - */ - boolean inArchive(String file) - { - // This might throw a security exception in certain browsers - // Netscape Communicator for instance. - try - { - boolean rtn = (getClass().getResourceAsStream("/" + file) != null); - if (debug) - { - System.err.println("Resource '" + file + "' was " - + (rtn ? "" : "not") + " located by classloader."); - } - return rtn; - } catch (Exception ex) - { - System.out.println("Exception checking resources: " + file + " " - + ex); - return false; - } - } - - String addProtocol(String file) - { - if (file.indexOf("://") == -1) - { - String fl = applet.resolveUrlForLocalOrAbsolute(file, - getDocumentBase()); - try - { - if (new java.net.URL(fl).openStream() != null) - { - if (debug) - { - System.err.println("Prepended document base for resource: '" - + file + "'"); - } - return fl; - } - } catch (Exception x) - { - } - ; - fl = applet.resolveUrlForLocalOrAbsolute(file, getCodeBase()); - try - { - if (new java.net.URL(fl).openStream() != null) - { - if (debug) - { - System.err.println("Prepended codebase for resource: '" - + file + "'"); - } - return fl; - } - } catch (Exception x) - { - } - ; - - } - - return file; - } - } - - /** - * @return the default alignFrame acted on by the public applet methods. May - * return null with an error message on System.err indicating the - * fact. - */ - public AlignFrame getDefaultTargetFrame() - { - if (currentAlignFrame != null) - { - return currentAlignFrame; - } - if (initialAlignFrame != null) - { - return initialAlignFrame; - } - System.err - .println("Implementation error: Jalview Applet API cannot work out which AlignFrame to use."); - return null; - } - - /** - * separator used for separatorList - */ - protected String separator = "" + ((char) 0x00AC); // the default used to be - // '|' but many sequence - // IDS include pipes. - - /** - * set to enable the URL based javascript execution mechanism - */ - public boolean jsfallbackEnabled = false; - - /** - * parse the string into a list - * - * @param list - * @return elements separated by separator - */ - public String[] separatorListToArray(String list) - { - return separatorListToArray(list, separator); - } - - /** - * parse the string into a list - * - * @param list - * @param separator - * @return elements separated by separator - */ - public String[] separatorListToArray(String list, String separator) - { - // note separator local variable intentionally masks object field - int seplen = separator.length(); - if (list == null || list.equals("") || list.equals(separator)) - return null; - java.util.Vector jv = new Vector(); - int cp = 0, pos; - while ((pos = list.indexOf(separator, cp)) > cp) - { - jv.addElement(list.substring(cp, pos)); - cp = pos + seplen; - } - if (cp < list.length()) - { - String c = list.substring(cp); - if (!c.equals(separator)) - { - jv.addElement(c); - } - } - if (jv.size() > 0) - { - String[] v = new String[jv.size()]; - for (int i = 0; i < v.length; i++) - { - v[i] = (String) jv.elementAt(i); - } - jv.removeAllElements(); - if (debug) - { - System.err.println("Array from '" + separator - + "' separated List:\n" + v.length); - for (int i = 0; i < v.length; i++) - { - System.err.println("item " + i + " '" + v[i] + "'"); - } - } - return v; - } - if (debug) - { - System.err.println("Empty Array from '" + separator - + "' separated List"); - } - return null; - } + /** + * parse the string into a list + * + * @param list + * @return elements separated by separator + */ + @Override + public String[] separatorListToArray(String list) + { + return JalviewAppLoader.separatorListToArray(list, separator); + } /** * concatenate the list with separator @@ -2372,48 +2089,10 @@ public class JalviewLite extends Applet implements * @param list * @return concatenated string */ + @Override public String arrayToSeparatorList(String[] list) { - return arrayToSeparatorList(list, separator); - } - - /** - * concatenate the list with separator - * - * @param list - * @param separator - * @return concatenated string - */ - public String arrayToSeparatorList(String[] list, String separator) - { - StringBuffer v = new StringBuffer(); - if (list != null && list.length > 0) - { - for (int i = 0, iSize = list.length; i < iSize; i++) - { - if (list[i] != null) - { - if (i > 0) - { - v.append(separator); - } - v.append(list[i]); - } - } - if (debug) - { - System.err.println("Returning '" + separator - + "' separated List:\n"); - System.err.println(v); - } - return v.toString(); - } - if (debug) - { - System.err.println("Returning empty '" + separator - + "' separated List\n"); - } - return "" + separator; + return JalviewAppLoader.arrayToSeparatorList(list, separator); } /* @@ -2421,10 +2100,11 @@ public class JalviewLite extends Applet implements * * @see jalview.bin.JalviewLiteJsApi#getFeatureGroups() */ + @Override public String getFeatureGroups() { - String lst = arrayToSeparatorList(getDefaultTargetFrame() - .getFeatureGroups()); + String lst = arrayToSeparatorList( + getDefaultTargetFrame().getFeatureGroups()); return lst; } @@ -2435,9 +2115,11 @@ public class JalviewLite extends Applet implements * jalview.bin.JalviewLiteJsApi#getFeatureGroupsOn(jalview.appletgui.AlignFrame * ) */ - public String getFeatureGroupsOn(AlignFrame alf) + @Override + public String getFeatureGroupsOn(AlignFrameI alf) { - String lst = arrayToSeparatorList(alf.getFeatureGroups()); + String lst = arrayToSeparatorList( + ((AlignFrame) alf).getFeatureGroups()); return lst; } @@ -2446,10 +2128,11 @@ public class JalviewLite extends Applet implements * * @see jalview.bin.JalviewLiteJsApi#getFeatureGroupsOfState(boolean) */ + @Override public String getFeatureGroupsOfState(boolean visible) { - return arrayToSeparatorList(getDefaultTargetFrame() - .getFeatureGroupsOfState(visible)); + return arrayToSeparatorList( + getDefaultTargetFrame().getFeatureGroupsOfState(visible)); } /* @@ -2459,9 +2142,11 @@ public class JalviewLite extends Applet implements * jalview.bin.JalviewLiteJsApi#getFeatureGroupsOfStateOn(jalview.appletgui * .AlignFrame, boolean) */ - public String getFeatureGroupsOfStateOn(AlignFrame alf, boolean visible) + @Override + public String getFeatureGroupsOfStateOn(AlignFrameI alf, boolean visible) { - return arrayToSeparatorList(alf.getFeatureGroupsOfState(visible)); + return arrayToSeparatorList( + ((AlignFrame) alf).getFeatureGroupsOfState(visible)); } /* @@ -2470,7 +2155,8 @@ public class JalviewLite extends Applet implements * @see jalview.bin.JalviewLiteJsApi#setFeatureGroupStateOn(jalview.appletgui. * AlignFrame, java.lang.String, boolean) */ - public void setFeatureGroupStateOn(final AlignFrame alf, + @Override + public void setFeatureGroupStateOn(final AlignFrameI alf, final String groups, boolean state) { final boolean st = state;// !(state==null || state.equals("") || @@ -2480,7 +2166,8 @@ public class JalviewLite extends Applet implements @Override public void run() { - alf.setFeatureGroupState(separatorListToArray(groups), st); + ((AlignFrame) alf) + .setFeatureGroupState(separatorListToArray(groups), st); } }); } @@ -2491,6 +2178,7 @@ public class JalviewLite extends Applet implements * @see jalview.bin.JalviewLiteJsApi#setFeatureGroupState(java.lang.String, * boolean) */ + @Override public void setFeatureGroupState(String groups, boolean state) { setFeatureGroupStateOn(getDefaultTargetFrame(), groups, state); @@ -2501,6 +2189,7 @@ public class JalviewLite extends Applet implements * * @see jalview.bin.JalviewLiteJsApi#getSeparator() */ + @Override public String getSeparator() { return separator; @@ -2511,6 +2200,7 @@ public class JalviewLite extends Applet implements * * @see jalview.bin.JalviewLiteJsApi#setSeparator(java.lang.String) */ + @Override public void setSeparator(String separator) { if (separator == null || separator.length() < 1) @@ -2535,6 +2225,7 @@ public class JalviewLite extends Applet implements * the value to return otherwise * @return true or false */ + @Override public boolean getDefaultParameter(String name, boolean def) { String stn; @@ -2542,7 +2233,7 @@ public class JalviewLite extends Applet implements { return def; } - if (stn.toLowerCase().equals("true")) + if (TRUE.equalsIgnoreCase(stn)) { return true; } @@ -2555,13 +2246,16 @@ public class JalviewLite extends Applet implements * @see jalview.bin.JalviewLiteJsApi#addPdbFile(jalview.appletgui.AlignFrame, * java.lang.String, java.lang.String, java.lang.String) */ - public boolean addPdbFile(AlignFrame alFrame, String sequenceId, + @Override + public boolean addPdbFile(AlignFrameI alFrame, String sequenceId, String pdbEntryString, String pdbFile) { - return alFrame.addPdbFile(sequenceId, pdbEntryString, pdbFile); + return ((AlignFrame) alFrame).addPdbFile(sequenceId, pdbEntryString, + pdbFile); } - protected void setAlignPdbStructures(boolean alignPdbStructures) + @Override + public void setAlignPdbStructures(boolean alignPdbStructures) { this.alignPdbStructures = alignPdbStructures; } @@ -2571,90 +2265,42 @@ public class JalviewLite extends Applet implements return alignPdbStructures; } + @Override public void start() { // callInitCallback(); } - private Hashtable jshashes = new Hashtable(); + private Hashtable jshashes = new Hashtable<>(); - private Hashtable> jsmessages = new Hashtable>(); + private Hashtable> jsmessages = new Hashtable<>(); - public void setJsMessageSet(String messageclass, String viewId, - String[] colcommands) - { - Hashtable msgset = jsmessages.get(messageclass); - if (msgset == null) - { - msgset = new Hashtable(); - jsmessages.put(messageclass, msgset); - } - msgset.put(viewId, colcommands); - long[] l = new long[colcommands.length]; - for (int i = 0; i < colcommands.length; i++) - { - l[i] = colcommands[i].hashCode(); - } - jshashes.put(messageclass + "|" + viewId, l); - } - /* - * (non-Javadoc) - * - * @see jalview.bin.JalviewLiteJsApi#getJsMessage(java.lang.String, - * java.lang.String) - */ - public String getJsMessage(String messageclass, String viewId) + @Override + public Hashtable getJSHashes() { - Hashtable msgset = jsmessages.get(messageclass); - if (msgset != null) - { - String[] msgs = msgset.get(viewId); - if (msgs != null) - { - for (int i = 0; i < msgs.length; i++) - { - if (msgs[i] != null) - { - String m = msgs[i]; - msgs[i] = null; - return m; - } - } - } - } - return ""; + return jshashes; } - public boolean isJsMessageSetChanged(String string, String string2, - String[] colcommands) + @Override + public Hashtable> getJSMessages() { - long[] l = jshashes.get(string + "|" + string2); - if (l == null && colcommands != null) - { - return true; - } - for (int i = 0; i < colcommands.length; i++) - { - if (l[i] != colcommands[i].hashCode()) - { - return true; - } - } - return false; + return jsmessages; } - private Vector jsExecQueue = new Vector(); + private Vector jsExecQueue = new Vector<>(); - public Vector getJsExecQueue() + @Override + public Vector getJsExecQueue(JSFunctionExec exec) { + jsFunctionExec = exec; return jsExecQueue; } - public void setExecutor(JSFunctionExec jsFunctionExec2) - { - jsFunctionExec = jsFunctionExec2; - } + // public void setExecutor(JSFunctionExec jsFunctionExec2) + // { + // jsFunctionExec = jsFunctionExec2; + // } /** * return the given colour value parameter or the given default if parameter @@ -2671,22 +2317,13 @@ public class JalviewLite extends Applet implements { return defcolour; } - Color col = jalview.schemes.ColourSchemeProperty - .getAWTColorFromName(colprop); + Color col = ColorUtils.parseColourString(colprop); if (col == null) { - try - { - col = new jalview.schemes.UserColourScheme(colprop).findColour('A'); - } catch (Exception ex) - { - System.err.println("Couldn't parse '" + colprop - + "' as a colour for " + colparam); - col = null; - } + System.err.println("Couldn't parse '" + colprop + "' as a colour for " + + colparam); } return (col == null) ? defcolour : col; - } public void openJalviewHelpUrl() @@ -2700,33 +2337,6 @@ public class JalviewLite extends Applet implements } /** - * form a complete URL given a path to a resource and a reference location on - * the same server - * - * @param url - * - an absolute path on the same server as localref or a document - * located relative to localref - * @param localref - * - a URL on the same server as url - * @return a complete URL for the resource located by url - */ - private String resolveUrlForLocalOrAbsolute(String url, URL localref) - { - String codebase = localref.toString(); - if (url.indexOf("/") == 0) - { - url = codebase.substring(0, codebase.length() - - localref.getFile().length()) - + url; - } - else - { - url = localref + url; - } - return url; - } - - /** * open a URL in the browser - resolving it according to relative refs and * coping with javascript: protocol if necessary. * @@ -2743,17 +2353,15 @@ public class JalviewLite extends Applet implements // form valid URL // Should really use docbase, not codebase. URL prepend; - url = resolveUrlForLocalOrAbsolute( - url, - prepend = getDefaultParameter("resolvetocodebase", false) ? getDocumentBase() - : getCodeBase()); + url = JalviewAppLoader.resolveUrlForLocalOrAbsolute(url, + prepend = getDefaultParameter("resolvetocodebase", false) + ? getCodeBase() + : getDocumentBase()); if (debug) { - System.err - .println("Show url (prepended " - + prepend - + " - toggle resolvetocodebase if code/docbase resolution is wrong): " - + url); + System.err.println("Show url (prepended " + prepend + + " - toggle resolvetocodebase if code/docbase resolution is wrong): " + + url); } } else @@ -2778,21 +2386,209 @@ public class JalviewLite extends Applet implements } } - /** - * bind structures in a viewer to any matching sequences in an alignFrame (use - * sequenceIds to limit scope of search to specific sequences) - * - * @param alFrame - * @param viewer - * @param sequenceIds - * @return TODO: consider making an exception structure for indicating when - * binding fails public SequenceStructureBinding - * addStructureViewInstance( AlignFrame alFrame, Object viewer, String - * sequenceIds) { - * - * if (sequenceIds != null && sequenceIds.length() > 0) { return - * alFrame.addStructureViewInstance(viewer, - * separatorListToArray(sequenceIds)); } else { return - * alFrame.addStructureViewInstance(viewer, null); } // return null; } - */ + @Override + public AlignViewportI getViewport() + { + return loaderFrame.getAlignViewport(); + } + + @Override + public void newStructureView(PDBEntry pdb, SequenceI[] seqs, + String[] chains, DataSourceType protocol) + { + loaderFrame.newStructureView(this, pdb, seqs, chains, + protocol); + } + + @Override + public void alignedStructureView(PDBEntry[] pdb, SequenceI[][] seqs, + String[][] chains, String[] protocols) + { + loaderFrame.alignedStructureView(this, pdb, seqs, chains, protocols); + } + + @Override + public void updateForAnnotations() + { + loaderFrame.alignPanel.fontChanged(); + loaderFrame.alignPanel.setScrollValues(0, 0); + } + + @Override + public void setFeatureGroupState(String[] groups, boolean state) + { + loaderFrame.setFeatureGroupState(groups, state); + } + + @Override + public boolean parseFeaturesFile(String param, DataSourceType protocol) + { + return loaderFrame.parseFeaturesFile(param, protocol); + } + + @Override + public void newFeatureSettings() + { + getViewport().setShowSequenceFeatures(true); + new FeatureSettings(loaderFrame.alignPanel); + } + + @Override + public boolean loadScoreFile(String sScoreFile) throws IOException + { + return loaderFrame.loadScoreFile(sScoreFile); + } + + @Override + public void loadTree(NewickFile tree, String treeFile) throws IOException + { + loaderFrame.loadTree(tree, treeFile); + } + + @Override + public boolean isJsfallbackEnabled() + { + return jsfallbackEnabled; + } + + @Override + public JSObject getJSObject() + { + return JSObject.getWindow(this); + } + + @Override + public void updateColoursFromMouseOver(Object source, + MouseOverStructureListener listener) + { + } + + @Override + public Object[] getSelectionForListener(SequenceGroup seqsel, ColumnSelection colsel, + HiddenColumns hidden, SelectionSource source, Object alignFrame) + { + // System.err.println("Testing selection event relay to + // jsfunction:"+_listener); + String setid = ""; + AlignFrame src = (AlignFrame) alignFrame; + if (source != null) + { + if (source instanceof jalview.appletgui.AlignViewport + && ((jalview.appletgui.AlignViewport) source).applet.currentAlignFrame.viewport == source) + { + // should be valid if it just generated an event! + src = ((jalview.appletgui.AlignViewport) source).applet.currentAlignFrame; + + } + } + String[] seqs = new String[] {}; + String[] cols = new String[] {}; + int strt = 0, end = (src == null) ? -1 + : src.alignPanel.av.getAlignment().getWidth(); + if (seqsel != null && seqsel.getSize() > 0) + { + seqs = new String[seqsel.getSize()]; + for (int i = 0; i < seqs.length; i++) + { + seqs[i] = seqsel.getSequenceAt(i).getName(); + } + if (strt < seqsel.getStartRes()) + { + strt = seqsel.getStartRes(); + } + if (end == -1 || end > seqsel.getEndRes()) + { + end = seqsel.getEndRes(); + } + } + if (colsel != null && !colsel.isEmpty()) + { + if (end == -1) + { + end = colsel.getMax() + 1; + } + cols = new String[colsel.getSelected().size()]; + for (int i = 0; i < cols.length; i++) + { + cols[i] = "" + (1 + colsel.getSelected().get(i).intValue()); + } + } + else + { + if (seqsel != null && seqsel.getSize() > 0) + { + // send a valid range, otherwise we send the empty selection + cols = new String[2]; + cols[0] = "" + (1 + strt) + "-" + (1 + end); + } + } + return new Object[] + { src, setid, arrayToSeparatorList(seqs), arrayToSeparatorList(cols) }; + } + + @Override + public String getJsMessage(String messageclass, String viewId) + { + return JSFunctionExec.getJsMessage(messageclass, viewId, this); + } + + @Override + public Object getFrameForSource(VamsasSource source) + { + if (source != null) + { + if (source instanceof jalview.appletgui.AlignViewport + && ((jalview.appletgui.AlignViewport) source).applet.currentAlignFrame.viewport == source) + { + // should be valid if it just generated an event! + return ((jalview.appletgui.AlignViewport) source).applet.currentAlignFrame; + + } + // TODO: ensure that if '_af' is specified along with a handler + // function, then only events from that alignFrame are sent to that + // function + } + return null; + } + + @Override + public FeatureRenderer getNewFeatureRenderer(AlignViewportI vp) + { + return new jalview.appletgui.FeatureRenderer((AlignmentViewport) vp); + } + + @Override + public String getSelectedSequencesAsAlignment(String format, + boolean suffix) + { + // TODO Auto-generated method stub + return null; + } + + @Override + public String getSelectedSequencesAsAlignmentFrom(AlignFrameI alf, + String format, boolean suffix) + { + // TODO Auto-generated method stub + return null; + } + + // /** + // * bind structures in a viewer to any matching sequences in an alignFrame + // (use + // * sequenceIds to limit scope of search to specific sequences) + // * + // * @param alFrame + // * @param viewer + // * @param sequenceIds + // * @return TODO: consider making an exception structure for indicating when + // * binding fails public SequenceStructureBinding + // * addStructureViewInstance( AlignFrame alFrame, Object viewer, String + // * sequenceIds) { + // * + // * if (sequenceIds != null && sequenceIds.length() > 0) { return + // * alFrame.addStructureViewInstance(viewer, + // * separatorListToArray(sequenceIds)); } else { return + // * alFrame.addStructureViewInstance(viewer, null); } // return null; } + // */ }