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