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