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