PaintRefresh changed
[jalview.git] / src / jalview / appletgui / 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 \r
20 package jalview.appletgui;\r
21 \r
22 import java.awt.*;\r
23 import java.awt.event.*;\r
24 \r
25 import jalview.datamodel.*;\r
26 \r
27 public class IdPanel\r
28     extends Panel implements MouseListener, MouseMotionListener\r
29 {\r
30 \r
31   protected IdCanvas idCanvas;\r
32   protected AlignViewport av;\r
33   protected AlignmentPanel alignPanel;\r
34   ScrollThread scrollThread = null;\r
35 \r
36   int offy;\r
37   int width;\r
38   int lastid = -1;\r
39   boolean mouseDragging = false;\r
40 \r
41   public IdPanel(AlignViewport av, AlignmentPanel parent)\r
42   {\r
43     this.av = av;\r
44     alignPanel = parent;\r
45     idCanvas = new IdCanvas(av);\r
46     setLayout(new BorderLayout());\r
47     add(idCanvas, BorderLayout.CENTER);\r
48     idCanvas.addMouseListener(this);\r
49     idCanvas.addMouseMotionListener(this);\r
50   }\r
51 \r
52   public void mouseMoved(MouseEvent e)\r
53   {}\r
54 \r
55   public void mouseDragged(MouseEvent e)\r
56   {\r
57     mouseDragging = true;\r
58 \r
59     int y = e.getY();\r
60     if (av.getWrapAlignment())\r
61     {\r
62       y -= 2 * av.charHeight;\r
63     }\r
64     int seq = av.getIndex(y);\r
65 \r
66     if (seq < 0)\r
67     {\r
68       return;\r
69     }\r
70 \r
71     if (seq < lastid)\r
72     {\r
73       selectSeqs(lastid - 1, seq);\r
74     }\r
75     else if (seq > lastid)\r
76     {\r
77       selectSeqs(lastid + 1, seq);\r
78     }\r
79 \r
80     lastid = seq;\r
81     alignPanel.repaint();\r
82   }\r
83 \r
84   public void mouseClicked(MouseEvent e)\r
85   {\r
86     if (e.getClickCount() == 2)\r
87     {\r
88       int y = e.getY();\r
89       if (av.getWrapAlignment())\r
90       {\r
91         y -= 2 * av.charHeight;\r
92       }\r
93 \r
94       int seq = av.getIndex(y);\r
95       String id = av.getAlignment().getSequenceAt(seq).getName();\r
96 \r
97       try\r
98       {\r
99         jalview.bin.JalviewLite.showURL(\r
100             "http://srs.ebi.ac.uk/srs7bin/cgi-bin/wgetz?-e+[swall-id:" + id +\r
101             "]+-vn+2");\r
102       }\r
103       catch (Exception ex)\r
104       {\r
105         ex.printStackTrace();\r
106       }\r
107     }\r
108 \r
109   }\r
110 \r
111   public void mouseEntered(MouseEvent e)\r
112   {\r
113     if (scrollThread != null)\r
114     {\r
115       scrollThread.running = false;\r
116     }\r
117   }\r
118 \r
119   public void mouseExited(MouseEvent e)\r
120   {\r
121     if (av.getWrapAlignment())\r
122     {\r
123       return;\r
124     }\r
125 \r
126     if (mouseDragging && e.getY() < 0 && av.getStartSeq() > 0)\r
127     {\r
128       scrollThread = new ScrollThread(true);\r
129     }\r
130 \r
131     if (mouseDragging && e.getY() >= getSize().height &&\r
132         av.alignment.getHeight() > av.getEndSeq())\r
133     {\r
134       scrollThread = new ScrollThread(false);\r
135     }\r
136   }\r
137 \r
138   public void mousePressed(MouseEvent e)\r
139   {\r
140     if (e.getClickCount() == 2)\r
141     {\r
142       return;\r
143     }\r
144 \r
145     int y = e.getY();\r
146     if (av.getWrapAlignment())\r
147     {\r
148       y -= 2 * av.charHeight;\r
149     }\r
150 \r
151     int seq = av.getIndex(y);\r
152     if (seq == -1)\r
153     {\r
154       return;\r
155     }\r
156 \r
157     if ( (e.getModifiers() & InputEvent.BUTTON3_MASK) ==\r
158         InputEvent.BUTTON3_MASK)\r
159     {\r
160       APopupMenu popup = new APopupMenu(alignPanel, null);\r
161       this.add(popup);\r
162       popup.show(this, e.getX(), e.getY());\r
163       return;\r
164     }\r
165 \r
166     if (!e.isControlDown() && !e.isShiftDown() &&\r
167         av.alignment.findGroup(av.alignment.getSequenceAt(seq)) != null)\r
168     {\r
169 \r
170       SequenceGroup selection = new SequenceGroup();\r
171       SequenceGroup sg = av.alignment.findGroup(av.alignment.getSequenceAt(seq));\r
172       selection.setStartRes(0);\r
173       selection.setEndRes(av.alignment.getWidth() - 1);\r
174       for (int i = 0; i < sg.getSize(); i++)\r
175       {\r
176         selection.addSequence(sg.getSequenceAt(i), true);\r
177       }\r
178 \r
179       av.setSelectionGroup(selection);\r
180       return;\r
181     }\r
182 \r
183     if (av.getSelectionGroup() == null ||\r
184         (!e.isControlDown() && av.getSelectionGroup() != null))\r
185     {\r
186       av.setSelectionGroup(new SequenceGroup());\r
187     }\r
188 \r
189     av.getSelectionGroup().setStartRes(0);\r
190     av.getSelectionGroup().setEndRes(av.alignment.getWidth() - 1);\r
191 \r
192     if (e.isShiftDown() && lastid != -1)\r
193     {\r
194       selectSeqs(lastid, seq);\r
195     }\r
196     else\r
197     {\r
198       selectSeq(seq);\r
199     }\r
200 \r
201     alignPanel.repaint();\r
202   }\r
203 \r
204   void selectSeq(int seq)\r
205   {\r
206     lastid = seq;\r
207     SequenceI pickedSeq = av.getAlignment().getSequenceAt(seq);\r
208     av.getSelectionGroup().addOrRemove(pickedSeq, false);\r
209   }\r
210 \r
211   void selectSeqs(int start, int end)\r
212   {\r
213 \r
214     lastid = start;\r
215     if (end < start)\r
216     {\r
217       int tmp = start;\r
218       start = end;\r
219       end = tmp;\r
220       lastid = end;\r
221     }\r
222 \r
223     for (int i = start; i <= end; i++)\r
224     {\r
225       av.getSelectionGroup().addSequence(av.getAlignment().getSequenceAt(i), false);\r
226     }\r
227 \r
228   }\r
229 \r
230   public void mouseReleased(MouseEvent e)\r
231   {\r
232     if (scrollThread != null)\r
233     {\r
234       scrollThread.running = false;\r
235     }\r
236 \r
237     if(av.getSelectionGroup()!=null)\r
238       av.getSelectionGroup().recalcConservation();\r
239 \r
240     mouseDragging = false;\r
241     PaintRefresher.Refresh(this, av.alignment);\r
242   }\r
243 \r
244   public void highlightSearchResults(java.util.Vector found)\r
245   {\r
246     idCanvas.setHighlighted(found);\r
247 \r
248     if (found == null)\r
249     {\r
250       return;\r
251     }\r
252 \r
253     int index = av.alignment.findIndex( (SequenceI) found.elementAt(0));\r
254 \r
255     // do we need to scroll the panel?\r
256     if (av.getStartSeq() > index || av.getEndSeq() < index)\r
257     {\r
258       alignPanel.setScrollValues(av.getStartRes(), index);\r
259     }\r
260   }\r
261 \r
262   // this class allows scrolling off the bottom of the visible alignment\r
263   class ScrollThread\r
264       extends Thread\r
265   {\r
266     boolean running = false;\r
267     boolean up = true;\r
268     public ScrollThread(boolean up)\r
269     {\r
270       this.up = up;\r
271       start();\r
272     }\r
273 \r
274     public void stopScrolling()\r
275     {\r
276       running = false;\r
277     }\r
278 \r
279     public void run()\r
280     {\r
281       running = true;\r
282       while (running)\r
283       {\r
284         if (alignPanel.scrollUp(up))\r
285         {\r
286           // scroll was ok, so add new sequence to selection\r
287           int seq = av.getStartSeq();\r
288           if (!up)\r
289           {\r
290             seq = av.getEndSeq();\r
291           }\r
292 \r
293           if (seq < lastid)\r
294           {\r
295             selectSeqs(lastid - 1, seq);\r
296           }\r
297           else if (seq > lastid)\r
298           {\r
299             selectSeqs(lastid + 1, seq);\r
300           }\r
301 \r
302           lastid = seq;\r
303         }\r
304         else\r
305         {\r
306           running = false;\r
307         }\r
308 \r
309         alignPanel.repaint();\r
310         try\r
311         {\r
312           Thread.sleep(100);\r
313         }\r
314         catch (Exception ex)\r
315         {}\r
316       }\r
317     }\r
318   }\r
319 \r
320 }\r