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