Reset browser every time
[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);\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);\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);\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       if (cs instanceof ResidueColourScheme)\r
812       {\r
813         ( (ResidueColourScheme) cs).setThreshold(threshold, viewport.getIgnoreGapsConsensus());\r
814       }\r
815 \r
816       viewport.setGlobalColourScheme(cs);\r
817     }\r
818     else if (cs instanceof ResidueColourScheme)\r
819     {\r
820       ( (ResidueColourScheme) cs).setThreshold(0, viewport.getIgnoreGapsConsensus());\r
821     }\r
822 \r
823     if (viewport.getConservationSelected())\r
824     {\r
825       ConservationColourScheme ccs = null;\r
826 \r
827       Alignment al = (Alignment) viewport.alignment;\r
828       Conservation c = new Conservation("All",\r
829                                         ResidueProperties.propHash, 3,\r
830                                         al.getSequences(), 0,\r
831                                         al.getWidth() - 1);\r
832 \r
833       c.calculate();\r
834       c.verdict(false, viewport.ConsPercGaps);\r
835 \r
836       ccs = new ConservationColourScheme(c, cs);\r
837 \r
838       // MUST NOTIFY THE COLOURSCHEME OF CONSENSUS!\r
839       ccs.setConsensus(viewport.vconsensus);\r
840       viewport.setGlobalColourScheme(ccs);\r
841 \r
842       SliderPanel.setConservationSlider(alignPanel, ccs, "Background");\r
843 \r
844     }\r
845     else\r
846     {\r
847       // MUST NOTIFY THE COLOURSCHEME OF CONSENSUS!\r
848       if (cs != null)\r
849       {\r
850         cs.setConsensus(viewport.vconsensus);\r
851       }\r
852       viewport.setGlobalColourScheme(cs);\r
853     }\r
854 \r
855     if (viewport.getColourAppliesToAllGroups())\r
856     {\r
857       Vector groups = viewport.alignment.getGroups();\r
858       for (int i = 0; i < groups.size(); i++)\r
859       {\r
860         SequenceGroup sg = (SequenceGroup) groups.elementAt(i);\r
861 \r
862         if(cs==null)\r
863         {\r
864           sg.cs = null;\r
865           continue;\r
866         }\r
867         if (cs instanceof ClustalxColourScheme)\r
868         {\r
869           ClustalxColourScheme cxs = (ClustalxColourScheme) cs;\r
870           cxs.resetClustalX(viewport.alignment.getSequences(), viewport.alignment.getWidth());\r
871           sg.cs = cxs;\r
872         }\r
873         else\r
874         {\r
875           try\r
876           {\r
877             sg.cs = (ColourSchemeI) cs.getClass().newInstance();\r
878           }\r
879           catch (Exception ex)\r
880           {\r
881             ex.printStackTrace();\r
882             sg.cs = cs;\r
883           }\r
884         }\r
885 \r
886         if (viewport.getAbovePIDThreshold())\r
887         {\r
888           if (sg.cs instanceof ResidueColourScheme)\r
889           {\r
890             ( (ResidueColourScheme) sg.cs).setThreshold(threshold, viewport.getIgnoreGapsConsensus());\r
891           }\r
892 \r
893           sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0, sg.getWidth()));\r
894         }\r
895 \r
896         if (viewport.getConservationSelected())\r
897         {\r
898           Conservation c = new Conservation("Group",\r
899                                             ResidueProperties.propHash, 3,\r
900                                             sg.sequences, 0,\r
901                                             viewport.alignment.getWidth() - 1);\r
902           c.calculate();\r
903           c.verdict(false, viewport.ConsPercGaps);\r
904           ConservationColourScheme ccs = new ConservationColourScheme(c, sg.cs);\r
905 \r
906           // MUST NOTIFY THE COLOURSCHEME OF CONSENSUS!\r
907           ccs.setConsensus(AAFrequency.calculate(sg.sequences, 0, sg.getWidth()));\r
908           sg.cs = ccs;\r
909         }\r
910         else\r
911         {\r
912           // MUST NOTIFY THE COLOURSCHEME OF CONSENSUS!\r
913           sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0, sg.getWidth()));\r
914         }\r
915 \r
916       }\r
917     }\r
918 \r
919     updateCSConsensus();\r
920 \r
921     if (alignPanel.getOverviewPanel() != null)\r
922     {\r
923       alignPanel.getOverviewPanel().updateOverviewImage();\r
924     }\r
925 \r
926     alignPanel.repaint();\r
927   }\r
928 \r
929   public void updateCSConsensus()\r
930   {\r
931     //Colour schemes must have their consensus updated\r
932 \r
933   }\r
934 \r
935   protected void modifyPID_actionPerformed(ActionEvent e)\r
936   {\r
937     if (viewport.getAbovePIDThreshold())\r
938     {\r
939       SliderPanel.setPIDSliderSource(alignPanel, viewport.getGlobalColourScheme(),\r
940                                      "Background");\r
941       SliderPanel.showPIDSlider();\r
942     }\r
943   }\r
944 \r
945   protected void modifyConservation_actionPerformed(ActionEvent e)\r
946   {\r
947     if (viewport.getConservationSelected())\r
948     {\r
949       SliderPanel.setConservationSlider(alignPanel, viewport.globalColourScheme,\r
950                                         "Background");\r
951       SliderPanel.showConservationSlider();\r
952     }\r
953   }\r
954 \r
955   protected void conservationMenuItem_actionPerformed(ActionEvent e)\r
956   {\r
957     viewport.setConservationSelected(conservationMenuItem.getState());\r
958 \r
959     viewport.setAbovePIDThreshold(false);\r
960     abovePIDThreshold.setState(false);\r
961 \r
962     ColourSchemeI cs = viewport.getGlobalColourScheme();\r
963     if (cs instanceof ConservationColourScheme)\r
964     {\r
965       changeColour( ( (ConservationColourScheme) cs).cs);\r
966     }\r
967     else\r
968     {\r
969       changeColour(cs);\r
970     }\r
971 \r
972     modifyConservation_actionPerformed(null);\r
973   }\r
974 \r
975   public void abovePIDThreshold_actionPerformed(ActionEvent e)\r
976   {\r
977     viewport.setAbovePIDThreshold(abovePIDThreshold.getState());\r
978 \r
979     conservationMenuItem.setState(false);\r
980     viewport.setConservationSelected(false);\r
981 \r
982     ColourSchemeI cs = viewport.getGlobalColourScheme();\r
983 \r
984     if (cs instanceof ConservationColourScheme)\r
985     {\r
986       changeColour( ( (ConservationColourScheme) cs).cs);\r
987     }\r
988     else\r
989     {\r
990       changeColour(cs);\r
991     }\r
992 \r
993     modifyPID_actionPerformed(null);\r
994   }\r
995 \r
996   public void userDefinedColour_actionPerformed(ActionEvent e)\r
997   {\r
998     UserDefinedColours chooser = new UserDefinedColours(alignPanel, null);\r
999   }\r
1000 \r
1001   public void PIDColour_actionPerformed(ActionEvent e)\r
1002   {\r
1003     changeColour(new PIDColourScheme());\r
1004   }\r
1005 \r
1006   public void BLOSUM62Colour_actionPerformed(ActionEvent e)\r
1007   {\r
1008     changeColour(new Blosum62ColourScheme());\r
1009   }\r
1010 \r
1011   public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)\r
1012   {\r
1013     addHistoryItem(new HistoryItem("Pairwise Sort", viewport.alignment,\r
1014                                    HistoryItem.SORT));\r
1015     AlignmentSorter.sortByPID(viewport.getAlignment(),\r
1016                               viewport.getAlignment().getSequenceAt(0));\r
1017     alignPanel.repaint();\r
1018   }\r
1019 \r
1020   public void sortIDMenuItem_actionPerformed(ActionEvent e)\r
1021   {\r
1022     addHistoryItem(new HistoryItem("ID Sort", viewport.alignment,\r
1023                                    HistoryItem.SORT));\r
1024     AlignmentSorter.sortByID(viewport.getAlignment());\r
1025     alignPanel.repaint();\r
1026   }\r
1027 \r
1028   public void sortGroupMenuItem_actionPerformed(ActionEvent e)\r
1029   {\r
1030     addHistoryItem(new HistoryItem("Group Sort", viewport.alignment,\r
1031                                    HistoryItem.SORT));\r
1032     AlignmentSorter.sortByGroup(viewport.getAlignment());\r
1033     alignPanel.repaint();\r
1034 \r
1035   }\r
1036 \r
1037   public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)\r
1038   {\r
1039     RedundancyPanel sp = new RedundancyPanel(alignPanel);\r
1040     Frame frame = new Frame();\r
1041     frame.add(sp);\r
1042     jalview.bin.JalviewLite.addFrame(frame, "Redundancy threshold selection",\r
1043                                      400, 120);\r
1044 \r
1045   }\r
1046 \r
1047   public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)\r
1048   {\r
1049     if (viewport.getSelectionGroup().getSize() > 1)\r
1050     {\r
1051       Frame frame = new Frame();\r
1052       frame.add(new PairwiseAlignPanel(viewport));\r
1053       jalview.bin.JalviewLite.addFrame(frame, "Pairwise Alignment", 600, 500);\r
1054     }\r
1055   }\r
1056 \r
1057   public void PCAMenuItem_actionPerformed(ActionEvent e)\r
1058   {\r
1059 \r
1060     if ( (viewport.getSelectionGroup() != null &&\r
1061           viewport.getSelectionGroup().getSize() < 4 &&\r
1062           viewport.getSelectionGroup().getSize() > 0)\r
1063         || viewport.getAlignment().getHeight() < 4)\r
1064     {\r
1065       return;\r
1066     }\r
1067 \r
1068     try\r
1069     {\r
1070       PCAPanel pcaPanel = new PCAPanel(viewport, null);\r
1071       Frame frame = new Frame();\r
1072       frame.add(pcaPanel);\r
1073       jalview.bin.JalviewLite.addFrame(frame, "Principal component analysis",\r
1074                                        400, 400);\r
1075     }\r
1076     catch (java.lang.OutOfMemoryError ex)\r
1077     {\r
1078     }\r
1079 \r
1080   }\r
1081 \r
1082   public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)\r
1083   {\r
1084     NewTreePanel("AV", "PID", "Average distance tree using PID");\r
1085   }\r
1086 \r
1087   public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)\r
1088   {\r
1089     NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");\r
1090   }\r
1091 \r
1092   protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)\r
1093   {\r
1094     NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");\r
1095   }\r
1096 \r
1097   protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)\r
1098   {\r
1099     NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62PID");\r
1100   }\r
1101 \r
1102   void NewTreePanel(String type, String pwType, String title)\r
1103   {\r
1104     //are the sequences aligned?\r
1105     if (!viewport.alignment.isAligned())\r
1106     {\r
1107       SequenceI current;\r
1108       int Width = viewport.getAlignment().getWidth();\r
1109 \r
1110       for (int i = 0; i < viewport.getAlignment().getSequences().size();\r
1111            i++)\r
1112       {\r
1113         current = viewport.getAlignment().getSequenceAt(i);\r
1114 \r
1115         if (current.getLength() < Width)\r
1116         {\r
1117           current.insertCharAt(Width - 1, viewport.getGapCharacter());\r
1118         }\r
1119       }\r
1120       alignPanel.repaint();\r
1121 \r
1122     }\r
1123 \r
1124     final TreePanel tp;\r
1125     if (viewport.getSelectionGroup() != null &&\r
1126         viewport.getSelectionGroup().getSize() > 3)\r
1127     {\r
1128       tp = new TreePanel(viewport, viewport.getSelectionGroup().sequences, type,\r
1129                          pwType,\r
1130                          0, viewport.alignment.getWidth());\r
1131     }\r
1132     else\r
1133     {\r
1134       tp = new TreePanel(viewport, viewport.getAlignment().getSequences(),\r
1135                          type, pwType, 0, viewport.alignment.getWidth());\r
1136     }\r
1137 \r
1138     addTreeMenuItem(tp, title);\r
1139 \r
1140     jalview.bin.JalviewLite.addFrame(tp, title, 600, 500);\r
1141   }\r
1142 \r
1143   void addTreeMenuItem(final TreePanel treePanel, String title)\r
1144   {\r
1145     final MenuItem item = new MenuItem(title);\r
1146     sortByTreeMenu.add(item);\r
1147     item.addActionListener(new java.awt.event.ActionListener()\r
1148     {\r
1149       public void actionPerformed(ActionEvent e)\r
1150       {\r
1151         addHistoryItem(new HistoryItem("Sort", viewport.alignment,\r
1152                                        HistoryItem.SORT));\r
1153         AlignmentSorter.sortByTree(viewport.getAlignment(), treePanel.getTree());\r
1154         alignPanel.repaint();\r
1155       }\r
1156     });\r
1157 \r
1158     treePanel.addWindowListener(new WindowAdapter()\r
1159     {\r
1160       public void windowClosing(WindowEvent e)\r
1161       {\r
1162         sortByTreeMenu.remove(item);\r
1163       };\r
1164     });\r
1165   }\r
1166 \r
1167   protected void documentation_actionPerformed(ActionEvent e)\r
1168   {\r
1169     jalview.bin.JalviewLite.showURL("http://www.jalview.org/help.html");\r
1170   }\r
1171 \r
1172   protected void about_actionPerformed(ActionEvent e)\r
1173   {\r
1174 \r
1175     class AboutPanel extends Canvas\r
1176     {\r
1177       String version;\r
1178       public AboutPanel(String version)\r
1179       { this.version = version; }\r
1180 \r
1181       public void paint(Graphics g)\r
1182       {\r
1183         g.setColor(Color.white);\r
1184         g.fillRect(0, 0, getSize().width, getSize().height);\r
1185         g.setFont(new Font("Helvetica", Font.PLAIN, 12));\r
1186         FontMetrics fm = g.getFontMetrics();\r
1187         int fh = fm.getHeight();\r
1188         int y = 5, x = 7;\r
1189         g.setColor(Color.black);\r
1190         g.setFont(new Font("Helvetica", Font.BOLD, 14));\r
1191         g.drawString("Jalview - Release "+version, 200, y += fh);\r
1192         g.setFont(new Font("Helvetica", Font.PLAIN, 12));\r
1193         g.drawString("Authors:  Michele Clamp, James Cuff, Steve Searle, Andrew Waterhouse, Jim Procter & Geoff Barton.",\r
1194                      x, y += fh * 2);\r
1195         g.drawString("Current development managed by Andrew Waterhouse; Barton Group, University of Dundee.",\r
1196                      x, y += fh);\r
1197         g.drawString(\r
1198             "For any issues relating to Jalview, email help@jalview.org", x,\r
1199             y += fh);\r
1200         g.drawString("If  you use JalView, please cite:", x, y += fh + 8);\r
1201         g.drawString("\"Clamp, M., Cuff, J., Searle, S. M. and Barton, G. J. (2004), The Jalview Java Alignment Editor\"",\r
1202                      x, y += fh);\r
1203         g.drawString("Bioinformatics,  2004 12;426-7.", x, y += fh);\r
1204       }\r
1205     }\r
1206 \r
1207     String version = "test";\r
1208     java.net.URL url = getClass().getResource("/.build_properties");\r
1209     if (url != null)\r
1210     {\r
1211       try\r
1212       {\r
1213         BufferedReader reader = new BufferedReader(new InputStreamReader(\r
1214             url.openStream()));\r
1215         String line;\r
1216         while ( (line = reader.readLine()) != null)\r
1217         {\r
1218           if (line.indexOf("VERSION") > -1)\r
1219           {\r
1220             version = line.substring(line.indexOf("=") + 1);\r
1221           }\r
1222         }\r
1223       }\r
1224       catch (Exception ex)\r
1225       {\r
1226         ex.printStackTrace();\r
1227       }\r
1228     }\r
1229 \r
1230 \r
1231     Frame frame = new Frame();\r
1232     frame.add(new AboutPanel(version));\r
1233     jalview.bin.JalviewLite.addFrame(frame, "Jalview", 580, 200);\r
1234 \r
1235   }\r
1236 }\r