offy changes
[jalview.git] / src / jalview / gui / IdPanel.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer\r
3  * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
4  *\r
5  * This program is free software; you can redistribute it and/or\r
6  * modify it under the terms of the GNU General Public License\r
7  * as published by the Free Software Foundation; either version 2\r
8  * of the License, or (at your option) any later version.\r
9  *\r
10  * This program is distributed in the hope that it will be useful,\r
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13  * GNU General Public License for more details.\r
14  *\r
15  * You should have received a copy of the GNU General Public License\r
16  * along with this program; if not, write to the Free Software\r
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
18  */\r
19 package jalview.gui;\r
20 \r
21 import jalview.datamodel.*;\r
22 \r
23 import java.awt.*;\r
24 import java.awt.event.*;\r
25 \r
26 import javax.swing.*;\r
27 \r
28 \r
29 /**\r
30  * DOCUMENT ME!\r
31  *\r
32  * @author $author$\r
33  * @version $Revision$\r
34  */\r
35 public class IdPanel extends JPanel implements MouseListener,\r
36     MouseMotionListener\r
37 {\r
38     protected IdCanvas idCanvas;\r
39     protected AlignViewport av;\r
40     protected AlignmentPanel alignPanel;\r
41     ScrollThread scrollThread = null;\r
42     int offy;\r
43     int width;\r
44     int lastid = -1;\r
45     boolean mouseDragging = false;\r
46 \r
47     /**\r
48      * Creates a new IdPanel object.\r
49      *\r
50      * @param av DOCUMENT ME!\r
51      * @param parent DOCUMENT ME!\r
52      */\r
53     public IdPanel(AlignViewport av, AlignmentPanel parent)\r
54     {\r
55         this.av = av;\r
56         alignPanel = parent;\r
57         idCanvas = new IdCanvas(av);\r
58         setLayout(new BorderLayout());\r
59         add(idCanvas, BorderLayout.CENTER);\r
60         addMouseListener(this);\r
61         addMouseMotionListener(this);\r
62     }\r
63 \r
64     /**\r
65      * DOCUMENT ME!\r
66      *\r
67      * @param e DOCUMENT ME!\r
68      */\r
69     public void mouseMoved(MouseEvent e)\r
70     {\r
71     }\r
72 \r
73     /**\r
74      * DOCUMENT ME!\r
75      *\r
76      * @param e DOCUMENT ME!\r
77      */\r
78     public void mouseDragged(MouseEvent e)\r
79     {\r
80         mouseDragging = true;\r
81 \r
82         int y = e.getY();\r
83 \r
84         if (av.getWrapAlignment())\r
85         {\r
86             y -= (2 * av.charHeight);\r
87         }\r
88 \r
89         int seq = av.getIndex(y);\r
90 \r
91         if (seq < 0)\r
92         {\r
93             return;\r
94         }\r
95 \r
96         if (seq < lastid)\r
97         {\r
98             selectSeqs(lastid - 1, seq);\r
99         }\r
100         else if (seq > lastid)\r
101         {\r
102             selectSeqs(lastid + 1, seq);\r
103         }\r
104 \r
105         lastid = seq;\r
106         alignPanel.repaint();\r
107     }\r
108 \r
109 \r
110     /**\r
111      * DOCUMENT ME!\r
112      *\r
113      * @param e DOCUMENT ME!\r
114      */\r
115     public void mouseClicked(MouseEvent e)\r
116     {\r
117         if (e.getClickCount() < 2)\r
118         return;\r
119 \r
120       java.util.Vector links = Preferences.sequenceURLLinks;\r
121       if (links == null || links.size() < 1)\r
122         return;\r
123 \r
124       int y = e.getY();\r
125 \r
126       if (av.getWrapAlignment())\r
127       {\r
128         y -= (2 * av.charHeight);\r
129       }\r
130 \r
131       //DEFAULT LINK IS FIRST IN THE LINK LIST\r
132       int seq = av.getIndex(y);\r
133       String id = av.getAlignment().getSequenceAt(seq).getName();\r
134 \r
135       String url = links.elementAt(0).toString();\r
136       url = url.substring(url.indexOf("|")+1);\r
137 \r
138       int index = url.indexOf("$SEQUENCE_ID$");\r
139       url = url.substring(0, index)+ id + url.substring(index+13);\r
140 \r
141       try\r
142       {\r
143         jalview.util.BrowserLauncher.openURL(url);\r
144       }\r
145       catch (Exception ex)\r
146       {\r
147        JOptionPane.showInternalMessageDialog(Desktop.desktop,\r
148            "Unixers: Couldn't find default web browser."\r
149           +"\nAdd the full path to your browser in Preferences.",\r
150           "Web browser not found", JOptionPane.WARNING_MESSAGE );\r
151         ex.printStackTrace();\r
152       }\r
153     }\r
154 \r
155     /**\r
156      * DOCUMENT ME!\r
157      *\r
158      * @param e DOCUMENT ME!\r
159      */\r
160     public void mouseEntered(MouseEvent e)\r
161     {\r
162         if (scrollThread != null)\r
163         {\r
164             scrollThread.running = false;\r
165         }\r
166     }\r
167 \r
168     /**\r
169      * DOCUMENT ME!\r
170      *\r
171      * @param e DOCUMENT ME!\r
172      */\r
173     public void mouseExited(MouseEvent e)\r
174     {\r
175         if (av.getWrapAlignment())\r
176         {\r
177             return;\r
178         }\r
179 \r
180         if (mouseDragging && (e.getY() < 0) && (av.getStartSeq() > 0))\r
181         {\r
182             scrollThread = new ScrollThread(true);\r
183         }\r
184 \r
185         if (mouseDragging && (e.getY() >= getHeight()) &&\r
186                 (av.alignment.getHeight() > av.getEndSeq()))\r
187         {\r
188             scrollThread = new ScrollThread(false);\r
189         }\r
190     }\r
191 \r
192     /**\r
193      * DOCUMENT ME!\r
194      *\r
195      * @param e DOCUMENT ME!\r
196      */\r
197     public void mousePressed(MouseEvent e)\r
198     {\r
199         if (e.getClickCount() == 2)\r
200         {\r
201             return;\r
202         }\r
203 \r
204         int y = e.getY();\r
205 \r
206         if (av.getWrapAlignment())\r
207         {\r
208             y -= (2 * av.charHeight);\r
209         }\r
210 \r
211         int seq = av.getIndex(y);\r
212 \r
213         if (seq == -1)\r
214         {\r
215             return;\r
216         }\r
217 \r
218         if (javax.swing.SwingUtilities.isRightMouseButton(e))\r
219         {\r
220             jalview.gui.PopupMenu pop = new jalview.gui.PopupMenu(alignPanel,\r
221                     (Sequence) av.getAlignment().getSequenceAt(seq));\r
222             pop.show(this, e.getX(), y);\r
223 \r
224             return;\r
225         }\r
226 \r
227         if (!e.isControlDown() && !e.isShiftDown() &&\r
228                 (av.alignment.findGroup(av.alignment.getSequenceAt(seq)) != null))\r
229         {\r
230             SequenceGroup selection = new SequenceGroup();\r
231             SequenceGroup sg = av.alignment.findGroup(av.alignment.getSequenceAt(\r
232                         seq));\r
233             selection.setStartRes(0);\r
234             selection.setEndRes(av.alignment.getWidth() - 1);\r
235 \r
236             for (int i = 0; i < sg.getSize(); i++)\r
237             {\r
238                 selection.addSequence(sg.getSequenceAt(i), true);\r
239             }\r
240 \r
241             av.setSelectionGroup(selection);\r
242 \r
243             return;\r
244         }\r
245 \r
246         if ((av.getSelectionGroup() == null) ||\r
247                 (!e.isControlDown() && (av.getSelectionGroup() != null)))\r
248         {\r
249             av.setSelectionGroup(new SequenceGroup());\r
250         }\r
251 \r
252         av.getSelectionGroup().setStartRes(0);\r
253         av.getSelectionGroup().setEndRes(av.alignment.getWidth() - 1);\r
254 \r
255         if (e.isShiftDown() && (lastid != -1))\r
256         {\r
257             selectSeqs(lastid, seq);\r
258         }\r
259         else\r
260         {\r
261             selectSeq(seq);\r
262         }\r
263 \r
264         alignPanel.repaint();\r
265     }\r
266 \r
267     /**\r
268      * DOCUMENT ME!\r
269      *\r
270      * @param seq DOCUMENT ME!\r
271      */\r
272     void selectSeq(int seq)\r
273     {\r
274         lastid = seq;\r
275 \r
276         SequenceI pickedSeq = av.getAlignment().getSequenceAt(seq);\r
277         av.getSelectionGroup().addOrRemove(pickedSeq, true);\r
278     }\r
279 \r
280     /**\r
281      * DOCUMENT ME!\r
282      *\r
283      * @param start DOCUMENT ME!\r
284      * @param end DOCUMENT ME!\r
285      */\r
286     void selectSeqs(int start, int end)\r
287     {\r
288         lastid = start;\r
289 \r
290         if (end < start)\r
291         {\r
292             int tmp = start;\r
293             start = end;\r
294             end = tmp;\r
295             lastid = end;\r
296         }\r
297 \r
298         for (int i = start; i <= end; i++)\r
299         {\r
300             av.getSelectionGroup().addSequence(av.getAlignment().getSequenceAt(i),\r
301                 true);\r
302         }\r
303     }\r
304 \r
305     /**\r
306      * DOCUMENT ME!\r
307      *\r
308      * @param e DOCUMENT ME!\r
309      */\r
310     public void mouseReleased(MouseEvent e)\r
311     {\r
312         if (scrollThread != null)\r
313         {\r
314             scrollThread.running = false;\r
315         }\r
316 \r
317         mouseDragging = false;\r
318         PaintRefresher.Refresh(av.alignment);\r
319     }\r
320 \r
321     /**\r
322      * DOCUMENT ME!\r
323      *\r
324      * @param found DOCUMENT ME!\r
325      */\r
326     public void highlightSearchResults(java.util.Vector found)\r
327     {\r
328         idCanvas.setHighlighted(found);\r
329 \r
330         if (found == null)\r
331         {\r
332             return;\r
333         }\r
334 \r
335         int index = av.alignment.findIndex((SequenceI) found.get(0));\r
336 \r
337         // do we need to scroll the panel?\r
338         if ((av.getStartSeq() > index) || (av.getEndSeq() < index))\r
339         {\r
340             alignPanel.setScrollValues(av.getStartRes(), index);\r
341         }\r
342     }\r
343 \r
344     // this class allows scrolling off the bottom of the visible alignment\r
345     class ScrollThread extends Thread\r
346     {\r
347         boolean running = false;\r
348         boolean up = true;\r
349 \r
350         public ScrollThread(boolean up)\r
351         {\r
352             this.up = up;\r
353             start();\r
354         }\r
355 \r
356         public void stopScrolling()\r
357         {\r
358             running = false;\r
359         }\r
360 \r
361         public void run()\r
362         {\r
363             running = true;\r
364 \r
365             while (running)\r
366             {\r
367                 if (alignPanel.scrollUp(up))\r
368                 {\r
369                     // scroll was ok, so add new sequence to selection\r
370                     int seq = av.getStartSeq();\r
371 \r
372                     if (!up)\r
373                     {\r
374                         seq = av.getEndSeq();\r
375                     }\r
376 \r
377                     if (seq < lastid)\r
378                     {\r
379                         selectSeqs(lastid - 1, seq);\r
380                     }\r
381                     else if (seq > lastid)\r
382                     {\r
383                         selectSeqs(lastid + 1, seq);\r
384                     }\r
385 \r
386                     lastid = seq;\r
387                 }\r
388                 else\r
389                 {\r
390                     running = false;\r
391                 }\r
392 \r
393                 alignPanel.repaint();\r
394 \r
395                 try\r
396                 {\r
397                     Thread.sleep(100);\r
398                 }\r
399                 catch (Exception ex)\r
400                 {\r
401                 }\r
402             }\r
403         }\r
404     }\r
405 }\r