Remove ref in PaintRefresher on close, changeColour updated
[jalview.git] / src / jalview / appletgui / 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 \r
20 package jalview.appletgui;\r
21 \r
22 import jalview.jbappletgui.GAlignFrame;\r
23 import jalview.schemes.*;\r
24 import jalview.datamodel.*;\r
25 import jalview.analysis.*;\r
26 import jalview.io.*;\r
27 import java.awt.*;\r
28 import java.awt.event.*;\r
29 import java.util.*;\r
30 import java.io.InputStreamReader;\r
31 import java.io.BufferedReader;\r
32 \r
33 public class AlignFrame\r
34     extends GAlignFrame\r
35 {\r
36   final AlignmentPanel alignPanel;\r
37   final AlignViewport viewport;\r
38   public static final int NEW_WINDOW_WIDTH = 700;\r
39   public static final int NEW_WINDOW_HEIGHT = 500;\r
40   jalview.bin.JalviewLite applet;\r
41 \r
42   public AlignFrame(AlignmentI al, jalview.bin.JalviewLite applet)\r
43   {\r
44     this.applet = applet;\r
45     viewport = new AlignViewport(al, applet);\r
46     alignPanel = new AlignmentPanel(this, viewport);\r
47     add(alignPanel);\r
48     alignPanel.validate();\r
49 \r
50     String treeFile = applet.getParameter("treeFile");\r
51     TreePanel treepanel = null;\r
52     if (treeFile != null)\r
53     {\r
54       try\r
55       {\r
56         treeFile = treeFile;\r
57         jalview.io.NewickFile fin = new jalview.io.NewickFile(applet.\r
58             getCodeBase() + treeFile, "URL");\r
59         fin.parse();\r
60 \r
61         if (fin.getTree() != null)\r
62         {\r
63           TreePanel tp = null;\r
64           tp = new TreePanel(viewport, viewport.getAlignment().getSequences(),\r
65                              fin, "FromFile", applet.getCodeBase() + treeFile);\r
66           jalview.bin.JalviewLite.addFrame(tp, treeFile, 600, 500);\r
67           addTreeMenuItem(tp, treeFile);\r
68         }\r
69       }\r
70       catch (Exception ex)\r
71       {\r
72         ex.printStackTrace();\r
73       }\r
74     }\r
75 \r
76     this.addWindowListener(new WindowAdapter()\r
77     {\r
78       public void windowClosing(WindowEvent e)\r
79           {\r
80             closeMenuItem_actionPerformed(null);\r
81           }\r
82     });\r
83 \r
84 \r
85 \r
86   }\r
87 \r
88   public void inputText_actionPerformed(ActionEvent e)\r
89   {\r
90     CutAndPasteTransfer cap = new CutAndPasteTransfer(true);\r
91     Frame frame = new Frame();\r
92     frame.add(cap);\r
93     jalview.bin.JalviewLite.addFrame(frame, "Cut & Paste Input", 500, 500);\r
94   }\r
95 \r
96   protected void outputText_actionPerformed(ActionEvent e)\r
97   {\r
98     CutAndPasteTransfer cap = new CutAndPasteTransfer(false);\r
99     Frame frame = new Frame();\r
100     frame.add(cap);\r
101     jalview.bin.JalviewLite.addFrame(frame,\r
102                                      "Alignment output - " + e.getActionCommand(),\r
103                                      600, 500);\r
104     cap.setText(FormatAdapter.formatSequences(e.getActionCommand(),\r
105                                               viewport.getAlignment().\r
106                                               getSequences()));\r
107   }\r
108 \r
109   public void closeMenuItem_actionPerformed(ActionEvent e)\r
110   {\r
111     PaintRefresher.components.remove(viewport.alignment);\r
112     dispose();\r
113   }\r
114 \r
115   Stack historyList = new Stack();\r
116   Stack redoList = new Stack();\r
117 \r
118   void updateEditMenuBar()\r
119   {\r
120     if (historyList.size() > 0)\r
121     {\r
122       undoMenuItem.setEnabled(true);\r
123       HistoryItem hi = (HistoryItem) historyList.peek();\r
124       undoMenuItem.setLabel("Undo " + hi.getDescription());\r
125     }\r
126     else\r
127     {\r
128       undoMenuItem.setEnabled(false);\r
129       undoMenuItem.setLabel("Undo");\r
130     }\r
131 \r
132     if (redoList.size() > 0)\r
133     {\r
134       redoMenuItem.setEnabled(true);\r
135       HistoryItem hi = (HistoryItem) redoList.peek();\r
136       redoMenuItem.setLabel("Redo " + hi.getDescription());\r
137     }\r
138     else\r
139     {\r
140       redoMenuItem.setEnabled(false);\r
141       redoMenuItem.setLabel("Redo");\r
142     }\r
143   }\r
144 \r
145   public void addHistoryItem(HistoryItem hi)\r
146   {\r
147     historyList.push(hi);\r
148     updateEditMenuBar();\r
149   }\r
150 \r
151   protected void undoMenuItem_actionPerformed(ActionEvent e)\r
152   {\r
153     HistoryItem hi = (HistoryItem) historyList.pop();\r
154     redoList.push(new HistoryItem(hi.getDescription(), viewport.alignment,\r
155                                   HistoryItem.HIDE));\r
156     restoreHistoryItem(hi);\r
157   }\r
158 \r
159   protected void redoMenuItem_actionPerformed(ActionEvent e)\r
160   {\r
161     HistoryItem hi = (HistoryItem) redoList.pop();\r
162     restoreHistoryItem(hi);\r
163     updateEditMenuBar();\r
164     viewport.updateConsensus();\r
165     alignPanel.repaint();\r
166     alignPanel.repaint();\r
167   }\r
168 \r
169   // used by undo and redo\r
170   void restoreHistoryItem(HistoryItem hi)\r
171   {\r
172     if (hi.getType() == HistoryItem.SORT)\r
173     {\r
174       for (int i = 0; i < hi.getSequences().size(); i++)\r
175       {\r
176         viewport.alignment.getSequences().setElementAt(hi.getSequences().\r
177             elementAt(i), i);\r
178       }\r
179     }\r
180     else\r
181     {\r
182       for (int i = 0; i < hi.getSequences().size(); i++)\r
183       {\r
184         SequenceI restore = (SequenceI) hi.getSequences().elementAt(i);\r
185         if (restore.getLength() == 0)\r
186         {\r
187           // log.System.out.println(hi.getHidden().elementAt(i));\r
188           restore.setSequence(hi.getHidden().elementAt(i).toString());\r
189           viewport.alignment.getSequences().insertElementAt(\r
190               restore,\r
191               hi.getAlignIndex(i));\r
192         }\r
193         else\r
194         {\r
195           restore.setSequence(hi.getHidden().elementAt(i).toString());\r
196         }\r
197       }\r
198       if (hi.getType() == HistoryItem.PASTE)\r
199       {\r
200         for (int i = viewport.alignment.getHeight() - 1;\r
201              i > hi.getSequences().size() - 1; i--)\r
202         {\r
203           viewport.alignment.deleteSequence(i);\r
204         }\r
205       }\r
206     }\r
207 \r
208     updateEditMenuBar();\r
209 \r
210     viewport.updateConsensus();\r
211     viewport.updateConservation();\r
212     alignPanel.repaint();\r
213   }\r
214 \r
215   public void moveSelectedSequences(boolean up)\r
216   {\r
217     SequenceGroup sg = viewport.getSelectionGroup();\r
218     if (sg == null)\r
219     {\r
220       return;\r
221     }\r
222 \r
223     if (up)\r
224     {\r
225       for (int i = 1; i < viewport.alignment.getHeight(); i++)\r
226       {\r
227         SequenceI seq = viewport.alignment.getSequenceAt(i);\r
228         if (!sg.sequences.contains(seq))\r
229         {\r
230           continue;\r
231         }\r
232 \r
233         SequenceI temp = viewport.alignment.getSequenceAt(i - 1);\r
234         if (sg.sequences.contains(temp))\r
235         {\r
236           continue;\r
237         }\r
238 \r
239         viewport.alignment.getSequences().setElementAt(temp, i);\r
240         viewport.alignment.getSequences().setElementAt(seq, i - 1);\r
241       }\r
242     }\r
243     else\r
244     {\r
245       for (int i = viewport.alignment.getHeight() - 2; i > -1; i--)\r
246       {\r
247         SequenceI seq = viewport.alignment.getSequenceAt(i);\r
248         if (!sg.sequences.contains(seq))\r
249         {\r
250           continue;\r
251         }\r
252 \r
253         SequenceI temp = viewport.alignment.getSequenceAt(i + 1);\r
254         if (sg.sequences.contains(temp))\r
255         {\r
256           continue;\r
257         }\r
258 \r
259         viewport.alignment.getSequences().setElementAt(temp, i);\r
260         viewport.alignment.getSequences().setElementAt(seq, i + 1);\r
261       }\r
262     }\r
263 \r
264     alignPanel.repaint();\r
265   }\r
266 \r
267   StringBuffer copiedSequences;\r
268   protected void copy_actionPerformed(ActionEvent e)\r
269   {\r
270     if (viewport.getSelectionGroup() == null)\r
271     {\r
272       return;\r
273     }\r
274 \r
275     SequenceGroup sg = viewport.getSelectionGroup();\r
276     copiedSequences = new StringBuffer();\r
277     Hashtable orderedSeqs = new Hashtable();\r
278     for (int i = 0; i < sg.getSize(); i++)\r
279     {\r
280       SequenceI seq = sg.getSequenceAt(i);\r
281       int index = viewport.alignment.findIndex(seq);\r
282       orderedSeqs.put(index + "", seq);\r
283     }\r
284 \r
285     int index = 0, startRes, endRes;\r
286     char ch;\r
287 \r
288     for (int i = 0; i < sg.getSize(); i++)\r
289     {\r
290         SequenceI seq = null;\r
291 \r
292         while (seq == null)\r
293         {\r
294             if (orderedSeqs.containsKey(index + ""))\r
295             {\r
296                 seq = (SequenceI) orderedSeqs.get(index + "");\r
297                 index++;\r
298 \r
299                 break;\r
300             }\r
301             else\r
302             {\r
303                 index++;\r
304             }\r
305         }\r
306 \r
307         //FIND START RES\r
308         //Returns residue following index if gap\r
309         startRes = seq.findPosition(sg.getStartRes());\r
310 \r
311         //FIND END RES\r
312         //Need to find the residue preceeding index if gap\r
313         endRes = 0;\r
314 \r
315         for (int j = 0; j < sg.getEndRes()+1 && j < seq.getLength(); j++)\r
316         {\r
317           ch = seq.getCharAt(j);\r
318           if (!jalview.util.Comparison.isGap( (ch)))\r
319           {\r
320             endRes++;\r
321           }\r
322         }\r
323 \r
324         if(endRes>0)\r
325         {\r
326           endRes += seq.getStart() -1;\r
327         }\r
328 \r
329         copiedSequences.append(seq.getName() + "\t" +\r
330             startRes + "\t" +\r
331             endRes + "\t" +\r
332             seq.getSequence(sg.getStartRes(),\r
333                 sg.getEndRes() + 1) + "\n");\r
334     }\r
335 \r
336   }\r
337 \r
338   protected void pasteNew_actionPerformed(ActionEvent e)\r
339   {\r
340     paste(true);\r
341   }\r
342 \r
343   protected void pasteThis_actionPerformed(ActionEvent e)\r
344   {\r
345     addHistoryItem(new HistoryItem("Paste Sequences", viewport.alignment,\r
346                                    HistoryItem.PASTE));\r
347     paste(false);\r
348   }\r
349 \r
350   void paste(boolean newAlignment)\r
351   {\r
352     try\r
353     {\r
354       if (copiedSequences == null)\r
355       {\r
356         return;\r
357       }\r
358 \r
359       StringTokenizer st = new StringTokenizer(copiedSequences.toString());\r
360       Vector seqs = new Vector();\r
361       while (st.hasMoreElements())\r
362       {\r
363         String name = st.nextToken();\r
364         int start = Integer.parseInt(st.nextToken());\r
365         int end = Integer.parseInt(st.nextToken());\r
366         Sequence sequence = new Sequence(name, st.nextToken(), start, end);\r
367 \r
368         if (!newAlignment)\r
369         {\r
370           viewport.alignment.addSequence(sequence);\r
371         }\r
372         else\r
373         {\r
374           seqs.addElement(sequence);\r
375         }\r
376       }\r
377 \r
378       if (newAlignment)\r
379       {\r
380         SequenceI[] newSeqs = new SequenceI[seqs.size()];\r
381         for (int i = 0; i < seqs.size(); i++)\r
382         {\r
383           newSeqs[i] = (SequenceI) seqs.elementAt(i);\r
384         }\r
385 \r
386         AlignFrame af = new AlignFrame(new Alignment(newSeqs), applet);\r
387         String newtitle = new String("Copied sequences");\r
388         if (getTitle().startsWith("Copied sequences"))\r
389         {\r
390           newtitle = getTitle();\r
391         }\r
392         else\r
393         {\r
394           newtitle = newtitle.concat("- from " + getTitle());\r
395         }\r
396         jalview.bin.JalviewLite.addFrame(af, newtitle, NEW_WINDOW_WIDTH,\r
397                                          NEW_WINDOW_HEIGHT);\r
398       }\r
399       else\r
400       {\r
401         viewport.setEndSeq(viewport.alignment.getHeight());\r
402         viewport.alignment.getWidth();\r
403         viewport.updateConservation();\r
404         viewport.updateConsensus();\r
405         alignPanel.repaint();\r
406       }\r
407 \r
408     }\r
409     catch (Exception ex)\r
410     {} // could be anything being pasted in here\r
411 \r
412   }\r
413 \r
414   protected void cut_actionPerformed(ActionEvent e)\r
415   {\r
416     copy_actionPerformed(null);\r
417     delete_actionPerformed(null);\r
418   }\r
419 \r
420   protected void delete_actionPerformed(ActionEvent e)\r
421   {\r
422     addHistoryItem(new HistoryItem("Delete Sequences", viewport.alignment,\r
423                                    HistoryItem.HIDE));\r
424     if (viewport.getSelectionGroup() == null)\r
425     {\r
426       return;\r
427     }\r
428 \r
429 \r
430     SequenceGroup sg = viewport.getSelectionGroup();\r
431     boolean allSequences = false;\r
432     if(sg.sequences.size()==viewport.alignment.getHeight())\r
433           allSequences = true;\r
434 \r
435     for (int i = 0; i < sg.sequences.size(); i++)\r
436     {\r
437       SequenceI seq = sg.getSequenceAt(i);\r
438       int index = viewport.getAlignment().findIndex(seq);\r
439       seq.deleteChars(sg.getStartRes(), sg.getEndRes() + 1);\r
440 \r
441       // If the cut affects all sequences, remove highlighted columns\r
442       if (allSequences)\r
443       {\r
444         viewport.getColumnSelection().removeElements(sg.getStartRes(),\r
445                                                      sg.getEndRes() + 1);\r
446       }\r
447 \r
448 \r
449       if (seq.getSequence().length() < 1)\r
450       {\r
451         viewport.getAlignment().deleteSequence(seq);\r
452       }\r
453       else\r
454       {\r
455         viewport.getAlignment().getSequences().setElementAt(seq, index);\r
456       }\r
457     }\r
458 \r
459     viewport.setSelectionGroup(null);\r
460     viewport.alignment.deleteGroup(sg);\r
461     viewport.resetSeqLimits(alignPanel.seqPanel.seqCanvas.getSize().height);\r
462     if (viewport.getAlignment().getHeight() < 1)\r
463     {\r
464       try\r
465       {\r
466         this.setVisible(false);\r
467       }\r
468       catch (Exception ex)\r
469       {}\r
470     }\r
471     viewport.updateConservation();\r
472     viewport.updateConsensus();\r
473     alignPanel.repaint();\r
474 \r
475   }\r
476 \r
477   protected void deleteGroups_actionPerformed(ActionEvent e)\r
478   {\r
479     viewport.alignment.deleteAllGroups();\r
480     viewport.setSelectionGroup(null);\r
481 \r
482     alignPanel.repaint();\r
483   }\r
484 \r
485   public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)\r
486   {\r
487     SequenceGroup sg = new SequenceGroup();\r
488     for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)\r
489     {\r
490       sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);\r
491     }\r
492     sg.setEndRes(viewport.alignment.getWidth());\r
493     viewport.setSelectionGroup(sg);\r
494     alignPanel.repaint();\r
495     PaintRefresher.Refresh(null, viewport.alignment);\r
496   }\r
497 \r
498   public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)\r
499   {\r
500     viewport.setSelectionGroup(null);\r
501     viewport.getColumnSelection().clear();\r
502     viewport.setSelectionGroup(null);\r
503     PaintRefresher.Refresh(null, viewport.alignment);\r
504   }\r
505 \r
506   public void invertSequenceMenuItem_actionPerformed(ActionEvent e)\r
507   {\r
508     SequenceGroup sg = viewport.getSelectionGroup();\r
509     for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)\r
510     {\r
511       sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);\r
512     }\r
513 \r
514     PaintRefresher.Refresh(null, viewport.alignment);\r
515   }\r
516 \r
517   public void remove2LeftMenuItem_actionPerformed(ActionEvent e)\r
518   {\r
519     ColumnSelection colSel = viewport.getColumnSelection();\r
520     if (colSel.size() > 0)\r
521     {\r
522       addHistoryItem(new HistoryItem("Remove Left", viewport.alignment,\r
523                                      HistoryItem.HIDE));\r
524       int min = colSel.getMin();\r
525       viewport.getAlignment().trimLeft(min);\r
526       colSel.compensateForEdit(0, min);\r
527 \r
528       if (viewport.getSelectionGroup() != null)\r
529       {\r
530         viewport.getSelectionGroup().adjustForRemoveLeft(min);\r
531       }\r
532 \r
533       Vector groups = viewport.alignment.getGroups();\r
534       for (int i = 0; i < groups.size(); i++)\r
535       {\r
536         SequenceGroup sg = (SequenceGroup) groups.elementAt(i);\r
537         if (!sg.adjustForRemoveLeft(min))\r
538         {\r
539           viewport.alignment.deleteGroup(sg);\r
540         }\r
541       }\r
542 \r
543       alignPanel.repaint();\r
544     }\r
545   }\r
546 \r
547   public void remove2RightMenuItem_actionPerformed(ActionEvent e)\r
548   {\r
549     ColumnSelection colSel = viewport.getColumnSelection();\r
550     if (colSel.size() > 0)\r
551     {\r
552       addHistoryItem(new HistoryItem("Remove Right", viewport.alignment,\r
553                                      HistoryItem.HIDE));\r
554       int max = colSel.getMax();\r
555       viewport.getAlignment().trimRight(max);\r
556       if (viewport.getSelectionGroup() != null)\r
557       {\r
558         viewport.getSelectionGroup().adjustForRemoveRight(max);\r
559       }\r
560 \r
561       Vector groups = viewport.alignment.getGroups();\r
562       for (int i = 0; i < groups.size(); i++)\r
563       {\r
564         SequenceGroup sg = (SequenceGroup) groups.elementAt(i);\r
565         if (!sg.adjustForRemoveRight(max))\r
566         {\r
567           viewport.alignment.deleteGroup(sg);\r
568         }\r
569       }\r
570 \r
571       alignPanel.repaint();\r
572     }\r
573 \r
574   }\r
575 \r
576   public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)\r
577   {\r
578     addHistoryItem(new HistoryItem("Remove Gapped Columns",\r
579                                    viewport.alignment,\r
580                                    HistoryItem.HIDE));\r
581     viewport.getAlignment().removeGaps();\r
582     viewport.updateConservation();\r
583     viewport.updateConsensus();\r
584     alignPanel.repaint();\r
585   }\r
586 \r
587   public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)\r
588   {\r
589     addHistoryItem(new HistoryItem("Remove Gaps", viewport.alignment,\r
590                                    HistoryItem.HIDE));\r
591 \r
592     SequenceI current;\r
593     int jSize;\r
594 \r
595     Vector seqs=null;\r
596 \r
597     int start=0, end = viewport.alignment.getWidth();\r
598 \r
599     if (viewport.getSelectionGroup() != null\r
600         && viewport.getSelectionGroup().sequences != null\r
601         && viewport.getSelectionGroup().sequences.size()>0)\r
602     {\r
603       seqs = viewport.getSelectionGroup().sequences;\r
604       start = viewport.getSelectionGroup().getStartRes();\r
605       end = viewport.getSelectionGroup().getEndRes();\r
606     }\r
607     else\r
608       seqs = viewport.alignment.getSequences();\r
609 \r
610     for (int i = 0; i <seqs.size(); i++)\r
611     {\r
612       current = (SequenceI)seqs.elementAt(i);\r
613       jSize = current.getLength();\r
614 \r
615       int j = start;\r
616       do\r
617       {\r
618         if (jalview.util.Comparison.isGap(current.getCharAt(j)))\r
619         {\r
620           current.deleteCharAt(j);\r
621           j--;\r
622           jSize--;\r
623         }\r
624         j++;\r
625       }\r
626       while(j < end && j < jSize) ;\r
627     }\r
628 \r
629     viewport.updateConservation();\r
630     viewport.updateConsensus();\r
631     alignPanel.repaint();\r
632   }\r
633 \r
634 \r
635   public void findMenuItem_actionPerformed(ActionEvent e)\r
636   {\r
637     Finder finder = new Finder(alignPanel);\r
638   }\r
639 \r
640   public void font_actionPerformed(ActionEvent e)\r
641   {\r
642     Frame frame = new Frame();\r
643     FontChooser fc = new FontChooser(alignPanel, frame);\r
644     frame.add(fc);\r
645     jalview.bin.JalviewLite.addFrame(frame, "Change Font", 440, 100);\r
646 \r
647   }\r
648 \r
649   protected void fullSeqId_actionPerformed(ActionEvent e)\r
650   {\r
651     viewport.setShowFullId(fullSeqId.getState());\r
652     alignPanel.fontChanged();\r
653     alignPanel.repaint();\r
654   }\r
655 \r
656   protected void colourTextMenuItem_actionPerformed(ActionEvent e)\r
657   {\r
658     viewport.setColourText(colourTextMenuItem.getState());\r
659     alignPanel.repaint();\r
660   }\r
661 \r
662   protected void wrapMenuItem_actionPerformed(ActionEvent e)\r
663   {\r
664     viewport.setWrapAlignment(wrapMenuItem.getState());\r
665     alignPanel.setWrapAlignment(wrapMenuItem.getState());\r
666     scaleAbove.setEnabled(wrapMenuItem.getState());\r
667     scaleLeft.setEnabled(wrapMenuItem.getState());\r
668     scaleRight.setEnabled(wrapMenuItem.getState());\r
669     alignPanel.repaint();\r
670   }\r
671 \r
672   protected void scaleAbove_actionPerformed(ActionEvent e)\r
673   {\r
674     viewport.setScaleAboveWrapped(scaleAbove.getState());\r
675     alignPanel.repaint();\r
676   }\r
677 \r
678   protected void scaleLeft_actionPerformed(ActionEvent e)\r
679   {\r
680     viewport.setScaleLeftWrapped(scaleLeft.getState());\r
681     alignPanel.repaint();\r
682   }\r
683 \r
684   protected void scaleRight_actionPerformed(ActionEvent e)\r
685   {\r
686     viewport.setScaleRightWrapped(scaleRight.getState());\r
687     alignPanel.repaint();\r
688   }\r
689 \r
690   public void viewBoxesMenuItem_actionPerformed(ActionEvent e)\r
691   {\r
692     viewport.setShowBoxes(viewBoxesMenuItem.getState());\r
693     alignPanel.repaint();\r
694   }\r
695 \r
696   public void viewTextMenuItem_actionPerformed(ActionEvent e)\r
697   {\r
698     viewport.setShowText(viewTextMenuItem.getState());\r
699     alignPanel.repaint();\r
700   }\r
701 \r
702   protected void renderGapsMenuItem_actionPerformed(ActionEvent e)\r
703   {\r
704     viewport.setRenderGaps(renderGapsMenuItem.getState());\r
705     alignPanel.repaint();\r
706   }\r
707 \r
708   public void annotationPanelMenuItem_actionPerformed(ActionEvent e)\r
709   {\r
710     if (annotationPanelMenuItem.getState() && viewport.getWrapAlignment())\r
711     {\r
712       annotationPanelMenuItem.setState(false);\r
713       return;\r
714     }\r
715     viewport.setShowAnnotation(annotationPanelMenuItem.getState());\r
716     alignPanel.setAnnotationVisible(annotationPanelMenuItem.getState());\r
717   }\r
718 \r
719   public void overviewMenuItem_actionPerformed(ActionEvent e)\r
720   {\r
721     if (alignPanel.overviewPanel != null)\r
722     {\r
723       return;\r
724     }\r
725 \r
726     Frame frame = new Frame();\r
727     OverviewPanel overview = new OverviewPanel(alignPanel);\r
728     frame.add(overview);\r
729     // +50 must allow for applet frame window\r
730     jalview.bin.JalviewLite.addFrame(frame, "Overview " + this.getTitle(),\r
731                                      overview.preferredSize().width,\r
732                                      overview.preferredSize().height + 50);\r
733 \r
734     frame.pack();\r
735     frame.addWindowListener(new WindowAdapter()\r
736     {\r
737       public void windowClosing(WindowEvent e)\r
738       {\r
739         alignPanel.setOverviewPanel(null);\r
740       };\r
741     });\r
742 \r
743     alignPanel.setOverviewPanel(overview);\r
744 \r
745   }\r
746 \r
747   protected void noColourmenuItem_actionPerformed(ActionEvent e)\r
748   {\r
749     changeColour(null);\r
750   }\r
751 \r
752   public void clustalColour_actionPerformed(ActionEvent e)\r
753   {\r
754     abovePIDThreshold.setState(false);\r
755     changeColour(new ClustalxColourScheme(viewport.alignment.getSequences(),\r
756                                           viewport.alignment.getWidth()));\r
757   }\r
758 \r
759   public void zappoColour_actionPerformed(ActionEvent e)\r
760   {\r
761     changeColour(new ZappoColourScheme());\r
762   }\r
763 \r
764   public void taylorColour_actionPerformed(ActionEvent e)\r
765   {\r
766     changeColour(new TaylorColourScheme());\r
767   }\r
768 \r
769   public void hydrophobicityColour_actionPerformed(ActionEvent e)\r
770   {\r
771     changeColour(new HydrophobicColourScheme());\r
772   }\r
773 \r
774   public void helixColour_actionPerformed(ActionEvent e)\r
775   {\r
776     changeColour(new HelixColourScheme());\r
777   }\r
778 \r
779   public void strandColour_actionPerformed(ActionEvent e)\r
780   {\r
781     changeColour(new StrandColourScheme());\r
782   }\r
783 \r
784   public void turnColour_actionPerformed(ActionEvent e)\r
785   {\r
786     changeColour(new TurnColourScheme());\r
787   }\r
788 \r
789   public void buriedColour_actionPerformed(ActionEvent e)\r
790   {\r
791     changeColour(new BuriedColourScheme());\r
792   }\r
793 \r
794   public void nucleotideColour_actionPerformed(ActionEvent e)\r
795   {\r
796     changeColour(new NucleotideColourScheme());\r
797   }\r
798 \r
799   protected void applyToAllGroups_actionPerformed(ActionEvent e)\r
800   {\r
801     viewport.setColourAppliesToAllGroups(applyToAllGroups.getState());\r
802   }\r
803 \r
804   void changeColour(ColourSchemeI cs)\r
805   {\r
806     int threshold = 0;\r
807 \r
808     if(cs!=null)\r
809     {\r
810       if (viewport.getAbovePIDThreshold())\r
811       {\r
812         threshold = SliderPanel.setPIDSliderSource(alignPanel, cs, "Background");\r
813 \r
814         cs.setThreshold(threshold, viewport.getIgnoreGapsConsensus());\r
815 \r
816         viewport.setGlobalColourScheme(cs);\r
817       }\r
818       else\r
819       {\r
820         cs.setThreshold(0, viewport.getIgnoreGapsConsensus());\r
821       }\r
822 \r
823       if (viewport.getConservationSelected())\r
824       {\r
825 \r
826         Alignment al = (Alignment) viewport.alignment;\r
827         Conservation c = new Conservation("All",\r
828                                           ResidueProperties.propHash, 3,\r
829                                           al.getSequences(), 0,\r
830                                           al.getWidth() - 1);\r
831 \r
832         c.calculate();\r
833         c.verdict(false, viewport.ConsPercGaps);\r
834 \r
835         cs.setConservation(c);\r
836 \r
837         cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel, cs,\r
838             "Background"));\r
839 \r
840       }\r
841       else\r
842       {\r
843         cs.setConservation(null);\r
844       }\r
845 \r
846       cs.setConsensus(viewport.vconsensus);\r
847 \r
848     }\r
849     viewport.setGlobalColourScheme(cs);\r
850 \r
851     if (viewport.getColourAppliesToAllGroups())\r
852     {\r
853       Vector groups = viewport.alignment.getGroups();\r
854       for (int i = 0; i < groups.size(); i++)\r
855       {\r
856         SequenceGroup sg = (SequenceGroup) groups.elementAt(i);\r
857 \r
858         if(cs==null)\r
859         {\r
860           sg.cs = null;\r
861           continue;\r
862         }\r
863         if (cs instanceof ClustalxColourScheme)\r
864         {\r
865           sg.cs = new ClustalxColourScheme(sg.sequences, sg.getWidth());\r
866         }\r
867         else\r
868         {\r
869           try\r
870           {\r
871             sg.cs = (ColourSchemeI) cs.getClass().newInstance();\r
872           }\r
873           catch (Exception ex)\r
874           {\r
875             ex.printStackTrace();\r
876             sg.cs = cs;\r
877           }\r
878         }\r
879 \r
880         if (viewport.getAbovePIDThreshold()\r
881             || cs instanceof PIDColourScheme\r
882             || cs instanceof Blosum62ColourScheme)\r
883         {\r
884           sg.cs.setThreshold(threshold, viewport.getIgnoreGapsConsensus());\r
885           sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0, sg.getWidth()));\r
886         }\r
887         else\r
888           sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());\r
889 \r
890         if (viewport.getConservationSelected())\r
891         {\r
892           Conservation c = new Conservation("Group",\r
893                                             ResidueProperties.propHash, 3,\r
894                                             sg.sequences, 0,\r
895                                             viewport.alignment.getWidth() - 1);\r
896           c.calculate();\r
897           c.verdict(false, viewport.ConsPercGaps);\r
898           sg.cs.setConservation(c);\r
899         }\r
900         else\r
901         {\r
902           sg.cs.setConservation(null);\r
903         }\r
904 \r
905       }\r
906     }\r
907 \r
908 \r
909     if (alignPanel.getOverviewPanel() != null)\r
910     {\r
911       alignPanel.getOverviewPanel().updateOverviewImage();\r
912     }\r
913 \r
914     alignPanel.repaint();\r
915   }\r
916 \r
917 \r
918 \r
919   protected void modifyPID_actionPerformed(ActionEvent e)\r
920   {\r
921     if (viewport.getAbovePIDThreshold() && viewport.globalColourScheme!=null)\r
922     {\r
923       SliderPanel.setPIDSliderSource(alignPanel, viewport.getGlobalColourScheme(),\r
924                                      "Background");\r
925       SliderPanel.showPIDSlider();\r
926     }\r
927   }\r
928 \r
929   protected void modifyConservation_actionPerformed(ActionEvent e)\r
930   {\r
931     if (viewport.getConservationSelected() && viewport.globalColourScheme!=null)\r
932     {\r
933       SliderPanel.setConservationSlider(alignPanel, viewport.globalColourScheme,\r
934                                         "Background");\r
935       SliderPanel.showConservationSlider();\r
936     }\r
937   }\r
938 \r
939   protected void conservationMenuItem_actionPerformed(ActionEvent e)\r
940   {\r
941     viewport.setConservationSelected(conservationMenuItem.getState());\r
942 \r
943     viewport.setAbovePIDThreshold(false);\r
944     abovePIDThreshold.setState(false);\r
945 \r
946     changeColour(viewport.getGlobalColourScheme());\r
947 \r
948     modifyConservation_actionPerformed(null);\r
949   }\r
950 \r
951   public void abovePIDThreshold_actionPerformed(ActionEvent e)\r
952   {\r
953     viewport.setAbovePIDThreshold(abovePIDThreshold.getState());\r
954 \r
955     conservationMenuItem.setState(false);\r
956     viewport.setConservationSelected(false);\r
957 \r
958     changeColour(viewport.getGlobalColourScheme());\r
959 \r
960     modifyPID_actionPerformed(null);\r
961   }\r
962 \r
963   public void userDefinedColour_actionPerformed(ActionEvent e)\r
964   {\r
965     UserDefinedColours chooser = new UserDefinedColours(alignPanel, null);\r
966   }\r
967 \r
968   public void PIDColour_actionPerformed(ActionEvent e)\r
969   {\r
970     changeColour(new PIDColourScheme());\r
971   }\r
972 \r
973   public void BLOSUM62Colour_actionPerformed(ActionEvent e)\r
974   {\r
975     changeColour(new Blosum62ColourScheme());\r
976   }\r
977 \r
978   public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)\r
979   {\r
980     addHistoryItem(new HistoryItem("Pairwise Sort", viewport.alignment,\r
981                                    HistoryItem.SORT));\r
982     AlignmentSorter.sortByPID(viewport.getAlignment(),\r
983                               viewport.getAlignment().getSequenceAt(0));\r
984     alignPanel.repaint();\r
985   }\r
986 \r
987   public void sortIDMenuItem_actionPerformed(ActionEvent e)\r
988   {\r
989     addHistoryItem(new HistoryItem("ID Sort", viewport.alignment,\r
990                                    HistoryItem.SORT));\r
991     AlignmentSorter.sortByID(viewport.getAlignment());\r
992     alignPanel.repaint();\r
993   }\r
994 \r
995   public void sortGroupMenuItem_actionPerformed(ActionEvent e)\r
996   {\r
997     addHistoryItem(new HistoryItem("Group Sort", viewport.alignment,\r
998                                    HistoryItem.SORT));\r
999     AlignmentSorter.sortByGroup(viewport.getAlignment());\r
1000     alignPanel.repaint();\r
1001 \r
1002   }\r
1003 \r
1004   public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)\r
1005   {\r
1006     RedundancyPanel sp = new RedundancyPanel(alignPanel);\r
1007     Frame frame = new Frame();\r
1008     frame.add(sp);\r
1009     jalview.bin.JalviewLite.addFrame(frame, "Redundancy threshold selection",\r
1010                                      400, 120);\r
1011 \r
1012   }\r
1013 \r
1014   public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)\r
1015   {\r
1016     if (viewport.getSelectionGroup().getSize() > 1)\r
1017     {\r
1018       Frame frame = new Frame();\r
1019       frame.add(new PairwiseAlignPanel(viewport));\r
1020       jalview.bin.JalviewLite.addFrame(frame, "Pairwise Alignment", 600, 500);\r
1021     }\r
1022   }\r
1023 \r
1024   public void PCAMenuItem_actionPerformed(ActionEvent e)\r
1025   {\r
1026 \r
1027     if ( (viewport.getSelectionGroup() != null &&\r
1028           viewport.getSelectionGroup().getSize() < 4 &&\r
1029           viewport.getSelectionGroup().getSize() > 0)\r
1030         || viewport.getAlignment().getHeight() < 4)\r
1031     {\r
1032       return;\r
1033     }\r
1034 \r
1035     try\r
1036     {\r
1037       PCAPanel pcaPanel = new PCAPanel(viewport, null);\r
1038       Frame frame = new Frame();\r
1039       frame.add(pcaPanel);\r
1040       jalview.bin.JalviewLite.addFrame(frame, "Principal component analysis",\r
1041                                        400, 400);\r
1042     }\r
1043     catch (java.lang.OutOfMemoryError ex)\r
1044     {\r
1045     }\r
1046 \r
1047   }\r
1048 \r
1049   public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)\r
1050   {\r
1051     NewTreePanel("AV", "PID", "Average distance tree using PID");\r
1052   }\r
1053 \r
1054   public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)\r
1055   {\r
1056     NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");\r
1057   }\r
1058 \r
1059   protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)\r
1060   {\r
1061     NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");\r
1062   }\r
1063 \r
1064   protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)\r
1065   {\r
1066     NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62PID");\r
1067   }\r
1068 \r
1069   void NewTreePanel(String type, String pwType, String title)\r
1070   {\r
1071     //are the sequences aligned?\r
1072     if (!viewport.alignment.isAligned())\r
1073     {\r
1074       SequenceI current;\r
1075       int Width = viewport.getAlignment().getWidth();\r
1076 \r
1077       for (int i = 0; i < viewport.getAlignment().getSequences().size();\r
1078            i++)\r
1079       {\r
1080         current = viewport.getAlignment().getSequenceAt(i);\r
1081 \r
1082         if (current.getLength() < Width)\r
1083         {\r
1084           current.insertCharAt(Width - 1, viewport.getGapCharacter());\r
1085         }\r
1086       }\r
1087       alignPanel.repaint();\r
1088 \r
1089     }\r
1090 \r
1091     final TreePanel tp;\r
1092     if (viewport.getSelectionGroup() != null &&\r
1093         viewport.getSelectionGroup().getSize() > 3)\r
1094     {\r
1095       tp = new TreePanel(viewport, viewport.getSelectionGroup().sequences, type,\r
1096                          pwType,\r
1097                          0, viewport.alignment.getWidth());\r
1098     }\r
1099     else\r
1100     {\r
1101       tp = new TreePanel(viewport, viewport.getAlignment().getSequences(),\r
1102                          type, pwType, 0, viewport.alignment.getWidth());\r
1103     }\r
1104 \r
1105     addTreeMenuItem(tp, title);\r
1106 \r
1107     jalview.bin.JalviewLite.addFrame(tp, title, 600, 500);\r
1108   }\r
1109 \r
1110   void addTreeMenuItem(final TreePanel treePanel, String title)\r
1111   {\r
1112     final MenuItem item = new MenuItem(title);\r
1113     sortByTreeMenu.add(item);\r
1114     item.addActionListener(new java.awt.event.ActionListener()\r
1115     {\r
1116       public void actionPerformed(ActionEvent e)\r
1117       {\r
1118         addHistoryItem(new HistoryItem("Sort", viewport.alignment,\r
1119                                        HistoryItem.SORT));\r
1120         AlignmentSorter.sortByTree(viewport.getAlignment(), treePanel.getTree());\r
1121         alignPanel.repaint();\r
1122       }\r
1123     });\r
1124 \r
1125     treePanel.addWindowListener(new WindowAdapter()\r
1126     {\r
1127       public void windowClosing(WindowEvent e)\r
1128       {\r
1129         sortByTreeMenu.remove(item);\r
1130       };\r
1131     });\r
1132   }\r
1133 \r
1134   protected void documentation_actionPerformed(ActionEvent e)\r
1135   {\r
1136     jalview.bin.JalviewLite.showURL("http://www.jalview.org/help.html");\r
1137   }\r
1138 \r
1139   protected void about_actionPerformed(ActionEvent e)\r
1140   {\r
1141 \r
1142     class AboutPanel extends Canvas\r
1143     {\r
1144       String version;\r
1145       public AboutPanel(String version)\r
1146       { this.version = version; }\r
1147 \r
1148       public void paint(Graphics g)\r
1149       {\r
1150         g.setColor(Color.white);\r
1151         g.fillRect(0, 0, getSize().width, getSize().height);\r
1152         g.setFont(new Font("Helvetica", Font.PLAIN, 12));\r
1153         FontMetrics fm = g.getFontMetrics();\r
1154         int fh = fm.getHeight();\r
1155         int y = 5, x = 7;\r
1156         g.setColor(Color.black);\r
1157         g.setFont(new Font("Helvetica", Font.BOLD, 14));\r
1158         g.drawString("Jalview - Release "+version, 200, y += fh);\r
1159         g.setFont(new Font("Helvetica", Font.PLAIN, 12));\r
1160         g.drawString("Authors:  Michele Clamp, James Cuff, Steve Searle, Andrew Waterhouse, Jim Procter & Geoff Barton.",\r
1161                      x, y += fh * 2);\r
1162         g.drawString("Current development managed by Andrew Waterhouse; Barton Group, University of Dundee.",\r
1163                      x, y += fh);\r
1164         g.drawString(\r
1165             "For any issues relating to Jalview, email help@jalview.org", x,\r
1166             y += fh);\r
1167         g.drawString("If  you use JalView, please cite:", x, y += fh + 8);\r
1168         g.drawString("\"Clamp, M., Cuff, J., Searle, S. M. and Barton, G. J. (2004), The Jalview Java Alignment Editor\"",\r
1169                      x, y += fh);\r
1170         g.drawString("Bioinformatics,  2004 12;426-7.", x, y += fh);\r
1171       }\r
1172     }\r
1173 \r
1174     String version = "test";\r
1175     java.net.URL url = getClass().getResource("/.build_properties");\r
1176     if (url != null)\r
1177     {\r
1178       try\r
1179       {\r
1180         BufferedReader reader = new BufferedReader(new InputStreamReader(\r
1181             url.openStream()));\r
1182         String line;\r
1183         while ( (line = reader.readLine()) != null)\r
1184         {\r
1185           if (line.indexOf("VERSION") > -1)\r
1186           {\r
1187             version = line.substring(line.indexOf("=") + 1);\r
1188           }\r
1189         }\r
1190       }\r
1191       catch (Exception ex)\r
1192       {\r
1193         ex.printStackTrace();\r
1194       }\r
1195     }\r
1196 \r
1197 \r
1198     Frame frame = new Frame();\r
1199     frame.add(new AboutPanel(version));\r
1200     jalview.bin.JalviewLite.addFrame(frame, "Jalview", 580, 200);\r
1201 \r
1202   }\r
1203 }\r