Implemented clustal alignment via jemboss.
[jalview.git] / src / jalview / gui / 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.gui;\r
13 \r
14 import jalview.jbgui.GAlignFrame;\r
15 import jalview.schemes.*;\r
16 import jalview.datamodel.*;\r
17 import jalview.analysis.*;\r
18 import jalview.io.*;\r
19 import jalview.ws.*;\r
20 import MCview.*;\r
21 import java.awt.*;\r
22 import java.awt.event.*;\r
23 import java.awt.print.*;\r
24 import javax.swing.*;\r
25 import javax.swing.event.*;\r
26 import java.util.*;\r
27 import jalview.datamodel.SequenceI;\r
28 \r
29 public class AlignFrame extends GAlignFrame\r
30 {\r
31   final AlignmentPanel alignPanel;\r
32   final AlignViewport viewport;\r
33   public AlignFrame(AlignmentI al)\r
34   {\r
35     super();\r
36     viewport = new AlignViewport(al,true,true,true,false);\r
37     alignPanel = new AlignmentPanel(this, viewport);\r
38     getContentPane().add(alignPanel, java.awt.BorderLayout.CENTER);\r
39     fontNameMenuItem.setText(viewport.getFont().getName());\r
40     fontSizeMenuItem.setText(viewport.getFont().getSize()+"");\r
41   }\r
42 \r
43   protected void saveAs_actionPerformed(ActionEvent e)\r
44   {\r
45     JFileChooser chooser = new JFileChooser(jalview.bin.Cache.LAST_DIRECTORY);\r
46     chooser.setDialogTitle("Save Alignment to file - "+e.getActionCommand() +" format.");\r
47     chooser.setToolTipText("Save");\r
48     int value = chooser.showSaveDialog(this);\r
49     if(value == JFileChooser.APPROVE_OPTION)\r
50     {\r
51       String choice =  chooser.getSelectedFile().getPath();\r
52       jalview.bin.Cache.LAST_DIRECTORY = choice;\r
53       String output = FormatAdapter.get(e.getActionCommand(), viewport.getAlignment().getSequences());\r
54       try{\r
55         java.io.PrintWriter out = new java.io.PrintWriter( new java.io.FileWriter( choice )  );\r
56         out.println(output);\r
57         out.close();\r
58       }\r
59       catch(Exception ex){}\r
60     }\r
61 \r
62   }\r
63 \r
64   protected void outputText_actionPerformed(ActionEvent e)\r
65   {\r
66      CutAndPasteTransfer cap = new CutAndPasteTransfer(false);\r
67      JInternalFrame frame = new JInternalFrame();\r
68      cap.formatForOutput();\r
69      frame.setContentPane(cap);\r
70      Desktop.addInternalFrame(frame, "Alignment output - "+e.getActionCommand(), 600, 500);\r
71      cap.setText( FormatAdapter.get(e.getActionCommand(), viewport.getAlignment().getSequences()));\r
72   }\r
73 \r
74   protected void htmlMenuItem_actionPerformed(ActionEvent e)\r
75   {\r
76     HTMLOutput htmlOutput = new HTMLOutput(viewport);\r
77     htmlOutput = null;\r
78   }\r
79 \r
80   public void printMenuItem_actionPerformed(ActionEvent e)\r
81   {\r
82     //Putting in a thread avoids Swing painting problems\r
83     PrintThread thread = new PrintThread();\r
84     thread.start();\r
85   }\r
86 \r
87   class PrintThread extends Thread\r
88   {\r
89     public void run()\r
90     {\r
91       PrinterJob printJob = PrinterJob.getPrinterJob();\r
92       PageFormat pf = printJob.pageDialog(printJob.defaultPage());\r
93       printJob.setPrintable(alignPanel, pf);\r
94       if (printJob.printDialog())\r
95       {\r
96         try\r
97         {\r
98           printJob.print();\r
99         }\r
100         catch (Exception PrintException)\r
101         {\r
102           PrintException.printStackTrace();\r
103         }\r
104       }\r
105     }\r
106 \r
107   }\r
108 \r
109 \r
110 \r
111 \r
112   public void closeMenuItem_actionPerformed(ActionEvent e)\r
113   {\r
114     try{\r
115       this.setClosed(true);\r
116     }catch(Exception ex){}\r
117   }\r
118 \r
119   ArrayList  historyList = new ArrayList();\r
120   ArrayList redoList = new ArrayList();\r
121 \r
122   void updateEditMenuBar()\r
123   {\r
124     if(historyList.size()>0)\r
125      {\r
126        undoMenuItem.setEnabled(true);\r
127        Object [] history = (Object[])historyList.get(0);\r
128        undoMenuItem.setText("Undo "+history[0]);\r
129      }\r
130     else\r
131     {\r
132       undoMenuItem.setEnabled(false);\r
133       undoMenuItem.setText("Undo");\r
134     }\r
135 \r
136     if(redoList.size()>0)\r
137      {\r
138        redoMenuItem.setEnabled(true);\r
139        Object [] history = (Object[])redoList.get(0);\r
140        redoMenuItem.setText("Redo "+history[0]);\r
141      }\r
142     else\r
143     {\r
144       redoMenuItem.setEnabled(false);\r
145       redoMenuItem.setText("Redo");\r
146     }\r
147   }\r
148 \r
149   public void addHistoryItem(String type)\r
150   {\r
151     // must make sure we add new sequence objects her, not refs to the existing sequences\r
152     redoList.clear();\r
153     SequenceI[] seq = new SequenceI[viewport.getAlignment().getHeight()];\r
154     for(int i=0; i<viewport.getAlignment().getHeight(); i++)\r
155     {\r
156       seq[i] = new Sequence( viewport.getAlignment().getSequenceAt(i).getName(),\r
157                              viewport.getAlignment().getSequenceAt(i).getSequence());\r
158     }\r
159 \r
160     historyList.add(0, new Object[]{type,  seq} );\r
161     updateEditMenuBar();\r
162   }\r
163 \r
164   protected void undoMenuItem_actionPerformed(ActionEvent e)\r
165   {\r
166     Object [] history = (Object[])historyList.remove(0);\r
167     // add the redo state before continuing!!\r
168     SequenceI[] seq = new SequenceI[viewport.getAlignment().getHeight()];\r
169     for (int i = 0; i < viewport.getAlignment().getHeight(); i++)\r
170     {\r
171       seq[i] = new Sequence(viewport.getAlignment().getSequenceAt(i).getName(),\r
172                             viewport.getAlignment().getSequenceAt(i).\r
173                             getSequence());\r
174     }\r
175     /////////\r
176 \r
177     redoList.add(0, new Object[] {history[0], seq});\r
178 \r
179       seq = (SequenceI[]) history[1];\r
180       viewport.setAlignment( new Alignment(seq) );\r
181       updateEditMenuBar();\r
182       alignPanel.RefreshPanels();\r
183   }\r
184 \r
185 \r
186   protected void redoMenuItem_actionPerformed(ActionEvent e)\r
187   {\r
188      Object [] history = (Object[])redoList.remove(0);\r
189      SequenceI[] seq = (SequenceI[]) history[1];\r
190      viewport.setAlignment( new Alignment(seq) );\r
191      updateEditMenuBar();\r
192      alignPanel.RefreshPanels();\r
193   }\r
194 \r
195 \r
196   public void groupsMenuItem_actionPerformed(ActionEvent e)\r
197   {\r
198     GroupEditor geditor = new GroupEditor(viewport, alignPanel);\r
199     JInternalFrame frame = new JInternalFrame();\r
200     frame.setContentPane(geditor);\r
201     Desktop.addInternalFrame(frame, "Group editor", 710, 410);\r
202     frame.setResizable(false);\r
203   }\r
204 \r
205 \r
206   public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)\r
207   {\r
208     Selection sel = viewport.getSelection();\r
209     for (int i=0; i<viewport.getAlignment().getSequences().size(); i++)\r
210       sel.addElement( viewport.getAlignment().getSequenceAt(i));\r
211     PaintRefresher.Refresh(null);\r
212   }\r
213 \r
214   public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)\r
215   {\r
216     viewport.getSelection().clear();\r
217     PaintRefresher.Refresh(null);\r
218   }\r
219 \r
220   public void invertSequenceMenuItem_actionPerformed(ActionEvent e)\r
221   {\r
222     Selection sel = viewport.getSelection();\r
223     for (int i=0; i<viewport.getAlignment().getSequences().size(); i++)\r
224     {\r
225       if (sel.contains(viewport.getAlignment().getSequenceAt(i)))\r
226         sel.removeElement(viewport.getAlignment().getSequenceAt(i));\r
227       else\r
228         sel.addElement(viewport.getAlignment().getSequenceAt(i));\r
229     }\r
230     PaintRefresher.Refresh(null);\r
231   }\r
232 \r
233 \r
234   public void deselectAllColumnsMenuItem_actionPerformed(ActionEvent e)\r
235   {\r
236     viewport.getColumnSelection().clear();\r
237     repaint();\r
238   }\r
239 \r
240   public void remove2LeftMenuItem_actionPerformed(ActionEvent e)\r
241   {\r
242     addHistoryItem("delete columns");\r
243     ColumnSelection colSel = viewport.getColumnSelection();\r
244     if (colSel.size() > 0)\r
245     {\r
246       int min = colSel.getMin();\r
247       viewport.getAlignment().trimLeft(min);\r
248       colSel.compensateForEdit(0,min);\r
249       alignPanel.RefreshPanels();\r
250     }\r
251   }\r
252 \r
253   public void remove2RightMenuItem_actionPerformed(ActionEvent e)\r
254   {\r
255     addHistoryItem("delete columns");\r
256     ColumnSelection colSel = viewport.getColumnSelection();\r
257     if (colSel.size() > 0)\r
258     {\r
259       int max = colSel.getMax();\r
260       if(max>1)\r
261         viewport.getAlignment().trimRight(max);\r
262 \r
263       alignPanel.RefreshPanels();\r
264     }\r
265 \r
266   }\r
267 \r
268   public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)\r
269   {\r
270     addHistoryItem("delete gapped columns");\r
271     viewport.getAlignment().removeGaps();\r
272     alignPanel.RefreshPanels();\r
273   }\r
274 \r
275   public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)\r
276   {\r
277     addHistoryItem("delete all gaps");\r
278     SequenceI current;\r
279     int jSize;\r
280     for (int i=0; i < viewport.getAlignment().getSequences().size();i++)\r
281     {\r
282       current = viewport.getAlignment().getSequenceAt(i);\r
283       jSize = current.getLength();\r
284       for (int j=0; j < jSize; j++)\r
285         if(jalview.util.Comparison.isGap(current.getCharAt(j)))\r
286         {\r
287           current.deleteCharAt(j);\r
288           j--;\r
289           jSize--;\r
290         }\r
291     }\r
292 \r
293     alignPanel.RefreshPanels();\r
294   }\r
295 \r
296   public void setGapCharMenuItem_actionPerformed(ActionEvent e)\r
297   {\r
298     char thisChar = '-';\r
299     char nextChar = '.';\r
300     if(viewport.getGapCharacter()=='-')\r
301     {\r
302       thisChar = '.';\r
303       nextChar = '-';\r
304     }\r
305     setGapCharMenuItem.setText("Set gap character to \""+nextChar+"\"");\r
306     viewport.setGapCharacter(thisChar);\r
307     alignPanel.RefreshPanels();\r
308   }\r
309 \r
310   public void findMenuItem_actionPerformed(ActionEvent e)\r
311   {\r
312     JOptionPane op = new JOptionPane();\r
313     JInternalFrame frame =  op.createInternalFrame(this, "Find");\r
314     Finder finder = new Finder(viewport, alignPanel, frame);\r
315     frame.setContentPane(finder);\r
316     frame.setSize(300,110);\r
317     frame.setVisible(true);\r
318   }\r
319 \r
320 \r
321 \r
322   public void fontNameMenuItem_actionPerformed(ActionEvent e)\r
323   {\r
324     String fonts[] = java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();\r
325 \r
326 \r
327     String selection = JOptionPane.showInternalInputDialog(this,\r
328                                 "Select font",\r
329                                 "Font selection",\r
330                                 JOptionPane.QUESTION_MESSAGE,\r
331                                 null,fonts\r
332                                 ,fontNameMenuItem.getText()).toString();\r
333     if(selection!=null)\r
334     {\r
335        fontNameMenuItem.setText(selection);\r
336        SetFont();\r
337      }\r
338 \r
339   }\r
340 \r
341   public void fontSizeMenuItem_actionPerformed(ActionEvent e)\r
342   {\r
343     String selection = JOptionPane.showInternalInputDialog(this,\r
344                                 "Select font size",\r
345                                 "Font size",\r
346                                 JOptionPane.QUESTION_MESSAGE,\r
347                                 null, new String[]{"1","2","4","6","8","10","12","14","16","18","20"}\r
348                                 ,fontSizeMenuItem.getText()).toString();\r
349     if(selection!=null)\r
350      {\r
351        fontSizeMenuItem.setText(selection);\r
352        SetFont();\r
353      }\r
354   }\r
355 \r
356   public void fontStyleMenuItem_actionPerformed(ActionEvent e)\r
357   {\r
358     String selection = JOptionPane.showInternalInputDialog(this,\r
359                                 "Select font style",\r
360                                 "Font style",\r
361                                 JOptionPane.QUESTION_MESSAGE,\r
362                                 null, new String[]{"plain", "bold", "italic"}\r
363                                 ,fontStyleMenuItem.getText()).toString();\r
364     if(selection!=null)\r
365     {\r
366       fontStyleMenuItem.setText(selection);\r
367       SetFont();\r
368     }\r
369 \r
370   }\r
371 \r
372   protected void colourTextMenuItem_actionPerformed(ActionEvent e)\r
373   {\r
374       viewport.setColourText( colourTextMenuItem.isSelected() );\r
375       alignPanel.RefreshPanels();\r
376   }\r
377 \r
378   void SetFont()\r
379   {\r
380       int style = java.awt.Font.PLAIN;\r
381       if(fontStyleMenuItem.getText().equals("bold"))\r
382         style = java.awt.Font.BOLD;\r
383       else if(fontStyleMenuItem.getText().equals("italic"))\r
384         style = java.awt.Font.ITALIC;\r
385 \r
386       viewport.setFont(new java.awt.Font(fontNameMenuItem.getText(),\r
387                                            style,\r
388                                            Integer.parseInt(fontSizeMenuItem.getText())));\r
389       alignPanel.RefreshPanels();\r
390 \r
391   }\r
392 \r
393   protected void wrapMenuItem_actionPerformed(ActionEvent e)\r
394   {\r
395     viewport.setWrapAlignment( wrapMenuItem.isSelected() );\r
396     alignPanel.RefreshPanels();\r
397   }\r
398 \r
399 \r
400   public void viewBoxesMenuItem_actionPerformed(ActionEvent e)\r
401   {\r
402     viewport.setShowBoxes( viewBoxesMenuItem.isSelected() );\r
403     alignPanel.RefreshPanels();\r
404   }\r
405 \r
406   public void viewTextMenuItem_actionPerformed(ActionEvent e)\r
407   {\r
408     viewport.setShowText( viewTextMenuItem.isSelected() );\r
409     alignPanel.RefreshPanels();\r
410   }\r
411 \r
412 \r
413   protected void renderGapsMenuItem_actionPerformed(ActionEvent e)\r
414   {\r
415     viewport.setRenderGaps(renderGapsMenuItem.isSelected());\r
416     alignPanel.RefreshPanels();\r
417   }\r
418 \r
419 \r
420   public void consensusGraphMenuItem_actionPerformed(ActionEvent e)\r
421   {\r
422     alignPanel.setGraphPanelVisible( consensusGraphMenuItem.isSelected() );\r
423   }\r
424 \r
425   public void overviewMenuItem_actionPerformed(ActionEvent e)\r
426   {\r
427 \r
428     JInternalFrame frame = new JInternalFrame();\r
429     OverviewPanel overview = alignPanel.getOverviewPanel();\r
430    try{\r
431      overview = new OverviewPanel(alignPanel, viewport);\r
432      frame.setContentPane(overview);\r
433     Desktop.addInternalFrame(frame, "Overview " + this.getTitle(),\r
434                              frame.getWidth(), frame.getHeight());\r
435     frame.pack();\r
436     frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()\r
437     { public void internalFrameClosed(javax.swing.event.InternalFrameEvent evt)\r
438       {\r
439             alignPanel.setOverviewPanel(null);\r
440       };\r
441     });\r
442     alignPanel.setOverviewPanel( overview );\r
443 \r
444   }catch(java.lang.OutOfMemoryError ex)\r
445    {\r
446      JOptionPane.showInternalMessageDialog(this, "Sequence alignment too large to\nproduce overview image!!"\r
447                                    +"\nTry reducing the font size.",\r
448                                    "Out of memory", JOptionPane.WARNING_MESSAGE);\r
449    }\r
450 \r
451 \r
452   }\r
453 \r
454   protected void noColourmenuItem_actionPerformed(ActionEvent e)\r
455   {\r
456     viewport.setGlobalColourScheme( null );\r
457     changeColour();\r
458   }\r
459 \r
460 \r
461   public void Colour_actionPerformed(ActionEvent e)\r
462   {\r
463     viewport.setGlobalColourScheme(new ClustalxColourScheme( ));\r
464     conservationMenuItem.setSelected(false);\r
465     abovePIDThreshold.setSelected(false);\r
466     changeColour();\r
467   }\r
468 \r
469   public void zappoColour_actionPerformed(ActionEvent e)\r
470   {\r
471     viewport.setGlobalColourScheme(new ZappoColourScheme() );\r
472     changeColour();\r
473   }\r
474 \r
475   public void taylorColour_actionPerformed(ActionEvent e)\r
476   {\r
477     viewport.setGlobalColourScheme(new TaylorColourScheme() );\r
478     changeColour();\r
479   }\r
480 \r
481 \r
482   public void hydrophobicityColour_actionPerformed(ActionEvent e)\r
483   {\r
484     viewport.setGlobalColourScheme( new HydrophobicColourScheme() );\r
485     changeColour();\r
486   }\r
487 \r
488   public void helixColour_actionPerformed(ActionEvent e)\r
489   {\r
490     viewport.setGlobalColourScheme( new HelixColourScheme()  );\r
491     changeColour();\r
492   }\r
493 \r
494 \r
495   public void strandColour_actionPerformed(ActionEvent e)\r
496   {\r
497     viewport.setGlobalColourScheme(new StrandColourScheme() );\r
498     changeColour();\r
499   }\r
500 \r
501 \r
502   public void turnColour_actionPerformed(ActionEvent e)\r
503   {\r
504     viewport.setGlobalColourScheme(new TurnColourScheme() );\r
505     changeColour();\r
506   }\r
507 \r
508 \r
509   public void buriedColour_actionPerformed(ActionEvent e)\r
510   {\r
511     viewport.setGlobalColourScheme( new BuriedColourScheme() );\r
512     changeColour();\r
513   }\r
514 \r
515   void changeColour()\r
516   {\r
517     if(abovePIDThreshold.isSelected())\r
518       abovePIDThreshold_actionPerformed(null);\r
519     else if(conservationMenuItem.isSelected())\r
520       conservationMenuItem_actionPerformed(null);\r
521 \r
522      alignPanel.seqPanel.seqCanvas.paintFlag = true;\r
523      alignPanel.repaint();\r
524   }\r
525 \r
526   void addConservationOrPIDColour()\r
527   {\r
528     int x=0, y=0, threshold = 70;\r
529 \r
530     if(sliderFrame!=null)\r
531        try\r
532        {\r
533          x = sliderFrame.getX();\r
534          y = sliderFrame.getY();\r
535          SliderPanel sp = (SliderPanel) sliderFrame.getContentPane();\r
536          threshold = sp.getValue();\r
537          sliderFrame.setClosed(true);\r
538        }\r
539        catch (Exception ex)\r
540        {    ex.printStackTrace();   }\r
541 \r
542      ColourSchemeI oldCs = viewport.getGlobalColourScheme();\r
543 \r
544      ConservationColourScheme ccs = null;\r
545      if (oldCs instanceof ConservationColourScheme)\r
546        ccs = (ConservationColourScheme) oldCs;\r
547 \r
548      if(conservationMenuItem.isSelected())\r
549      {\r
550        Alignment al = (Alignment)viewport.alignment;\r
551        Conservation c = new Conservation("All",\r
552                             ResidueProperties.propHash, 3, al.getSequences(), 0,\r
553                             al.getWidth() );\r
554 \r
555        c.calculate();\r
556        c.verdict(false, 100);\r
557 \r
558        if(ccs!=null)\r
559          ccs = new ConservationColourScheme(c, ccs.cs);\r
560        else\r
561          ccs = new ConservationColourScheme(c, oldCs);\r
562 \r
563         viewport.setGlobalColourScheme( ccs );\r
564 \r
565      }\r
566      else if(oldCs instanceof ConservationColourScheme)\r
567      {\r
568        oldCs = ccs.cs;\r
569        viewport.setGlobalColourScheme( oldCs );\r
570      }\r
571 \r
572 \r
573      if( conservationMenuItem.isSelected() || abovePIDThreshold.isSelected() )\r
574      {\r
575        sliderFrame = new JInternalFrame();\r
576        sliderFrame.setMaximizable(false);\r
577        sliderFrame.setResizable(false);\r
578 \r
579        SliderPanel sp = null;\r
580        if (conservationMenuItem.isSelected())\r
581        {\r
582         if(threshold > 50)\r
583           threshold = 30;\r
584         sp = new SliderPanel(alignPanel, threshold, true,ccs);\r
585         Desktop.addInternalFrame(sliderFrame, "Conservation Colour Increment  (Global colour)", 400, 90);\r
586         threshold = 0;\r
587        }\r
588        else if (abovePIDThreshold.isSelected())\r
589        {\r
590          sp = new SliderPanel(alignPanel, threshold, false, oldCs);\r
591          sp.cs = oldCs;\r
592          Desktop.addInternalFrame(sliderFrame, "Percentage Identity Threshold (Global colour)", 400, 90);\r
593        }\r
594 \r
595        sliderFrame.setContentPane(sp);\r
596        if(x!=0 && y!=0)\r
597                sliderFrame.setLocation(x,y);\r
598 \r
599      }\r
600      else\r
601        threshold = 0;\r
602 \r
603 \r
604      if (oldCs instanceof ResidueColourScheme)\r
605      {\r
606        ResidueColourScheme rcs = (ResidueColourScheme) oldCs;\r
607        rcs.setThreshold(threshold);\r
608      }\r
609      else if (oldCs instanceof ScoreColourScheme)\r
610      {\r
611        ScoreColourScheme scs = (ScoreColourScheme) oldCs;\r
612        scs.setThreshold(threshold);\r
613      }\r
614 \r
615      alignPanel.seqPanel.seqCanvas.paintFlag = true;\r
616      alignPanel.repaint();\r
617 \r
618   }\r
619 \r
620   protected  void conservationMenuItem_actionPerformed(ActionEvent e)\r
621   {\r
622    if(abovePIDThreshold.isSelected())\r
623     abovePIDThreshold.setSelected(false);\r
624 \r
625    viewport.setConservationSelected(conservationMenuItem.isSelected());\r
626 \r
627    addConservationOrPIDColour();\r
628   }\r
629 \r
630   JInternalFrame sliderFrame;\r
631   public void abovePIDThreshold_actionPerformed(ActionEvent e)\r
632   {\r
633       if(conservationMenuItem.isSelected())\r
634         conservationMenuItem.setSelected(false);\r
635 \r
636       addConservationOrPIDColour();\r
637   }\r
638 \r
639 \r
640 \r
641   public void userDefinedColour_actionPerformed(ActionEvent e)\r
642   {\r
643     JInternalFrame frame = new JInternalFrame();\r
644     UserDefinedColours chooser = new UserDefinedColours( frame, alignPanel, null);\r
645     frame.setContentPane(chooser);\r
646     Desktop.addInternalFrame(frame,"User defined colours", 450,540 );\r
647     frame.setResizable(false);\r
648     frame.setIconifiable(false);\r
649     frame.setMaximizable(false);\r
650   }\r
651 \r
652   public void PIDColour_actionPerformed(ActionEvent e)\r
653   {\r
654     viewport.setGlobalColourScheme( new PIDColourScheme() );\r
655     alignPanel.setColourScheme( );\r
656   }\r
657 \r
658 \r
659   public void BLOSUM62Colour_actionPerformed(ActionEvent e)\r
660   {\r
661     viewport.setGlobalColourScheme( new Blosum62ColourScheme(viewport)  );\r
662     alignPanel.setColourScheme();\r
663   }\r
664 \r
665 \r
666 \r
667   protected void schemeKeyMenuItem_actionPerformed(ActionEvent e)\r
668   {\r
669     ColourKey colourKey = new ColourKey( viewport.getGlobalColourScheme() );\r
670     Desktop.addInternalFrame(colourKey, "Colour scheme key", 400, 320);\r
671   }\r
672 \r
673 \r
674   public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)\r
675   {\r
676     addHistoryItem("sort");\r
677     AlignmentSorter.sortByPID(viewport.getAlignment(), viewport.getAlignment().getSequenceAt(0));\r
678     alignPanel.RefreshPanels();\r
679   }\r
680 \r
681   public void sortIDMenuItem_actionPerformed(ActionEvent e)\r
682   {\r
683     addHistoryItem("sort");\r
684     AlignmentSorter.sortByID( viewport.getAlignment() );\r
685     alignPanel.RefreshPanels();\r
686   }\r
687 \r
688   public void sortGroupMenuItem_actionPerformed(ActionEvent e)\r
689   {\r
690     addHistoryItem("sort");\r
691     AlignmentSorter.sortByGroup(viewport.getAlignment());\r
692     AlignmentSorter.sortGroups(viewport.getAlignment());\r
693     alignPanel.RefreshPanels();\r
694   }\r
695 \r
696   public void sortTreeOrderMenuItem_actionPerformed(ActionEvent e)\r
697   {\r
698     addHistoryItem("sort");\r
699     if(viewport.getCurrentTree()==null)\r
700       return;\r
701 \r
702     AlignmentSorter.sortByTree(viewport.getAlignment(), viewport.getCurrentTree());\r
703     alignPanel.RefreshPanels();\r
704   }\r
705 \r
706   public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)\r
707   {\r
708     RedundancyPanel sp = new RedundancyPanel(alignPanel);\r
709     JInternalFrame frame = new JInternalFrame();\r
710     frame.setContentPane(sp);\r
711     Desktop.addInternalFrame(frame, "Redundancy threshold selection", 400, 100);\r
712     frame.setMaximizable(false);\r
713     frame.setResizable(false);\r
714 \r
715   }\r
716 \r
717   public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)\r
718   {\r
719     if(viewport.getSelection().size()<2)\r
720       JOptionPane.showInternalMessageDialog(this, "You must select at least 2 sequences.", "Invalid Selection", JOptionPane.WARNING_MESSAGE);\r
721     else\r
722     {\r
723       JInternalFrame frame = new JInternalFrame();\r
724       frame.setContentPane(new PairwiseAlignPanel(viewport));\r
725       Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);\r
726     }\r
727   }\r
728 \r
729   public void PCAMenuItem_actionPerformed(ActionEvent e)\r
730   {\r
731     if( (viewport.getSelection().size()<4 && viewport.getSelection().size()>0)\r
732        || viewport.getAlignment().getHeight()<4)\r
733     {\r
734       JOptionPane.showInternalMessageDialog(this, "Principal component analysis must take\n"\r
735                                     +"at least 4 input sequences.",\r
736                                     "Sequence selection insufficient",\r
737                                     JOptionPane.WARNING_MESSAGE);\r
738       return;\r
739     }\r
740 \r
741     try{\r
742       PCAPanel pcaPanel = new PCAPanel(viewport, null);\r
743       JInternalFrame frame = new JInternalFrame();\r
744       frame.setContentPane(pcaPanel);\r
745       Desktop.addInternalFrame(frame, "Principal component analysis", 400, 400);\r
746    }catch(java.lang.OutOfMemoryError ex)\r
747    {\r
748      JOptionPane.showInternalMessageDialog(this, "Too many sequences selected\nfor Principal Component Analysis!!",\r
749                                    "Out of memory", JOptionPane.WARNING_MESSAGE);\r
750    }\r
751 \r
752 \r
753   }\r
754 \r
755   public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)\r
756   {\r
757     NewTreePanel("AV", "PID", "Average distance tree using PID");\r
758   }\r
759 \r
760   public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)\r
761   {\r
762     NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");\r
763   }\r
764 \r
765 \r
766   protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)\r
767   {\r
768     NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");\r
769   }\r
770 \r
771   protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)\r
772   {\r
773     NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62PID");\r
774   }\r
775 \r
776   void NewTreePanel(String type, String pwType, String title)\r
777   {\r
778     JInternalFrame frame = new javax.swing.JInternalFrame();\r
779     TreePanel tp=null;\r
780    if (viewport.getSelection() != null && viewport.getSelection().size() > 3)\r
781    {\r
782      tp = new TreePanel(viewport, viewport.getSelection().asVector(),type, pwType,\r
783                          viewport.getStartRes(), viewport.getEndRes());\r
784    }\r
785    else\r
786    {\r
787      tp = new TreePanel(viewport, viewport.getAlignment().getSequences(),\r
788                          type, pwType, viewport.getStartRes(),\r
789                          viewport.getEndRes());\r
790    }\r
791 \r
792    frame.setContentPane(tp);\r
793    Desktop.addInternalFrame(frame, title, 600, 500);\r
794   }\r
795 \r
796 \r
797 \r
798   public void clustalAlignMenuItem_actionPerformed(ActionEvent e)\r
799   {\r
800     // JBPNote\r
801     // Should check to see if the server settings are valid\r
802     // Need visual-delay indication here.\r
803     Jemboss jemboss = new Jemboss();\r
804 \r
805     Vector sv = viewport.getAlignment().getSequences();\r
806     SequenceI[] seqs = new SequenceI[sv.size()];\r
807 \r
808     int i=0;\r
809     do\r
810     {\r
811       seqs[i] = (SequenceI) sv.elementAt(i);\r
812     } while (++i<sv.size());\r
813 \r
814     SequenceI[] alignment = jemboss.clustalW(seqs); // gaps removed within method\r
815 \r
816     if (alignment != null)\r
817     {\r
818       AlignFrame af = new AlignFrame(new Alignment(alignment));\r
819       Desktop.addInternalFrame(af, getTitle().concat(" - ClustalW Alignment"), \r
820                                700, 500); // JBPNote - is there a new window geom. property ?\r
821     }\r
822   }\r
823 \r
824   public void pdbTest_actionPerformed(ActionEvent e)\r
825   {\r
826    String reply = \r
827        JOptionPane.showInternalInputDialog(this, "Enter pdb code", \r
828                                            "PDB test viewer", JOptionPane.QUESTION_MESSAGE);\r
829 \r
830    String url = "http://www.ebi.ac.uk/cgi-bin/pdbfetch?id=1a4u";\r
831    if (reply.length()>1)\r
832      url = "http://www.ebi.ac.uk/cgi-bin/pdbfetch?id="+reply;\r
833 \r
834    try\r
835    {\r
836      PDBfile pdb = new PDBfile(url,\r
837                                "URL");\r
838     Sequence seq = (Sequence)viewport.getAlignment().getSequenceAt(0);\r
839     seq.setPDBfile(pdb);\r
840      ( (PDBChain) pdb.chains.elementAt(seq.maxchain)).isVisible = true;\r
841      ( (PDBChain) pdb.chains.elementAt(seq.maxchain)).sequence = seq;\r
842   // ( (PDBChain) pdb.chains.elementAt(seq.maxchain)).colourBySequence();\r
843 \r
844      rotCanvas rc = new rotCanvas(pdb);\r
845      JInternalFrame frame = new JInternalFrame();\r
846      frame.setContentPane(rc);\r
847      Desktop.addInternalFrame(frame, url, 400,400);\r
848    }\r
849    catch (Exception ex)\r
850    {\r
851      ex.printStackTrace();\r
852    }\r
853 \r
854   }\r
855 \r
856 \r
857   public void doKeyPressed(KeyEvent evt)\r
858   {\r
859 \r
860     System.out.println(evt.getKeyChar());\r
861     if(evt.isControlDown() && evt.getKeyChar()=='f')\r
862       findMenuItem_actionPerformed(null);\r
863 \r
864   }\r
865 \r
866 \r
867 }\r