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