Formatted source
[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.SaveState(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));\r
562     }\r
563 \r
564     sg.setEndRes(viewport.alignment.getWidth());\r
565     viewport.setSelectionGroup(sg);\r
566     PaintRefresher.Refresh(null);\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     PaintRefresher.Refresh(null);\r
575   }\r
576 \r
577   public void invertSequenceMenuItem_actionPerformed(ActionEvent e)\r
578   {\r
579     SequenceGroup sg = viewport.getSelectionGroup();\r
580 \r
581     for (int i = 0; i < viewport.getAlignment().getSequences().size();\r
582          i++)\r
583     {\r
584       sg.addOrRemove(viewport.getAlignment().getSequenceAt(i));\r
585     }\r
586 \r
587     PaintRefresher.Refresh(null);\r
588   }\r
589 \r
590   public void remove2LeftMenuItem_actionPerformed(ActionEvent e)\r
591   {\r
592     ColumnSelection colSel = viewport.getColumnSelection();\r
593 \r
594     if (colSel.size() > 0)\r
595     {\r
596       addHistoryItem(new HistoryItem("Remove Left", viewport.alignment,\r
597                                      HistoryItem.HIDE));\r
598 \r
599       int min = colSel.getMin();\r
600       viewport.getAlignment().trimLeft(min);\r
601       colSel.compensateForEdit(0, min);\r
602 \r
603       if (viewport.getSelectionGroup() != null)\r
604       {\r
605         viewport.getSelectionGroup().adjustForRemoveLeft(min);\r
606       }\r
607 \r
608       Vector groups = viewport.alignment.getGroups();\r
609 \r
610       for (int i = 0; i < groups.size(); i++)\r
611       {\r
612         SequenceGroup sg = (SequenceGroup) groups.get(i);\r
613 \r
614         if (!sg.adjustForRemoveLeft(min))\r
615         {\r
616           viewport.alignment.deleteGroup(sg);\r
617         }\r
618       }\r
619 \r
620       alignPanel.repaint();\r
621     }\r
622   }\r
623 \r
624   public void remove2RightMenuItem_actionPerformed(ActionEvent e)\r
625   {\r
626     ColumnSelection colSel = viewport.getColumnSelection();\r
627 \r
628     if (colSel.size() > 0)\r
629     {\r
630       addHistoryItem(new HistoryItem("Remove Right", viewport.alignment,\r
631                                      HistoryItem.HIDE));\r
632 \r
633       int max = colSel.getMax();\r
634       viewport.getAlignment().trimRight(max);\r
635 \r
636       if (viewport.getSelectionGroup() != null)\r
637       {\r
638         viewport.getSelectionGroup().adjustForRemoveRight(max);\r
639       }\r
640 \r
641       Vector groups = viewport.alignment.getGroups();\r
642 \r
643       for (int i = 0; i < groups.size(); i++)\r
644       {\r
645         SequenceGroup sg = (SequenceGroup) groups.get(i);\r
646 \r
647         if (!sg.adjustForRemoveRight(max))\r
648         {\r
649           viewport.alignment.deleteGroup(sg);\r
650         }\r
651       }\r
652 \r
653       alignPanel.repaint();\r
654     }\r
655   }\r
656 \r
657   public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)\r
658   {\r
659     addHistoryItem(new HistoryItem("Remove Gapped Columns",\r
660                                    viewport.alignment, HistoryItem.HIDE));\r
661 \r
662     viewport.getAlignment().removeGaps();\r
663     viewport.updateConservation();\r
664     viewport.updateConsensus();\r
665     alignPanel.repaint();\r
666   }\r
667 \r
668   public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)\r
669   {\r
670     addHistoryItem(new HistoryItem("Remove Gaps", viewport.alignment,\r
671                                    HistoryItem.HIDE));\r
672 \r
673     SequenceI current;\r
674     int jSize;\r
675 \r
676     for (int i = 0; i < viewport.getAlignment().getSequences().size();\r
677          i++)\r
678     {\r
679       current = viewport.getAlignment().getSequenceAt(i);\r
680       jSize = current.getLength();\r
681 \r
682       for (int j = 0; j < jSize; j++)\r
683       {\r
684         if (jalview.util.Comparison.isGap(current.getCharAt(j)))\r
685         {\r
686           current.deleteCharAt(j);\r
687           j--;\r
688           jSize--;\r
689         }\r
690       }\r
691     }\r
692 \r
693     viewport.updateConservation();\r
694     viewport.updateConsensus();\r
695     alignPanel.repaint();\r
696   }\r
697 \r
698   public void padGapsMenuitem_actionPerformed(ActionEvent e)\r
699   {\r
700     addHistoryItem(new HistoryItem("Pad Gaps", viewport.alignment,\r
701                                    HistoryItem.HIDE));\r
702 \r
703     SequenceI current;\r
704     int Width = viewport.getAlignment().getWidth() - 1;\r
705 \r
706     for (int i = 0; i < viewport.getAlignment().getSequences().size();\r
707          i++)\r
708     {\r
709       current = viewport.getAlignment().getSequenceAt(i);\r
710 \r
711       if (current.getLength() < Width)\r
712       {\r
713         current.insertCharAt(Width, viewport.getGapCharacter());\r
714       }\r
715     }\r
716 \r
717     viewport.updateConservation();\r
718     viewport.updateConsensus();\r
719     alignPanel.repaint();\r
720   }\r
721 \r
722   public void findMenuItem_actionPerformed(ActionEvent e)\r
723   {\r
724     JInternalFrame frame = new JInternalFrame();\r
725     Finder finder = new Finder(viewport, alignPanel, frame);\r
726     frame.setContentPane(finder);\r
727     Desktop.addInternalFrame(frame, "Find", 340, 110);\r
728     frame.setLayer(JLayeredPane.PALETTE_LAYER);\r
729   }\r
730 \r
731   public void font_actionPerformed(ActionEvent e)\r
732   {\r
733     FontChooser fc = new FontChooser(alignPanel);\r
734   }\r
735 \r
736   protected void fullSeqId_actionPerformed(ActionEvent e)\r
737   {\r
738     viewport.setShowFullId(fullSeqId.isSelected());\r
739 \r
740     alignPanel.idPanel.idCanvas.setPreferredSize(alignPanel.calculateIdWidth());\r
741     alignPanel.repaint();\r
742   }\r
743 \r
744   protected void colourTextMenuItem_actionPerformed(ActionEvent e)\r
745   {\r
746     viewport.setColourText(colourTextMenuItem.isSelected());\r
747     alignPanel.repaint();\r
748   }\r
749 \r
750   protected void wrapMenuItem_actionPerformed(ActionEvent e)\r
751   {\r
752     viewport.setWrapAlignment(wrapMenuItem.isSelected());\r
753     alignPanel.setWrapAlignment(wrapMenuItem.isSelected());\r
754     scaleAbove.setVisible(wrapMenuItem.isSelected());\r
755     scaleLeft.setVisible(wrapMenuItem.isSelected());\r
756     scaleRight.setVisible(wrapMenuItem.isSelected());\r
757     alignPanel.repaint();\r
758   }\r
759 \r
760   protected void scaleAbove_actionPerformed(ActionEvent e)\r
761   {\r
762     viewport.setScaleAboveWrapped(scaleAbove.isSelected());\r
763     alignPanel.repaint();\r
764   }\r
765 \r
766   protected void scaleLeft_actionPerformed(ActionEvent e)\r
767   {\r
768     viewport.setScaleLeftWrapped(scaleLeft.isSelected());\r
769     alignPanel.repaint();\r
770   }\r
771 \r
772   protected void scaleRight_actionPerformed(ActionEvent e)\r
773   {\r
774     viewport.setScaleRightWrapped(scaleRight.isSelected());\r
775     alignPanel.repaint();\r
776   }\r
777 \r
778   public void viewBoxesMenuItem_actionPerformed(ActionEvent e)\r
779   {\r
780     viewport.setShowBoxes(viewBoxesMenuItem.isSelected());\r
781     alignPanel.repaint();\r
782   }\r
783 \r
784   public void viewTextMenuItem_actionPerformed(ActionEvent e)\r
785   {\r
786     viewport.setShowText(viewTextMenuItem.isSelected());\r
787     alignPanel.repaint();\r
788   }\r
789 \r
790   protected void renderGapsMenuItem_actionPerformed(ActionEvent e)\r
791   {\r
792     viewport.setRenderGaps(renderGapsMenuItem.isSelected());\r
793     alignPanel.repaint();\r
794   }\r
795 \r
796   public void sequenceFeatures_actionPerformed(ActionEvent evt)\r
797   {\r
798     viewport.showSequenceFeatures(sequenceFeatures.isSelected());\r
799 \r
800     if (viewport.showSequenceFeatures &&\r
801         ! ( (Alignment) viewport.alignment).featuresAdded)\r
802     {\r
803       SequenceFeatureFetcher sft = new SequenceFeatureFetcher(viewport.\r
804           alignment,\r
805           alignPanel);\r
806       ( (Alignment) viewport.alignment).featuresAdded = true;\r
807     }\r
808 \r
809     alignPanel.repaint();\r
810   }\r
811 \r
812   public void annotationPanelMenuItem_actionPerformed(ActionEvent e)\r
813   {\r
814     if (annotationPanelMenuItem.isSelected() &&\r
815         viewport.getWrapAlignment())\r
816     {\r
817       annotationPanelMenuItem.setSelected(false);\r
818 \r
819       return;\r
820     }\r
821 \r
822     viewport.setShowAnnotation(annotationPanelMenuItem.isSelected());\r
823     alignPanel.setAnnotationVisible(annotationPanelMenuItem.isSelected());\r
824   }\r
825 \r
826   public void overviewMenuItem_actionPerformed(ActionEvent e)\r
827   {\r
828     if (alignPanel.overviewPanel != null)\r
829     {\r
830       return;\r
831     }\r
832 \r
833     JInternalFrame frame = new JInternalFrame();\r
834     OverviewPanel overview = new OverviewPanel(alignPanel);\r
835     frame.setContentPane(overview);\r
836     Desktop.addInternalFrame(frame, "Overview " + this.getTitle(),\r
837                              frame.getWidth(), frame.getHeight());\r
838     frame.pack();\r
839     frame.setLayer(JLayeredPane.PALETTE_LAYER);\r
840     frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()\r
841     {\r
842       public void internalFrameClosed(\r
843           javax.swing.event.InternalFrameEvent evt)\r
844       {\r
845         alignPanel.setOverviewPanel(null);\r
846       }\r
847       ;\r
848     });\r
849 \r
850     alignPanel.setOverviewPanel(overview);\r
851   }\r
852 \r
853   protected void noColourmenuItem_actionPerformed(ActionEvent e)\r
854   {\r
855     changeColour(null);\r
856   }\r
857 \r
858   public void clustalColour_actionPerformed(ActionEvent e)\r
859   {\r
860     changeColour(new ClustalxColourScheme(\r
861         viewport.alignment.getSequences(), viewport.alignment.getWidth()));\r
862   }\r
863 \r
864   public void zappoColour_actionPerformed(ActionEvent e)\r
865   {\r
866     changeColour(new ZappoColourScheme());\r
867   }\r
868 \r
869   public void taylorColour_actionPerformed(ActionEvent e)\r
870   {\r
871     changeColour(new TaylorColourScheme());\r
872   }\r
873 \r
874   public void hydrophobicityColour_actionPerformed(ActionEvent e)\r
875   {\r
876     changeColour(new HydrophobicColourScheme());\r
877   }\r
878 \r
879   public void helixColour_actionPerformed(ActionEvent e)\r
880   {\r
881     changeColour(new HelixColourScheme());\r
882   }\r
883 \r
884   public void strandColour_actionPerformed(ActionEvent e)\r
885   {\r
886     changeColour(new StrandColourScheme());\r
887   }\r
888 \r
889   public void turnColour_actionPerformed(ActionEvent e)\r
890   {\r
891     changeColour(new TurnColourScheme());\r
892   }\r
893 \r
894   public void buriedColour_actionPerformed(ActionEvent e)\r
895   {\r
896     changeColour(new BuriedColourScheme());\r
897   }\r
898 \r
899   public void nucleotideColour_actionPerformed(ActionEvent e)\r
900   {\r
901     changeColour(new NucleotideColourScheme());\r
902   }\r
903 \r
904   protected void applyToAllGroups_actionPerformed(ActionEvent e)\r
905   {\r
906     viewport.setColourAppliesToAllGroups(applyToAllGroups.isSelected());\r
907   }\r
908 \r
909   void changeColour(ColourSchemeI cs)\r
910   {\r
911     int threshold = 0;\r
912 \r
913     if (viewport.getAbovePIDThreshold())\r
914     {\r
915       threshold = SliderPanel.setPIDSliderSource(alignPanel, cs,\r
916                                                  "Background");\r
917 \r
918       if (cs instanceof ResidueColourScheme)\r
919       {\r
920         ( (ResidueColourScheme) cs).setThreshold(threshold);\r
921       }\r
922       else if (cs instanceof ScoreColourScheme)\r
923       {\r
924         ( (ScoreColourScheme) cs).setThreshold(threshold);\r
925       }\r
926 \r
927       viewport.setGlobalColourScheme(cs);\r
928     }\r
929     else if (cs instanceof ResidueColourScheme)\r
930     {\r
931       ( (ResidueColourScheme) cs).setThreshold(0);\r
932     }\r
933     else if (cs instanceof ScoreColourScheme)\r
934     {\r
935       ( (ScoreColourScheme) cs).setThreshold(0);\r
936     }\r
937 \r
938     if (viewport.getConservationSelected())\r
939     {\r
940       ConservationColourScheme ccs = null;\r
941 \r
942       Alignment al = (Alignment) viewport.alignment;\r
943       Conservation c = new Conservation("All",\r
944                                         ResidueProperties.propHash, 3,\r
945                                         al.getSequences(), 0,\r
946                                         al.getWidth() - 1);\r
947 \r
948       c.calculate();\r
949       c.verdict(false, viewport.ConsPercGaps);\r
950 \r
951       ccs = new ConservationColourScheme(c, cs);\r
952 \r
953       // MUST NOTIFY THE COLOURSCHEME OF CONSENSUS!\r
954       ccs.setConsensus(viewport.vconsensus);\r
955       viewport.setGlobalColourScheme(ccs);\r
956 \r
957       ccs.inc = SliderPanel.setConservationSlider(alignPanel, ccs,\r
958                                                   "Background");\r
959     }\r
960     else\r
961     {\r
962       // MUST NOTIFY THE COLOURSCHEME OF CONSENSUS!\r
963       if (cs != null)\r
964       {\r
965         cs.setConsensus(viewport.vconsensus);\r
966       }\r
967 \r
968       viewport.setGlobalColourScheme(cs);\r
969     }\r
970 \r
971     if (viewport.getColourAppliesToAllGroups())\r
972     {\r
973       Vector groups = viewport.alignment.getGroups();\r
974 \r
975       for (int i = 0; i < groups.size(); i++)\r
976       {\r
977         SequenceGroup sg = (SequenceGroup) groups.elementAt(i);\r
978 \r
979         if (cs == null)\r
980         {\r
981           sg.cs = null;\r
982         }\r
983         else if (cs instanceof ClustalxColourScheme)\r
984         {\r
985           sg.cs = new ClustalxColourScheme(sg.sequences, sg.getWidth());\r
986         }\r
987         else if (cs instanceof UserColourScheme)\r
988         {\r
989           sg.cs = new UserColourScheme( ( (UserColourScheme) cs).getColours());\r
990         }\r
991         else\r
992         {\r
993           try\r
994           {\r
995             sg.cs = (ColourSchemeI) cs.getClass().newInstance();\r
996           }\r
997           catch (Exception ex)\r
998           {\r
999           }\r
1000         }\r
1001 \r
1002         if (viewport.getAbovePIDThreshold())\r
1003         {\r
1004           if (sg.cs instanceof ResidueColourScheme)\r
1005           {\r
1006             ( (ResidueColourScheme) sg.cs).setThreshold(threshold);\r
1007           }\r
1008           else if (sg.cs instanceof ScoreColourScheme)\r
1009           {\r
1010             ( (ScoreColourScheme) sg.cs).setThreshold(threshold);\r
1011           }\r
1012 \r
1013           sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0,\r
1014               sg.getWidth()));\r
1015         }\r
1016 \r
1017         if (viewport.getConservationSelected())\r
1018         {\r
1019           Conservation c = new Conservation("Group",\r
1020                                             ResidueProperties.propHash, 3,\r
1021                                             sg.sequences, 0,\r
1022                                             viewport.alignment.getWidth() - 1);\r
1023           c.calculate();\r
1024           c.verdict(false, viewport.ConsPercGaps);\r
1025 \r
1026           ConservationColourScheme ccs = new ConservationColourScheme(c,\r
1027               sg.cs);\r
1028 \r
1029           // MUST NOTIFY THE COLOURSCHEME OF CONSENSUS!\r
1030           ccs.setConsensus(AAFrequency.calculate(sg.sequences, 0,\r
1031                                                  sg.getWidth()));\r
1032           sg.cs = ccs;\r
1033         }\r
1034         else if (cs != null)\r
1035         {\r
1036           // MUST NOTIFY THE COLOURSCHEME OF CONSENSUS!\r
1037           sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0,\r
1038               sg.getWidth()));\r
1039         }\r
1040       }\r
1041     }\r
1042 \r
1043     if (alignPanel.getOverviewPanel() != null)\r
1044     {\r
1045       alignPanel.getOverviewPanel().updateOverviewImage();\r
1046     }\r
1047 \r
1048     alignPanel.repaint();\r
1049   }\r
1050 \r
1051   protected void modifyPID_actionPerformed(ActionEvent e)\r
1052   {\r
1053     if (viewport.getAbovePIDThreshold())\r
1054     {\r
1055       SliderPanel.setPIDSliderSource(alignPanel,\r
1056                                      viewport.getGlobalColourScheme(),\r
1057                                      "Background");\r
1058       SliderPanel.showPIDSlider();\r
1059     }\r
1060   }\r
1061 \r
1062   protected void modifyConservation_actionPerformed(ActionEvent e)\r
1063   {\r
1064     if (viewport.getConservationSelected())\r
1065     {\r
1066       SliderPanel.setConservationSlider(alignPanel,\r
1067                                         viewport.globalColourScheme,\r
1068                                         "Background");\r
1069       SliderPanel.showConservationSlider();\r
1070     }\r
1071   }\r
1072 \r
1073   protected void conservationMenuItem_actionPerformed(ActionEvent e)\r
1074   {\r
1075     viewport.setConservationSelected(conservationMenuItem.isSelected());\r
1076 \r
1077     viewport.setAbovePIDThreshold(false);\r
1078     abovePIDThreshold.setSelected(false);\r
1079 \r
1080     ColourSchemeI cs = viewport.getGlobalColourScheme();\r
1081 \r
1082     if (cs instanceof ConservationColourScheme)\r
1083     {\r
1084       changeColour( ( (ConservationColourScheme) cs).cs);\r
1085     }\r
1086     else\r
1087     {\r
1088       changeColour(cs);\r
1089     }\r
1090 \r
1091     modifyConservation_actionPerformed(null);\r
1092   }\r
1093 \r
1094   public void abovePIDThreshold_actionPerformed(ActionEvent e)\r
1095   {\r
1096     viewport.setAbovePIDThreshold(abovePIDThreshold.isSelected());\r
1097 \r
1098     conservationMenuItem.setSelected(false);\r
1099     viewport.setConservationSelected(false);\r
1100 \r
1101     ColourSchemeI cs = viewport.getGlobalColourScheme();\r
1102 \r
1103     if (cs instanceof ConservationColourScheme)\r
1104     {\r
1105       changeColour( ( (ConservationColourScheme) cs).cs);\r
1106     }\r
1107     else\r
1108     {\r
1109       changeColour(cs);\r
1110     }\r
1111 \r
1112     modifyPID_actionPerformed(null);\r
1113   }\r
1114 \r
1115   public void userDefinedColour_actionPerformed(ActionEvent e)\r
1116   {\r
1117     new UserDefinedColours(alignPanel, null);\r
1118   }\r
1119 \r
1120   public void PIDColour_actionPerformed(ActionEvent e)\r
1121   {\r
1122     changeColour(new PIDColourScheme());\r
1123   }\r
1124 \r
1125   public void BLOSUM62Colour_actionPerformed(ActionEvent e)\r
1126   {\r
1127     changeColour(new Blosum62ColourScheme());\r
1128   }\r
1129 \r
1130   public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)\r
1131   {\r
1132     addHistoryItem(new HistoryItem("Pairwise Sort", viewport.alignment,\r
1133                                    HistoryItem.SORT));\r
1134     AlignmentSorter.sortByPID(viewport.getAlignment(),\r
1135                               viewport.getAlignment().getSequenceAt(0));\r
1136     alignPanel.repaint();\r
1137   }\r
1138 \r
1139   public void sortIDMenuItem_actionPerformed(ActionEvent e)\r
1140   {\r
1141     addHistoryItem(new HistoryItem("ID Sort", viewport.alignment,\r
1142                                    HistoryItem.SORT));\r
1143     AlignmentSorter.sortByID(viewport.getAlignment());\r
1144     alignPanel.repaint();\r
1145   }\r
1146 \r
1147   public void sortGroupMenuItem_actionPerformed(ActionEvent e)\r
1148   {\r
1149     addHistoryItem(new HistoryItem("Group Sort", viewport.alignment,\r
1150                                    HistoryItem.SORT));\r
1151 \r
1152     //  AlignmentSorter.sortByGroup(viewport.getAlignment());\r
1153     AlignmentSorter.sortGroups(viewport.getAlignment());\r
1154     alignPanel.repaint();\r
1155   }\r
1156 \r
1157   public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)\r
1158   {\r
1159     RedundancyPanel sp = new RedundancyPanel(alignPanel, this);\r
1160     JInternalFrame frame = new JInternalFrame();\r
1161     frame.setContentPane(sp);\r
1162     Desktop.addInternalFrame(frame, "Redundancy threshold selection", 400,\r
1163                              100, false);\r
1164   }\r
1165 \r
1166   public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)\r
1167   {\r
1168     if ( (viewport.getSelectionGroup() == null) ||\r
1169         (viewport.getSelectionGroup().getSize() < 2))\r
1170     {\r
1171       JOptionPane.showInternalMessageDialog(this,\r
1172                                             "You must select at least 2 sequences.",\r
1173                                             "Invalid Selection",\r
1174                                             JOptionPane.WARNING_MESSAGE);\r
1175     }\r
1176     else\r
1177     {\r
1178       JInternalFrame frame = new JInternalFrame();\r
1179       frame.setContentPane(new PairwiseAlignPanel(viewport));\r
1180       Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);\r
1181     }\r
1182   }\r
1183 \r
1184   public void PCAMenuItem_actionPerformed(ActionEvent e)\r
1185   {\r
1186     if ( ( (viewport.getSelectionGroup() != null) &&\r
1187           (viewport.getSelectionGroup().getSize() < 4) &&\r
1188           (viewport.getSelectionGroup().getSize() > 0)) ||\r
1189         (viewport.getAlignment().getHeight() < 4))\r
1190     {\r
1191       JOptionPane.showInternalMessageDialog(this,\r
1192                                             "Principal component analysis must take\n" +\r
1193                                             "at least 4 input sequences.",\r
1194                                             "Sequence selection insufficient",\r
1195                                             JOptionPane.WARNING_MESSAGE);\r
1196 \r
1197       return;\r
1198     }\r
1199 \r
1200     try\r
1201     {\r
1202       PCAPanel pcaPanel = new PCAPanel(viewport, null);\r
1203       JInternalFrame frame = new JInternalFrame();\r
1204       frame.setContentPane(pcaPanel);\r
1205       Desktop.addInternalFrame(frame, "Principal component analysis",\r
1206                                400, 400);\r
1207     }\r
1208     catch (java.lang.OutOfMemoryError ex)\r
1209     {\r
1210       JOptionPane.showInternalMessageDialog(this,\r
1211                                             "Too many sequences selected\nfor Principal Component Analysis!!",\r
1212                                             "Out of memory",\r
1213                                             JOptionPane.WARNING_MESSAGE);\r
1214     }\r
1215   }\r
1216 \r
1217   public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)\r
1218   {\r
1219     NewTreePanel("AV", "PID", "Average distance tree using PID");\r
1220   }\r
1221 \r
1222   public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)\r
1223   {\r
1224     NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");\r
1225   }\r
1226 \r
1227   protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)\r
1228   {\r
1229     NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");\r
1230   }\r
1231 \r
1232   protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)\r
1233   {\r
1234     NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");\r
1235   }\r
1236 \r
1237   void NewTreePanel(String type, String pwType, String title)\r
1238   {\r
1239     String ltitle;\r
1240     final TreePanel tp;\r
1241 \r
1242     if ( (viewport.getSelectionGroup() != null) &&\r
1243         (viewport.getSelectionGroup().getSize() > 3))\r
1244     {\r
1245       int s = 0;\r
1246       SequenceGroup sg = viewport.getSelectionGroup();\r
1247 \r
1248       /* Decide if the selection is a column region */\r
1249       while (s < sg.sequences.size())\r
1250       {\r
1251         if ( ( (SequenceI) sg.sequences.elementAt(s++)).getLength() <\r
1252             sg.getEndRes())\r
1253         {\r
1254           JOptionPane.showMessageDialog(Desktop.desktop,\r
1255                                         "The selected region to create a tree may\nonly contain residues or gaps.\n" +\r
1256                                         "Try using the Pad function in the edit menu,\n" +\r
1257                                         "or one of the multiple sequence alignment web services.",\r
1258                                         "Sequences in selection are not aligned",\r
1259                                         JOptionPane.WARNING_MESSAGE);\r
1260 \r
1261           return;\r
1262         }\r
1263       }\r
1264 \r
1265       title = title + " on region";\r
1266       tp = new TreePanel(viewport,\r
1267                          viewport.getSelectionGroup().sequences, type, pwType,\r
1268                          sg.getStartRes(), sg.getEndRes());\r
1269     }\r
1270     else\r
1271     {\r
1272       //are the sequences aligned?\r
1273       if (!viewport.alignment.isAligned())\r
1274       {\r
1275         JOptionPane.showMessageDialog(Desktop.desktop,\r
1276                                       "The sequences must be aligned before creating a tree.\n" +\r
1277                                       "Try using the Pad function in the edit menu,\n" +\r
1278                                       "or one of the multiple sequence alignment web services.",\r
1279                                       "Sequences not aligned",\r
1280                                       JOptionPane.WARNING_MESSAGE);\r
1281 \r
1282         return;\r
1283       }\r
1284 \r
1285       tp = new TreePanel(viewport,\r
1286                          viewport.getAlignment().getSequences(), type, pwType,\r
1287                          0,\r
1288                          viewport.alignment.getWidth());\r
1289     }\r
1290 \r
1291     addTreeMenuItem(tp, title);\r
1292     viewport.setCurrentTree(tp.getTree());\r
1293 \r
1294     Desktop.addInternalFrame(tp, title + " from " + this.title, 600, 500);\r
1295   }\r
1296 \r
1297   public void addSortByOrderMenuItem(String title, final AlignmentOrder order)\r
1298   {\r
1299     final JMenuItem item = new JMenuItem("by " + title);\r
1300     sort.add(item);\r
1301     item.addActionListener(new java.awt.event.ActionListener()\r
1302     {\r
1303       public void actionPerformed(ActionEvent e)\r
1304       {\r
1305         addHistoryItem(new HistoryItem("Sort", viewport.alignment,\r
1306                                        HistoryItem.SORT));\r
1307 \r
1308         // TODO: JBPNote - have to map order entries to curent SequenceI pointers\r
1309         AlignmentSorter.sortBy(viewport.getAlignment(), order);\r
1310         alignPanel.repaint();\r
1311       }\r
1312     });\r
1313   }\r
1314 \r
1315   void addTreeMenuItem(final TreePanel treePanel, String title)\r
1316   {\r
1317     final JMenuItem item = new JMenuItem(title);\r
1318 \r
1319     treeCount++;\r
1320 \r
1321     if (treeCount == 1)\r
1322     {\r
1323       sort.add(sortByTreeMenu);\r
1324     }\r
1325 \r
1326     sortByTreeMenu.add(item);\r
1327     item.addActionListener(new java.awt.event.ActionListener()\r
1328     {\r
1329       public void actionPerformed(ActionEvent e)\r
1330       {\r
1331         addHistoryItem(new HistoryItem("Tree Sort",\r
1332                                        viewport.alignment, HistoryItem.SORT));\r
1333         AlignmentSorter.sortByTree(viewport.getAlignment(),\r
1334                                    treePanel.getTree());\r
1335         alignPanel.repaint();\r
1336       }\r
1337     });\r
1338 \r
1339     treePanel.addInternalFrameListener(new javax.swing.event.\r
1340                                        InternalFrameAdapter()\r
1341     {\r
1342       public void internalFrameClosed(\r
1343           javax.swing.event.InternalFrameEvent evt)\r
1344       {\r
1345         treeCount--;\r
1346         sortByTreeMenu.remove(item);\r
1347 \r
1348         if (treeCount == 0)\r
1349         {\r
1350           sort.remove(sortByTreeMenu);\r
1351         }\r
1352       }\r
1353       ;\r
1354     });\r
1355     viewport.addPropertyChangeListener(new java.beans.PropertyChangeListener()\r
1356     {\r
1357       public void propertyChange(PropertyChangeEvent evt)\r
1358       {\r
1359         if (evt.getPropertyName().equals("alignment"))\r
1360         {\r
1361           treePanel.getTree().UpdatePlaceHolders( (Vector) evt.getNewValue());\r
1362           treePanel.repaint();\r
1363         }\r
1364       }\r
1365     });\r
1366   }\r
1367 \r
1368   public void clustalAlignMenuItem_actionPerformed(ActionEvent e)\r
1369   {\r
1370     // TODO:resolve which menu item was actually selected\r
1371     // Now, check we have enough sequences\r
1372     SequenceI[] msa = null;\r
1373 \r
1374     if ( (viewport.getSelectionGroup() != null) &&\r
1375         (viewport.getSelectionGroup().getSize() > 1))\r
1376     {\r
1377       // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!\r
1378       SequenceGroup seqs = viewport.getSelectionGroup();\r
1379       int sz;\r
1380       msa = new SequenceI[sz = seqs.getSize()];\r
1381 \r
1382       for (int i = 0; i < sz; i++)\r
1383       {\r
1384         msa[i] = (SequenceI) seqs.getSequenceAt(i);\r
1385       }\r
1386     }\r
1387     else\r
1388     {\r
1389       Vector seqs = viewport.getAlignment().getSequences();\r
1390 \r
1391       if (seqs.size() > 1)\r
1392       {\r
1393         msa = new SequenceI[seqs.size()];\r
1394 \r
1395         for (int i = 0; i < seqs.size(); i++)\r
1396         {\r
1397           msa[i] = (SequenceI) seqs.elementAt(i);\r
1398         }\r
1399       }\r
1400     }\r
1401 \r
1402     if (msa != null)\r
1403     {\r
1404       jalview.ws.MsaWSClient ct = new jalview.ws.MsaWSClient("ClustalWS",\r
1405           title, msa, false, true);\r
1406     }\r
1407   }\r
1408 \r
1409   public void ClustalRealign_actionPerformed(ActionEvent e)\r
1410   {\r
1411     // TODO:resolve which menu item was actually selected\r
1412     // Now, check we have enough sequences\r
1413     SequenceI[] msa = null;\r
1414 \r
1415     if ( (viewport.getSelectionGroup() != null) &&\r
1416         (viewport.getSelectionGroup().getSize() > 1))\r
1417     {\r
1418       // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!\r
1419       SequenceGroup seqs = viewport.getSelectionGroup();\r
1420       int sz;\r
1421       msa = new SequenceI[sz = seqs.getSize()];\r
1422 \r
1423       for (int i = 0; i < sz; i++)\r
1424       {\r
1425         msa[i] = (SequenceI) seqs.getSequenceAt(i);\r
1426       }\r
1427     }\r
1428     else\r
1429     {\r
1430       Vector seqs = viewport.getAlignment().getSequences();\r
1431 \r
1432       if (seqs.size() > 1)\r
1433       {\r
1434         msa = new SequenceI[seqs.size()];\r
1435 \r
1436         for (int i = 0; i < seqs.size(); i++)\r
1437         {\r
1438           msa[i] = (SequenceI) seqs.elementAt(i);\r
1439         }\r
1440       }\r
1441     }\r
1442 \r
1443     if (msa != null)\r
1444     {\r
1445       jalview.ws.MsaWSClient ct = new jalview.ws.MsaWSClient("ClustalWS",\r
1446           title, msa, true, true);\r
1447     }\r
1448   }\r
1449 \r
1450   protected void jpred_actionPerformed(ActionEvent e)\r
1451   {\r
1452     SequenceI seq = null;\r
1453     SequenceI[] msa = null;\r
1454 \r
1455     if ( (viewport.getSelectionGroup() != null) &&\r
1456         (viewport.getSelectionGroup().getSize() > 0))\r
1457     {\r
1458       // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!\r
1459       SequenceGroup seqs = viewport.getSelectionGroup();\r
1460 \r
1461       if ( (seqs.getSize() == 1) || !viewport.alignment.isAligned())\r
1462       {\r
1463         seq = (SequenceI) seqs.getSequenceAt(0);\r
1464       }\r
1465       else\r
1466       {\r
1467         int sz;\r
1468         msa = new SequenceI[sz = seqs.getSize()];\r
1469 \r
1470         for (int i = 0; i < sz; i++)\r
1471         {\r
1472           msa[i] = (SequenceI) seqs.getSequenceAt(i);\r
1473         }\r
1474       }\r
1475     }\r
1476     else\r
1477     {\r
1478       Vector seqs = viewport.getAlignment().getSequences();\r
1479 \r
1480       if ( (seqs.size() == 1) || !viewport.alignment.isAligned())\r
1481       {\r
1482         seq = (SequenceI) seqs.elementAt(0);\r
1483       }\r
1484       else\r
1485       {\r
1486         msa = new SequenceI[seqs.size()];\r
1487 \r
1488         for (int i = 0; i < seqs.size(); i++)\r
1489         {\r
1490           msa[i] = (SequenceI) seqs.elementAt(i);\r
1491         }\r
1492       }\r
1493     }\r
1494 \r
1495     if (msa != null)\r
1496     {\r
1497       JPredClient ct = new JPredClient(title, msa);\r
1498     }\r
1499     else if (seq != null)\r
1500     {\r
1501       JPredClient ct = new JPredClient(title, seq);\r
1502     }\r
1503     else\r
1504     {\r
1505       System.err.print(\r
1506           "JALVIEW ERROR! - Unexpected JPred selection state!\n");\r
1507     }\r
1508   }\r
1509 \r
1510   protected void msaAlignMenuItem_actionPerformed(ActionEvent e)\r
1511   {\r
1512     // TODO:resolve which menu item was actually selected\r
1513     // Now, check we have enough sequences\r
1514     SequenceI[] msa = null;\r
1515 \r
1516     if ( (viewport.getSelectionGroup() != null) &&\r
1517         (viewport.getSelectionGroup().getSize() > 1))\r
1518     {\r
1519       // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!\r
1520       SequenceGroup seqs = viewport.getSelectionGroup();\r
1521       int sz;\r
1522       msa = new SequenceI[sz = seqs.getSize()];\r
1523 \r
1524       for (int i = 0; i < sz; i++)\r
1525       {\r
1526         msa[i] = (SequenceI) seqs.getSequenceAt(i);\r
1527       }\r
1528     }\r
1529     else\r
1530     {\r
1531       Vector seqs = viewport.getAlignment().getSequences();\r
1532 \r
1533       if (seqs.size() > 1)\r
1534       {\r
1535         msa = new SequenceI[seqs.size()];\r
1536 \r
1537         for (int i = 0; i < seqs.size(); i++)\r
1538         {\r
1539           msa[i] = (SequenceI) seqs.elementAt(i);\r
1540         }\r
1541       }\r
1542     }\r
1543 \r
1544     if (msa != null)\r
1545     {\r
1546       MsaWSClient ct = new jalview.ws.MsaWSClient("MuscleWS", title, msa,\r
1547                                                   false, true);\r
1548     }\r
1549   }\r
1550 \r
1551   protected void LoadtreeMenuItem_actionPerformed(ActionEvent e)\r
1552   {\r
1553     // Pick the tree file\r
1554     JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.\r
1555         getProperty(\r
1556             "LAST_DIRECTORY"));\r
1557     chooser.setFileView(new JalviewFileView());\r
1558     chooser.setDialogTitle("Select a newick-like tree file");\r
1559     chooser.setToolTipText("Load a tree file");\r
1560 \r
1561     int value = chooser.showOpenDialog(null);\r
1562 \r
1563     if (value == JalviewFileChooser.APPROVE_OPTION)\r
1564     {\r
1565       String choice = chooser.getSelectedFile().getPath();\r
1566       jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);\r
1567 \r
1568       try\r
1569       {\r
1570         jalview.io.NewickFile fin = new jalview.io.NewickFile(choice,\r
1571             "File");\r
1572         ShowNewickTree(fin, choice);\r
1573       }\r
1574       catch (Exception ex)\r
1575       {\r
1576         JOptionPane.showMessageDialog(Desktop.desktop,\r
1577                                       "Problem reading tree file",\r
1578                                       ex.getMessage(),\r
1579                                       JOptionPane.WARNING_MESSAGE);\r
1580         ex.printStackTrace();\r
1581       }\r
1582     }\r
1583   }\r
1584 \r
1585   public void ShowNewickTree(NewickFile nf, String title)\r
1586   {\r
1587     try\r
1588     {\r
1589       nf.parse();\r
1590 \r
1591       if (nf.getTree() != null)\r
1592       {\r
1593         TreePanel tp = new TreePanel(viewport,\r
1594                                      viewport.getAlignment().getSequences(), nf,\r
1595                                      "FromFile",\r
1596                                      title);\r
1597         Desktop.addInternalFrame(tp, title, 600, 500);\r
1598         addTreeMenuItem(tp, title);\r
1599         viewport.setCurrentTree(tp.getTree());\r
1600       }\r
1601     }\r
1602     catch (Exception ex)\r
1603     {\r
1604       ex.printStackTrace();\r
1605     }\r
1606   }\r
1607 \r
1608   class PrintThread\r
1609       extends Thread\r
1610   {\r
1611     public void run()\r
1612     {\r
1613       PrinterJob printJob = PrinterJob.getPrinterJob();\r
1614       PageFormat pf = printJob.pageDialog(printJob.defaultPage());\r
1615       printJob.setPrintable(alignPanel, pf);\r
1616 \r
1617       if (printJob.printDialog())\r
1618       {\r
1619         try\r
1620         {\r
1621           printJob.print();\r
1622         }\r
1623         catch (Exception PrintException)\r
1624         {\r
1625           PrintException.printStackTrace();\r
1626         }\r
1627       }\r
1628     }\r
1629   }\r
1630 }\r