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