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