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