X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fbin%2FJalviewLite.java;h=1801eb1cd38de7a0d5208033e522f8b1a0c41b5c;hb=af1471fa3d7d3cb32d203e81d394838608dd1c96;hp=0e77f021a28b3f0e6b1cc13ae05b6ce00a97af09;hpb=e1a2bb8c2129346c0c1307604a4d3c2a604bf3b8;p=jalview.git diff --git a/src/jalview/bin/JalviewLite.java b/src/jalview/bin/JalviewLite.java index 0e77f02..1801eb1 100755 --- a/src/jalview/bin/JalviewLite.java +++ b/src/jalview/bin/JalviewLite.java @@ -1,5 +1,5 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer (Version 2.5) + * Jalview - A Sequence Alignment Editor and Viewer (Version 2.6) * Copyright (C) 2010 J Procter, AM Waterhouse, G Barton, M Clamp, S Searle * * This file is part of Jalview. @@ -17,23 +17,31 @@ */ package jalview.bin; -import jalview.api.SequenceStructureBinding; import jalview.appletgui.AlignFrame; import jalview.appletgui.EmbmenuFrame; import jalview.appletgui.FeatureSettings; import jalview.datamodel.Alignment; +import jalview.datamodel.AlignmentI; +import jalview.datamodel.AlignmentOrder; +import jalview.datamodel.ColumnSelection; 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.FileParse; import jalview.io.IdentifyFile; import jalview.io.JnetAnnotationMaker; +import jalview.javascript.JSFunctionExec; +import jalview.javascript.JsCallBack; +import jalview.structure.SelectionListener; +import jalview.structure.StructureSelectionManager; import java.applet.Applet; import java.awt.Button; import java.awt.Color; +import java.awt.Component; import java.awt.Font; import java.awt.Frame; import java.awt.Graphics; @@ -42,11 +50,11 @@ import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.BufferedReader; import java.io.InputStreamReader; -import java.lang.reflect.Method; -import java.util.Enumeration; import java.util.StringTokenizer; import java.util.Vector; +import netscape.javascript.JSObject; + /** * Jalview Applet. Runs in Java 1.18 runtime * @@ -60,8 +68,8 @@ public class JalviewLite extends Applet // The following public methods maybe called // externally, eg via javascript in HTML page /** - * @return String list of selected sequence IDs, each terminated by "¬" - * (¬) + * @return String list of selected sequence IDs, each terminated by the + * 'boolean not' character (""+0x00AC) or (¬) */ public String getSelectedSequences() { @@ -71,8 +79,8 @@ public class JalviewLite extends Applet /** * @param sep * separator string or null for default - * @return String list of selected sequence IDs, each terminated by sep or - * ("¬" as default) + * @return String list of selected sequence IDs, each terminated by given + * separator string */ public String getSelectedSequences(String sep) { @@ -82,12 +90,13 @@ public class JalviewLite extends Applet /** * @param alf * alignframe containing selection - * @return String list of selected sequence IDs, each terminated by "¬" + * @return String list of selected sequence IDs, each terminated by current + * default separator sequence * */ public String getSelectedSequencesFrom(AlignFrame alf) { - return getSelectedSequencesFrom(alf, "¬"); + return getSelectedSequencesFrom(alf, separator); // ""+0x00AC); } /** @@ -96,7 +105,7 @@ public class JalviewLite extends Applet * @param alf * window containing selection * @param sep - * separator string to use - default is "¬" + * separator string to use - default is 'boolean not' * @return String list of selected sequence IDs, each terminated by the given * separator */ @@ -105,7 +114,7 @@ public class JalviewLite extends Applet StringBuffer result = new StringBuffer(""); if (sep == null || sep.length() == 0) { - sep = "¬"; + sep = separator; // "+0x00AC; } if (alf.viewport.getSelectionGroup() != null) { @@ -123,6 +132,327 @@ public class JalviewLite extends Applet } /** + * + * @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 + */ + public void highlight(String sequenceId, String position, + String alignedPosition) + { + highlightIn(getDefaultTargetFrame(), sequenceId, position, + alignedPosition); + } + + /** + * + * @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 + */ + public void highlightIn(AlignFrame alf, String sequenceId, + String position, 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); + if (sq != null) + { + int pos, apos = -1; + try + { + apos = new Integer(position).intValue(); + apos--; + } catch (NumberFormatException ex) + { + return; + } + // 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); + } + else + { + StructureSelectionManager.getStructureSelectionManager() + .mouseOverVamsasSequence(sq, apos, null); + } + + } + } + + /** + * select regions of the currrent alignment frame + * + * @param sequenceIds + * String separated list of sequence ids or empty string + * @param columns + * String separated list { column range or column, ..} or empty + * string + */ + public void select(String sequenceIds, String columns) + { + selectIn(getDefaultTargetFrame(), sequenceIds, columns, separator); + } + + /** + * select regions of the currrent alignment frame + * + * @param toselect + * String separated list { column range, seq1...seqn sequence ids } + * @param sep + * separator between toselect fields + */ + public void select(String sequenceIds, String columns, String sep) + { + selectIn(getDefaultTargetFrame(), sequenceIds, columns, sep); + } + + /** + * select regions of the given alignment frame + * + * @param alf + * @param toselect + * String separated list { column range, seq1...seqn sequence ids } + * @param sep + * separator between toselect fields + */ + public void selectIn(AlignFrame alf, String sequenceIds, String columns) + { + selectIn(alf, sequenceIds, columns, separator); + } + + /** + * select regions of the given alignment frame + * + * @param alf + * @param toselect + * String separated list { column range, seq1...seqn sequence ids } + * @param sep + * separator between toselect fields + */ + public void selectIn(AlignFrame alf, String sequenceIds, String columns, + String sep) + { + if (sep == null || sep.length() == 0) + { + sep = separator; + } + else + { + if (debug) + { + System.err.println("Selecting region using separator string '" + + separator + "'"); + } + } + // deparse fields + String[] ids = separatorListToArray(sequenceIds, sep); + String[] cols = separatorListToArray(columns, sep); + SequenceGroup sel = new SequenceGroup(); + ColumnSelection csel = new ColumnSelection(); + AlignmentI al = alf.viewport.getAlignment(); + jalview.analysis.SequenceIdMatcher matcher = new jalview.analysis.SequenceIdMatcher( + alf.viewport.getAlignment().getSequencesArray()); + int start = 0, end = al.getWidth(), alw = al.getWidth(); + boolean seqsfound = true; + if (ids != null && ids.length > 0) + { + seqsfound = false; + for (int i = 0; i < ids.length; i++) + { + if (ids[i].trim().length() == 0) + { + continue; + } + SequenceI sq = matcher.findIdMatch(ids[i]); + if (sq != null) + { + seqsfound = true; + sel.addSequence(sq, false); + } + } + } + boolean inseqpos = false; + if (cols != null && cols.length > 0) + { + boolean seset = false; + for (int i = 0; i < cols.length; i++) + { + String cl = cols[i].trim(); + if (cl.length() == 0) + { + continue; + } + int p; + if ((p = cl.indexOf("-")) > -1) + { + int from = -1, to = -1; + try + { + from = new Integer(cl.substring(0, p)).intValue(); + from--; + } catch (NumberFormatException ex) + { + System.err + .println("ERROR: Couldn't parse first integer in range element column selection string '" + + cl + "' - format is 'from-to'"); + return; + } + try + { + to = new Integer(cl.substring(p + 1)).intValue(); + to--; + } catch (NumberFormatException ex) + { + System.err + .println("ERROR: Couldn't parse second integer in range element column selection string '" + + cl + "' - format is 'from-to'"); + return; + } + if (from >= 0 && to >= 0) + { + // valid range + if (from < to) + { + int t = to; + to = from; + to = t; + } + if (!seset) + { + start = from; + end = to; + seset = true; + } + else + { + // comment to prevent range extension + if (start > from) + { + start = from; + } + if (end < to) + { + end = to; + } + } + for (int r = from; r <= to; r++) + { + if (r >= 0 && r < alw) + { + csel.addElement(r); + } + } + if (debug) + { + System.err.println("Range '" + cl + "' deparsed as [" + from + + "," + to + "]"); + } + } + else + { + System.err.println("ERROR: Invalid Range '" + cl + + "' deparsed as [" + from + "," + to + "]"); + } + } + else + { + int r = -1; + try + { + r = new Integer(cl).intValue(); + r--; + } catch (NumberFormatException ex) + { + if (cl.toLowerCase().equals("sequence")) + { + // we are in the dataset sequence's coordinate frame. + inseqpos = true; + } + else + { + System.err + .println("ERROR: Couldn't parse integer from point selection element of column selection string '" + + cl + "'"); + return; + } + } + if (r >= 0 && r <= alw) + { + if (!seset) + { + start = r; + end = r; + seset = true; + } + else + { + // comment to prevent range extension + if (start > r) + { + start = r; + } + if (end < r) + { + end = r; + } + } + csel.addElement(r); + if (debug) + { + System.err.println("Point selection '" + cl + + "' deparsed as [" + r + "]"); + } + } + else + { + System.err.println("ERROR: Invalid Point selection '" + cl + + "' deparsed as [" + r + "]"); + } + } + } + } + if (seqsfound) + { + // we only propagate the selection when it was the null selection, or the + // given sequences were found in the alignment. + if (inseqpos && sel.getSize() > 0) + { + // assume first sequence provides reference frame ? + SequenceI rs = sel.getSequenceAt(0); + start = rs.findIndex(start); + end = rs.findIndex(end); + if (csel != null) + { + 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())); + } + } + } + sel.setStartRes(start); + sel.setEndRes(end); + alf.select(sel, csel); + } + } + + /** * get sequences selected in current alignFrame and return their alignment in * format 'format' either with or without suffix * @@ -137,8 +467,8 @@ public class JalviewLite extends Applet */ public String getSelectedSequencesAsAlignment(String format, String suffix) { - return getSelectedSequencesAsAlignmentFrom(currentAlignFrame, format, - suffix); + return getSelectedSequencesAsAlignmentFrom(getDefaultTargetFrame(), + format, suffix); } /** @@ -175,6 +505,86 @@ public class JalviewLite extends Applet return ""; } + public String getAlignmentOrder() + { + return getAlignmentOrderFrom(getDefaultTargetFrame()); + } + + public String getAlignmentOrderFrom(AlignFrame alf) + { + return getAlignmentOrderFrom(alf, separator); + } + + public String getAlignmentOrderFrom(AlignFrame alf, String sep) + { + AlignmentI alorder = alf.getAlignViewport().getAlignment(); + String[] order = new String[alorder.getHeight()]; + for (int i = 0; i < order.length; i++) + { + order[i] = alorder.getSequenceAt(i).getName(); + } + return arrayToSeparatorList(order); + } + + public String orderBy(String order, String undoName) + { + return orderBy(order, undoName, separator); + } + + public String orderBy(String order, String undoName, String sep) + { + return orderAlignmentBy(getDefaultTargetFrame(), order, undoName, sep); + } + + public String orderAlignmentBy(AlignFrame alf, String order, + String undoName, String sep) + { + String[] ids = separatorListToArray(order, sep); + SequenceI[] sqs = null; + if (ids != null && ids.length > 0) + { + jalview.analysis.SequenceIdMatcher matcher = new jalview.analysis.SequenceIdMatcher( + alf.viewport.getAlignment().getSequencesArray()); + int s = 0; + sqs = new SequenceI[ids.length]; + for (int i = 0; i < ids.length; i++) + { + if (ids[i].trim().length() == 0) + { + continue; + } + SequenceI sq = matcher.findIdMatch(ids[i]); + if (sq != null) + { + sqs[s++] = sq; + } + } + if (s > 0) + { + SequenceI[] sqq = new SequenceI[s]; + System.arraycopy(sqs, 0, sqq, 0, s); + sqs = sqq; + } + else + { + sqs = null; + } + } + if (sqs == null) + { + return ""; + } + ; + AlignmentOrder aorder = new AlignmentOrder(sqs); + + if (undoName != null && undoName.trim().length() == 0) + { + undoName = null; + } + + return alf.sortBy(aorder, undoName) ? "true" : ""; + } + public String getAlignment(String format) { return getAlignmentFrom(getDefaultTargetFrame(), format, "true"); @@ -295,6 +705,199 @@ public class JalviewLite extends Applet return null; } + public void setMouseoverListener(String listener) + { + setMouseoverListener(currentAlignFrame, listener); + } + + private Vector javascriptListeners = new Vector(); + + public void setMouseoverListener(AlignFrame 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."); + return; + } + } + jalview.javascript.MouseOverListener mol = new jalview.javascript.MouseOverListener( + this, af, listener); + javascriptListeners.addElement(mol); + StructureSelectionManager.getStructureSelectionManager() + .addStructureViewerListener(mol); + if (debug) + { + System.err.println("Added a mouseover listener for " + + ((af == null) ? "All frames" : "Just views for " + + af.getAlignViewport().getSequenceSetId())); + System.err.println("There are now " + javascriptListeners.size() + + " listeners in total."); + } + } + + public void setSelectionListener(String listener) + { + setSelectionListener(null, listener); + } + + public void setSelectionListener(AlignFrame 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."); + return; + } + } + jalview.javascript.JsSelectionSender mol = new jalview.javascript.JsSelectionSender( + this, af, listener); + javascriptListeners.addElement(mol); + StructureSelectionManager.getStructureSelectionManager() + .addSelectionListener(mol); + if (debug) + { + System.err.println("Added a selection listener for " + + ((af == null) ? "All frames" : "Just views for " + + af.getAlignViewport().getSequenceSetId())); + System.err.println("There are now " + javascriptListeners.size() + + " listeners in total."); + } + } + + public void setStructureListener(String listener) + { + if (listener != null) + { + listener = listener.trim(); + if (listener.length() == 0) + { + System.err + .println("jalview Javascript error: Ignoring empty function for selection listener."); + return; + } + } + jalview.javascript.MouseOverStructureListener mol = new jalview.javascript.MouseOverStructureListener(this, listener); + javascriptListeners.addElement(mol); + StructureSelectionManager.getStructureSelectionManager() + .addStructureViewerListener(mol); + if (debug) + { + 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) + * + * @param af + * (may be null) + * @param listener + * (may be null) + */ + public void removeJavascriptListener(AlignFrame af, String listener) + { + if (listener != null) + { + listener = listener.trim(); + if (listener.length() == 0) + { + listener = null; + } + } + boolean rprt = false; + for (int ms = 0, msSize = javascriptListeners.size(); ms < msSize;) + { + Object lstn = javascriptListeners.elementAt(ms); + JsCallBack lstner = (JsCallBack) lstn; + if ((af == null || lstner.getAlignFrame() == af) + && (listener == null || lstner.getListenerFunction().equals( + listener))) + { + javascriptListeners.removeElement(lstner); + msSize--; + if (lstner instanceof SelectionListener) + { + StructureSelectionManager.getStructureSelectionManager() + .removeSelectionListener((SelectionListener) lstner); + } + else + { + StructureSelectionManager.getStructureSelectionManager() + .removeStructureViewerListener(lstner, null); + } + rprt = debug; + if (debug) + { + System.err.println("Removed listener '" + listener + "'"); + } + } + else + { + ms++; + } + } + if (rprt) + { + System.err.println("There are now " + javascriptListeners.size() + + " listeners in total."); + } + } + + public void stop() + { + if (javascriptListeners != null) + { + while (javascriptListeners.size() > 0) + { + Object mol = javascriptListeners.elementAt(0); + javascriptListeners.removeElement(mol); + if (mol instanceof SelectionListener) + { + StructureSelectionManager.getStructureSelectionManager() + .removeSelectionListener((SelectionListener) mol); + } + else + { + StructureSelectionManager.getStructureSelectionManager() + .removeStructureViewerListener(mol, null); + } + } + } + jalview.javascript.JSFunctionExec.stopQueue(); + } + + /** + * send a mouseover message to all the alignment windows associated with the + * given residue in the pdbfile + * + * @param pdbResNum + * @param chain + * @param pdbfile + */ + public void mouseOverStructure(String pdbResNum, String chain, String pdbfile) + { + try { + StructureSelectionManager.getStructureSelectionManager() + .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+"'"); + } + } + // ////////////////////////////////////////////// // ////////////////////////////////////////////// @@ -314,7 +917,7 @@ public class JalviewLite extends Applet * AlignFrame if the applet is started as embedded on the page and then * afterwards a new view is created. */ - public static AlignFrame currentAlignFrame = null; + public AlignFrame currentAlignFrame = null; /** * This is the first frame to be displayed, and does not change. API calls @@ -332,6 +935,13 @@ public class JalviewLite extends Applet public boolean jmolAvailable = false; + private boolean alignPdbStructures = false; + + /** + * use an external structure viewer exclusively (no jmols or MCViews will be opened by JalviewLite itself) + */ + public boolean useXtrnalSviewer=false; + public static boolean debug = false; static String builddate = null, version = null; @@ -382,12 +992,36 @@ public class JalviewLite extends Applet return version; } + // public JSObject scriptObject = null; + /** * init method for Jalview Applet */ public void init() { + // remove any handlers that might be hanging around from an earlier instance + try + { + if (debug) + { + System.err.println("Applet context is '" + + getAppletContext().getClass().toString() + "'"); + } + JSObject scriptObject = JSObject.getWindow(this); + if (debug && scriptObject != null) + { + System.err.println("Applet has Javascript callback support."); + } + } catch (Exception ex) + { + System.err + .println("Warning: No JalviewLite javascript callbacks available."); + if (debug) + { + ex.printStackTrace(); + } + } /** * turn on extra applet debugging */ @@ -403,6 +1037,11 @@ public class JalviewLite extends Applet System.err.println("Build Date : " + getBuildDate()); } + String externalsviewer = getParameter("externalstructureviewer"); + if (externalsviewer!=null) + { + useXtrnalSviewer=externalsviewer.trim().toLowerCase().equals("true"); + } /** * if true disable the check for jmol */ @@ -450,14 +1089,13 @@ public class JalviewLite extends Applet b = 255; } } - param = getParameter("label"); if (param != null) { launcher.setLabel(param); } - this.setBackground(new Color(r, g, b)); + setBackground(new Color(r, g, b)); file = getParameter("file"); @@ -477,13 +1115,13 @@ public class JalviewLite extends Applet } } - final JalviewLite applet = this; + final JalviewLite jvapplet = this; if (getParameter("embedded") != null && getParameter("embedded").equalsIgnoreCase("true")) { // Launch as embedded applet in page embedded = true; - LoadingThread loader = new LoadingThread(file, applet); + LoadingThread loader = new LoadingThread(file, jvapplet); loader.start(); } else if (file != null) @@ -497,7 +1135,7 @@ public class JalviewLite extends Applet { public void actionPerformed(ActionEvent e) { - LoadingThread loader = new LoadingThread(file, applet); + LoadingThread loader = new LoadingThread(file, jvapplet); loader.start(); } }); @@ -505,7 +1143,7 @@ public class JalviewLite extends Applet else { // Open jalviewLite immediately. - LoadingThread loader = new LoadingThread(file, applet); + LoadingThread loader = new LoadingThread(file, jvapplet); loader.start(); } } @@ -515,6 +1153,48 @@ public class JalviewLite extends Applet // still be called to open new alignments. file = "NO FILE"; fileFound = false; + // callInitCallback(); + } + } + + private void callInitCallback() + { + String initjscallback = getParameter("oninit"); + if (initjscallback == null) + { + return; + } + initjscallback = initjscallback.trim(); + if (initjscallback.length() > 0) + { + JSObject scriptObject = null; + try + { + scriptObject = JSObject.getWindow(this); + } catch (Exception ex) + { + } + ; + if (scriptObject != null) + { + try + { + // do onInit with the JS executor thread + new JSFunctionExec(this).executeJavascriptFunction(true, + initjscallback, null, "Calling oninit callback '" + + initjscallback + "'."); + } catch (Exception e) + { + System.err.println("Exception when executing _oninit callback '" + + initjscallback + "'."); + e.printStackTrace(); + } + } + else + { + System.err.println("Not executing _oninit callback '" + + initjscallback + "' - no scripting allowed."); + } } } @@ -545,10 +1225,10 @@ public class JalviewLite extends Applet if (frame instanceof AlignFrame) { ((AlignFrame) frame).closeMenuItem_actionPerformed(); - } - if (currentAlignFrame == frame) - { - currentAlignFrame = null; + if (((AlignFrame) frame).viewport.applet.currentAlignFrame == frame) + { + ((AlignFrame) frame).viewport.applet.currentAlignFrame = null; + } } lastFrameX -= 40; lastFrameY -= 40; @@ -564,7 +1244,7 @@ public class JalviewLite extends Applet { if (frame instanceof AlignFrame) { - currentAlignFrame = (AlignFrame) frame; + ((AlignFrame) frame).viewport.applet.currentAlignFrame = (AlignFrame) frame; if (debug) { System.err.println("Activated window " + frame); @@ -612,9 +1292,32 @@ public class JalviewLite extends Applet { g.setColor(Color.black); g.setFont(new Font("Arial", Font.BOLD, 24)); - g.drawString("Jalview Applet", 50, this.getSize().height / 2 - 30); - g.drawString("Loading Data...", 50, this.getSize().height / 2); + g.drawString("Jalview Applet", 50, getSize().height / 2 - 30); + g.drawString("Loading Data...", 50, getSize().height / 2); + } + } + + /** + * get all components associated with the applet of the given type + * + * @param class1 + * @return + */ + public Vector getAppletWindow(Class class1) + { + Vector wnds = new Vector(); + Component[] cmp = getComponents(); + if (cmp != null) + { + for (int i = 0; i < cmp.length; i++) + { + if (class1.isAssignableFrom(cmp[i].getClass())) + { + wnds.addElement(cmp); + } + } } + return wnds; } class LoadJmolThread extends Thread @@ -743,6 +1446,7 @@ public class JalviewLite extends Applet ; } startLoading(); + // applet.callInitCallback(); } private void startLoading() @@ -796,7 +1500,8 @@ public class JalviewLite extends Applet if (protocol == jalview.io.AppletFormatAdapter.PASTE) { - newAlignFrame.setTitle("Sequences from " + getDocumentBase()); + newAlignFrame.setTitle("Sequences from " + + applet.getDocumentBase()); } newAlignFrame.statusBar.setText("Successfully loaded file " + file); @@ -837,7 +1542,7 @@ public class JalviewLite extends Applet } } - String param = getParameter("features"); + String param = applet.getParameter("features"); if (param != null) { param = setProtocolState(param); @@ -845,14 +1550,14 @@ public class JalviewLite extends Applet newAlignFrame.parseFeaturesFile(param, protocol); } - param = getParameter("showFeatureSettings"); + param = applet.getParameter("showFeatureSettings"); if (param != null && param.equalsIgnoreCase("true")) { newAlignFrame.viewport.showSequenceFeatures(true); new FeatureSettings(newAlignFrame.alignPanel); } - param = getParameter("annotations"); + param = applet.getParameter("annotations"); if (param != null) { param = setProtocolState(param); @@ -872,7 +1577,7 @@ public class JalviewLite extends Applet } - param = getParameter("jnetfile"); + param = applet.getParameter("jnetfile"); if (param != null) { try @@ -896,7 +1601,12 @@ public class JalviewLite extends Applet ex.printStackTrace(); } } - + /* + * Undocumented for 2.6 + * - related to JAL-434 + */ + applet.setAlignPdbStructures(getDefaultParameter("alignpdbfiles", + false)); /* * @@ -907,12 +1617,19 @@ public class JalviewLite extends Applet */ 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 = getParameter("PDBFILE" + pdbFileCount); + param = applet.getParameter("PDBFILE" + pdbFileCount); else - param = getParameter("PDBFILE"); + param = applet.getParameter("PDBFILE"); if (param != null) { @@ -929,8 +1646,8 @@ public class JalviewLite extends Applet String sequence = applet.getParameter("PDBSEQ"); if (sequence != null) seqs = new SequenceI[] - { (Sequence) newAlignFrame.getAlignViewport() - .getAlignment().findName(sequence) }; + { matcher==null ? (Sequence) newAlignFrame.getAlignViewport() + .getAlignment().findName(sequence) : matcher.findIdMatch(sequence) }; } else @@ -949,8 +1666,8 @@ public class JalviewLite extends Applet tmp2.addElement(st2.nextToken()); seqstring = st2.nextToken(); } - tmp.addElement((Sequence) newAlignFrame.getAlignViewport() - .getAlignment().findName(seqstring)); + tmp.addElement(matcher==null ? (Sequence) newAlignFrame.getAlignViewport() + .getAlignment().findName(seqstring) : matcher.findIdMatch(seqstring)); } seqs = new SequenceI[tmp.size()]; @@ -999,26 +1716,50 @@ public class JalviewLite extends Applet } } - newAlignFrame.newStructureView(applet, pdb, seqs, chains, - protocol); - + if (!alignPdbStructures) + { + newAlignFrame.newStructureView(applet, pdb, seqs, chains, + protocol); + } + else + { + pdbs.addElement(new Object[] + { pdb, seqs, chains, new String(protocol) }); + } } } pdbFileCount++; } while (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); + } // /////////////////////////// // modify display of features // // hide specific groups - param = getParameter("hidefeaturegroups"); + param = applet.getParameter("hidefeaturegroups"); if (param != null) { applet.setFeatureGroupStateOn(newAlignFrame, param, false); } // show specific groups - param = getParameter("showfeaturegroups"); + param = applet.getParameter("showfeaturegroups"); if (param != null) { applet.setFeatureGroupStateOn(newAlignFrame, param, true); @@ -1027,8 +1768,8 @@ public class JalviewLite extends Applet else { fileFound = false; - remove(launcher); - repaint(); + applet.remove(launcher); + applet.repaint(); } } @@ -1064,7 +1805,7 @@ public class JalviewLite extends Applet { if (file.indexOf("://") == -1) { - file = getCodeBase() + file; + file = applet.getCodeBase() + file; if (debug) { System.err.println("Prepended codebase for resource: '" + file @@ -1081,7 +1822,7 @@ public class JalviewLite extends Applet * return null with an error message on System.err indicating the * fact. */ - protected AlignFrame getDefaultTargetFrame() + public AlignFrame getDefaultTargetFrame() { if (currentAlignFrame != null) { @@ -1099,9 +1840,9 @@ public class JalviewLite extends Applet /** * separator used for separatorList */ - protected String separator = "|"; // this is a safe(ish) separator - tabs - - // don't work for firefox + protected String separator = "" + ((char) 0x00AC); // the default used to be + // '|' but many sequence + // IDS include pipes. /** * parse the string into a list @@ -1111,8 +1852,21 @@ public class JalviewLite extends Applet */ 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("")) + if (list == null || list.equals("") || list.equals(separator)) return null; java.util.Vector jv = new Vector(); int cp = 0, pos; @@ -1123,7 +1877,11 @@ public class JalviewLite extends Applet } if (cp < list.length()) { - jv.addElement(list.substring(cp)); + String c = list.substring(cp); + if (!c.equals(separator)) + { + jv.addElement(c); + } } if (jv.size() > 0) { @@ -1160,20 +1918,31 @@ public class JalviewLite extends Applet */ 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) + if (list != null && list.length > 0) { - for (int i = 0, iSize = list.length - 1; i < iSize; i++) + for (int i = 0, iSize = list.length; i < iSize; i++) { if (list[i] != null) { + if (i > 0) + { + v.append(separator); + } v.append(list[i]); } - v.append(separator); - } - if (list[list.length - 1] != null) - { - v.append(list[list.length - 1]); } if (debug) { @@ -1188,7 +1957,7 @@ public class JalviewLite extends Applet System.err.println("Returning empty '" + separator + "' separated List\n"); } - return ""; + return "" + separator; } /** @@ -1272,11 +2041,20 @@ public class JalviewLite extends Applet * List separator string * * @param separator - * the separator to set + * the separator to set. empty string will reset separator to default */ public void setSeparator(String separator) { + if (separator == null || separator.length() < 1) + { + // reset to default + separator = "" + ((char) 0x00AC); + } this.separator = separator; + if (debug) + { + System.err.println("Default Separator now: '" + separator + "'"); + } } /** @@ -1325,6 +2103,20 @@ public class JalviewLite extends Applet return alFrame.addPdbFile(sequenceId, pdbEntryString, pdbFile); } + protected void setAlignPdbStructures(boolean alignPdbStructures) + { + this.alignPdbStructures = alignPdbStructures; + } + + public boolean isAlignPdbStructures() + { + return alignPdbStructures; + } + + public void start() + { + callInitCallback(); + } /** * bind structures in a viewer to any matching sequences in an alignFrame (use @@ -1334,21 +2126,13 @@ public class JalviewLite extends Applet * @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; - } + * 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; } */ }