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