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