pad-1 gaps fixed.
[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 java.beans.*;\r
22 import java.util.*;\r
23 \r
24 import java.awt.*;\r
25 import java.awt.datatransfer.*;\r
26 import java.awt.event.*;\r
27 import java.awt.print.*;\r
28 import javax.swing.*;\r
29 import javax.swing.event.*;\r
30 \r
31 import jalview.analysis.*;\r
32 import jalview.datamodel.*;\r
33 import jalview.io.*;\r
34 import jalview.jbgui.*;\r
35 import jalview.schemes.*;\r
36 import jalview.ws.*;\r
37 \r
38 public class AlignFrame\r
39     extends GAlignFrame\r
40 {\r
41   public static final int NEW_WINDOW_WIDTH = 700;\r
42   public static final int NEW_WINDOW_HEIGHT = 500;\r
43   final AlignmentPanel alignPanel;\r
44   final AlignViewport viewport;\r
45   public String currentFileFormat = "Jalview";\r
46   Stack historyList = new Stack();\r
47   Stack redoList = new Stack();\r
48   private int treeCount = 0;\r
49 \r
50   public AlignFrame(AlignmentI al)\r
51   {\r
52     viewport = new AlignViewport(al);\r
53 \r
54     alignPanel = new AlignmentPanel(this, viewport);\r
55     alignPanel.annotationPanel.adjustPanelHeight();\r
56     alignPanel.annotationSpaceFillerHolder.setPreferredSize(alignPanel.\r
57         annotationPanel.getPreferredSize());\r
58     alignPanel.annotationScroller.setPreferredSize(alignPanel.annotationPanel.\r
59         getPreferredSize());\r
60     alignPanel.setAnnotationVisible(viewport.getShowAnnotation());\r
61 \r
62     getContentPane().add(alignPanel, java.awt.BorderLayout.CENTER);\r
63 \r
64     addInternalFrameListener(new InternalFrameAdapter()\r
65     {\r
66       public void internalFrameActivated(InternalFrameEvent evt)\r
67       {\r
68         javax.swing.SwingUtilities.invokeLater(new Runnable()\r
69         {\r
70           public void run()\r
71           {\r
72             alignPanel.requestFocus();\r
73           }\r
74         });\r
75       }\r
76     });\r
77   }\r
78 \r
79   public void saveAlignmentMenu_actionPerformed(ActionEvent e)\r
80   {\r
81     JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.\r
82         getProperty(\r
83             "LAST_DIRECTORY"),\r
84         new String[]\r
85         {\r
86         "fa, fasta, fastq", "aln", "pfam", "msf", "pir", "blc",\r
87         "jar"\r
88     },\r
89         new String[]\r
90         {\r
91         "Fasta", "Clustal", "PFAM", "MSF", "PIR", "BLC", "Jalview"\r
92     }, currentFileFormat);\r
93 \r
94     chooser.setAcceptAllFileFilterUsed(false);\r
95     chooser.setFileView(new JalviewFileView());\r
96     chooser.setDialogTitle("Save Alignment to file");\r
97     chooser.setToolTipText("Save");\r
98 \r
99     int value = chooser.showSaveDialog(this);\r
100 \r
101     if (value == JalviewFileChooser.APPROVE_OPTION)\r
102     {\r
103       currentFileFormat = chooser.getSelectedFormat();\r
104       jalview.bin.Cache.setProperty("DEFAULT_FILE_FORMAT",\r
105                                     currentFileFormat);\r
106 \r
107       if (currentFileFormat.equals("Jalview"))\r
108       {\r
109         String shortName = title;\r
110 \r
111         if (shortName.indexOf(java.io.File.separatorChar) > -1)\r
112         {\r
113           shortName = shortName.substring(shortName.lastIndexOf(\r
114               java.io.File.separatorChar) + 1);\r
115         }\r
116 \r
117         String choice = chooser.getSelectedFile().getPath();\r
118         Jalview2XML.SaveAlignment(this, choice, shortName);\r
119 \r
120         // USE Jalview2XML to save this file\r
121         return;\r
122       }\r
123 \r
124       String choice = chooser.getSelectedFile().getPath();\r
125       jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);\r
126 \r
127       String output = FormatAdapter.formatSequences(currentFileFormat,\r
128           viewport.getAlignment().getSequences());\r
129 \r
130       try\r
131       {\r
132         java.io.PrintWriter out = new java.io.PrintWriter(new java.io.\r
133             FileWriter(\r
134                 choice));\r
135         out.println(output);\r
136         out.close();\r
137       }\r
138       catch (Exception ex)\r
139       {\r
140       }\r
141     }\r
142   }\r
143 \r
144   protected void outputText_actionPerformed(ActionEvent e)\r
145   {\r
146     CutAndPasteTransfer cap = new CutAndPasteTransfer();\r
147     Desktop.addInternalFrame(cap,\r
148                              "Alignment output - " + e.getActionCommand(), 600,\r
149                              500);\r
150     cap.setText(FormatAdapter.formatSequences(e.getActionCommand(),\r
151                                               viewport.getAlignment().\r
152                                               getSequences()));\r
153   }\r
154 \r
155   protected void htmlMenuItem_actionPerformed(ActionEvent e)\r
156   {\r
157     new HTMLOutput(viewport);\r
158   }\r
159 \r
160   protected void createPNG_actionPerformed(ActionEvent e)\r
161   {\r
162     alignPanel.makePNG();\r
163   }\r
164 \r
165   protected void epsFile_actionPerformed(ActionEvent e)\r
166   {\r
167     alignPanel.makeEPS();\r
168   }\r
169 \r
170   public void printMenuItem_actionPerformed(ActionEvent e)\r
171   {\r
172     //Putting in a thread avoids Swing painting problems\r
173     PrintThread thread = new PrintThread();\r
174     thread.start();\r
175   }\r
176 \r
177   public void closeMenuItem_actionPerformed(ActionEvent e)\r
178   {\r
179     try\r
180     {\r
181       this.setClosed(true);\r
182     }\r
183     catch (Exception ex)\r
184     {\r
185     }\r
186   }\r
187 \r
188   void updateEditMenuBar()\r
189   {\r
190     if (historyList.size() > 0)\r
191     {\r
192       undoMenuItem.setEnabled(true);\r
193 \r
194       HistoryItem hi = (HistoryItem) historyList.peek();\r
195       undoMenuItem.setText("Undo " + hi.getDescription());\r
196     }\r
197     else\r
198     {\r
199       undoMenuItem.setEnabled(false);\r
200       undoMenuItem.setText("Undo");\r
201     }\r
202 \r
203     if (redoList.size() > 0)\r
204     {\r
205       redoMenuItem.setEnabled(true);\r
206 \r
207       HistoryItem hi = (HistoryItem) redoList.peek();\r
208       redoMenuItem.setText("Redo " + hi.getDescription());\r
209     }\r
210     else\r
211     {\r
212       redoMenuItem.setEnabled(false);\r
213       redoMenuItem.setText("Redo");\r
214     }\r
215   }\r
216 \r
217   public void addHistoryItem(HistoryItem hi)\r
218   {\r
219     historyList.push(hi);\r
220     updateEditMenuBar();\r
221   }\r
222 \r
223   protected void undoMenuItem_actionPerformed(ActionEvent e)\r
224   {\r
225     HistoryItem hi = (HistoryItem) historyList.pop();\r
226     redoList.push(new HistoryItem(hi.getDescription(), viewport.alignment,\r
227                                   HistoryItem.HIDE));\r
228     restoreHistoryItem(hi);\r
229   }\r
230 \r
231   protected void redoMenuItem_actionPerformed(ActionEvent e)\r
232   {\r
233     HistoryItem hi = (HistoryItem) redoList.pop();\r
234     restoreHistoryItem(hi);\r
235     updateEditMenuBar();\r
236     viewport.updateConsensus();\r
237     alignPanel.repaint();\r
238     alignPanel.repaint();\r
239   }\r
240 \r
241   // used by undo and redo\r
242   void restoreHistoryItem(HistoryItem hi)\r
243   {\r
244     if (hi.getType() == HistoryItem.SORT)\r
245     {\r
246       for (int i = 0; i < hi.getSequences().size(); i++)\r
247       {\r
248         viewport.alignment.getSequences().setElementAt(hi.getSequences()\r
249             .elementAt(i),\r
250             i);\r
251       }\r
252     }\r
253     else\r
254     {\r
255       for (int i = 0; i < hi.getSequences().size(); i++)\r
256       {\r
257         SequenceI restore = (SequenceI) hi.getSequences().elementAt(i);\r
258 \r
259         if (restore.getLength() == 0)\r
260         {\r
261           restore.setSequence(hi.getHidden().elementAt(i).toString());\r
262           viewport.alignment.getSequences().insertElementAt(restore,\r
263               hi.getAlignIndex(i));\r
264         }\r
265         else\r
266         {\r
267           restore.setSequence(hi.getHidden().elementAt(i).toString());\r
268         }\r
269       }\r
270 \r
271       if (hi.getType() == HistoryItem.PASTE)\r
272       {\r
273         for (int i = viewport.alignment.getHeight() - 1;\r
274              i > (hi.getSequences().size() - 1); i--)\r
275         {\r
276           viewport.alignment.deleteSequence(i);\r
277         }\r
278       }\r
279     }\r
280 \r
281     updateEditMenuBar();\r
282 \r
283     viewport.updateConsensus();\r
284     viewport.updateConservation();\r
285     alignPanel.repaint();\r
286     viewport.firePropertyChange("alignment", null,\r
287                                 viewport.getAlignment().getSequences());\r
288   }\r
289 \r
290   public void moveSelectedSequences(boolean up)\r
291   {\r
292     SequenceGroup sg = viewport.getSelectionGroup();\r
293 \r
294     if (sg == null)\r
295     {\r
296       return;\r
297     }\r
298 \r
299     if (up)\r
300     {\r
301       for (int i = 1; i < viewport.alignment.getHeight(); i++)\r
302       {\r
303         SequenceI seq = viewport.alignment.getSequenceAt(i);\r
304 \r
305         if (!sg.sequences.contains(seq))\r
306         {\r
307           continue;\r
308         }\r
309 \r
310         SequenceI temp = viewport.alignment.getSequenceAt(i - 1);\r
311 \r
312         if (sg.sequences.contains(temp))\r
313         {\r
314           continue;\r
315         }\r
316 \r
317         viewport.alignment.getSequences().setElementAt(temp, i);\r
318         viewport.alignment.getSequences().setElementAt(seq, i - 1);\r
319       }\r
320     }\r
321     else\r
322     {\r
323       for (int i = viewport.alignment.getHeight() - 2; i > -1; i--)\r
324       {\r
325         SequenceI seq = viewport.alignment.getSequenceAt(i);\r
326 \r
327         if (!sg.sequences.contains(seq))\r
328         {\r
329           continue;\r
330         }\r
331 \r
332         SequenceI temp = viewport.alignment.getSequenceAt(i + 1);\r
333 \r
334         if (sg.sequences.contains(temp))\r
335         {\r
336           continue;\r
337         }\r
338 \r
339         viewport.alignment.getSequences().setElementAt(temp, i);\r
340         viewport.alignment.getSequences().setElementAt(seq, i + 1);\r
341       }\r
342     }\r
343 \r
344     alignPanel.repaint();\r
345   }\r
346 \r
347   protected void copy_actionPerformed(ActionEvent e)\r
348   {\r
349     if (viewport.getSelectionGroup() == null)\r
350     {\r
351       return;\r
352     }\r
353 \r
354     SequenceGroup sg = viewport.getSelectionGroup();\r
355 \r
356     Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();\r
357     StringBuffer buffer = new StringBuffer();\r
358 \r
359     Hashtable orderedSeqs = new Hashtable();\r
360 \r
361     for (int i = 0; i < sg.getSize(); i++)\r
362     {\r
363       SequenceI seq = sg.getSequenceAt(i);\r
364       int index = viewport.alignment.findIndex(seq);\r
365       orderedSeqs.put(index + "", seq);\r
366     }\r
367 \r
368     int index = 0;\r
369 \r
370     for (int i = 0; i < sg.getSize(); i++)\r
371     {\r
372       SequenceI seq = null;\r
373 \r
374       while (seq == null)\r
375       {\r
376         if (orderedSeqs.containsKey(index + ""))\r
377         {\r
378           seq = (SequenceI) orderedSeqs.get(index + "");\r
379           index++;\r
380 \r
381           break;\r
382         }\r
383         else\r
384         {\r
385           index++;\r
386         }\r
387       }\r
388 \r
389       buffer.append(seq.getName() + "\t" +\r
390                     seq.findPosition(sg.getStartRes()) + "\t" +\r
391                     seq.findPosition(sg.getEndRes()) + "\t" +\r
392                     sg.getSequenceAt(i).getSequence(sg.getStartRes(),\r
393           sg.getEndRes() + 1) + "\n");\r
394     }\r
395 \r
396     c.setContents(new StringSelection(buffer.toString()), null);\r
397   }\r
398 \r
399   protected void pasteNew_actionPerformed(ActionEvent e)\r
400   {\r
401     paste(true);\r
402   }\r
403 \r
404   protected void pasteThis_actionPerformed(ActionEvent e)\r
405   {\r
406     addHistoryItem(new HistoryItem("Paste Sequences", viewport.alignment,\r
407                                    HistoryItem.PASTE));\r
408     paste(false);\r
409   }\r
410 \r
411   void paste(boolean newAlignment)\r
412   {\r
413     try\r
414     {\r
415       Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();\r
416       Transferable contents = c.getContents(this);\r
417 \r
418       if (contents == null)\r
419       {\r
420         return;\r
421       }\r
422 \r
423       String str = (String) contents.getTransferData(DataFlavor.stringFlavor);\r
424       StringTokenizer st = new StringTokenizer(str);\r
425       ArrayList seqs = new ArrayList();\r
426 \r
427       while (st.hasMoreElements())\r
428       {\r
429         String name = st.nextToken();\r
430         int start = Integer.parseInt(st.nextToken());\r
431         int end = Integer.parseInt(st.nextToken());\r
432         Sequence sequence = new Sequence(name, st.nextToken(), start,\r
433                                          end);\r
434 \r
435         if (!newAlignment)\r
436         {\r
437           viewport.alignment.addSequence(sequence);\r
438         }\r
439         else\r
440         {\r
441           seqs.add(sequence);\r
442         }\r
443       }\r
444 \r
445       if (newAlignment)\r
446       {\r
447         SequenceI[] newSeqs = new SequenceI[seqs.size()];\r
448         seqs.toArray(newSeqs);\r
449 \r
450         AlignFrame af = new AlignFrame(new Alignment(newSeqs));\r
451         String newtitle = new String("Copied sequences");\r
452 \r
453         if (title.startsWith("Copied sequences"))\r
454         {\r
455           newtitle = title;\r
456         }\r
457         else\r
458         {\r
459           newtitle = newtitle.concat("- from " + title);\r
460         }\r
461 \r
462         Desktop.addInternalFrame(af, newtitle, NEW_WINDOW_WIDTH,\r
463                                  NEW_WINDOW_HEIGHT);\r
464       }\r
465       else\r
466       {\r
467         viewport.firePropertyChange("alignment", null,\r
468                                     viewport.getAlignment().getSequences());\r
469         viewport.setEndSeq(viewport.alignment.getHeight());\r
470         viewport.alignment.getWidth();\r
471         viewport.updateConservation();\r
472         viewport.updateConsensus();\r
473         alignPanel.repaint();\r
474       }\r
475     }\r
476     catch (Exception ex)\r
477     {\r
478     }\r
479 \r
480     // could be anything being pasted in here\r
481   }\r
482 \r
483   protected void cut_actionPerformed(ActionEvent e)\r
484   {\r
485     copy_actionPerformed(null);\r
486     delete_actionPerformed(null);\r
487   }\r
488 \r
489   protected void delete_actionPerformed(ActionEvent e)\r
490   {\r
491     boolean seqsdeleted = false;\r
492 \r
493     if (viewport.getSelectionGroup() == null)\r
494     {\r
495       return;\r
496     }\r
497 \r
498     addHistoryItem(new HistoryItem("Delete Sequences", viewport.alignment,\r
499                                    HistoryItem.HIDE));\r
500 \r
501     SequenceGroup sg = viewport.getSelectionGroup();\r
502 \r
503     for (int i = 0; i < sg.sequences.size(); i++)\r
504     {\r
505       SequenceI seq = sg.getSequenceAt(i);\r
506       int index = viewport.getAlignment().findIndex(seq);\r
507       seq.deleteChars(sg.getStartRes(), sg.getEndRes() + 1);\r
508 \r
509       if (seq.getSequence().length() < 1)\r
510       {\r
511         seqsdeleted = true;\r
512         viewport.getAlignment().deleteSequence(seq);\r
513       }\r
514       else\r
515       {\r
516         viewport.getAlignment().getSequences().setElementAt(seq, index);\r
517       }\r
518     }\r
519 \r
520     viewport.setSelectionGroup(null);\r
521     viewport.alignment.deleteGroup(sg);\r
522 \r
523     if (seqsdeleted)\r
524     {\r
525       viewport.firePropertyChange("alignment", null,\r
526                                   viewport.getAlignment().getSequences());\r
527     }\r
528 \r
529     viewport.resetSeqLimits(alignPanel.seqPanel.seqCanvas.getHeight());\r
530 \r
531     if (viewport.getAlignment().getHeight() < 1)\r
532     {\r
533       try\r
534       {\r
535         this.setClosed(true);\r
536       }\r
537       catch (Exception ex)\r
538       {\r
539       }\r
540     }\r
541 \r
542     viewport.updateConservation();\r
543     viewport.updateConsensus();\r
544     alignPanel.repaint();\r
545   }\r
546 \r
547   protected void deleteGroups_actionPerformed(ActionEvent e)\r
548   {\r
549     viewport.alignment.deleteAllGroups();\r
550     viewport.setSelectionGroup(null);\r
551     alignPanel.repaint();\r
552   }\r
553 \r
554   public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)\r
555   {\r
556     SequenceGroup sg = new SequenceGroup();\r
557 \r
558     for (int i = 0; i < viewport.getAlignment().getSequences().size();\r
559          i++)\r
560     {\r
561       sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);\r
562     }\r
563 \r
564     sg.setEndRes(viewport.alignment.getWidth());\r
565     viewport.setSelectionGroup(sg);\r
566     PaintRefresher.Refresh(null, viewport.alignment);\r
567   }\r
568 \r
569   public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)\r
570   {\r
571     viewport.setSelectionGroup(null);\r
572     viewport.getColumnSelection().clear();\r
573     viewport.setSelectionGroup(null);\r
574     alignPanel.annotationPanel.activeRes=null;\r
575     PaintRefresher.Refresh(null, viewport.alignment);\r
576   }\r
577 \r
578   public void invertSequenceMenuItem_actionPerformed(ActionEvent e)\r
579   {\r
580     SequenceGroup sg = viewport.getSelectionGroup();\r
581     if(sg==null)\r
582     {\r
583       selectAllSequenceMenuItem_actionPerformed(null);\r
584       return;\r
585     }\r
586 \r
587     for (int i = 0; i < viewport.getAlignment().getSequences().size();\r
588          i++)\r
589     {\r
590       sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);\r
591     }\r
592 \r
593     PaintRefresher.Refresh(null, viewport.alignment);\r
594   }\r
595 \r
596   public void remove2LeftMenuItem_actionPerformed(ActionEvent e)\r
597   {\r
598     ColumnSelection colSel = viewport.getColumnSelection();\r
599 \r
600     if (colSel.size() > 0)\r
601     {\r
602       addHistoryItem(new HistoryItem("Remove Left", viewport.alignment,\r
603                                      HistoryItem.HIDE));\r
604 \r
605       int min = colSel.getMin();\r
606       viewport.getAlignment().trimLeft(min);\r
607       colSel.compensateForEdit(0, min);\r
608 \r
609       if (viewport.getSelectionGroup() != null)\r
610       {\r
611         viewport.getSelectionGroup().adjustForRemoveLeft(min);\r
612       }\r
613 \r
614       Vector groups = viewport.alignment.getGroups();\r
615 \r
616       for (int i = 0; i < groups.size(); i++)\r
617       {\r
618         SequenceGroup sg = (SequenceGroup) groups.get(i);\r
619 \r
620         if (!sg.adjustForRemoveLeft(min))\r
621         {\r
622           viewport.alignment.deleteGroup(sg);\r
623         }\r
624       }\r
625 \r
626       alignPanel.repaint();\r
627     }\r
628   }\r
629 \r
630   public void remove2RightMenuItem_actionPerformed(ActionEvent e)\r
631   {\r
632     ColumnSelection colSel = viewport.getColumnSelection();\r
633 \r
634     if (colSel.size() > 0)\r
635     {\r
636       addHistoryItem(new HistoryItem("Remove Right", viewport.alignment,\r
637                                      HistoryItem.HIDE));\r
638 \r
639       int max = colSel.getMax();\r
640       viewport.getAlignment().trimRight(max);\r
641 \r
642       if (viewport.getSelectionGroup() != null)\r
643       {\r
644         viewport.getSelectionGroup().adjustForRemoveRight(max);\r
645       }\r
646 \r
647       Vector groups = viewport.alignment.getGroups();\r
648 \r
649       for (int i = 0; i < groups.size(); i++)\r
650       {\r
651         SequenceGroup sg = (SequenceGroup) groups.get(i);\r
652 \r
653         if (!sg.adjustForRemoveRight(max))\r
654         {\r
655           viewport.alignment.deleteGroup(sg);\r
656         }\r
657       }\r
658 \r
659       alignPanel.repaint();\r
660     }\r
661   }\r
662 \r
663   public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)\r
664   {\r
665     addHistoryItem(new HistoryItem("Remove Gapped Columns",\r
666                                    viewport.alignment, HistoryItem.HIDE));\r
667 \r
668     viewport.getAlignment().removeGaps();\r
669     viewport.updateConservation();\r
670     viewport.updateConsensus();\r
671     alignPanel.repaint();\r
672   }\r
673 \r
674   public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)\r
675   {\r
676     addHistoryItem(new HistoryItem("Remove Gaps", viewport.alignment,\r
677                                    HistoryItem.HIDE));\r
678 \r
679     SequenceI current;\r
680     int jSize;\r
681 \r
682     for (int i = 0; i < viewport.getAlignment().getSequences().size();\r
683          i++)\r
684     {\r
685       current = viewport.getAlignment().getSequenceAt(i);\r
686       jSize = current.getLength();\r
687 \r
688       for (int j = 0; j < jSize; j++)\r
689       {\r
690         if (jalview.util.Comparison.isGap(current.getCharAt(j)))\r
691         {\r
692           current.deleteCharAt(j);\r
693           j--;\r
694           jSize--;\r
695         }\r
696       }\r
697     }\r
698 \r
699     viewport.updateConservation();\r
700     viewport.updateConsensus();\r
701     alignPanel.repaint();\r
702   }\r
703 \r
704   public void padGapsMenuitem_actionPerformed(ActionEvent e)\r
705   {\r
706     addHistoryItem(new HistoryItem("Pad Gaps", viewport.alignment,\r
707                                    HistoryItem.HIDE));\r
708 \r
709     SequenceI current;\r
710     int Width = viewport.getAlignment().getWidth();\r
711 \r
712     for (int i = 0; i < viewport.getAlignment().getSequences().size();\r
713          i++)\r
714     {\r
715       current = viewport.getAlignment().getSequenceAt(i);\r
716 \r
717       if (current.getLength() < Width)\r
718       {\r
719         current.insertCharAt(Width-1, viewport.getGapCharacter());\r
720       }\r
721     }\r
722 \r
723     viewport.updateConservation();\r
724     viewport.updateConsensus();\r
725     alignPanel.repaint();\r
726   }\r
727 \r
728   public void findMenuItem_actionPerformed(ActionEvent e)\r
729   {\r
730     JInternalFrame frame = new JInternalFrame();\r
731     Finder finder = new Finder(viewport, alignPanel, frame);\r
732     frame.setContentPane(finder);\r
733     Desktop.addInternalFrame(frame, "Find", 340, 110);\r
734     frame.setLayer(JLayeredPane.PALETTE_LAYER);\r
735   }\r
736 \r
737   public void font_actionPerformed(ActionEvent e)\r
738   {\r
739     FontChooser fc = new FontChooser(alignPanel);\r
740   }\r
741 \r
742   protected void fullSeqId_actionPerformed(ActionEvent e)\r
743   {\r
744     viewport.setShowFullId(fullSeqId.isSelected());\r
745 \r
746     alignPanel.idPanel.idCanvas.setPreferredSize(alignPanel.calculateIdWidth());\r
747     alignPanel.repaint();\r
748   }\r
749 \r
750   protected void colourTextMenuItem_actionPerformed(ActionEvent e)\r
751   {\r
752     viewport.setColourText(colourTextMenuItem.isSelected());\r
753     alignPanel.repaint();\r
754   }\r
755 \r
756   protected void wrapMenuItem_actionPerformed(ActionEvent e)\r
757   {\r
758     viewport.setWrapAlignment(wrapMenuItem.isSelected());\r
759     alignPanel.setWrapAlignment(wrapMenuItem.isSelected());\r
760     scaleAbove.setVisible(wrapMenuItem.isSelected());\r
761     scaleLeft.setVisible(wrapMenuItem.isSelected());\r
762     scaleRight.setVisible(wrapMenuItem.isSelected());\r
763     alignPanel.repaint();\r
764   }\r
765 \r
766   protected void scaleAbove_actionPerformed(ActionEvent e)\r
767   {\r
768     viewport.setScaleAboveWrapped(scaleAbove.isSelected());\r
769     alignPanel.repaint();\r
770   }\r
771 \r
772   protected void scaleLeft_actionPerformed(ActionEvent e)\r
773   {\r
774     viewport.setScaleLeftWrapped(scaleLeft.isSelected());\r
775     alignPanel.repaint();\r
776   }\r
777 \r
778   protected void scaleRight_actionPerformed(ActionEvent e)\r
779   {\r
780     viewport.setScaleRightWrapped(scaleRight.isSelected());\r
781     alignPanel.repaint();\r
782   }\r
783 \r
784   public void viewBoxesMenuItem_actionPerformed(ActionEvent e)\r
785   {\r
786     viewport.setShowBoxes(viewBoxesMenuItem.isSelected());\r
787     alignPanel.repaint();\r
788   }\r
789 \r
790   public void viewTextMenuItem_actionPerformed(ActionEvent e)\r
791   {\r
792     viewport.setShowText(viewTextMenuItem.isSelected());\r
793     alignPanel.repaint();\r
794   }\r
795 \r
796   protected void renderGapsMenuItem_actionPerformed(ActionEvent e)\r
797   {\r
798     viewport.setRenderGaps(renderGapsMenuItem.isSelected());\r
799     alignPanel.repaint();\r
800   }\r
801 \r
802   public void sequenceFeatures_actionPerformed(ActionEvent evt)\r
803   {\r
804     viewport.showSequenceFeatures(sequenceFeatures.isSelected());\r
805 \r
806     if (viewport.showSequenceFeatures &&\r
807         ! ( (Alignment) viewport.alignment).featuresAdded)\r
808     {\r
809       SequenceFeatureFetcher sft = new SequenceFeatureFetcher(viewport.\r
810           alignment,\r
811           alignPanel);\r
812       ( (Alignment) viewport.alignment).featuresAdded = true;\r
813     }\r
814 \r
815     alignPanel.repaint();\r
816   }\r
817 \r
818   public void annotationPanelMenuItem_actionPerformed(ActionEvent e)\r
819   {\r
820     if (annotationPanelMenuItem.isSelected() &&\r
821         viewport.getWrapAlignment())\r
822     {\r
823       annotationPanelMenuItem.setSelected(false);\r
824 \r
825       return;\r
826     }\r
827 \r
828     viewport.setShowAnnotation(annotationPanelMenuItem.isSelected());\r
829     alignPanel.setAnnotationVisible(annotationPanelMenuItem.isSelected());\r
830   }\r
831 \r
832   public void overviewMenuItem_actionPerformed(ActionEvent e)\r
833   {\r
834     if (alignPanel.overviewPanel != null)\r
835     {\r
836       return;\r
837     }\r
838 \r
839     JInternalFrame frame = new JInternalFrame();\r
840     OverviewPanel overview = new OverviewPanel(alignPanel);\r
841     frame.setContentPane(overview);\r
842     Desktop.addInternalFrame(frame, "Overview " + this.getTitle(),\r
843                              frame.getWidth(), frame.getHeight());\r
844     frame.pack();\r
845     frame.setLayer(JLayeredPane.PALETTE_LAYER);\r
846     frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()\r
847     {\r
848       public void internalFrameClosed(\r
849           javax.swing.event.InternalFrameEvent evt)\r
850       {\r
851         alignPanel.setOverviewPanel(null);\r
852       }\r
853       ;\r
854     });\r
855 \r
856     alignPanel.setOverviewPanel(overview);\r
857   }\r
858 \r
859   protected void noColourmenuItem_actionPerformed(ActionEvent e)\r
860   {\r
861     changeColour(null);\r
862   }\r
863 \r
864   public void clustalColour_actionPerformed(ActionEvent e)\r
865   {\r
866     changeColour(new ClustalxColourScheme(\r
867         viewport.alignment.getSequences(), viewport.alignment.getWidth()));\r
868   }\r
869 \r
870   public void zappoColour_actionPerformed(ActionEvent e)\r
871   {\r
872     changeColour(new ZappoColourScheme());\r
873   }\r
874 \r
875   public void taylorColour_actionPerformed(ActionEvent e)\r
876   {\r
877     changeColour(new TaylorColourScheme());\r
878   }\r
879 \r
880   public void hydrophobicityColour_actionPerformed(ActionEvent e)\r
881   {\r
882     changeColour(new HydrophobicColourScheme());\r
883   }\r
884 \r
885   public void helixColour_actionPerformed(ActionEvent e)\r
886   {\r
887     changeColour(new HelixColourScheme());\r
888   }\r
889 \r
890   public void strandColour_actionPerformed(ActionEvent e)\r
891   {\r
892     changeColour(new StrandColourScheme());\r
893   }\r
894 \r
895   public void turnColour_actionPerformed(ActionEvent e)\r
896   {\r
897     changeColour(new TurnColourScheme());\r
898   }\r
899 \r
900   public void buriedColour_actionPerformed(ActionEvent e)\r
901   {\r
902     changeColour(new BuriedColourScheme());\r
903   }\r
904 \r
905   public void nucleotideColour_actionPerformed(ActionEvent e)\r
906   {\r
907     changeColour(new NucleotideColourScheme());\r
908   }\r
909 \r
910   protected void applyToAllGroups_actionPerformed(ActionEvent e)\r
911   {\r
912     viewport.setColourAppliesToAllGroups(applyToAllGroups.isSelected());\r
913   }\r
914 \r
915   void changeColour(ColourSchemeI cs)\r
916   {\r
917     int threshold = 0;\r
918 \r
919     if (viewport.getAbovePIDThreshold())\r
920     {\r
921       threshold = SliderPanel.setPIDSliderSource(alignPanel, cs,\r
922                                                  "Background");\r
923 \r
924       if (cs instanceof ResidueColourScheme)\r
925       {\r
926         ( (ResidueColourScheme) cs).setThreshold(threshold);\r
927       }\r
928       else if (cs instanceof ScoreColourScheme)\r
929       {\r
930         ( (ScoreColourScheme) cs).setThreshold(threshold);\r
931       }\r
932 \r
933       viewport.setGlobalColourScheme(cs);\r
934     }\r
935     else if (cs instanceof ResidueColourScheme)\r
936     {\r
937       ( (ResidueColourScheme) cs).setThreshold(0);\r
938     }\r
939     else if (cs instanceof ScoreColourScheme)\r
940     {\r
941       ( (ScoreColourScheme) cs).setThreshold(0);\r
942     }\r
943 \r
944     if (viewport.getConservationSelected())\r
945     {\r
946       ConservationColourScheme ccs = null;\r
947 \r
948       Alignment al = (Alignment) viewport.alignment;\r
949       Conservation c = new Conservation("All",\r
950                                         ResidueProperties.propHash, 3,\r
951                                         al.getSequences(), 0,\r
952                                         al.getWidth() - 1);\r
953 \r
954       c.calculate();\r
955       c.verdict(false, viewport.ConsPercGaps);\r
956 \r
957       ccs = new ConservationColourScheme(c, cs);\r
958 \r
959       // MUST NOTIFY THE COLOURSCHEME OF CONSENSUS!\r
960       ccs.setConsensus(viewport.vconsensus);\r
961       viewport.setGlobalColourScheme(ccs);\r
962 \r
963       ccs.inc = SliderPanel.setConservationSlider(alignPanel, ccs,\r
964                                                   "Background");\r
965     }\r
966     else\r
967     {\r
968       // MUST NOTIFY THE COLOURSCHEME OF CONSENSUS!\r
969       if (cs != null)\r
970       {\r
971         cs.setConsensus(viewport.vconsensus);\r
972       }\r
973 \r
974       viewport.setGlobalColourScheme(cs);\r
975     }\r
976 \r
977     if (viewport.getColourAppliesToAllGroups())\r
978     {\r
979       Vector groups = viewport.alignment.getGroups();\r
980 \r
981       for (int i = 0; i < groups.size(); i++)\r
982       {\r
983         SequenceGroup sg = (SequenceGroup) groups.elementAt(i);\r
984 \r
985         if (cs == null)\r
986         {\r
987           sg.cs = null;\r
988         }\r
989         else if (cs instanceof ClustalxColourScheme)\r
990         {\r
991           sg.cs = new ClustalxColourScheme(sg.sequences, sg.getWidth());\r
992         }\r
993         else if (cs instanceof UserColourScheme)\r
994         {\r
995           sg.cs = new UserColourScheme( ( (UserColourScheme) cs).getColours());\r
996         }\r
997         else\r
998         {\r
999           try\r
1000           {\r
1001             sg.cs = (ColourSchemeI) cs.getClass().newInstance();\r
1002           }\r
1003           catch (Exception ex)\r
1004           {\r
1005           }\r
1006         }\r
1007 \r
1008         if (viewport.getAbovePIDThreshold())\r
1009         {\r
1010           if (sg.cs instanceof ResidueColourScheme)\r
1011           {\r
1012             ( (ResidueColourScheme) sg.cs).setThreshold(threshold);\r
1013           }\r
1014           else if (sg.cs instanceof ScoreColourScheme)\r
1015           {\r
1016             ( (ScoreColourScheme) sg.cs).setThreshold(threshold);\r
1017           }\r
1018 \r
1019           sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0,\r
1020               sg.getWidth()));\r
1021         }\r
1022 \r
1023         if (viewport.getConservationSelected())\r
1024         {\r
1025           Conservation c = new Conservation("Group",\r
1026                                             ResidueProperties.propHash, 3,\r
1027                                             sg.sequences, 0,\r
1028                                             viewport.alignment.getWidth() - 1);\r
1029           c.calculate();\r
1030           c.verdict(false, viewport.ConsPercGaps);\r
1031 \r
1032           ConservationColourScheme ccs = new ConservationColourScheme(c,\r
1033               sg.cs);\r
1034 \r
1035           // MUST NOTIFY THE COLOURSCHEME OF CONSENSUS!\r
1036           ccs.setConsensus(AAFrequency.calculate(sg.sequences, 0,\r
1037                                                  sg.getWidth()));\r
1038           sg.cs = ccs;\r
1039         }\r
1040         else if (cs != null)\r
1041         {\r
1042           // MUST NOTIFY THE COLOURSCHEME OF CONSENSUS!\r
1043           sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0,\r
1044               sg.getWidth()));\r
1045         }\r
1046       }\r
1047     }\r
1048 \r
1049     if (alignPanel.getOverviewPanel() != null)\r
1050     {\r
1051       alignPanel.getOverviewPanel().updateOverviewImage();\r
1052     }\r
1053 \r
1054     alignPanel.repaint();\r
1055   }\r
1056 \r
1057   protected void modifyPID_actionPerformed(ActionEvent e)\r
1058   {\r
1059     if (viewport.getAbovePIDThreshold())\r
1060     {\r
1061       SliderPanel.setPIDSliderSource(alignPanel,\r
1062                                      viewport.getGlobalColourScheme(),\r
1063                                      "Background");\r
1064       SliderPanel.showPIDSlider();\r
1065     }\r
1066   }\r
1067 \r
1068   protected void modifyConservation_actionPerformed(ActionEvent e)\r
1069   {\r
1070     if (viewport.getConservationSelected())\r
1071     {\r
1072       SliderPanel.setConservationSlider(alignPanel,\r
1073                                         viewport.globalColourScheme,\r
1074                                         "Background");\r
1075       SliderPanel.showConservationSlider();\r
1076     }\r
1077   }\r
1078 \r
1079   protected void conservationMenuItem_actionPerformed(ActionEvent e)\r
1080   {\r
1081     viewport.setConservationSelected(conservationMenuItem.isSelected());\r
1082 \r
1083     viewport.setAbovePIDThreshold(false);\r
1084     abovePIDThreshold.setSelected(false);\r
1085 \r
1086     ColourSchemeI cs = viewport.getGlobalColourScheme();\r
1087 \r
1088     if (cs instanceof ConservationColourScheme)\r
1089     {\r
1090       changeColour( ( (ConservationColourScheme) cs).cs);\r
1091     }\r
1092     else\r
1093     {\r
1094       changeColour(cs);\r
1095     }\r
1096 \r
1097     modifyConservation_actionPerformed(null);\r
1098   }\r
1099 \r
1100   public void abovePIDThreshold_actionPerformed(ActionEvent e)\r
1101   {\r
1102     viewport.setAbovePIDThreshold(abovePIDThreshold.isSelected());\r
1103 \r
1104     conservationMenuItem.setSelected(false);\r
1105     viewport.setConservationSelected(false);\r
1106 \r
1107     ColourSchemeI cs = viewport.getGlobalColourScheme();\r
1108 \r
1109     if (cs instanceof ConservationColourScheme)\r
1110     {\r
1111       changeColour( ( (ConservationColourScheme) cs).cs);\r
1112     }\r
1113     else\r
1114     {\r
1115       changeColour(cs);\r
1116     }\r
1117 \r
1118     modifyPID_actionPerformed(null);\r
1119   }\r
1120 \r
1121   public void userDefinedColour_actionPerformed(ActionEvent e)\r
1122   {\r
1123     new UserDefinedColours(alignPanel, null);\r
1124   }\r
1125 \r
1126   public void PIDColour_actionPerformed(ActionEvent e)\r
1127   {\r
1128     changeColour(new PIDColourScheme());\r
1129   }\r
1130 \r
1131   public void BLOSUM62Colour_actionPerformed(ActionEvent e)\r
1132   {\r
1133     changeColour(new Blosum62ColourScheme());\r
1134   }\r
1135 \r
1136   public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)\r
1137   {\r
1138     addHistoryItem(new HistoryItem("Pairwise Sort", viewport.alignment,\r
1139                                    HistoryItem.SORT));\r
1140     AlignmentSorter.sortByPID(viewport.getAlignment(),\r
1141                               viewport.getAlignment().getSequenceAt(0));\r
1142     alignPanel.repaint();\r
1143   }\r
1144 \r
1145   public void sortIDMenuItem_actionPerformed(ActionEvent e)\r
1146   {\r
1147     addHistoryItem(new HistoryItem("ID Sort", viewport.alignment,\r
1148                                    HistoryItem.SORT));\r
1149     AlignmentSorter.sortByID(viewport.getAlignment());\r
1150     alignPanel.repaint();\r
1151   }\r
1152 \r
1153   public void sortGroupMenuItem_actionPerformed(ActionEvent e)\r
1154   {\r
1155     addHistoryItem(new HistoryItem("Group Sort", viewport.alignment,\r
1156                                    HistoryItem.SORT));\r
1157 \r
1158     //  AlignmentSorter.sortByGroup(viewport.getAlignment());\r
1159     AlignmentSorter.sortGroups(viewport.getAlignment());\r
1160     alignPanel.repaint();\r
1161   }\r
1162 \r
1163   public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)\r
1164   {\r
1165     RedundancyPanel sp = new RedundancyPanel(alignPanel, this);\r
1166     JInternalFrame frame = new JInternalFrame();\r
1167     frame.setContentPane(sp);\r
1168     Desktop.addInternalFrame(frame, "Redundancy threshold selection", 400,\r
1169                              100, false);\r
1170   }\r
1171 \r
1172   public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)\r
1173   {\r
1174     if ( (viewport.getSelectionGroup() == null) ||\r
1175         (viewport.getSelectionGroup().getSize() < 2))\r
1176     {\r
1177       JOptionPane.showInternalMessageDialog(this,\r
1178                                             "You must select at least 2 sequences.",\r
1179                                             "Invalid Selection",\r
1180                                             JOptionPane.WARNING_MESSAGE);\r
1181     }\r
1182     else\r
1183     {\r
1184       JInternalFrame frame = new JInternalFrame();\r
1185       frame.setContentPane(new PairwiseAlignPanel(viewport));\r
1186       Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);\r
1187     }\r
1188   }\r
1189 \r
1190   public void PCAMenuItem_actionPerformed(ActionEvent e)\r
1191   {\r
1192     if ( ( (viewport.getSelectionGroup() != null) &&\r
1193           (viewport.getSelectionGroup().getSize() < 4) &&\r
1194           (viewport.getSelectionGroup().getSize() > 0)) ||\r
1195         (viewport.getAlignment().getHeight() < 4))\r
1196     {\r
1197       JOptionPane.showInternalMessageDialog(this,\r
1198                                             "Principal component analysis must take\n" +\r
1199                                             "at least 4 input sequences.",\r
1200                                             "Sequence selection insufficient",\r
1201                                             JOptionPane.WARNING_MESSAGE);\r
1202 \r
1203       return;\r
1204     }\r
1205 \r
1206     try\r
1207     {\r
1208       PCAPanel pcaPanel = new PCAPanel(viewport, null);\r
1209       JInternalFrame frame = new JInternalFrame();\r
1210       frame.setContentPane(pcaPanel);\r
1211       Desktop.addInternalFrame(frame, "Principal component analysis",\r
1212                                400, 400);\r
1213     }\r
1214     catch (java.lang.OutOfMemoryError ex)\r
1215     {\r
1216       JOptionPane.showInternalMessageDialog(this,\r
1217                                             "Too many sequences selected\nfor Principal Component Analysis!!",\r
1218                                             "Out of memory",\r
1219                                             JOptionPane.WARNING_MESSAGE);\r
1220     }\r
1221   }\r
1222 \r
1223   public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)\r
1224   {\r
1225     NewTreePanel("AV", "PID", "Average distance tree using PID");\r
1226   }\r
1227 \r
1228   public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)\r
1229   {\r
1230     NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");\r
1231   }\r
1232 \r
1233   protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)\r
1234   {\r
1235     NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");\r
1236   }\r
1237 \r
1238   protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)\r
1239   {\r
1240     NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");\r
1241   }\r
1242 \r
1243   void NewTreePanel(String type, String pwType, String title)\r
1244   {\r
1245     final TreePanel tp;\r
1246 \r
1247     if ( (viewport.getSelectionGroup() != null) &&\r
1248         (viewport.getSelectionGroup().getSize() > 3))\r
1249     {\r
1250       int s = 0;\r
1251       SequenceGroup sg = viewport.getSelectionGroup();\r
1252 \r
1253       /* Decide if the selection is a column region */\r
1254       while (s < sg.sequences.size())\r
1255       {\r
1256         if ( ( (SequenceI) sg.sequences.elementAt(s++)).getLength() <\r
1257             sg.getEndRes())\r
1258         {\r
1259           JOptionPane.showMessageDialog(Desktop.desktop,\r
1260                                         "The selected region to create a tree may\nonly contain residues or gaps.\n" +\r
1261                                         "Try using the Pad function in the edit menu,\n" +\r
1262                                         "or one of the multiple sequence alignment web services.",\r
1263                                         "Sequences in selection are not aligned",\r
1264                                         JOptionPane.WARNING_MESSAGE);\r
1265 \r
1266           return;\r
1267         }\r
1268       }\r
1269 \r
1270       title = title + " on region";\r
1271       tp = new TreePanel(viewport,\r
1272                          viewport.getSelectionGroup().sequences, type, pwType,\r
1273                          sg.getStartRes(), sg.getEndRes());\r
1274     }\r
1275     else\r
1276     {\r
1277       //are the sequences aligned?\r
1278       if (!viewport.alignment.isAligned())\r
1279       {\r
1280         JOptionPane.showMessageDialog(Desktop.desktop,\r
1281                                       "The sequences must be aligned before creating a tree.\n" +\r
1282                                       "Try using the Pad function in the edit menu,\n" +\r
1283                                       "or one of the multiple sequence alignment web services.",\r
1284                                       "Sequences not aligned",\r
1285                                       JOptionPane.WARNING_MESSAGE);\r
1286 \r
1287         return;\r
1288       }\r
1289 \r
1290       tp = new TreePanel(viewport,\r
1291                          viewport.getAlignment().getSequences(), type, pwType,\r
1292                          0,\r
1293                          viewport.alignment.getWidth());\r
1294     }\r
1295 \r
1296     addTreeMenuItem(tp, title);\r
1297     viewport.setCurrentTree(tp.getTree());\r
1298 \r
1299     Desktop.addInternalFrame(tp, title + " from " + this.title, 600, 500);\r
1300   }\r
1301 \r
1302   public void addSortByOrderMenuItem(String title, final AlignmentOrder order)\r
1303   {\r
1304     final JMenuItem item = new JMenuItem("by " + title);\r
1305     sort.add(item);\r
1306     item.addActionListener(new java.awt.event.ActionListener()\r
1307     {\r
1308       public void actionPerformed(ActionEvent e)\r
1309       {\r
1310         addHistoryItem(new HistoryItem("Sort", viewport.alignment,\r
1311                                        HistoryItem.SORT));\r
1312 \r
1313         // TODO: JBPNote - have to map order entries to curent SequenceI pointers\r
1314         AlignmentSorter.sortBy(viewport.getAlignment(), order);\r
1315         alignPanel.repaint();\r
1316       }\r
1317     });\r
1318   }\r
1319 \r
1320   void addTreeMenuItem(final TreePanel treePanel, String title)\r
1321   {\r
1322     final JMenuItem item = new JMenuItem(title);\r
1323 \r
1324     treeCount++;\r
1325 \r
1326     if (treeCount == 1)\r
1327     {\r
1328       sort.add(sortByTreeMenu);\r
1329     }\r
1330 \r
1331     sortByTreeMenu.add(item);\r
1332     item.addActionListener(new java.awt.event.ActionListener()\r
1333     {\r
1334       public void actionPerformed(ActionEvent e)\r
1335       {\r
1336         addHistoryItem(new HistoryItem("Tree Sort",\r
1337                                        viewport.alignment, HistoryItem.SORT));\r
1338         AlignmentSorter.sortByTree(viewport.getAlignment(),\r
1339                                    treePanel.getTree());\r
1340         alignPanel.repaint();\r
1341       }\r
1342     });\r
1343 \r
1344     treePanel.addInternalFrameListener(new javax.swing.event.\r
1345                                        InternalFrameAdapter()\r
1346     {\r
1347       public void internalFrameClosed(\r
1348           javax.swing.event.InternalFrameEvent evt)\r
1349       {\r
1350         treeCount--;\r
1351         sortByTreeMenu.remove(item);\r
1352 \r
1353         if (treeCount == 0)\r
1354         {\r
1355           sort.remove(sortByTreeMenu);\r
1356         }\r
1357       }\r
1358       ;\r
1359     });\r
1360     viewport.addPropertyChangeListener(new java.beans.PropertyChangeListener()\r
1361     {\r
1362       public void propertyChange(PropertyChangeEvent evt)\r
1363       {\r
1364         if (evt.getPropertyName().equals("alignment"))\r
1365         {\r
1366           treePanel.getTree().UpdatePlaceHolders( (Vector) evt.getNewValue());\r
1367           treePanel.repaint();\r
1368         }\r
1369       }\r
1370     });\r
1371   }\r
1372 \r
1373   public void clustalAlignMenuItem_actionPerformed(ActionEvent e)\r
1374   {\r
1375     // TODO:resolve which menu item was actually selected\r
1376     // Now, check we have enough sequences\r
1377     SequenceI[] msa = null;\r
1378 \r
1379     if ( (viewport.getSelectionGroup() != null) &&\r
1380         (viewport.getSelectionGroup().getSize() > 1))\r
1381     {\r
1382       // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!\r
1383       SequenceGroup seqs = viewport.getSelectionGroup();\r
1384       int sz;\r
1385       msa = new SequenceI[sz = seqs.getSize()];\r
1386 \r
1387       for (int i = 0; i < sz; i++)\r
1388       {\r
1389         msa[i] = (SequenceI) seqs.getSequenceAt(i);\r
1390       }\r
1391     }\r
1392     else\r
1393     {\r
1394       Vector seqs = viewport.getAlignment().getSequences();\r
1395 \r
1396       if (seqs.size() > 1)\r
1397       {\r
1398         msa = new SequenceI[seqs.size()];\r
1399 \r
1400         for (int i = 0; i < seqs.size(); i++)\r
1401         {\r
1402           msa[i] = (SequenceI) seqs.elementAt(i);\r
1403         }\r
1404       }\r
1405     }\r
1406 \r
1407     if (msa != null)\r
1408     {\r
1409       jalview.ws.MsaWSClient ct = new jalview.ws.MsaWSClient("ClustalWS",\r
1410           title, msa, false, true);\r
1411     }\r
1412   }\r
1413 \r
1414   public void ClustalRealign_actionPerformed(ActionEvent e)\r
1415   {\r
1416     // TODO:resolve which menu item was actually selected\r
1417     // Now, check we have enough sequences\r
1418     SequenceI[] msa = null;\r
1419 \r
1420     if ( (viewport.getSelectionGroup() != null) &&\r
1421         (viewport.getSelectionGroup().getSize() > 1))\r
1422     {\r
1423       // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!\r
1424       SequenceGroup seqs = viewport.getSelectionGroup();\r
1425       int sz;\r
1426       msa = new SequenceI[sz = seqs.getSize()];\r
1427 \r
1428       for (int i = 0; i < sz; i++)\r
1429       {\r
1430         msa[i] = (SequenceI) seqs.getSequenceAt(i);\r
1431       }\r
1432     }\r
1433     else\r
1434     {\r
1435       Vector seqs = viewport.getAlignment().getSequences();\r
1436 \r
1437       if (seqs.size() > 1)\r
1438       {\r
1439         msa = new SequenceI[seqs.size()];\r
1440 \r
1441         for (int i = 0; i < seqs.size(); i++)\r
1442         {\r
1443           msa[i] = (SequenceI) seqs.elementAt(i);\r
1444         }\r
1445       }\r
1446     }\r
1447 \r
1448     if (msa != null)\r
1449     {\r
1450       jalview.ws.MsaWSClient ct = new jalview.ws.MsaWSClient("ClustalWS",\r
1451           title, msa, true, true);\r
1452     }\r
1453   }\r
1454 \r
1455   protected void jpred_actionPerformed(ActionEvent e)\r
1456   {\r
1457     SequenceI seq = null;\r
1458     SequenceI[] msa = null;\r
1459 \r
1460     if ( (viewport.getSelectionGroup() != null) &&\r
1461         (viewport.getSelectionGroup().getSize() > 0))\r
1462     {\r
1463       // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!\r
1464       SequenceGroup seqs = viewport.getSelectionGroup();\r
1465 \r
1466       if ( (seqs.getSize() == 1) || !viewport.alignment.isAligned())\r
1467       {\r
1468         seq = (SequenceI) seqs.getSequenceAt(0);\r
1469       }\r
1470       else\r
1471       {\r
1472         int sz;\r
1473         msa = new SequenceI[sz = seqs.getSize()];\r
1474 \r
1475         for (int i = 0; i < sz; i++)\r
1476         {\r
1477           msa[i] = (SequenceI) seqs.getSequenceAt(i);\r
1478         }\r
1479       }\r
1480     }\r
1481     else\r
1482     {\r
1483       Vector seqs = viewport.getAlignment().getSequences();\r
1484 \r
1485       if ( (seqs.size() == 1) || !viewport.alignment.isAligned())\r
1486       {\r
1487         seq = (SequenceI) seqs.elementAt(0);\r
1488       }\r
1489       else\r
1490       {\r
1491         msa = new SequenceI[seqs.size()];\r
1492 \r
1493         for (int i = 0; i < seqs.size(); i++)\r
1494         {\r
1495           msa[i] = (SequenceI) seqs.elementAt(i);\r
1496         }\r
1497       }\r
1498     }\r
1499 \r
1500     if (msa != null)\r
1501     {\r
1502       JPredClient ct = new JPredClient(title, msa);\r
1503     }\r
1504     else if (seq != null)\r
1505     {\r
1506       JPredClient ct = new JPredClient(title, seq);\r
1507     }\r
1508     else\r
1509     {\r
1510       System.err.print(\r
1511           "JALVIEW ERROR! - Unexpected JPred selection state!\n");\r
1512     }\r
1513   }\r
1514 \r
1515   protected void msaAlignMenuItem_actionPerformed(ActionEvent e)\r
1516   {\r
1517     // TODO:resolve which menu item was actually selected\r
1518     // Now, check we have enough sequences\r
1519     SequenceI[] msa = null;\r
1520 \r
1521     if ( (viewport.getSelectionGroup() != null) &&\r
1522         (viewport.getSelectionGroup().getSize() > 1))\r
1523     {\r
1524       // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!\r
1525       SequenceGroup seqs = viewport.getSelectionGroup();\r
1526       int sz;\r
1527       msa = new SequenceI[sz = seqs.getSize()];\r
1528 \r
1529       for (int i = 0; i < sz; i++)\r
1530       {\r
1531         msa[i] = (SequenceI) seqs.getSequenceAt(i);\r
1532       }\r
1533     }\r
1534     else\r
1535     {\r
1536       Vector seqs = viewport.getAlignment().getSequences();\r
1537 \r
1538       if (seqs.size() > 1)\r
1539       {\r
1540         msa = new SequenceI[seqs.size()];\r
1541 \r
1542         for (int i = 0; i < seqs.size(); i++)\r
1543         {\r
1544           msa[i] = (SequenceI) seqs.elementAt(i);\r
1545         }\r
1546       }\r
1547     }\r
1548 \r
1549     if (msa != null)\r
1550     {\r
1551       MsaWSClient ct = new jalview.ws.MsaWSClient("MuscleWS", title, msa,\r
1552                                                   false, true);\r
1553     }\r
1554   }\r
1555 \r
1556   protected void LoadtreeMenuItem_actionPerformed(ActionEvent e)\r
1557   {\r
1558     // Pick the tree file\r
1559     JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.\r
1560         getProperty(\r
1561             "LAST_DIRECTORY"));\r
1562     chooser.setFileView(new JalviewFileView());\r
1563     chooser.setDialogTitle("Select a newick-like tree file");\r
1564     chooser.setToolTipText("Load a tree file");\r
1565 \r
1566     int value = chooser.showOpenDialog(null);\r
1567 \r
1568     if (value == JalviewFileChooser.APPROVE_OPTION)\r
1569     {\r
1570       String choice = chooser.getSelectedFile().getPath();\r
1571       jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);\r
1572 \r
1573       try\r
1574       {\r
1575         jalview.io.NewickFile fin = new jalview.io.NewickFile(choice,\r
1576             "File");\r
1577         viewport.setCurrentTree( ShowNewickTree(fin, choice).getTree() );\r
1578       }\r
1579       catch (Exception ex)\r
1580       {\r
1581         JOptionPane.showMessageDialog(Desktop.desktop,\r
1582                                       "Problem reading tree file",\r
1583                                       ex.getMessage(),\r
1584                                       JOptionPane.WARNING_MESSAGE);\r
1585         ex.printStackTrace();\r
1586       }\r
1587     }\r
1588   }\r
1589 \r
1590   public TreePanel ShowNewickTree(NewickFile nf, String title)\r
1591   {\r
1592     TreePanel tp = null;\r
1593     try\r
1594     {\r
1595       nf.parse();\r
1596       if (nf.getTree() != null)\r
1597       {\r
1598         tp = new TreePanel(viewport,\r
1599                                      viewport.getAlignment().getSequences(), nf,\r
1600                                      "FromFile",\r
1601                                      title);\r
1602         Desktop.addInternalFrame(tp, title, 600, 500);\r
1603         addTreeMenuItem(tp, title);\r
1604       }\r
1605     }\r
1606     catch (Exception ex)\r
1607     {\r
1608       ex.printStackTrace();\r
1609     }\r
1610     return tp;\r
1611   }\r
1612 \r
1613   class PrintThread\r
1614       extends Thread\r
1615   {\r
1616     public void run()\r
1617     {\r
1618       PrinterJob printJob = PrinterJob.getPrinterJob();\r
1619       PageFormat pf = printJob.pageDialog(printJob.defaultPage());\r
1620       printJob.setPrintable(alignPanel, pf);\r
1621 \r
1622       if (printJob.printDialog())\r
1623       {\r
1624         try\r
1625         {\r
1626           printJob.print();\r
1627         }\r
1628         catch (Exception PrintException)\r
1629         {\r
1630           PrintException.printStackTrace();\r
1631         }\r
1632       }\r
1633     }\r
1634   }\r
1635 }\r