recovery of identical dataset sequence object on undo (rather than creation of a...
[jalview.git] / src / jalview / appletgui / IdPanel.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer\r
3  * Copyright (C) 2007 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   java.util.Vector links = new java.util.Vector();\r
41 \r
42   public IdPanel(AlignViewport av, AlignmentPanel parent)\r
43   {\r
44     this.av = av;\r
45     alignPanel = parent;\r
46     idCanvas = new IdCanvas(av);\r
47     setLayout(new BorderLayout());\r
48     add(idCanvas, BorderLayout.CENTER);\r
49     idCanvas.addMouseListener(this);\r
50     idCanvas.addMouseMotionListener(this);\r
51 \r
52     String label, url;\r
53     if (av.applet != null)\r
54     {\r
55       for (int i = 1; i < 10; i++)\r
56       {\r
57         label = av.applet.getParameter("linkLabel_" + i);\r
58         url = av.applet.getParameter("linkURL_" + i);\r
59 \r
60         if (label != null && url != null)\r
61         {\r
62           links.addElement(label + "|" + url);\r
63         }\r
64 \r
65       }\r
66     }\r
67     if (links.size() < 1)\r
68     {\r
69       links = new java.util.Vector();\r
70       links.addElement("SRS|http://srs.ebi.ac.uk/srsbin/cgi-bin/wgetz?-newId+(([uniprot-all:$SEQUENCE_ID$]))+-view+SwissEntry");\r
71     }\r
72   }\r
73 \r
74   Tooltip tooltip;\r
75   public void mouseMoved(MouseEvent e)\r
76   {\r
77     int seq = alignPanel.seqPanel.findSeq(e);\r
78 \r
79     SequenceI sequence = av.getAlignment().getSequenceAt(seq);\r
80 \r
81     if (sequence.getDescription() == null)\r
82     {\r
83       if (tooltip != null)\r
84       {\r
85         tooltip.setVisible(false);\r
86       }\r
87       tooltip = null;\r
88       return;\r
89     }\r
90 \r
91     if (tooltip == null)\r
92     {\r
93       tooltip = new Tooltip(\r
94           sequence.getDisplayId(true)\r
95           + "\n" + sequence.getDescription(), idCanvas);\r
96     }\r
97     else\r
98     {\r
99       tooltip.setTip(sequence.getDisplayId(true)\r
100                      + "\n" + sequence.getDescription());\r
101     }\r
102   }\r
103 \r
104   public void mouseDragged(MouseEvent e)\r
105   {\r
106     mouseDragging = true;\r
107 \r
108     int seq = Math.max(0, alignPanel.seqPanel.findSeq(e));\r
109 \r
110     if (seq < lastid)\r
111     {\r
112       selectSeqs(lastid - 1, seq);\r
113     }\r
114     else if (seq > lastid)\r
115     {\r
116       selectSeqs(lastid + 1, seq);\r
117     }\r
118 \r
119     lastid = seq;\r
120     alignPanel.paintAlignment(false);\r
121   }\r
122 \r
123   public void mouseClicked(MouseEvent e)\r
124   {\r
125     if (e.getClickCount() < 2)\r
126     {\r
127       return;\r
128     }\r
129 \r
130     //DEFAULT LINK IS FIRST IN THE LINK LIST\r
131     int seq = alignPanel.seqPanel.findSeq(e);\r
132     String id = av.getAlignment().getSequenceAt(seq).getName();\r
133     if (id.indexOf("|") > -1)\r
134     {\r
135       id = id.substring(id.lastIndexOf("|") + 1);\r
136     }\r
137 \r
138     String target = links.elementAt(0).toString();\r
139     target = target.substring(0, target.indexOf("|"));\r
140     String url = links.elementAt(0).toString();\r
141     url = url.substring(url.indexOf("|") + 1);\r
142 \r
143     int index = url.indexOf("$SEQUENCE_ID$");\r
144     url = url.substring(0, index) + id + url.substring(index + 13);\r
145 \r
146     try\r
147     {\r
148 \r
149       alignPanel.alignFrame.showURL(url, target);\r
150     }\r
151     catch (Exception ex)\r
152     {\r
153       ex.printStackTrace();\r
154     }\r
155   }\r
156 \r
157   public void mouseEntered(MouseEvent e)\r
158   {\r
159     if (scrollThread != null)\r
160     {\r
161       scrollThread.running = false;\r
162     }\r
163   }\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() >= getSize().height &&\r
178         av.alignment.getHeight() > av.getEndSeq())\r
179     {\r
180       scrollThread = new ScrollThread(false);\r
181     }\r
182   }\r
183 \r
184   public void mousePressed(MouseEvent e)\r
185   {\r
186     if (e.getClickCount() > 1)\r
187     {\r
188       return;\r
189     }\r
190 \r
191     int y = e.getY();\r
192     if (av.getWrapAlignment())\r
193     {\r
194       y -= 2 * av.charHeight;\r
195     }\r
196 \r
197     int seq = alignPanel.seqPanel.findSeq(e);\r
198 \r
199     if ( (e.getModifiers() & InputEvent.BUTTON3_MASK) ==\r
200         InputEvent.BUTTON3_MASK)\r
201     {\r
202       APopupMenu popup = new APopupMenu(alignPanel,\r
203                                         (Sequence) av.getAlignment().\r
204                                         getSequenceAt(seq), links);\r
205       this.add(popup);\r
206       popup.show(this, e.getX(), e.getY());\r
207       return;\r
208     }\r
209 \r
210     if ( (av.getSelectionGroup() == null) ||\r
211         ( (!e.isControlDown() && !e.isShiftDown()) && av.getSelectionGroup() != null))\r
212     {\r
213       av.setSelectionGroup(new SequenceGroup());\r
214       av.getSelectionGroup().setStartRes(0);\r
215       av.getSelectionGroup().setEndRes(av.alignment.getWidth() - 1);\r
216     }\r
217 \r
218     if (e.isShiftDown() && lastid != -1)\r
219     {\r
220       selectSeqs(lastid, seq);\r
221     }\r
222     else\r
223     {\r
224       selectSeq(seq);\r
225     }\r
226 \r
227     alignPanel.paintAlignment(false);\r
228   }\r
229 \r
230   void selectSeq(int seq)\r
231   {\r
232     lastid = seq;\r
233     SequenceI pickedSeq = av.getAlignment().getSequenceAt(seq);\r
234     av.getSelectionGroup().addOrRemove(pickedSeq, false);\r
235   }\r
236 \r
237   void selectSeqs(int start, int end)\r
238   {\r
239 \r
240     lastid = start;\r
241 \r
242     if (end >= av.getAlignment().getHeight())\r
243     {\r
244       end = av.getAlignment().getHeight() - 1;\r
245     }\r
246 \r
247     if (end < start)\r
248     {\r
249       int tmp = start;\r
250       start = end;\r
251       end = tmp;\r
252       lastid = end;\r
253     }\r
254 \r
255     for (int i = start; i <= end; i++)\r
256     {\r
257       av.getSelectionGroup().addSequence(av.getAlignment().getSequenceAt(i), false);\r
258     }\r
259 \r
260   }\r
261 \r
262   public void mouseReleased(MouseEvent e)\r
263   {\r
264     if (scrollThread != null)\r
265     {\r
266       scrollThread.running = false;\r
267     }\r
268 \r
269     if (av.getSelectionGroup() != null)\r
270     {\r
271       av.getSelectionGroup().recalcConservation();\r
272     }\r
273 \r
274     mouseDragging = false;\r
275     PaintRefresher.Refresh(this, av.getSequenceSetId());\r
276   }\r
277 \r
278   public void highlightSearchResults(java.util.Vector found)\r
279   {\r
280     idCanvas.setHighlighted(found);\r
281 \r
282     if (found == null)\r
283     {\r
284       return;\r
285     }\r
286 \r
287     int index = av.alignment.findIndex( (SequenceI) found.elementAt(0));\r
288 \r
289     // do we need to scroll the panel?\r
290     if (av.getStartSeq() > index || av.getEndSeq() < index)\r
291     {\r
292       alignPanel.setScrollValues(av.getStartRes(), index);\r
293     }\r
294   }\r
295 \r
296   // this class allows scrolling off the bottom of the visible alignment\r
297   class ScrollThread\r
298       extends Thread\r
299   {\r
300     boolean running = false;\r
301     boolean up = true;\r
302     public ScrollThread(boolean up)\r
303     {\r
304       this.up = up;\r
305       start();\r
306     }\r
307 \r
308     public void stopScrolling()\r
309     {\r
310       running = false;\r
311     }\r
312 \r
313     public void run()\r
314     {\r
315       running = true;\r
316       while (running)\r
317       {\r
318         if (alignPanel.scrollUp(up))\r
319         {\r
320           // scroll was ok, so add new sequence to selection\r
321           int seq = av.getStartSeq();\r
322           if (!up)\r
323           {\r
324             seq = av.getEndSeq();\r
325           }\r
326 \r
327           if (seq < lastid)\r
328           {\r
329             selectSeqs(lastid - 1, seq);\r
330           }\r
331           else if (seq > lastid && seq < av.alignment.getHeight())\r
332           {\r
333             selectSeqs(lastid + 1, seq);\r
334           }\r
335 \r
336           lastid = seq;\r
337         }\r
338         else\r
339         {\r
340           running = false;\r
341         }\r
342 \r
343         alignPanel.paintAlignment(true);\r
344         try\r
345         {\r
346           Thread.sleep(100);\r
347         }\r
348         catch (Exception ex)\r
349         {}\r
350       }\r
351     }\r
352   }\r
353 \r
354 }\r