allow printing and 3d viewer
[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.getAlignment(), alignPanel.seqPanel.getColourScheme());\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 \r
193 \r
194   public void groupsMenuItem_actionPerformed(ActionEvent e)\r
195   {\r
196     GroupEditor geditor = new GroupEditor(viewport, alignPanel);\r
197     JInternalFrame frame = new JInternalFrame();\r
198     frame.setContentPane(geditor);\r
199     Desktop.addInternalFrame(frame, "Group editor", 710, 410);\r
200     frame.setResizable(false);\r
201   }\r
202 \r
203   public void groupEditingMenuItem_actionPerformed(ActionEvent e)\r
204   {\r
205     viewport.setGroupEdit( groupEditingMenuItem.isSelected() );\r
206   }\r
207 \r
208   public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)\r
209   {\r
210     Selection sel = viewport.getSelection();\r
211     for (int i=0; i<viewport.getAlignment().getSequences().size(); i++)\r
212       sel.addElement( viewport.getAlignment().getSequenceAt(i));\r
213     PaintRefresher.Refresh(null);\r
214   }\r
215 \r
216   public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)\r
217   {\r
218     viewport.getSelection().clear();\r
219     PaintRefresher.Refresh(null);\r
220   }\r
221 \r
222   public void invertSequenceMenuItem_actionPerformed(ActionEvent e)\r
223   {\r
224     Selection sel = viewport.getSelection();\r
225     for (int i=0; i<viewport.getAlignment().getSequences().size(); i++)\r
226     {\r
227       if (sel.contains(viewport.getAlignment().getSequenceAt(i)))\r
228         sel.removeElement(viewport.getAlignment().getSequenceAt(i));\r
229       else\r
230         sel.addElement(viewport.getAlignment().getSequenceAt(i));\r
231     }\r
232     PaintRefresher.Refresh(null);\r
233   }\r
234 \r
235   public void deleteSelectedMenuItem_actionPerformed(ActionEvent e)\r
236   {\r
237     addHistoryItem("delete selection");\r
238 \r
239     for (int i=0;i < viewport.getSelection().size(); i++)\r
240             viewport.getAlignment().deleteSequence(viewport.getSelection().sequenceAt(i));\r
241 \r
242     viewport.getSelection().clear();\r
243     viewport.resetSeqLimits(alignPanel.seqPanel.seqCanvas.getHeight());\r
244     alignPanel.RefreshPanels();\r
245   }\r
246 \r
247   public void moveSelectedMenuItem_actionPerformed(ActionEvent e)\r
248   {\r
249     copySelectedMenuItem_actionPerformed(null);\r
250     deleteSelectedMenuItem_actionPerformed(null);\r
251     alignPanel.repaint();\r
252   }\r
253 \r
254   public void copySelectedMenuItem_actionPerformed(ActionEvent e)\r
255   {\r
256     if(viewport.getSelection().size()==0)\r
257       return;\r
258 \r
259    SequenceI[] s = new Sequence[viewport.getSelection().size()];\r
260    for (int i=0; i < viewport.getSelection().size(); i++) {\r
261      s[i] = new Sequence(viewport.getSelection().sequenceAt(i));\r
262     }\r
263     AlignFrame af = new AlignFrame(new Alignment(s));\r
264     int newHeight = s.length * af.viewport.getCharHeight() + 200;\r
265     if(newHeight>500)\r
266       newHeight=500;\r
267     Desktop.addInternalFrame(af, "Copied sequences", 700,newHeight);\r
268   }\r
269 \r
270   public void deselectAllColumnsMenuItem_actionPerformed(ActionEvent e)\r
271   {\r
272     viewport.getColumnSelection().clear();\r
273     repaint();\r
274   }\r
275 \r
276   public void remove2LeftMenuItem_actionPerformed(ActionEvent e)\r
277   {\r
278     addHistoryItem("delete columns");\r
279     ColumnSelection colSel = viewport.getColumnSelection();\r
280     if (colSel.size() > 0)\r
281     {\r
282       int min = colSel.getMin();\r
283       viewport.getAlignment().trimLeft(min);\r
284       colSel.compensateForEdit(0,min);\r
285       alignPanel.RefreshPanels();\r
286     }\r
287   }\r
288 \r
289   public void remove2RightMenuItem_actionPerformed(ActionEvent e)\r
290   {\r
291     addHistoryItem("delete columns");\r
292     ColumnSelection colSel = viewport.getColumnSelection();\r
293     if (colSel.size() > 0)\r
294     {\r
295       int max = colSel.getMax();\r
296       if(max>1)\r
297         viewport.getAlignment().trimRight(max);\r
298 \r
299       alignPanel.RefreshPanels();\r
300     }\r
301 \r
302   }\r
303 \r
304   public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)\r
305   {\r
306     addHistoryItem("delete gapped columns");\r
307     viewport.getAlignment().removeGaps();\r
308     alignPanel.RefreshPanels();\r
309   }\r
310 \r
311   public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)\r
312   {\r
313     addHistoryItem("delete all gaps");\r
314     SequenceI current;\r
315     int jSize;\r
316     for (int i=0; i < viewport.getAlignment().getSequences().size();i++)\r
317     {\r
318       current = viewport.getAlignment().getSequenceAt(i);\r
319       jSize = current.getLength();\r
320       for (int j=0; j < jSize; j++)\r
321         if (current.getCharAt(j)=='-' || current.getCharAt(j)=='.' || current.getCharAt(j)==' ')\r
322         {\r
323           current.deleteCharAt(j);\r
324           j--;\r
325           jSize--;\r
326         }\r
327     }\r
328 \r
329     alignPanel.RefreshPanels();\r
330   }\r
331 \r
332   public void setGapCharMenuItem_actionPerformed(ActionEvent e)\r
333   {\r
334     String thisChar = "-";\r
335     String nextChar = ".";\r
336     if(viewport.getGapCharacter().equals("-"))\r
337     {\r
338       thisChar = ".";\r
339       nextChar = "-";\r
340     }\r
341     setGapCharMenuItem.setText("Set gap character to \""+nextChar+"\"");\r
342     viewport.setGapCharacter(thisChar);\r
343   }\r
344 \r
345 \r
346   public void fontNameMenuItem_actionPerformed(ActionEvent e)\r
347   {\r
348     String fonts[] = java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();\r
349 \r
350 \r
351     String selection = JOptionPane.showInputDialog(this,\r
352                                 "Select font",\r
353                                 "Font selection",\r
354                                 JOptionPane.QUESTION_MESSAGE,\r
355                                 null,fonts\r
356                                 ,fontNameMenuItem.getText()).toString();\r
357     if(selection!=null)\r
358     {\r
359        fontNameMenuItem.setText(selection);\r
360        SetFont();\r
361      }\r
362 \r
363   }\r
364 \r
365   public void fontSizeMenuItem_actionPerformed(ActionEvent e)\r
366   {\r
367     String selection = JOptionPane.showInputDialog(this,\r
368                                 "Select font size",\r
369                                 "Font size",\r
370                                 JOptionPane.QUESTION_MESSAGE,\r
371                                 null, new String[]{"1","2","4","6","8","10","12","14","16","18","20"}\r
372                                 ,fontSizeMenuItem.getText()).toString();\r
373     if(selection!=null)\r
374      {\r
375        fontSizeMenuItem.setText(selection);\r
376        SetFont();\r
377      }\r
378   }\r
379 \r
380   public void fontStyleMenuItem_actionPerformed(ActionEvent e)\r
381   {\r
382     String selection = JOptionPane.showInputDialog(this,\r
383                                 "Select font style",\r
384                                 "Font style",\r
385                                 JOptionPane.QUESTION_MESSAGE,\r
386                                 null, new String[]{"plain", "bold", "italic"}\r
387                                 ,fontStyleMenuItem.getText()).toString();\r
388     if(selection!=null)\r
389     {\r
390       fontStyleMenuItem.setText(selection);\r
391       SetFont();\r
392     }\r
393 \r
394   }\r
395 \r
396   protected void colourTextMenuItem_actionPerformed(ActionEvent e)\r
397   {\r
398     viewport.setColourText( colourTextMenuItem.isSelected() );\r
399     alignPanel.RefreshPanels();\r
400   }\r
401 \r
402   void SetFont()\r
403   {\r
404       int style = java.awt.Font.PLAIN;\r
405       if(fontStyleMenuItem.getText().equals("bold"))\r
406         style = java.awt.Font.BOLD;\r
407       else if(fontStyleMenuItem.getText().equals("italic"))\r
408         style = java.awt.Font.ITALIC;\r
409 \r
410       viewport.setFont(new java.awt.Font(fontNameMenuItem.getText(),\r
411                                            style,\r
412                                            Integer.parseInt(fontSizeMenuItem.getText())));\r
413       alignPanel.RefreshPanels();\r
414 \r
415   }\r
416 \r
417   protected void wrapMenuItem_actionPerformed(ActionEvent e)\r
418   {\r
419     viewport.setWrapAlignment( wrapMenuItem.isSelected() );\r
420     alignPanel.setWrapAlignment( wrapMenuItem.isSelected() );\r
421   }\r
422 \r
423 \r
424   public void viewBoxesMenuItem_actionPerformed(ActionEvent e)\r
425   {\r
426     viewport.setShowBoxes( viewBoxesMenuItem.isSelected() );\r
427     alignPanel.RefreshPanels();\r
428   }\r
429 \r
430   public void viewTextMenuItem_actionPerformed(ActionEvent e)\r
431   {\r
432     viewport.setShowText( viewTextMenuItem.isSelected() );\r
433     alignPanel.RefreshPanels();\r
434   }\r
435 \r
436 \r
437   public void consensusGraphMenuItem_actionPerformed(ActionEvent e)\r
438   {\r
439     alignPanel.setGraphPanelVisible( consensusGraphMenuItem.isSelected() );\r
440   }\r
441 \r
442   public void overviewMenuItem_actionPerformed(ActionEvent e)\r
443   {\r
444 \r
445     JInternalFrame frame = new JInternalFrame();\r
446     OverviewPanel overview = alignPanel.getOverviewPanel();\r
447    try{\r
448      overview = new OverviewPanel(alignPanel, viewport);\r
449      frame.setContentPane(overview);\r
450     Desktop.addInternalFrame(frame, "Overview " + this.getTitle(),\r
451                              frame.getWidth(), frame.getHeight());\r
452     frame.pack();\r
453     frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()\r
454     { public void internalFrameClosed(javax.swing.event.InternalFrameEvent evt)\r
455       {\r
456             alignPanel.setOverviewPanel(null);\r
457       };\r
458     });\r
459     alignPanel.setOverviewPanel( overview );\r
460 \r
461   }catch(java.lang.OutOfMemoryError ex)\r
462    {\r
463      JOptionPane.showMessageDialog(this, "Sequence alignment too large to\nproduce overview image!!"\r
464                                    +"\nTry reducing the font size.",\r
465                                    "Out of memory", JOptionPane.WARNING_MESSAGE);\r
466    }\r
467 \r
468 \r
469   }\r
470 \r
471   protected void noColourmenuItem_actionPerformed(ActionEvent e)\r
472   {\r
473     alignPanel.setColourScheme(null, false);\r
474   }\r
475 \r
476 \r
477   public void clustalColour_actionPerformed(ActionEvent e)\r
478   {\r
479    // alignPanel.setColourScheme( new ClustalxColourScheme() );\r
480   }\r
481 \r
482   public void zappoColour_actionPerformed(ActionEvent e)\r
483   {\r
484     alignPanel.setColourScheme( new ZappoColourScheme(), conservationMenuItem.isSelected() );\r
485   }\r
486 \r
487   public void taylorColour_actionPerformed(ActionEvent e)\r
488   {\r
489     alignPanel.setColourScheme( new TaylorColourScheme(),conservationMenuItem.isSelected() );\r
490   }\r
491 \r
492 \r
493   public void hydrophobicityColour_actionPerformed(ActionEvent e)\r
494   {\r
495     alignPanel.setColourScheme( new HydrophobicColourScheme(),conservationMenuItem.isSelected() );\r
496   }\r
497 \r
498   public void helixColour_actionPerformed(ActionEvent e)\r
499   {\r
500     alignPanel.setColourScheme( new HelixColourScheme(),conservationMenuItem.isSelected() );\r
501   }\r
502 \r
503 \r
504   public void strandColour_actionPerformed(ActionEvent e)\r
505   {\r
506     alignPanel.setColourScheme( new StrandColourScheme() ,conservationMenuItem.isSelected() );\r
507   }\r
508 \r
509 \r
510   public void turnColour_actionPerformed(ActionEvent e)\r
511   {\r
512     alignPanel.setColourScheme( new TurnColourScheme() ,conservationMenuItem.isSelected() );\r
513   }\r
514 \r
515 \r
516   public void buriedColour_actionPerformed(ActionEvent e)\r
517   {\r
518     alignPanel.setColourScheme( new BuriedColourScheme() ,conservationMenuItem.isSelected() );\r
519   }\r
520 \r
521 \r
522   protected  void conservationMenuItem_actionPerformed(ActionEvent e)\r
523   {\r
524     alignPanel.setColourScheme ( alignPanel.seqPanel.getColourScheme(),conservationMenuItem.isSelected() );\r
525     conservationColourIncMenuItem.setEnabled( conservationMenuItem.isSelected() );\r
526   }\r
527 \r
528 \r
529 \r
530   public void conservationColourIncMenuItem_actionPerformed(ActionEvent e)\r
531  {\r
532    ConservationIncrementPanel cip = new ConservationIncrementPanel(viewport, alignPanel);\r
533    JInternalFrame frame = new JInternalFrame();\r
534    frame.setContentPane(cip);\r
535    Desktop.addInternalFrame(frame, "Conservation Colour Increment", 400,90);\r
536    frame.setMaximizable(false);\r
537  }\r
538 \r
539 \r
540   public void abovePIDColour_actionPerformed(ActionEvent e)\r
541   {\r
542     alignPanel.setColourScheme( new PIDColourScheme() ,conservationMenuItem.isSelected() );\r
543   }\r
544 \r
545 \r
546   public void userDefinedColour_actionPerformed(ActionEvent e)\r
547   {\r
548     JInternalFrame frame = new JInternalFrame();\r
549     UserDefinedColours chooser = new UserDefinedColours( frame, alignPanel.seqPanel );\r
550     frame.setContentPane(chooser);\r
551     Desktop.addInternalFrame(frame,"User defined colours", 450,540 );\r
552     frame.setResizable(false);\r
553     frame.setIconifiable(false);\r
554     frame.setMaximizable(false);\r
555   }\r
556 \r
557   public void PIDColour_actionPerformed(ActionEvent e)\r
558   {\r
559     alignPanel.setColourScheme( new PIDColourScheme(),conservationMenuItem.isSelected() );\r
560   }\r
561 \r
562 \r
563   public void BLOSUM62Colour_actionPerformed(ActionEvent e)\r
564   {\r
565     alignPanel.setColourScheme( new Blosum62ColourScheme(viewport) ,conservationMenuItem.isSelected() );\r
566   }\r
567 \r
568 \r
569 \r
570   protected void schemeKeyMenuItem_actionPerformed(ActionEvent e)\r
571   {\r
572     ColourKey colourKey = new ColourKey( alignPanel.seqPanel.getColourScheme() );\r
573     Desktop.addInternalFrame(colourKey, "Colour scheme key", 400, 320);\r
574   }\r
575 \r
576 \r
577   public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)\r
578   {\r
579     addHistoryItem("sort");\r
580     AlignmentSorter.sortByPID(viewport.getAlignment(), viewport.getAlignment().getSequenceAt(0));\r
581     alignPanel.RefreshPanels();\r
582   }\r
583 \r
584   public void sortIDMenuItem_actionPerformed(ActionEvent e)\r
585   {\r
586     addHistoryItem("sort");\r
587     AlignmentSorter.sortByID( viewport.getAlignment() );\r
588     alignPanel.RefreshPanels();\r
589   }\r
590 \r
591   public void sortGroupMenuItem_actionPerformed(ActionEvent e)\r
592   {\r
593     addHistoryItem("sort");\r
594     AlignmentSorter.sortGroups(viewport.getAlignment());\r
595     AlignmentSorter.sortGroups(viewport.getAlignment());\r
596     alignPanel.RefreshPanels();\r
597   }\r
598 \r
599   public void sortTreeOrderMenuItem_actionPerformed(ActionEvent e)\r
600   {\r
601     addHistoryItem("sort");\r
602     if(viewport.getCurrentTree()==null)\r
603       return;\r
604 \r
605     AlignmentSorter.sortByTree(viewport.getAlignment(), viewport.getCurrentTree());\r
606     alignPanel.RefreshPanels();\r
607   }\r
608 \r
609   public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)\r
610   {\r
611 \r
612   }\r
613 \r
614   public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)\r
615   {\r
616     if(viewport.getSelection().size()<2)\r
617       JOptionPane.showMessageDialog(this, "You must select at least 2 sequences.", "Invalid Selection", JOptionPane.WARNING_MESSAGE);\r
618     else\r
619     {\r
620       JInternalFrame frame = new JInternalFrame();\r
621       frame.setContentPane(new PairwiseAlignPanel(viewport));\r
622       Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);\r
623     }\r
624   }\r
625 \r
626   public void PCAMenuItem_actionPerformed(ActionEvent e)\r
627   {\r
628     if( (viewport.getSelection().size()<4 && viewport.getSelection().size()>0)\r
629        || viewport.getAlignment().getHeight()<4)\r
630     {\r
631       JOptionPane.showMessageDialog(this, "Principal component analysis must take\n"\r
632                                     +"at least 4 input sequences.",\r
633                                     "Sequence selection insufficient",\r
634                                     JOptionPane.WARNING_MESSAGE);\r
635       return;\r
636     }\r
637 \r
638     try{\r
639       PCAPanel pcaPanel = new PCAPanel(viewport, null);\r
640       JInternalFrame frame = new JInternalFrame();\r
641       frame.setContentPane(pcaPanel);\r
642       Desktop.addInternalFrame(frame, "Principal component analysis", 400, 400);\r
643    }catch(java.lang.OutOfMemoryError ex)\r
644    {\r
645      JOptionPane.showMessageDialog(this, "Too many sequences selected\nfor Principal Component Analysis!!",\r
646                                    "Out of memory", JOptionPane.WARNING_MESSAGE);\r
647    }\r
648 \r
649 \r
650   }\r
651 \r
652   public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)\r
653   {\r
654     NewTreePanel("AV", "PID", "Average distance tree using PID");\r
655   }\r
656 \r
657   public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)\r
658   {\r
659     NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");\r
660   }\r
661 \r
662 \r
663   protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)\r
664   {\r
665     NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");\r
666   }\r
667 \r
668   protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)\r
669   {\r
670     NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62PID");\r
671   }\r
672 \r
673   void NewTreePanel(String type, String pwType, String title)\r
674   {\r
675     JInternalFrame frame = new javax.swing.JInternalFrame();\r
676     TreePanel tp=null;\r
677    if (viewport.getSelection() != null && viewport.getSelection().size() > 3)\r
678    {\r
679      tp = new TreePanel(viewport, viewport.getSelection().asVector(),type, pwType,\r
680                          viewport.getStartRes(), viewport.getEndRes());\r
681    }\r
682    else\r
683    {\r
684      tp = new TreePanel(viewport, viewport.getAlignment().getSequences(),\r
685                          type, pwType, viewport.getStartRes(),\r
686                          viewport.getEndRes());\r
687    }\r
688 \r
689    frame.setContentPane(tp);\r
690    Desktop.addInternalFrame(frame, title, 600, 500);\r
691   }\r
692 \r
693 \r
694 \r
695   public void clustalAlignMenuItem_actionPerformed(ActionEvent e)\r
696   {\r
697     JOptionPane.showMessageDialog(this, "Jalview is currently being reengineered"\r
698                                   +"\nwithin the Barton Group, Dundee University."\r
699                                   +"\nThis will be available as a web service 2005",\r
700                                   "Web service", JOptionPane.INFORMATION_MESSAGE);\r
701   }\r
702 \r
703   public void pdbTest_actionPerformed(ActionEvent e)\r
704   {\r
705    String reply = JOptionPane.showInputDialog(this, "Enter pdb code", "PDB test viewer", JOptionPane.QUESTION_MESSAGE);\r
706 \r
707    String url = "http://www.ebi.ac.uk/cgi-bin/pdbfetch?id=1a4u";\r
708    if (reply.length()>1)\r
709      url = "http://www.ebi.ac.uk/cgi-bin/pdbfetch?id="+reply;\r
710 \r
711    try\r
712    {\r
713      PDBfile pdb = new PDBfile(url,\r
714                                "URL");\r
715     Sequence seq = (Sequence)viewport.getAlignment().getSequenceAt(0);\r
716     seq.setPDBfile(pdb);\r
717      ( (PDBChain) pdb.chains.elementAt(seq.maxchain)).isVisible = true;\r
718      ( (PDBChain) pdb.chains.elementAt(seq.maxchain)).sequence = seq;\r
719   // ( (PDBChain) pdb.chains.elementAt(seq.maxchain)).colourBySequence();\r
720 \r
721      rotCanvas rc = new rotCanvas(pdb);\r
722      JInternalFrame frame = new JInternalFrame();\r
723      frame.setContentPane(rc);\r
724      Desktop.addInternalFrame(frame, url, 400,400);\r
725    }\r
726    catch (Exception ex)\r
727    {\r
728      ex.printStackTrace();\r
729    }\r
730 \r
731   }\r
732 \r
733 }\r