revised default separator string expression to avoid utf8 warnings. Regularised new...
authorjprocter <Jim Procter>
Mon, 17 Jan 2011 14:28:35 +0000 (14:28 +0000)
committerjprocter <Jim Procter>
Mon, 17 Jan 2011 14:28:35 +0000 (14:28 +0000)
src/jalview/bin/JalviewLite.java

index 378376b..0091e3f 100755 (executable)
@@ -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
    *         (&#172;)
    */
   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();ms<msSize;)
+    for (int ms = 0, msSize = mouseoverListeners.size(); ms < msSize;)
     {
       Object lstn = mouseoverListeners.elementAt(ms);
       JsCallBack lstner = (JsCallBack) lstn;
@@ -663,7 +693,9 @@ public class JalviewLite extends Applet
         {
           System.err.println("Removed listener '" + listener + "'");
         }
-      } else {
+      }
+      else
+      {
         ms++;
       }
     }
@@ -676,21 +708,27 @@ public class JalviewLite extends Applet
 
   public void stop()
   {
-    if (mouseoverListeners!=null) 
+    if (mouseoverListeners != null)
     {
-      while (mouseoverListeners.size()>0)
+      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();
   }
 
   /**