X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fjalview%2Fbin%2FJalviewLite.java;h=0fb06629bedb7ce9253fc4f6d9b3fdf062775cfc;hb=06193991d7a4717f15e495ea7bfaa2e7f5d01bde;hp=7ae85dc145b29af8933f9ebfa3479ab14c411368;hpb=c4fedcd1b3eb15c2036447cd8676f2bf2485805d;p=jalview.git diff --git a/src/jalview/bin/JalviewLite.java b/src/jalview/bin/JalviewLite.java index 7ae85dc..0fb0662 100755 --- a/src/jalview/bin/JalviewLite.java +++ b/src/jalview/bin/JalviewLite.java @@ -1,32 +1,58 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer (Development Version 2.4.1) - * Copyright (C) 2009 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle + * Jalview - A Sequence Alignment Editor and Viewer (Version 2.6) + * Copyright (C) 2010 J Procter, AM Waterhouse, G Barton, M Clamp, S Searle * - * This program 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 2 - * of the License, or (at your option) any later version. + * This file is part of Jalview. * - * This program 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 PURPOSE. See the - * GNU General Public License for more details. + * 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. * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * 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 + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with Jalview. If not, see . */ package jalview.bin; -import java.applet.*; - -import java.awt.*; -import java.awt.event.*; -import java.util.*; - -import jalview.appletgui.*; -import jalview.datamodel.*; -import jalview.io.*; +import jalview.appletgui.AlignFrame; +import jalview.appletgui.EmbmenuFrame; +import jalview.appletgui.FeatureSettings; +import jalview.datamodel.Alignment; +import jalview.datamodel.AlignmentI; +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; +import java.awt.event.ActionEvent; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.util.StringTokenizer; +import java.util.Vector; + +import netscape.javascript.JSObject; /** * Jalview Applet. Runs in Java 1.18 runtime @@ -41,7 +67,7 @@ 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() @@ -51,9 +77,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) + * separator string or null for default + * @return String list of selected sequence IDs, each terminated by given separator string */ public String getSelectedSequences(String sep) { @@ -62,22 +87,22 @@ public class JalviewLite extends Applet /** * @param alf - * alignframe containing selection - * @return String list of selected sequence IDs, each terminated by "¬" + * alignframe containing selection + * @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); } /** * get list of selected sequence IDs separated by given separator * * @param alf - * window containing selection + * 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 */ @@ -86,7 +111,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) { @@ -104,21 +129,302 @@ 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 + SequenceI sq = alf.getAlignViewport().getAlignment() + .findName(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(); + int start = 0, end = al.getWidth(), alw = al.getWidth(); + if (ids != null && ids.length > 0) + { + for (int i = 0; i < ids.length; i++) + { + if (ids[i].trim().length() == 0) + { + continue; + } + SequenceI sq = al.findName(ids[i]); + if (sq != null) + { + sel.addSequence(sq, 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) + { + 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 + "]"); + } + } + } + } + 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 * - * @param alf - - * where selection is - * @param format - - * format of alignment file - * @param suffix - - * "true" to append /start-end string to each sequence ID + * @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 */ public String getSelectedSequencesAsAlignment(String format, String suffix) { - return getSelectedSequencesAsAlignmentFrom(currentAlignFrame, format, + return getSelectedSequencesAsAlignmentFrom(getDefaultTargetFrame(), format, suffix); } @@ -126,12 +432,12 @@ public class JalviewLite extends Applet * 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 + * @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 */ @@ -250,15 +556,15 @@ public class JalviewLite extends Applet /** * * @param text - * alignment file as a string + * alignment file as a string * @param title - * window title + * window title * @return null or new alignment frame */ public AlignFrame loadAlignment(String text, String title) { Alignment al = null; - + String format = new IdentifyFile().Identify(text, AppletFormatAdapter.PASTE); try @@ -276,12 +582,173 @@ public class JalviewLite extends Applet return null; } + public void setMouseoverListener(String listener) + { + setMouseoverListener(currentAlignFrame, listener); + } + + private Vector mouseoverListeners = 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); + mouseoverListeners.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 " + mouseoverListeners.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); + mouseoverListeners.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 " + mouseoverListeners.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 = mouseoverListeners.size(); ms < msSize;) + { + Object lstn = mouseoverListeners.elementAt(ms); + JsCallBack lstner = (JsCallBack) lstn; + if ((af == null || lstner.getAlignFrame() == af) + && (listener == null || lstner.getListenerFunction().equals( + listener))) + { + mouseoverListeners.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 " + mouseoverListeners.size() + + " listeners in total."); + } + } + + public void stop() + { + if (mouseoverListeners != null) + { + while (mouseoverListeners.size() > 0) + { + Object mol = mouseoverListeners.elementAt(0); + mouseoverListeners.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(int pdbResNum, String chain, String pdbfile) + { + StructureSelectionManager.getStructureSelectionManager() + .mouseOverStructure(pdbResNum, chain, pdbfile); + } + // ////////////////////////////////////////////// // ////////////////////////////////////////////// - static int lastFrameX = 200; + public static int lastFrameX = 200; - static int lastFrameY = 200; + public static int lastFrameY = 200; boolean fileFound = true; @@ -295,29 +762,105 @@ 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 * will default to this instance if currentAlignFrame is null. */ - AlignFrame initialAlignFrame=null; + AlignFrame initialAlignFrame = null; boolean embedded = false; private boolean checkForJmol = true; - private boolean checkedForJmol = false; // ensure we don't check for jmol every time the app is re-inited + + private boolean checkedForJmol = false; // ensure we don't check for jmol + + // every time the app is re-inited public boolean jmolAvailable = false; - public static boolean debug=false; + private boolean alignPdbStructures = false; + + public static boolean debug = false; + + static String builddate = null, version = null; + + private static void initBuildDetails() + { + if (builddate == null) + { + builddate = "unknown"; + version = "test"; + java.net.URL url = JalviewLite.class + .getResource("/.build_properties"); + if (url != null) + { + try + { + BufferedReader reader = new BufferedReader(new InputStreamReader( + url.openStream())); + String line; + while ((line = reader.readLine()) != null) + { + if (line.indexOf("VERSION") > -1) + { + version = line.substring(line.indexOf("=") + 1); + } + if (line.indexOf("BUILD_DATE") > -1) + { + builddate = line.substring(line.indexOf("=") + 1); + } + } + } catch (Exception ex) + { + ex.printStackTrace(); + } + } + } + } + + public static String getBuildDate() + { + initBuildDetails(); + return builddate; + } + + public static String getVersion() + { + initBuildDetails(); + 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 */ @@ -326,6 +869,13 @@ public class JalviewLite extends Applet { debug = dbg.toLowerCase().equals("true"); } + if (debug) + { + + System.err.println("JalviewLite Version " + getVersion()); + System.err.println("Build Date : " + getBuildDate()); + + } /** * if true disable the check for jmol */ @@ -373,15 +923,14 @@ 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"); if (file == null) @@ -400,19 +949,20 @@ 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) { if (getParameter("showbutton") == null - || !getParameter("showbutton").equalsIgnoreCase("false")) + || !getParameter("showbutton").equalsIgnoreCase( + "false")) { // Add the JalviewLite 'Button' to the page add(launcher); @@ -420,7 +970,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(); } }); @@ -428,7 +978,7 @@ public class JalviewLite extends Applet else { // Open jalviewLite immediately. - LoadingThread loader = new LoadingThread(file, applet); + LoadingThread loader = new LoadingThread(file, jvapplet); loader.start(); } } @@ -438,6 +988,44 @@ 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."); + } } } @@ -445,13 +1033,13 @@ public class JalviewLite extends Applet * Initialises and displays a new java.awt.Frame * * @param frame - * java.awt.Frame to be displayed + * java.awt.Frame to be displayed * @param title - * title of new frame + * title of new frame * @param width - * width if new frame + * width if new frame * @param height - * height of new frame + * height of new frame */ public static void addFrame(final Frame frame, String title, int width, int height) @@ -468,10 +1056,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; @@ -487,7 +1075,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); @@ -499,7 +1087,9 @@ public class JalviewLite extends Applet /* * Probably not necessary to do this - see TODO above. (non-Javadoc) * - * @see java.awt.event.WindowAdapter#windowDeactivated(java.awt.event.WindowEvent) + * @see + * java.awt.event.WindowAdapter#windowDeactivated(java.awt.event.WindowEvent + * ) * * public void windowDeactivated(WindowEvent e) { if (currentAlignFrame == * frame) { currentAlignFrame = null; if (debug) { @@ -516,7 +1106,7 @@ public class JalviewLite extends Applet * If file given in parameter not found, displays error message * * @param g - * graphics context + * graphics context */ public void paint(Graphics g) { @@ -533,21 +1123,44 @@ 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 { - private boolean running=false; + private boolean running = false; public void run() { - if (running || checkedForJmol) { + if (running || checkedForJmol) + { return; } - running=true; + running = true; if (checkForJmol) { try @@ -575,8 +1188,8 @@ public class JalviewLite extends Applet .println("Skipping Jmol check. Will use MCView (probably)"); } } - checkedForJmol=true; - running=false; + checkedForJmol = true; + running = false; } public boolean notFinished() @@ -601,8 +1214,11 @@ public class JalviewLite extends Applet * State variable: format of file source */ String format; + String _file; + JalviewLite applet; + private void dbgMsg(String msg) { if (applet.debug) @@ -637,10 +1253,10 @@ public class JalviewLite extends Applet dbgMsg("Protocol identified as '" + protocol + "'"); return file; } - + public LoadingThread(String _file, JalviewLite _applet) { - this._file=_file; + this._file = _file; applet = _applet; } @@ -651,9 +1267,16 @@ public class JalviewLite extends Applet while (jmolchecker.notFinished()) { // wait around until the Jmol check is complete. - try { Thread.sleep(2); } catch (Exception e) {}; + try + { + Thread.sleep(2); + } catch (Exception e) + { + } + ; } startLoading(); + // applet.callInitCallback(); } private void startLoading() @@ -673,18 +1296,23 @@ public class JalviewLite extends Applet { dbgMsg("File load exception."); ex.printStackTrace(); - if (debug) { - try { + if (debug) + { + try + { FileParse fp = new FileParse(file, protocol); String ln = null; - dbgMsg(">>>Dumping contents of '"+file+"' "+"("+protocol+")"); - while ((ln=fp.nextLine())!=null) { + dbgMsg(">>>Dumping contents of '" + file + "' " + "(" + + protocol + ")"); + while ((ln = fp.nextLine()) != null) + { dbgMsg(ln); } 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(); } } @@ -693,7 +1321,7 @@ public class JalviewLite extends Applet { dbgMsg("Successfully loaded file."); newAlignFrame = new AlignFrame(al, applet, file, embedded); - if (initialAlignFrame==null) + if (initialAlignFrame == null) { initialAlignFrame = newAlignFrame; } @@ -702,11 +1330,11 @@ 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); + newAlignFrame.statusBar.setText("Successfully loaded file " + file); String treeFile = applet.getParameter("tree"); if (treeFile == null) @@ -744,7 +1372,7 @@ public class JalviewLite extends Applet } } - String param = getParameter("features"); + String param = applet.getParameter("features"); if (param != null) { param = setProtocolState(param); @@ -752,21 +1380,20 @@ 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); if (new AnnotationFile().readAnnotationFile( - newAlignFrame.viewport.getAlignment(), param, - protocol)) + newAlignFrame.viewport.getAlignment(), param, protocol)) { newAlignFrame.alignPanel.fontChanged(); newAlignFrame.alignPanel.setScrollValues(0, 0); @@ -780,7 +1407,7 @@ public class JalviewLite extends Applet } - param = getParameter("jnetfile"); + param = applet.getParameter("jnetfile"); if (param != null) { try @@ -804,7 +1431,12 @@ public class JalviewLite extends Applet ex.printStackTrace(); } } - + /* + * Undocumented for 2.6 + * - related to JAL-434 + */ + applet.setAlignPdbStructures(getDefaultParameter("alignpdbfiles", + false)); /* * @@ -815,12 +1447,15 @@ 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(); do { if (pdbFileCount > 0) - param = getParameter("PDBFILE" + pdbFileCount); + param = applet.getParameter("PDBFILE" + pdbFileCount); else - param = getParameter("PDBFILE"); + param = applet.getParameter("PDBFILE"); if (param != null) { @@ -857,9 +1492,8 @@ public class JalviewLite extends Applet tmp2.addElement(st2.nextToken()); seqstring = st2.nextToken(); } - tmp.addElement((Sequence) newAlignFrame - .getAlignViewport().getAlignment().findName( - seqstring)); + tmp.addElement((Sequence) newAlignFrame.getAlignViewport() + .getAlignment().findName(seqstring)); } seqs = new SequenceI[tmp.size()]; @@ -882,7 +1516,7 @@ public class JalviewLite extends Applet // the local pdb file was identified in the class loader protocol = AppletFormatAdapter.URL; // this is probably NOT // CORRECT! - param = addProtocol(param); // + param = addProtocol(param); // } pdb.setFile(param); @@ -908,43 +1542,60 @@ public class JalviewLite extends Applet } } - if (jmolAvailable) + if (!alignPdbStructures) { - new jalview.appletgui.AppletJmol(pdb, seqs, chains, - newAlignFrame.alignPanel, protocol); - lastFrameX += 40; - lastFrameY += 40; + newAlignFrame.newStructureView(applet, pdb, seqs, chains, + protocol); } else - new MCview.AppletPDBViewer(pdb, seqs, chains, - newAlignFrame.alignPanel, protocol); + { + 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); + applet.setFeatureGroupStateOn(newAlignFrame, param, false); } // show specific groups - param = getParameter("showfeaturegroups"); + param = applet.getParameter("showfeaturegroups"); if (param != null) { - applet.setFeatureGroupStateOn(newAlignFrame,param, true); + applet.setFeatureGroupStateOn(newAlignFrame, param, true); } } else { fileFound = false; - remove(launcher); - repaint(); + applet.remove(launcher); + applet.repaint(); } } @@ -952,7 +1603,7 @@ public class JalviewLite extends Applet * Discovers whether the given file is in the Applet Archive * * @param file - * String + * String * @return boolean */ boolean inArchive(String file) @@ -980,7 +1631,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 @@ -997,7 +1648,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) { @@ -1015,10 +1666,8 @@ 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 * @@ -1027,8 +1676,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; @@ -1039,7 +1701,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) { @@ -1076,20 +1742,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) { @@ -1104,7 +1781,7 @@ public class JalviewLite extends Applet System.err.println("Returning empty '" + separator + "' separated List\n"); } - return ""; + return "" + separator; } /** @@ -1120,7 +1797,7 @@ public class JalviewLite extends Applet /** * @param alf - * alignframe to get feature groups on + * alignframe to get feature groups on * @return * @see jalview.appletgui.AlignFrame#getFeatureGroups() */ @@ -1143,7 +1820,7 @@ public class JalviewLite extends Applet /** * @param alf - * align frame to get groups of state visible + * align frame to get groups of state visible * @param visible * @return * @see jalview.appletgui.AlignFrame#getFeatureGroupsOfState(boolean) @@ -1155,9 +1832,9 @@ public class JalviewLite extends Applet /** * @param groups - * tab separated list of group names + * tab separated list of group names * @param state - * true or false + * true or false * @see jalview.appletgui.AlignFrame#setFeatureGroupState(java.lang.String[], * boolean) */ @@ -1188,10 +1865,98 @@ 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+"'"); + } } + + /** + * get boolean value of applet parameter 'name' and return default if + * parameter is not set + * + * @param name + * name of paremeter + * @param def + * the value to return otherwise + * @return true or false + */ + public boolean getDefaultParameter(String name, boolean def) + { + String stn; + if ((stn = getParameter(name)) == null) + { + return def; + } + if (stn.toLowerCase().equals("true")) + { + return true; + } + return false; + } + + /** + * bind a pdb file to a sequence in the given alignFrame. + * + * @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. + */ + public boolean addPdbFile(AlignFrame alFrame, String sequenceId, + String pdbEntryString, String pdbFile) + { + 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 + * 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; } + */ }