Formatting changes
[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 \r
684         for (int i = 0; i < sg.sequences.size(); i++)\r
685         {\r
686             SequenceI seq = sg.getSequenceAt(i);\r
687             int index = viewport.getAlignment().findIndex(seq);\r
688             seq.deleteChars(sg.getStartRes(), sg.getEndRes() + 1);\r
689 \r
690             if (seq.getSequence().length() < 1)\r
691             {\r
692                 seqsdeleted = true;\r
693                 viewport.getAlignment().deleteSequence(seq);\r
694             }\r
695             else\r
696             {\r
697                 viewport.getAlignment().getSequences().setElementAt(seq, index);\r
698             }\r
699         }\r
700 \r
701         viewport.setSelectionGroup(null);\r
702         viewport.alignment.deleteGroup(sg);\r
703 \r
704         if (seqsdeleted)\r
705         {\r
706             viewport.firePropertyChange("alignment", null,\r
707                 viewport.getAlignment().getSequences());\r
708         }\r
709 \r
710         viewport.resetSeqLimits(alignPanel.seqPanel.seqCanvas.getHeight());\r
711 \r
712         if (viewport.getAlignment().getHeight() < 1)\r
713         {\r
714             try\r
715             {\r
716                 this.setClosed(true);\r
717             }\r
718             catch (Exception ex)\r
719             {\r
720             }\r
721         }\r
722 \r
723         viewport.updateConservation();\r
724         viewport.updateConsensus();\r
725         alignPanel.repaint();\r
726     }\r
727 \r
728     /**\r
729      * DOCUMENT ME!\r
730      *\r
731      * @param e DOCUMENT ME!\r
732      */\r
733     protected void deleteGroups_actionPerformed(ActionEvent e)\r
734     {\r
735         viewport.alignment.deleteAllGroups();\r
736         viewport.setSelectionGroup(null);\r
737         alignPanel.repaint();\r
738     }\r
739 \r
740     /**\r
741      * DOCUMENT ME!\r
742      *\r
743      * @param e DOCUMENT ME!\r
744      */\r
745     public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)\r
746     {\r
747         SequenceGroup sg = new SequenceGroup();\r
748 \r
749         for (int i = 0; i < viewport.getAlignment().getSequences().size();\r
750                 i++)\r
751         {\r
752             sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);\r
753         }\r
754 \r
755         sg.setEndRes(viewport.alignment.getWidth());\r
756         viewport.setSelectionGroup(sg);\r
757         PaintRefresher.Refresh(null, viewport.alignment);\r
758     }\r
759 \r
760     /**\r
761      * DOCUMENT ME!\r
762      *\r
763      * @param e DOCUMENT ME!\r
764      */\r
765     public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)\r
766     {\r
767         viewport.setSelectionGroup(null);\r
768         viewport.getColumnSelection().clear();\r
769         viewport.setSelectionGroup(null);\r
770         alignPanel.annotationPanel.activeRes = null;\r
771         PaintRefresher.Refresh(null, viewport.alignment);\r
772     }\r
773 \r
774     /**\r
775      * DOCUMENT ME!\r
776      *\r
777      * @param e DOCUMENT ME!\r
778      */\r
779     public void invertSequenceMenuItem_actionPerformed(ActionEvent e)\r
780     {\r
781         SequenceGroup sg = viewport.getSelectionGroup();\r
782 \r
783         if (sg == null)\r
784         {\r
785             selectAllSequenceMenuItem_actionPerformed(null);\r
786 \r
787             return;\r
788         }\r
789 \r
790         for (int i = 0; i < viewport.getAlignment().getSequences().size();\r
791                 i++)\r
792         {\r
793             sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);\r
794         }\r
795 \r
796         PaintRefresher.Refresh(null, viewport.alignment);\r
797     }\r
798 \r
799     /**\r
800      * DOCUMENT ME!\r
801      *\r
802      * @param e DOCUMENT ME!\r
803      */\r
804     public void remove2LeftMenuItem_actionPerformed(ActionEvent e)\r
805     {\r
806         ColumnSelection colSel = viewport.getColumnSelection();\r
807 \r
808         if (colSel.size() > 0)\r
809         {\r
810             addHistoryItem(new HistoryItem("Remove Left", viewport.alignment,\r
811                     HistoryItem.HIDE));\r
812 \r
813             int min = colSel.getMin();\r
814             viewport.getAlignment().trimLeft(min);\r
815             colSel.compensateForEdit(0, min);\r
816 \r
817             if (viewport.getSelectionGroup() != null)\r
818             {\r
819                 viewport.getSelectionGroup().adjustForRemoveLeft(min);\r
820             }\r
821 \r
822             Vector groups = viewport.alignment.getGroups();\r
823 \r
824             for (int i = 0; i < groups.size(); i++)\r
825             {\r
826                 SequenceGroup sg = (SequenceGroup) groups.get(i);\r
827 \r
828                 if (!sg.adjustForRemoveLeft(min))\r
829                 {\r
830                     viewport.alignment.deleteGroup(sg);\r
831                 }\r
832             }\r
833 \r
834             alignPanel.repaint();\r
835         }\r
836     }\r
837 \r
838     /**\r
839      * DOCUMENT ME!\r
840      *\r
841      * @param e DOCUMENT ME!\r
842      */\r
843     public void remove2RightMenuItem_actionPerformed(ActionEvent e)\r
844     {\r
845         ColumnSelection colSel = viewport.getColumnSelection();\r
846 \r
847         if (colSel.size() > 0)\r
848         {\r
849             addHistoryItem(new HistoryItem("Remove Right", viewport.alignment,\r
850                     HistoryItem.HIDE));\r
851 \r
852             int max = colSel.getMax();\r
853             viewport.getAlignment().trimRight(max);\r
854 \r
855             if (viewport.getSelectionGroup() != null)\r
856             {\r
857                 viewport.getSelectionGroup().adjustForRemoveRight(max);\r
858             }\r
859 \r
860             Vector groups = viewport.alignment.getGroups();\r
861 \r
862             for (int i = 0; i < groups.size(); i++)\r
863             {\r
864                 SequenceGroup sg = (SequenceGroup) groups.get(i);\r
865 \r
866                 if (!sg.adjustForRemoveRight(max))\r
867                 {\r
868                     viewport.alignment.deleteGroup(sg);\r
869                 }\r
870             }\r
871 \r
872             alignPanel.repaint();\r
873         }\r
874     }\r
875 \r
876     /**\r
877      * DOCUMENT ME!\r
878      *\r
879      * @param e DOCUMENT ME!\r
880      */\r
881     public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)\r
882     {\r
883         addHistoryItem(new HistoryItem("Remove Gapped Columns",\r
884                 viewport.alignment, HistoryItem.HIDE));\r
885 \r
886         viewport.getAlignment().removeGaps();\r
887         viewport.updateConservation();\r
888         viewport.updateConsensus();\r
889         alignPanel.repaint();\r
890     }\r
891 \r
892     /**\r
893      * DOCUMENT ME!\r
894      *\r
895      * @param e DOCUMENT ME!\r
896      */\r
897     public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)\r
898     {\r
899         addHistoryItem(new HistoryItem("Remove Gaps", viewport.alignment,\r
900                 HistoryItem.HIDE));\r
901 \r
902         SequenceI current;\r
903         int jSize;\r
904 \r
905         Vector seqs = null;\r
906 \r
907         int start = 0;\r
908         int end = viewport.alignment.getWidth();\r
909 \r
910         if (viewport.getSelectionGroup() != null)\r
911         {\r
912             seqs = viewport.getSelectionGroup().sequences;\r
913             start = viewport.getSelectionGroup().getStartRes();\r
914             end = viewport.getSelectionGroup().getEndRes();\r
915         }\r
916         else\r
917         {\r
918             seqs = viewport.alignment.getSequences();\r
919         }\r
920 \r
921         for (int i = 0; i < seqs.size(); i++)\r
922         {\r
923             current = (SequenceI) seqs.elementAt(i);\r
924             jSize = current.getLength();\r
925 \r
926             int j = start;\r
927 \r
928             do\r
929             {\r
930                 if (jalview.util.Comparison.isGap(current.getCharAt(j)))\r
931                 {\r
932                     current.deleteCharAt(j);\r
933                     j--;\r
934                     jSize--;\r
935                 }\r
936 \r
937                 j++;\r
938             }\r
939             while (j < end);\r
940         }\r
941 \r
942         viewport.updateConservation();\r
943         viewport.updateConsensus();\r
944         alignPanel.repaint();\r
945     }\r
946 \r
947     /**\r
948      * DOCUMENT ME!\r
949      *\r
950      * @param e DOCUMENT ME!\r
951      */\r
952     public void padGapsMenuitem_actionPerformed(ActionEvent e)\r
953     {\r
954         addHistoryItem(new HistoryItem("Pad Gaps", viewport.alignment,\r
955                 HistoryItem.HIDE));\r
956 \r
957         SequenceI current;\r
958         int Width = viewport.getAlignment().getWidth();\r
959 \r
960         for (int i = 0; i < viewport.getAlignment().getSequences().size();\r
961                 i++)\r
962         {\r
963             current = viewport.getAlignment().getSequenceAt(i);\r
964 \r
965             if (current.getLength() < Width)\r
966             {\r
967                 current.insertCharAt(Width - 1, viewport.getGapCharacter());\r
968             }\r
969         }\r
970 \r
971         viewport.updateConservation();\r
972         viewport.updateConsensus();\r
973         alignPanel.repaint();\r
974     }\r
975 \r
976     /**\r
977      * DOCUMENT ME!\r
978      *\r
979      * @param e DOCUMENT ME!\r
980      */\r
981     public void findMenuItem_actionPerformed(ActionEvent e)\r
982     {\r
983         JInternalFrame frame = new JInternalFrame();\r
984         Finder finder = new Finder(viewport, alignPanel, frame);\r
985         frame.setContentPane(finder);\r
986         Desktop.addInternalFrame(frame, "Find", 340, 110);\r
987         frame.setLayer(JLayeredPane.PALETTE_LAYER);\r
988     }\r
989 \r
990     /**\r
991      * DOCUMENT ME!\r
992      *\r
993      * @param e DOCUMENT ME!\r
994      */\r
995     public void font_actionPerformed(ActionEvent e)\r
996     {\r
997         FontChooser fc = new FontChooser(alignPanel);\r
998     }\r
999 \r
1000     /**\r
1001      * DOCUMENT ME!\r
1002      *\r
1003      * @param e DOCUMENT ME!\r
1004      */\r
1005     protected void fullSeqId_actionPerformed(ActionEvent e)\r
1006     {\r
1007         viewport.setShowFullId(fullSeqId.isSelected());\r
1008 \r
1009         alignPanel.idPanel.idCanvas.setPreferredSize(alignPanel.calculateIdWidth());\r
1010         alignPanel.repaint();\r
1011     }\r
1012 \r
1013     /**\r
1014      * DOCUMENT ME!\r
1015      *\r
1016      * @param e DOCUMENT ME!\r
1017      */\r
1018     protected void colourTextMenuItem_actionPerformed(ActionEvent e)\r
1019     {\r
1020         viewport.setColourText(colourTextMenuItem.isSelected());\r
1021         alignPanel.repaint();\r
1022     }\r
1023 \r
1024     /**\r
1025      * DOCUMENT ME!\r
1026      *\r
1027      * @param e DOCUMENT ME!\r
1028      */\r
1029     protected void wrapMenuItem_actionPerformed(ActionEvent e)\r
1030     {\r
1031         viewport.setWrapAlignment(wrapMenuItem.isSelected());\r
1032         alignPanel.setWrapAlignment(wrapMenuItem.isSelected());\r
1033         scaleAbove.setVisible(wrapMenuItem.isSelected());\r
1034         scaleLeft.setVisible(wrapMenuItem.isSelected());\r
1035         scaleRight.setVisible(wrapMenuItem.isSelected());\r
1036         alignPanel.repaint();\r
1037     }\r
1038 \r
1039     /**\r
1040      * DOCUMENT ME!\r
1041      *\r
1042      * @param e DOCUMENT ME!\r
1043      */\r
1044     protected void scaleAbove_actionPerformed(ActionEvent e)\r
1045     {\r
1046         viewport.setScaleAboveWrapped(scaleAbove.isSelected());\r
1047         alignPanel.repaint();\r
1048     }\r
1049 \r
1050     /**\r
1051      * DOCUMENT ME!\r
1052      *\r
1053      * @param e DOCUMENT ME!\r
1054      */\r
1055     protected void scaleLeft_actionPerformed(ActionEvent e)\r
1056     {\r
1057         viewport.setScaleLeftWrapped(scaleLeft.isSelected());\r
1058         alignPanel.repaint();\r
1059     }\r
1060 \r
1061     /**\r
1062      * DOCUMENT ME!\r
1063      *\r
1064      * @param e DOCUMENT ME!\r
1065      */\r
1066     protected void scaleRight_actionPerformed(ActionEvent e)\r
1067     {\r
1068         viewport.setScaleRightWrapped(scaleRight.isSelected());\r
1069         alignPanel.repaint();\r
1070     }\r
1071 \r
1072     /**\r
1073      * DOCUMENT ME!\r
1074      *\r
1075      * @param e DOCUMENT ME!\r
1076      */\r
1077     public void viewBoxesMenuItem_actionPerformed(ActionEvent e)\r
1078     {\r
1079         viewport.setShowBoxes(viewBoxesMenuItem.isSelected());\r
1080         alignPanel.repaint();\r
1081     }\r
1082 \r
1083     /**\r
1084      * DOCUMENT ME!\r
1085      *\r
1086      * @param e DOCUMENT ME!\r
1087      */\r
1088     public void viewTextMenuItem_actionPerformed(ActionEvent e)\r
1089     {\r
1090         viewport.setShowText(viewTextMenuItem.isSelected());\r
1091         alignPanel.repaint();\r
1092     }\r
1093 \r
1094     /**\r
1095      * DOCUMENT ME!\r
1096      *\r
1097      * @param e DOCUMENT ME!\r
1098      */\r
1099     protected void renderGapsMenuItem_actionPerformed(ActionEvent e)\r
1100     {\r
1101         viewport.setRenderGaps(renderGapsMenuItem.isSelected());\r
1102         alignPanel.repaint();\r
1103     }\r
1104 \r
1105     /**\r
1106      * DOCUMENT ME!\r
1107      *\r
1108      * @param evt DOCUMENT ME!\r
1109      */\r
1110     public void sequenceFeatures_actionPerformed(ActionEvent evt)\r
1111     {\r
1112         viewport.showSequenceFeatures(sequenceFeatures.isSelected());\r
1113 \r
1114         if (viewport.showSequenceFeatures &&\r
1115                 !((Alignment) viewport.alignment).featuresAdded)\r
1116         {\r
1117             SequenceFeatureFetcher sft = new SequenceFeatureFetcher(viewport.alignment,\r
1118                     alignPanel);\r
1119             ((Alignment) viewport.alignment).featuresAdded = true;\r
1120         }\r
1121 \r
1122         alignPanel.repaint();\r
1123     }\r
1124 \r
1125     /**\r
1126      * DOCUMENT ME!\r
1127      *\r
1128      * @param e DOCUMENT ME!\r
1129      */\r
1130     public void annotationPanelMenuItem_actionPerformed(ActionEvent e)\r
1131     {\r
1132         if (annotationPanelMenuItem.isSelected() &&\r
1133                 viewport.getWrapAlignment())\r
1134         {\r
1135             annotationPanelMenuItem.setSelected(false);\r
1136 \r
1137             return;\r
1138         }\r
1139 \r
1140         viewport.setShowAnnotation(annotationPanelMenuItem.isSelected());\r
1141         alignPanel.setAnnotationVisible(annotationPanelMenuItem.isSelected());\r
1142     }\r
1143 \r
1144     /**\r
1145      * DOCUMENT ME!\r
1146      *\r
1147      * @param e DOCUMENT ME!\r
1148      */\r
1149     public void overviewMenuItem_actionPerformed(ActionEvent e)\r
1150     {\r
1151         if (alignPanel.overviewPanel != null)\r
1152         {\r
1153             return;\r
1154         }\r
1155 \r
1156         JInternalFrame frame = new JInternalFrame();\r
1157         OverviewPanel overview = new OverviewPanel(alignPanel);\r
1158         frame.setContentPane(overview);\r
1159         Desktop.addInternalFrame(frame, "Overview " + this.getTitle(),\r
1160             frame.getWidth(), frame.getHeight());\r
1161         frame.pack();\r
1162         frame.setLayer(JLayeredPane.PALETTE_LAYER);\r
1163         frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()\r
1164             {\r
1165                 public void internalFrameClosed(\r
1166                     javax.swing.event.InternalFrameEvent evt)\r
1167                 {\r
1168                     alignPanel.setOverviewPanel(null);\r
1169                 }\r
1170                 ;\r
1171             });\r
1172 \r
1173         alignPanel.setOverviewPanel(overview);\r
1174     }\r
1175 \r
1176     /**\r
1177      * DOCUMENT ME!\r
1178      *\r
1179      * @param e DOCUMENT ME!\r
1180      */\r
1181     protected void noColourmenuItem_actionPerformed(ActionEvent e)\r
1182     {\r
1183         changeColour(null);\r
1184     }\r
1185 \r
1186     /**\r
1187      * DOCUMENT ME!\r
1188      *\r
1189      * @param e DOCUMENT ME!\r
1190      */\r
1191     public void clustalColour_actionPerformed(ActionEvent e)\r
1192     {\r
1193         changeColour(new ClustalxColourScheme(\r
1194                 viewport.alignment.getSequences(), viewport.alignment.getWidth()));\r
1195     }\r
1196 \r
1197     /**\r
1198      * DOCUMENT ME!\r
1199      *\r
1200      * @param e DOCUMENT ME!\r
1201      */\r
1202     public void zappoColour_actionPerformed(ActionEvent e)\r
1203     {\r
1204         changeColour(new ZappoColourScheme());\r
1205     }\r
1206 \r
1207     /**\r
1208      * DOCUMENT ME!\r
1209      *\r
1210      * @param e DOCUMENT ME!\r
1211      */\r
1212     public void taylorColour_actionPerformed(ActionEvent e)\r
1213     {\r
1214         changeColour(new TaylorColourScheme());\r
1215     }\r
1216 \r
1217     /**\r
1218      * DOCUMENT ME!\r
1219      *\r
1220      * @param e DOCUMENT ME!\r
1221      */\r
1222     public void hydrophobicityColour_actionPerformed(ActionEvent e)\r
1223     {\r
1224         changeColour(new HydrophobicColourScheme());\r
1225     }\r
1226 \r
1227     /**\r
1228      * DOCUMENT ME!\r
1229      *\r
1230      * @param e DOCUMENT ME!\r
1231      */\r
1232     public void helixColour_actionPerformed(ActionEvent e)\r
1233     {\r
1234         changeColour(new HelixColourScheme());\r
1235     }\r
1236 \r
1237     /**\r
1238      * DOCUMENT ME!\r
1239      *\r
1240      * @param e DOCUMENT ME!\r
1241      */\r
1242     public void strandColour_actionPerformed(ActionEvent e)\r
1243     {\r
1244         changeColour(new StrandColourScheme());\r
1245     }\r
1246 \r
1247     /**\r
1248      * DOCUMENT ME!\r
1249      *\r
1250      * @param e DOCUMENT ME!\r
1251      */\r
1252     public void turnColour_actionPerformed(ActionEvent e)\r
1253     {\r
1254         changeColour(new TurnColourScheme());\r
1255     }\r
1256 \r
1257     /**\r
1258      * DOCUMENT ME!\r
1259      *\r
1260      * @param e DOCUMENT ME!\r
1261      */\r
1262     public void buriedColour_actionPerformed(ActionEvent e)\r
1263     {\r
1264         changeColour(new BuriedColourScheme());\r
1265     }\r
1266 \r
1267     /**\r
1268      * DOCUMENT ME!\r
1269      *\r
1270      * @param e DOCUMENT ME!\r
1271      */\r
1272     public void nucleotideColour_actionPerformed(ActionEvent e)\r
1273     {\r
1274         changeColour(new NucleotideColourScheme());\r
1275     }\r
1276 \r
1277     /**\r
1278      * DOCUMENT ME!\r
1279      *\r
1280      * @param e DOCUMENT ME!\r
1281      */\r
1282     protected void applyToAllGroups_actionPerformed(ActionEvent e)\r
1283     {\r
1284         viewport.setColourAppliesToAllGroups(applyToAllGroups.isSelected());\r
1285     }\r
1286 \r
1287     /**\r
1288      * DOCUMENT ME!\r
1289      *\r
1290      * @param cs DOCUMENT ME!\r
1291      */\r
1292     void changeColour(ColourSchemeI cs)\r
1293     {\r
1294         int threshold = 0;\r
1295 \r
1296         if (viewport.getAbovePIDThreshold())\r
1297         {\r
1298             threshold = SliderPanel.setPIDSliderSource(alignPanel, cs,\r
1299                     "Background");\r
1300 \r
1301             if (cs instanceof ResidueColourScheme)\r
1302             {\r
1303                 ((ResidueColourScheme) cs).setThreshold(threshold);\r
1304             }\r
1305             else if (cs instanceof ScoreColourScheme)\r
1306             {\r
1307                 ((ScoreColourScheme) cs).setThreshold(threshold);\r
1308             }\r
1309 \r
1310             viewport.setGlobalColourScheme(cs);\r
1311         }\r
1312         else if (cs instanceof ResidueColourScheme)\r
1313         {\r
1314             ((ResidueColourScheme) cs).setThreshold(0);\r
1315         }\r
1316         else if (cs instanceof ScoreColourScheme)\r
1317         {\r
1318             ((ScoreColourScheme) cs).setThreshold(0);\r
1319         }\r
1320 \r
1321         if (viewport.getConservationSelected())\r
1322         {\r
1323             ConservationColourScheme ccs = null;\r
1324 \r
1325             Alignment al = (Alignment) viewport.alignment;\r
1326             Conservation c = new Conservation("All",\r
1327                     ResidueProperties.propHash, 3, al.getSequences(), 0,\r
1328                     al.getWidth() - 1);\r
1329 \r
1330             c.calculate();\r
1331             c.verdict(false, viewport.ConsPercGaps);\r
1332 \r
1333             ccs = new ConservationColourScheme(c, cs);\r
1334 \r
1335             // MUST NOTIFY THE COLOURSCHEME OF CONSENSUS!\r
1336             ccs.setConsensus(viewport.vconsensus);\r
1337             viewport.setGlobalColourScheme(ccs);\r
1338 \r
1339             ccs.inc = SliderPanel.setConservationSlider(alignPanel, ccs,\r
1340                     "Background");\r
1341         }\r
1342         else\r
1343         {\r
1344             // MUST NOTIFY THE COLOURSCHEME OF CONSENSUS!\r
1345             if (cs != null)\r
1346             {\r
1347                 cs.setConsensus(viewport.vconsensus);\r
1348             }\r
1349 \r
1350             viewport.setGlobalColourScheme(cs);\r
1351         }\r
1352 \r
1353         if (viewport.getColourAppliesToAllGroups())\r
1354         {\r
1355             Vector groups = viewport.alignment.getGroups();\r
1356 \r
1357             for (int i = 0; i < groups.size(); i++)\r
1358             {\r
1359                 SequenceGroup sg = (SequenceGroup) groups.elementAt(i);\r
1360 \r
1361                 if (cs == null)\r
1362                 {\r
1363                     sg.cs = null;\r
1364                 }\r
1365                 else if (cs instanceof ClustalxColourScheme)\r
1366                 {\r
1367                     sg.cs = new ClustalxColourScheme(sg.sequences, sg.getWidth());\r
1368                 }\r
1369                 else if (cs instanceof UserColourScheme)\r
1370                 {\r
1371                     sg.cs = new UserColourScheme(((UserColourScheme) cs).getColours());\r
1372                 }\r
1373                 else\r
1374                 {\r
1375                     try\r
1376                     {\r
1377                         sg.cs = (ColourSchemeI) cs.getClass().newInstance();\r
1378                     }\r
1379                     catch (Exception ex)\r
1380                     {\r
1381                     }\r
1382                 }\r
1383 \r
1384                 if (viewport.getAbovePIDThreshold())\r
1385                 {\r
1386                     if (sg.cs instanceof ResidueColourScheme)\r
1387                     {\r
1388                         ((ResidueColourScheme) sg.cs).setThreshold(threshold);\r
1389                     }\r
1390                     else if (sg.cs instanceof ScoreColourScheme)\r
1391                     {\r
1392                         ((ScoreColourScheme) sg.cs).setThreshold(threshold);\r
1393                     }\r
1394 \r
1395                     sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0,\r
1396                             sg.getWidth()));\r
1397                 }\r
1398 \r
1399                 if (viewport.getConservationSelected())\r
1400                 {\r
1401                     Conservation c = new Conservation("Group",\r
1402                             ResidueProperties.propHash, 3, sg.sequences, 0,\r
1403                             viewport.alignment.getWidth() - 1);\r
1404                     c.calculate();\r
1405                     c.verdict(false, viewport.ConsPercGaps);\r
1406 \r
1407                     ConservationColourScheme ccs = new ConservationColourScheme(c,\r
1408                             sg.cs);\r
1409 \r
1410                     // MUST NOTIFY THE COLOURSCHEME OF CONSENSUS!\r
1411                     ccs.setConsensus(AAFrequency.calculate(sg.sequences, 0,\r
1412                             sg.getWidth()));\r
1413                     sg.cs = ccs;\r
1414                 }\r
1415                 else if (cs != null)\r
1416                 {\r
1417                     // MUST NOTIFY THE COLOURSCHEME OF CONSENSUS!\r
1418                     sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0,\r
1419                             sg.getWidth()));\r
1420                 }\r
1421             }\r
1422         }\r
1423 \r
1424         if (alignPanel.getOverviewPanel() != null)\r
1425         {\r
1426             alignPanel.getOverviewPanel().updateOverviewImage();\r
1427         }\r
1428 \r
1429         alignPanel.repaint();\r
1430     }\r
1431 \r
1432     /**\r
1433      * DOCUMENT ME!\r
1434      *\r
1435      * @param e DOCUMENT ME!\r
1436      */\r
1437     protected void modifyPID_actionPerformed(ActionEvent e)\r
1438     {\r
1439         if (viewport.getAbovePIDThreshold())\r
1440         {\r
1441             SliderPanel.setPIDSliderSource(alignPanel,\r
1442                 viewport.getGlobalColourScheme(), "Background");\r
1443             SliderPanel.showPIDSlider();\r
1444         }\r
1445     }\r
1446 \r
1447     /**\r
1448      * DOCUMENT ME!\r
1449      *\r
1450      * @param e DOCUMENT ME!\r
1451      */\r
1452     protected void modifyConservation_actionPerformed(ActionEvent e)\r
1453     {\r
1454         if (viewport.getConservationSelected())\r
1455         {\r
1456             SliderPanel.setConservationSlider(alignPanel,\r
1457                 viewport.globalColourScheme, "Background");\r
1458             SliderPanel.showConservationSlider();\r
1459         }\r
1460     }\r
1461 \r
1462     /**\r
1463      * DOCUMENT ME!\r
1464      *\r
1465      * @param e DOCUMENT ME!\r
1466      */\r
1467     protected void conservationMenuItem_actionPerformed(ActionEvent e)\r
1468     {\r
1469         viewport.setConservationSelected(conservationMenuItem.isSelected());\r
1470 \r
1471         viewport.setAbovePIDThreshold(false);\r
1472         abovePIDThreshold.setSelected(false);\r
1473 \r
1474         ColourSchemeI cs = viewport.getGlobalColourScheme();\r
1475 \r
1476         if (cs instanceof ConservationColourScheme)\r
1477         {\r
1478             changeColour(((ConservationColourScheme) cs).cs);\r
1479         }\r
1480         else\r
1481         {\r
1482             changeColour(cs);\r
1483         }\r
1484 \r
1485         modifyConservation_actionPerformed(null);\r
1486     }\r
1487 \r
1488     /**\r
1489      * DOCUMENT ME!\r
1490      *\r
1491      * @param e DOCUMENT ME!\r
1492      */\r
1493     public void abovePIDThreshold_actionPerformed(ActionEvent e)\r
1494     {\r
1495         viewport.setAbovePIDThreshold(abovePIDThreshold.isSelected());\r
1496 \r
1497         conservationMenuItem.setSelected(false);\r
1498         viewport.setConservationSelected(false);\r
1499 \r
1500         ColourSchemeI cs = viewport.getGlobalColourScheme();\r
1501 \r
1502         if (cs instanceof ConservationColourScheme)\r
1503         {\r
1504             changeColour(((ConservationColourScheme) cs).cs);\r
1505         }\r
1506         else\r
1507         {\r
1508             changeColour(cs);\r
1509         }\r
1510 \r
1511         modifyPID_actionPerformed(null);\r
1512     }\r
1513 \r
1514     /**\r
1515      * DOCUMENT ME!\r
1516      *\r
1517      * @param e DOCUMENT ME!\r
1518      */\r
1519     public void userDefinedColour_actionPerformed(ActionEvent e)\r
1520     {\r
1521         new UserDefinedColours(alignPanel, null);\r
1522     }\r
1523 \r
1524     /**\r
1525      * DOCUMENT ME!\r
1526      *\r
1527      * @param e DOCUMENT ME!\r
1528      */\r
1529     public void PIDColour_actionPerformed(ActionEvent e)\r
1530     {\r
1531         changeColour(new PIDColourScheme());\r
1532     }\r
1533 \r
1534     /**\r
1535      * DOCUMENT ME!\r
1536      *\r
1537      * @param e DOCUMENT ME!\r
1538      */\r
1539     public void BLOSUM62Colour_actionPerformed(ActionEvent e)\r
1540     {\r
1541         changeColour(new Blosum62ColourScheme());\r
1542     }\r
1543 \r
1544     /**\r
1545      * DOCUMENT ME!\r
1546      *\r
1547      * @param e DOCUMENT ME!\r
1548      */\r
1549     public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)\r
1550     {\r
1551         addHistoryItem(new HistoryItem("Pairwise Sort", viewport.alignment,\r
1552                 HistoryItem.SORT));\r
1553         AlignmentSorter.sortByPID(viewport.getAlignment(),\r
1554             viewport.getAlignment().getSequenceAt(0));\r
1555         alignPanel.repaint();\r
1556     }\r
1557 \r
1558     /**\r
1559      * DOCUMENT ME!\r
1560      *\r
1561      * @param e DOCUMENT ME!\r
1562      */\r
1563     public void sortIDMenuItem_actionPerformed(ActionEvent e)\r
1564     {\r
1565         addHistoryItem(new HistoryItem("ID Sort", viewport.alignment,\r
1566                 HistoryItem.SORT));\r
1567         AlignmentSorter.sortByID(viewport.getAlignment());\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 sortGroupMenuItem_actionPerformed(ActionEvent e)\r
1577     {\r
1578         addHistoryItem(new HistoryItem("Group Sort", viewport.alignment,\r
1579                 HistoryItem.SORT));\r
1580 \r
1581         AlignmentSorter.sortByGroup(viewport.getAlignment());\r
1582         alignPanel.repaint();\r
1583     }\r
1584 \r
1585     /**\r
1586      * DOCUMENT ME!\r
1587      *\r
1588      * @param e DOCUMENT ME!\r
1589      */\r
1590     public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)\r
1591     {\r
1592         RedundancyPanel sp = new RedundancyPanel(alignPanel, this);\r
1593         JInternalFrame frame = new JInternalFrame();\r
1594         frame.setContentPane(sp);\r
1595         Desktop.addInternalFrame(frame, "Redundancy threshold selection", 400,\r
1596             100, false);\r
1597     }\r
1598 \r
1599     /**\r
1600      * DOCUMENT ME!\r
1601      *\r
1602      * @param e DOCUMENT ME!\r
1603      */\r
1604     public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)\r
1605     {\r
1606         if ((viewport.getSelectionGroup() == null) ||\r
1607                 (viewport.getSelectionGroup().getSize() < 2))\r
1608         {\r
1609             JOptionPane.showInternalMessageDialog(this,\r
1610                 "You must select at least 2 sequences.", "Invalid Selection",\r
1611                 JOptionPane.WARNING_MESSAGE);\r
1612         }\r
1613         else\r
1614         {\r
1615             JInternalFrame frame = new JInternalFrame();\r
1616             frame.setContentPane(new PairwiseAlignPanel(viewport));\r
1617             Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);\r
1618         }\r
1619     }\r
1620 \r
1621     /**\r
1622      * DOCUMENT ME!\r
1623      *\r
1624      * @param e DOCUMENT ME!\r
1625      */\r
1626     public void PCAMenuItem_actionPerformed(ActionEvent e)\r
1627     {\r
1628         if (((viewport.getSelectionGroup() != null) &&\r
1629                 (viewport.getSelectionGroup().getSize() < 4) &&\r
1630                 (viewport.getSelectionGroup().getSize() > 0)) ||\r
1631                 (viewport.getAlignment().getHeight() < 4))\r
1632         {\r
1633             JOptionPane.showInternalMessageDialog(this,\r
1634                 "Principal component analysis must take\n" +\r
1635                 "at least 4 input sequences.",\r
1636                 "Sequence selection insufficient", JOptionPane.WARNING_MESSAGE);\r
1637 \r
1638             return;\r
1639         }\r
1640 \r
1641         try\r
1642         {\r
1643             PCAPanel pcaPanel = new PCAPanel(viewport, null);\r
1644             JInternalFrame frame = new JInternalFrame();\r
1645             frame.setContentPane(pcaPanel);\r
1646             Desktop.addInternalFrame(frame, "Principal component analysis",\r
1647                 400, 400);\r
1648         }\r
1649         catch (java.lang.OutOfMemoryError ex)\r
1650         {\r
1651             JOptionPane.showInternalMessageDialog(this,\r
1652                 "Too many sequences selected\nfor Principal Component Analysis!!",\r
1653                 "Out of memory", JOptionPane.WARNING_MESSAGE);\r
1654         }\r
1655     }\r
1656 \r
1657     /**\r
1658      * DOCUMENT ME!\r
1659      *\r
1660      * @param e DOCUMENT ME!\r
1661      */\r
1662     public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)\r
1663     {\r
1664         NewTreePanel("AV", "PID", "Average distance tree using PID");\r
1665     }\r
1666 \r
1667     /**\r
1668      * DOCUMENT ME!\r
1669      *\r
1670      * @param e DOCUMENT ME!\r
1671      */\r
1672     public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)\r
1673     {\r
1674         NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");\r
1675     }\r
1676 \r
1677     /**\r
1678      * DOCUMENT ME!\r
1679      *\r
1680      * @param e DOCUMENT ME!\r
1681      */\r
1682     protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)\r
1683     {\r
1684         NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");\r
1685     }\r
1686 \r
1687     /**\r
1688      * DOCUMENT ME!\r
1689      *\r
1690      * @param e DOCUMENT ME!\r
1691      */\r
1692     protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)\r
1693     {\r
1694         NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");\r
1695     }\r
1696 \r
1697     /**\r
1698      * DOCUMENT ME!\r
1699      *\r
1700      * @param type DOCUMENT ME!\r
1701      * @param pwType DOCUMENT ME!\r
1702      * @param title DOCUMENT ME!\r
1703      */\r
1704     void NewTreePanel(String type, String pwType, String title)\r
1705     {\r
1706         final TreePanel tp;\r
1707 \r
1708         if ((viewport.getSelectionGroup() != null) &&\r
1709                 (viewport.getSelectionGroup().getSize() > 3))\r
1710         {\r
1711             int s = 0;\r
1712             SequenceGroup sg = viewport.getSelectionGroup();\r
1713 \r
1714             /* Decide if the selection is a column region */\r
1715             while (s < sg.sequences.size())\r
1716             {\r
1717                 if (((SequenceI) sg.sequences.elementAt(s++)).getLength() < sg.getEndRes())\r
1718                 {\r
1719                     JOptionPane.showMessageDialog(Desktop.desktop,\r
1720                         "The selected region to create a tree may\nonly contain residues or gaps.\n" +\r
1721                         "Try using the Pad function in the edit menu,\n" +\r
1722                         "or one of the multiple sequence alignment web services.",\r
1723                         "Sequences in selection are not aligned",\r
1724                         JOptionPane.WARNING_MESSAGE);\r
1725 \r
1726                     return;\r
1727                 }\r
1728             }\r
1729 \r
1730             title = title + " on region";\r
1731             tp = new TreePanel(viewport,\r
1732                     viewport.getSelectionGroup().sequences, type, pwType,\r
1733                     sg.getStartRes(), sg.getEndRes());\r
1734         }\r
1735         else\r
1736         {\r
1737             //are the sequences aligned?\r
1738             if (!viewport.alignment.isAligned())\r
1739             {\r
1740                 JOptionPane.showMessageDialog(Desktop.desktop,\r
1741                     "The sequences must be aligned before creating a tree.\n" +\r
1742                     "Try using the Pad function in the edit menu,\n" +\r
1743                     "or one of the multiple sequence alignment web services.",\r
1744                     "Sequences not aligned", JOptionPane.WARNING_MESSAGE);\r
1745 \r
1746                 return;\r
1747             }\r
1748 \r
1749             tp = new TreePanel(viewport,\r
1750                     viewport.getAlignment().getSequences(), type, pwType, 0,\r
1751                     viewport.alignment.getWidth());\r
1752         }\r
1753 \r
1754         addTreeMenuItem(tp, title);\r
1755         viewport.setCurrentTree(tp.getTree());\r
1756 \r
1757         Desktop.addInternalFrame(tp, title + " from " + this.title, 600, 500);\r
1758     }\r
1759 \r
1760     /**\r
1761      * DOCUMENT ME!\r
1762      *\r
1763      * @param title DOCUMENT ME!\r
1764      * @param order DOCUMENT ME!\r
1765      */\r
1766     public void addSortByOrderMenuItem(String title, final AlignmentOrder order)\r
1767     {\r
1768         final JMenuItem item = new JMenuItem("by " + title);\r
1769         sort.add(item);\r
1770         item.addActionListener(new java.awt.event.ActionListener()\r
1771             {\r
1772                 public void actionPerformed(ActionEvent e)\r
1773                 {\r
1774                     addHistoryItem(new HistoryItem("Sort", viewport.alignment,\r
1775                             HistoryItem.SORT));\r
1776 \r
1777                     // TODO: JBPNote - have to map order entries to curent SequenceI pointers\r
1778                     AlignmentSorter.sortBy(viewport.getAlignment(), order);\r
1779                     alignPanel.repaint();\r
1780                 }\r
1781             });\r
1782     }\r
1783 \r
1784     /**\r
1785      * DOCUMENT ME!\r
1786      *\r
1787      * @param treePanel DOCUMENT ME!\r
1788      * @param title DOCUMENT ME!\r
1789      */\r
1790     void addTreeMenuItem(final TreePanel treePanel, String title)\r
1791     {\r
1792         final JMenuItem item = new JMenuItem(title);\r
1793 \r
1794         treeCount++;\r
1795 \r
1796         if (treeCount == 1)\r
1797         {\r
1798             sort.add(sortByTreeMenu);\r
1799         }\r
1800 \r
1801         sortByTreeMenu.add(item);\r
1802         item.addActionListener(new java.awt.event.ActionListener()\r
1803             {\r
1804                 public void actionPerformed(ActionEvent e)\r
1805                 {\r
1806                     addHistoryItem(new HistoryItem("Tree Sort",\r
1807                             viewport.alignment, HistoryItem.SORT));\r
1808                     AlignmentSorter.sortByTree(viewport.getAlignment(),\r
1809                         treePanel.getTree());\r
1810                     alignPanel.repaint();\r
1811                 }\r
1812             });\r
1813 \r
1814         treePanel.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()\r
1815             {\r
1816                 public void internalFrameClosed(\r
1817                     javax.swing.event.InternalFrameEvent evt)\r
1818                 {\r
1819                     treeCount--;\r
1820                     sortByTreeMenu.remove(item);\r
1821 \r
1822                     if (treeCount == 0)\r
1823                     {\r
1824                         sort.remove(sortByTreeMenu);\r
1825                     }\r
1826                 }\r
1827                 ;\r
1828             });\r
1829         viewport.addPropertyChangeListener(new java.beans.PropertyChangeListener()\r
1830             {\r
1831                 public void propertyChange(PropertyChangeEvent evt)\r
1832                 {\r
1833                     if (evt.getPropertyName().equals("alignment"))\r
1834                     {\r
1835                         treePanel.getTree().UpdatePlaceHolders((Vector) evt.getNewValue());\r
1836                         treePanel.repaint();\r
1837                     }\r
1838                 }\r
1839             });\r
1840     }\r
1841 \r
1842     /**\r
1843      * DOCUMENT ME!\r
1844      *\r
1845      * @param e DOCUMENT ME!\r
1846      */\r
1847     public void clustalAlignMenuItem_actionPerformed(ActionEvent e)\r
1848     {\r
1849         // TODO:resolve which menu item was actually selected\r
1850         // Now, check we have enough sequences\r
1851         SequenceI[] msa = null;\r
1852 \r
1853         if ((viewport.getSelectionGroup() != null) &&\r
1854                 (viewport.getSelectionGroup().getSize() > 1))\r
1855         {\r
1856             // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!\r
1857             SequenceGroup seqs = viewport.getSelectionGroup();\r
1858             int sz;\r
1859             msa = new SequenceI[sz = seqs.getSize()];\r
1860 \r
1861             for (int i = 0; i < sz; i++)\r
1862             {\r
1863                 msa[i] = (SequenceI) seqs.getSequenceAt(i);\r
1864             }\r
1865         }\r
1866         else\r
1867         {\r
1868             Vector seqs = viewport.getAlignment().getSequences();\r
1869 \r
1870             if (seqs.size() > 1)\r
1871             {\r
1872                 msa = new SequenceI[seqs.size()];\r
1873 \r
1874                 for (int i = 0; i < seqs.size(); i++)\r
1875                 {\r
1876                     msa[i] = (SequenceI) seqs.elementAt(i);\r
1877                 }\r
1878             }\r
1879         }\r
1880 \r
1881         if (msa != null)\r
1882         {\r
1883             jalview.ws.MsaWSClient ct = new jalview.ws.MsaWSClient("ClustalWS",\r
1884                     title, msa, false, true);\r
1885         }\r
1886     }\r
1887 \r
1888     /**\r
1889      * DOCUMENT ME!\r
1890      *\r
1891      * @param e DOCUMENT ME!\r
1892      */\r
1893     public void ClustalRealign_actionPerformed(ActionEvent e)\r
1894     {\r
1895         // TODO:resolve which menu item was actually selected\r
1896         // Now, check we have enough sequences\r
1897         SequenceI[] msa = null;\r
1898 \r
1899         if ((viewport.getSelectionGroup() != null) &&\r
1900                 (viewport.getSelectionGroup().getSize() > 1))\r
1901         {\r
1902             // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!\r
1903             SequenceGroup seqs = viewport.getSelectionGroup();\r
1904             int sz;\r
1905             msa = new SequenceI[sz = seqs.getSize()];\r
1906 \r
1907             for (int i = 0; i < sz; i++)\r
1908             {\r
1909                 msa[i] = (SequenceI) seqs.getSequenceAt(i);\r
1910             }\r
1911         }\r
1912         else\r
1913         {\r
1914             Vector seqs = viewport.getAlignment().getSequences();\r
1915 \r
1916             if (seqs.size() > 1)\r
1917             {\r
1918                 msa = new SequenceI[seqs.size()];\r
1919 \r
1920                 for (int i = 0; i < seqs.size(); i++)\r
1921                 {\r
1922                     msa[i] = (SequenceI) seqs.elementAt(i);\r
1923                 }\r
1924             }\r
1925         }\r
1926 \r
1927         if (msa != null)\r
1928         {\r
1929             jalview.ws.MsaWSClient ct = new jalview.ws.MsaWSClient("ClustalWS",\r
1930                     title, msa, true, true);\r
1931         }\r
1932     }\r
1933 \r
1934     /**\r
1935      * DOCUMENT ME!\r
1936      *\r
1937      * @param e DOCUMENT ME!\r
1938      */\r
1939     protected void jpred_actionPerformed(ActionEvent e)\r
1940     {\r
1941         SequenceI seq = null;\r
1942         SequenceI[] msa = null;\r
1943 \r
1944         if ((viewport.getSelectionGroup() != null) &&\r
1945                 (viewport.getSelectionGroup().getSize() > 0))\r
1946         {\r
1947             // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!\r
1948             SequenceGroup seqs = viewport.getSelectionGroup();\r
1949 \r
1950             if ((seqs.getSize() == 1) || !viewport.alignment.isAligned())\r
1951             {\r
1952                 seq = (SequenceI) seqs.getSequenceAt(0);\r
1953             }\r
1954             else\r
1955             {\r
1956                 int sz;\r
1957                 msa = new SequenceI[sz = seqs.getSize()];\r
1958 \r
1959                 for (int i = 0; i < sz; i++)\r
1960                 {\r
1961                     msa[i] = (SequenceI) seqs.getSequenceAt(i);\r
1962                 }\r
1963             }\r
1964         }\r
1965         else\r
1966         {\r
1967             Vector seqs = viewport.getAlignment().getSequences();\r
1968 \r
1969             if ((seqs.size() == 1) || !viewport.alignment.isAligned())\r
1970             {\r
1971                 seq = (SequenceI) seqs.elementAt(0);\r
1972             }\r
1973             else\r
1974             {\r
1975                 msa = new SequenceI[seqs.size()];\r
1976 \r
1977                 for (int i = 0; i < seqs.size(); i++)\r
1978                 {\r
1979                     msa[i] = (SequenceI) seqs.elementAt(i);\r
1980                 }\r
1981             }\r
1982         }\r
1983 \r
1984         if (msa != null)\r
1985         {\r
1986             JPredClient ct = new JPredClient(title, msa);\r
1987         }\r
1988         else if (seq != null)\r
1989         {\r
1990             JPredClient ct = new JPredClient(title, seq);\r
1991         }\r
1992         else\r
1993         {\r
1994             System.err.print(\r
1995                 "JALVIEW ERROR! - Unexpected JPred selection state!\n");\r
1996         }\r
1997     }\r
1998 \r
1999     /**\r
2000      * DOCUMENT ME!\r
2001      *\r
2002      * @param e DOCUMENT ME!\r
2003      */\r
2004     protected void msaAlignMenuItem_actionPerformed(ActionEvent e)\r
2005     {\r
2006         // TODO:resolve which menu item was actually selected\r
2007         // Now, check we have enough sequences\r
2008         SequenceI[] msa = null;\r
2009 \r
2010         if ((viewport.getSelectionGroup() != null) &&\r
2011                 (viewport.getSelectionGroup().getSize() > 1))\r
2012         {\r
2013             // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!\r
2014             SequenceGroup seqs = viewport.getSelectionGroup();\r
2015             int sz;\r
2016             msa = new SequenceI[sz = seqs.getSize()];\r
2017 \r
2018             for (int i = 0; i < sz; i++)\r
2019             {\r
2020                 msa[i] = (SequenceI) seqs.getSequenceAt(i);\r
2021             }\r
2022         }\r
2023         else\r
2024         {\r
2025             Vector seqs = viewport.getAlignment().getSequences();\r
2026 \r
2027             if (seqs.size() > 1)\r
2028             {\r
2029                 msa = new SequenceI[seqs.size()];\r
2030 \r
2031                 for (int i = 0; i < seqs.size(); i++)\r
2032                 {\r
2033                     msa[i] = (SequenceI) seqs.elementAt(i);\r
2034                 }\r
2035             }\r
2036         }\r
2037 \r
2038         if (msa != null)\r
2039         {\r
2040             MsaWSClient ct = new jalview.ws.MsaWSClient("MuscleWS", title, msa,\r
2041                     false, true);\r
2042         }\r
2043     }\r
2044 \r
2045     /**\r
2046      * DOCUMENT ME!\r
2047      *\r
2048      * @param e DOCUMENT ME!\r
2049      */\r
2050     protected void LoadtreeMenuItem_actionPerformed(ActionEvent e)\r
2051     {\r
2052         // Pick the tree file\r
2053         JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.getProperty(\r
2054                     "LAST_DIRECTORY"));\r
2055         chooser.setFileView(new JalviewFileView());\r
2056         chooser.setDialogTitle("Select a newick-like tree file");\r
2057         chooser.setToolTipText("Load a tree file");\r
2058 \r
2059         int value = chooser.showOpenDialog(null);\r
2060 \r
2061         if (value == JalviewFileChooser.APPROVE_OPTION)\r
2062         {\r
2063             String choice = chooser.getSelectedFile().getPath();\r
2064             jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);\r
2065 \r
2066             try\r
2067             {\r
2068                 jalview.io.NewickFile fin = new jalview.io.NewickFile(choice,\r
2069                         "File");\r
2070                 viewport.setCurrentTree(ShowNewickTree(fin, choice).getTree());\r
2071             }\r
2072             catch (Exception ex)\r
2073             {\r
2074                 JOptionPane.showMessageDialog(Desktop.desktop,\r
2075                     "Problem reading tree file", ex.getMessage(),\r
2076                     JOptionPane.WARNING_MESSAGE);\r
2077                 ex.printStackTrace();\r
2078             }\r
2079         }\r
2080     }\r
2081 \r
2082     /**\r
2083      * DOCUMENT ME!\r
2084      *\r
2085      * @param nf DOCUMENT ME!\r
2086      * @param title DOCUMENT ME!\r
2087      *\r
2088      * @return DOCUMENT ME!\r
2089      */\r
2090     public TreePanel ShowNewickTree(NewickFile nf, String title)\r
2091     {\r
2092         TreePanel tp = null;\r
2093 \r
2094         try\r
2095         {\r
2096             nf.parse();\r
2097 \r
2098             if (nf.getTree() != null)\r
2099             {\r
2100                 tp = new TreePanel(viewport,\r
2101                         viewport.getAlignment().getSequences(), nf, "FromFile",\r
2102                         title);\r
2103                 Desktop.addInternalFrame(tp, title, 600, 500);\r
2104                 addTreeMenuItem(tp, title);\r
2105             }\r
2106         }\r
2107         catch (Exception ex)\r
2108         {\r
2109             ex.printStackTrace();\r
2110         }\r
2111 \r
2112         return tp;\r
2113     }\r
2114 \r
2115     class PrintThread extends Thread\r
2116     {\r
2117         public void run()\r
2118         {\r
2119             PrinterJob printJob = PrinterJob.getPrinterJob();\r
2120             PageFormat pf = printJob.pageDialog(printJob.defaultPage());\r
2121             printJob.setPrintable(alignPanel, pf);\r
2122 \r
2123             if (printJob.printDialog())\r
2124             {\r
2125                 try\r
2126                 {\r
2127                     printJob.print();\r
2128                 }\r
2129                 catch (Exception PrintException)\r
2130                 {\r
2131                     PrintException.printStackTrace();\r
2132                 }\r
2133             }\r
2134         }\r
2135     }\r
2136 }\r