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