cbbc635bb270442481704e6921cf596318250884
[jalview.git] / src / jalview / gui / AlignFrame.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer\r
3  * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
4  *\r
5  * This program is free software; you can redistribute it and/or\r
6  * modify it under the terms of the GNU General Public License\r
7  * as published by the Free Software Foundation; either version 2\r
8  * of the License, or (at your option) any later version.\r
9  *\r
10  * This program is distributed in the hope that it will be useful,\r
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13  * GNU General Public License for more details.\r
14  *\r
15  * You should have received a copy of the GNU General Public License\r
16  * along with this program; if not, write to the Free Software\r
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
18  */\r
19 package jalview.gui;\r
20 \r
21 import jalview.analysis.*;\r
22 \r
23 import jalview.datamodel.*;\r
24 \r
25 import jalview.io.*;\r
26 \r
27 import jalview.jbgui.*;\r
28 \r
29 import jalview.schemes.*;\r
30 \r
31 import jalview.ws.*;\r
32 \r
33 import java.awt.*;\r
34 import java.awt.datatransfer.*;\r
35 import java.awt.event.*;\r
36 import java.awt.print.*;\r
37 \r
38 import java.io.*;\r
39 \r
40 import java.beans.*;\r
41 \r
42 import java.util.*;\r
43 \r
44 import javax.swing.*;\r
45 import javax.swing.event.*;\r
46 \r
47 \r
48 /**\r
49  * DOCUMENT ME!\r
50  *\r
51  * @author $author$\r
52  * @version $Revision$\r
53  */\r
54 public class AlignFrame extends GAlignFrame\r
55 {\r
56     /** DOCUMENT ME!! */\r
57     public static final int NEW_WINDOW_WIDTH = 700;\r
58 \r
59     /** DOCUMENT ME!! */\r
60     public static final int NEW_WINDOW_HEIGHT = 500;\r
61     final AlignmentPanel alignPanel;\r
62     final AlignViewport viewport;\r
63 \r
64     /** DOCUMENT ME!! */\r
65     public String currentFileFormat = null;\r
66     Stack historyList = new Stack();\r
67     Stack redoList = new Stack();\r
68     private int treeCount = 0;\r
69 \r
70     /**\r
71      * Creates a new AlignFrame object.\r
72      *\r
73      * @param al DOCUMENT ME!\r
74      */\r
75     public AlignFrame(AlignmentI al)\r
76     {\r
77         viewport = new AlignViewport(al);\r
78 \r
79         alignPanel = new AlignmentPanel(this, viewport);\r
80         alignPanel.annotationPanel.adjustPanelHeight();\r
81         alignPanel.annotationSpaceFillerHolder.setPreferredSize(alignPanel.annotationPanel.getPreferredSize());\r
82         alignPanel.annotationScroller.setPreferredSize(alignPanel.annotationPanel.getPreferredSize());\r
83         alignPanel.setAnnotationVisible(viewport.getShowAnnotation());\r
84 \r
85         getContentPane().add(alignPanel, java.awt.BorderLayout.CENTER);\r
86 \r
87         addInternalFrameListener(new InternalFrameAdapter()\r
88             {\r
89                 public void internalFrameActivated(InternalFrameEvent evt)\r
90                 {\r
91                     javax.swing.SwingUtilities.invokeLater(new Runnable()\r
92                         {\r
93                             public void run()\r
94                             {\r
95                                 alignPanel.requestFocus();\r
96                             }\r
97                         });\r
98                 }\r
99             });\r
100     }\r
101 \r
102 \r
103     /**\r
104      * DOCUMENT ME!\r
105      *\r
106      * @param e DOCUMENT ME!\r
107      */\r
108     public void parseGroupsFile(String file)\r
109     {\r
110       try{\r
111         BufferedReader in = new BufferedReader(new FileReader(file));\r
112         SequenceI seq=null;\r
113         String line, text, token;\r
114         UserColourScheme ucs;\r
115         int index, start, end;\r
116         StringTokenizer st;\r
117         SequenceGroup sg;\r
118         while( (line = in.readLine())!=null)\r
119         {\r
120           st = new StringTokenizer(line, "\t");\r
121           if(st.countTokens()!=6)\r
122           {\r
123             System.out.println("Groups file "+file+" is invalid. Read help file.");\r
124             System.exit(1);\r
125           }\r
126 \r
127           while(st.hasMoreElements())\r
128           {\r
129             text = st.nextToken();\r
130             token = st.nextToken();\r
131             if(!token.equals("ID_NOT_SPECIFIED"))\r
132             {\r
133               index = viewport.alignment.findIndex(viewport.alignment.findName(\r
134                   token));\r
135               st.nextToken();\r
136             }\r
137             else\r
138               index = Integer.parseInt( st.nextToken() );\r
139 \r
140             start=Integer.parseInt( st.nextToken() );\r
141             end = Integer.parseInt( st.nextToken() );\r
142             ucs = new UserColourScheme(st.nextToken());\r
143 \r
144             seq = viewport.alignment.getSequenceAt(index);\r
145             start = seq.findIndex(start)-1;\r
146             end = seq.findIndex(end)-1;\r
147 \r
148             sg = new SequenceGroup(text,ucs,true,true,false,start,end);\r
149             sg.addSequence( seq,true);\r
150 \r
151             viewport.alignment.addGroup(sg);\r
152           }\r
153         }\r
154 \r
155       }catch(Exception ex){System.out.println("Error parsing groups file: "+ex);}\r
156     }\r
157 \r
158     /**\r
159      * DOCUMENT ME!\r
160      *\r
161      * @param e DOCUMENT ME!\r
162      */\r
163     public void saveAlignmentMenu_actionPerformed(ActionEvent e)\r
164     {\r
165         JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.getProperty(\r
166                     "LAST_DIRECTORY"),\r
167                 new String[]\r
168                 {\r
169                     "fa, fasta, fastq", "aln", "pfam", "msf", "pir", "blc",\r
170                     "jar"\r
171                 },\r
172                 new String[]\r
173                 {\r
174                     "Fasta", "Clustal", "PFAM", "MSF", "PIR", "BLC", "Jalview"\r
175                 }, currentFileFormat);\r
176 \r
177         chooser.setAcceptAllFileFilterUsed(false);\r
178         chooser.setFileView(new JalviewFileView());\r
179         chooser.setDialogTitle("Save Alignment to file");\r
180         chooser.setToolTipText("Save");\r
181 \r
182         int value = chooser.showSaveDialog(this);\r
183 \r
184         if (value == JalviewFileChooser.APPROVE_OPTION)\r
185         {\r
186             currentFileFormat = chooser.getSelectedFormat();\r
187             jalview.bin.Cache.setProperty("DEFAULT_FILE_FORMAT",\r
188                 currentFileFormat);\r
189 \r
190             String choice = chooser.getSelectedFile().getPath();\r
191             jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);\r
192 \r
193             saveAlignment(choice, currentFileFormat);\r
194         }\r
195     }\r
196 \r
197     public boolean saveAlignment(String file, String format)\r
198     {\r
199       if (format.equalsIgnoreCase("Jalview"))\r
200       {\r
201         String shortName = title;\r
202 \r
203         if (shortName.indexOf(java.io.File.separatorChar) > -1)\r
204         {\r
205           shortName = shortName.substring(shortName.lastIndexOf(\r
206               java.io.File.separatorChar) + 1);\r
207         }\r
208 \r
209         Jalview2XML.SaveAlignment(this, file, shortName);\r
210 \r
211         // USE Jalview2XML to save this file\r
212         return true;\r
213       }\r
214       else\r
215       {\r
216         String output = FormatAdapter.formatSequences(format,\r
217             viewport.getAlignment().\r
218             getSequences());\r
219         if(output==null)\r
220           return false;\r
221 \r
222         try\r
223         {\r
224           java.io.PrintWriter out = new java.io.PrintWriter(\r
225               new java.io.FileWriter(file));\r
226           out.println(output);\r
227           out.close();\r
228           return true;\r
229         }\r
230         catch (Exception ex)\r
231         {\r
232           ex.printStackTrace();\r
233         }\r
234       }\r
235       return false;\r
236     }\r
237 \r
238 \r
239     /**\r
240      * DOCUMENT ME!\r
241      *\r
242      * @param e DOCUMENT ME!\r
243      */\r
244     protected void outputText_actionPerformed(ActionEvent e)\r
245     {\r
246         CutAndPasteTransfer cap = new CutAndPasteTransfer();\r
247         Desktop.addInternalFrame(cap,\r
248             "Alignment output - " + e.getActionCommand(), 600, 500);\r
249         cap.setText(FormatAdapter.formatSequences(e.getActionCommand(),\r
250                 viewport.getAlignment().getSequences()));\r
251     }\r
252 \r
253     /**\r
254      * DOCUMENT ME!\r
255      *\r
256      * @param e DOCUMENT ME!\r
257      */\r
258     protected void htmlMenuItem_actionPerformed(ActionEvent e)\r
259     {\r
260         new HTMLOutput(viewport);\r
261     }\r
262 \r
263     public void createImageMap(File file, String image)\r
264     {\r
265       alignPanel.makePNGImageMap(file, image);\r
266     }\r
267 \r
268     /**\r
269      * DOCUMENT ME!\r
270      *\r
271      * @param e DOCUMENT ME!\r
272      */\r
273     public void createPNG(File f)\r
274     {\r
275         alignPanel.makePNG(f);\r
276     }\r
277 \r
278     /**\r
279      * DOCUMENT ME!\r
280      *\r
281      * @param e DOCUMENT ME!\r
282      */\r
283     public void createEPS(File f)\r
284     {\r
285         alignPanel.makeEPS(f);\r
286     }\r
287 \r
288     /**\r
289      * DOCUMENT ME!\r
290      *\r
291      * @param e DOCUMENT ME!\r
292      */\r
293     public void printMenuItem_actionPerformed(ActionEvent e)\r
294     {\r
295         //Putting in a thread avoids Swing painting problems\r
296         PrintThread thread = new PrintThread();\r
297         thread.start();\r
298     }\r
299 \r
300     /**\r
301      * DOCUMENT ME!\r
302      *\r
303      * @param e DOCUMENT ME!\r
304      */\r
305     public void closeMenuItem_actionPerformed(ActionEvent e)\r
306     {\r
307         try\r
308         {\r
309             this.setClosed(true);\r
310         }\r
311         catch (Exception ex)\r
312         {\r
313         }\r
314     }\r
315 \r
316     /**\r
317      * DOCUMENT ME!\r
318      */\r
319     void updateEditMenuBar()\r
320     {\r
321         if (historyList.size() > 0)\r
322         {\r
323             undoMenuItem.setEnabled(true);\r
324 \r
325             HistoryItem hi = (HistoryItem) historyList.peek();\r
326             undoMenuItem.setText("Undo " + hi.getDescription());\r
327         }\r
328         else\r
329         {\r
330             undoMenuItem.setEnabled(false);\r
331             undoMenuItem.setText("Undo");\r
332         }\r
333 \r
334         if (redoList.size() > 0)\r
335         {\r
336             redoMenuItem.setEnabled(true);\r
337 \r
338             HistoryItem hi = (HistoryItem) redoList.peek();\r
339             redoMenuItem.setText("Redo " + hi.getDescription());\r
340         }\r
341         else\r
342         {\r
343             redoMenuItem.setEnabled(false);\r
344             redoMenuItem.setText("Redo");\r
345         }\r
346     }\r
347 \r
348     /**\r
349      * DOCUMENT ME!\r
350      *\r
351      * @param hi DOCUMENT ME!\r
352      */\r
353     public void addHistoryItem(HistoryItem hi)\r
354     {\r
355         historyList.push(hi);\r
356         updateEditMenuBar();\r
357     }\r
358 \r
359     /**\r
360      * DOCUMENT ME!\r
361      *\r
362      * @param e DOCUMENT ME!\r
363      */\r
364     protected void undoMenuItem_actionPerformed(ActionEvent e)\r
365     {\r
366         HistoryItem hi = (HistoryItem) historyList.pop();\r
367         redoList.push(new HistoryItem(hi.getDescription(), viewport.alignment,\r
368                 HistoryItem.HIDE));\r
369         restoreHistoryItem(hi);\r
370     }\r
371 \r
372     /**\r
373      * DOCUMENT ME!\r
374      *\r
375      * @param e DOCUMENT ME!\r
376      */\r
377     protected void redoMenuItem_actionPerformed(ActionEvent e)\r
378     {\r
379         HistoryItem hi = (HistoryItem) redoList.pop();\r
380         restoreHistoryItem(hi);\r
381         updateEditMenuBar();\r
382         viewport.updateConsensus();\r
383         alignPanel.repaint();\r
384         alignPanel.repaint();\r
385     }\r
386 \r
387     // used by undo and redo\r
388     void restoreHistoryItem(HistoryItem hi)\r
389     {\r
390         if (hi.getType() == HistoryItem.SORT)\r
391         {\r
392             for (int i = 0; i < hi.getSequences().size(); i++)\r
393             {\r
394                 viewport.alignment.getSequences().setElementAt(hi.getSequences()\r
395                                                                  .elementAt(i),\r
396                     i);\r
397             }\r
398         }\r
399         else\r
400         {\r
401             for (int i = 0; i < hi.getSequences().size(); i++)\r
402             {\r
403                 SequenceI restore = (SequenceI) hi.getSequences().elementAt(i);\r
404 \r
405                 if (restore.getLength() == 0)\r
406                 {\r
407                     restore.setSequence(hi.getHidden().elementAt(i).toString());\r
408                     viewport.alignment.getSequences().insertElementAt(restore,\r
409                         hi.getAlignIndex(i));\r
410                 }\r
411                 else\r
412                 {\r
413                     restore.setSequence(hi.getHidden().elementAt(i).toString());\r
414                 }\r
415             }\r
416 \r
417             if (hi.getType() == HistoryItem.PASTE)\r
418             {\r
419                 for (int i = viewport.alignment.getHeight() - 1;\r
420                         i > (hi.getSequences().size() - 1); i--)\r
421                 {\r
422                     viewport.alignment.deleteSequence(i);\r
423                 }\r
424             }\r
425         }\r
426 \r
427         updateEditMenuBar();\r
428 \r
429         viewport.updateConsensus();\r
430         viewport.updateConservation();\r
431         alignPanel.repaint();\r
432         viewport.firePropertyChange("alignment", null,\r
433             viewport.getAlignment().getSequences());\r
434     }\r
435 \r
436     /**\r
437      * DOCUMENT ME!\r
438      *\r
439      * @param up DOCUMENT ME!\r
440      */\r
441     public void moveSelectedSequences(boolean up)\r
442     {\r
443         SequenceGroup sg = viewport.getSelectionGroup();\r
444 \r
445         if (sg == null)\r
446         {\r
447             return;\r
448         }\r
449 \r
450         if (up)\r
451         {\r
452             for (int i = 1; i < viewport.alignment.getHeight(); i++)\r
453             {\r
454                 SequenceI seq = viewport.alignment.getSequenceAt(i);\r
455 \r
456                 if (!sg.sequences.contains(seq))\r
457                 {\r
458                     continue;\r
459                 }\r
460 \r
461                 SequenceI temp = viewport.alignment.getSequenceAt(i - 1);\r
462 \r
463                 if (sg.sequences.contains(temp))\r
464                 {\r
465                     continue;\r
466                 }\r
467 \r
468                 viewport.alignment.getSequences().setElementAt(temp, i);\r
469                 viewport.alignment.getSequences().setElementAt(seq, i - 1);\r
470             }\r
471         }\r
472         else\r
473         {\r
474             for (int i = viewport.alignment.getHeight() - 2; i > -1; i--)\r
475             {\r
476                 SequenceI seq = viewport.alignment.getSequenceAt(i);\r
477 \r
478                 if (!sg.sequences.contains(seq))\r
479                 {\r
480                     continue;\r
481                 }\r
482 \r
483                 SequenceI temp = viewport.alignment.getSequenceAt(i + 1);\r
484 \r
485                 if (sg.sequences.contains(temp))\r
486                 {\r
487                     continue;\r
488                 }\r
489 \r
490                 viewport.alignment.getSequences().setElementAt(temp, i);\r
491                 viewport.alignment.getSequences().setElementAt(seq, i + 1);\r
492             }\r
493         }\r
494 \r
495         alignPanel.repaint();\r
496     }\r
497 \r
498     /**\r
499      * DOCUMENT ME!\r
500      *\r
501      * @param e DOCUMENT ME!\r
502      */\r
503     protected void copy_actionPerformed(ActionEvent e)\r
504     {\r
505         if (viewport.getSelectionGroup() == null)\r
506         {\r
507             return;\r
508         }\r
509 \r
510         SequenceGroup sg = viewport.getSelectionGroup();\r
511 \r
512         Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();\r
513         StringBuffer buffer = new StringBuffer();\r
514 \r
515         Hashtable orderedSeqs = new Hashtable();\r
516 \r
517         for (int i = 0; i < sg.getSize(); i++)\r
518         {\r
519             SequenceI seq = sg.getSequenceAt(i);\r
520             int index = viewport.alignment.findIndex(seq);\r
521             orderedSeqs.put(index + "", seq);\r
522         }\r
523 \r
524         int index = 0;\r
525 \r
526         for (int i = 0; i < sg.getSize(); i++)\r
527         {\r
528             SequenceI seq = null;\r
529 \r
530             while (seq == null)\r
531             {\r
532                 if (orderedSeqs.containsKey(index + ""))\r
533                 {\r
534                     seq = (SequenceI) orderedSeqs.get(index + "");\r
535                     index++;\r
536 \r
537                     break;\r
538                 }\r
539                 else\r
540                 {\r
541                     index++;\r
542                 }\r
543             }\r
544 \r
545             buffer.append(seq.getName() + "\t" +\r
546                 seq.findPosition(sg.getStartRes()) + "\t" +\r
547                 seq.findPosition(sg.getEndRes()) + "\t" +\r
548                 sg.getSequenceAt(i).getSequence(sg.getStartRes(),\r
549                     sg.getEndRes() + 1) + "\n");\r
550         }\r
551 \r
552         c.setContents(new StringSelection(buffer.toString()), null);\r
553     }\r
554 \r
555     /**\r
556      * DOCUMENT ME!\r
557      *\r
558      * @param e DOCUMENT ME!\r
559      */\r
560     protected void pasteNew_actionPerformed(ActionEvent e)\r
561     {\r
562         paste(true);\r
563     }\r
564 \r
565     /**\r
566      * DOCUMENT ME!\r
567      *\r
568      * @param e DOCUMENT ME!\r
569      */\r
570     protected void pasteThis_actionPerformed(ActionEvent e)\r
571     {\r
572         addHistoryItem(new HistoryItem("Paste Sequences", viewport.alignment,\r
573                 HistoryItem.PASTE));\r
574         paste(false);\r
575     }\r
576 \r
577     /**\r
578      * DOCUMENT ME!\r
579      *\r
580      * @param newAlignment DOCUMENT ME!\r
581      */\r
582     void paste(boolean newAlignment)\r
583     {\r
584         try\r
585         {\r
586             Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();\r
587             Transferable contents = c.getContents(this);\r
588 \r
589             if (contents == null)\r
590             {\r
591                 return;\r
592             }\r
593 \r
594             String str = (String) contents.getTransferData(DataFlavor.stringFlavor);\r
595             StringTokenizer st = new StringTokenizer(str);\r
596             ArrayList seqs = new ArrayList();\r
597 \r
598             while (st.hasMoreElements())\r
599             {\r
600                 String name = st.nextToken();\r
601                 int start = Integer.parseInt(st.nextToken());\r
602                 int end = Integer.parseInt(st.nextToken());\r
603                 Sequence sequence = new Sequence(name, st.nextToken(), start,\r
604                         end);\r
605 \r
606                 if (!newAlignment)\r
607                 {\r
608                     viewport.alignment.addSequence(sequence);\r
609                 }\r
610                 else\r
611                 {\r
612                     seqs.add(sequence);\r
613                 }\r
614             }\r
615 \r
616             if (newAlignment)\r
617             {\r
618                 SequenceI[] newSeqs = new SequenceI[seqs.size()];\r
619                 seqs.toArray(newSeqs);\r
620 \r
621                 AlignFrame af = new AlignFrame(new Alignment(newSeqs));\r
622                 String newtitle = new String("Copied sequences");\r
623 \r
624                 if (title.startsWith("Copied sequences"))\r
625                 {\r
626                     newtitle = title;\r
627                 }\r
628                 else\r
629                 {\r
630                     newtitle = newtitle.concat("- from " + title);\r
631                 }\r
632 \r
633                 Desktop.addInternalFrame(af, newtitle, NEW_WINDOW_WIDTH,\r
634                     NEW_WINDOW_HEIGHT);\r
635             }\r
636             else\r
637             {\r
638                 viewport.firePropertyChange("alignment", null,\r
639                     viewport.getAlignment().getSequences());\r
640                 viewport.setEndSeq(viewport.alignment.getHeight());\r
641                 viewport.alignment.getWidth();\r
642                 viewport.updateConservation();\r
643                 viewport.updateConsensus();\r
644                 alignPanel.repaint();\r
645             }\r
646         }\r
647         catch (Exception ex)\r
648         {\r
649         }\r
650 \r
651         // could be anything being pasted in here\r
652     }\r
653 \r
654     /**\r
655      * DOCUMENT ME!\r
656      *\r
657      * @param e DOCUMENT ME!\r
658      */\r
659     protected void cut_actionPerformed(ActionEvent e)\r
660     {\r
661         copy_actionPerformed(null);\r
662         delete_actionPerformed(null);\r
663     }\r
664 \r
665     /**\r
666      * DOCUMENT ME!\r
667      *\r
668      * @param e DOCUMENT ME!\r
669      */\r
670     protected void delete_actionPerformed(ActionEvent e)\r
671     {\r
672         boolean seqsdeleted = false;\r
673 \r
674         if (viewport.getSelectionGroup() == null)\r
675         {\r
676             return;\r
677         }\r
678 \r
679         addHistoryItem(new HistoryItem("Delete Sequences", viewport.alignment,\r
680                 HistoryItem.HIDE));\r
681 \r
682         SequenceGroup sg = viewport.getSelectionGroup();\r
683         boolean allSequences = false;\r
684         if(sg.sequences.size()==viewport.alignment.getHeight())\r
685           allSequences = true;\r
686 \r
687         for (int i = 0; i < sg.sequences.size(); i++)\r
688         {\r
689             SequenceI seq = sg.getSequenceAt(i);\r
690             int index = viewport.getAlignment().findIndex(seq);\r
691             seq.deleteChars(sg.getStartRes(), sg.getEndRes() + 1);\r
692 \r
693             // If the cut affects all sequences, remove highlighted columns\r
694             if(allSequences)\r
695             {\r
696               viewport.getColumnSelection().removeElements(sg.getStartRes(), sg.getEndRes()+1);\r
697             }\r
698 \r
699 \r
700             if (seq.getSequence().length() < 1)\r
701             {\r
702                 seqsdeleted = true;\r
703                 viewport.getAlignment().deleteSequence(seq);\r
704             }\r
705             else\r
706             {\r
707                 viewport.getAlignment().getSequences().setElementAt(seq, index);\r
708             }\r
709         }\r
710 \r
711         viewport.setSelectionGroup(null);\r
712         viewport.alignment.deleteGroup(sg);\r
713 \r
714         if (seqsdeleted)\r
715         {\r
716             viewport.firePropertyChange("alignment", null,\r
717                 viewport.getAlignment().getSequences());\r
718         }\r
719 \r
720         viewport.resetSeqLimits(alignPanel.seqPanel.seqCanvas.getHeight());\r
721 \r
722         if (viewport.getAlignment().getHeight() < 1)\r
723         {\r
724             try\r
725             {\r
726                 this.setClosed(true);\r
727             }\r
728             catch (Exception ex)\r
729             {\r
730             }\r
731         }\r
732 \r
733         viewport.updateConservation();\r
734         viewport.updateConsensus();\r
735         alignPanel.repaint();\r
736     }\r
737 \r
738     /**\r
739      * DOCUMENT ME!\r
740      *\r
741      * @param e DOCUMENT ME!\r
742      */\r
743     protected void deleteGroups_actionPerformed(ActionEvent e)\r
744     {\r
745         viewport.alignment.deleteAllGroups();\r
746         viewport.setSelectionGroup(null);\r
747         alignPanel.repaint();\r
748     }\r
749 \r
750     /**\r
751      * DOCUMENT ME!\r
752      *\r
753      * @param e DOCUMENT ME!\r
754      */\r
755     public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)\r
756     {\r
757         SequenceGroup sg = new SequenceGroup();\r
758 \r
759         for (int i = 0; i < viewport.getAlignment().getSequences().size();\r
760                 i++)\r
761         {\r
762             sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);\r
763         }\r
764 \r
765         sg.setEndRes(viewport.alignment.getWidth());\r
766         viewport.setSelectionGroup(sg);\r
767         PaintRefresher.Refresh(null, viewport.alignment);\r
768     }\r
769 \r
770     /**\r
771      * DOCUMENT ME!\r
772      *\r
773      * @param e DOCUMENT ME!\r
774      */\r
775     public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)\r
776     {\r
777         viewport.setSelectionGroup(null);\r
778         viewport.getColumnSelection().clear();\r
779         viewport.setSelectionGroup(null);\r
780         alignPanel.annotationPanel.activeRes = null;\r
781         PaintRefresher.Refresh(null, viewport.alignment);\r
782     }\r
783 \r
784     /**\r
785      * DOCUMENT ME!\r
786      *\r
787      * @param e DOCUMENT ME!\r
788      */\r
789     public void invertSequenceMenuItem_actionPerformed(ActionEvent e)\r
790     {\r
791         SequenceGroup sg = viewport.getSelectionGroup();\r
792 \r
793         if (sg == null)\r
794         {\r
795             selectAllSequenceMenuItem_actionPerformed(null);\r
796 \r
797             return;\r
798         }\r
799 \r
800         for (int i = 0; i < viewport.getAlignment().getSequences().size();\r
801                 i++)\r
802         {\r
803             sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);\r
804         }\r
805 \r
806         PaintRefresher.Refresh(null, viewport.alignment);\r
807     }\r
808 \r
809     /**\r
810      * DOCUMENT ME!\r
811      *\r
812      * @param e DOCUMENT ME!\r
813      */\r
814     public void remove2LeftMenuItem_actionPerformed(ActionEvent e)\r
815     {\r
816         ColumnSelection colSel = viewport.getColumnSelection();\r
817 \r
818         if (colSel.size() > 0)\r
819         {\r
820             addHistoryItem(new HistoryItem("Remove Left", viewport.alignment,\r
821                     HistoryItem.HIDE));\r
822 \r
823             int min = colSel.getMin();\r
824             viewport.getAlignment().trimLeft(min);\r
825             colSel.compensateForEdit(0, min);\r
826 \r
827             if (viewport.getSelectionGroup() != null)\r
828             {\r
829                 viewport.getSelectionGroup().adjustForRemoveLeft(min);\r
830             }\r
831 \r
832             Vector groups = viewport.alignment.getGroups();\r
833 \r
834             for (int i = 0; i < groups.size(); i++)\r
835             {\r
836                 SequenceGroup sg = (SequenceGroup) groups.get(i);\r
837 \r
838                 if (!sg.adjustForRemoveLeft(min))\r
839                 {\r
840                     viewport.alignment.deleteGroup(sg);\r
841                 }\r
842             }\r
843 \r
844             alignPanel.repaint();\r
845         }\r
846     }\r
847 \r
848     /**\r
849      * DOCUMENT ME!\r
850      *\r
851      * @param e DOCUMENT ME!\r
852      */\r
853     public void remove2RightMenuItem_actionPerformed(ActionEvent e)\r
854     {\r
855         ColumnSelection colSel = viewport.getColumnSelection();\r
856 \r
857         if (colSel.size() > 0)\r
858         {\r
859             addHistoryItem(new HistoryItem("Remove Right", viewport.alignment,\r
860                     HistoryItem.HIDE));\r
861 \r
862             int max = colSel.getMax();\r
863             viewport.getAlignment().trimRight(max);\r
864 \r
865             if (viewport.getSelectionGroup() != null)\r
866             {\r
867                 viewport.getSelectionGroup().adjustForRemoveRight(max);\r
868             }\r
869 \r
870             Vector groups = viewport.alignment.getGroups();\r
871 \r
872             for (int i = 0; i < groups.size(); i++)\r
873             {\r
874                 SequenceGroup sg = (SequenceGroup) groups.get(i);\r
875 \r
876                 if (!sg.adjustForRemoveRight(max))\r
877                 {\r
878                     viewport.alignment.deleteGroup(sg);\r
879                 }\r
880             }\r
881 \r
882             alignPanel.repaint();\r
883         }\r
884     }\r
885 \r
886     /**\r
887      * DOCUMENT ME!\r
888      *\r
889      * @param e DOCUMENT ME!\r
890      */\r
891     public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)\r
892     {\r
893         addHistoryItem(new HistoryItem("Remove Gapped Columns",\r
894                 viewport.alignment, HistoryItem.HIDE));\r
895 \r
896         viewport.getAlignment().removeGaps();\r
897         viewport.updateConservation();\r
898         viewport.updateConsensus();\r
899         alignPanel.repaint();\r
900     }\r
901 \r
902     /**\r
903      * DOCUMENT ME!\r
904      *\r
905      * @param e DOCUMENT ME!\r
906      */\r
907     public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)\r
908     {\r
909         addHistoryItem(new HistoryItem("Remove Gaps", viewport.alignment,\r
910                 HistoryItem.HIDE));\r
911 \r
912         SequenceI current;\r
913         int jSize;\r
914 \r
915         Vector seqs = null;\r
916 \r
917         int start = 0;\r
918         int end = viewport.alignment.getWidth();\r
919 \r
920 \r
921         if (viewport.getSelectionGroup() != null\r
922             && viewport.getSelectionGroup().sequences != null\r
923             && viewport.getSelectionGroup().sequences.size()>0)\r
924         {\r
925             seqs = viewport.getSelectionGroup().sequences;\r
926             start = viewport.getSelectionGroup().getStartRes();\r
927             end = viewport.getSelectionGroup().getEndRes();\r
928         }\r
929         else\r
930         {\r
931             seqs = viewport.alignment.getSequences();\r
932         }\r
933 \r
934         for (int i = 0; i < seqs.size(); i++)\r
935         {\r
936             current = (SequenceI) seqs.elementAt(i);\r
937             jSize = current.getLength();\r
938 \r
939             int j = start;\r
940 \r
941             do\r
942             {\r
943                 if (jalview.util.Comparison.isGap(current.getCharAt(j)))\r
944                 {\r
945                     current.deleteCharAt(j);\r
946                     j--;\r
947                     jSize--;\r
948                 }\r
949 \r
950                 j++;\r
951             }\r
952             while (j < end && j < jSize);\r
953         }\r
954 \r
955         viewport.updateConservation();\r
956         viewport.updateConsensus();\r
957         alignPanel.repaint();\r
958     }\r
959 \r
960     /**\r
961      * DOCUMENT ME!\r
962      *\r
963      * @param e DOCUMENT ME!\r
964      */\r
965     public void padGapsMenuitem_actionPerformed(ActionEvent e)\r
966     {\r
967         addHistoryItem(new HistoryItem("Pad Gaps", viewport.alignment,\r
968                 HistoryItem.HIDE));\r
969 \r
970         SequenceI current;\r
971         int Width = viewport.getAlignment().getWidth();\r
972 \r
973         for (int i = 0; i < viewport.getAlignment().getSequences().size();\r
974                 i++)\r
975         {\r
976             current = viewport.getAlignment().getSequenceAt(i);\r
977 \r
978             if (current.getLength() < Width)\r
979             {\r
980                 current.insertCharAt(Width - 1, viewport.getGapCharacter());\r
981             }\r
982         }\r
983 \r
984         viewport.updateConservation();\r
985         viewport.updateConsensus();\r
986         alignPanel.repaint();\r
987     }\r
988 \r
989     /**\r
990      * DOCUMENT ME!\r
991      *\r
992      * @param e DOCUMENT ME!\r
993      */\r
994     public void findMenuItem_actionPerformed(ActionEvent e)\r
995     {\r
996         JInternalFrame frame = new JInternalFrame();\r
997         Finder finder = new Finder(viewport, alignPanel, frame);\r
998         frame.setContentPane(finder);\r
999         Desktop.addInternalFrame(frame, "Find", 340, 110);\r
1000         frame.setLayer(JLayeredPane.PALETTE_LAYER);\r
1001     }\r
1002 \r
1003     /**\r
1004      * DOCUMENT ME!\r
1005      *\r
1006      * @param e DOCUMENT ME!\r
1007      */\r
1008     public void font_actionPerformed(ActionEvent e)\r
1009     {\r
1010         FontChooser fc = new FontChooser(alignPanel);\r
1011     }\r
1012 \r
1013     /**\r
1014      * DOCUMENT ME!\r
1015      *\r
1016      * @param e DOCUMENT ME!\r
1017      */\r
1018     protected void fullSeqId_actionPerformed(ActionEvent e)\r
1019     {\r
1020         viewport.setShowFullId(fullSeqId.isSelected());\r
1021 \r
1022         alignPanel.idPanel.idCanvas.setPreferredSize(alignPanel.calculateIdWidth());\r
1023         alignPanel.repaint();\r
1024     }\r
1025 \r
1026     /**\r
1027      * DOCUMENT ME!\r
1028      *\r
1029      * @param e DOCUMENT ME!\r
1030      */\r
1031     protected void colourTextMenuItem_actionPerformed(ActionEvent e)\r
1032     {\r
1033         viewport.setColourText(colourTextMenuItem.isSelected());\r
1034         alignPanel.repaint();\r
1035     }\r
1036 \r
1037     /**\r
1038      * DOCUMENT ME!\r
1039      *\r
1040      * @param e DOCUMENT ME!\r
1041      */\r
1042     protected void wrapMenuItem_actionPerformed(ActionEvent e)\r
1043     {\r
1044         viewport.setWrapAlignment(wrapMenuItem.isSelected());\r
1045         alignPanel.setWrapAlignment(wrapMenuItem.isSelected());\r
1046         scaleAbove.setVisible(wrapMenuItem.isSelected());\r
1047         scaleLeft.setVisible(wrapMenuItem.isSelected());\r
1048         scaleRight.setVisible(wrapMenuItem.isSelected());\r
1049         alignPanel.repaint();\r
1050     }\r
1051 \r
1052     /**\r
1053      * DOCUMENT ME!\r
1054      *\r
1055      * @param e DOCUMENT ME!\r
1056      */\r
1057     protected void scaleAbove_actionPerformed(ActionEvent e)\r
1058     {\r
1059         viewport.setScaleAboveWrapped(scaleAbove.isSelected());\r
1060         alignPanel.repaint();\r
1061     }\r
1062 \r
1063     /**\r
1064      * DOCUMENT ME!\r
1065      *\r
1066      * @param e DOCUMENT ME!\r
1067      */\r
1068     protected void scaleLeft_actionPerformed(ActionEvent e)\r
1069     {\r
1070         viewport.setScaleLeftWrapped(scaleLeft.isSelected());\r
1071         alignPanel.repaint();\r
1072     }\r
1073 \r
1074     /**\r
1075      * DOCUMENT ME!\r
1076      *\r
1077      * @param e DOCUMENT ME!\r
1078      */\r
1079     protected void scaleRight_actionPerformed(ActionEvent e)\r
1080     {\r
1081         viewport.setScaleRightWrapped(scaleRight.isSelected());\r
1082         alignPanel.repaint();\r
1083     }\r
1084 \r
1085     /**\r
1086      * DOCUMENT ME!\r
1087      *\r
1088      * @param e DOCUMENT ME!\r
1089      */\r
1090     public void viewBoxesMenuItem_actionPerformed(ActionEvent e)\r
1091     {\r
1092         viewport.setShowBoxes(viewBoxesMenuItem.isSelected());\r
1093         alignPanel.repaint();\r
1094     }\r
1095 \r
1096     /**\r
1097      * DOCUMENT ME!\r
1098      *\r
1099      * @param e DOCUMENT ME!\r
1100      */\r
1101     public void viewTextMenuItem_actionPerformed(ActionEvent e)\r
1102     {\r
1103         viewport.setShowText(viewTextMenuItem.isSelected());\r
1104         alignPanel.repaint();\r
1105     }\r
1106 \r
1107     /**\r
1108      * DOCUMENT ME!\r
1109      *\r
1110      * @param e DOCUMENT ME!\r
1111      */\r
1112     protected void renderGapsMenuItem_actionPerformed(ActionEvent e)\r
1113     {\r
1114         viewport.setRenderGaps(renderGapsMenuItem.isSelected());\r
1115         alignPanel.repaint();\r
1116     }\r
1117 \r
1118     /**\r
1119      * DOCUMENT ME!\r
1120      *\r
1121      * @param evt DOCUMENT ME!\r
1122      */\r
1123     public void sequenceFeatures_actionPerformed(ActionEvent evt)\r
1124     {\r
1125         viewport.showSequenceFeatures(sequenceFeatures.isSelected());\r
1126 \r
1127         if (viewport.showSequenceFeatures &&\r
1128                 !((Alignment) viewport.alignment).featuresAdded)\r
1129         {\r
1130             SequenceFeatureFetcher sft = new SequenceFeatureFetcher(viewport.alignment,\r
1131                     alignPanel);\r
1132             ((Alignment) viewport.alignment).featuresAdded = true;\r
1133         }\r
1134 \r
1135         alignPanel.repaint();\r
1136     }\r
1137 \r
1138     /**\r
1139      * DOCUMENT ME!\r
1140      *\r
1141      * @param e DOCUMENT ME!\r
1142      */\r
1143     public void annotationPanelMenuItem_actionPerformed(ActionEvent e)\r
1144     {\r
1145         if (annotationPanelMenuItem.isSelected() &&\r
1146                 viewport.getWrapAlignment())\r
1147         {\r
1148             annotationPanelMenuItem.setSelected(false);\r
1149 \r
1150             return;\r
1151         }\r
1152 \r
1153         viewport.setShowAnnotation(annotationPanelMenuItem.isSelected());\r
1154         alignPanel.setAnnotationVisible(annotationPanelMenuItem.isSelected());\r
1155     }\r
1156 \r
1157     /**\r
1158      * DOCUMENT ME!\r
1159      *\r
1160      * @param e DOCUMENT ME!\r
1161      */\r
1162     public void overviewMenuItem_actionPerformed(ActionEvent e)\r
1163     {\r
1164         if (alignPanel.overviewPanel != null)\r
1165         {\r
1166             return;\r
1167         }\r
1168 \r
1169         JInternalFrame frame = new JInternalFrame();\r
1170         OverviewPanel overview = new OverviewPanel(alignPanel);\r
1171         frame.setContentPane(overview);\r
1172         Desktop.addInternalFrame(frame, "Overview " + this.getTitle(),\r
1173             frame.getWidth(), frame.getHeight());\r
1174         frame.pack();\r
1175         frame.setLayer(JLayeredPane.PALETTE_LAYER);\r
1176         frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()\r
1177             {\r
1178                 public void internalFrameClosed(\r
1179                     javax.swing.event.InternalFrameEvent evt)\r
1180                 {\r
1181                     alignPanel.setOverviewPanel(null);\r
1182                 }\r
1183                 ;\r
1184             });\r
1185 \r
1186         alignPanel.setOverviewPanel(overview);\r
1187     }\r
1188 \r
1189     /**\r
1190      * DOCUMENT ME!\r
1191      *\r
1192      * @param e DOCUMENT ME!\r
1193      */\r
1194     protected void noColourmenuItem_actionPerformed(ActionEvent e)\r
1195     {\r
1196         changeColour(null);\r
1197     }\r
1198 \r
1199     /**\r
1200      * DOCUMENT ME!\r
1201      *\r
1202      * @param e DOCUMENT ME!\r
1203      */\r
1204     public void clustalColour_actionPerformed(ActionEvent e)\r
1205     {\r
1206         changeColour(new ClustalxColourScheme(\r
1207                 viewport.alignment.getSequences(), viewport.alignment.getWidth()));\r
1208     }\r
1209 \r
1210     /**\r
1211      * DOCUMENT ME!\r
1212      *\r
1213      * @param e DOCUMENT ME!\r
1214      */\r
1215     public void zappoColour_actionPerformed(ActionEvent e)\r
1216     {\r
1217         changeColour(new ZappoColourScheme());\r
1218     }\r
1219 \r
1220     /**\r
1221      * DOCUMENT ME!\r
1222      *\r
1223      * @param e DOCUMENT ME!\r
1224      */\r
1225     public void taylorColour_actionPerformed(ActionEvent e)\r
1226     {\r
1227         changeColour(new TaylorColourScheme());\r
1228     }\r
1229 \r
1230     /**\r
1231      * DOCUMENT ME!\r
1232      *\r
1233      * @param e DOCUMENT ME!\r
1234      */\r
1235     public void hydrophobicityColour_actionPerformed(ActionEvent e)\r
1236     {\r
1237         changeColour(new HydrophobicColourScheme());\r
1238     }\r
1239 \r
1240     /**\r
1241      * DOCUMENT ME!\r
1242      *\r
1243      * @param e DOCUMENT ME!\r
1244      */\r
1245     public void helixColour_actionPerformed(ActionEvent e)\r
1246     {\r
1247         changeColour(new HelixColourScheme());\r
1248     }\r
1249 \r
1250     /**\r
1251      * DOCUMENT ME!\r
1252      *\r
1253      * @param e DOCUMENT ME!\r
1254      */\r
1255     public void strandColour_actionPerformed(ActionEvent e)\r
1256     {\r
1257         changeColour(new StrandColourScheme());\r
1258     }\r
1259 \r
1260     /**\r
1261      * DOCUMENT ME!\r
1262      *\r
1263      * @param e DOCUMENT ME!\r
1264      */\r
1265     public void turnColour_actionPerformed(ActionEvent e)\r
1266     {\r
1267         changeColour(new TurnColourScheme());\r
1268     }\r
1269 \r
1270     /**\r
1271      * DOCUMENT ME!\r
1272      *\r
1273      * @param e DOCUMENT ME!\r
1274      */\r
1275     public void buriedColour_actionPerformed(ActionEvent e)\r
1276     {\r
1277         changeColour(new BuriedColourScheme());\r
1278     }\r
1279 \r
1280     /**\r
1281      * DOCUMENT ME!\r
1282      *\r
1283      * @param e DOCUMENT ME!\r
1284      */\r
1285     public void nucleotideColour_actionPerformed(ActionEvent e)\r
1286     {\r
1287         changeColour(new NucleotideColourScheme());\r
1288     }\r
1289 \r
1290     /**\r
1291      * DOCUMENT ME!\r
1292      *\r
1293      * @param e DOCUMENT ME!\r
1294      */\r
1295     protected void applyToAllGroups_actionPerformed(ActionEvent e)\r
1296     {\r
1297         viewport.setColourAppliesToAllGroups(applyToAllGroups.isSelected());\r
1298     }\r
1299 \r
1300     /**\r
1301      * DOCUMENT ME!\r
1302      *\r
1303      * @param cs DOCUMENT ME!\r
1304      */\r
1305     void changeColour(ColourSchemeI cs)\r
1306     {\r
1307         int threshold = 0;\r
1308 \r
1309         if (viewport.getAbovePIDThreshold())\r
1310         {\r
1311             threshold = SliderPanel.setPIDSliderSource(alignPanel, cs,\r
1312                     "Background");\r
1313 \r
1314             if (cs instanceof ResidueColourScheme)\r
1315             {\r
1316                 ((ResidueColourScheme) cs).setThreshold(threshold);\r
1317             }\r
1318             else if (cs instanceof ScoreColourScheme)\r
1319             {\r
1320                 ((ScoreColourScheme) cs).setThreshold(threshold);\r
1321             }\r
1322 \r
1323             viewport.setGlobalColourScheme(cs);\r
1324         }\r
1325         else if (cs instanceof ResidueColourScheme)\r
1326         {\r
1327             ((ResidueColourScheme) cs).setThreshold(0);\r
1328         }\r
1329         else if (cs instanceof ScoreColourScheme)\r
1330         {\r
1331             ((ScoreColourScheme) cs).setThreshold(0);\r
1332         }\r
1333 \r
1334         if (viewport.getConservationSelected())\r
1335         {\r
1336             ConservationColourScheme ccs = null;\r
1337 \r
1338             Alignment al = (Alignment) viewport.alignment;\r
1339             Conservation c = new Conservation("All",\r
1340                     ResidueProperties.propHash, 3, al.getSequences(), 0,\r
1341                     al.getWidth() - 1);\r
1342 \r
1343             c.calculate();\r
1344             c.verdict(false, viewport.ConsPercGaps);\r
1345 \r
1346             ccs = new ConservationColourScheme(c, cs);\r
1347 \r
1348             // MUST NOTIFY THE COLOURSCHEME OF CONSENSUS!\r
1349             ccs.setConsensus(viewport.vconsensus);\r
1350             viewport.setGlobalColourScheme(ccs);\r
1351 \r
1352             ccs.inc = SliderPanel.setConservationSlider(alignPanel, ccs,\r
1353                     "Background");\r
1354         }\r
1355         else\r
1356         {\r
1357             // MUST NOTIFY THE COLOURSCHEME OF CONSENSUS!\r
1358             if (cs != null)\r
1359             {\r
1360                 cs.setConsensus(viewport.vconsensus);\r
1361             }\r
1362 \r
1363             viewport.setGlobalColourScheme(cs);\r
1364         }\r
1365 \r
1366         if (viewport.getColourAppliesToAllGroups())\r
1367         {\r
1368             Vector groups = viewport.alignment.getGroups();\r
1369 \r
1370             for (int i = 0; i < groups.size(); i++)\r
1371             {\r
1372                 SequenceGroup sg = (SequenceGroup) groups.elementAt(i);\r
1373 \r
1374                 if (cs == null)\r
1375                 {\r
1376                     sg.cs = null;\r
1377                 }\r
1378                 else if (cs instanceof ClustalxColourScheme)\r
1379                 {\r
1380                     sg.cs = new ClustalxColourScheme(sg.sequences, sg.getWidth());\r
1381                 }\r
1382                 else if (cs instanceof UserColourScheme)\r
1383                 {\r
1384                     sg.cs = new UserColourScheme(((UserColourScheme) cs).getColours());\r
1385                 }\r
1386                 else\r
1387                 {\r
1388                     try\r
1389                     {\r
1390                         sg.cs = (ColourSchemeI) cs.getClass().newInstance();\r
1391                     }\r
1392                     catch (Exception ex)\r
1393                     {\r
1394                     }\r
1395                 }\r
1396 \r
1397                 if (viewport.getAbovePIDThreshold())\r
1398                 {\r
1399                     if (sg.cs instanceof ResidueColourScheme)\r
1400                     {\r
1401                         ((ResidueColourScheme) sg.cs).setThreshold(threshold);\r
1402                     }\r
1403                     else if (sg.cs instanceof ScoreColourScheme)\r
1404                     {\r
1405                         ((ScoreColourScheme) sg.cs).setThreshold(threshold);\r
1406                     }\r
1407 \r
1408                     sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0,\r
1409                             sg.getWidth()));\r
1410                 }\r
1411 \r
1412                 if (viewport.getConservationSelected())\r
1413                 {\r
1414                     Conservation c = new Conservation("Group",\r
1415                             ResidueProperties.propHash, 3, sg.sequences, 0,\r
1416                             viewport.alignment.getWidth() - 1);\r
1417                     c.calculate();\r
1418                     c.verdict(false, viewport.ConsPercGaps);\r
1419 \r
1420                     ConservationColourScheme ccs = new ConservationColourScheme(c,\r
1421                             sg.cs);\r
1422 \r
1423                     // MUST NOTIFY THE COLOURSCHEME OF CONSENSUS!\r
1424                     ccs.setConsensus(AAFrequency.calculate(sg.sequences, 0,\r
1425                             sg.getWidth()));\r
1426                     sg.cs = ccs;\r
1427                 }\r
1428                 else if (cs != null)\r
1429                 {\r
1430                     // MUST NOTIFY THE COLOURSCHEME OF CONSENSUS!\r
1431                     sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0,\r
1432                             sg.getWidth()));\r
1433                 }\r
1434             }\r
1435         }\r
1436 \r
1437         if (alignPanel.getOverviewPanel() != null)\r
1438         {\r
1439             alignPanel.getOverviewPanel().updateOverviewImage();\r
1440         }\r
1441 \r
1442         alignPanel.repaint();\r
1443     }\r
1444 \r
1445     /**\r
1446      * DOCUMENT ME!\r
1447      *\r
1448      * @param e DOCUMENT ME!\r
1449      */\r
1450     protected void modifyPID_actionPerformed(ActionEvent e)\r
1451     {\r
1452         if (viewport.getAbovePIDThreshold())\r
1453         {\r
1454             SliderPanel.setPIDSliderSource(alignPanel,\r
1455                 viewport.getGlobalColourScheme(), "Background");\r
1456             SliderPanel.showPIDSlider();\r
1457         }\r
1458     }\r
1459 \r
1460     /**\r
1461      * DOCUMENT ME!\r
1462      *\r
1463      * @param e DOCUMENT ME!\r
1464      */\r
1465     protected void modifyConservation_actionPerformed(ActionEvent e)\r
1466     {\r
1467         if (viewport.getConservationSelected())\r
1468         {\r
1469             SliderPanel.setConservationSlider(alignPanel,\r
1470                 viewport.globalColourScheme, "Background");\r
1471             SliderPanel.showConservationSlider();\r
1472         }\r
1473     }\r
1474 \r
1475     /**\r
1476      * DOCUMENT ME!\r
1477      *\r
1478      * @param e DOCUMENT ME!\r
1479      */\r
1480     protected void conservationMenuItem_actionPerformed(ActionEvent e)\r
1481     {\r
1482         viewport.setConservationSelected(conservationMenuItem.isSelected());\r
1483 \r
1484         viewport.setAbovePIDThreshold(false);\r
1485         abovePIDThreshold.setSelected(false);\r
1486 \r
1487         ColourSchemeI cs = viewport.getGlobalColourScheme();\r
1488 \r
1489         if (cs instanceof ConservationColourScheme)\r
1490         {\r
1491             changeColour(((ConservationColourScheme) cs).cs);\r
1492         }\r
1493         else\r
1494         {\r
1495             changeColour(cs);\r
1496         }\r
1497 \r
1498         modifyConservation_actionPerformed(null);\r
1499     }\r
1500 \r
1501     /**\r
1502      * DOCUMENT ME!\r
1503      *\r
1504      * @param e DOCUMENT ME!\r
1505      */\r
1506     public void abovePIDThreshold_actionPerformed(ActionEvent e)\r
1507     {\r
1508         viewport.setAbovePIDThreshold(abovePIDThreshold.isSelected());\r
1509 \r
1510         conservationMenuItem.setSelected(false);\r
1511         viewport.setConservationSelected(false);\r
1512 \r
1513         ColourSchemeI cs = viewport.getGlobalColourScheme();\r
1514 \r
1515         if (cs instanceof ConservationColourScheme)\r
1516         {\r
1517             changeColour(((ConservationColourScheme) cs).cs);\r
1518         }\r
1519         else\r
1520         {\r
1521             changeColour(cs);\r
1522         }\r
1523 \r
1524         modifyPID_actionPerformed(null);\r
1525     }\r
1526 \r
1527     /**\r
1528      * DOCUMENT ME!\r
1529      *\r
1530      * @param e DOCUMENT ME!\r
1531      */\r
1532     public void userDefinedColour_actionPerformed(ActionEvent e)\r
1533     {\r
1534         new UserDefinedColours(alignPanel, null);\r
1535     }\r
1536 \r
1537     /**\r
1538      * DOCUMENT ME!\r
1539      *\r
1540      * @param e DOCUMENT ME!\r
1541      */\r
1542     public void PIDColour_actionPerformed(ActionEvent e)\r
1543     {\r
1544         changeColour(new PIDColourScheme());\r
1545     }\r
1546 \r
1547     /**\r
1548      * DOCUMENT ME!\r
1549      *\r
1550      * @param e DOCUMENT ME!\r
1551      */\r
1552     public void BLOSUM62Colour_actionPerformed(ActionEvent e)\r
1553     {\r
1554         changeColour(new Blosum62ColourScheme());\r
1555     }\r
1556 \r
1557     /**\r
1558      * DOCUMENT ME!\r
1559      *\r
1560      * @param e DOCUMENT ME!\r
1561      */\r
1562     public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)\r
1563     {\r
1564         addHistoryItem(new HistoryItem("Pairwise Sort", viewport.alignment,\r
1565                 HistoryItem.SORT));\r
1566         AlignmentSorter.sortByPID(viewport.getAlignment(),\r
1567             viewport.getAlignment().getSequenceAt(0));\r
1568         alignPanel.repaint();\r
1569     }\r
1570 \r
1571     /**\r
1572      * DOCUMENT ME!\r
1573      *\r
1574      * @param e DOCUMENT ME!\r
1575      */\r
1576     public void sortIDMenuItem_actionPerformed(ActionEvent e)\r
1577     {\r
1578         addHistoryItem(new HistoryItem("ID Sort", viewport.alignment,\r
1579                 HistoryItem.SORT));\r
1580         AlignmentSorter.sortByID(viewport.getAlignment());\r
1581         alignPanel.repaint();\r
1582     }\r
1583 \r
1584     /**\r
1585      * DOCUMENT ME!\r
1586      *\r
1587      * @param e DOCUMENT ME!\r
1588      */\r
1589     public void sortGroupMenuItem_actionPerformed(ActionEvent e)\r
1590     {\r
1591         addHistoryItem(new HistoryItem("Group Sort", viewport.alignment,\r
1592                 HistoryItem.SORT));\r
1593 \r
1594         AlignmentSorter.sortByGroup(viewport.getAlignment());\r
1595         alignPanel.repaint();\r
1596     }\r
1597 \r
1598     /**\r
1599      * DOCUMENT ME!\r
1600      *\r
1601      * @param e DOCUMENT ME!\r
1602      */\r
1603     public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)\r
1604     {\r
1605         RedundancyPanel sp = new RedundancyPanel(alignPanel, this);\r
1606         JInternalFrame frame = new JInternalFrame();\r
1607         frame.setContentPane(sp);\r
1608         Desktop.addInternalFrame(frame, "Redundancy threshold selection", 400,\r
1609             100, false);\r
1610     }\r
1611 \r
1612     /**\r
1613      * DOCUMENT ME!\r
1614      *\r
1615      * @param e DOCUMENT ME!\r
1616      */\r
1617     public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)\r
1618     {\r
1619         if ((viewport.getSelectionGroup() == null) ||\r
1620                 (viewport.getSelectionGroup().getSize() < 2))\r
1621         {\r
1622             JOptionPane.showInternalMessageDialog(this,\r
1623                 "You must select at least 2 sequences.", "Invalid Selection",\r
1624                 JOptionPane.WARNING_MESSAGE);\r
1625         }\r
1626         else\r
1627         {\r
1628             JInternalFrame frame = new JInternalFrame();\r
1629             frame.setContentPane(new PairwiseAlignPanel(viewport));\r
1630             Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);\r
1631         }\r
1632     }\r
1633 \r
1634     /**\r
1635      * DOCUMENT ME!\r
1636      *\r
1637      * @param e DOCUMENT ME!\r
1638      */\r
1639     public void PCAMenuItem_actionPerformed(ActionEvent e)\r
1640     {\r
1641         if (((viewport.getSelectionGroup() != null) &&\r
1642                 (viewport.getSelectionGroup().getSize() < 4) &&\r
1643                 (viewport.getSelectionGroup().getSize() > 0)) ||\r
1644                 (viewport.getAlignment().getHeight() < 4))\r
1645         {\r
1646             JOptionPane.showInternalMessageDialog(this,\r
1647                 "Principal component analysis must take\n" +\r
1648                 "at least 4 input sequences.",\r
1649                 "Sequence selection insufficient", JOptionPane.WARNING_MESSAGE);\r
1650 \r
1651             return;\r
1652         }\r
1653 \r
1654         try\r
1655         {\r
1656             PCAPanel pcaPanel = new PCAPanel(viewport, null);\r
1657             JInternalFrame frame = new JInternalFrame();\r
1658             frame.setContentPane(pcaPanel);\r
1659             Desktop.addInternalFrame(frame, "Principal component analysis",\r
1660                 400, 400);\r
1661         }\r
1662         catch (java.lang.OutOfMemoryError ex)\r
1663         {\r
1664             JOptionPane.showInternalMessageDialog(this,\r
1665                 "Too many sequences selected\nfor Principal Component Analysis!!",\r
1666                 "Out of memory", JOptionPane.WARNING_MESSAGE);\r
1667         }\r
1668     }\r
1669 \r
1670     /**\r
1671      * DOCUMENT ME!\r
1672      *\r
1673      * @param e DOCUMENT ME!\r
1674      */\r
1675     public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)\r
1676     {\r
1677         NewTreePanel("AV", "PID", "Average distance tree using PID");\r
1678     }\r
1679 \r
1680     /**\r
1681      * DOCUMENT ME!\r
1682      *\r
1683      * @param e DOCUMENT ME!\r
1684      */\r
1685     public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)\r
1686     {\r
1687         NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");\r
1688     }\r
1689 \r
1690     /**\r
1691      * DOCUMENT ME!\r
1692      *\r
1693      * @param e DOCUMENT ME!\r
1694      */\r
1695     protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)\r
1696     {\r
1697         NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");\r
1698     }\r
1699 \r
1700     /**\r
1701      * DOCUMENT ME!\r
1702      *\r
1703      * @param e DOCUMENT ME!\r
1704      */\r
1705     protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)\r
1706     {\r
1707         NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");\r
1708     }\r
1709 \r
1710     /**\r
1711      * DOCUMENT ME!\r
1712      *\r
1713      * @param type DOCUMENT ME!\r
1714      * @param pwType DOCUMENT ME!\r
1715      * @param title DOCUMENT ME!\r
1716      */\r
1717     void NewTreePanel(String type, String pwType, String title)\r
1718     {\r
1719         final TreePanel tp;\r
1720 \r
1721         if ((viewport.getSelectionGroup() != null) &&\r
1722                 (viewport.getSelectionGroup().getSize() > 3))\r
1723         {\r
1724             int s = 0;\r
1725             SequenceGroup sg = viewport.getSelectionGroup();\r
1726 \r
1727             /* Decide if the selection is a column region */\r
1728             while (s < sg.sequences.size())\r
1729             {\r
1730                 if (((SequenceI) sg.sequences.elementAt(s++)).getLength() < sg.getEndRes())\r
1731                 {\r
1732                     JOptionPane.showMessageDialog(Desktop.desktop,\r
1733                         "The selected region to create a tree may\nonly contain residues or gaps.\n" +\r
1734                         "Try using the Pad function in the edit menu,\n" +\r
1735                         "or one of the multiple sequence alignment web services.",\r
1736                         "Sequences in selection are not aligned",\r
1737                         JOptionPane.WARNING_MESSAGE);\r
1738 \r
1739                     return;\r
1740                 }\r
1741             }\r
1742 \r
1743             title = title + " on region";\r
1744             tp = new TreePanel(viewport,\r
1745                     viewport.getSelectionGroup().sequences, type, pwType,\r
1746                     sg.getStartRes(), sg.getEndRes());\r
1747         }\r
1748         else\r
1749         {\r
1750             //are the sequences aligned?\r
1751             if (!viewport.alignment.isAligned())\r
1752             {\r
1753                 JOptionPane.showMessageDialog(Desktop.desktop,\r
1754                     "The sequences must be aligned before creating a tree.\n" +\r
1755                     "Try using the Pad function in the edit menu,\n" +\r
1756                     "or one of the multiple sequence alignment web services.",\r
1757                     "Sequences not aligned", JOptionPane.WARNING_MESSAGE);\r
1758 \r
1759                 return;\r
1760             }\r
1761 \r
1762             tp = new TreePanel(viewport,\r
1763                     viewport.getAlignment().getSequences(), type, pwType, 0,\r
1764                     viewport.alignment.getWidth());\r
1765         }\r
1766 \r
1767         addTreeMenuItem(tp, title);\r
1768         viewport.setCurrentTree(tp.getTree());\r
1769 \r
1770         Desktop.addInternalFrame(tp, title + " from " + this.title, 600, 500);\r
1771     }\r
1772 \r
1773     /**\r
1774      * DOCUMENT ME!\r
1775      *\r
1776      * @param title DOCUMENT ME!\r
1777      * @param order DOCUMENT ME!\r
1778      */\r
1779     public void addSortByOrderMenuItem(String title, final AlignmentOrder order)\r
1780     {\r
1781         final JMenuItem item = new JMenuItem("by " + title);\r
1782         sort.add(item);\r
1783         item.addActionListener(new java.awt.event.ActionListener()\r
1784             {\r
1785                 public void actionPerformed(ActionEvent e)\r
1786                 {\r
1787                     addHistoryItem(new HistoryItem("Sort", viewport.alignment,\r
1788                             HistoryItem.SORT));\r
1789 \r
1790                     // TODO: JBPNote - have to map order entries to curent SequenceI pointers\r
1791                     AlignmentSorter.sortBy(viewport.getAlignment(), order);\r
1792                     alignPanel.repaint();\r
1793                 }\r
1794             });\r
1795     }\r
1796 \r
1797     /**\r
1798      * DOCUMENT ME!\r
1799      *\r
1800      * @param treePanel DOCUMENT ME!\r
1801      * @param title DOCUMENT ME!\r
1802      */\r
1803     void addTreeMenuItem(final TreePanel treePanel, String title)\r
1804     {\r
1805         final JMenuItem item = new JMenuItem(title);\r
1806 \r
1807         treeCount++;\r
1808 \r
1809         if (treeCount == 1)\r
1810         {\r
1811             sort.add(sortByTreeMenu);\r
1812         }\r
1813 \r
1814         sortByTreeMenu.add(item);\r
1815         item.addActionListener(new java.awt.event.ActionListener()\r
1816             {\r
1817                 public void actionPerformed(ActionEvent e)\r
1818                 {\r
1819                     addHistoryItem(new HistoryItem("Tree Sort",\r
1820                             viewport.alignment, HistoryItem.SORT));\r
1821                     AlignmentSorter.sortByTree(viewport.getAlignment(),\r
1822                         treePanel.getTree());\r
1823                     alignPanel.repaint();\r
1824                 }\r
1825             });\r
1826 \r
1827         treePanel.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()\r
1828             {\r
1829                 public void internalFrameClosed(\r
1830                     javax.swing.event.InternalFrameEvent evt)\r
1831                 {\r
1832                     treeCount--;\r
1833                     sortByTreeMenu.remove(item);\r
1834 \r
1835                     if (treeCount == 0)\r
1836                     {\r
1837                         sort.remove(sortByTreeMenu);\r
1838                     }\r
1839                 }\r
1840                 ;\r
1841             });\r
1842         viewport.addPropertyChangeListener(new java.beans.PropertyChangeListener()\r
1843             {\r
1844                 public void propertyChange(PropertyChangeEvent evt)\r
1845                 {\r
1846                     if (evt.getPropertyName().equals("alignment"))\r
1847                     {\r
1848                         treePanel.getTree().UpdatePlaceHolders((Vector) evt.getNewValue());\r
1849                         treePanel.repaint();\r
1850                     }\r
1851                 }\r
1852             });\r
1853     }\r
1854 \r
1855     /**\r
1856      * DOCUMENT ME!\r
1857      *\r
1858      * @param e DOCUMENT ME!\r
1859      */\r
1860     public void clustalAlignMenuItem_actionPerformed(ActionEvent e)\r
1861     {\r
1862         // TODO:resolve which menu item was actually selected\r
1863         // Now, check we have enough sequences\r
1864         SequenceI[] msa = null;\r
1865 \r
1866         if ((viewport.getSelectionGroup() != null) &&\r
1867                 (viewport.getSelectionGroup().getSize() > 1))\r
1868         {\r
1869             // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!\r
1870             SequenceGroup seqs = viewport.getSelectionGroup();\r
1871             int sz;\r
1872             msa = new SequenceI[sz = seqs.getSize()];\r
1873 \r
1874             for (int i = 0; i < sz; i++)\r
1875             {\r
1876                 msa[i] = (SequenceI) seqs.getSequenceAt(i);\r
1877             }\r
1878         }\r
1879         else\r
1880         {\r
1881             Vector seqs = viewport.getAlignment().getSequences();\r
1882 \r
1883             if (seqs.size() > 1)\r
1884             {\r
1885                 msa = new SequenceI[seqs.size()];\r
1886 \r
1887                 for (int i = 0; i < seqs.size(); i++)\r
1888                 {\r
1889                     msa[i] = (SequenceI) seqs.elementAt(i);\r
1890                 }\r
1891             }\r
1892         }\r
1893 \r
1894         if (msa != null)\r
1895         {\r
1896             jalview.ws.MsaWSClient ct = new jalview.ws.MsaWSClient("ClustalWS",\r
1897                     title, msa, false, true);\r
1898         }\r
1899     }\r
1900 \r
1901     /**\r
1902      * DOCUMENT ME!\r
1903      *\r
1904      * @param e DOCUMENT ME!\r
1905      */\r
1906     public void ClustalRealign_actionPerformed(ActionEvent e)\r
1907     {\r
1908         // TODO:resolve which menu item was actually selected\r
1909         // Now, check we have enough sequences\r
1910         SequenceI[] msa = null;\r
1911 \r
1912         if ((viewport.getSelectionGroup() != null) &&\r
1913                 (viewport.getSelectionGroup().getSize() > 1))\r
1914         {\r
1915             // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!\r
1916             SequenceGroup seqs = viewport.getSelectionGroup();\r
1917             int sz;\r
1918             msa = new SequenceI[sz = seqs.getSize()];\r
1919 \r
1920             for (int i = 0; i < sz; i++)\r
1921             {\r
1922                 msa[i] = (SequenceI) seqs.getSequenceAt(i);\r
1923             }\r
1924         }\r
1925         else\r
1926         {\r
1927             Vector seqs = viewport.getAlignment().getSequences();\r
1928 \r
1929             if (seqs.size() > 1)\r
1930             {\r
1931                 msa = new SequenceI[seqs.size()];\r
1932 \r
1933                 for (int i = 0; i < seqs.size(); i++)\r
1934                 {\r
1935                     msa[i] = (SequenceI) seqs.elementAt(i);\r
1936                 }\r
1937             }\r
1938         }\r
1939 \r
1940         if (msa != null)\r
1941         {\r
1942             jalview.ws.MsaWSClient ct = new jalview.ws.MsaWSClient("ClustalWS",\r
1943                     title, msa, true, true);\r
1944         }\r
1945     }\r
1946 \r
1947     /**\r
1948      * DOCUMENT ME!\r
1949      *\r
1950      * @param e DOCUMENT ME!\r
1951      */\r
1952     protected void jpred_actionPerformed(ActionEvent e)\r
1953     {\r
1954         SequenceI seq = null;\r
1955         SequenceI[] msa = null;\r
1956 \r
1957         if ((viewport.getSelectionGroup() != null) &&\r
1958                 (viewport.getSelectionGroup().getSize() > 0))\r
1959         {\r
1960             // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!\r
1961             SequenceGroup seqs = viewport.getSelectionGroup();\r
1962 \r
1963             if ((seqs.getSize() == 1) || !viewport.alignment.isAligned())\r
1964             {\r
1965                 seq = (SequenceI) seqs.getSequenceAt(0);\r
1966             }\r
1967             else\r
1968             {\r
1969                 int sz;\r
1970                 msa = new SequenceI[sz = seqs.getSize()];\r
1971 \r
1972                 for (int i = 0; i < sz; i++)\r
1973                 {\r
1974                     msa[i] = (SequenceI) seqs.getSequenceAt(i);\r
1975                 }\r
1976             }\r
1977         }\r
1978         else\r
1979         {\r
1980             Vector seqs = viewport.getAlignment().getSequences();\r
1981 \r
1982             if ((seqs.size() == 1) || !viewport.alignment.isAligned())\r
1983             {\r
1984                 seq = (SequenceI) seqs.elementAt(0);\r
1985             }\r
1986             else\r
1987             {\r
1988                 msa = new SequenceI[seqs.size()];\r
1989 \r
1990                 for (int i = 0; i < seqs.size(); i++)\r
1991                 {\r
1992                     msa[i] = (SequenceI) seqs.elementAt(i);\r
1993                 }\r
1994             }\r
1995         }\r
1996 \r
1997         if (msa != null)\r
1998         {\r
1999             JPredClient ct = new JPredClient(title, msa);\r
2000         }\r
2001         else if (seq != null)\r
2002         {\r
2003             JPredClient ct = new JPredClient(title, seq);\r
2004         }\r
2005         else\r
2006         {\r
2007             System.err.print(\r
2008                 "JALVIEW ERROR! - Unexpected JPred selection state!\n");\r
2009         }\r
2010     }\r
2011 \r
2012     /**\r
2013      * DOCUMENT ME!\r
2014      *\r
2015      * @param e DOCUMENT ME!\r
2016      */\r
2017     protected void msaAlignMenuItem_actionPerformed(ActionEvent e)\r
2018     {\r
2019         // TODO:resolve which menu item was actually selected\r
2020         // Now, check we have enough sequences\r
2021         SequenceI[] msa = null;\r
2022 \r
2023         if ((viewport.getSelectionGroup() != null) &&\r
2024                 (viewport.getSelectionGroup().getSize() > 1))\r
2025         {\r
2026             // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!\r
2027             SequenceGroup seqs = viewport.getSelectionGroup();\r
2028             int sz;\r
2029             msa = new SequenceI[sz = seqs.getSize()];\r
2030 \r
2031             for (int i = 0; i < sz; i++)\r
2032             {\r
2033                 msa[i] = (SequenceI) seqs.getSequenceAt(i);\r
2034             }\r
2035         }\r
2036         else\r
2037         {\r
2038             Vector seqs = viewport.getAlignment().getSequences();\r
2039 \r
2040             if (seqs.size() > 1)\r
2041             {\r
2042                 msa = new SequenceI[seqs.size()];\r
2043 \r
2044                 for (int i = 0; i < seqs.size(); i++)\r
2045                 {\r
2046                     msa[i] = (SequenceI) seqs.elementAt(i);\r
2047                 }\r
2048             }\r
2049         }\r
2050 \r
2051         if (msa != null)\r
2052         {\r
2053             MsaWSClient ct = new jalview.ws.MsaWSClient("MuscleWS", title, msa,\r
2054                     false, true);\r
2055         }\r
2056     }\r
2057 \r
2058     /**\r
2059      * DOCUMENT ME!\r
2060      *\r
2061      * @param e DOCUMENT ME!\r
2062      */\r
2063     protected void LoadtreeMenuItem_actionPerformed(ActionEvent e)\r
2064     {\r
2065         // Pick the tree file\r
2066         JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.getProperty(\r
2067                     "LAST_DIRECTORY"));\r
2068         chooser.setFileView(new JalviewFileView());\r
2069         chooser.setDialogTitle("Select a newick-like tree file");\r
2070         chooser.setToolTipText("Load a tree file");\r
2071 \r
2072         int value = chooser.showOpenDialog(null);\r
2073 \r
2074         if (value == JalviewFileChooser.APPROVE_OPTION)\r
2075         {\r
2076             String choice = chooser.getSelectedFile().getPath();\r
2077             jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);\r
2078 \r
2079             try\r
2080             {\r
2081                 jalview.io.NewickFile fin = new jalview.io.NewickFile(choice,\r
2082                         "File");\r
2083                 viewport.setCurrentTree(ShowNewickTree(fin, choice).getTree());\r
2084             }\r
2085             catch (Exception ex)\r
2086             {\r
2087                 JOptionPane.showMessageDialog(Desktop.desktop,\r
2088                     "Problem reading tree file", ex.getMessage(),\r
2089                     JOptionPane.WARNING_MESSAGE);\r
2090                 ex.printStackTrace();\r
2091             }\r
2092         }\r
2093     }\r
2094 \r
2095     /**\r
2096      * DOCUMENT ME!\r
2097      *\r
2098      * @param nf DOCUMENT ME!\r
2099      * @param title DOCUMENT ME!\r
2100      *\r
2101      * @return DOCUMENT ME!\r
2102      */\r
2103     public TreePanel ShowNewickTree(NewickFile nf, String title)\r
2104     {\r
2105         TreePanel tp = null;\r
2106 \r
2107         try\r
2108         {\r
2109             nf.parse();\r
2110 \r
2111             if (nf.getTree() != null)\r
2112             {\r
2113                 tp = new TreePanel(viewport,\r
2114                         viewport.getAlignment().getSequences(), nf, "FromFile",\r
2115                         title);\r
2116                 Desktop.addInternalFrame(tp, title, 600, 500);\r
2117                 addTreeMenuItem(tp, title);\r
2118             }\r
2119         }\r
2120         catch (Exception ex)\r
2121         {\r
2122             ex.printStackTrace();\r
2123         }\r
2124 \r
2125         return tp;\r
2126     }\r
2127 \r
2128     class PrintThread extends Thread\r
2129     {\r
2130         public void run()\r
2131         {\r
2132             PrinterJob printJob = PrinterJob.getPrinterJob();\r
2133             PageFormat pf = printJob.pageDialog(printJob.defaultPage());\r
2134             printJob.setPrintable(alignPanel, pf);\r
2135 \r
2136             if (printJob.printDialog())\r
2137             {\r
2138                 try\r
2139                 {\r
2140                     printJob.print();\r
2141                 }\r
2142                 catch (Exception PrintException)\r
2143                 {\r
2144                     PrintException.printStackTrace();\r
2145                 }\r
2146             }\r
2147         }\r
2148     }\r
2149 }\r