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