PaintRefresh changed
[jalview.git] / src / jalview / gui / AlignmentPanel.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer\r
3  * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
4  *\r
5  * This program is free software; you can redistribute it and/or\r
6  * modify it under the terms of the GNU General Public License\r
7  * as published by the Free Software Foundation; either version 2\r
8  * of the License, or (at your option) any later version.\r
9  *\r
10  * This program is distributed in the hope that it will be useful,\r
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13  * GNU General Public License for more details.\r
14  *\r
15  * You should have received a copy of the GNU General Public License\r
16  * along with this program; if not, write to the Free Software\r
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
18  */\r
19 package jalview.gui;\r
20 \r
21 import java.io.*;\r
22 import javax.imageio.*;\r
23 \r
24 import java.awt.*;\r
25 import java.awt.event.*;\r
26 import java.awt.image.*;\r
27 import java.awt.print.*;\r
28 import javax.swing.*;\r
29 \r
30 import org.jibble.epsgraphics.*;\r
31 import jalview.analysis.*;\r
32 import jalview.datamodel.*;\r
33 import jalview.jbgui.*;\r
34 import jalview.schemes.*;\r
35 \r
36 public class AlignmentPanel\r
37     extends GAlignmentPanel implements AdjustmentListener, Printable\r
38 {\r
39   AlignViewport av;\r
40   OverviewPanel overviewPanel;\r
41   SeqPanel seqPanel;\r
42   IdPanel idPanel;\r
43   IdwidthAdjuster idwidthAdjuster;\r
44   public AlignFrame alignFrame;\r
45   ScalePanel scalePanel;\r
46   AnnotationPanel annotationPanel;\r
47   AnnotationLabels alabels;\r
48 \r
49   // this value is set false when selection area being dragged\r
50   boolean fastPaint = true;\r
51   int hextent = 0;\r
52   int vextent = 0;\r
53 \r
54   public AlignmentPanel(AlignFrame af, final AlignViewport av)\r
55   {\r
56     alignFrame = af;\r
57     this.av = av;\r
58     seqPanel = new SeqPanel(av, this);\r
59     idPanel = new IdPanel(av, this);\r
60 \r
61     scalePanel = new ScalePanel(av, this);\r
62 \r
63     idPanelHolder.add(idPanel, BorderLayout.CENTER);\r
64     idwidthAdjuster = new IdwidthAdjuster(this);\r
65     idSpaceFillerPanel1.add(idwidthAdjuster, BorderLayout.CENTER);\r
66 \r
67     annotationPanel = new AnnotationPanel(this);\r
68     alabels = new AnnotationLabels(this);\r
69 \r
70     annotationSpaceFillerHolder.setPreferredSize(annotationPanel.\r
71                                                  getPreferredSize());\r
72     annotationScroller.setPreferredSize(annotationPanel.getPreferredSize());\r
73     annotationScroller.setViewportView(annotationPanel);\r
74     annotationSpaceFillerHolder.add(alabels, BorderLayout.CENTER);\r
75 \r
76     fontChanged();\r
77 \r
78     scalePanelHolder.add(scalePanel, BorderLayout.CENTER);\r
79     seqPanelHolder.add(seqPanel, BorderLayout.CENTER);\r
80 \r
81     setScrollValues(0, 0);\r
82 \r
83     hscroll.addAdjustmentListener(this);\r
84     vscroll.addAdjustmentListener(this);\r
85 \r
86     setFocusable(true);\r
87     addKeyListener(new KeyAdapter()\r
88     {\r
89       public void keyPressed(KeyEvent evt)\r
90       {\r
91         switch (evt.getKeyCode())\r
92         {\r
93           case 27: // escape key\r
94             av.setSelectionGroup(null);\r
95             repaint();\r
96 \r
97             break;\r
98 \r
99           case KeyEvent.VK_DOWN:\r
100             alignFrame.moveSelectedSequences(false);\r
101 \r
102             break;\r
103 \r
104           case KeyEvent.VK_UP:\r
105             alignFrame.moveSelectedSequences(true);\r
106 \r
107             break;\r
108         }\r
109       }\r
110     });\r
111   }\r
112 \r
113   public void fontChanged()\r
114   {\r
115     // set idCanvas bufferedImage to null\r
116     // to prevent drawing old image\r
117     FontMetrics fm = getFontMetrics(av.getFont());\r
118 \r
119     scalePanelHolder.setPreferredSize(new Dimension(10,\r
120         av.charHeight + fm.getDescent()));\r
121     idSpaceFillerPanel1.setPreferredSize(new Dimension(10,\r
122         av.charHeight + fm.getDescent()));\r
123 \r
124     idPanel.idCanvas.gg = null;\r
125     annotationPanel.adjustPanelHeight();\r
126 \r
127     Dimension d = calculateIdWidth();\r
128     d.setSize(d.width + 4, d.height);\r
129     idPanel.idCanvas.setPreferredSize(d);\r
130     hscrollFillerPanel.setPreferredSize(d);\r
131     repaint();\r
132   }\r
133 \r
134   Dimension calculateIdWidth()\r
135   {\r
136     Graphics g = this.getGraphics();\r
137 \r
138     if (g == null)\r
139     {\r
140       javax.swing.JFrame f = new javax.swing.JFrame();\r
141       f.addNotify();\r
142       g = f.getGraphics();\r
143     }\r
144 \r
145     FontMetrics fm = g.getFontMetrics(av.font);\r
146     AlignmentI al = av.getAlignment();\r
147 \r
148     int i = 0;\r
149     int idWidth = 0;\r
150     String id;\r
151 \r
152     while ( (i < al.getHeight()) && (al.getSequenceAt(i) != null))\r
153     {\r
154       SequenceI s = al.getSequenceAt(i);\r
155 \r
156       if (av.getShowFullId())\r
157       {\r
158         id = s.getDisplayId();\r
159       }\r
160       else\r
161       {\r
162         id = s.getName();\r
163       }\r
164 \r
165       if (fm.stringWidth(id) > idWidth)\r
166       {\r
167         idWidth = fm.stringWidth(id);\r
168       }\r
169 \r
170       i++;\r
171     }\r
172 \r
173     // Also check annotation label widths\r
174     i = 0;\r
175 \r
176     if (al.getAlignmentAnnotation() != null)\r
177     {\r
178       fm = g.getFontMetrics(alabels.getFont());\r
179 \r
180       while (i < al.getAlignmentAnnotation().length)\r
181       {\r
182         String label = al.getAlignmentAnnotation()[i].label;\r
183 \r
184         if (fm.stringWidth(label) > idWidth)\r
185         {\r
186           idWidth = fm.stringWidth(label);\r
187         }\r
188 \r
189         i++;\r
190       }\r
191     }\r
192 \r
193     return new Dimension(idWidth, 12);\r
194   }\r
195 \r
196   public void highlightSearchResults(int[] results)\r
197   {\r
198     seqPanel.seqCanvas.highlightSearchResults(results);\r
199 \r
200     // do we need to scroll the panel?\r
201     if (results != null)\r
202     {\r
203       SequenceI seq = av.alignment.getSequenceAt(results[0]);\r
204       int start = seq.findIndex(results[1]) - 1;\r
205       int end = seq.findIndex(results[2]) - 1;\r
206 \r
207       if ( (av.getStartRes() > start) || (av.getEndRes() < end) ||\r
208           ( (av.getStartSeq() > results[0]) ||\r
209            (av.getEndSeq() < results[0])))\r
210       {\r
211         setScrollValues(start, results[0]);\r
212       }\r
213     }\r
214   }\r
215 \r
216   public OverviewPanel getOverviewPanel()\r
217   {\r
218     return overviewPanel;\r
219   }\r
220 \r
221   public void setOverviewPanel(OverviewPanel op)\r
222   {\r
223     overviewPanel = op;\r
224   }\r
225 \r
226   public void setAnnotationVisible(boolean b)\r
227   {\r
228     annotationSpaceFillerHolder.setVisible(b);\r
229     annotationScroller.setVisible(b);\r
230   }\r
231 \r
232   public void setWrapAlignment(boolean wrap)\r
233   {\r
234     scalePanelHolder.setVisible(!wrap);\r
235     hscroll.setVisible(!wrap);\r
236     idwidthAdjuster.setVisible(!wrap);\r
237 \r
238     av.setShowAnnotation(!wrap);\r
239     annotationScroller.setVisible(!wrap);\r
240     annotationSpaceFillerHolder.setVisible(!wrap);\r
241     idSpaceFillerPanel1.setVisible(!wrap);\r
242 \r
243     repaint();\r
244   }\r
245 \r
246   public void setColourScheme()\r
247   {\r
248     ColourSchemeI cs = av.getGlobalColourScheme();\r
249 \r
250     if (av.getConservationSelected())\r
251     {\r
252       Alignment al = (Alignment) av.getAlignment();\r
253       Conservation c = new Conservation("All",\r
254                                         ResidueProperties.propHash, 3,\r
255                                         al.getSequences(), 0,\r
256                                         al.getWidth());\r
257 \r
258       c.calculate();\r
259       c.verdict(false, av.ConsPercGaps);\r
260 \r
261       ConservationColourScheme ccs = new ConservationColourScheme(c, cs);\r
262 \r
263       av.setGlobalColourScheme(ccs);\r
264     }\r
265 \r
266     repaint();\r
267   }\r
268 \r
269   // return value is true if the scroll is valid\r
270   public boolean scrollUp(boolean up)\r
271   {\r
272     if (up)\r
273     {\r
274       if (vscroll.getValue() < 1)\r
275       {\r
276         return false;\r
277       }\r
278 \r
279       fastPaint = false;\r
280       vscroll.setValue(vscroll.getValue() - 1);\r
281     }\r
282     else\r
283     {\r
284       if ( (vextent + vscroll.getValue()) >= av.getAlignment().getHeight())\r
285       {\r
286         return false;\r
287       }\r
288 \r
289       fastPaint = false;\r
290       vscroll.setValue(vscroll.getValue() + 1);\r
291     }\r
292 \r
293     fastPaint = true;\r
294 \r
295     return true;\r
296   }\r
297 \r
298   public boolean scrollRight(boolean right)\r
299   {\r
300     if (right)\r
301     {\r
302       if (hscroll.getValue() < 1)\r
303       {\r
304         return false;\r
305       }\r
306 \r
307       fastPaint = false;\r
308       hscroll.setValue(hscroll.getValue() - 1);\r
309     }\r
310     else\r
311     {\r
312       if ( (hextent + hscroll.getValue()) >= av.getAlignment().getWidth())\r
313       {\r
314         return false;\r
315       }\r
316 \r
317       fastPaint = false;\r
318       hscroll.setValue(hscroll.getValue() + 1);\r
319     }\r
320 \r
321     fastPaint = true;\r
322 \r
323     return true;\r
324   }\r
325 \r
326   public void setScrollValues(int x, int y)\r
327   {\r
328     av.setEndRes( (x + (seqPanel.seqCanvas.getWidth() / av.getCharWidth())) -\r
329                  1);\r
330 \r
331     hextent = seqPanel.seqCanvas.getWidth() / av.charWidth;\r
332     vextent = seqPanel.seqCanvas.getHeight() / av.charHeight;\r
333 \r
334     if (hextent > av.alignment.getWidth())\r
335     {\r
336       hextent = av.alignment.getWidth();\r
337     }\r
338 \r
339     if (vextent > av.alignment.getHeight())\r
340     {\r
341       vextent = av.alignment.getHeight();\r
342     }\r
343 \r
344     if ( (hextent + x) > av.getAlignment().getWidth())\r
345     {\r
346       x = av.getAlignment().getWidth() - hextent;\r
347     }\r
348 \r
349     if ( (vextent + y) > av.getAlignment().getHeight())\r
350     {\r
351       y = av.getAlignment().getHeight() - vextent;\r
352     }\r
353 \r
354     if (y < 0)\r
355     {\r
356       y = 0;\r
357     }\r
358 \r
359     if (x < 0)\r
360     {\r
361       x = 0;\r
362     }\r
363 \r
364     hscroll.setValues(x, hextent, 0, av.getAlignment().getWidth());\r
365     vscroll.setValues(y, vextent, 0, av.getAlignment().getHeight());\r
366   }\r
367 \r
368   public void adjustmentValueChanged(AdjustmentEvent evt)\r
369   {\r
370     int oldX = av.getStartRes();\r
371     int oldY = av.getStartSeq();\r
372 \r
373     if (evt.getSource() == hscroll)\r
374     {\r
375       int x = hscroll.getValue();\r
376       av.setStartRes(x);\r
377       av.setEndRes( (x +\r
378                      (seqPanel.seqCanvas.getWidth() / av.getCharWidth())) - 1);\r
379     }\r
380 \r
381     if (evt.getSource() == vscroll)\r
382     {\r
383       int offy = vscroll.getValue();\r
384 \r
385       if (av.getWrapAlignment())\r
386       {\r
387         int rowSize = seqPanel.seqCanvas.getWrappedCanvasWidth(seqPanel.\r
388             seqCanvas.getWidth());\r
389         av.setStartRes(vscroll.getValue() * rowSize);\r
390         av.setEndRes( (vscroll.getValue() + 1) * rowSize);\r
391       }\r
392       else\r
393       {\r
394         av.setStartSeq(offy);\r
395         av.setEndSeq(offy +\r
396                      (seqPanel.seqCanvas.getHeight() / av.getCharHeight()));\r
397       }\r
398     }\r
399 \r
400     if (overviewPanel != null)\r
401     {\r
402       overviewPanel.setBoxPosition();\r
403     }\r
404 \r
405     if (av.getWrapAlignment() || !fastPaint)\r
406     {\r
407       repaint();\r
408     }\r
409     else\r
410     {\r
411       idPanel.idCanvas.fastPaint(av.getStartSeq() - oldY);\r
412       seqPanel.seqCanvas.fastPaint(av.getStartRes() - oldX,\r
413                                    av.getStartSeq() - oldY);\r
414 \r
415       scalePanel.repaint();\r
416 \r
417       if (av.getShowAnnotation())\r
418       {\r
419         annotationPanel.fastPaint(av.getStartRes() - oldX);\r
420       }\r
421     }\r
422   }\r
423 \r
424   public void paintComponent(Graphics g)\r
425   {\r
426     invalidate();\r
427 \r
428     Dimension d = idPanel.idCanvas.getPreferredSize();\r
429     idPanelHolder.setPreferredSize(d);\r
430     hscrollFillerPanel.setPreferredSize(new Dimension(d.width, 12));\r
431     validate();\r
432 \r
433     if (av.getWrapAlignment())\r
434     {\r
435       int max = av.alignment.getWidth() /\r
436           seqPanel.seqCanvas.getWrappedCanvasWidth(seqPanel.seqCanvas.getWidth());\r
437       vscroll.setMaximum(max);\r
438       vscroll.setUnitIncrement(1);\r
439       vscroll.setVisibleAmount(1);\r
440     }\r
441     else\r
442     {\r
443       setScrollValues(av.getStartRes(), av.getStartSeq());\r
444     }\r
445   }\r
446 \r
447   public int print(Graphics pg, PageFormat pf, int pi)\r
448       throws PrinterException\r
449   {\r
450     pg.translate( (int) pf.getImageableX(), (int) pf.getImageableY());\r
451 \r
452     int pwidth = (int) pf.getImageableWidth();\r
453     int pheight = (int) pf.getImageableHeight();\r
454 \r
455     if (av.getWrapAlignment())\r
456     {\r
457       return printWrappedAlignment(pg, pwidth, pheight, pi);\r
458     }\r
459     else\r
460     {\r
461       return printUnwrapped(pg, pwidth, pheight, pi);\r
462     }\r
463   }\r
464 \r
465   public int printUnwrapped(Graphics pg, int pwidth, int pheight, int pi)\r
466       throws PrinterException\r
467   {\r
468     int idWidth = calculateIdWidth().width + 4;\r
469     FontMetrics fm = getFontMetrics(av.getFont());\r
470     int scaleHeight = av.charHeight + fm.getDescent();\r
471 \r
472     pg.setColor(Color.white);\r
473     pg.fillRect(0, 0, pwidth, pheight);\r
474     pg.setFont(av.getFont());\r
475 \r
476     ////////////////////////////////////\r
477     /// How many sequences and residues can we fit on a printable page?\r
478     int totalRes = (pwidth - idWidth) / av.getCharWidth();\r
479 \r
480     int totalSeq = (int) ( (pheight - scaleHeight) / av.getCharHeight()) -\r
481         1;\r
482 \r
483     int pagesWide = (av.getAlignment().getWidth() / totalRes) + 1;\r
484 \r
485     /////////////////////////////\r
486     /// Only print these sequences and residues on this page\r
487     int startRes;\r
488 \r
489     /////////////////////////////\r
490     /// Only print these sequences and residues on this page\r
491     int endRes;\r
492 \r
493     /////////////////////////////\r
494     /// Only print these sequences and residues on this page\r
495     int startSeq;\r
496 \r
497     /////////////////////////////\r
498     /// Only print these sequences and residues on this page\r
499     int endSeq;\r
500     startRes = (pi % pagesWide) * totalRes;\r
501     endRes = (startRes + totalRes) - 1;\r
502 \r
503     if (endRes > (av.getAlignment().getWidth() - 1))\r
504     {\r
505       endRes = av.getAlignment().getWidth() - 1;\r
506     }\r
507 \r
508     startSeq = (pi / pagesWide) * totalSeq;\r
509     endSeq = startSeq + totalSeq;\r
510 \r
511     if (endSeq > av.getAlignment().getHeight())\r
512     {\r
513       endSeq = av.getAlignment().getHeight();\r
514     }\r
515 \r
516     int pagesHigh = ( (av.alignment.getHeight() / totalSeq) + 1) * pheight;\r
517 \r
518     if (av.showAnnotation)\r
519     {\r
520       pagesHigh += annotationPanel.getHeight();\r
521     }\r
522 \r
523     pagesHigh /= pheight;\r
524 \r
525     if (pi >= (pagesWide * pagesHigh))\r
526     {\r
527       return Printable.NO_SUCH_PAGE;\r
528     }\r
529 \r
530     //draw Scale\r
531     pg.translate(idWidth, 0);\r
532     scalePanel.drawScale(pg, startRes, endRes, pwidth - idWidth, scaleHeight);\r
533     pg.translate( -idWidth, scaleHeight);\r
534 \r
535     ////////////////\r
536     // Draw the ids\r
537     Color currentColor = null;\r
538     Color currentTextColor = null;\r
539 \r
540     for (int i = startSeq; i < endSeq; i++)\r
541     {\r
542       if ( (av.getSelectionGroup() != null) &&\r
543           av.getSelectionGroup().sequences.contains(\r
544               av.getAlignment().getSequenceAt(i)))\r
545       {\r
546         currentColor = Color.gray;\r
547         currentTextColor = Color.black;\r
548       }\r
549       else\r
550       {\r
551         currentColor = av.getAlignment().getSequenceAt(i).getColor();\r
552         currentTextColor = Color.black;\r
553       }\r
554 \r
555       pg.setColor(currentColor);\r
556       pg.fillRect(0,\r
557                   jalview.analysis.AlignmentUtil.getPixelHeight(startSeq, i,\r
558           av.getCharHeight()), idWidth, av.getCharHeight());\r
559 \r
560       pg.setColor(currentTextColor);\r
561 \r
562       String string = av.getAlignment().getSequenceAt(i).getName();\r
563 \r
564       if (av.getShowFullId())\r
565       {\r
566         string = av.getAlignment().getSequenceAt(i).getDisplayId();\r
567       }\r
568 \r
569       pg.drawString(string, 0,\r
570                     (jalview.analysis.AlignmentUtil.getPixelHeight(startSeq, i,\r
571           av.getCharHeight()) + av.getCharHeight()) -\r
572                     (av.getCharHeight() / 5));\r
573     }\r
574 \r
575     // draw main sequence panel\r
576     pg.translate(idWidth, 0);\r
577     seqPanel.seqCanvas.drawPanel(pg, startRes, endRes, startSeq, endSeq,\r
578                                  startRes, startSeq, 0);\r
579 \r
580     if (av.showAnnotation && (endSeq == av.alignment.getHeight()))\r
581     {\r
582       pg.translate( -idWidth, (endSeq - startSeq) * av.charHeight);\r
583       alabels.drawComponent( (Graphics2D) pg);\r
584       pg.translate(idWidth, 0);\r
585       annotationPanel.drawComponent( (Graphics2D) pg, startRes, endRes +\r
586                                     1);\r
587     }\r
588 \r
589     return Printable.PAGE_EXISTS;\r
590   }\r
591 \r
592   public int printWrappedAlignment(Graphics pg, int pwidth, int pheight,\r
593                                    int pi)\r
594       throws PrinterException\r
595   {\r
596     int idWidth = calculateIdWidth().width + 4;\r
597 \r
598     int resWidth = seqPanel.seqCanvas.getWrappedCanvasWidth(pwidth -\r
599         idWidth);\r
600     int totalHeight = totalHeight = (av.alignment.getHeight() + 2) *\r
601         ( (av.alignment.getWidth() / resWidth) +\r
602          1) * av.charHeight;\r
603 \r
604     pg.setColor(Color.white);\r
605     pg.fillRect(0, 0, pwidth, pheight);\r
606     pg.setFont(av.getFont());\r
607 \r
608     ////////////////\r
609     // Draw the ids\r
610     pg.setColor(Color.black);\r
611 \r
612     pg.translate(0, -pi * pheight);\r
613 \r
614     pg.setClip(0, pi * pheight, pwidth, pheight);\r
615 \r
616     int ypos = 2 * av.charHeight;\r
617 \r
618     do\r
619     {\r
620       for (int i = 0; i < av.alignment.getHeight(); i++)\r
621       {\r
622         SequenceI s = av.alignment.getSequenceAt(i);\r
623         String string = s.getName();\r
624 \r
625         if (av.getShowFullId())\r
626         {\r
627           string = s.getDisplayId();\r
628         }\r
629 \r
630         pg.drawString(string, 0,\r
631                       (AlignmentUtil.getPixelHeight(0, i, av.charHeight) + ypos +\r
632                        av.charHeight) - (av.charHeight / 5));\r
633       }\r
634 \r
635       ypos += ( (av.alignment.getHeight() + 2) * av.charHeight);\r
636     }\r
637     while (ypos < totalHeight);\r
638 \r
639     pg.translate(idWidth, 0);\r
640 \r
641     seqPanel.seqCanvas.drawWrappedPanel(pg, pwidth - idWidth, totalHeight, 0);\r
642 \r
643     if ( (pi * pheight) < totalHeight)\r
644     {\r
645       return Printable.PAGE_EXISTS;\r
646     }\r
647     else\r
648     {\r
649       return Printable.NO_SUCH_PAGE;\r
650     }\r
651   }\r
652 \r
653   public void makeEPS()\r
654   {\r
655     int height = ( (av.alignment.getWidth() / av.getChunkWidth()) + 1) *\r
656         av.chunkHeight;\r
657     int width = seqPanel.getWidth() + idPanel.getWidth();\r
658 \r
659     if (!av.getWrapAlignment())\r
660     {\r
661       height = ( (av.alignment.getHeight() + 1) * av.charHeight) + 30;\r
662       width = idPanel.getWidth() +\r
663           (av.alignment.getWidth() * av.charWidth);\r
664     }\r
665 \r
666     if (av.getShowAnnotation())\r
667     {\r
668       height += annotationPanel.getPreferredSize().height;\r
669     }\r
670 \r
671     try\r
672     {\r
673       jalview.io.JalviewFileChooser chooser = new jalview.io.JalviewFileChooser(\r
674           jalview.bin.Cache.getProperty(\r
675               "LAST_DIRECTORY"), new String[]\r
676           {"eps"},\r
677           new String[]\r
678           {"Encapsulated Postscript"},\r
679           "Encapsulated Postscript");\r
680       chooser.setFileView(new jalview.io.JalviewFileView());\r
681       chooser.setDialogTitle("Create EPS file from alignment");\r
682       chooser.setToolTipText("Save");\r
683 \r
684       int value = chooser.showSaveDialog(this);\r
685 \r
686       if (value != jalview.io.JalviewFileChooser.APPROVE_OPTION)\r
687       {\r
688         return;\r
689       }\r
690 \r
691       jalview.bin.Cache.setProperty("LAST_DIRECTORY",\r
692                                     chooser.getSelectedFile().getParent());\r
693 \r
694       FileOutputStream out = new FileOutputStream(chooser.getSelectedFile());\r
695       EpsGraphics2D pg = new EpsGraphics2D("Example", out, 0, 0, width,\r
696                                            height);\r
697 \r
698       if (av.getWrapAlignment())\r
699       {\r
700         printWrappedAlignment(pg, width, height, 0);\r
701       }\r
702       else\r
703       {\r
704         printUnwrapped(pg, width, height, 0);\r
705       }\r
706 \r
707       pg.flush();\r
708       pg.close();\r
709     }\r
710     catch (Exception ex)\r
711     {\r
712       ex.printStackTrace();\r
713     }\r
714   }\r
715 \r
716   public void makePNG()\r
717   {\r
718     int height = ( (av.alignment.getWidth() / av.getChunkWidth()) + 1) *\r
719         av.chunkHeight;\r
720     int width = seqPanel.getWidth() + idPanel.getWidth();\r
721 \r
722     if (!av.getWrapAlignment())\r
723     {\r
724       height = ( (av.alignment.getHeight() + 1) * av.charHeight) + 30;\r
725       width = idPanel.getWidth() +\r
726           (av.alignment.getWidth() * av.charWidth);\r
727     }\r
728 \r
729     if (av.getShowAnnotation())\r
730     {\r
731       height += annotationPanel.getPreferredSize().height;\r
732     }\r
733 \r
734     try\r
735     {\r
736       jalview.io.JalviewFileChooser chooser = new jalview.io.JalviewFileChooser(\r
737           jalview.bin.Cache.getProperty(\r
738               "LAST_DIRECTORY"), new String[]\r
739           {"png"},\r
740           new String[]\r
741           {"Portable network graphics"},\r
742           "Portable network graphics");\r
743       chooser.setFileView(new jalview.io.JalviewFileView());\r
744       chooser.setDialogTitle("Create EPS file from alignment");\r
745       chooser.setToolTipText("Save");\r
746 \r
747       int value = chooser.showSaveDialog(this);\r
748 \r
749       if (value != jalview.io.JalviewFileChooser.APPROVE_OPTION)\r
750       {\r
751         return;\r
752       }\r
753 \r
754       jalview.bin.Cache.setProperty("LAST_DIRECTORY",\r
755                                     chooser.getSelectedFile().getParent());\r
756 \r
757       FileOutputStream out = new FileOutputStream(chooser.getSelectedFile());\r
758 \r
759       BufferedImage bi = new BufferedImage(width, height,\r
760                                            BufferedImage.TYPE_INT_RGB);\r
761       Graphics2D png = (Graphics2D) bi.getGraphics();\r
762 \r
763       png.setRenderingHint(RenderingHints.KEY_ANTIALIASING,\r
764                            RenderingHints.VALUE_ANTIALIAS_ON);\r
765 \r
766       if (av.getWrapAlignment())\r
767       {\r
768         printWrappedAlignment(png, width, height, 0);\r
769       }\r
770       else\r
771       {\r
772         printUnwrapped(png, width, height, 0);\r
773       }\r
774 \r
775       ImageIO.write(bi, "png", out);\r
776       out.close();\r
777     }\r
778     catch (Exception ex)\r
779     {\r
780       ex.printStackTrace();\r
781     }\r
782   }\r
783 }\r
784 \r
785 class Preview\r
786     extends JFrame\r
787 {\r
788   public Preview(Image image)\r
789   {\r
790     setResizable(true);\r
791     setSize(image.getWidth(this), image.getHeight(this));\r
792     setVisible(true);\r
793     getContentPane().setLayout(new BorderLayout());\r
794     getContentPane().add(new PreviewPanel(image), BorderLayout.CENTER);\r
795     validate();\r
796     repaint();\r
797   }\r
798 }\r
799 \r
800 class PreviewPanel\r
801     extends JPanel\r
802 {\r
803   Image image;\r
804 \r
805   public PreviewPanel(Image image)\r
806   {\r
807     this.image = image;\r
808   }\r
809 \r
810   public void paintComponent(Graphics g)\r
811   {\r
812     if (image != null)\r
813     {\r
814       g.drawImage(image, 0, 0, this);\r
815     }\r
816     else\r
817     {\r
818       System.out.println("DEBUG:image is null");\r
819     }\r
820   }\r
821 }\r