4236cf8666111e47e94d52752f77a892a294451f
[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 \r
20 package jalview.gui;\r
21 \r
22 import java.awt.*;\r
23 import java.awt.event.*;\r
24 \r
25 import jalview.datamodel.*;\r
26 \r
27 import javax.swing.*;\r
28 \r
29 public class IdPanel extends JPanel implements MouseListener, 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 \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     addMouseListener(this);\r
49     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     mouseDragging = true;\r
57 \r
58     int y = e.getY();\r
59     if(av.getWrapAlignment())\r
60       y-=2*av.charHeight;\r
61     int seq = av.getIndex(y);\r
62 \r
63     if(seq<0)\r
64       return;\r
65 \r
66     if (seq < lastid)\r
67       selectSeqs(lastid - 1, seq);\r
68     else if (seq > lastid)\r
69       selectSeqs(lastid + 1, seq);\r
70 \r
71     lastid = seq;\r
72     alignPanel.repaint();\r
73   }\r
74 \r
75   public void mouseClicked(MouseEvent e)\r
76   {\r
77     if (e.getClickCount() == 2)\r
78     {\r
79        int y = e.getY();\r
80        if(av.getWrapAlignment())\r
81          y-=2*av.charHeight;\r
82 \r
83        int seq = av.getIndex(y);\r
84        String id = av.getAlignment().getSequenceAt(seq).getName();\r
85 \r
86        try{\r
87          jalview.util.BrowserLauncher.openURL(\r
88              "http://srs.ebi.ac.uk/srs7bin/cgi-bin/wgetz?-e+[swall-id:" + id +\r
89              "]+-vn+2");\r
90        }catch(Exception ex){\r
91          // TODO: JBPNote : state dependent error message for real browserLaunch problems rather than unix misconfiguration.\r
92          System.err.println(\r
93              ex.getMessage()+"\nUnixers: Try adding this jalview.browser property line \n"\r
94              +"in your jalview.properties file (/usr/local/bin/firefox is an exanmple browser path):\n"\r
95              +"jalview.browser=/usr/local/bin/firefox\n");\r
96          //ex.printStackTrace();\r
97        }\r
98     }\r
99 \r
100   }\r
101   public void mouseEntered(MouseEvent e)\r
102   {\r
103     if(scrollThread!=null)\r
104       scrollThread.running = false;\r
105   }\r
106 \r
107   public void mouseExited (MouseEvent e)\r
108   {\r
109     if(av.getWrapAlignment())\r
110       return;\r
111 \r
112     if(mouseDragging && e.getY()<0 && av.getStartSeq()>0)\r
113     {\r
114       scrollThread = new ScrollThread(true);\r
115     }\r
116 \r
117     if(mouseDragging && e.getY()>=getHeight() && av.alignment.getHeight()>av.getEndSeq())\r
118     {\r
119       scrollThread = new ScrollThread(false);\r
120     }\r
121   }\r
122 \r
123 \r
124   public void mousePressed(MouseEvent e) {\r
125     if (e.getClickCount() == 2)\r
126       return;\r
127 \r
128     int y = e.getY();\r
129     if(av.getWrapAlignment())\r
130       y-=2*av.charHeight;\r
131 \r
132     int seq = av.getIndex(y);\r
133     if (seq == -1)\r
134       return;\r
135 \r
136     if (javax.swing.SwingUtilities.isRightMouseButton(e))\r
137     {\r
138       jalview.gui.PopupMenu pop = new jalview.gui.PopupMenu(alignPanel,\r
139           (Sequence)av.getAlignment().getSequenceAt(seq));\r
140       pop.show(this, e.getX(), y);\r
141       return;\r
142     }\r
143 \r
144     if(!e.isControlDown() && !e.isShiftDown() && av.alignment.findGroup( av.alignment.getSequenceAt(seq))!=null)\r
145     {\r
146 \r
147       SequenceGroup selection = new SequenceGroup();\r
148       SequenceGroup sg = av.alignment.findGroup(av.alignment.getSequenceAt(seq));\r
149       selection.setStartRes(0);\r
150       selection.setEndRes(av.alignment.getWidth()-1);\r
151       for (int i =0; i< sg.getSize(); i++)\r
152         selection.addSequence(sg.getSequenceAt(i));\r
153 \r
154       av.setSelectionGroup(selection);\r
155       return;\r
156     }\r
157 \r
158     if(av.getSelectionGroup()==null || ( !e.isControlDown() && av.getSelectionGroup()!=null))\r
159       av.setSelectionGroup(new SequenceGroup());\r
160 \r
161     av.getSelectionGroup().setStartRes(0);\r
162     av.getSelectionGroup().setEndRes(av.alignment.getWidth()-1);\r
163 \r
164     if(e.isShiftDown() && lastid!=-1)\r
165       selectSeqs(lastid, seq);\r
166     else\r
167       selectSeq(seq);\r
168 \r
169     alignPanel.repaint();\r
170   }\r
171 \r
172   void selectSeq(int seq)\r
173   {\r
174     lastid = seq;\r
175     SequenceI pickedSeq = av.getAlignment().getSequenceAt(seq);\r
176     av.getSelectionGroup().addOrRemove(pickedSeq);\r
177   }\r
178 \r
179   void selectSeqs(int start, int end) {\r
180 \r
181     lastid = start;\r
182     if (end < start)\r
183      {\r
184        int tmp = start;\r
185        start = end;\r
186        end   = tmp;\r
187        lastid = end;\r
188      }\r
189 \r
190      for (int i = start; i <= end; i++)\r
191         av.getSelectionGroup().addSequence(av.getAlignment().getSequenceAt(i));\r
192 \r
193    }\r
194 \r
195 \r
196   public void mouseReleased(MouseEvent e)\r
197   {\r
198     if(scrollThread!=null)\r
199       scrollThread.running = false;\r
200 \r
201     mouseDragging = false;\r
202     PaintRefresher.Refresh(this);\r
203   }\r
204 \r
205   public void highlightSearchResults( java.util.Vector found )\r
206   {\r
207     idCanvas.setHighlighted( found );\r
208 \r
209     if(found == null)\r
210       return;\r
211 \r
212     int index = av.alignment.findIndex( (SequenceI)found.get(0));\r
213 \r
214     // do we need to scroll the panel?\r
215     if(av.getStartSeq()>index || av.getEndSeq()<index)\r
216         alignPanel.setScrollValues( av.getStartRes(), index);\r
217   }\r
218 \r
219   // this class allows scrolling off the bottom of the visible alignment\r
220   class ScrollThread\r
221       extends Thread\r
222   {\r
223     boolean running = false;\r
224     boolean up = true;\r
225     public ScrollThread(boolean up)\r
226     {\r
227       this.up = up;\r
228       start();\r
229     }\r
230 \r
231     public void stopScrolling()\r
232     {\r
233       running = false;\r
234     }\r
235 \r
236     public void run()\r
237     {\r
238       running = true;\r
239       while (running)\r
240       {\r
241         if(alignPanel.scrollUp(up))\r
242         {\r
243           // scroll was ok, so add new sequence to selection\r
244           int seq = av.getStartSeq();\r
245           if(!up)\r
246             seq = av.getEndSeq();\r
247 \r
248           if (seq < lastid)\r
249             selectSeqs(lastid - 1, seq);\r
250           else if (seq > lastid)\r
251             selectSeqs(lastid + 1, seq);\r
252 \r
253           lastid = seq;\r
254         }\r
255         else\r
256           running = false;\r
257 \r
258         alignPanel.repaint();\r
259         try\r
260         {\r
261           Thread.sleep(100);\r
262         }\r
263         catch (Exception ex)\r
264         {}\r
265       }\r
266     }\r
267 }\r
268 \r
269 }\r