refactor to allow distinct StructureSelectionManager instances for
[jalview.git] / src / jalview / javascript / MouseOverStructureListener.java
index 37d2559..c1d3a40 100644 (file)
-package jalview.javascript;
-
-import java.awt.Color;
-
-import jalview.appletgui.AlignFrame;
-import jalview.bin.JalviewLite;
-import jalview.structure.StructureListener;
-import jalview.structure.StructureSelectionManager;
-
-public class MouseOverStructureListener extends JSFunctionExec implements
-        JsCallBack, StructureListener
-{
-
-  String _listenerfn;
-  public MouseOverStructureListener(JalviewLite applet, String listenerCb)
-  {
-    super(applet);
-    _listenerfn = listenerCb;
-    
-  }
-  @Override
-  public String[] getPdbFile()
-  {
-    // TODO Auto-generated method stub
-    return null;
-  }
-
-  @Override
-  public void mouseOverStructure(int atomIndex, String strInfo)
-  {
-    
-    // StructureSelectionManager.getStructureSelectionManager().mouseOverStructure(atomIndex, chain, pdbfile)
-    // TODO Auto-generated method stub
-
-  }
-
-  @Override
-  public void highlightAtom(int atomIndex, int pdbResNum, String chain,
-          String pdbId)
-  {
-    String[] st=new String[0];
-    try {
-      executeJavascriptFunction(_listenerfn, st = new String[] { "mouseover",""+pdbId, ""+chain, ""+(pdbResNum), ""+atomIndex});
-    } catch (Exception ex)
-    {
-      System.err.println("Couldn't execute callback with "+_listenerfn+" using args { "+st[0]+", "+st[1]+", "+st[2]+","+st[3]+"\n");
-      ex.printStackTrace();
-      
-    }
-
-  }
-
-  @Override
-  public void updateColours(Object source)
-  {
-    // TODO Auto-generated method stub
-
-  }
-
-  @Override
-  public Color getColour(int atomIndex, int pdbResNum, String chain,
-          String pdbId)
-  {
-    return null;
-  }
-
-  @Override
-  public AlignFrame getAlignFrame()
-  {
-    // associated with all alignframes, always.
-    return null;
-  }
-
-  @Override
-  public String getListenerFunction()
-  {
-    return _listenerfn;
-  }
-  @Override
-  public void releaseReferences(Object svl)
-  {
-    // TODO Auto-generated method stub
-    
-  }
-
-}
+package jalview.javascript;\r
+\r
+import java.awt.Color;\r
+import jalview.api.AlignmentViewPanel;\r
+import jalview.api.FeatureRenderer;\r
+import jalview.api.SequenceRenderer;\r
+import jalview.appletgui.AlignFrame;\r
+import jalview.bin.JalviewLite;\r
+import jalview.datamodel.SequenceI;\r
+import jalview.ext.jmol.JmolCommands;\r
+import jalview.structure.StructureListener;\r
+import jalview.structure.StructureMapping;\r
+import jalview.structure.StructureSelectionManager;\r
+\r
+public class MouseOverStructureListener extends JSFunctionExec implements\r
+        JsCallBack, StructureListener\r
+{\r
+\r
+  String _listenerfn;\r
+\r
+  String[] modelSet;\r
+\r
+  public MouseOverStructureListener(JalviewLite jalviewLite,\r
+          String listener, String[] modelList)\r
+  {\r
+    super(jalviewLite);\r
+    _listenerfn = listener;\r
+    modelSet = modelList;\r
+    if (modelSet != null)\r
+    {\r
+      for (int i = 0; i < modelSet.length; i++)\r
+      {\r
+        // resolve a real filename\r
+        try\r
+        {\r
+          if (new java.net.URL(modelSet[i]).openConnection() != null)\r
+          {\r
+            continue;\r
+          }\r
+        } catch (Exception x)\r
+        {\r
+        }\r
+        ;\r
+        try\r
+        {\r
+          String db = jvlite.getDocumentBase().toString();\r
+          db = db.substring(0, db.lastIndexOf("/"));\r
+          if (new java.net.URL(db + "/" + modelSet[i]).openConnection() != null)\r
+          {\r
+            modelSet[i] = db + "/" + modelSet[i];\r
+            continue;\r
+          }\r
+        } catch (Exception x)\r
+        {\r
+        }\r
+        ;\r
+        try\r
+        {\r
+          if (new java.net.URL(jvlite.getCodeBase() + modelSet[i])\r
+                  .openConnection() != null)\r
+          {\r
+            modelSet[i] = jvlite.getCodeBase() + modelSet[i];\r
+            continue;\r
+          }\r
+        } catch (Exception x)\r
+        {\r
+        }\r
+        ;\r
+\r
+      }\r
+    }\r
+  }\r
+\r
+  @Override\r
+  public String[] getPdbFile()\r
+  {\r
+    return modelSet;\r
+  }\r
+\r
+  @Override\r
+  public void mouseOverStructure(int atomIndex, String strInfo)\r
+  {\r
+\r
+    // StructureSelectionManager.getStructureSelectionManager().mouseOverStructure(atomIndex,\r
+    // chain, pdbfile)\r
+    // TODO Auto-generated method stub\r
+\r
+  }\r
+\r
+  @Override\r
+  public void highlightAtom(int atomIndex, int pdbResNum, String chain,\r
+          String pdbId)\r
+  {\r
+    String[] st = new String[0];\r
+    try\r
+    {\r
+      executeJavascriptFunction(_listenerfn, st = new String[]\r
+      { "mouseover", "" + pdbId, "" + chain, "" + (pdbResNum),\r
+          "" + atomIndex });\r
+    } catch (Exception ex)\r
+    {\r
+      System.err.println("Couldn't execute callback with " + _listenerfn\r
+              + " using args { " + st[0] + ", " + st[1] + ", " + st[2]\r
+              + "," + st[3] + "\n");\r
+      ex.printStackTrace();\r
+\r
+    }\r
+\r
+  }\r
+\r
+  @Override\r
+ public synchronized void updateColours(Object srce)\r
+  {\r
+    final Object source = srce;\r
+    StructureSelectionManager ssm = StructureSelectionManager\r
+            .getStructureSelectionManager(jvlite);\r
+    // if (jvlite.debug)\r
+    // {\r
+    // ssm.reportMapping();\r
+    // }\r
+    if (source instanceof jalview.api.AlignmentViewPanel)\r
+    {\r
+      SequenceI[][] sequence = new SequenceI[modelSet.length][];\r
+      for (int m = 0; m < modelSet.length; m++)\r
+      {\r
+        StructureMapping[] sm = ssm.getMapping(modelSet[m]);\r
+        if (sm != null && sm.length > 0)\r
+        {\r
+          sequence[m] = new SequenceI[sm.length];\r
+          for (int i = 0; i < sm.length; i++)\r
+          {\r
+            sequence[m][i] = sm[i].getSequence();\r
+          }\r
+        }\r
+        else\r
+        {\r
+          sequence[m] = new SequenceI[0];\r
+        }\r
+        // if (jvlite.debug)\r
+        // {\r
+        // System.err.println("Mapped '" + modelSet[m] + "' to "\r
+        // + sequence[m].length + " sequences.");\r
+        // }\r
+      }\r
+\r
+      SequenceRenderer sr = ((jalview.appletgui.AlignmentPanel) source)\r
+              .getSequenceRenderer();\r
+      FeatureRenderer fr = ((jalview.appletgui.AlignmentPanel) source).av\r
+              .getShowSequenceFeatures() ? new jalview.appletgui.FeatureRenderer(\r
+              ((jalview.appletgui.AlignmentPanel) source).av) : null;\r
+      if (fr != null)\r
+      {\r
+        ((jalview.appletgui.FeatureRenderer) fr)\r
+                .transferSettings(((jalview.appletgui.AlignmentPanel) source)\r
+                        .getFeatureRenderer());\r
+      }\r
+      ;\r
+\r
+      // Form a colour command for the given alignment panel\r
+      final String[] colcommands = JmolCommands.getColourBySequenceCommand(\r
+              ssm, modelSet, sequence, sr, fr,\r
+              ((AlignmentViewPanel) source).getAlignment());\r
+      if (colcommands==null)\r
+      {\r
+        // \r
+        return;\r
+      }\r
+      String mclass,mhandle;\r
+      if (jvlite.isJsMessageSetChanged(mclass="colourstruct",mhandle=((jalview.appletgui.AlignmentPanel) source).av\r
+              .getViewId(), colcommands)) {\r
+      jvlite.setJsMessageSet(mclass, mhandle , colcommands);\r
+      // and notify javascript handler\r
+      String st[] = new String[]\r
+                                                  {\r
+              "colourstruct",\r
+              ""\r
+                      + ((jalview.appletgui.AlignmentPanel) source).av\r
+                              .getViewId(), ""+colcommands.length, ""+(colcommands[0]!=null ? colcommands[0].length() : 0)};\r
+      try\r
+      {\r
+        executeJavascriptFunction(\r
+                true,\r
+                _listenerfn,st\r
+);\r
+      } catch (Exception ex)\r
+      {\r
+        System.err.println("Couldn't execute callback with "\r
+                + _listenerfn + " using args { " + st[0] + ", "\r
+                + st[1] + ", " + st[2] + "," + st[3] + "\n");\r
+        ex.printStackTrace();\r
+\r
+      }\r
+      }\r
+/*      new Thread(new Runnable()\r
+      {\r
+        public void run()\r
+        {\r
+          // and send to javascript handler\r
+          String st[] = new String[0];\r
+          int i = 0;\r
+          for (String colcommand : colcommands)\r
+          {\r
+            // do sync execution for each chunk\r
+            try\r
+            {\r
+              executeJavascriptFunction(\r
+                      false,\r
+                      _listenerfn,\r
+                      st = new String[]\r
+                      {\r
+                          "colourstruct",\r
+                          ""\r
+                                  + ((jalview.appletgui.AlignmentPanel) source).av\r
+                                          .getViewId(), handle, "" });\r
+            } catch (Exception ex)\r
+            {\r
+              System.err.println("Couldn't execute callback with "\r
+                      + _listenerfn + " using args { " + st[0] + ", "\r
+                      + st[1] + ", " + st[2] + "," + st[3] + "\n");\r
+              ex.printStackTrace();\r
+\r
+            }\r
+          }\r
+        }\r
+      }).start();\r
+  */\r
+    }\r
+\r
+  }\r
+\r
+  @Override\r
+  public Color getColour(int atomIndex, int pdbResNum, String chain,\r
+          String pdbId)\r
+  {\r
+    return null;\r
+  }\r
+\r
+  @Override\r
+  public AlignFrame getAlignFrame()\r
+  {\r
+    // associated with all alignframes, always.\r
+    return null;\r
+  }\r
+\r
+  @Override\r
+  public String getListenerFunction()\r
+  {\r
+    return _listenerfn;\r
+  }\r
+\r
+  public void finalise()\r
+  {\r
+    jvlite=null;\r
+    super.finalize();\r
+  }\r
+  @Override\r
+  public void releaseReferences(Object svl)\r
+  {\r
+    \r
+    // TODO Auto-generated method stub\r
+\r
+  }\r
+\r
+}\r