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