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