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