added help and documentation for annotation editing.
[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      * DOCUMENT ME!\r
111      *\r
112      * @param e DOCUMENT ME!\r
113      */\r
114     public void mouseClicked(MouseEvent e)\r
115     {\r
116         if (e.getClickCount() == 2)\r
117         {\r
118             int y = e.getY();\r
119 \r
120             if (av.getWrapAlignment())\r
121             {\r
122                 y -= (2 * av.charHeight);\r
123             }\r
124 \r
125             int seq = av.getIndex(y);\r
126             String id = av.getAlignment().getSequenceAt(seq).getName();\r
127 \r
128             try\r
129             {\r
130                 jalview.util.BrowserLauncher.openURL(\r
131                     "http://srs.ebi.ac.uk/srs7bin/cgi-bin/wgetz?-e+[uniprot-all:" +\r
132                     id + "]+-vn+2");\r
133             }\r
134             catch (Exception ex)\r
135             {\r
136                 // TODO: JBPNote : state dependent error message for real browserLaunch problems rather than unix misconfiguration.\r
137                 System.err.println(ex.getMessage() +\r
138                     "\nUnixers: Try adding this jalview.browser property line \n" +\r
139                     "in your jalview.properties file (/usr/local/bin/firefox is an exanmple browser path):\n" +\r
140                     "jalview.browser=/usr/local/bin/firefox\n");\r
141 \r
142                 //ex.printStackTrace();\r
143             }\r
144         }\r
145     }\r
146 \r
147     /**\r
148      * DOCUMENT ME!\r
149      *\r
150      * @param e DOCUMENT ME!\r
151      */\r
152     public void mouseEntered(MouseEvent e)\r
153     {\r
154         if (scrollThread != null)\r
155         {\r
156             scrollThread.running = false;\r
157         }\r
158     }\r
159 \r
160     /**\r
161      * DOCUMENT ME!\r
162      *\r
163      * @param e DOCUMENT ME!\r
164      */\r
165     public void mouseExited(MouseEvent e)\r
166     {\r
167         if (av.getWrapAlignment())\r
168         {\r
169             return;\r
170         }\r
171 \r
172         if (mouseDragging && (e.getY() < 0) && (av.getStartSeq() > 0))\r
173         {\r
174             scrollThread = new ScrollThread(true);\r
175         }\r
176 \r
177         if (mouseDragging && (e.getY() >= getHeight()) &&\r
178                 (av.alignment.getHeight() > av.getEndSeq()))\r
179         {\r
180             scrollThread = new ScrollThread(false);\r
181         }\r
182     }\r
183 \r
184     /**\r
185      * DOCUMENT ME!\r
186      *\r
187      * @param e DOCUMENT ME!\r
188      */\r
189     public void mousePressed(MouseEvent e)\r
190     {\r
191         if (e.getClickCount() == 2)\r
192         {\r
193             return;\r
194         }\r
195 \r
196         int y = e.getY();\r
197 \r
198         if (av.getWrapAlignment())\r
199         {\r
200             y -= (2 * av.charHeight);\r
201         }\r
202 \r
203         int seq = av.getIndex(y);\r
204 \r
205         if (seq == -1)\r
206         {\r
207             return;\r
208         }\r
209 \r
210         if (javax.swing.SwingUtilities.isRightMouseButton(e))\r
211         {\r
212             jalview.gui.PopupMenu pop = new jalview.gui.PopupMenu(alignPanel,\r
213                     (Sequence) av.getAlignment().getSequenceAt(seq));\r
214             pop.show(this, e.getX(), y);\r
215 \r
216             return;\r
217         }\r
218 \r
219         if (!e.isControlDown() && !e.isShiftDown() &&\r
220                 (av.alignment.findGroup(av.alignment.getSequenceAt(seq)) != null))\r
221         {\r
222             SequenceGroup selection = new SequenceGroup();\r
223             SequenceGroup sg = av.alignment.findGroup(av.alignment.getSequenceAt(\r
224                         seq));\r
225             selection.setStartRes(0);\r
226             selection.setEndRes(av.alignment.getWidth() - 1);\r
227 \r
228             for (int i = 0; i < sg.getSize(); i++)\r
229             {\r
230                 selection.addSequence(sg.getSequenceAt(i), true);\r
231             }\r
232 \r
233             av.setSelectionGroup(selection);\r
234 \r
235             return;\r
236         }\r
237 \r
238         if ((av.getSelectionGroup() == null) ||\r
239                 (!e.isControlDown() && (av.getSelectionGroup() != null)))\r
240         {\r
241             av.setSelectionGroup(new SequenceGroup());\r
242         }\r
243 \r
244         av.getSelectionGroup().setStartRes(0);\r
245         av.getSelectionGroup().setEndRes(av.alignment.getWidth() - 1);\r
246 \r
247         if (e.isShiftDown() && (lastid != -1))\r
248         {\r
249             selectSeqs(lastid, seq);\r
250         }\r
251         else\r
252         {\r
253             selectSeq(seq);\r
254         }\r
255 \r
256         alignPanel.repaint();\r
257     }\r
258 \r
259     /**\r
260      * DOCUMENT ME!\r
261      *\r
262      * @param seq DOCUMENT ME!\r
263      */\r
264     void selectSeq(int seq)\r
265     {\r
266         lastid = seq;\r
267 \r
268         SequenceI pickedSeq = av.getAlignment().getSequenceAt(seq);\r
269         av.getSelectionGroup().addOrRemove(pickedSeq, true);\r
270     }\r
271 \r
272     /**\r
273      * DOCUMENT ME!\r
274      *\r
275      * @param start DOCUMENT ME!\r
276      * @param end DOCUMENT ME!\r
277      */\r
278     void selectSeqs(int start, int end)\r
279     {\r
280         lastid = start;\r
281 \r
282         if (end < start)\r
283         {\r
284             int tmp = start;\r
285             start = end;\r
286             end = tmp;\r
287             lastid = end;\r
288         }\r
289 \r
290         for (int i = start; i <= end; i++)\r
291         {\r
292             av.getSelectionGroup().addSequence(av.getAlignment().getSequenceAt(i),\r
293                 true);\r
294         }\r
295     }\r
296 \r
297     /**\r
298      * DOCUMENT ME!\r
299      *\r
300      * @param e DOCUMENT ME!\r
301      */\r
302     public void mouseReleased(MouseEvent e)\r
303     {\r
304         if (scrollThread != null)\r
305         {\r
306             scrollThread.running = false;\r
307         }\r
308 \r
309         mouseDragging = false;\r
310         PaintRefresher.Refresh(av.alignment);\r
311     }\r
312 \r
313     /**\r
314      * DOCUMENT ME!\r
315      *\r
316      * @param found DOCUMENT ME!\r
317      */\r
318     public void highlightSearchResults(java.util.Vector found)\r
319     {\r
320         idCanvas.setHighlighted(found);\r
321 \r
322         if (found == null)\r
323         {\r
324             return;\r
325         }\r
326 \r
327         int index = av.alignment.findIndex((SequenceI) found.get(0));\r
328 \r
329         // do we need to scroll the panel?\r
330         if ((av.getStartSeq() > index) || (av.getEndSeq() < index))\r
331         {\r
332             alignPanel.setScrollValues(av.getStartRes(), index);\r
333         }\r
334     }\r
335 \r
336     // this class allows scrolling off the bottom of the visible alignment\r
337     class ScrollThread extends Thread\r
338     {\r
339         boolean running = false;\r
340         boolean up = true;\r
341 \r
342         public ScrollThread(boolean up)\r
343         {\r
344             this.up = up;\r
345             start();\r
346         }\r
347 \r
348         public void stopScrolling()\r
349         {\r
350             running = false;\r
351         }\r
352 \r
353         public void run()\r
354         {\r
355             running = true;\r
356 \r
357             while (running)\r
358             {\r
359                 if (alignPanel.scrollUp(up))\r
360                 {\r
361                     // scroll was ok, so add new sequence to selection\r
362                     int seq = av.getStartSeq();\r
363 \r
364                     if (!up)\r
365                     {\r
366                         seq = av.getEndSeq();\r
367                     }\r
368 \r
369                     if (seq < lastid)\r
370                     {\r
371                         selectSeqs(lastid - 1, seq);\r
372                     }\r
373                     else if (seq > lastid)\r
374                     {\r
375                         selectSeqs(lastid + 1, seq);\r
376                     }\r
377 \r
378                     lastid = seq;\r
379                 }\r
380                 else\r
381                 {\r
382                     running = false;\r
383                 }\r
384 \r
385                 alignPanel.repaint();\r
386 \r
387                 try\r
388                 {\r
389                     Thread.sleep(100);\r
390                 }\r
391                 catch (Exception ex)\r
392                 {\r
393                 }\r
394             }\r
395         }\r
396     }\r
397 }\r