-/*
- * 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