X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fbin%2FJalviewLite.java;h=b1f16ac15265b82c64624134bf514f84281ed2c2;hb=87ea83af3e209a8c3a4b19f9530a9c05b4541148;hp=1801eb1cd38de7a0d5208033e522f8b1a0c41b5c;hpb=af1471fa3d7d3cb32d203e81d394838608dd1c96;p=jalview.git diff --git a/src/jalview/bin/JalviewLite.java b/src/jalview/bin/JalviewLite.java old mode 100755 new mode 100644 index 1801eb1..b1f16ac --- a/src/jalview/bin/JalviewLite.java +++ b/src/jalview/bin/JalviewLite.java @@ -1,13 +1,13 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer (Version 2.6) - * Copyright (C) 2010 J Procter, AM Waterhouse, G Barton, M Clamp, S Searle + * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8) + * Copyright (C) 2012 J Procter, AM Waterhouse, LM Lui, J Engelhardt, G Barton, M Clamp, S Searle * * 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 @@ -17,7 +17,9 @@ */ package jalview.bin; +import jalview.api.StructureSelectionManagerProvider; import jalview.appletgui.AlignFrame; +import jalview.appletgui.AlignViewport; import jalview.appletgui.EmbmenuFrame; import jalview.appletgui.FeatureSettings; import jalview.datamodel.Alignment; @@ -34,14 +36,17 @@ import jalview.io.FileParse; import jalview.io.IdentifyFile; import jalview.io.JnetAnnotationMaker; import jalview.javascript.JSFunctionExec; +import jalview.javascript.JalviewLiteJsApi; import jalview.javascript.JsCallBack; import jalview.structure.SelectionListener; import jalview.structure.StructureSelectionManager; +import jalview.util.MessageManager; import java.applet.Applet; import java.awt.Button; import java.awt.Color; import java.awt.Component; +import java.awt.EventQueue; import java.awt.Font; import java.awt.Frame; import java.awt.Graphics; @@ -50,6 +55,8 @@ import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.BufferedReader; import java.io.InputStreamReader; +import java.net.URL; +import java.util.Hashtable; import java.util.StringTokenizer; import java.util.Vector; @@ -59,55 +66,58 @@ import netscape.javascript.JSObject; * Jalview Applet. Runs in Java 1.18 runtime * * @author $author$ - * @version $Revision$ + * @version $Revision: 1.92 $ */ -public class JalviewLite extends Applet +public class JalviewLite extends Applet implements + StructureSelectionManagerProvider, JalviewLiteJsApi { + public StructureSelectionManager getStructureSelectionManager() + { + return StructureSelectionManager.getStructureSelectionManager(this); + } + // ///////////////////////////////////////// // The following public methods maybe called // externally, eg via javascript in HTML page - /** - * @return String list of selected sequence IDs, each terminated by the - * 'boolean not' character (""+0x00AC) or (¬) + /* + * (non-Javadoc) + * + * @see jalview.bin.JalviewLiteJsApi#getSelectedSequences() */ public String getSelectedSequences() { return getSelectedSequencesFrom(getDefaultTargetFrame()); } - /** - * @param sep - * separator string or null for default - * @return String list of selected sequence IDs, each terminated by given - * separator string + /* + * (non-Javadoc) + * + * @see jalview.bin.JalviewLiteJsApi#getSelectedSequences(java.lang.String) */ public String getSelectedSequences(String sep) { return getSelectedSequencesFrom(getDefaultTargetFrame(), sep); } - /** - * @param alf - * alignframe containing selection - * @return String list of selected sequence IDs, each terminated by current - * default separator sequence + /* + * (non-Javadoc) * + * @see + * jalview.bin.JalviewLiteJsApi#getSelectedSequencesFrom(jalview.appletgui + * .AlignFrame) */ public String getSelectedSequencesFrom(AlignFrame alf) { return getSelectedSequencesFrom(alf, separator); // ""+0x00AC); } - /** - * get list of selected sequence IDs separated by given separator + /* + * (non-Javadoc) * - * @param alf - * window containing selection - * @param sep - * separator string to use - default is 'boolean not' - * @return String list of selected sequence IDs, each terminated by the given - * separator + * @see + * jalview.bin.JalviewLiteJsApi#getSelectedSequencesFrom(jalview.appletgui + * .AlignFrame, java.lang.String) */ public String getSelectedSequencesFrom(AlignFrame alf, String sep) { @@ -131,15 +141,11 @@ public class JalviewLite extends Applet return result.toString(); } - /** + /* + * (non-Javadoc) * - * @param sequenceId - * id of sequence to highlight - * @param position - * integer position [ tobe implemented or range ] on sequence - * @param alignedPosition - * true/false/empty string - indicate if position is an alignment - * column or unaligned sequence position + * @see jalview.bin.JalviewLiteJsApi#highlight(java.lang.String, + * java.lang.String, java.lang.String) */ public void highlight(String sequenceId, String position, String alignedPosition) @@ -148,26 +154,22 @@ public class JalviewLite extends Applet alignedPosition); } - /** + /* + * (non-Javadoc) * - * @param sequenceId - * id of sequence to highlight - * @param position - * integer position [ tobe implemented or range ] on sequence - * @param alignedPosition - * false, blank or something else - indicate if position is an - * alignment column or unaligned sequence position + * @see jalview.bin.JalviewLiteJsApi#highlightIn(jalview.appletgui.AlignFrame, + * java.lang.String, java.lang.String, java.lang.String) */ - public void highlightIn(AlignFrame alf, String sequenceId, - String position, String alignedPosition) + public void highlightIn(final AlignFrame 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()); - SequenceI sq = matcher.findIdMatch(sequenceId); + final SequenceI sq = matcher.findIdMatch(sequenceId); if (sq != null) { - int pos, apos = -1; + int apos = -1; try { apos = new Integer(position).intValue(); @@ -176,75 +178,79 @@ public class JalviewLite extends Applet { return; } + 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)) { - StructureSelectionManager.getStructureSelectionManager() - .mouseOverVamsasSequence(sq, sq.findIndex(apos), null); + java.awt.EventQueue.invokeLater(new Runnable() + { + @Override + public void run() + { + StructureSelectionManager.getStructureSelectionManager(me) + .mouseOverVamsasSequence(sq, sq.findIndex(pos), null); + } + }); } else { - StructureSelectionManager.getStructureSelectionManager() - .mouseOverVamsasSequence(sq, apos, null); + java.awt.EventQueue.invokeLater(new Runnable() + { + @Override + public void run() + { + StructureSelectionManager.getStructureSelectionManager(me) + .mouseOverVamsasSequence(sq, pos, null); + } + }); } - } } - /** - * select regions of the currrent alignment frame + /* + * (non-Javadoc) * - * @param sequenceIds - * String separated list of sequence ids or empty string - * @param columns - * String separated list { column range or column, ..} or empty - * string + * @see jalview.bin.JalviewLiteJsApi#select(java.lang.String, + * java.lang.String) */ public void select(String sequenceIds, String columns) { selectIn(getDefaultTargetFrame(), sequenceIds, columns, separator); } - /** - * select regions of the currrent alignment frame + /* + * (non-Javadoc) * - * @param toselect - * String separated list { column range, seq1...seqn sequence ids } - * @param sep - * separator between toselect fields + * @see jalview.bin.JalviewLiteJsApi#select(java.lang.String, + * java.lang.String, java.lang.String) */ public void select(String sequenceIds, String columns, String sep) { selectIn(getDefaultTargetFrame(), sequenceIds, columns, sep); } - /** - * select regions of the given alignment frame + /* + * (non-Javadoc) * - * @param alf - * @param toselect - * String separated list { column range, seq1...seqn sequence ids } - * @param sep - * separator between toselect fields + * @see jalview.bin.JalviewLiteJsApi#selectIn(jalview.appletgui.AlignFrame, + * java.lang.String, java.lang.String) */ public void selectIn(AlignFrame alf, String sequenceIds, String columns) { selectIn(alf, sequenceIds, columns, separator); } - /** - * select regions of the given alignment frame + /* + * (non-Javadoc) * - * @param alf - * @param toselect - * String separated list { column range, seq1...seqn sequence ids } - * @param sep - * separator between toselect fields + * @see jalview.bin.JalviewLiteJsApi#selectIn(jalview.appletgui.AlignFrame, + * java.lang.String, java.lang.String, java.lang.String) */ - public void selectIn(AlignFrame alf, String sequenceIds, String columns, - String sep) + public void selectIn(final AlignFrame alf, String sequenceIds, + String columns, String sep) { if (sep == null || sep.length() == 0) { @@ -261,8 +267,8 @@ public class JalviewLite extends Applet // deparse fields String[] ids = separatorListToArray(sequenceIds, sep); String[] cols = separatorListToArray(columns, sep); - SequenceGroup sel = new SequenceGroup(); - ColumnSelection csel = new ColumnSelection(); + final SequenceGroup sel = new SequenceGroup(); + final ColumnSelection csel = new ColumnSelection(); AlignmentI al = alf.viewport.getAlignment(); jalview.analysis.SequenceIdMatcher matcher = new jalview.analysis.SequenceIdMatcher( alf.viewport.getAlignment().getSequencesArray()); @@ -448,22 +454,23 @@ public class JalviewLite extends Applet } sel.setStartRes(start); sel.setEndRes(end); - alf.select(sel, csel); + EventQueue.invokeLater(new Runnable() + { + @Override + public void run() + { + alf.select(sel, csel); + } + }); } } - /** - * get sequences selected in current alignFrame and return their alignment in - * format 'format' either with or without suffix - * - * @param alf - * - where selection is - * @param format - * - format of alignment file - * @param suffix - * - "true" to append /start-end string to each sequence ID - * @return selected sequences as flat file or empty string if there was no - * current selection + /* + * (non-Javadoc) + * + * @see + * jalview.bin.JalviewLiteJsApi#getSelectedSequencesAsAlignment(java.lang. + * String, java.lang.String) */ public String getSelectedSequencesAsAlignment(String format, String suffix) { @@ -471,18 +478,12 @@ public class JalviewLite extends Applet format, suffix); } - /** - * get sequences selected in alf and return their alignment in format 'format' - * either with or without suffix - * - * @param alf - * - where selection is - * @param format - * - format of alignment file - * @param suffix - * - "true" to append /start-end string to each sequence ID - * @return selected sequences as flat file or empty string if there was no - * current selection + /* + * (non-Javadoc) + * + * @see + * jalview.bin.JalviewLiteJsApi#getSelectedSequencesAsAlignmentFrom(jalview + * .appletgui.AlignFrame, java.lang.String, java.lang.String) */ public String getSelectedSequencesAsAlignmentFrom(AlignFrame alf, String format, String suffix) @@ -492,6 +493,9 @@ public class JalviewLite extends Applet boolean seqlimits = suffix.equalsIgnoreCase("true"); if (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()), seqlimits); @@ -505,16 +509,35 @@ public class JalviewLite extends Applet return ""; } + /* + * (non-Javadoc) + * + * @see jalview.bin.JalviewLiteJsApi#getAlignmentOrder() + */ public String getAlignmentOrder() { return getAlignmentOrderFrom(getDefaultTargetFrame()); } + /* + * (non-Javadoc) + * + * @see + * jalview.bin.JalviewLiteJsApi#getAlignmentOrderFrom(jalview.appletgui.AlignFrame + * ) + */ public String getAlignmentOrderFrom(AlignFrame alf) { return getAlignmentOrderFrom(alf, separator); } + /* + * (non-Javadoc) + * + * @see + * jalview.bin.JalviewLiteJsApi#getAlignmentOrderFrom(jalview.appletgui.AlignFrame + * , java.lang.String) + */ public String getAlignmentOrderFrom(AlignFrame alf, String sep) { AlignmentI alorder = alf.getAlignViewport().getAlignment(); @@ -526,16 +549,35 @@ public class JalviewLite extends Applet return arrayToSeparatorList(order); } + /* + * (non-Javadoc) + * + * @see jalview.bin.JalviewLiteJsApi#orderBy(java.lang.String, + * java.lang.String) + */ public String orderBy(String order, String undoName) { return orderBy(order, undoName, separator); } + /* + * (non-Javadoc) + * + * @see jalview.bin.JalviewLiteJsApi#orderBy(java.lang.String, + * java.lang.String, java.lang.String) + */ public String orderBy(String order, String undoName, String sep) { return orderAlignmentBy(getDefaultTargetFrame(), order, undoName, sep); } + /* + * (non-Javadoc) + * + * @see + * jalview.bin.JalviewLiteJsApi#orderAlignmentBy(jalview.appletgui.AlignFrame, + * java.lang.String, java.lang.String, java.lang.String) + */ public String orderAlignmentBy(AlignFrame alf, String order, String undoName, String sep) { @@ -575,31 +617,58 @@ public class JalviewLite extends Applet return ""; } ; - AlignmentOrder aorder = new AlignmentOrder(sqs); + final AlignmentOrder aorder = new AlignmentOrder(sqs); if (undoName != null && undoName.trim().length() == 0) { undoName = null; } - - return alf.sortBy(aorder, undoName) ? "true" : ""; + final String _undoName = undoName; + // TODO: deal with synchronization here: cannot raise any events until after + // this has returned. + return alf.sortBy(aorder, _undoName) ? "true" : ""; } + /* + * (non-Javadoc) + * + * @see jalview.bin.JalviewLiteJsApi#getAlignment(java.lang.String) + */ public String getAlignment(String format) { return getAlignmentFrom(getDefaultTargetFrame(), format, "true"); } + /* + * (non-Javadoc) + * + * @see + * jalview.bin.JalviewLiteJsApi#getAlignmentFrom(jalview.appletgui.AlignFrame, + * java.lang.String) + */ public String getAlignmentFrom(AlignFrame alf, String format) { return getAlignmentFrom(alf, format, "true"); } + /* + * (non-Javadoc) + * + * @see jalview.bin.JalviewLiteJsApi#getAlignment(java.lang.String, + * java.lang.String) + */ public String getAlignment(String format, String suffix) { return getAlignmentFrom(getDefaultTargetFrame(), format, suffix); } + /* + * (non-Javadoc) + * + * @see + * jalview.bin.JalviewLiteJsApi#getAlignmentFrom(jalview.appletgui.AlignFrame, + * java.lang.String, java.lang.String) + */ public String getAlignmentFrom(AlignFrame alf, String format, String suffix) { @@ -617,11 +686,23 @@ public class JalviewLite extends Applet } } + /* + * (non-Javadoc) + * + * @see jalview.bin.JalviewLiteJsApi#loadAnnotation(java.lang.String) + */ public void loadAnnotation(String annotation) { loadAnnotationFrom(getDefaultTargetFrame(), annotation); } + /* + * (non-Javadoc) + * + * @see + * jalview.bin.JalviewLiteJsApi#loadAnnotationFrom(jalview.appletgui.AlignFrame + * , java.lang.String) + */ public void loadAnnotationFrom(AlignFrame alf, String annotation) { if (new AnnotationFile().readAnnotationFile(alf.getAlignViewport() @@ -636,53 +717,120 @@ public class JalviewLite extends Applet } } + /* + * (non-Javadoc) + * + * @see jalview.bin.JalviewLiteJsApi#loadAnnotation(java.lang.String) + */ + public void loadFeatures(String features, boolean autoenabledisplay) + { + loadFeaturesFrom(getDefaultTargetFrame(), features, autoenabledisplay); + } + + /* + * (non-Javadoc) + * + * @see + * jalview.bin.JalviewLiteJsApi#loadAnnotationFrom(jalview.appletgui.AlignFrame + * , java.lang.String) + */ + public boolean loadFeaturesFrom(AlignFrame alf, String features, + boolean autoenabledisplay) + { + return alf.parseFeaturesFile(features, AppletFormatAdapter.PASTE, + autoenabledisplay); + } + + /* + * (non-Javadoc) + * + * @see jalview.bin.JalviewLiteJsApi#getFeatures(java.lang.String) + */ public String getFeatures(String format) { return getFeaturesFrom(getDefaultTargetFrame(), format); } + /* + * (non-Javadoc) + * + * @see + * jalview.bin.JalviewLiteJsApi#getFeaturesFrom(jalview.appletgui.AlignFrame, + * java.lang.String) + */ public String getFeaturesFrom(AlignFrame alf, String format) { return alf.outputFeatures(false, format); } + /* + * (non-Javadoc) + * + * @see jalview.bin.JalviewLiteJsApi#getAnnotation() + */ public String getAnnotation() { return getAnnotationFrom(getDefaultTargetFrame()); } + /* + * (non-Javadoc) + * + * @see + * jalview.bin.JalviewLiteJsApi#getAnnotationFrom(jalview.appletgui.AlignFrame + * ) + */ public String getAnnotationFrom(AlignFrame alf) { return alf.outputAnnotations(false); } + /* + * (non-Javadoc) + * + * @see jalview.bin.JalviewLiteJsApi#newView() + */ public AlignFrame newView() { return newViewFrom(getDefaultTargetFrame()); } + /* + * (non-Javadoc) + * + * @see jalview.bin.JalviewLiteJsApi#newView(java.lang.String) + */ public AlignFrame newView(String name) { return newViewFrom(getDefaultTargetFrame(), name); } + /* + * (non-Javadoc) + * + * @see jalview.bin.JalviewLiteJsApi#newViewFrom(jalview.appletgui.AlignFrame) + */ public AlignFrame newViewFrom(AlignFrame alf) { return alf.newView(null); } + /* + * (non-Javadoc) + * + * @see jalview.bin.JalviewLiteJsApi#newViewFrom(jalview.appletgui.AlignFrame, + * java.lang.String) + */ public AlignFrame newViewFrom(AlignFrame alf, String name) { return alf.newView(name); } - /** + /* + * (non-Javadoc) * - * @param text - * alignment file as a string - * @param title - * window title - * @return null or new alignment frame + * @see jalview.bin.JalviewLiteJsApi#loadAlignment(java.lang.String, + * java.lang.String) */ public AlignFrame loadAlignment(String text, String title) { @@ -705,13 +853,25 @@ public class JalviewLite extends Applet return null; } + /* + * (non-Javadoc) + * + * @see jalview.bin.JalviewLiteJsApi#setMouseoverListener(java.lang.String) + */ public void setMouseoverListener(String listener) { setMouseoverListener(currentAlignFrame, listener); } - private Vector javascriptListeners = new Vector(); + private Vector javascriptListeners = new Vector(); + /* + * (non-Javadoc) + * + * @see + * jalview.bin.JalviewLiteJsApi#setMouseoverListener(jalview.appletgui.AlignFrame + * , java.lang.String) + */ public void setMouseoverListener(AlignFrame af, String listener) { if (listener != null) @@ -727,7 +887,7 @@ public class JalviewLite extends Applet jalview.javascript.MouseOverListener mol = new jalview.javascript.MouseOverListener( this, af, listener); javascriptListeners.addElement(mol); - StructureSelectionManager.getStructureSelectionManager() + StructureSelectionManager.getStructureSelectionManager(this) .addStructureViewerListener(mol); if (debug) { @@ -739,11 +899,23 @@ public class JalviewLite extends Applet } } + /* + * (non-Javadoc) + * + * @see jalview.bin.JalviewLiteJsApi#setSelectionListener(java.lang.String) + */ public void setSelectionListener(String listener) { setSelectionListener(null, listener); } + /* + * (non-Javadoc) + * + * @see + * jalview.bin.JalviewLiteJsApi#setSelectionListener(jalview.appletgui.AlignFrame + * , java.lang.String) + */ public void setSelectionListener(AlignFrame af, String listener) { if (listener != null) @@ -759,7 +931,7 @@ public class JalviewLite extends Applet jalview.javascript.JsSelectionSender mol = new jalview.javascript.JsSelectionSender( this, af, listener); javascriptListeners.addElement(mol); - StructureSelectionManager.getStructureSelectionManager() + StructureSelectionManager.getStructureSelectionManager(this) .addSelectionListener(mol); if (debug) { @@ -771,7 +943,13 @@ public class JalviewLite extends Applet } } - public void setStructureListener(String listener) + /* + * (non-Javadoc) + * + * @see jalview.bin.JalviewLiteJsApi#setStructureListener(java.lang.String, + * java.lang.String) + */ + public void setStructureListener(String listener, String modelSet) { if (listener != null) { @@ -783,25 +961,26 @@ public class JalviewLite extends Applet return; } } - jalview.javascript.MouseOverStructureListener mol = new jalview.javascript.MouseOverStructureListener(this, listener); + jalview.javascript.MouseOverStructureListener mol = new jalview.javascript.MouseOverStructureListener( + this, listener, separatorListToArray(modelSet)); javascriptListeners.addElement(mol); - StructureSelectionManager.getStructureSelectionManager() + StructureSelectionManager.getStructureSelectionManager(this) .addStructureViewerListener(mol); if (debug) { - System.err.println("Added a javascript structure viewer listener '"+listener+"'"); + System.err.println("Added a javascript structure viewer listener '" + + listener + "'"); System.err.println("There are now " + javascriptListeners.size() + " listeners in total."); } } - /** - * remove any callback using the given listener function and associated with - * the given alignFrame (or null for all callbacks) + + /* + * (non-Javadoc) * - * @param af - * (may be null) - * @param listener - * (may be null) + * @see + * jalview.bin.JalviewLiteJsApi#removeJavascriptListener(jalview.appletgui + * .AlignFrame, java.lang.String) */ public void removeJavascriptListener(AlignFrame af, String listener) { @@ -826,12 +1005,12 @@ public class JalviewLite extends Applet msSize--; if (lstner instanceof SelectionListener) { - StructureSelectionManager.getStructureSelectionManager() + StructureSelectionManager.getStructureSelectionManager(this) .removeSelectionListener((SelectionListener) lstner); } else { - StructureSelectionManager.getStructureSelectionManager() + StructureSelectionManager.getStructureSelectionManager(this) .removeStructureViewerListener(lstner, null); } rprt = debug; @@ -854,48 +1033,189 @@ public class JalviewLite extends Applet public void stop() { + System.err.println("Applet " + getName() + " stop()."); + tidyUp(); + } + + public void destroy() + { + System.err.println("Applet " + getName() + " destroy()."); + tidyUp(); + } + + private void tidyUp() + { + removeAll(); + if (currentAlignFrame != null && currentAlignFrame.viewport != null + && currentAlignFrame.viewport.applet != null) + { + AlignViewport av = currentAlignFrame.viewport; + currentAlignFrame.closeMenuItem_actionPerformed(); + av.applet = null; + currentAlignFrame = null; + } if (javascriptListeners != null) { while (javascriptListeners.size() > 0) { - Object mol = javascriptListeners.elementAt(0); + jalview.javascript.JSFunctionExec mol = javascriptListeners + .elementAt(0); javascriptListeners.removeElement(mol); if (mol instanceof SelectionListener) { - StructureSelectionManager.getStructureSelectionManager() + StructureSelectionManager.getStructureSelectionManager(this) .removeSelectionListener((SelectionListener) mol); } else { - StructureSelectionManager.getStructureSelectionManager() + StructureSelectionManager.getStructureSelectionManager(this) .removeStructureViewerListener(mol, null); } + mol.jvlite = null; } } - jalview.javascript.JSFunctionExec.stopQueue(); + if (jsFunctionExec != null) + { + jsFunctionExec.stopQueue(); + jsFunctionExec.jvlite = null; + } + initialAlignFrame = null; + jsFunctionExec = null; + javascriptListeners = null; + StructureSelectionManager.release(this); } - /** - * send a mouseover message to all the alignment windows associated with the - * given residue in the pdbfile + private jalview.javascript.JSFunctionExec jsFunctionExec; + + /* + * (non-Javadoc) * - * @param pdbResNum - * @param chain - * @param pdbfile + * @see jalview.bin.JalviewLiteJsApi#mouseOverStructure(java.lang.String, + * java.lang.String, java.lang.String) */ - public void mouseOverStructure(String pdbResNum, String chain, String pdbfile) + public void mouseOverStructure(final String pdbResNum, + final String chain, final String pdbfile) { - try { - StructureSelectionManager.getStructureSelectionManager() - .mouseOverStructure(new Integer(pdbResNum).intValue(), chain, pdbfile); - if (debug) + final StructureSelectionManagerProvider me = this; + java.awt.EventQueue.invokeLater(new Runnable() { - System.err.println("mouseOver for '"+pdbResNum+"' in chain '"+chain+"' in structure '"+pdbfile+"'"); - } - } catch (NumberFormatException e) + @Override + public void run() + { + try + { + StructureSelectionManager.getStructureSelectionManager(me) + .mouseOverStructure(new Integer(pdbResNum).intValue(), + chain, pdbfile); + if (debug) + { + System.err.println("mouseOver for '" + pdbResNum + + "' in chain '" + chain + "' in structure '" + pdbfile + + "'"); + } + } catch (NumberFormatException e) + { + System.err.println("Ignoring invalid residue number string '" + + pdbResNum + "'"); + } + + } + }); + } + + /* + * (non-Javadoc) + * + * @see + * jalview.bin.JalviewLiteJsApi#scrollViewToIn(jalview.appletgui.AlignFrame, + * java.lang.String, java.lang.String) + */ + public void scrollViewToIn(final AlignFrame alf, final String topRow, + final String leftHandColumn) + { + java.awt.EventQueue.invokeLater(new Runnable() { - System.err.println("Ignoring invalid residue number string '"+pdbResNum+"'"); - } + @Override + public void run() + { + try + { + alf.scrollTo(new Integer(topRow).intValue(), new Integer( + leftHandColumn).intValue()); + + } catch (Exception ex) + { + System.err.println("Couldn't parse integer arguments (topRow='" + + topRow + "' and leftHandColumn='" + leftHandColumn + + "')"); + ex.printStackTrace(); + } + } + }); + } + + /* + * (non-Javadoc) + * + * @see + * jalview.javascript.JalviewLiteJsApi#scrollViewToRowIn(jalview.appletgui + * .AlignFrame, java.lang.String) + */ + @Override + public void scrollViewToRowIn(final AlignFrame alf, final String topRow) + { + + java.awt.EventQueue.invokeLater(new Runnable() + { + @Override + public void run() + { + try + { + alf.scrollToRow(new Integer(topRow).intValue()); + + } catch (Exception ex) + { + System.err.println("Couldn't parse integer arguments (topRow='" + + topRow + "')"); + ex.printStackTrace(); + } + + } + }); + } + + /* + * (non-Javadoc) + * + * @see + * jalview.javascript.JalviewLiteJsApi#scrollViewToColumnIn(jalview.appletgui + * .AlignFrame, java.lang.String) + */ + @Override + public void scrollViewToColumnIn(final AlignFrame alf, + final String leftHandColumn) + { + java.awt.EventQueue.invokeLater(new Runnable() + { + + @Override + public void run() + { + try + { + alf.scrollToColumn(new Integer(leftHandColumn).intValue()); + + } catch (Exception ex) + { + System.err + .println("Couldn't parse integer arguments (leftHandColumn='" + + leftHandColumn + "')"); + ex.printStackTrace(); + } + } + }); + } // ////////////////////////////////////////////// @@ -938,9 +1258,10 @@ public class JalviewLite extends Applet private boolean alignPdbStructures = false; /** - * use an external structure viewer exclusively (no jmols or MCViews will be opened by JalviewLite itself) + * use an external structure viewer exclusively (no jmols or MCViews will be + * opened by JalviewLite itself) */ - public boolean useXtrnalSviewer=false; + public boolean useXtrnalSviewer = false; public static boolean debug = false; @@ -1038,9 +1359,10 @@ public class JalviewLite extends Applet } String externalsviewer = getParameter("externalstructureviewer"); - if (externalsviewer!=null) + if (externalsviewer != null) { - useXtrnalSviewer=externalsviewer.trim().toLowerCase().equals("true"); + useXtrnalSviewer = externalsviewer.trim().toLowerCase() + .equals("true"); } /** * if true disable the check for jmol @@ -1153,7 +1475,7 @@ public class JalviewLite extends Applet // still be called to open new alignments. file = "NO FILE"; fileFound = false; - // callInitCallback(); + callInitCallback(); } } @@ -1224,11 +1546,15 @@ public class JalviewLite extends Applet { if (frame instanceof AlignFrame) { + AlignViewport vp = ((AlignFrame) frame).viewport; ((AlignFrame) frame).closeMenuItem_actionPerformed(); - if (((AlignFrame) frame).viewport.applet.currentAlignFrame == frame) + if (vp.applet.currentAlignFrame == frame) { - ((AlignFrame) frame).viewport.applet.currentAlignFrame = null; + vp.applet.currentAlignFrame = null; } + vp.applet = null; + vp = null; + } lastFrameX -= 40; lastFrameY -= 40; @@ -1500,11 +1826,10 @@ public class JalviewLite extends Applet if (protocol == jalview.io.AppletFormatAdapter.PASTE) { - newAlignFrame.setTitle("Sequences from " - + applet.getDocumentBase()); + newAlignFrame.setTitle(MessageManager.formatMessage("label.sequences_from", new String[]{applet.getDocumentBase().toString()})); } - newAlignFrame.statusBar.setText("Successfully loaded file " + file); + newAlignFrame.statusBar.setText(MessageManager.formatMessage("label.successfully_loaded_file", new String []{file})); String treeFile = applet.getParameter("tree"); if (treeFile == null) @@ -1542,7 +1867,56 @@ public class JalviewLite extends Applet } } - String param = applet.getParameter("features"); + /* + * 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()); + } + } + + // /////////////////////////// + // 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); @@ -1621,15 +1995,21 @@ public class JalviewLite extends Applet // 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; + 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) { @@ -1646,8 +2026,9 @@ public class JalviewLite extends Applet String sequence = applet.getParameter("PDBSEQ"); if (sequence != null) seqs = new SequenceI[] - { matcher==null ? (Sequence) newAlignFrame.getAlignViewport() - .getAlignment().findName(sequence) : matcher.findIdMatch(sequence) }; + { matcher == null ? (Sequence) newAlignFrame + .getAlignViewport().getAlignment() + .findName(sequence) : matcher.findIdMatch(sequence) }; } else @@ -1666,8 +2047,10 @@ public class JalviewLite extends Applet tmp2.addElement(st2.nextToken()); seqstring = st2.nextToken(); } - tmp.addElement(matcher==null ? (Sequence) newAlignFrame.getAlignViewport() - .getAlignment().findName(seqstring) : matcher.findIdMatch(seqstring)); + tmp.addElement(matcher == null ? (Sequence) newAlignFrame + .getAlignViewport().getAlignment() + .findName(seqstring) : matcher + .findIdMatch(seqstring)); } seqs = new SequenceI[tmp.size()]; @@ -1682,8 +2065,11 @@ public class JalviewLite extends Applet if (// !jmolAvailable // && - protocol == AppletFormatAdapter.CLASSLOADER) + 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 @@ -1730,7 +2116,7 @@ public class JalviewLite extends Applet } pdbFileCount++; - } while (pdbFileCount < 10); + } while (param != null || pdbFileCount < 10); if (pdbs.size() > 0) { SequenceI[][] seqs = new SequenceI[pdbs.size()][]; @@ -1749,21 +2135,6 @@ public class JalviewLite extends Applet protocols); } - // /////////////////////////// - // modify display of features - // - // hide specific groups - param = applet.getParameter("hidefeaturegroups"); - if (param != null) - { - applet.setFeatureGroupStateOn(newAlignFrame, param, false); - } - // show specific groups - param = applet.getParameter("showfeaturegroups"); - if (param != null) - { - applet.setFeatureGroupStateOn(newAlignFrame, param, true); - } } else { @@ -1771,6 +2142,7 @@ public class JalviewLite extends Applet applet.remove(launcher); applet.repaint(); } + callInitCallback(); } /** @@ -1805,12 +2177,40 @@ public class JalviewLite extends Applet { if (file.indexOf("://") == -1) { - file = applet.getCodeBase() + file; - if (debug) + 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) { - System.err.println("Prepended codebase for resource: '" + file - + "'"); } + ; + } return file; @@ -1845,6 +2245,11 @@ public class JalviewLite extends Applet // IDS include pipes. /** + * set to enable the URL based javascript execution mechanism + */ + public boolean jsfallbackEnabled = false; + + /** * parse the string into a list * * @param list @@ -1960,9 +2365,10 @@ public class JalviewLite extends Applet return "" + separator; } - /** - * @return - * @see jalview.appletgui.AlignFrame#getFeatureGroups() + /* + * (non-Javadoc) + * + * @see jalview.bin.JalviewLiteJsApi#getFeatureGroups() */ public String getFeatureGroups() { @@ -1971,11 +2377,12 @@ public class JalviewLite extends Applet return lst; } - /** - * @param alf - * alignframe to get feature groups on - * @return - * @see jalview.appletgui.AlignFrame#getFeatureGroups() + /* + * (non-Javadoc) + * + * @see + * jalview.bin.JalviewLiteJsApi#getFeatureGroupsOn(jalview.appletgui.AlignFrame + * ) */ public String getFeatureGroupsOn(AlignFrame alf) { @@ -1983,10 +2390,10 @@ public class JalviewLite extends Applet return lst; } - /** - * @param visible - * @return - * @see jalview.appletgui.AlignFrame#getFeatureGroupsOfState(boolean) + /* + * (non-Javadoc) + * + * @see jalview.bin.JalviewLiteJsApi#getFeatureGroupsOfState(boolean) */ public String getFeatureGroupsOfState(boolean visible) { @@ -1994,54 +2401,64 @@ public class JalviewLite extends Applet .getFeatureGroupsOfState(visible)); } - /** - * @param alf - * align frame to get groups of state visible - * @param visible - * @return - * @see jalview.appletgui.AlignFrame#getFeatureGroupsOfState(boolean) + /* + * (non-Javadoc) + * + * @see + * jalview.bin.JalviewLiteJsApi#getFeatureGroupsOfStateOn(jalview.appletgui + * .AlignFrame, boolean) */ public String getFeatureGroupsOfStateOn(AlignFrame alf, boolean visible) { return arrayToSeparatorList(alf.getFeatureGroupsOfState(visible)); } - /** - * @param groups - * tab separated list of group names - * @param state - * true or false - * @see jalview.appletgui.AlignFrame#setFeatureGroupState(java.lang.String[], - * boolean) + /* + * (non-Javadoc) + * + * @see jalview.bin.JalviewLiteJsApi#setFeatureGroupStateOn(jalview.appletgui. + * AlignFrame, java.lang.String, boolean) */ - public void setFeatureGroupStateOn(AlignFrame alf, String groups, - boolean state) + public void setFeatureGroupStateOn(final AlignFrame alf, + final String groups, boolean state) { - boolean st = state;// !(state==null || state.equals("") || + final boolean st = state;// !(state==null || state.equals("") || // state.toLowerCase().equals("false")); - alf.setFeatureGroupState(separatorListToArray(groups), st); + java.awt.EventQueue.invokeLater(new Runnable() + { + @Override + public void run() + { + alf.setFeatureGroupState(separatorListToArray(groups), st); + } + }); } + /* + * (non-Javadoc) + * + * @see jalview.bin.JalviewLiteJsApi#setFeatureGroupState(java.lang.String, + * boolean) + */ public void setFeatureGroupState(String groups, boolean state) { setFeatureGroupStateOn(getDefaultTargetFrame(), groups, state); } - /** - * List separator string + /* + * (non-Javadoc) * - * @return the separator + * @see jalview.bin.JalviewLiteJsApi#getSeparator() */ public String getSeparator() { return separator; } - /** - * List separator string + /* + * (non-Javadoc) * - * @param separator - * the separator to set. empty string will reset separator to default + * @see jalview.bin.JalviewLiteJsApi#setSeparator(java.lang.String) */ public void setSeparator(String separator) { @@ -2081,21 +2498,11 @@ public class JalviewLite extends Applet return false; } - /** - * bind a pdb file to a sequence in the given alignFrame. + /* + * (non-Javadoc) * - * @param alFrame - * - null or specific alignFrame. This specifies the dataset that - * will be searched for a seuqence called sequenceId - * @param sequenceId - * - sequenceId within the dataset. - * @param pdbEntryString - * - the short name for the PDB file - * @param pdbFile - * - pdb file - either a URL or a valid PDB file. - * @return true if binding was as success TODO: consider making an exception - * structure for indicating when PDB parsing or seqeunceId location - * fails. + * @see jalview.bin.JalviewLiteJsApi#addPdbFile(jalview.appletgui.AlignFrame, + * java.lang.String, java.lang.String, java.lang.String) */ public boolean addPdbFile(AlignFrame alFrame, String sequenceId, String pdbEntryString, String pdbFile) @@ -2115,7 +2522,209 @@ public class JalviewLite extends Applet public void start() { - callInitCallback(); + // callInitCallback(); + } + + private Hashtable jshashes = 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) + { + 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 ""; + } + + public boolean isJsMessageSetChanged(String string, String string2, + String[] colcommands) + { + 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; + } + + private Vector jsExecQueue = new Vector(); + + public Vector getJsExecQueue() + { + return jsExecQueue; + } + + public void setExecutor(JSFunctionExec jsFunctionExec2) + { + jsFunctionExec = jsFunctionExec2; + } + + /** + * return the given colour value parameter or the given default if parameter + * not given + * + * @param colparam + * @param defcolour + * @return + */ + public Color getDefaultColourParameter(String colparam, Color defcolour) + { + String colprop = getParameter(colparam); + if (colprop == null || colprop.trim().length() == 0) + { + return defcolour; + } + Color col = jalview.schemes.ColourSchemeProperty + .getAWTColorFromName(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; + } + } + return (col == null) ? defcolour : col; + + } + + public void openJalviewHelpUrl() + { + String helpUrl = getParameter("jalviewhelpurl"); + if (helpUrl == null || helpUrl.trim().length() < 5) + { + helpUrl = "http://www.jalview.org/help.html"; + } + showURL(helpUrl, "HELP"); + } + + /** + * 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. + * + * @param url + * @param target + */ + public void showURL(String url, String target) + { + try + { + if (url.indexOf(":") == -1) + { + // TODO: verify (Bas Vroling bug) prepend codebase or server URL to + // form valid URL + // Should really use docbase, not codebase. + URL prepend; + url = resolveUrlForLocalOrAbsolute( + url, + prepend = getDefaultParameter("resolvetocodebase", false) ? getDocumentBase() + : getCodeBase()); + if (debug) + { + System.err + .println("Show url (prepended " + + prepend + + " - toggle resolvetocodebase if code/docbase resolution is wrong): " + + url); + } + } + else + { + if (debug) + { + System.err.println("Show url: " + url); + } + } + if (url.indexOf("javascript:") == 0) + { + // no target for the javascript context + getAppletContext().showDocument(new java.net.URL(url)); + } + else + { + getAppletContext().showDocument(new java.net.URL(url), target); + } + } catch (Exception ex) + { + ex.printStackTrace(); + } } /**