JAL-1807 still testing
[jalviewjs.git] / unused / appletgui / IdPanel.java
index c4b9651..9292749 100644 (file)
-/*
- * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
- * Copyright (C) $$Year-Rel$$ The Jalview Authors
- * 
- * 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/>.
- * The Jalview Authors are detailed in the 'AUTHORS' file.
- */
-package jalview.appletgui;
-
-import jalview.datamodel.Sequence;
-import jalview.datamodel.SequenceFeature;
-import jalview.datamodel.SequenceGroup;
-import jalview.datamodel.SequenceI;
-import jalview.util.UrlLink;
-import jalview.viewmodel.AlignmentViewport;
-
-import java.awt.BorderLayout;
-import java.awt.Panel;
-import java.awt.event.InputEvent;
-import java.awt.event.MouseEvent;
-import java.awt.event.MouseListener;
-import java.awt.event.MouseMotionListener;
-import java.util.List;
-import java.util.Vector;
-
-public class IdPanel extends Panel implements MouseListener,
-        MouseMotionListener
-{
-
-  protected IdCanvas idCanvas;
-
-  protected AlignmentViewport av;
-
-  protected AlignmentPanel alignPanel;
-
-  ScrollThread scrollThread = null;
-
-  int lastid = -1;
-
-  boolean mouseDragging = false;
-
-  java.util.Vector links = new java.util.Vector();
-
-  public IdPanel(AlignViewport av, AlignmentPanel parent)
-  {
-    this.av = av;
-    alignPanel = parent;
-    idCanvas = new IdCanvas(av);
-    setLayout(new BorderLayout());
-    add(idCanvas, BorderLayout.CENTER);
-    idCanvas.addMouseListener(this);
-    idCanvas.addMouseMotionListener(this);
-
-    String label, url;
-    // TODO: add in group link parameter
-    if (av.applet != null)
-    {
-      for (int i = 1; i < 10; i++)
-      {
-        label = av.applet.getParameter("linkLabel_" + i);
-        url = av.applet.getParameter("linkURL_" + i);
-
-        if (label != null && url != null)
-        {
-          links.addElement(label + "|" + url);
-        }
-
-      }
-    }
-    {
-      // upgrade old SRS link
-      int srsPos = links
-              .indexOf("SRS|http://srs.ebi.ac.uk/srsbin/cgi-bin/wgetz?-newId+(([uniprot-all:$SEQUENCE_ID$]))+-view+SwissEntry");
-      if (srsPos > -1)
-      {
-        links.setElementAt(
-                "EMBL-EBI Search|http://www.ebi.ac.uk/ebisearch/search.ebi?db=allebi&query=$SEQUENCE_ID$",
-                srsPos);
-      }
-    }
-    if (links.size() < 1)
-    {
-      links = new java.util.Vector();
-      links.addElement("EMBL-EBI Search|http://www.ebi.ac.uk/ebisearch/search.ebi?db=allebi&query=$SEQUENCE_ID$");
-    }
-  }
-
-  Tooltip tooltip;
-
-  public void mouseMoved(MouseEvent e)
-  {
-    int seq = alignPanel.seqPanel.findSeq(e);
-
-    SequenceI sequence = av.getAlignment().getSequenceAt(seq);
-
-    // look for non-pos features
-    StringBuffer tooltiptext = new StringBuffer();
-    if (sequence != null)
-    {
-      if (sequence.getDescription() != null)
-      {
-        tooltiptext.append(sequence.getDescription());
-        tooltiptext.append("\n");
-      }
-
-      SequenceFeature sf[] = sequence.getSequenceFeatures();
-      for (int sl = 0; sf != null && sl < sf.length; sl++)
-      {
-        if (sf[sl].begin == sf[sl].end && sf[sl].begin == 0)
-        {
-          boolean nl = false;
-          if (sf[sl].getFeatureGroup() != null)
-          {
-            tooltiptext.append(sf[sl].getFeatureGroup());
-            nl = true;
-          }
-          ;
-          if (sf[sl].getType() != null)
-          {
-            tooltiptext.append(" ");
-            tooltiptext.append(sf[sl].getType());
-            nl = true;
-          }
-          ;
-          if (sf[sl].getDescription() != null)
-          {
-            tooltiptext.append(" ");
-            tooltiptext.append(sf[sl].getDescription());
-            nl = true;
-          }
-          ;
-          if (sf[sl].getScore() != Float.NaN && sf[sl].getScore() != 0f)
-          {
-            tooltiptext.append(" Score = ");
-            tooltiptext.append(sf[sl].getScore());
-            nl = true;
-          }
-          ;
-          if (sf[sl].getStatus() != null && sf[sl].getStatus().length() > 0)
-          {
-            tooltiptext.append(" (");
-            tooltiptext.append(sf[sl].getStatus());
-            tooltiptext.append(")");
-            nl = true;
-          }
-          ;
-          if (nl)
-          {
-            tooltiptext.append("\n");
-          }
-        }
-      }
-    }
-    if (tooltiptext.length() == 0)
-    {
-      // nothing to display - so clear tooltip if one is visible
-      if (tooltip != null)
-      {
-        tooltip.setVisible(false);
-      }
-      tooltip = null;
-      tooltiptext = null;
-      return;
-    }
-    if (tooltip == null)
-    {
-      tooltip = new Tooltip(sequence.getDisplayId(true) + "\n"
-              + tooltiptext.toString(), idCanvas);
-    }
-    else
-    {
-      tooltip.setTip(sequence.getDisplayId(true) + "\n"
-              + tooltiptext.toString());
-    }
-    tooltiptext = null;
-  }
-
-  public void mouseDragged(MouseEvent e)
-  {
-    mouseDragging = true;
-
-    int seq = Math.max(0, alignPanel.seqPanel.findSeq(e));
-
-    if (seq < lastid)
-    {
-      selectSeqs(lastid - 1, seq);
-    }
-    else if (seq > lastid)
-    {
-      selectSeqs(lastid + 1, seq);
-    }
-
-    lastid = seq;
-    alignPanel.paintAlignment(false);
-  }
-
-  public void mouseClicked(MouseEvent e)
-  {
-    if (e.getClickCount() < 2)
-    {
-      return;
-    }
-
-    // DEFAULT LINK IS FIRST IN THE LINK LIST
-    int seq = alignPanel.seqPanel.findSeq(e);
-    SequenceI sq = av.getAlignment().getSequenceAt(seq);
-    if (sq == null)
-    {
-      return;
-    }
-    String id = sq.getName();
-
-    String target = null;
-    String url = null;
-    int i = 0;
-    while (url == null && i < links.size())
-    {
-      // DEFAULT LINK IS FIRST IN THE LINK LIST
-      // BUT IF ITS A REGEX AND DOES NOT MATCH THE NEXT ONE WILL BE TRIED
-      url = links.elementAt(i++).toString();
-      UrlLink urlLink = null;
-      try
-      {
-        urlLink = new UrlLink(url);
-        target = urlLink.getTarget();
-      } catch (Exception foo)
-      {
-        System.err.println("Exception for URLLink '" + url + "'");
-        foo.printStackTrace();
-        url = null;
-        continue;
-      }
-      ;
-      if (!urlLink.isValid())
-      {
-        System.err.println(urlLink.getInvalidMessage());
-        url = null;
-        continue;
-      }
-
-      String urls[] = urlLink.makeUrls(id, true);
-      if (urls == null || urls[0] == null || urls[0].length() < 1)
-      {
-        url = null;
-        continue;
-      }
-      // just take first URL made from regex
-      url = urls[1];
-    }
-    try
-    {
-
-      alignPanel.alignFrame.showURL(url, target);
-    } catch (Exception ex)
-    {
-      ex.printStackTrace();
-    }
-  }
-
-  public void mouseEntered(MouseEvent e)
-  {
-    if (scrollThread != null)
-    {
-      scrollThread.running = false;
-    }
-  }
-
-  public void mouseExited(MouseEvent e)
-  {
-    if (av.getWrapAlignment())
-    {
-      return;
-    }
-
-    if (mouseDragging && e.getY() < 0 && av.getStartSeq() > 0)
-    {
-      scrollThread = new ScrollThread(true);
-    }
-
-    if (mouseDragging && e.getY() >= getSize().height
-            && av.getAlignment().getHeight() > av.getEndSeq())
-    {
-      scrollThread = new ScrollThread(false);
-    }
-  }
-
-  public void mousePressed(MouseEvent e)
-  {
-    if (e.getClickCount() > 1)
-    {
-      return;
-    }
-
-    int y = e.getY();
-    if (av.getWrapAlignment())
-    {
-      y -= 2 * av.getCharHeight();
-    }
-
-    int seq = alignPanel.seqPanel.findSeq(e);
-
-    if ((e.getModifiers() & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK)
-    {
-      Sequence sq = (Sequence) av.getAlignment().getSequenceAt(seq);
-
-      // build a new links menu based on the current links + any non-positional
-      // features
-      Vector nlinks = new Vector();
-      for (int l = 0, lSize = links.size(); l < lSize; l++)
-      {
-        nlinks.addElement(links.elementAt(l));
-      }
-      SequenceFeature sf[] = sq == null ? null : sq.getSequenceFeatures();
-      for (int sl = 0; sf != null && sl < sf.length; sl++)
-      {
-        if (sf[sl].begin == sf[sl].end && sf[sl].begin == 0)
-        {
-          if (sf[sl].links != null && sf[sl].links.size() > 0)
-          {
-            for (int l = 0, lSize = sf[sl].links.size(); l < lSize; l++)
-            {
-              nlinks.addElement(sf[sl].links.elementAt(l));
-            }
-          }
-        }
-      }
-
-      APopupMenu popup = new APopupMenu(alignPanel, sq, nlinks);
-      this.add(popup);
-      popup.show(this, e.getX(), e.getY());
-      return;
-    }
-
-    if ((av.getSelectionGroup() == null)
-            || ((!e.isControlDown() && !e.isShiftDown()) && av
-                    .getSelectionGroup() != null))
-    {
-      av.setSelectionGroup(new SequenceGroup());
-      av.getSelectionGroup().setStartRes(0);
-      av.getSelectionGroup().setEndRes(av.getAlignment().getWidth() - 1);
-    }
-
-    if (e.isShiftDown() && lastid != -1)
-    {
-      selectSeqs(lastid, seq);
-    }
-    else
-    {
-      selectSeq(seq);
-    }
-
-    alignPanel.paintAlignment(false);
-  }
-
-  void selectSeq(int seq)
-  {
-    lastid = seq;
-    SequenceI pickedSeq = av.getAlignment().getSequenceAt(seq);
-    av.getSelectionGroup().addOrRemove(pickedSeq, true);
-  }
-
-  void selectSeqs(int start, int end)
-  {
-
-    lastid = start;
-
-    if (end >= av.getAlignment().getHeight())
-    {
-      end = av.getAlignment().getHeight() - 1;
-    }
-
-    if (end < start)
-    {
-      int tmp = start;
-      start = end;
-      end = tmp;
-      lastid = end;
-    }
-    if (av.getSelectionGroup() == null)
-    {
-      av.setSelectionGroup(new SequenceGroup());
-    }
-    for (int i = start; i <= end; i++)
-    {
-      av.getSelectionGroup().addSequence(
-              av.getAlignment().getSequenceAt(i), i == end);
-    }
-
-  }
-
-  public void mouseReleased(MouseEvent e)
-  {
-    if (scrollThread != null)
-    {
-      scrollThread.running = false;
-    }
-
-    if (av.getSelectionGroup() != null)
-    {
-      av.getSelectionGroup().recalcConservation();
-    }
-
-    mouseDragging = false;
-    PaintRefresher.Refresh(this, av.getSequenceSetId());
-    // always send selection message when mouse is released
-    av.sendSelection();
-  }
-
-  public void highlightSearchResults(List<SequenceI> list)
-  {
-    idCanvas.setHighlighted(list);
-
-    if (list == null)
-    {
-      return;
-    }
-
-    int index = av.getAlignment().findIndex(list.get(0));
-
-    // do we need to scroll the panel?
-    if (av.getStartSeq() > index || av.getEndSeq() < index)
-    {
-      alignPanel.setScrollValues(av.getStartRes(), index);
-    }
-  }
-
-  // this class allows scrolling off the bottom of the visible alignment
-  class ScrollThread extends Thread
-  {
-    boolean running = false;
-
-    boolean up = true;
-
-    public ScrollThread(boolean up)
-    {
-      this.up = up;
-      start();
-    }
-
-    public void stopScrolling()
-    {
-      running = false;
-    }
-
-    public void run()
-    {
-      running = true;
-      while (running)
-      {
-        if (alignPanel.scrollUp(up))
-        {
-          // scroll was ok, so add new sequence to selection
-          int seq = av.getStartSeq();
-          if (!up)
-          {
-            seq = av.getEndSeq();
-          }
-
-          if (seq < lastid)
-          {
-            selectSeqs(lastid - 1, seq);
-          }
-          else if (seq > lastid && seq < av.getAlignment().getHeight())
-          {
-            selectSeqs(lastid + 1, seq);
-          }
-
-          lastid = seq;
-        }
-        else
-        {
-          running = false;
-        }
-
-        alignPanel.paintAlignment(true);
-        try
-        {
-          Thread.sleep(100);
-        } catch (Exception ex)
-        {
-        }
-      }
-    }
-  }
-}
+/*\r
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)\r
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors\r
+ * \r
+ * This file is part of Jalview.\r
+ * \r
+ * Jalview is free software: you can redistribute it and/or\r
+ * modify it under the terms of the GNU General Public License \r
+ * as published by the Free Software Foundation, either version 3\r
+ * of the License, or (at your option) any later version.\r
+ *  \r
+ * Jalview is distributed in the hope that it will be useful, but \r
+ * WITHOUT ANY WARRANTY; without even the implied warranty \r
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR \r
+ * PURPOSE.  See the GNU General Public License for more details.\r
+ * \r
+ * You should have received a copy of the GNU General Public License\r
+ * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.\r
+ * The Jalview Authors are detailed in the 'AUTHORS' file.\r
+ */\r
+package jalview.appletgui;\r
+\r
+import jalview.datamodel.Sequence;\r
+import jalview.datamodel.SequenceFeature;\r
+import jalview.datamodel.SequenceGroup;\r
+import jalview.datamodel.SequenceI;\r
+import jalview.util.UrlLink;\r
+import jalview.viewmodel.AlignmentViewport;\r
+\r
+import java.awt.BorderLayout;\r
+import java.awt.Panel;\r
+import java.awt.event.InputEvent;\r
+import java.awt.event.MouseEvent;\r
+import java.awt.event.MouseListener;\r
+import java.awt.event.MouseMotionListener;\r
+import java.util.List;\r
+import java.util.Vector;\r
+\r
+public class IdPanel extends Panel implements MouseListener,\r
+        MouseMotionListener\r
+{\r
+\r
+  protected IdCanvas idCanvas;\r
+\r
+  protected AlignmentViewport av;\r
+\r
+  protected AlignmentPanel alignPanel;\r
+\r
+  ScrollThread scrollThread = null;\r
+\r
+  int lastid = -1;\r
+\r
+  boolean mouseDragging = false;\r
+\r
+  java.util.Vector links = new java.util.Vector();\r
+\r
+  public IdPanel(AlignViewport av, AlignmentPanel parent)\r
+  {\r
+    this.av = av;\r
+    alignPanel = parent;\r
+    idCanvas = new IdCanvas(av);\r
+    setLayout(new BorderLayout());\r
+    add(idCanvas, BorderLayout.CENTER);\r
+    idCanvas.addMouseListener(this);\r
+    idCanvas.addMouseMotionListener(this);\r
+\r
+    String label, url;\r
+    // TODO: add in group link parameter\r
+    if (av.applet != null)\r
+    {\r
+      for (int i = 1; i < 10; i++)\r
+      {\r
+        label = av.applet.getParameter("linkLabel_" + i);\r
+        url = av.applet.getParameter("linkURL_" + i);\r
+\r
+        if (label != null && url != null)\r
+        {\r
+          links.addElement(label + "|" + url);\r
+        }\r
+\r
+      }\r
+    }\r
+    {\r
+      // upgrade old SRS link\r
+      int srsPos = links\r
+              .indexOf("SRS|http://srs.ebi.ac.uk/srsbin/cgi-bin/wgetz?-newId+(([uniprot-all:$SEQUENCE_ID$]))+-view+SwissEntry");\r
+      if (srsPos > -1)\r
+      {\r
+        links.setElementAt(\r
+                "EMBL-EBI Search|http://www.ebi.ac.uk/ebisearch/search.ebi?db=allebi&query=$SEQUENCE_ID$",\r
+                srsPos);\r
+      }\r
+    }\r
+    if (links.size() < 1)\r
+    {\r
+      links = new java.util.Vector();\r
+      links.addElement("EMBL-EBI Search|http://www.ebi.ac.uk/ebisearch/search.ebi?db=allebi&query=$SEQUENCE_ID$");\r
+    }\r
+  }\r
+\r
+  Tooltip tooltip;\r
+\r
+  public void mouseMoved(MouseEvent e)\r
+  {\r
+    int seq = alignPanel.seqPanel.findSeq(e);\r
+\r
+    SequenceI sequence = av.getAlignment().getSequenceAt(seq);\r
+\r
+    // look for non-pos features\r
+    StringBuffer tooltiptext = new StringBuffer();\r
+    if (sequence != null)\r
+    {\r
+      if (sequence.getDescription() != null)\r
+      {\r
+        tooltiptext.append(sequence.getDescription());\r
+        tooltiptext.append("\n");\r
+      }\r
+\r
+      SequenceFeature sf[] = sequence.getSequenceFeatures();\r
+      for (int sl = 0; sf != null && sl < sf.length; sl++)\r
+      {\r
+        if (sf[sl].begin == sf[sl].end && sf[sl].begin == 0)\r
+        {\r
+          boolean nl = false;\r
+          if (sf[sl].getFeatureGroup() != null)\r
+          {\r
+            tooltiptext.append(sf[sl].getFeatureGroup());\r
+            nl = true;\r
+          }\r
+          ;\r
+          if (sf[sl].getType() != null)\r
+          {\r
+            tooltiptext.append(" ");\r
+            tooltiptext.append(sf[sl].getType());\r
+            nl = true;\r
+          }\r
+          ;\r
+          if (sf[sl].getDescription() != null)\r
+          {\r
+            tooltiptext.append(" ");\r
+            tooltiptext.append(sf[sl].getDescription());\r
+            nl = true;\r
+          }\r
+          ;\r
+          if (sf[sl].getScore() != Float.NaN && sf[sl].getScore() != 0f)\r
+          {\r
+            tooltiptext.append(" Score = ");\r
+            tooltiptext.append(sf[sl].getScore());\r
+            nl = true;\r
+          }\r
+          ;\r
+          if (sf[sl].getStatus() != null && sf[sl].getStatus().length() > 0)\r
+          {\r
+            tooltiptext.append(" (");\r
+            tooltiptext.append(sf[sl].getStatus());\r
+            tooltiptext.append(")");\r
+            nl = true;\r
+          }\r
+          ;\r
+          if (nl)\r
+          {\r
+            tooltiptext.append("\n");\r
+          }\r
+        }\r
+      }\r
+    }\r
+    if (tooltiptext.length() == 0)\r
+    {\r
+      // nothing to display - so clear tooltip if one is visible\r
+      if (tooltip != null)\r
+      {\r
+        tooltip.setVisible(false);\r
+      }\r
+      tooltip = null;\r
+      tooltiptext = null;\r
+      return;\r
+    }\r
+    if (tooltip == null)\r
+    {\r
+      tooltip = new Tooltip(sequence.getDisplayId(true) + "\n"\r
+              + tooltiptext.toString(), idCanvas);\r
+    }\r
+    else\r
+    {\r
+      tooltip.setTip(sequence.getDisplayId(true) + "\n"\r
+              + tooltiptext.toString());\r
+    }\r
+    tooltiptext = null;\r
+  }\r
+\r
+  public void mouseDragged(MouseEvent e)\r
+  {\r
+    mouseDragging = true;\r
+\r
+    int seq = Math.max(0, alignPanel.seqPanel.findSeq(e));\r
+\r
+    if (seq < lastid)\r
+    {\r
+      selectSeqs(lastid - 1, seq);\r
+    }\r
+    else if (seq > lastid)\r
+    {\r
+      selectSeqs(lastid + 1, seq);\r
+    }\r
+\r
+    lastid = seq;\r
+    alignPanel.paintAlignment(false);\r
+  }\r
+\r
+  public void mouseClicked(MouseEvent e)\r
+  {\r
+    if (e.getClickCount() < 2)\r
+    {\r
+      return;\r
+    }\r
+\r
+    // DEFAULT LINK IS FIRST IN THE LINK LIST\r
+    int seq = alignPanel.seqPanel.findSeq(e);\r
+    SequenceI sq = av.getAlignment().getSequenceAt(seq);\r
+    if (sq == null)\r
+    {\r
+      return;\r
+    }\r
+    String id = sq.getName();\r
+\r
+    String target = null;\r
+    String url = null;\r
+    int i = 0;\r
+    while (url == null && i < links.size())\r
+    {\r
+      // DEFAULT LINK IS FIRST IN THE LINK LIST\r
+      // BUT IF ITS A REGEX AND DOES NOT MATCH THE NEXT ONE WILL BE TRIED\r
+      url = links.elementAt(i++).toString();\r
+      UrlLink urlLink = null;\r
+      try\r
+      {\r
+        urlLink = new UrlLink(url);\r
+        target = urlLink.getTarget();\r
+      } catch (Exception foo)\r
+      {\r
+        System.err.println("Exception for URLLink '" + url + "'");\r
+        foo.printStackTrace();\r
+        url = null;\r
+        continue;\r
+      }\r
+      ;\r
+      if (!urlLink.isValid())\r
+      {\r
+        System.err.println(urlLink.getInvalidMessage());\r
+        url = null;\r
+        continue;\r
+      }\r
+\r
+      String urls[] = urlLink.makeUrls(id, true);\r
+      if (urls == null || urls[0] == null || urls[0].length() < 1)\r
+      {\r
+        url = null;\r
+        continue;\r
+      }\r
+      // just take first URL made from regex\r
+      url = urls[1];\r
+    }\r
+    try\r
+    {\r
+\r
+      alignPanel.alignFrame.showURL(url, target);\r
+    } catch (Exception ex)\r
+    {\r
+      ex.printStackTrace();\r
+    }\r
+  }\r
+\r
+  public void mouseEntered(MouseEvent e)\r
+  {\r
+    if (scrollThread != null)\r
+    {\r
+      scrollThread.running = false;\r
+    }\r
+  }\r
+\r
+  public void mouseExited(MouseEvent e)\r
+  {\r
+    if (av.getWrapAlignment())\r
+    {\r
+      return;\r
+    }\r
+\r
+    if (mouseDragging && e.getY() < 0 && av.getStartSeq() > 0)\r
+    {\r
+      scrollThread = new ScrollThread(true);\r
+    }\r
+\r
+    if (mouseDragging && e.getY() >= getSize().height\r
+            && av.getAlignment().getHeight() > av.getEndSeq())\r
+    {\r
+      scrollThread = new ScrollThread(false);\r
+    }\r
+  }\r
+\r
+  public void mousePressed(MouseEvent e)\r
+  {\r
+    if (e.getClickCount() > 1)\r
+    {\r
+      return;\r
+    }\r
+\r
+    int y = e.getY();\r
+    if (av.getWrapAlignment())\r
+    {\r
+      y -= 2 * av.getCharHeight();\r
+    }\r
+\r
+    int seq = alignPanel.seqPanel.findSeq(e);\r
+\r
+    if ((e.getModifiers() & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK)\r
+    {\r
+      Sequence sq = (Sequence) av.getAlignment().getSequenceAt(seq);\r
+\r
+      // build a new links menu based on the current links + any non-positional\r
+      // features\r
+      Vector nlinks = new Vector();\r
+      for (int l = 0, lSize = links.size(); l < lSize; l++)\r
+      {\r
+        nlinks.addElement(links.elementAt(l));\r
+      }\r
+      SequenceFeature sf[] = sq == null ? null : sq.getSequenceFeatures();\r
+      for (int sl = 0; sf != null && sl < sf.length; sl++)\r
+      {\r
+        if (sf[sl].begin == sf[sl].end && sf[sl].begin == 0)\r
+        {\r
+          if (sf[sl].links != null && sf[sl].links.size() > 0)\r
+          {\r
+            for (int l = 0, lSize = sf[sl].links.size(); l < lSize; l++)\r
+            {\r
+              nlinks.addElement(sf[sl].links.elementAt(l));\r
+            }\r
+          }\r
+        }\r
+      }\r
+\r
+      APopupMenu popup = new APopupMenu(alignPanel, sq, nlinks);\r
+      this.add(popup);\r
+      popup.show(this, e.getX(), e.getY());\r
+      return;\r
+    }\r
+\r
+    if ((av.getSelectionGroup() == null)\r
+            || ((!e.isControlDown() && !e.isShiftDown()) && av\r
+                    .getSelectionGroup() != null))\r
+    {\r
+      av.setSelectionGroup(new SequenceGroup());\r
+      av.getSelectionGroup().setStartRes(0);\r
+      av.getSelectionGroup().setEndRes(av.getAlignment().getWidth() - 1);\r
+    }\r
+\r
+    if (e.isShiftDown() && lastid != -1)\r
+    {\r
+      selectSeqs(lastid, seq);\r
+    }\r
+    else\r
+    {\r
+      selectSeq(seq);\r
+    }\r
+\r
+    alignPanel.paintAlignment(false);\r
+  }\r
+\r
+  void selectSeq(int seq)\r
+  {\r
+    lastid = seq;\r
+    SequenceI pickedSeq = av.getAlignment().getSequenceAt(seq);\r
+    av.getSelectionGroup().addOrRemove(pickedSeq, true);\r
+  }\r
+\r
+  void selectSeqs(int start, int end)\r
+  {\r
+\r
+    lastid = start;\r
+\r
+    if (end >= av.getAlignment().getHeight())\r
+    {\r
+      end = av.getAlignment().getHeight() - 1;\r
+    }\r
+\r
+    if (end < start)\r
+    {\r
+      int tmp = start;\r
+      start = end;\r
+      end = tmp;\r
+      lastid = end;\r
+    }\r
+    if (av.getSelectionGroup() == null)\r
+    {\r
+      av.setSelectionGroup(new SequenceGroup());\r
+    }\r
+    for (int i = start; i <= end; i++)\r
+    {\r
+      av.getSelectionGroup().addSequence(\r
+              av.getAlignment().getSequenceAt(i), i == end);\r
+    }\r
+\r
+  }\r
+\r
+  public void mouseReleased(MouseEvent e)\r
+  {\r
+    if (scrollThread != null)\r
+    {\r
+      scrollThread.running = false;\r
+    }\r
+\r
+    if (av.getSelectionGroup() != null)\r
+    {\r
+      av.getSelectionGroup().recalcConservation();\r
+    }\r
+\r
+    mouseDragging = false;\r
+    PaintRefresher.Refresh(this, av.getSequenceSetId());\r
+    // always send selection message when mouse is released\r
+    av.sendSelection();\r
+  }\r
+\r
+  public void highlightSearchResults(List<SequenceI> list)\r
+  {\r
+    idCanvas.setHighlighted(list);\r
+\r
+    if (list == null)\r
+    {\r
+      return;\r
+    }\r
+\r
+    int index = av.getAlignment().findIndex(list.get(0));\r
+\r
+    // do we need to scroll the panel?\r
+    if (av.getStartSeq() > index || av.getEndSeq() < index)\r
+    {\r
+      alignPanel.setScrollValues(av.getStartRes(), index);\r
+    }\r
+  }\r
+\r
+  // this class allows scrolling off the bottom of the visible alignment\r
+  class ScrollThread extends Thread\r
+  {\r
+    boolean running = false;\r
+\r
+    boolean up = true;\r
+\r
+    public ScrollThread(boolean up)\r
+    {\r
+      this.up = up;\r
+      start();\r
+    }\r
+\r
+    public void stopScrolling()\r
+    {\r
+      running = false;\r
+    }\r
+\r
+    public void run()\r
+    {\r
+      running = true;\r
+      while (running)\r
+      {\r
+        if (alignPanel.scrollUp(up))\r
+        {\r
+          // scroll was ok, so add new sequence to selection\r
+          int seq = av.getStartSeq();\r
+          if (!up)\r
+          {\r
+            seq = av.getEndSeq();\r
+          }\r
+\r
+          if (seq < lastid)\r
+          {\r
+            selectSeqs(lastid - 1, seq);\r
+          }\r
+          else if (seq > lastid && seq < av.getAlignment().getHeight())\r
+          {\r
+            selectSeqs(lastid + 1, seq);\r
+          }\r
+\r
+          lastid = seq;\r
+        }\r
+        else\r
+        {\r
+          running = false;\r
+        }\r
+\r
+        alignPanel.paintAlignment(true);\r
+        try\r
+        {\r
+          Thread.sleep(100);\r
+        } catch (Exception ex)\r
+        {\r
+        }\r
+      }\r
+    }\r
+  }\r
+}\r