Applet files
[jalview.git] / src / jalview / appletgui / AlignmentPanel.java
1 package jalview.appletgui;\r
2 \r
3 import jalview.jbappletgui.GAlignmentPanel;\r
4 import jalview.schemes.*;\r
5 import jalview.analysis.*;\r
6 import jalview.datamodel.*;\r
7 import java.awt.*;\r
8 import java.awt.event.*;\r
9 \r
10 public class AlignmentPanel extends GAlignmentPanel implements AdjustmentListener\r
11 {\r
12 \r
13   AlignViewport     av;\r
14   OverviewPanel overviewPanel;\r
15   SeqPanel   seqPanel;\r
16   IdPanel    idPanel;\r
17   IdwidthAdjuster idwidthAdjuster;\r
18   public AlignFrame alignFrame;\r
19   ScalePanel scalePanel;\r
20   AnnotationPanel annotationPanel;\r
21   AnnotationLabels alabels;\r
22 \r
23   // this value is set false when selection area being dragged\r
24   boolean fastPaint = true;\r
25 \r
26   public AlignmentPanel(AlignFrame af, final AlignViewport av)\r
27   {\r
28     alignFrame = af;\r
29     this.av         = av;\r
30     seqPanel        = new SeqPanel  (av, this);\r
31     idPanel         = new IdPanel   (av, this);\r
32     scalePanel      = new ScalePanel(av, this);\r
33     idwidthAdjuster = new IdwidthAdjuster(this);\r
34     annotationPanel = new AnnotationPanel(this);\r
35     alabels         = new AnnotationLabels(this);\r
36 \r
37 \r
38     idPanelHolder.add(idPanel, BorderLayout.CENTER);\r
39     idSpaceFillerPanel1.add(idwidthAdjuster, BorderLayout.CENTER);\r
40     annotationScroller.add(annotationPanel);\r
41     annotationSpaceFillerHolder.add(alabels, BorderLayout.CENTER);\r
42     scalePanelHolder.add(scalePanel, BorderLayout.CENTER);\r
43     seqPanelHolder.add(seqPanel, BorderLayout.CENTER);\r
44 \r
45     fontChanged();\r
46     setScrollValues(0, 0);\r
47 \r
48     hscroll.addAdjustmentListener(this);\r
49     vscroll.addAdjustmentListener(this);\r
50 \r
51    seqPanel.seqCanvas.addKeyListener( new MyKeyAdapter() );\r
52    idPanel.idCanvas.addKeyListener( new MyKeyAdapter() );\r
53 \r
54    addComponentListener(new ComponentAdapter()\r
55      {\r
56        public void componentResized(ComponentEvent evt)\r
57        {\r
58          setScrollValues(av.getStartRes(), av.getStartSeq());\r
59          repaint();\r
60        }\r
61      });\r
62 \r
63      Dimension d = calculateIdWidth();\r
64      idPanel.idCanvas.setSize(d);\r
65 \r
66      hscrollFillerPanel.setSize(d.width, annotationPanel.getSize().height);\r
67      annotationScroller.setSize(annotationPanel.getSize());\r
68 \r
69      idPanel.idCanvas.setSize(d.width, seqPanel.seqCanvas.getSize().height);\r
70      annotationSpaceFillerHolder.setSize(d.width,annotationPanel.getSize().height);\r
71      alabels.setSize(d.width,annotationPanel.getSize().height);\r
72 \r
73   }\r
74 \r
75   class MyKeyAdapter extends KeyAdapter\r
76   {\r
77      public void keyPressed(KeyEvent evt)\r
78      {\r
79        switch(evt.getKeyCode())\r
80        {\r
81          case  27: // escape key\r
82            av.setSelectionGroup(null);\r
83            alignFrame.alignPanel.repaint();\r
84            break;\r
85          case KeyEvent.VK_X:\r
86            if(evt.isControlDown())\r
87            alignFrame.cut_actionPerformed(null);\r
88            break;\r
89          case KeyEvent.VK_C:\r
90          if(evt.isControlDown())\r
91            alignFrame.copy_actionPerformed(null);\r
92            break;\r
93          case KeyEvent.VK_V:\r
94           if(evt.isControlDown())\r
95            alignFrame.paste(true);\r
96            break;\r
97          case KeyEvent.VK_A:\r
98          if(evt.isControlDown())\r
99            alignFrame.selectAllSequenceMenuItem_actionPerformed(null);\r
100            break;\r
101         case KeyEvent.VK_DOWN:\r
102           alignFrame.moveSelectedSequences(false);\r
103           break;\r
104         case KeyEvent.VK_UP:\r
105           alignFrame.moveSelectedSequences(true);\r
106           break;\r
107         case KeyEvent.VK_F:\r
108          if(evt.isControlDown())\r
109           alignFrame.findMenuItem_actionPerformed(null);\r
110           break;\r
111        }\r
112      }\r
113   }\r
114 \r
115   public void fontChanged()\r
116   {\r
117     // set idCanvas bufferedImage to null\r
118     // to prevent drawing old image\r
119     FontMetrics fm = getFontMetrics(av.getFont());\r
120 \r
121     scalePanel.setSize(new Dimension(10, av.charHeight+fm.getDescent()));\r
122     idwidthAdjuster.setSize(new Dimension(10, av.charHeight+fm.getDescent()));\r
123 \r
124     annotationPanel.adjustPanelHeight();\r
125     annotationPanel.repaint();\r
126     Dimension d = calculateIdWidth();\r
127     d.setSize(d.width + 4, seqPanel.seqCanvas.getSize().height);\r
128     idPanel.idCanvas.setSize(d);\r
129     hscrollFillerPanel.setSize(d);\r
130 \r
131     alignFrame.pack();\r
132   }\r
133 \r
134   public void setIdWidth(int w, int h)\r
135   {\r
136     idPanel.idCanvas.setSize(w,h);\r
137     idPanelHolder.setSize(w,idPanelHolder.getSize().height);\r
138     alabels.setSize(w,alabels.getSize().height);\r
139     validate();\r
140   }\r
141   Dimension calculateIdWidth()\r
142   {\r
143     Frame frame = new Frame();\r
144     frame.addNotify();\r
145     Graphics g = frame.getGraphics();\r
146     if(g==null)\r
147     {\r
148       Frame f = new Frame();\r
149       f.addNotify();\r
150       g = f.getGraphics();\r
151     }\r
152 \r
153     FontMetrics fm = g.getFontMetrics(av.font);\r
154     AlignmentI al = av.getAlignment();\r
155 \r
156        int i   = 0;\r
157        int idWidth = 0;\r
158        String id;\r
159        while (i < al.getHeight() && al.getSequenceAt(i) != null)\r
160        {\r
161          SequenceI s   = al.getSequenceAt(i);\r
162          if(av.getShowFullId())\r
163            id   = s.getDisplayId();\r
164          else\r
165            id = s.getName();\r
166 \r
167          if (fm.stringWidth(id) > idWidth)\r
168            idWidth = fm.stringWidth(id);\r
169          i++;\r
170        }\r
171 \r
172        // Also check annotation label widths\r
173        i=0;\r
174        if(al.getAlignmentAnnotation()!=null)\r
175        {\r
176          fm = g.getFontMetrics(frame.getFont());\r
177          while (i < al.getAlignmentAnnotation().length)\r
178          {\r
179            String label = al.getAlignmentAnnotation()[i].label;\r
180            if (fm.stringWidth(label) > idWidth)\r
181              idWidth = fm.stringWidth(label);\r
182            i++;\r
183          }\r
184        }\r
185 \r
186        return new Dimension(idWidth, idPanel.idCanvas.getSize().height);\r
187   }\r
188 \r
189 \r
190  public void highlightSearchResults(int [] results)\r
191  {\r
192    seqPanel.seqCanvas.highlightSearchResults( results );\r
193 \r
194    // do we need to scroll the panel?\r
195    if(results!=null && (av.getStartSeq()>results[0]\r
196                         || av.getEndSeq()<results[0]\r
197                         || av.getStartRes()>results[1]\r
198                         || av.getEndRes()<results[2]))\r
199        setScrollValues(results[1], results[0]);\r
200 \r
201 \r
202  }\r
203 \r
204 \r
205  public OverviewPanel getOverviewPanel()\r
206  {\r
207    return overviewPanel;\r
208  }\r
209 \r
210  public void setOverviewPanel(OverviewPanel op)\r
211  {\r
212    overviewPanel = op;\r
213  }\r
214 \r
215 \r
216   public void setAnnotationVisible(boolean b)\r
217   {\r
218     annotationSpaceFillerHolder.setVisible(b);\r
219     annotationScroller.setVisible(b);\r
220   }\r
221 \r
222 \r
223   public void setWrapAlignment(boolean wrap)\r
224   {\r
225     scalePanelHolder.setVisible(!wrap);\r
226     hscroll.setVisible(!wrap);\r
227     idwidthAdjuster.setVisible(!wrap);\r
228 \r
229     av.setShowAnnotation(!wrap);\r
230     annotationScroller.setVisible(!wrap);\r
231     annotationSpaceFillerHolder.setVisible(!wrap);\r
232     idSpaceFillerPanel1.setVisible(!wrap);\r
233 \r
234     repaint();\r
235 \r
236   }\r
237 \r
238 \r
239   public void setColourScheme()\r
240   {\r
241     ColourSchemeI cs = av.getGlobalColourScheme();\r
242 \r
243     if(av.getConservationSelected())\r
244     {\r
245 \r
246        Alignment al = (Alignment)av.getAlignment();\r
247        Conservation c = new Conservation("All",\r
248                             ResidueProperties.propHash, 3, al.getSequences(), 0,\r
249                             al.getWidth() );\r
250 \r
251        c.calculate();\r
252        c.verdict(false, av.ConsPercGaps);\r
253        ConservationColourScheme ccs = new ConservationColourScheme(c, cs);\r
254 \r
255        av.setGlobalColourScheme( ccs );\r
256 \r
257     }\r
258 \r
259     repaint();\r
260   }\r
261 \r
262 \r
263   int hextent = 0;\r
264   int vextent = 0;\r
265 \r
266   // return value is true if the scroll is valid\r
267   public boolean scrollUp(boolean up)\r
268   {\r
269     if(up)\r
270     {\r
271       if(vscroll.getValue()<1)\r
272         return false;\r
273       fastPaint  = false;\r
274       vscroll.setValue(vscroll.getValue() - 1);\r
275     }\r
276     else\r
277     {\r
278      if(vextent+vscroll.getValue() >= av.getAlignment().getHeight())\r
279        return false;\r
280       fastPaint  = false;\r
281       vscroll.setValue(vscroll.getValue() + 1);\r
282     }\r
283     fastPaint = true;\r
284     return true;\r
285   }\r
286 \r
287   public boolean scrollRight(boolean right)\r
288   {\r
289 \r
290     if (right)\r
291     {\r
292       if (hscroll.getValue() < 1)\r
293         return false;\r
294       fastPaint = false;\r
295       hscroll.setValue(hscroll.getValue() - 1);\r
296     }\r
297     else\r
298     {\r
299       if (hextent + hscroll.getValue() >= av.getAlignment().getWidth())\r
300         return false;\r
301       fastPaint = false;\r
302       hscroll.setValue(hscroll.getValue() + 1);\r
303     }\r
304     fastPaint = true;\r
305     return true;\r
306   }\r
307 \r
308 \r
309   public void setScrollValues(int x, int y)\r
310   {\r
311 \r
312     av.setStartRes(x);\r
313     av.setStartSeq(y);\r
314     av.setEndRes(x + seqPanel.seqCanvas.getSize().width/av.getCharWidth()-1);\r
315 \r
316     hextent = seqPanel.seqCanvas.getSize().width/av.charWidth;\r
317     vextent = seqPanel.seqCanvas.getSize().height/av.charHeight;\r
318 \r
319     if(hextent > av.alignment.getWidth())\r
320       hextent = av.alignment.getWidth();\r
321     if(vextent > av.alignment.getHeight())\r
322       vextent = av.alignment.getHeight();\r
323 \r
324     if(hextent+x  >  av.getAlignment().getWidth())\r
325       x =  av.getAlignment().getWidth()- hextent;\r
326 \r
327     if(vextent+y > av.getAlignment().getHeight())\r
328       y = av.getAlignment().getHeight() - vextent;\r
329 \r
330     if(y<0)\r
331       y = 0;\r
332 \r
333     if(x<0)\r
334       x=0;\r
335 \r
336 \r
337     int endSeq = y + vextent;\r
338     if(endSeq>av.alignment.getHeight())\r
339       endSeq = av.alignment.getHeight();\r
340 \r
341 \r
342     av.setEndSeq( endSeq );\r
343     hscroll.setValues(x,hextent,0,av.getAlignment().getWidth());\r
344     vscroll.setValues(y,vextent,0,av.getAlignment().getHeight() );\r
345 \r
346   }\r
347 \r
348 \r
349   public void adjustmentValueChanged(AdjustmentEvent evt)\r
350   {\r
351     int oldX = av.getStartRes();\r
352     int oldY = av.getStartSeq();\r
353 \r
354     if (evt.getSource() == hscroll)\r
355     {\r
356       int x = hscroll.getValue();\r
357       av.setStartRes(x);\r
358       av.setEndRes(x + seqPanel.seqCanvas.getSize().width/av.getCharWidth()-1);\r
359     }\r
360 \r
361     if (evt.getSource() == vscroll)\r
362     {\r
363       int offy = vscroll.getValue();\r
364       if (av.getWrapAlignment())\r
365       {\r
366         int rowSize = seqPanel.seqCanvas.getWrappedCanvasWidth(seqPanel.seqCanvas.getSize().width);\r
367         av.setStartRes( vscroll.getValue() * rowSize );\r
368         av.setEndRes( (vscroll.getValue()+1) * rowSize );\r
369       }\r
370       else\r
371       {\r
372         av.setStartSeq(offy);\r
373         av.setEndSeq(offy + seqPanel.seqCanvas.getSize().height / av.getCharHeight());\r
374       }\r
375     }\r
376 \r
377     if(overviewPanel!=null)\r
378       overviewPanel.setBoxPosition();\r
379 \r
380     if(av.getWrapAlignment() || !fastPaint)\r
381       repaint();\r
382     else\r
383     {\r
384       idPanel.idCanvas.fastPaint(av.getStartSeq() - oldY);\r
385       seqPanel.seqCanvas.fastPaint(av.getStartRes() - oldX,\r
386                                    av.getStartSeq() - oldY);\r
387 \r
388       scalePanel.repaint();\r
389       if (av.getShowAnnotation())\r
390         annotationPanel.fastPaint(av.getStartRes() - oldX);\r
391     }\r
392 \r
393   }\r
394 \r
395   public void update(Graphics g)\r
396   {\r
397     paint (g);\r
398   }\r
399 \r
400 \r
401   public void paint(Graphics g)\r
402   {\r
403     Dimension d = idPanel.idCanvas.getSize();\r
404     idPanel.idCanvas.setSize(d.width, seqPanel.seqCanvas.getSize().height);\r
405     annotationSpaceFillerHolder.setSize(d.width,annotationPanel.getSize().height);\r
406     alabels.setSize(d.width,annotationPanel.getSize().height);\r
407 \r
408     alabels.repaint();\r
409     idPanel.idCanvas.repaint();\r
410     seqPanel.seqCanvas.repaint();\r
411     scalePanel.repaint();\r
412     annotationPanel.repaint();\r
413 \r
414 \r
415     if (av.getWrapAlignment())\r
416     {\r
417       int max = av.alignment.getWidth() / seqPanel.seqCanvas.getWrappedCanvasWidth(seqPanel.seqCanvas.getSize().width);\r
418       vscroll.setMaximum(max);\r
419       vscroll.setUnitIncrement(1);\r
420       vscroll.setVisibleAmount(1);\r
421     }\r
422     else\r
423     {\r
424       setScrollValues(av.getStartRes(), av.getStartSeq());\r
425     }\r
426 \r
427 \r
428 \r
429   }\r
430 }\r