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