Printing changes
[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       if (overviewPanel != null)\r
389         overviewPanel.updateOverviewImage();\r
390       setScrollValues(av.getStartRes(), av.getStartSeq());\r
391     }\r
392 \r
393 \r
394 \r
395   }\r
396 \r
397   public int print(Graphics pg, PageFormat pf, int pi) throws PrinterException\r
398   {\r
399     pg.translate((int)pf.getImageableX(), (int)pf.getImageableY());\r
400 \r
401     int pwidth = (int) pf.getImageableWidth();\r
402     int pheight = (int) pf.getImageableHeight();\r
403 \r
404     if (av.getWrapAlignment())\r
405       return printWrappedAlignment(pg, pwidth,pheight, pi);\r
406     else\r
407       return printUnwrapped(pg,pwidth, pheight,pi);\r
408   }\r
409 \r
410   public int printUnwrapped(Graphics pg, int pwidth, int pheight, int pi) throws PrinterException\r
411   {\r
412 \r
413       int idWidth = calculateIdWidth().width + 4;\r
414       FontMetrics fm = getFontMetrics(av.getFont());\r
415       int scaleHeight = av.charHeight + fm.getDescent();\r
416 \r
417       pg.setColor(Color.white);\r
418       pg.fillRect(0, 0, pwidth, pheight);\r
419       pg.setFont(av.getFont());\r
420 \r
421       ////////////////////////////////////\r
422       /// How many sequences and residues can we fit on a printable page?\r
423       int totalRes = (pwidth - idWidth) / av.getCharWidth();\r
424 \r
425       int totalSeq = (int) ( (pheight - scaleHeight) / av.getCharHeight()) - 1;\r
426 \r
427       int pagesWide = av.getAlignment().getWidth() / totalRes + 1;\r
428 \r
429       /////////////////////////////\r
430       /// Only print these sequences and residues on this page\r
431       int startRes, endRes, startSeq, endSeq;\r
432       startRes = (pi % pagesWide) * totalRes;\r
433       endRes = startRes + totalRes - 1;\r
434       if (endRes > av.getAlignment().getWidth()-1)\r
435         endRes = av.getAlignment().getWidth()-1;\r
436 \r
437       startSeq = (pi / pagesWide) * totalSeq;\r
438       endSeq = startSeq + totalSeq;\r
439       if (endSeq > av.getAlignment().getHeight())\r
440         endSeq = av.getAlignment().getHeight();\r
441 \r
442       int pagesHigh = ( (av.alignment.getHeight() / totalSeq) + 1) * pheight;\r
443 \r
444       if (av.showAnnotation)\r
445         pagesHigh += annotationPanel.getHeight();\r
446 \r
447       pagesHigh /= pheight;\r
448 \r
449       if (pi >= pagesWide * pagesHigh)\r
450         return Printable.NO_SUCH_PAGE;\r
451 \r
452         //draw Scale\r
453       pg.translate(idWidth, 0);\r
454       scalePanel.drawScale(pg, startRes, endRes, pwidth - idWidth, scaleHeight);\r
455       pg.translate( -idWidth, scaleHeight);\r
456       ////////////////\r
457       // Draw the ids\r
458       Color currentColor = null;\r
459       Color currentTextColor = null;\r
460       for (int i = startSeq; i < endSeq; i++)\r
461       {\r
462         if (av.getSelectionGroup() != null &&\r
463             av.getSelectionGroup().sequences.\r
464             contains(av.getAlignment().getSequenceAt(i)))\r
465         {\r
466           currentColor = Color.gray;\r
467           currentTextColor = Color.black;\r
468         }\r
469         else\r
470         {\r
471           currentColor = av.getAlignment().getSequenceAt(i).getColor();\r
472           currentTextColor = Color.black;\r
473         }\r
474 \r
475         pg.setColor(currentColor);\r
476         pg.fillRect(0,\r
477                     jalview.analysis.AlignmentUtil.getPixelHeight(startSeq, i,\r
478             av.getCharHeight()),\r
479                     idWidth,\r
480                     av.getCharHeight());\r
481 \r
482         pg.setColor(currentTextColor);\r
483 \r
484         String string = av.getAlignment().getSequenceAt(i).getName();\r
485         if (av.getShowFullId())\r
486           string = av.getAlignment().getSequenceAt(i).getDisplayId();\r
487 \r
488         pg.drawString(string, 0, jalview.analysis.AlignmentUtil.getPixelHeight\r
489                       (startSeq, i, av.getCharHeight()) + av.getCharHeight() -\r
490                       (av.getCharHeight() / 5));\r
491       }\r
492 \r
493       // draw main sequence panel\r
494       pg.translate(idWidth, 0);\r
495       seqPanel.seqCanvas.drawPanel(pg, startRes, endRes, startSeq, endSeq,\r
496                                    startRes, startSeq, 0);\r
497 \r
498 \r
499       if (av.showAnnotation && endSeq == av.alignment.getHeight())\r
500       {\r
501         pg.translate( -idWidth, (endSeq - startSeq) * av.charHeight);\r
502         alabels.drawComponent( (Graphics2D) pg);\r
503         pg.translate(idWidth, 0);\r
504         annotationPanel.drawComponent( (Graphics2D) pg, startRes, endRes+1);\r
505       }\r
506 \r
507       return Printable.PAGE_EXISTS;\r
508 \r
509   }\r
510 \r
511 \r
512   public int printWrappedAlignment(Graphics pg, int pwidth, int pheight, int pi) throws PrinterException\r
513   {\r
514       int idWidth = calculateIdWidth().width + 4;\r
515 \r
516       int resWidth = seqPanel.seqCanvas.getWrappedCanvasWidth(pwidth - idWidth);\r
517       int totalHeight = totalHeight = (av.alignment.getHeight() + 2) *\r
518           ( (av.alignment.getWidth()\r
519              / resWidth) + 1) * av.charHeight;\r
520 \r
521 \r
522       pg.setColor(Color.white);\r
523       pg.fillRect(0, 0, pwidth, pheight);\r
524       pg.setFont(av.getFont());\r
525 \r
526       ////////////////\r
527       // Draw the ids\r
528       pg.setColor(Color.black);\r
529 \r
530       pg.translate(0, -pi * pheight);\r
531 \r
532       pg.setClip(0,pi*pheight,pwidth, pheight);\r
533 \r
534       int ypos = 2 * av.charHeight;\r
535       do\r
536       {\r
537         for (int i = 0; i < av.alignment.getHeight(); i++)\r
538         {\r
539           SequenceI s = av.alignment.getSequenceAt(i);\r
540           String string = s.getName();\r
541           if (av.getShowFullId())\r
542             string = s.getDisplayId();\r
543 \r
544           pg.drawString(string, 0,\r
545                         AlignmentUtil.getPixelHeight(0, i, av.charHeight) +\r
546                         ypos +\r
547                         av.charHeight - (av.charHeight / 5));\r
548 \r
549         }\r
550 \r
551         ypos += (av.alignment.getHeight() + 2) * av.charHeight;\r
552 \r
553       }\r
554       while (ypos < totalHeight);\r
555 \r
556       pg.translate(idWidth, 0);\r
557 \r
558       seqPanel.seqCanvas.drawWrappedPanel(pg, pwidth - idWidth, totalHeight, 0);\r
559 \r
560       if (pi * pheight < totalHeight)\r
561         return Printable.PAGE_EXISTS;\r
562       else\r
563         return Printable.NO_SUCH_PAGE;\r
564 \r
565 \r
566 \r
567   }\r
568 \r
569 \r
570   public void makeEPS()\r
571   {\r
572     int height = (av.alignment.getWidth() / av.getChunkWidth() +1) * av.chunkHeight;\r
573     int width = seqPanel.getWidth() + idPanel.getWidth();\r
574 \r
575     if (!av.getWrapAlignment())\r
576     {\r
577       height = (av.alignment.getHeight()+1) * av.charHeight + 30;\r
578       width = idPanel.getWidth() + av.alignment.getWidth() * av.charWidth;\r
579     }\r
580     if(av.getShowAnnotation())\r
581    {\r
582      height += annotationPanel.getPreferredSize().height;\r
583    }\r
584 \r
585     try\r
586     {\r
587       jalview.io.JalviewFileChooser chooser = new jalview.io.JalviewFileChooser(jalview.bin.Cache.getProperty(\r
588           "LAST_DIRECTORY"), new String[]{"eps"}, "Encapsulated Postscript");\r
589       chooser.setFileView(new jalview.io.JalviewFileView());\r
590       chooser.setDialogTitle("Create EPS file from alignment");\r
591       chooser.setToolTipText("Save");\r
592 \r
593       int value = chooser.showSaveDialog(this);\r
594       if (value != jalview.io.JalviewFileChooser.APPROVE_OPTION)\r
595         return;\r
596 \r
597       jalview.bin.Cache.setProperty("LAST_DIRECTORY",chooser.getSelectedFile().getPath());\r
598       FileOutputStream out = new FileOutputStream(chooser.getSelectedFile());\r
599       EpsGraphics2D pg = new EpsGraphics2D("Example", out, 0, 0, width, height);\r
600 \r
601         if (av.getWrapAlignment())\r
602           printWrappedAlignment(pg, width, height, 0);\r
603         else\r
604           printUnwrapped(pg, width, height, 0);\r
605 \r
606 \r
607         pg.flush();\r
608         pg.close();\r
609     }\r
610     catch (Exception ex)\r
611     {\r
612       ex.printStackTrace();\r
613     }\r
614   }\r
615 \r
616   public void makePNG()\r
617   {\r
618       int height = (av.alignment.getWidth() / av.getChunkWidth() +1) * av.chunkHeight;\r
619       int width = seqPanel.getWidth() + idPanel.getWidth();\r
620 \r
621       if (!av.getWrapAlignment())\r
622       {\r
623         height = (av.alignment.getHeight()+1) * av.charHeight + 30;\r
624         width = idPanel.getWidth() + av.alignment.getWidth() * av.charWidth;\r
625       }\r
626 \r
627       if(av.getShowAnnotation())\r
628       {\r
629         height += annotationPanel.getPreferredSize().height;\r
630       }\r
631 \r
632 \r
633 \r
634     try\r
635     {\r
636       jalview.io.JalviewFileChooser chooser = new jalview.io.JalviewFileChooser(jalview.bin.Cache.getProperty(\r
637           "LAST_DIRECTORY"), new String[]{"png"}, "Portable network graphics");\r
638       chooser.setFileView(new jalview.io.JalviewFileView());\r
639       chooser.setDialogTitle("Create EPS file from alignment");\r
640       chooser.setToolTipText("Save");\r
641 \r
642       int value = chooser.showSaveDialog(this);\r
643       if (value != jalview.io.JalviewFileChooser.APPROVE_OPTION)\r
644         return;\r
645 \r
646       jalview.bin.Cache.setProperty("LAST_DIRECTORY",chooser.getSelectedFile().getPath());\r
647       FileOutputStream out = new FileOutputStream(chooser.getSelectedFile());\r
648 \r
649       BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);\r
650       Graphics2D png = (Graphics2D)bi.getGraphics();\r
651 \r
652       png.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);\r
653 \r
654         if (av.getWrapAlignment())\r
655           printWrappedAlignment(png, width, height, 0);\r
656         else\r
657           printUnwrapped(png, width, height, 0);\r
658 \r
659         ImageIO.write(bi, "png", out);\r
660         out.close();\r
661     }\r
662     catch (Exception ex)\r
663     {\r
664       ex.printStackTrace();\r
665     }\r
666   }\r
667 \r
668 }\r
669 \r
670 class Preview extends JFrame\r
671 {\r
672 \r
673   public Preview(Image image)\r
674   {\r
675     setResizable(true);\r
676     setSize(image.getWidth(this), image.getHeight(this));\r
677     setVisible(true);\r
678     getContentPane().setLayout(new BorderLayout());\r
679     getContentPane().add(new PreviewPanel(image), BorderLayout.CENTER);\r
680     validate();\r
681     repaint();\r
682   }\r
683 }\r
684 \r
685 class PreviewPanel extends JPanel\r
686 {\r
687   Image image;\r
688   public PreviewPanel(Image image)\r
689   {\r
690     this.image = image;\r
691   }\r
692   public void paintComponent(Graphics g)\r
693   {\r
694     if(image!=null)\r
695       g.drawImage(image,0,0,this);\r
696     else\r
697       System.out.println("image is null");\r
698   }\r
699 }\r
700 \r
701 \r
702 \r
703 \r