treeMenuItem added, conservation sliders, finder top layer
[jalview.git] / src / jalview / gui / AlignFrame.java
1 /********************\r
2  * 2004 Jalview Reengineered\r
3  * Barton Group\r
4  * Dundee University\r
5  *\r
6  * AM Waterhouse\r
7  *******************/\r
8 \r
9 \r
10 \r
11 \r
12 package jalview.gui;\r
13 \r
14 import jalview.jbgui.GAlignFrame;\r
15 import jalview.schemes.*;\r
16 import jalview.datamodel.*;\r
17 import jalview.analysis.*;\r
18 import jalview.io.*;\r
19 import jalview.ws.*;\r
20 import java.awt.*;\r
21 import java.awt.event.*;\r
22 import java.awt.print.*;\r
23 import javax.swing.*;\r
24 import javax.swing.event.*;\r
25 import java.util.*;\r
26 import java.awt.datatransfer.*;\r
27 \r
28 \r
29 public class AlignFrame extends GAlignFrame\r
30 {\r
31   final AlignmentPanel alignPanel;\r
32   final AlignViewport viewport;\r
33   public static final int NEW_WINDOW_WIDTH = 700;\r
34   public static final int NEW_WINDOW_HEIGHT = 500;\r
35 \r
36   public AlignFrame(AlignmentI al)\r
37   {\r
38     try{\r
39       String ip = java.net.InetAddress.getLocalHost().getHostAddress();\r
40       if( !ip.startsWith("10."))\r
41         alignMenu.setVisible(false);\r
42     }\r
43     catch(java.net.UnknownHostException e){}\r
44     viewport = new AlignViewport(al,true,true,false);\r
45 \r
46     String fontName = jalview.bin.Cache.getProperty("FONT_NAME");\r
47     String fontStyle= jalview.bin.Cache.getProperty("FONT_STYLE");\r
48     String fontSize = jalview.bin.Cache.getProperty("FONT_SIZE");\r
49     if(fontName!=null && fontStyle!=null && fontSize!=null)\r
50       viewport.setFont( new Font(fontName,Integer.parseInt(fontStyle),Integer.parseInt(fontSize)) );\r
51 \r
52     // add conservation graph to alignment\r
53     viewport.updateConservation();\r
54     viewport.updateConsensus();\r
55 \r
56 \r
57     alignPanel = new AlignmentPanel(this, viewport);\r
58 \r
59     alignPanel.annotationPanel.adjustPanelHeight();\r
60     alignPanel.annotationSpaceFillerHolder.setPreferredSize(alignPanel.annotationPanel.getPreferredSize());\r
61     alignPanel.annotationScroller.setPreferredSize(alignPanel.annotationPanel.getPreferredSize());\r
62 \r
63     getContentPane().add(alignPanel, java.awt.BorderLayout.CENTER);\r
64 \r
65 \r
66     addInternalFrameListener(new InternalFrameAdapter()\r
67    {\r
68      public void internalFrameActivated(InternalFrameEvent evt)\r
69      {\r
70           javax.swing.SwingUtilities.invokeLater(new Runnable()\r
71           {\r
72             public void run()\r
73             {      alignPanel.requestFocus();    }\r
74           });\r
75 \r
76      }\r
77    });\r
78 \r
79   }\r
80 \r
81   protected void saveAs_actionPerformed(ActionEvent e)\r
82   {\r
83     String suffix [] = null;\r
84     if(e.getActionCommand().equals("FASTA"))\r
85       suffix = new String[]{"fa", "fasta"};\r
86     else if(e.getActionCommand().equals("MSF"))\r
87       suffix = new String[]{"msf"};\r
88     else if(e.getActionCommand().equals("CLUSTAL"))\r
89       suffix = new String[]{"aln"};\r
90     else if(e.getActionCommand().equals("BLC"))\r
91       suffix = new String[]{"blc"};\r
92     else if(e.getActionCommand().equals("PIR"))\r
93       suffix = new String[]{"pir"};\r
94     else if(e.getActionCommand().equals("PFAM"))\r
95       suffix = new String[]{"pfam"};\r
96 \r
97 \r
98     JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.getProperty("LAST_DIRECTORY")\r
99         , suffix, e.getActionCommand()+" file");\r
100     chooser.setFileView(new JalviewFileView());\r
101     chooser.setDialogTitle("Save Alignment to file - "+e.getActionCommand() +" format.");\r
102     chooser.setToolTipText("Save");\r
103     int value = chooser.showSaveDialog(this);\r
104     if(value == JalviewFileChooser.APPROVE_OPTION)\r
105     {\r
106       String choice =  chooser.getSelectedFile().getPath();\r
107       jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);\r
108       String output = FormatAdapter.get(e.getActionCommand(), viewport.getAlignment().getSequences());\r
109       try{\r
110         java.io.PrintWriter out = new java.io.PrintWriter( new java.io.FileWriter( choice )  );\r
111         out.println(output);\r
112         out.close();\r
113       }\r
114       catch(Exception ex){}\r
115     }\r
116 \r
117   }\r
118 \r
119   protected void outputText_actionPerformed(ActionEvent e)\r
120   {\r
121      CutAndPasteTransfer cap = new CutAndPasteTransfer(false);\r
122      JInternalFrame frame = new JInternalFrame();\r
123      cap.formatForOutput();\r
124      frame.setContentPane(cap);\r
125      Desktop.addInternalFrame(frame, "Alignment output - "+e.getActionCommand(), 600, 500);\r
126      cap.setText( FormatAdapter.get(e.getActionCommand(), viewport.getAlignment().getSequences()));\r
127   }\r
128 \r
129   protected void htmlMenuItem_actionPerformed(ActionEvent e)\r
130   {\r
131     HTMLOutput htmlOutput = new HTMLOutput(viewport);\r
132     htmlOutput = null;\r
133   }\r
134 \r
135   protected void createPNG_actionPerformed(ActionEvent e)\r
136   {\r
137     alignPanel.makePNG();\r
138   }\r
139 \r
140   protected void epsFile_actionPerformed(ActionEvent e)\r
141   {\r
142     alignPanel.makeEPS();\r
143   }\r
144 \r
145 \r
146   public void printMenuItem_actionPerformed(ActionEvent e)\r
147   {\r
148     //Putting in a thread avoids Swing painting problems\r
149     PrintThread thread = new PrintThread();\r
150     thread.start();\r
151   }\r
152 \r
153   class PrintThread extends Thread\r
154   {\r
155     public void run()\r
156     {\r
157       PrinterJob printJob = PrinterJob.getPrinterJob();\r
158       PageFormat pf = printJob.pageDialog(printJob.defaultPage());\r
159       printJob.setPrintable(alignPanel, pf);\r
160       if (printJob.printDialog())\r
161       {\r
162         try\r
163         {\r
164           printJob.print();\r
165         }\r
166         catch (Exception PrintException)\r
167         {\r
168           PrintException.printStackTrace();\r
169         }\r
170       }\r
171     }\r
172 \r
173   }\r
174 \r
175 \r
176 \r
177 \r
178   public void closeMenuItem_actionPerformed(ActionEvent e)\r
179   {\r
180     try{\r
181       this.setClosed(true);\r
182     }catch(Exception ex){}\r
183   }\r
184 \r
185   Stack historyList = new Stack();\r
186   Stack redoList = new Stack();\r
187   JMenuBar jMenuBar1 = new JMenuBar();\r
188 \r
189   void updateEditMenuBar()\r
190   {\r
191     if(historyList.size()>0)\r
192      {\r
193        undoMenuItem.setEnabled(true);\r
194        Object [] history = (Object[])historyList.get(0);\r
195        undoMenuItem.setText("Undo "+history[0]);\r
196      }\r
197     else\r
198     {\r
199       undoMenuItem.setEnabled(false);\r
200       undoMenuItem.setText("Undo");\r
201     }\r
202 \r
203     if(redoList.size()>0)\r
204      {\r
205        redoMenuItem.setEnabled(true);\r
206        Object [] history = (Object[])redoList.get(0);\r
207        redoMenuItem.setText("Redo "+history[0]);\r
208      }\r
209     else\r
210     {\r
211       redoMenuItem.setEnabled(false);\r
212       redoMenuItem.setText("Redo");\r
213     }\r
214   }\r
215 \r
216   public void addHistoryItem(String type)\r
217   {\r
218     // must make sure we add new sequence objects her, not refs to the existing sequences\r
219     redoList.clear();\r
220     SequenceI[] seq = new SequenceI[viewport.getAlignment().getHeight()];\r
221     for(int i=0; i<viewport.getAlignment().getHeight(); i++)\r
222     {\r
223       seq[i] = new Sequence( viewport.getAlignment().getSequenceAt(i).getName(),\r
224                              viewport.getAlignment().getSequenceAt(i).getSequence());\r
225     }\r
226 \r
227     historyList.add(0, new Object[]{type,  seq} );\r
228     updateEditMenuBar();\r
229   }\r
230 \r
231   protected void undoMenuItem_actionPerformed(ActionEvent e)\r
232   {\r
233     Object [] history = (Object[])historyList.remove(0);\r
234     // add the redo state before continuing!!\r
235     SequenceI[] seq = new SequenceI[viewport.getAlignment().getHeight()];\r
236     for (int i = 0; i < viewport.getAlignment().getHeight(); i++)\r
237     {\r
238       seq[i] = new Sequence(viewport.getAlignment().getSequenceAt(i).getName(),\r
239                             viewport.getAlignment().getSequenceAt(i).\r
240                             getSequence());\r
241     }\r
242     /////////\r
243 \r
244     redoList.add(0, new Object[] {history[0], seq});\r
245 \r
246       seq = (SequenceI[]) history[1];\r
247       viewport.setAlignment( new Alignment(seq) );\r
248       updateEditMenuBar();\r
249       viewport.updateConsensus();\r
250       alignPanel.RefreshPanels();\r
251       alignPanel.RefreshPanels();\r
252   }\r
253 \r
254   public void moveSelectedSequences(boolean up)\r
255   {\r
256     SequenceGroup sg = viewport.getSelectionGroup();\r
257     if (sg == null)\r
258       return;\r
259 \r
260     if (up)\r
261     {\r
262       for (int i = 1; i < viewport.alignment.getHeight(); i++)\r
263       {\r
264         SequenceI seq = viewport.alignment.getSequenceAt(i);\r
265         if (!sg.sequences.contains(seq))\r
266           continue;\r
267 \r
268         SequenceI temp = viewport.alignment.getSequenceAt(i - 1);\r
269         if (sg.sequences.contains(temp))\r
270           continue;\r
271 \r
272         viewport.alignment.getSequences().setElementAt(temp, i);\r
273         viewport.alignment.getSequences().setElementAt(seq, i - 1);\r
274       }\r
275     }\r
276     else\r
277     {\r
278       for (int i = viewport.alignment.getHeight() - 2; i > -1; i--)\r
279       {\r
280         SequenceI seq = viewport.alignment.getSequenceAt(i);\r
281         if (!sg.sequences.contains(seq))\r
282           continue;\r
283 \r
284         SequenceI temp = viewport.alignment.getSequenceAt(i + 1);\r
285         if (sg.sequences.contains(temp))\r
286           continue;\r
287 \r
288         viewport.alignment.getSequences().setElementAt(temp, i);\r
289         viewport.alignment.getSequences().setElementAt(seq, i + 1);\r
290       }\r
291     }\r
292 \r
293     alignPanel.RefreshPanels();\r
294   }\r
295 \r
296 \r
297 \r
298   protected void copy_actionPerformed(ActionEvent e)\r
299   {\r
300    if(viewport.getSelectionGroup()==null)\r
301      return;\r
302 \r
303    SequenceGroup sg = viewport.getSelectionGroup();\r
304 \r
305      Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();\r
306      StringBuffer buffer= new StringBuffer();\r
307 \r
308        for(int i=0; i<sg.getSize(); i++)\r
309        {\r
310          SequenceI seq = sg.getSequenceAt(i);\r
311          buffer.append( seq.getName()+"\t"+seq.findPosition( sg.getStartRes() ) +"\t"\r
312                         +seq.findPosition( sg.getEndRes() )+ "\t"\r
313                         +sg.getSequenceAt(i).getSequence(sg.getStartRes(), sg.getEndRes()+1)+"\n");\r
314        }\r
315      c.setContents( new StringSelection( buffer.toString()) , null ) ;\r
316 \r
317   }\r
318 \r
319 \r
320   protected void pasteNew_actionPerformed(ActionEvent e)\r
321   {\r
322     paste(true);\r
323   }\r
324 \r
325   protected void pasteThis_actionPerformed(ActionEvent e)\r
326   {\r
327     addHistoryItem("Paste");\r
328     paste(false);\r
329   }\r
330 \r
331   void paste(boolean newAlignment)\r
332   {\r
333     try{\r
334       Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();\r
335       Transferable contents = c.getContents(this);\r
336       if (contents == null)\r
337         return;\r
338 \r
339       String str = (String) contents.getTransferData(DataFlavor.stringFlavor);\r
340       StringTokenizer st = new StringTokenizer(str);\r
341       ArrayList seqs = new ArrayList();\r
342       while (st.hasMoreElements())\r
343       {\r
344         String name = st.nextToken();\r
345         int start = Integer.parseInt(st.nextToken());\r
346         int end = Integer.parseInt(st.nextToken());\r
347         Sequence sequence = new Sequence(name,st.nextToken(), start, end);\r
348 \r
349         if(!newAlignment)\r
350           viewport.alignment.addSequence(sequence);\r
351         else\r
352           seqs.add(sequence);\r
353       }\r
354 \r
355       if(newAlignment)\r
356       {\r
357         SequenceI[] newSeqs = new SequenceI[seqs.size()];\r
358         seqs.toArray(newSeqs);\r
359         AlignFrame af = new AlignFrame(new Alignment(newSeqs));\r
360         Desktop.addInternalFrame(af, "Copied sequences", NEW_WINDOW_WIDTH, NEW_WINDOW_HEIGHT);\r
361       }\r
362       else\r
363       {\r
364         viewport.setEndSeq(viewport.alignment.getHeight());\r
365         viewport.alignment.getWidth();\r
366         viewport.updateConservation();\r
367         viewport.updateConsensus();\r
368         alignPanel.RefreshPanels();\r
369       }\r
370 \r
371     }catch(Exception ex){}// could be anything being pasted in here\r
372 \r
373   }\r
374 \r
375 \r
376   protected void cut_actionPerformed(ActionEvent e)\r
377   {\r
378     copy_actionPerformed(null);\r
379     delete_actionPerformed(null);\r
380   }\r
381 \r
382   protected void delete_actionPerformed(ActionEvent e)\r
383   {\r
384     addHistoryItem("Delete");\r
385     if (viewport.getSelectionGroup() == null)\r
386       return;\r
387 \r
388      SequenceGroup sg = viewport.getSelectionGroup();\r
389      for (int i=0;i < sg.sequences.size(); i++)\r
390      {\r
391        SequenceI seq = sg.getSequenceAt(i);\r
392        int index = viewport.getAlignment().findIndex(seq);\r
393        seq.deleteChars(sg.getStartRes(), sg.getEndRes()+1);\r
394 \r
395        if(seq.getSequence().length()<1)\r
396           viewport.getAlignment().deleteSequence(seq);\r
397       else\r
398           viewport.getAlignment().getSequences().setElementAt(seq, index);\r
399      }\r
400 \r
401      viewport.setSelectionGroup(null);\r
402      viewport.alignment.deleteGroup(sg);\r
403      viewport.resetSeqLimits( alignPanel.seqPanel.seqCanvas.getHeight());\r
404      if(viewport.getAlignment().getHeight()<1)\r
405      try\r
406      {\r
407        this.setClosed(true);\r
408      }catch(Exception ex){}\r
409    viewport.updateConservation();\r
410    viewport.updateConsensus();\r
411      alignPanel.RefreshPanels();\r
412 \r
413   }\r
414 \r
415 \r
416 \r
417   protected void redoMenuItem_actionPerformed(ActionEvent e)\r
418   {\r
419      Object [] history = (Object[])redoList.remove(0);\r
420      SequenceI[] seq = (SequenceI[]) history[1];\r
421      viewport.setAlignment( new Alignment(seq) );\r
422      updateEditMenuBar();\r
423      viewport.updateConsensus();\r
424      alignPanel.RefreshPanels();\r
425      alignPanel.RefreshPanels();\r
426   }\r
427 \r
428 \r
429   protected void deleteGroups_actionPerformed(ActionEvent e)\r
430   {\r
431     viewport.alignment.deleteAllGroups();\r
432     viewport.setSelectionGroup(null);\r
433 \r
434     alignPanel.RefreshPanels();\r
435   }\r
436 \r
437 \r
438 \r
439   public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)\r
440   {\r
441     SequenceGroup sg = new SequenceGroup();\r
442     for (int i=0; i<viewport.getAlignment().getSequences().size(); i++)\r
443       sg.addSequence( viewport.getAlignment().getSequenceAt(i));\r
444     sg.setEndRes(viewport.alignment.getWidth());\r
445     viewport.setSelectionGroup(sg);\r
446     PaintRefresher.Refresh(null);\r
447   }\r
448 \r
449   public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)\r
450   {\r
451     viewport.setSelectionGroup(null);\r
452     PaintRefresher.Refresh(null);\r
453   }\r
454 \r
455   public void invertSequenceMenuItem_actionPerformed(ActionEvent e)\r
456   {\r
457     SequenceGroup sg = viewport.getSelectionGroup();\r
458     for (int i=0; i<viewport.getAlignment().getSequences().size(); i++)\r
459       sg.addOrRemove (viewport.getAlignment().getSequenceAt(i));\r
460 \r
461     PaintRefresher.Refresh(null);\r
462   }\r
463 \r
464 \r
465   public void deselectAllColumnsMenuItem_actionPerformed(ActionEvent e)\r
466   {\r
467     viewport.getColumnSelection().clear();\r
468     repaint();\r
469   }\r
470 \r
471   public void remove2LeftMenuItem_actionPerformed(ActionEvent e)\r
472   {\r
473     addHistoryItem("delete columns");\r
474     ColumnSelection colSel = viewport.getColumnSelection();\r
475     if (colSel.size() > 0)\r
476     {\r
477       int min = colSel.getMin();\r
478       viewport.getAlignment().trimLeft(min);\r
479       colSel.compensateForEdit(0,min);\r
480 \r
481       if(viewport.getSelectionGroup()!=null)\r
482         viewport.getSelectionGroup().adjustForRemoveLeft(min);\r
483 \r
484       Vector groups = viewport.alignment.getGroups();\r
485       for(int i=0; i<groups.size(); i++)\r
486       {\r
487         SequenceGroup sg = (SequenceGroup) groups.get(i);\r
488         if(!sg.adjustForRemoveLeft(min))\r
489           viewport.alignment.deleteGroup(sg);\r
490       }\r
491 \r
492       alignPanel.RefreshPanels();\r
493     }\r
494   }\r
495 \r
496   public void remove2RightMenuItem_actionPerformed(ActionEvent e)\r
497   {\r
498     addHistoryItem("delete columns");\r
499     ColumnSelection colSel = viewport.getColumnSelection();\r
500     if (colSel.size() > 0)\r
501     {\r
502       int max = colSel.getMax();\r
503       viewport.getAlignment().trimRight(max);\r
504       if(viewport.getSelectionGroup()!=null)\r
505         viewport.getSelectionGroup().adjustForRemoveRight(max);\r
506 \r
507       Vector groups = viewport.alignment.getGroups();\r
508       for(int i=0; i<groups.size(); i++)\r
509       {\r
510         SequenceGroup sg = (SequenceGroup) groups.get(i);\r
511         if(!sg.adjustForRemoveRight(max))\r
512           viewport.alignment.deleteGroup(sg);\r
513       }\r
514 \r
515 \r
516 \r
517       alignPanel.RefreshPanels();\r
518     }\r
519 \r
520   }\r
521 \r
522   public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)\r
523   {\r
524     addHistoryItem("delete gapped columns");\r
525     viewport.getAlignment().removeGaps();\r
526     viewport.updateConservation();\r
527     viewport.updateConsensus();\r
528     alignPanel.RefreshPanels();\r
529   }\r
530 \r
531   public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)\r
532   {\r
533     addHistoryItem("delete all gaps");\r
534     SequenceI current;\r
535     int jSize;\r
536     for (int i=0; i < viewport.getAlignment().getSequences().size();i++)\r
537     {\r
538       current = viewport.getAlignment().getSequenceAt(i);\r
539       jSize = current.getLength();\r
540       for (int j=0; j < jSize; j++)\r
541         if(jalview.util.Comparison.isGap(current.getCharAt(j)))\r
542         {\r
543           current.deleteCharAt(j);\r
544           j--;\r
545           jSize--;\r
546         }\r
547     }\r
548     viewport.updateConservation();\r
549     viewport.updateConsensus();\r
550     alignPanel.RefreshPanels();\r
551   }\r
552 \r
553   public void setGapCharMenuItem_actionPerformed(ActionEvent e)\r
554   {\r
555     char thisChar = '-';\r
556     char nextChar = '.';\r
557     if(viewport.getGapCharacter()=='-')\r
558     {\r
559       thisChar = '.';\r
560       nextChar = '-';\r
561     }\r
562     setGapCharMenuItem.setText("Set gap character to \""+nextChar+"\"");\r
563     viewport.setGapCharacter(thisChar);\r
564     alignPanel.RefreshPanels();\r
565   }\r
566 \r
567   public void findMenuItem_actionPerformed(ActionEvent e)\r
568   {\r
569     JInternalFrame frame = new JInternalFrame();\r
570     Finder finder = new Finder(viewport, alignPanel, frame);\r
571     frame.setContentPane(finder);\r
572     Desktop.addInternalFrame(frame, "Find", 340,110, false);\r
573     frame.setLayer(JLayeredPane.PALETTE_LAYER);\r
574 \r
575   }\r
576 \r
577 \r
578   public void font_actionPerformed(ActionEvent e)\r
579   {\r
580     JInternalFrame frame = new JInternalFrame();\r
581     FontChooser fc = new FontChooser( alignPanel, frame );\r
582     frame.setContentPane(fc);\r
583     Desktop.addInternalFrame(frame, "Change Font", 480,100);\r
584   }\r
585 \r
586   protected void fullSeqId_actionPerformed(ActionEvent e)\r
587   {\r
588     viewport.setShowFullId( fullSeqId.isSelected() );\r
589 \r
590     alignPanel.idPanel.idCanvas.setPreferredSize( alignPanel.calculateIdWidth() );\r
591     alignPanel.RefreshPanels();\r
592   }\r
593 \r
594   protected void colourTextMenuItem_actionPerformed(ActionEvent e)\r
595   {\r
596       viewport.setColourText( colourTextMenuItem.isSelected() );\r
597       alignPanel.RefreshPanels();\r
598   }\r
599 \r
600   protected void wrapMenuItem_actionPerformed(ActionEvent e)\r
601   {\r
602     viewport.setWrapAlignment( wrapMenuItem.isSelected() );\r
603     alignPanel.setWrapAlignment( wrapMenuItem.isSelected() );\r
604     scaleAbove.setVisible( wrapMenuItem.isSelected() );\r
605     scaleLeft.setVisible( wrapMenuItem.isSelected() );\r
606     scaleRight.setVisible( wrapMenuItem.isSelected() );\r
607     alignPanel.RefreshPanels();\r
608   }\r
609 \r
610   protected void scaleAbove_actionPerformed(ActionEvent e)\r
611   {\r
612     viewport.setScaleAboveWrapped(scaleAbove.isSelected());\r
613     alignPanel.repaint();\r
614   }\r
615 \r
616   protected void scaleLeft_actionPerformed(ActionEvent e)\r
617   {\r
618     viewport.setScaleLeftWrapped(scaleLeft.isSelected());\r
619     alignPanel.repaint();\r
620   }\r
621 \r
622   protected void scaleRight_actionPerformed(ActionEvent e)\r
623   {\r
624     viewport.setScaleRightWrapped(scaleRight.isSelected());\r
625     alignPanel.repaint();\r
626   }\r
627 \r
628 \r
629 \r
630   public void viewBoxesMenuItem_actionPerformed(ActionEvent e)\r
631   {\r
632     viewport.setShowBoxes( viewBoxesMenuItem.isSelected() );\r
633     alignPanel.RefreshPanels();\r
634   }\r
635 \r
636   public void viewTextMenuItem_actionPerformed(ActionEvent e)\r
637   {\r
638     viewport.setShowText( viewTextMenuItem.isSelected() );\r
639     alignPanel.RefreshPanels();\r
640   }\r
641 \r
642 \r
643   protected void renderGapsMenuItem_actionPerformed(ActionEvent e)\r
644   {\r
645     viewport.setRenderGaps(renderGapsMenuItem.isSelected());\r
646     alignPanel.RefreshPanels();\r
647   }\r
648 \r
649   public void sequenceFeatures_actionPerformed(ActionEvent evt)\r
650   {\r
651     viewport.showSequenceFeatures(sequenceFeatures.isSelected());\r
652     if(viewport.showSequenceFeatures && !((Alignment)viewport.alignment).featuresAdded)\r
653     {\r
654          AlignmentUtil.fetchSequenceFeatures( viewport.alignment , alignPanel);\r
655          ((Alignment)viewport.alignment).featuresAdded = true;\r
656     }\r
657     alignPanel.RefreshPanels();\r
658   }\r
659 \r
660   public void annotationPanelMenuItem_actionPerformed(ActionEvent e)\r
661   {\r
662     if(annotationPanelMenuItem.isSelected() && viewport.getWrapAlignment())\r
663     {\r
664       annotationPanelMenuItem.setSelected(false);\r
665       return;\r
666     }\r
667     viewport.setShowAnnotation( annotationPanelMenuItem.isSelected() );\r
668     alignPanel.setAnnotationVisible( annotationPanelMenuItem.isSelected() );\r
669   }\r
670 \r
671   public void overviewMenuItem_actionPerformed(ActionEvent e)\r
672   {\r
673     if (alignPanel.overviewPanel != null)\r
674       return;\r
675 \r
676     JInternalFrame frame = new JInternalFrame();\r
677     OverviewPanel overview = alignPanel.getOverviewPanel();\r
678    try{\r
679      overview = new OverviewPanel(alignPanel, viewport);\r
680      frame.setContentPane(overview);\r
681     Desktop.addInternalFrame(frame, "Overview " + this.getTitle(),\r
682                              frame.getWidth(), frame.getHeight());\r
683     frame.pack();\r
684     frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()\r
685     { public void internalFrameClosed(javax.swing.event.InternalFrameEvent evt)\r
686       {\r
687             alignPanel.setOverviewPanel(null);\r
688       };\r
689     });\r
690     alignPanel.setOverviewPanel( overview );\r
691 \r
692   }catch(java.lang.OutOfMemoryError ex)\r
693    {\r
694      JOptionPane.showInternalMessageDialog(this, "Sequence alignment too large to\nproduce overview image!!"\r
695                                    +"\nTry reducing the font size.",\r
696                                    "Out of memory", JOptionPane.WARNING_MESSAGE);\r
697    }\r
698 \r
699 \r
700   }\r
701 \r
702   protected void noColourmenuItem_actionPerformed(ActionEvent e)\r
703   {\r
704     changeColour( null );\r
705   }\r
706 \r
707 \r
708   public void clustalColour_actionPerformed(ActionEvent e)\r
709   {\r
710     abovePIDThreshold.setSelected(false);\r
711     changeColour(new ClustalxColourScheme(viewport.alignment.getSequences(), viewport.alignment.getWidth()));\r
712   }\r
713 \r
714   public void zappoColour_actionPerformed(ActionEvent e)\r
715   {\r
716     changeColour(new ZappoColourScheme());\r
717   }\r
718 \r
719   public void taylorColour_actionPerformed(ActionEvent e)\r
720   {\r
721     changeColour(new TaylorColourScheme());\r
722   }\r
723 \r
724 \r
725   public void hydrophobicityColour_actionPerformed(ActionEvent e)\r
726   {\r
727     changeColour( new HydrophobicColourScheme() );\r
728   }\r
729 \r
730   public void helixColour_actionPerformed(ActionEvent e)\r
731   {\r
732     changeColour(new HelixColourScheme() );\r
733   }\r
734 \r
735 \r
736   public void strandColour_actionPerformed(ActionEvent e)\r
737   {\r
738     changeColour(new StrandColourScheme());\r
739   }\r
740 \r
741 \r
742   public void turnColour_actionPerformed(ActionEvent e)\r
743   {\r
744     changeColour(new TurnColourScheme());\r
745   }\r
746 \r
747 \r
748   public void buriedColour_actionPerformed(ActionEvent e)\r
749   {\r
750     changeColour(new BuriedColourScheme() );\r
751   }\r
752 \r
753   public void nucleotideColour_actionPerformed(ActionEvent e)\r
754   {\r
755     changeColour(new NucleotideColourScheme());\r
756   }\r
757 \r
758 \r
759   protected void applyToAllGroups_actionPerformed(ActionEvent e)\r
760   {\r
761     viewport.setColourAppliesToAllGroups(applyToAllGroups.isSelected());\r
762   }\r
763 \r
764 \r
765 \r
766   void changeColour(ColourSchemeI cs)\r
767   {\r
768 \r
769     if(viewport.getColourAppliesToAllGroups())\r
770     {\r
771       Vector groups = viewport.alignment.getGroups();\r
772       for(int i=0; i<groups.size(); i++)\r
773       {\r
774         SequenceGroup sg = (SequenceGroup)groups.elementAt(i);\r
775         sg.cs = cs;\r
776 \r
777         if(abovePIDThreshold.isSelected())\r
778           abovePIDThreshold_actionPerformed(null);\r
779         else if( viewport.getConservationSelected() )\r
780         {\r
781           Conservation c = new Conservation("Group",\r
782                                             ResidueProperties.propHash, 3,\r
783                                             sg.sequences, sg.getStartRes(),\r
784                                             sg.getEndRes());\r
785           c.calculate();\r
786           c.verdict(false, 100);\r
787           ConservationColourScheme ccs = new ConservationColourScheme(c, sg.cs);\r
788 \r
789           sg.cs = ccs;\r
790         }\r
791 \r
792       }\r
793     }\r
794 \r
795 \r
796     if ( viewport.getAbovePIDThreshold() )\r
797     {\r
798  //     int threshold = 0;\r
799    //   threshold = Desktop.setPIDSliderSource(alignPanel, cs, "Background");\r
800       Desktop.hideConservationSlider();\r
801 \r
802  //     if (cs instanceof ResidueColourScheme)\r
803  //       ( (ResidueColourScheme) cs).setThreshold(threshold);\r
804   //    else if (cs instanceof ScoreColourScheme)\r
805    //     ( (ScoreColourScheme) cs).setThreshold(threshold);\r
806 \r
807       viewport.setGlobalColourScheme(cs);\r
808 \r
809     }\r
810     else\r
811     if (cs instanceof ResidueColourScheme)\r
812       ( (ResidueColourScheme) cs).setThreshold(0);\r
813     else if (cs instanceof ScoreColourScheme)\r
814       ( (ScoreColourScheme) cs).setThreshold(0);\r
815 \r
816 \r
817 \r
818 \r
819 if ( viewport.getConservationSelected() )\r
820  {\r
821    ConservationColourScheme ccs = null;\r
822 \r
823    Alignment al = (Alignment) viewport.alignment;\r
824    Conservation c = new Conservation("All",\r
825                                      ResidueProperties.propHash, 3,\r
826                                      al.getSequences(), 0,\r
827                                      al.getWidth());\r
828 \r
829    c.calculate();\r
830    c.verdict(false, 100);\r
831 \r
832    ccs = new ConservationColourScheme(c, cs);\r
833 \r
834  //  int threshold = Desktop.setConservationSliderSource(alignPanel, ccs,    "Background");\r
835 \r
836  //  ccs.inc = threshold;\r
837 \r
838    viewport.setGlobalColourScheme(ccs);\r
839 \r
840   }\r
841   else\r
842        viewport.setGlobalColourScheme( cs );\r
843 \r
844     alignPanel.RefreshPanels();\r
845   }\r
846 \r
847   protected void modifyPID_actionPerformed(ActionEvent e)\r
848   {\r
849     Desktop.setPIDSliderSource(alignPanel, viewport.getGlobalColourScheme(), "Background");\r
850   }\r
851 \r
852   protected void modifyConservation_actionPerformed(ActionEvent e)\r
853   {\r
854     Desktop.setConservationSliderSource(alignPanel, viewport.globalColourScheme,    "Background");\r
855   }\r
856 \r
857 \r
858   protected  void conservationMenuItem_actionPerformed(ActionEvent e)\r
859   {\r
860     viewport.setConservationSelected(conservationMenuItem.isSelected());\r
861     if(coloursChanging)\r
862       return;\r
863 \r
864     coloursChanging = true;\r
865 \r
866     viewport.setAbovePIDThreshold(false);\r
867     abovePIDThreshold.setSelected(false);\r
868     Desktop.hidePIDSlider();\r
869     if(!viewport.getConservationSelected())\r
870       Desktop.hideConservationSlider();\r
871 \r
872    ColourSchemeI cs = viewport.getGlobalColourScheme();\r
873    if(cs instanceof ConservationColourScheme )\r
874      changeColour( ((ConservationColourScheme)cs).cs );\r
875     else\r
876       changeColour( cs );\r
877 \r
878     coloursChanging = false;\r
879   }\r
880 \r
881   boolean coloursChanging = false;\r
882   public void abovePIDThreshold_actionPerformed(ActionEvent e)\r
883   {\r
884     if(coloursChanging)\r
885       return;\r
886 \r
887     coloursChanging = true;\r
888     viewport.setAbovePIDThreshold(abovePIDThreshold.isSelected());\r
889 \r
890     conservationMenuItem.setSelected(false);\r
891     viewport.setConservationSelected(false);\r
892     Desktop.hideConservationSlider();\r
893 \r
894     if(!viewport.getAbovePIDThreshold())\r
895       Desktop.hidePIDSlider();\r
896 \r
897 \r
898     ColourSchemeI cs = viewport.getGlobalColourScheme();\r
899     if(cs instanceof ConservationColourScheme )\r
900         changeColour( ((ConservationColourScheme)cs).cs );\r
901     else\r
902         changeColour( cs );\r
903 \r
904     coloursChanging = false;\r
905   }\r
906 \r
907 \r
908 \r
909   public void userDefinedColour_actionPerformed(ActionEvent e)\r
910   {\r
911     JInternalFrame frame = new JInternalFrame();\r
912     UserDefinedColours chooser = new UserDefinedColours( frame, alignPanel, null);\r
913     frame.setContentPane(chooser);\r
914     Desktop.addInternalFrame(frame,"User defined colours", 450,540, false );\r
915   }\r
916 \r
917   public void PIDColour_actionPerformed(ActionEvent e)\r
918   {\r
919     changeColour( new PIDColourScheme() );\r
920   }\r
921 \r
922 \r
923   public void BLOSUM62Colour_actionPerformed(ActionEvent e)\r
924   {\r
925     changeColour(new Blosum62ColourScheme(viewport) );\r
926   }\r
927 \r
928 \r
929 \r
930   public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)\r
931   {\r
932     addHistoryItem("sort");\r
933     AlignmentSorter.sortByPID(viewport.getAlignment(), viewport.getAlignment().getSequenceAt(0));\r
934     alignPanel.RefreshPanels();\r
935   }\r
936 \r
937   public void sortIDMenuItem_actionPerformed(ActionEvent e)\r
938   {\r
939     addHistoryItem("sort");\r
940     AlignmentSorter.sortByID( viewport.getAlignment() );\r
941     alignPanel.RefreshPanels();\r
942   }\r
943 \r
944   public void sortGroupMenuItem_actionPerformed(ActionEvent e)\r
945   {\r
946     addHistoryItem("sort");\r
947     AlignmentSorter.sortByGroup(viewport.getAlignment());\r
948     AlignmentSorter.sortGroups(viewport.getAlignment());\r
949     alignPanel.RefreshPanels();\r
950   }\r
951 \r
952   public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)\r
953   {\r
954     RedundancyPanel sp = new RedundancyPanel(alignPanel);\r
955     JInternalFrame frame = new JInternalFrame();\r
956     frame.setContentPane(sp);\r
957     Desktop.addInternalFrame(frame, "Redundancy threshold selection", 400, 100, false);\r
958 \r
959   }\r
960 \r
961   public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)\r
962   {\r
963     if(viewport.getSelectionGroup().getSize()<2)\r
964       JOptionPane.showInternalMessageDialog(this, "You must select at least 2 sequences.", "Invalid Selection", JOptionPane.WARNING_MESSAGE);\r
965     else\r
966     {\r
967       JInternalFrame frame = new JInternalFrame();\r
968       frame.setContentPane(new PairwiseAlignPanel(viewport));\r
969       Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);\r
970     }\r
971   }\r
972 \r
973   public void PCAMenuItem_actionPerformed(ActionEvent e)\r
974   {\r
975 \r
976     if( (viewport.getSelectionGroup()!=null && viewport.getSelectionGroup().getSize()<4 && viewport.getSelectionGroup().getSize()>0)\r
977        || viewport.getAlignment().getHeight()<4)\r
978     {\r
979       JOptionPane.showInternalMessageDialog(this, "Principal component analysis must take\n"\r
980                                     +"at least 4 input sequences.",\r
981                                     "Sequence selection insufficient",\r
982                                     JOptionPane.WARNING_MESSAGE);\r
983       return;\r
984     }\r
985 \r
986     try{\r
987       PCAPanel pcaPanel = new PCAPanel(viewport, null);\r
988       JInternalFrame frame = new JInternalFrame();\r
989       frame.setContentPane(pcaPanel);\r
990       Desktop.addInternalFrame(frame, "Principal component analysis", 400, 400);\r
991    }catch(java.lang.OutOfMemoryError ex)\r
992    {\r
993      JOptionPane.showInternalMessageDialog(this, "Too many sequences selected\nfor Principal Component Analysis!!",\r
994                                    "Out of memory", JOptionPane.WARNING_MESSAGE);\r
995    }\r
996 \r
997 \r
998   }\r
999 \r
1000   public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)\r
1001   {\r
1002     NewTreePanel("AV", "PID", "Average distance tree using PID");\r
1003   }\r
1004 \r
1005   public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)\r
1006   {\r
1007     NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");\r
1008   }\r
1009 \r
1010 \r
1011   protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)\r
1012   {\r
1013     NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");\r
1014   }\r
1015 \r
1016   protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)\r
1017   {\r
1018     NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62PID");\r
1019   }\r
1020 \r
1021   void NewTreePanel(String type, String pwType, String title)\r
1022   {\r
1023     //are the sequences aligned?\r
1024     if(!viewport.alignment.isAligned())\r
1025     {\r
1026       JOptionPane.showMessageDialog(Desktop.desktop, "The sequences must be aligned before creating a tree.",\r
1027                                     "Sequences not aligned", JOptionPane.WARNING_MESSAGE);\r
1028       return;\r
1029     }\r
1030 \r
1031     final TreePanel tp;\r
1032     if (viewport.getSelectionGroup() != null &&\r
1033         viewport.getSelectionGroup().getSize() > 3)\r
1034     {\r
1035       tp = new TreePanel(viewport, viewport.getSelectionGroup().sequences, type,\r
1036                          pwType,\r
1037                          0, viewport.alignment.getWidth());\r
1038     }\r
1039     else\r
1040     {\r
1041       tp = new TreePanel(viewport, viewport.getAlignment().getSequences(),\r
1042                          type, pwType, 0, viewport.alignment.getWidth());\r
1043     }\r
1044 \r
1045    addTreeMenuItem(tp, title);\r
1046 \r
1047    Desktop.addInternalFrame(tp, title, 600, 500);\r
1048   }\r
1049 \r
1050   void addTreeMenuItem(final TreePanel treePanel, String title)\r
1051   {\r
1052     final JMenuItem item = new JMenuItem(title);\r
1053     sortByTreeMenu.add(item);\r
1054     item.addActionListener(new java.awt.event.ActionListener()\r
1055     {\r
1056       public void actionPerformed(ActionEvent e)\r
1057       {\r
1058         addHistoryItem("sort");\r
1059         AlignmentSorter.sortByTree(viewport.getAlignment(), treePanel.getTree());\r
1060         alignPanel.RefreshPanels();\r
1061       }\r
1062     });\r
1063 \r
1064     treePanel.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()\r
1065     {\r
1066       public void internalFrameClosed(javax.swing.event.InternalFrameEvent evt)\r
1067       {\r
1068         sortByTreeMenu.remove(item);\r
1069       };\r
1070     });\r
1071 \r
1072   }\r
1073 \r
1074 \r
1075   public void clustalAlignMenuItem_actionPerformed(ActionEvent e)\r
1076   {\r
1077     JInternalFrame frame = new JInternalFrame();\r
1078     ClustalThread ct = new ClustalThread(frame);\r
1079     Thread t = new Thread(ct);\r
1080     t.start();\r
1081     frame.setContentPane(ct);\r
1082      Desktop.addInternalFrame(frame, title, 320, 90);\r
1083 \r
1084   }\r
1085 \r
1086   class ClustalThread extends JPanel implements Runnable\r
1087   {\r
1088     Image image;\r
1089     int angle = 0;\r
1090     boolean webServiceRunning = false;\r
1091     JInternalFrame frame;\r
1092     public ClustalThread(JInternalFrame frame)\r
1093     {\r
1094       this.frame = frame;\r
1095 \r
1096       java.net.URL url = getClass().getResource("/images/logo.gif");\r
1097       if (url != null)\r
1098       {\r
1099         image = java.awt.Toolkit.getDefaultToolkit().createImage(url);\r
1100         MediaTracker mt = new MediaTracker(this);\r
1101         mt.addImage(image, 0);\r
1102         try\r
1103         {\r
1104           mt.waitForID(0);\r
1105         }\r
1106         catch (Exception ex)\r
1107         {}\r
1108       }\r
1109 \r
1110       ImageSpinner spinner = new ImageSpinner();\r
1111       spinner.start();\r
1112       webServiceRunning = true;\r
1113     }\r
1114 \r
1115     class ImageSpinner extends Thread\r
1116     {\r
1117       public void run()\r
1118       {\r
1119         while(webServiceRunning)\r
1120         {\r
1121           try{\r
1122             Thread.sleep(10);\r
1123             angle+=1;\r
1124             angle %=360;\r
1125             repaint();\r
1126           }\r
1127           catch(Exception ex){}\r
1128         }\r
1129       }\r
1130     }\r
1131 \r
1132     // JBPNote\r
1133     // Should check to see if the server settings are valid\r
1134     // Need visual-delay indication here.\r
1135     public void run()\r
1136        {\r
1137          jalview.ws.Jemboss jemboss = new jalview.ws.Jemboss();\r
1138          Vector sv = viewport.getAlignment().getSequences();\r
1139          SequenceI[] seqs = new SequenceI[sv.size()];\r
1140 \r
1141          int i = 0;\r
1142          do\r
1143          {\r
1144            seqs[i] = (SequenceI) sv.elementAt(i);\r
1145          }\r
1146          while (++i < sv.size());\r
1147 \r
1148          SequenceI[] alignment = jemboss.clustalW(seqs); // gaps removed within method\r
1149 \r
1150          if (alignment != null)\r
1151          {\r
1152            AlignFrame af = new AlignFrame(new Alignment(alignment));\r
1153            Desktop.addInternalFrame(af, getTitle().concat(" - ClustalW Alignment"),NEW_WINDOW_WIDTH, NEW_WINDOW_HEIGHT);\r
1154            af.clustalColour_actionPerformed(null);\r
1155            af.clustalColour.setSelected(true);\r
1156          }\r
1157          else\r
1158            JOptionPane.showMessageDialog(Desktop.desktop, "Problem obtaining clustal alignment", "Web service error",\r
1159                                          JOptionPane.WARNING_MESSAGE);\r
1160 \r
1161          webServiceRunning = false;\r
1162          try{\r
1163            frame.setClosed(true);\r
1164          }catch(Exception ex){}\r
1165        }\r
1166 \r
1167        public void paintComponent(Graphics g1)\r
1168        {\r
1169          Graphics2D g = (Graphics2D)g1;\r
1170          g.setColor(Color.white);\r
1171          g.fillRect(0,0,getWidth(), getHeight());\r
1172          if(image!=null)\r
1173          {\r
1174 \r
1175            g.rotate (Math.toRadians(angle), 28, 28);\r
1176 \r
1177            g.drawImage(image,10,10,this);\r
1178            g.rotate (-Math.toRadians(angle), 28, 28 );\r
1179          }\r
1180          g.setFont(new Font("Arial", Font.BOLD, 12));\r
1181          g.setColor(Color.black);\r
1182          g.drawString("Clustal Alignment Web Service running", 60,30);\r
1183        }\r
1184   }\r
1185   protected void jpred_actionPerformed(ActionEvent e)\r
1186 {\r
1187 \r
1188     JInternalFrame frame = new JInternalFrame();\r
1189     if (viewport.getSelectionGroup() != null && viewport.getSelectionGroup().getSize()>0)\r
1190     {\r
1191       // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!\r
1192       SequenceGroup seqs = viewport.getSelectionGroup();\r
1193       if (seqs.getSize() == 1 || !viewport.alignment.isAligned())\r
1194       {\r
1195         JPredClient ct = new JPredClient( (SequenceI)\r
1196                                          seqs.getSequenceAt(0));\r
1197       }\r
1198       else\r
1199       {\r
1200         int sz;\r
1201         SequenceI[] msa = new SequenceI[sz=seqs.getSize()];\r
1202         for (int i = 0; i < sz; i++)\r
1203         {\r
1204           msa[i] = (SequenceI) seqs.getSequenceAt(i);\r
1205         }\r
1206 \r
1207         JPredClient ct = new JPredClient(msa);\r
1208       }\r
1209 \r
1210     }\r
1211     else\r
1212     {\r
1213       Vector seqs = viewport.getAlignment().getSequences();\r
1214 \r
1215       if (seqs.size() == 1 || !viewport.alignment.isAligned())\r
1216       {\r
1217         JPredClient ct = new JPredClient( (SequenceI)\r
1218                                          seqs.elementAt(0));\r
1219       }\r
1220       else\r
1221       {\r
1222         SequenceI[] msa = new SequenceI[seqs.size()];\r
1223         for (int i = 0; i < seqs.size(); i++)\r
1224         {\r
1225           msa[i] = (SequenceI) seqs.elementAt(i);\r
1226         }\r
1227 \r
1228         JPredClient ct = new JPredClient(msa);\r
1229       }\r
1230 \r
1231     }\r
1232   }\r
1233 \r
1234     protected void LoadtreeMenuItem_actionPerformed(ActionEvent e) {\r
1235     // Pick the tree file\r
1236     JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.\r
1237         getProperty("LAST_DIRECTORY"));\r
1238     chooser.setFileView(new JalviewFileView());\r
1239     chooser.setDialogTitle("Select a newick-like tree file");\r
1240     chooser.setToolTipText("Load a tree file");\r
1241     int value = chooser.showOpenDialog(null);\r
1242     if (value == JalviewFileChooser.APPROVE_OPTION)\r
1243     {\r
1244       String choice = chooser.getSelectedFile().getPath();\r
1245       jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);\r
1246       TreePanel treepanel = null;\r
1247       try\r
1248       {\r
1249         jalview.io.NewickFile fin = new jalview.io.NewickFile(choice, "File");\r
1250         fin.parse();\r
1251 \r
1252         if (fin.getTree() != null)\r
1253         {\r
1254           TreePanel tp = null;\r
1255           tp = new TreePanel(viewport, viewport.getAlignment().getSequences(),\r
1256                              fin, "FromFile", choice);\r
1257           Desktop.addInternalFrame(tp, title, 600, 500);\r
1258           addTreeMenuItem(tp, title);\r
1259         }\r
1260       }\r
1261       catch (Exception ex)\r
1262       {\r
1263         JOptionPane.showMessageDialog(Desktop.desktop,\r
1264                                       "Problem reading tree file",\r
1265                                       ex.getMessage(),\r
1266                                       JOptionPane.WARNING_MESSAGE);\r
1267         ex.printStackTrace();\r
1268       }\r
1269     }\r
1270   }\r
1271 \r
1272 }\r