2 * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8)
3 * Copyright (C) 2012 J Procter, AM Waterhouse, LM Lui, J Engelhardt, G Barton, M Clamp, S Searle
5 * This file is part of Jalview.
7 * Jalview is free software: you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
11 * Jalview is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty
13 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
14 * PURPOSE. See the GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License along with Jalview. If not, see <http://www.gnu.org/licenses/>.
21 import java.awt.event.*;
22 import java.util.List;
23 import java.util.Vector;
27 import jalview.datamodel.*;
28 import jalview.io.SequenceAnnotationReport;
29 import jalview.util.UrlLink;
37 public class IdPanel extends JPanel implements MouseListener,
38 MouseMotionListener, MouseWheelListener
40 protected IdCanvas idCanvas;
42 protected AlignViewport av;
44 protected AlignmentPanel alignPanel;
46 ScrollThread scrollThread = null;
55 boolean mouseDragging = false;
57 private final SequenceAnnotationReport seqAnnotReport;
60 * Creates a new IdPanel object.
67 public IdPanel(AlignViewport av, AlignmentPanel parent)
71 idCanvas = new IdCanvas(av);
72 linkImageURL = getClass().getResource("/images/link.gif").toString();
73 seqAnnotReport = new SequenceAnnotationReport(linkImageURL);
74 setLayout(new BorderLayout());
75 add(idCanvas, BorderLayout.CENTER);
76 addMouseListener(this);
77 addMouseMotionListener(this);
78 addMouseWheelListener(this);
79 ToolTipManager.sharedInstance().registerComponent(this);
89 public void mouseMoved(MouseEvent e)
91 SeqPanel sp = alignPanel.seqPanel;
92 int seq = Math.max(0, sp.findSeq(e));
93 if (seq > -1 && seq < av.getAlignment().getHeight())
95 SequenceI sequence = av.getAlignment().getSequenceAt(seq);
96 StringBuffer tip = new StringBuffer();
98 .createSequenceAnnotationReport(tip, sequence,
99 av.isShowDbRefs(), av.isShowNpFeats(),
100 sp.seqCanvas.fr.minmax);
101 setToolTipText("<html>" + sequence.getDisplayId(true) + " "
102 + tip.toString() + "</html>");
113 public void mouseDragged(MouseEvent e)
115 mouseDragging = true;
117 int seq = Math.max(0, alignPanel.seqPanel.findSeq(e));
121 selectSeqs(lastid - 1, seq);
123 else if (seq > lastid)
125 selectSeqs(lastid + 1, seq);
129 alignPanel.paintAlignment(true);
133 public void mouseWheelMoved(MouseWheelEvent e)
136 if (e.getWheelRotation() > 0)
140 alignPanel.scrollRight(true);
145 alignPanel.scrollUp(false);
152 alignPanel.scrollRight(false);
156 alignPanel.scrollUp(true);
168 public void mouseClicked(MouseEvent e)
170 if (e.getClickCount() < 2)
175 java.util.Vector links = Preferences.sequenceURLLinks;
176 if (links == null || links.size() < 1)
181 int seq = alignPanel.seqPanel.findSeq(e);
184 String id = av.getAlignment().getSequenceAt(seq).getName();
185 while (url == null && i < links.size())
187 // DEFAULT LINK IS FIRST IN THE LINK LIST
188 // BUT IF ITS A REGEX AND DOES NOT MATCH THE NEXT ONE WILL BE TRIED
189 url = links.elementAt(i++).toString();
190 jalview.util.UrlLink urlLink = null;
193 urlLink = new UrlLink(url);
194 } catch (Exception foo)
196 jalview.bin.Cache.log.error("Exception for URLLink '" + url + "'",
202 if (!urlLink.isValid())
204 jalview.bin.Cache.log.error(urlLink.getInvalidMessage());
209 String urls[] = urlLink.makeUrls(id, true);
210 if (urls == null || urls[0] == null || urls[0].length() < 4)
215 // just take first URL made from regex
220 jalview.util.BrowserLauncher.openURL(url);
221 } catch (Exception ex)
224 .showInternalMessageDialog(
226 "Unixers: Couldn't find default web browser."
227 + "\nAdd the full path to your browser in Preferences.",
228 "Web browser not found", JOptionPane.WARNING_MESSAGE);
229 ex.printStackTrace();
241 public void mouseEntered(MouseEvent e)
243 if (scrollThread != null)
245 scrollThread.running = false;
256 public void mouseExited(MouseEvent e)
258 if (av.getWrapAlignment())
263 if (mouseDragging && (e.getY() < 0) && (av.getStartSeq() > 0))
265 scrollThread = new ScrollThread(true);
268 if (mouseDragging && (e.getY() >= getHeight())
269 && (av.getAlignment().getHeight() > av.getEndSeq()))
271 scrollThread = new ScrollThread(false);
282 public void mousePressed(MouseEvent e)
284 if (e.getClickCount() == 2)
289 int seq = alignPanel.seqPanel.findSeq(e);
291 if (javax.swing.SwingUtilities.isRightMouseButton(e))
293 Sequence sq = (Sequence) av.getAlignment().getSequenceAt(seq);
294 // build a new links menu based on the current links + any non-positional
296 Vector nlinks = new Vector(Preferences.sequenceURLLinks);
297 SequenceFeature sf[] = sq == null ? null : sq.getDatasetSequence()
298 .getSequenceFeatures();
299 for (int sl = 0; sf != null && sl < sf.length; sl++)
301 if (sf[sl].begin == sf[sl].end && sf[sl].begin == 0)
303 if (sf[sl].links != null && sf[sl].links.size() > 0)
305 for (int l = 0, lSize = sf[sl].links.size(); l < lSize; l++)
307 nlinks.addElement(sf[sl].links.elementAt(l));
313 jalview.gui.PopupMenu pop = new jalview.gui.PopupMenu(alignPanel, sq,
314 nlinks, new Vector(Preferences.getGroupURLLinks()));
315 pop.show(this, e.getX(), e.getY());
320 if ((av.getSelectionGroup() == null)
321 || ((!e.isControlDown() && !e.isShiftDown()) && av
322 .getSelectionGroup() != null))
324 av.setSelectionGroup(new SequenceGroup());
325 av.getSelectionGroup().setStartRes(0);
326 av.getSelectionGroup().setEndRes(av.getAlignment().getWidth() - 1);
329 if (e.isShiftDown() && (lastid != -1))
331 selectSeqs(lastid, seq);
337 alignPanel.paintAlignment(true);
346 void selectSeq(int seq)
350 SequenceI pickedSeq = av.getAlignment().getSequenceAt(seq);
351 av.getSelectionGroup().addOrRemove(pickedSeq, true);
362 void selectSeqs(int start, int end)
364 if (av.getSelectionGroup() == null)
369 if (end >= av.getAlignment().getHeight())
371 end = av.getAlignment().getHeight() - 1;
384 for (int i = start; i <= end; i++)
386 av.getSelectionGroup().addSequence(
387 av.getAlignment().getSequenceAt(i), i == end);
398 public void mouseReleased(MouseEvent e)
400 if (scrollThread != null)
402 scrollThread.running = false;
405 mouseDragging = false;
406 PaintRefresher.Refresh(this, av.getSequenceSetId());
407 // always send selection message when mouse is released
417 public void highlightSearchResults(List<SequenceI> list)
419 idCanvas.setHighlighted(list);
426 int index = av.getAlignment().findIndex(list.get(0));
428 // do we need to scroll the panel?
429 if ((av.getStartSeq() > index) || (av.getEndSeq() < index))
431 alignPanel.setScrollValues(av.getStartRes(), index);
435 // this class allows scrolling off the bottom of the visible alignment
436 class ScrollThread extends Thread
438 boolean running = false;
442 public ScrollThread(boolean up)
448 public void stopScrolling()
460 if (alignPanel.scrollUp(up))
462 // scroll was ok, so add new sequence to selection
463 int seq = av.getStartSeq();
467 seq = av.getEndSeq();
472 selectSeqs(lastid - 1, seq);
474 else if (seq > lastid)
476 selectSeqs(lastid + 1, seq);
486 alignPanel.paintAlignment(false);
491 } catch (Exception ex)