From d8c1791deeffce22065ff48d4d1af4a093ec7207 Mon Sep 17 00:00:00 2001 From: jprocter Date: Mon, 17 Jan 2011 14:28:35 +0000 Subject: [PATCH] revised default separator string expression to avoid utf8 warnings. Regularised new api methods (select, selectIn(alignFrame..), ). improved separatorList routines and added onInit javascript callback. --- src/jalview/bin/JalviewLite.java | 312 +++++++++++++++++++++++++------------- 1 file changed, 208 insertions(+), 104 deletions(-) diff --git a/src/jalview/bin/JalviewLite.java b/src/jalview/bin/JalviewLite.java index 378376b..0091e3f 100755 --- a/src/jalview/bin/JalviewLite.java +++ b/src/jalview/bin/JalviewLite.java @@ -32,6 +32,7 @@ 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; @@ -51,6 +52,8 @@ import java.io.InputStreamReader; import java.util.StringTokenizer; import java.util.Vector; +import netscape.javascript.JSObject; + /** * Jalview Applet. Runs in Java 1.18 runtime * @@ -64,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() @@ -75,8 +78,7 @@ 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) { @@ -86,12 +88,12 @@ 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); } /** @@ -100,7 +102,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 */ @@ -109,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) { @@ -128,27 +130,41 @@ 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 + * @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) + public void highlight(String sequenceId, String position, + String alignedPosition) { - highlight(currentAlignFrame, sequenceId, position, 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 + * @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 highlight(AlignFrame alf, String sequenceId, String position, String alignedPosition) + public void highlightIn(AlignFrame alf, String sequenceId, String position, + String alignedPosition) { - SequenceI sq = alf.getAlignViewport().getAlignment().findName(sequenceId); - if (sq!=null) + // 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 { + int pos, apos = -1; + try + { apos = new Integer(position).intValue(); apos--; } catch (NumberFormatException ex) @@ -156,25 +172,34 @@ public class JalviewLite extends Applet return; } // use vamsas listener to broadcast to all listeners in scope - if (alignedPosition!=null && (alignedPosition.trim().length()==0 || alignedPosition.toLowerCase().indexOf("false")>-1)) + if (alignedPosition != null + && (alignedPosition.trim().length() == 0 || alignedPosition + .toLowerCase().indexOf("false") > -1)) { - StructureSelectionManager.getStructureSelectionManager().mouseOverVamsasSequence(sq,sq.findIndex(apos)); - } else { - StructureSelectionManager.getStructureSelectionManager().mouseOverVamsasSequence(sq,apos); + StructureSelectionManager.getStructureSelectionManager() + .mouseOverVamsasSequence(sq, sq.findIndex(apos)); } - + else + { + StructureSelectionManager.getStructureSelectionManager() + .mouseOverVamsasSequence(sq, apos); + } + } } + /** * 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 + * @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) { - select(currentAlignFrame, sequenceIds, columns, "¬"); + selectIn(getDefaultTargetFrame(), sequenceIds, columns, separator); } /** @@ -187,7 +212,7 @@ public class JalviewLite extends Applet */ public void select(String sequenceIds, String columns, String sep) { - select(currentAlignFrame, sequenceIds, columns, sep); + selectIn(getDefaultTargetFrame(), sequenceIds, columns, sep); } /** @@ -199,9 +224,9 @@ public class JalviewLite extends Applet * @param sep * separator between toselect fields */ - public void select(AlignFrame alf, String sequenceIds, String columns) + public void selectIn(AlignFrame alf, String sequenceIds, String columns) { - select(alf, sequenceIds, columns, separator); + selectIn(alf, sequenceIds, columns, separator); } /** @@ -213,12 +238,17 @@ public class JalviewLite extends Applet * @param sep * separator between toselect fields */ - public void select(AlignFrame alf, String sequenceIds, String columns, + 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); @@ -394,7 +424,7 @@ public class JalviewLite extends Applet */ public String getSelectedSequencesAsAlignment(String format, String suffix) { - return getSelectedSequencesAsAlignmentFrom(currentAlignFrame, format, + return getSelectedSequencesAsAlignmentFrom(getDefaultTargetFrame(), format, suffix); } @@ -638,7 +668,7 @@ public class JalviewLite extends Applet } } boolean rprt = false; - for (int ms=0,msSize=mouseoverListeners.size();ms0) + while (mouseoverListeners.size() > 0) { - Object mol = mouseoverListeners.elementAt(0); + Object mol = mouseoverListeners.elementAt(0); mouseoverListeners.removeElement(mol); if (mol instanceof SelectionListener) { - StructureSelectionManager.getStructureSelectionManager().removeSelectionListener((SelectionListener)mol); - } else { - StructureSelectionManager.getStructureSelectionManager().removeStructureViewerListener(mol, null); + 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 @@ -724,7 +762,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 @@ -794,13 +832,25 @@ 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 + { + JSObject scriptObject = JSObject.getWindow(this); + } catch (Exception ex) + { + if (debug) + { + System.err + .println("Warning: No JalviewLite javascript callbacks available."); + } + } /** * turn on extra applet debugging */ @@ -863,15 +913,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) @@ -890,19 +939,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); @@ -910,7 +960,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(); } }); @@ -918,7 +968,7 @@ public class JalviewLite extends Applet else { // Open jalviewLite immediately. - LoadingThread loader = new LoadingThread(file, applet); + LoadingThread loader = new LoadingThread(file, jvapplet); loader.start(); } } @@ -928,6 +978,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."); + } } } @@ -958,10 +1046,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; @@ -977,7 +1065,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); @@ -1025,10 +1113,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 { @@ -1156,6 +1266,7 @@ public class JalviewLite extends Applet ; } startLoading(); + // applet.callInitCallback(); } private void startLoading() @@ -1209,7 +1320,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); @@ -1250,7 +1362,7 @@ public class JalviewLite extends Applet } } - String param = getParameter("features"); + String param = applet.getParameter("features"); if (param != null) { param = setProtocolState(param); @@ -1258,14 +1370,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); @@ -1285,7 +1397,7 @@ public class JalviewLite extends Applet } - param = getParameter("jnetfile"); + param = applet.getParameter("jnetfile"); if (param != null) { try @@ -1331,9 +1443,9 @@ public class JalviewLite extends Applet do { if (pdbFileCount > 0) - param = getParameter("PDBFILE" + pdbFileCount); + param = applet.getParameter("PDBFILE" + pdbFileCount); else - param = getParameter("PDBFILE"); + param = applet.getParameter("PDBFILE"); if (param != null) { @@ -1457,13 +1569,13 @@ public class JalviewLite extends Applet // 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); @@ -1472,8 +1584,8 @@ public class JalviewLite extends Applet else { fileFound = false; - remove(launcher); - repaint(); + applet.remove(launcher); + applet.repaint(); } } @@ -1509,7 +1621,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 @@ -1526,7 +1638,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) { @@ -1544,10 +1656,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 * @@ -1581,7 +1691,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) { @@ -1633,17 +1747,16 @@ public class JalviewLite extends Applet StringBuffer v = new StringBuffer(); 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) { @@ -1742,11 +1855,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+"'"); + } } /** @@ -1805,27 +1927,9 @@ public class JalviewLite extends Applet return alignPdbStructures; } - /** - * get all components associated with the applet of the given type - * - * @param class1 - * @return - */ - public Vector getAppletWindow(Class class1) + public void start() { - 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; + callInitCallback(); } /** -- 1.7.10.2