Jalview 2.8 Source Header
[jalview.git] / src / jalview / javascript / JsSelectionSender.java
index d39dbe3..8e11699 100644 (file)
@@ -1,8 +1,23 @@
+/*
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8)
+ * Copyright (C) 2012 J Procter, AM Waterhouse, LM Lui, J Engelhardt, G Barton, M Clamp, S Searle
+ * 
+ * This file is part of Jalview.
+ * 
+ * Jalview is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License 
+ * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
+ *  
+ * Jalview is distributed in the hope that it will be useful, but 
+ * WITHOUT ANY WARRANTY; without even the implied warranty 
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+ * 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 <http://www.gnu.org/licenses/>.
+ */
 package jalview.javascript;
 
-import java.util.ArrayList;
-import java.util.Enumeration;
-
+import java.net.URL;
 import jalview.appletgui.AlignFrame;
 import jalview.appletgui.AlignViewport;
 import jalview.bin.JalviewLite;
@@ -11,10 +26,9 @@ import jalview.datamodel.SequenceGroup;
 import jalview.structure.SelectionSource;
 import netscape.javascript.JSObject;
 
-public class JsSelectionSender implements
+public class JsSelectionSender extends JSFunctionExec implements
         jalview.structure.SelectionListener, JsCallBack
 {
-  JalviewLite jvlite;
 
   AlignFrame _af;
 
@@ -23,7 +37,7 @@ public class JsSelectionSender implements
   public JsSelectionSender(JalviewLite jvlite, AlignFrame af,
           String listener)
   {
-    this.jvlite = jvlite;
+    super(jvlite);
     _af = af;
     _listener = listener;
   }
@@ -38,38 +52,22 @@ public class JsSelectionSender implements
       String setid = "";
       String viewid = "";
       AlignFrame src = _af;
-      // filter events if necessary
-      if (source instanceof AlignViewport)
+      if (source != null)
       {
-        if (_af != null
-                && !_af.alignPanel.av.getSequenceSetId().equals(
-                        ((AlignViewport) source).getSequenceSetId()))
-        {
-          return;
-        }
-        jalview.appletgui.AlignmentPanel[] aps = jalview.appletgui.PaintRefresher
-                .getAssociatedPanels(setid = ((AlignViewport) source)
-                        .getSequenceSetId());
-        for (int a = 0; a < aps.length; a++)
+        if (source instanceof jalview.appletgui.AlignViewport
+                && ((jalview.appletgui.AlignViewport) source).applet.currentAlignFrame.viewport == source)
         {
-          if (aps[a].av == source)
-          {
-            src = aps[a].alignFrame;
-          }
+          // should be valid if it just generated an event!
+          src = ((jalview.appletgui.AlignViewport) source).applet.currentAlignFrame;
+
         }
       }
-      else
-      {
-        // unhandled!
-        System.err.println("Unhandled selection source !");
-        return;
-      }
-      JSObject jsoWindow = JSObject.getWindow(jvlite);
       String[] seqs = new String[]
       {};
       String[] cols = new String[]
       {};
-      int strt = 0, end = src.alignPanel.av.getAlignment().getWidth();
+      int strt = 0, end = (src == null) ? -1 : src.alignPanel.av
+              .getAlignment().getWidth();
       if (seqsel != null && seqsel.getSize() > 0)
       {
         seqs = new String[seqsel.getSize()];
@@ -81,18 +79,24 @@ public class JsSelectionSender implements
         {
           strt = seqsel.getStartRes();
         }
-        if (end > seqsel.getEndRes())
+        if (end == -1 || end > seqsel.getEndRes())
         {
           end = seqsel.getEndRes();
         }
       }
       if (colsel != null && colsel.size() > 0)
       {
+        if (end == -1)
+        {
+          end = colsel.getMax() + 1;
+        }
         cols = new String[colsel.getSelected().size()];
         int d = 0, r = -1;
         for (int i = 0; i < cols.length; i++)
         {
-          cols[i] = ""+(1+((Integer)colsel.getSelected().elementAt(i)).intValue());
+          cols[i] = ""
+                  + (1 + ((Integer) colsel.getSelected().elementAt(i))
+                          .intValue());
         }
       }
       else
@@ -107,7 +111,7 @@ public class JsSelectionSender implements
 
       }
       System.err.println("Relaying selection to jsfunction:" + _listener);
-      jsoWindow.call(
+      executeJavascriptFunction(
               _listener,
               new Object[]
               { src, setid, jvlite.arrayToSeparatorList(seqs),
@@ -118,6 +122,13 @@ public class JsSelectionSender implements
               .println("Jalview Javascript exec error: Couldn't send selection message using function '"
                       + _listener + "'");
       ex.printStackTrace();
+      if (ex instanceof netscape.javascript.JSException)
+      {
+        System.err.println("Javascript Exception: "
+                + ((netscape.javascript.JSException) ex).getCause()
+                        .toString());
+      }
+
     }
   }