tidied up system.out messages and moved many to stderr.
[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        // System.out.println(evt.getKeyCode()); log.\r
80        switch(evt.getKeyCode())\r
81        {\r
82          case  27: // escape key\r
83            av.setSelectionGroup(null);\r
84            alignFrame.alignPanel.repaint();\r
85            break;\r
86          case KeyEvent.VK_X:\r
87            if(evt.isControlDown())\r
88            alignFrame.cut_actionPerformed(null);\r
89            break;\r
90          case KeyEvent.VK_C:\r
91          if(evt.isControlDown())\r
92            alignFrame.copy_actionPerformed(null);\r
93            break;\r
94          case KeyEvent.VK_V:\r
95           if(evt.isControlDown())\r
96            alignFrame.paste(true);\r
97            break;\r
98          case KeyEvent.VK_A:\r
99          if(evt.isControlDown())\r
100            alignFrame.selectAllSequenceMenuItem_actionPerformed(null);\r
101            break;\r
102         case KeyEvent.VK_DOWN:\r
103           alignFrame.moveSelectedSequences(false);\r
104           break;\r
105         case KeyEvent.VK_UP:\r
106           alignFrame.moveSelectedSequences(true);\r
107           break;\r
108         case KeyEvent.VK_F:\r
109          if(evt.isControlDown())\r
110           alignFrame.findMenuItem_actionPerformed(null);\r
111           break;\r
112        }\r
113      }\r
114   }\r
115 \r
116   public void fontChanged()\r
117   {\r
118     // set idCanvas bufferedImage to null\r
119     // to prevent drawing old image\r
120     FontMetrics fm = getFontMetrics(av.getFont());\r
121 \r
122     scalePanel.setSize(new Dimension(10, av.charHeight+fm.getDescent()));\r
123     idwidthAdjuster.setSize(new Dimension(10, av.charHeight+fm.getDescent()));\r
124 \r
125     annotationPanel.adjustPanelHeight();\r
126     annotationPanel.repaint();\r
127     Dimension d = calculateIdWidth();\r
128     d.setSize(d.width + 4, seqPanel.seqCanvas.getSize().height);\r
129     idPanel.idCanvas.setSize(d);\r
130     hscrollFillerPanel.setSize(d);\r
131 \r
132     alignFrame.pack();\r
133   }\r
134 \r
135   public void setIdWidth(int w, int h)\r
136   {\r
137     idPanel.idCanvas.setSize(w,h);\r
138     idPanelHolder.setSize(w,idPanelHolder.getSize().height);\r
139     alabels.setSize(w,alabels.getSize().height);\r
140     validate();\r
141   }\r
142   Dimension calculateIdWidth()\r
143   {\r
144     Frame frame = new Frame();\r
145     frame.addNotify();\r
146     Graphics g = frame.getGraphics();\r
147     if(g==null)\r
148     {\r
149       Frame f = new Frame();\r
150       f.addNotify();\r
151       g = f.getGraphics();\r
152     }\r
153 \r
154     FontMetrics fm = g.getFontMetrics(av.font);\r
155     AlignmentI al = av.getAlignment();\r
156 \r
157        int i   = 0;\r
158        int idWidth = 0;\r
159        String id;\r
160        while (i < al.getHeight() && al.getSequenceAt(i) != null)\r
161        {\r
162          SequenceI s   = al.getSequenceAt(i);\r
163          if(av.getShowFullId())\r
164            id   = s.getDisplayId();\r
165          else\r
166            id = s.getName();\r
167 \r
168          if (fm.stringWidth(id) > idWidth)\r
169            idWidth = fm.stringWidth(id);\r
170          i++;\r
171        }\r
172 \r
173        // Also check annotation label widths\r
174        i=0;\r
175        if(al.getAlignmentAnnotation()!=null)\r
176        {\r
177          fm = g.getFontMetrics(frame.getFont());\r
178          while (i < al.getAlignmentAnnotation().length)\r
179          {\r
180            String label = al.getAlignmentAnnotation()[i].label;\r
181            if (fm.stringWidth(label) > idWidth)\r
182              idWidth = fm.stringWidth(label);\r
183            i++;\r
184          }\r
185        }\r
186 \r
187        return new Dimension(idWidth, idPanel.idCanvas.getSize().height);\r
188   }\r
189 \r
190 \r
191  public void highlightSearchResults(int [] results)\r
192  {\r
193    seqPanel.seqCanvas.highlightSearchResults( results );\r
194 \r
195    // do we need to scroll the panel?\r
196    if(results!=null)\r
197     {\r
198       SequenceI seq = av.alignment.getSequenceAt(results[0]);\r
199       int start = seq.findIndex( results[1] )-1;\r
200       int end = seq.findIndex( results[2] )-1;\r
201       if( av.getStartRes() > start\r
202           || av.getEndRes() < end\r
203           || (av.getStartSeq() > results[0]\r
204           || av.getEndSeq() < results[0]))\r
205         setScrollValues(start, results[0]);\r
206     }\r
207 \r
208  }\r
209 \r
210 \r
211  public OverviewPanel getOverviewPanel()\r
212  {\r
213    return overviewPanel;\r
214  }\r
215 \r
216  public void setOverviewPanel(OverviewPanel op)\r
217  {\r
218    overviewPanel = op;\r
219  }\r
220 \r
221 \r
222   public void setAnnotationVisible(boolean b)\r
223   {\r
224     annotationSpaceFillerHolder.setVisible(b);\r
225     annotationScroller.setVisible(b);\r
226     validate();\r
227     repaint();\r
228   }\r
229 \r
230 \r
231   public void setWrapAlignment(boolean wrap)\r
232   {\r
233     scalePanelHolder.setVisible(!wrap);\r
234     hscroll.setVisible(!wrap);\r
235     idwidthAdjuster.setVisible(!wrap);\r
236 \r
237     av.setShowAnnotation(!wrap);\r
238     annotationScroller.setVisible(!wrap);\r
239     annotationSpaceFillerHolder.setVisible(!wrap);\r
240     idSpaceFillerPanel1.setVisible(!wrap);\r
241 \r
242     validate();\r
243     repaint();\r
244 \r
245   }\r
246 \r
247 \r
248   public void setColourScheme()\r
249   {\r
250     ColourSchemeI cs = av.getGlobalColourScheme();\r
251 \r
252     if(av.getConservationSelected())\r
253     {\r
254 \r
255        Alignment al = (Alignment)av.getAlignment();\r
256        Conservation c = new Conservation("All",\r
257                             ResidueProperties.propHash, 3, al.getSequences(), 0,\r
258                             al.getWidth() );\r
259 \r
260        c.calculate();\r
261        c.verdict(false, av.ConsPercGaps);\r
262        ConservationColourScheme ccs = new ConservationColourScheme(c, cs);\r
263 \r
264        av.setGlobalColourScheme( ccs );\r
265 \r
266     }\r
267 \r
268     repaint();\r
269   }\r
270 \r
271 \r
272   int hextent = 0;\r
273   int vextent = 0;\r
274 \r
275   // return value is true if the scroll is valid\r
276   public boolean scrollUp(boolean up)\r
277   {\r
278     if(up)\r
279     {\r
280       if(vscroll.getValue()<1)\r
281         return false;\r
282       fastPaint  = false;\r
283       vscroll.setValue(vscroll.getValue() - 1);\r
284     }\r
285     else\r
286     {\r
287      if(vextent+vscroll.getValue() >= av.getAlignment().getHeight())\r
288        return false;\r
289       fastPaint  = false;\r
290       vscroll.setValue(vscroll.getValue() + 1);\r
291     }\r
292     fastPaint = true;\r
293     return true;\r
294   }\r
295 \r
296   public boolean scrollRight(boolean right)\r
297   {\r
298 \r
299     if (right)\r
300     {\r
301       if (hscroll.getValue() < 1)\r
302         return false;\r
303       fastPaint = false;\r
304       hscroll.setValue(hscroll.getValue() - 1);\r
305     }\r
306     else\r
307     {\r
308       if (hextent + hscroll.getValue() >= av.getAlignment().getWidth())\r
309         return false;\r
310       fastPaint = false;\r
311       hscroll.setValue(hscroll.getValue() + 1);\r
312     }\r
313     fastPaint = true;\r
314     return true;\r
315   }\r
316 \r
317 \r
318   public void setScrollValues(int x, int y)\r
319   {\r
320 \r
321     av.setStartRes(x);\r
322     av.setStartSeq(y);\r
323     av.setEndRes(x + seqPanel.seqCanvas.getSize().width/av.getCharWidth()-1);\r
324 \r
325     hextent = seqPanel.seqCanvas.getSize().width/av.charWidth;\r
326     vextent = seqPanel.seqCanvas.getSize().height/av.charHeight;\r
327 \r
328     if(hextent > av.alignment.getWidth())\r
329       hextent = av.alignment.getWidth();\r
330     if(vextent > av.alignment.getHeight())\r
331       vextent = av.alignment.getHeight();\r
332 \r
333     if(hextent+x  >  av.getAlignment().getWidth())\r
334       x =  av.getAlignment().getWidth()- hextent;\r
335 \r
336     if(vextent+y > av.getAlignment().getHeight())\r
337       y = av.getAlignment().getHeight() - vextent;\r
338 \r
339     if(y<0)\r
340       y = 0;\r
341 \r
342     if(x<0)\r
343       x=0;\r
344 \r
345 \r
346     int endSeq = y + vextent;\r
347     if(endSeq>av.alignment.getHeight())\r
348       endSeq = av.alignment.getHeight();\r
349 \r
350 \r
351     av.setEndSeq( endSeq );\r
352     hscroll.setValues(x,hextent,0,av.getAlignment().getWidth());\r
353     vscroll.setValues(y,vextent,0,av.getAlignment().getHeight() );\r
354 \r
355   }\r
356 \r
357 \r
358   public void adjustmentValueChanged(AdjustmentEvent evt)\r
359   {\r
360     int oldX = av.getStartRes();\r
361     int oldY = av.getStartSeq();\r
362 \r
363     if (evt.getSource() == hscroll)\r
364     {\r
365       int x = hscroll.getValue();\r
366       av.setStartRes(x);\r
367       av.setEndRes(x + seqPanel.seqCanvas.getSize().width/av.getCharWidth()-1);\r
368     }\r
369 \r
370     if (evt.getSource() == vscroll)\r
371     {\r
372       int offy = vscroll.getValue();\r
373       if (av.getWrapAlignment())\r
374       {\r
375         int rowSize = seqPanel.seqCanvas.getWrappedCanvasWidth(seqPanel.seqCanvas.getSize().width);\r
376         av.setStartRes( vscroll.getValue() * rowSize );\r
377         av.setEndRes( (vscroll.getValue()+1) * rowSize );\r
378       }\r
379       else\r
380       {\r
381         av.setStartSeq(offy);\r
382         av.setEndSeq(offy + seqPanel.seqCanvas.getSize().height / av.getCharHeight());\r
383       }\r
384     }\r
385 \r
386     if(overviewPanel!=null)\r
387       overviewPanel.setBoxPosition();\r
388 \r
389     if(av.getWrapAlignment() || !fastPaint)\r
390       repaint();\r
391     else\r
392     {\r
393       idPanel.idCanvas.fastPaint(av.getStartSeq() - oldY);\r
394       seqPanel.seqCanvas.fastPaint(av.getStartRes() - oldX,\r
395                                    av.getStartSeq() - oldY);\r
396 \r
397       scalePanel.repaint();\r
398       if (av.getShowAnnotation())\r
399         annotationPanel.fastPaint(av.getStartRes() - oldX);\r
400     }\r
401 \r
402   }\r
403 \r
404   public void update(Graphics g)\r
405   {\r
406     paint (g);\r
407   }\r
408 \r
409 \r
410   public void paint(Graphics g)\r
411   {\r
412     Dimension d = idPanel.idCanvas.getSize();\r
413     idPanel.idCanvas.setSize(d.width, seqPanel.seqCanvas.getSize().height);\r
414     annotationSpaceFillerHolder.setSize(d.width,annotationPanel.getSize().height);\r
415     alabels.setSize(d.width,annotationPanel.getSize().height);\r
416 \r
417     alabels.repaint();\r
418     idPanel.idCanvas.repaint();\r
419     seqPanel.seqCanvas.repaint();\r
420     scalePanel.repaint();\r
421     annotationPanel.repaint();\r
422 \r
423 \r
424     if (av.getWrapAlignment())\r
425     {\r
426       int max = av.alignment.getWidth() / seqPanel.seqCanvas.getWrappedCanvasWidth(seqPanel.seqCanvas.getSize().width);\r
427       vscroll.setMaximum(max);\r
428       vscroll.setUnitIncrement(1);\r
429       vscroll.setVisibleAmount(1);\r
430     }\r
431     else\r
432     {\r
433       setScrollValues(av.getStartRes(), av.getStartSeq());\r
434     }\r
435 \r
436 \r
437 \r
438   }\r
439 }\r