Conservation colour in place
[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 java.awt.event.*;\r
20 import java.awt.*;\r
21 import javax.swing.*;\r
22 import java.util.*;\r
23 \r
24 public class AlignFrame extends GAlignFrame\r
25 {\r
26   final AlignmentPanel alignPanel;\r
27   final AlignViewport viewport;\r
28   public AlignFrame(AlignmentI al)\r
29   {\r
30     super();\r
31     viewport = new AlignViewport(al,true,true,true,false);\r
32     alignPanel = new AlignmentPanel(this, viewport);\r
33     getContentPane().add(alignPanel, java.awt.BorderLayout.CENTER);\r
34     fontNameMenuItem.setText(viewport.getFont().getName());\r
35     fontSizeMenuItem.setText(viewport.getFont().getSize()+"");\r
36   }\r
37 \r
38   protected void saveAs_actionPerformed(ActionEvent e)\r
39   {\r
40     JFileChooser chooser = new JFileChooser(jalview.bin.Cache.LAST_DIRECTORY);\r
41     chooser.setDialogTitle("Save Alignment to file - "+e.getActionCommand() +" format.");\r
42     chooser.setToolTipText("Save");\r
43     int value = chooser.showSaveDialog(this);\r
44     if(value == JFileChooser.APPROVE_OPTION)\r
45     {\r
46       String choice =  chooser.getSelectedFile().getPath();\r
47       jalview.bin.Cache.LAST_DIRECTORY = choice;\r
48       String output = FormatAdapter.get(e.getActionCommand(), viewport.getAlignment().getSequences());\r
49       try{\r
50         java.io.PrintWriter out = new java.io.PrintWriter( new java.io.FileWriter( choice )  );\r
51         out.println(output);\r
52         out.close();\r
53       }\r
54       catch(Exception ex){}\r
55     }\r
56 \r
57   }\r
58 \r
59   protected void outputText_actionPerformed(ActionEvent e)\r
60   {\r
61      CutAndPasteTransfer cap = new CutAndPasteTransfer(false);\r
62      JInternalFrame frame = new JInternalFrame();\r
63      cap.formatForOutput();\r
64      frame.setContentPane(cap);\r
65      Desktop.addInternalFrame(frame, "Alignment output - "+e.getActionCommand(), 600, 500);\r
66      cap.setText( FormatAdapter.get(e.getActionCommand(), viewport.getAlignment().getSequences()));\r
67   }\r
68 \r
69   protected void htmlMenuItem_actionPerformed(ActionEvent e)\r
70   {\r
71     HTMLOutput htmlOutput = new HTMLOutput(viewport.getAlignment(), alignPanel.seqPanel.getColourScheme());\r
72     htmlOutput = null;\r
73   }\r
74 \r
75   public void saveAsPostscriptMenuItem_actionPerformed(ActionEvent e)\r
76   {\r
77 \r
78   }\r
79 \r
80   public void closeMenuItem_actionPerformed(ActionEvent e)\r
81   {\r
82     try{\r
83       this.setClosed(true);\r
84     }catch(Exception ex){}\r
85   }\r
86 \r
87   ArrayList  historyList = new ArrayList();\r
88   ArrayList redoList = new ArrayList();\r
89 \r
90   void updateEditMenuBar()\r
91   {\r
92     if(historyList.size()>0)\r
93      {\r
94        undoMenuItem.setEnabled(true);\r
95        Object [] history = (Object[])historyList.get(0);\r
96        undoMenuItem.setText("Undo "+history[0]);\r
97      }\r
98     else\r
99     {\r
100       undoMenuItem.setEnabled(false);\r
101       undoMenuItem.setText("Undo");\r
102     }\r
103 \r
104     if(redoList.size()>0)\r
105      {\r
106        redoMenuItem.setEnabled(true);\r
107        Object [] history = (Object[])redoList.get(0);\r
108        redoMenuItem.setText("Redo "+history[0]);\r
109      }\r
110     else\r
111     {\r
112       redoMenuItem.setEnabled(false);\r
113       redoMenuItem.setText("Redo");\r
114     }\r
115   }\r
116 \r
117   public void addHistoryItem(String type)\r
118   {\r
119     // must make sure we add new sequence objects her, not refs to the existing sequences\r
120     redoList.clear();\r
121     SequenceI[] seq = new SequenceI[viewport.getAlignment().getHeight()];\r
122     for(int i=0; i<viewport.getAlignment().getHeight(); i++)\r
123     {\r
124       seq[i] = new Sequence( viewport.getAlignment().getSequenceAt(i).getName(),\r
125                              viewport.getAlignment().getSequenceAt(i).getSequence());\r
126     }\r
127 \r
128     historyList.add(0, new Object[]{type,  seq} );\r
129     updateEditMenuBar();\r
130   }\r
131 \r
132   protected void undoMenuItem_actionPerformed(ActionEvent e)\r
133   {\r
134     Object [] history = (Object[])historyList.remove(0);\r
135     // add the redo state before continuing!!\r
136     SequenceI[] seq = new SequenceI[viewport.getAlignment().getHeight()];\r
137     for (int i = 0; i < viewport.getAlignment().getHeight(); i++)\r
138     {\r
139       seq[i] = new Sequence(viewport.getAlignment().getSequenceAt(i).getName(),\r
140                             viewport.getAlignment().getSequenceAt(i).\r
141                             getSequence());\r
142     }\r
143     /////////\r
144 \r
145     redoList.add(0, new Object[] {history[0], seq});\r
146 \r
147       seq = (SequenceI[]) history[1];\r
148       viewport.setAlignment( new Alignment(seq) );\r
149       updateEditMenuBar();\r
150       alignPanel.RefreshPanels();\r
151   }\r
152 \r
153 \r
154   protected void redoMenuItem_actionPerformed(ActionEvent e)\r
155   {\r
156      Object [] history = (Object[])redoList.remove(0);\r
157      SequenceI[] seq = (SequenceI[]) history[1];\r
158      viewport.setAlignment( new Alignment(seq) );\r
159      updateEditMenuBar();\r
160      alignPanel.RefreshPanels();\r
161   }\r
162 \r
163 \r
164 \r
165   public void groupsMenuItem_actionPerformed(ActionEvent e)\r
166   {\r
167     GroupEditor geditor = new GroupEditor(viewport, alignPanel);\r
168     JInternalFrame frame = new JInternalFrame();\r
169     frame.setContentPane(geditor);\r
170     Desktop.addInternalFrame(frame, "Group editor", 710, 410);\r
171     frame.setResizable(false);\r
172   }\r
173 \r
174   public void groupEditingMenuItem_actionPerformed(ActionEvent e)\r
175   {\r
176     viewport.setGroupEdit( groupEditingMenuItem.isSelected() );\r
177   }\r
178 \r
179   public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)\r
180   {\r
181     Selection sel = viewport.getSelection();\r
182     for (int i=0; i<viewport.getAlignment().getSequences().size(); i++)\r
183       sel.addElement( viewport.getAlignment().getSequenceAt(i));\r
184     PaintRefresher.Refresh(null);\r
185   }\r
186 \r
187   public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)\r
188   {\r
189     viewport.getSelection().clear();\r
190     PaintRefresher.Refresh(null);\r
191   }\r
192 \r
193   public void invertSequenceMenuItem_actionPerformed(ActionEvent e)\r
194   {\r
195     Selection sel = viewport.getSelection();\r
196     for (int i=0; i<viewport.getAlignment().getSequences().size(); i++)\r
197     {\r
198       if (sel.contains(viewport.getAlignment().getSequenceAt(i)))\r
199         sel.removeElement(viewport.getAlignment().getSequenceAt(i));\r
200       else\r
201         sel.addElement(viewport.getAlignment().getSequenceAt(i));\r
202     }\r
203     PaintRefresher.Refresh(null);\r
204   }\r
205 \r
206   public void deleteSelectedMenuItem_actionPerformed(ActionEvent e)\r
207   {\r
208     addHistoryItem("delete selection");\r
209 \r
210     for (int i=0;i < viewport.getSelection().size(); i++)\r
211             viewport.getAlignment().deleteSequence(viewport.getSelection().sequenceAt(i));\r
212 \r
213     viewport.getSelection().clear();\r
214     viewport.resetSeqLimits(alignPanel.seqPanel.seqCanvas.getHeight());\r
215     alignPanel.RefreshPanels();\r
216   }\r
217 \r
218   public void moveSelectedMenuItem_actionPerformed(ActionEvent e)\r
219   {\r
220     copySelectedMenuItem_actionPerformed(null);\r
221     deleteSelectedMenuItem_actionPerformed(null);\r
222     alignPanel.repaint();\r
223   }\r
224 \r
225   public void copySelectedMenuItem_actionPerformed(ActionEvent e)\r
226   {\r
227     if(viewport.getSelection().size()==0)\r
228       return;\r
229 \r
230    SequenceI[] s = new Sequence[viewport.getSelection().size()];\r
231    for (int i=0; i < viewport.getSelection().size(); i++) {\r
232      s[i] = new Sequence(viewport.getSelection().sequenceAt(i));\r
233     }\r
234     AlignFrame af = new AlignFrame(new Alignment(s));\r
235     int newHeight = s.length * af.viewport.getCharHeight() + 200;\r
236     if(newHeight>500)\r
237       newHeight=500;\r
238     Desktop.addInternalFrame(af, "Copied sequences", 700,newHeight);\r
239   }\r
240 \r
241   public void deselectAllColumnsMenuItem_actionPerformed(ActionEvent e)\r
242   {\r
243     viewport.getColumnSelection().clear();\r
244     repaint();\r
245   }\r
246 \r
247   public void remove2LeftMenuItem_actionPerformed(ActionEvent e)\r
248   {\r
249     addHistoryItem("delete columns");\r
250     ColumnSelection colSel = viewport.getColumnSelection();\r
251     if (colSel.size() > 0)\r
252     {\r
253       int min = colSel.getMin();\r
254       viewport.getAlignment().trimLeft(min);\r
255       colSel.compensateForEdit(0,min);\r
256       alignPanel.RefreshPanels();\r
257     }\r
258   }\r
259 \r
260   public void remove2RightMenuItem_actionPerformed(ActionEvent e)\r
261   {\r
262     addHistoryItem("delete columns");\r
263     ColumnSelection colSel = viewport.getColumnSelection();\r
264     if (colSel.size() > 0)\r
265     {\r
266       int max = colSel.getMax();\r
267       if(max>1)\r
268         viewport.getAlignment().trimRight(max);\r
269 \r
270       alignPanel.RefreshPanels();\r
271     }\r
272 \r
273   }\r
274 \r
275   public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)\r
276   {\r
277     addHistoryItem("delete gapped columns");\r
278     viewport.getAlignment().removeGaps();\r
279     alignPanel.RefreshPanels();\r
280   }\r
281 \r
282   public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)\r
283   {\r
284     addHistoryItem("delete all gaps");\r
285     SequenceI current;\r
286     int jSize;\r
287     for (int i=0; i < viewport.getAlignment().getSequences().size();i++)\r
288     {\r
289       current = viewport.getAlignment().getSequenceAt(i);\r
290       jSize = current.getLength();\r
291       for (int j=0; j < jSize; j++)\r
292         if (current.getCharAt(j)=='-' || current.getCharAt(j)=='.' || current.getCharAt(j)==' ')\r
293         {\r
294           current.deleteCharAt(j);\r
295           j--;\r
296           jSize--;\r
297         }\r
298     }\r
299 \r
300     alignPanel.RefreshPanels();\r
301   }\r
302 \r
303   public void setGapCharMenuItem_actionPerformed(ActionEvent e)\r
304   {\r
305     String thisChar = "-";\r
306     String nextChar = ".";\r
307     if(viewport.getGapCharacter().equals("-"))\r
308     {\r
309       thisChar = ".";\r
310       nextChar = "-";\r
311     }\r
312     setGapCharMenuItem.setText("Set gap character to \""+nextChar+"\"");\r
313     viewport.setGapCharacter(thisChar);\r
314   }\r
315 \r
316 \r
317   public void fontNameMenuItem_actionPerformed(ActionEvent e)\r
318   {\r
319     String fonts[] = java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();\r
320 \r
321 \r
322     String selection = JOptionPane.showInputDialog(this,\r
323                                 "Select font",\r
324                                 "Font selection",\r
325                                 JOptionPane.QUESTION_MESSAGE,\r
326                                 null,fonts\r
327                                 ,fontNameMenuItem.getText()).toString();\r
328     if(selection!=null)\r
329     {\r
330        fontNameMenuItem.setText(selection);\r
331        SetFont();\r
332      }\r
333 \r
334   }\r
335 \r
336   public void fontSizeMenuItem_actionPerformed(ActionEvent e)\r
337   {\r
338     String selection = JOptionPane.showInputDialog(this,\r
339                                 "Select font size",\r
340                                 "Font size",\r
341                                 JOptionPane.QUESTION_MESSAGE,\r
342                                 null, new String[]{"1","2","4","6","8","10","12","14","16","18","20"}\r
343                                 ,fontSizeMenuItem.getText()).toString();\r
344     if(selection!=null)\r
345      {\r
346        fontSizeMenuItem.setText(selection);\r
347        SetFont();\r
348      }\r
349   }\r
350 \r
351   public void fontStyleMenuItem_actionPerformed(ActionEvent e)\r
352   {\r
353     String selection = JOptionPane.showInputDialog(this,\r
354                                 "Select font style",\r
355                                 "Font style",\r
356                                 JOptionPane.QUESTION_MESSAGE,\r
357                                 null, new String[]{"plain", "bold", "italic"}\r
358                                 ,fontStyleMenuItem.getText()).toString();\r
359     if(selection!=null)\r
360     {\r
361       fontStyleMenuItem.setText(selection);\r
362       SetFont();\r
363     }\r
364 \r
365   }\r
366 \r
367   protected void colourTextMenuItem_actionPerformed(ActionEvent e)\r
368   {\r
369     viewport.setColourText( colourTextMenuItem.isSelected() );\r
370     alignPanel.RefreshPanels();\r
371   }\r
372 \r
373   void SetFont()\r
374   {\r
375       int style = java.awt.Font.PLAIN;\r
376       if(fontStyleMenuItem.getText().equals("bold"))\r
377         style = java.awt.Font.BOLD;\r
378       else if(fontStyleMenuItem.getText().equals("italic"))\r
379         style = java.awt.Font.ITALIC;\r
380 \r
381       viewport.setFont(new java.awt.Font(fontNameMenuItem.getText(),\r
382                                            style,\r
383                                            Integer.parseInt(fontSizeMenuItem.getText())));\r
384       alignPanel.RefreshPanels();\r
385 \r
386   }\r
387 \r
388   protected void wrapMenuItem_actionPerformed(ActionEvent e)\r
389   {\r
390     viewport.setWrapAlignment( wrapMenuItem.isSelected() );\r
391     alignPanel.setWrapAlignment( wrapMenuItem.isSelected() );\r
392   }\r
393 \r
394 \r
395   public void viewBoxesMenuItem_actionPerformed(ActionEvent e)\r
396   {\r
397     viewport.setShowBoxes( viewBoxesMenuItem.isSelected() );\r
398     alignPanel.RefreshPanels();\r
399   }\r
400 \r
401   public void viewTextMenuItem_actionPerformed(ActionEvent e)\r
402   {\r
403     viewport.setShowText( viewTextMenuItem.isSelected() );\r
404     alignPanel.RefreshPanels();\r
405   }\r
406 \r
407 \r
408   public void consensusGraphMenuItem_actionPerformed(ActionEvent e)\r
409   {\r
410     alignPanel.setGraphPanelVisible( consensusGraphMenuItem.isSelected() );\r
411   }\r
412 \r
413   public void overviewMenuItem_actionPerformed(ActionEvent e)\r
414   {\r
415 \r
416     JInternalFrame frame = new JInternalFrame();\r
417     OverviewPanel overview = alignPanel.getOverviewPanel();\r
418    try{\r
419      overview = new OverviewPanel(alignPanel, viewport);\r
420      frame.setContentPane(overview);\r
421     Desktop.addInternalFrame(frame, "Overview " + this.getTitle(),\r
422                              frame.getWidth(), frame.getHeight());\r
423     frame.pack();\r
424     frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()\r
425     { public void internalFrameClosed(javax.swing.event.InternalFrameEvent evt)\r
426       {\r
427             alignPanel.setOverviewPanel(null);\r
428       };\r
429     });\r
430     alignPanel.setOverviewPanel( overview );\r
431 \r
432   }catch(java.lang.OutOfMemoryError ex)\r
433    {\r
434      JOptionPane.showMessageDialog(this, "Sequence alignment too large to\nproduce overview image!!"\r
435                                    +"\nTry reducing the font size.",\r
436                                    "Out of memory", JOptionPane.WARNING_MESSAGE);\r
437    }\r
438 \r
439 \r
440   }\r
441 \r
442   protected void noColourmenuItem_actionPerformed(ActionEvent e)\r
443   {\r
444     alignPanel.setColourScheme(null, false);\r
445   }\r
446 \r
447 \r
448   public void clustalColour_actionPerformed(ActionEvent e)\r
449   {\r
450    // alignPanel.setColourScheme( new ClustalxColourScheme() );\r
451   }\r
452 \r
453   public void zappoColour_actionPerformed(ActionEvent e)\r
454   {\r
455     alignPanel.setColourScheme( new ZappoColourScheme(), conservationMenuItem.isSelected() );\r
456   }\r
457 \r
458   public void taylorColour_actionPerformed(ActionEvent e)\r
459   {\r
460     alignPanel.setColourScheme( new TaylorColourScheme(),conservationMenuItem.isSelected() );\r
461   }\r
462 \r
463 \r
464   public void hydrophobicityColour_actionPerformed(ActionEvent e)\r
465   {\r
466     alignPanel.setColourScheme( new HydrophobicColourScheme(),conservationMenuItem.isSelected() );\r
467   }\r
468 \r
469   public void helixColour_actionPerformed(ActionEvent e)\r
470   {\r
471     alignPanel.setColourScheme( new HelixColourScheme(),conservationMenuItem.isSelected() );\r
472   }\r
473 \r
474 \r
475   public void strandColour_actionPerformed(ActionEvent e)\r
476   {\r
477     alignPanel.setColourScheme( new StrandColourScheme() ,conservationMenuItem.isSelected() );\r
478   }\r
479 \r
480 \r
481   public void turnColour_actionPerformed(ActionEvent e)\r
482   {\r
483     alignPanel.setColourScheme( new TurnColourScheme() ,conservationMenuItem.isSelected() );\r
484   }\r
485 \r
486 \r
487   public void buriedColour_actionPerformed(ActionEvent e)\r
488   {\r
489     alignPanel.setColourScheme( new BuriedColourScheme() ,conservationMenuItem.isSelected() );\r
490   }\r
491 \r
492 \r
493   protected  void conservationMenuItem_actionPerformed(ActionEvent e)\r
494   {\r
495     alignPanel.setColourScheme ( alignPanel.seqPanel.getColourScheme(),conservationMenuItem.isSelected() );\r
496     conservationColourIncMenuItem.setEnabled( conservationMenuItem.isSelected() );\r
497   }\r
498 \r
499 \r
500 \r
501   public void conservationColourIncMenuItem_actionPerformed(ActionEvent e)\r
502  {\r
503    ConservationIncrementPanel cip = new ConservationIncrementPanel(viewport, alignPanel);\r
504    JInternalFrame frame = new JInternalFrame();\r
505    frame.setContentPane(cip);\r
506    Desktop.addInternalFrame(frame, "Conservation Colour Increment", 400,90);\r
507    frame.setMaximizable(false);\r
508  }\r
509 \r
510 \r
511   public void abovePIDColour_actionPerformed(ActionEvent e)\r
512   {\r
513     alignPanel.setColourScheme( new PIDColourScheme() ,conservationMenuItem.isSelected() );\r
514   }\r
515 \r
516 \r
517   public void userDefinedColour_actionPerformed(ActionEvent e)\r
518   {\r
519     JInternalFrame frame = new JInternalFrame();\r
520     UserDefinedColours chooser = new UserDefinedColours( frame, alignPanel.seqPanel );\r
521     frame.setContentPane(chooser);\r
522     Desktop.addInternalFrame(frame,"User defined colours", 450,540 );\r
523     frame.setResizable(false);\r
524     frame.setIconifiable(false);\r
525     frame.setMaximizable(false);\r
526   }\r
527 \r
528   public void PIDColour_actionPerformed(ActionEvent e)\r
529   {\r
530     alignPanel.setColourScheme( new PIDColourScheme(),conservationMenuItem.isSelected() );\r
531   }\r
532 \r
533 \r
534   public void BLOSUM62Colour_actionPerformed(ActionEvent e)\r
535   {\r
536     alignPanel.setColourScheme( new Blosum62ColourScheme(viewport) ,conservationMenuItem.isSelected() );\r
537   }\r
538 \r
539 \r
540 \r
541   protected void schemeKeyMenuItem_actionPerformed(ActionEvent e)\r
542   {\r
543     ColourKey colourKey = new ColourKey( alignPanel.seqPanel.getColourScheme() );\r
544     Desktop.addInternalFrame(colourKey, "Colour scheme key", 400, 320);\r
545   }\r
546 \r
547 \r
548   public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)\r
549   {\r
550     addHistoryItem("sort");\r
551     AlignmentSorter.sortByPID(viewport.getAlignment(), viewport.getAlignment().getSequenceAt(0));\r
552     alignPanel.RefreshPanels();\r
553   }\r
554 \r
555   public void sortIDMenuItem_actionPerformed(ActionEvent e)\r
556   {\r
557     addHistoryItem("sort");\r
558     AlignmentSorter.sortByID( viewport.getAlignment() );\r
559     alignPanel.RefreshPanels();\r
560   }\r
561 \r
562   public void sortGroupMenuItem_actionPerformed(ActionEvent e)\r
563   {\r
564     addHistoryItem("sort");\r
565     AlignmentSorter.sortGroups(viewport.getAlignment());\r
566     AlignmentSorter.sortGroups(viewport.getAlignment());\r
567     alignPanel.RefreshPanels();\r
568   }\r
569 \r
570   public void sortTreeOrderMenuItem_actionPerformed(ActionEvent e)\r
571   {\r
572     addHistoryItem("sort");\r
573     if(viewport.getCurrentTree()==null)\r
574       return;\r
575 \r
576     AlignmentSorter.sortByTree(viewport.getAlignment(), viewport.getCurrentTree());\r
577     alignPanel.RefreshPanels();\r
578   }\r
579 \r
580   public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)\r
581   {\r
582 \r
583   }\r
584 \r
585   public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)\r
586   {\r
587     if(viewport.getSelection().size()<2)\r
588       JOptionPane.showMessageDialog(this, "You must select at least 2 sequences.", "Invalid Selection", JOptionPane.WARNING_MESSAGE);\r
589     else\r
590     {\r
591       JInternalFrame frame = new JInternalFrame();\r
592       frame.setContentPane(new PairwiseAlignPanel(viewport));\r
593       Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);\r
594     }\r
595   }\r
596 \r
597   public void PCAMenuItem_actionPerformed(ActionEvent e)\r
598   {\r
599     if( (viewport.getSelection().size()<4 && viewport.getSelection().size()>0)\r
600        || viewport.getAlignment().getHeight()<4)\r
601     {\r
602       JOptionPane.showMessageDialog(this, "Principal component analysis must take\n"\r
603                                     +"at least 4 input sequences.",\r
604                                     "Sequence selection insufficient",\r
605                                     JOptionPane.WARNING_MESSAGE);\r
606       return;\r
607     }\r
608 \r
609     try{\r
610       PCAPanel pcaPanel = new PCAPanel(viewport, null);\r
611       JInternalFrame frame = new JInternalFrame();\r
612       frame.setContentPane(pcaPanel);\r
613       Desktop.addInternalFrame(frame, "Principal component analysis", 400, 400);\r
614    }catch(java.lang.OutOfMemoryError ex)\r
615    {\r
616      JOptionPane.showMessageDialog(this, "Too many sequences selected\nfor Principal Component Analysis!!",\r
617                                    "Out of memory", JOptionPane.WARNING_MESSAGE);\r
618    }\r
619 \r
620 \r
621   }\r
622 \r
623   public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)\r
624   {\r
625     NewTreePanel("AV", "PID", "Average distance tree using PID");\r
626   }\r
627 \r
628   public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)\r
629   {\r
630     NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");\r
631   }\r
632 \r
633 \r
634   protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)\r
635   {\r
636     NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");\r
637   }\r
638 \r
639   protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)\r
640   {\r
641     NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62PID");\r
642   }\r
643 \r
644   void NewTreePanel(String type, String pwType, String title)\r
645   {\r
646     JInternalFrame frame = new javax.swing.JInternalFrame();\r
647     TreePanel tp=null;\r
648    if (viewport.getSelection() != null && viewport.getSelection().size() > 3)\r
649    {\r
650      tp = new TreePanel(viewport, viewport.getSelection().asVector(),type, pwType,\r
651                          viewport.getStartRes(), viewport.getEndRes());\r
652    }\r
653    else\r
654    {\r
655      tp = new TreePanel(viewport, viewport.getAlignment().getSequences(),\r
656                          type, pwType, viewport.getStartRes(),\r
657                          viewport.getEndRes());\r
658    }\r
659 \r
660    frame.setContentPane(tp);\r
661    Desktop.addInternalFrame(frame, title, 600, 500);\r
662   }\r
663 \r
664 \r
665 \r
666   public void clustalAlignMenuItem_actionPerformed(ActionEvent e)\r
667   {\r
668     JOptionPane.showMessageDialog(this, "Jalview is currently being reengineered"\r
669                                   +"\nwithin the Barton Group, Dundee University."\r
670                                   +"\nThis will be available as a web service 2005",\r
671                                   "Web service", JOptionPane.INFORMATION_MESSAGE);\r
672   }\r
673 \r
674 }\r