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