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