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