search ids added
[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){ex.printStackTrace();}\r
72     }\r
73 \r
74   }\r
75   public void mouseEntered(MouseEvent e)\r
76   {\r
77     if(scrollThread!=null)\r
78       scrollThread.running = false;\r
79   }\r
80 \r
81   public void mouseExited (MouseEvent e)\r
82   {\r
83     if(av.getWrapAlignment())\r
84       return;\r
85 \r
86     if(mouseDragging && e.getY()<0 && av.getStartSeq()>0)\r
87     {\r
88       scrollThread = new ScrollThread(true);\r
89     }\r
90 \r
91     if(mouseDragging && e.getY()>=getHeight() && av.alignment.getHeight()>av.getEndSeq())\r
92     {\r
93       scrollThread = new ScrollThread(false);\r
94     }\r
95   }\r
96 \r
97 \r
98   public void mousePressed(MouseEvent e) {\r
99     if (e.getClickCount() == 2)\r
100       return;\r
101 \r
102     int y = e.getY();\r
103     if(av.getWrapAlignment())\r
104       y-=2*av.charHeight;\r
105 \r
106     int seq = av.getIndex(y);\r
107     if (seq == -1)\r
108       return;\r
109 \r
110     if (javax.swing.SwingUtilities.isRightMouseButton(e))\r
111     {\r
112       jalview.gui.PopupMenu pop = new jalview.gui.PopupMenu(alignPanel,\r
113           (Sequence)av.getAlignment().getSequenceAt(seq));\r
114       pop.show(this, e.getX(), y);\r
115       return;\r
116     }\r
117 \r
118     if(!e.isControlDown() && !e.isShiftDown() && av.alignment.findGroup( av.alignment.getSequenceAt(seq))!=null)\r
119     {\r
120 \r
121       SequenceGroup selection = new SequenceGroup();\r
122       SequenceGroup sg = av.alignment.findGroup(av.alignment.getSequenceAt(seq));\r
123       selection.setStartRes(0);\r
124       selection.setEndRes(av.alignment.getWidth()-1);\r
125       for (int i =0; i< sg.getSize(); i++)\r
126         selection.addSequence(sg.getSequenceAt(i));\r
127 \r
128       av.setSelectionGroup(selection);\r
129       return;\r
130     }\r
131 \r
132     if(av.getSelectionGroup()==null || ( !e.isControlDown() && av.getSelectionGroup()!=null))\r
133       av.setSelectionGroup(new SequenceGroup());\r
134 \r
135     av.getSelectionGroup().setStartRes(0);\r
136     av.getSelectionGroup().setEndRes(av.alignment.getWidth()-1);\r
137 \r
138     if(e.isShiftDown() && lastid!=-1)\r
139       selectSeqs(lastid, seq);\r
140     else\r
141       selectSeq(seq);\r
142 \r
143     alignPanel.repaint();\r
144   }\r
145 \r
146   void selectSeq(int seq)\r
147   {\r
148     lastid = seq;\r
149     SequenceI pickedSeq = av.getAlignment().getSequenceAt(seq);\r
150     av.getSelectionGroup().addOrRemove(pickedSeq);\r
151   }\r
152 \r
153   void selectSeqs(int start, int end) {\r
154 \r
155     lastid = start;\r
156     if (end < start)\r
157      {\r
158        int tmp = start;\r
159        start = end;\r
160        end   = tmp;\r
161        lastid = end;\r
162      }\r
163 \r
164      for (int i = start; i <= end; i++)\r
165         av.getSelectionGroup().addSequence(av.getAlignment().getSequenceAt(i));\r
166 \r
167    }\r
168 \r
169 \r
170   public void mouseReleased(MouseEvent e)\r
171   {\r
172     if(scrollThread!=null)\r
173       scrollThread.running = false;\r
174 \r
175     mouseDragging = false;\r
176     PaintRefresher.Refresh(this);\r
177   }\r
178 \r
179   public void highlightSearchResults( java.util.ArrayList found )\r
180   {\r
181     idCanvas.setHighlighted( found );\r
182 \r
183     if(found == null)\r
184       return;\r
185 \r
186     int index = av.alignment.findIndex( (SequenceI)found.get(0));\r
187 \r
188     // do we need to scroll the panel?\r
189     if(av.getStartSeq()>index || av.getEndSeq()<index)\r
190         alignPanel.setScrollValues( av.getStartRes(), index);\r
191   }\r
192 \r
193   // this class allows scrolling off the bottom of the visible alignment\r
194   class ScrollThread\r
195       extends Thread\r
196   {\r
197     boolean running = false;\r
198     boolean up = true;\r
199     public ScrollThread(boolean up)\r
200     {\r
201       this.up = up;\r
202       start();\r
203     }\r
204 \r
205     public void stopScrolling()\r
206     {\r
207       running = false;\r
208     }\r
209 \r
210     public void run()\r
211     {\r
212       running = true;\r
213       while (running)\r
214       {\r
215         if(alignPanel.scrollUp(up))\r
216         {\r
217           // scroll was ok, so add new sequence to selection\r
218           int seq = av.getStartSeq();\r
219           if(!up)\r
220             seq = av.getEndSeq();\r
221 \r
222           if (seq < lastid)\r
223             selectSeqs(lastid - 1, seq);\r
224           else if (seq > lastid)\r
225             selectSeqs(lastid + 1, seq);\r
226 \r
227           lastid = seq;\r
228         }\r
229         else\r
230           running = false;\r
231 \r
232         alignPanel.repaint();\r
233         try\r
234         {\r
235           Thread.sleep(100);\r
236         }\r
237         catch (Exception ex)\r
238         {}\r
239       }\r
240     }\r
241 }\r
242 \r
243 }\r