showinternal***dialog
[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     char thisChar = '-';\r
335     char nextChar = '.';\r
336     if(viewport.getGapCharacter()=='-')\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     alignPanel.RefreshPanels();\r
344   }\r
345 \r
346   public void findMenuItem_actionPerformed(ActionEvent e)\r
347   {\r
348     JOptionPane op = new JOptionPane();\r
349     JInternalFrame frame =  op.createInternalFrame(this, "Find");\r
350     Finder finder = new Finder(viewport, alignPanel, frame);\r
351     frame.setContentPane(finder);\r
352     frame.setSize(300,110);\r
353     frame.setVisible(true);\r
354   }\r
355 \r
356 \r
357 \r
358   public void fontNameMenuItem_actionPerformed(ActionEvent e)\r
359   {\r
360     String fonts[] = java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();\r
361 \r
362 \r
363     String selection = JOptionPane.showInternalInputDialog(this,\r
364                                 "Select font",\r
365                                 "Font selection",\r
366                                 JOptionPane.QUESTION_MESSAGE,\r
367                                 null,fonts\r
368                                 ,fontNameMenuItem.getText()).toString();\r
369     if(selection!=null)\r
370     {\r
371        fontNameMenuItem.setText(selection);\r
372        SetFont();\r
373      }\r
374 \r
375   }\r
376 \r
377   public void fontSizeMenuItem_actionPerformed(ActionEvent e)\r
378   {\r
379     String selection = JOptionPane.showInternalInputDialog(this,\r
380                                 "Select font size",\r
381                                 "Font size",\r
382                                 JOptionPane.QUESTION_MESSAGE,\r
383                                 null, new String[]{"1","2","4","6","8","10","12","14","16","18","20"}\r
384                                 ,fontSizeMenuItem.getText()).toString();\r
385     if(selection!=null)\r
386      {\r
387        fontSizeMenuItem.setText(selection);\r
388        SetFont();\r
389      }\r
390   }\r
391 \r
392   public void fontStyleMenuItem_actionPerformed(ActionEvent e)\r
393   {\r
394     String selection = JOptionPane.showInternalInputDialog(this,\r
395                                 "Select font style",\r
396                                 "Font style",\r
397                                 JOptionPane.QUESTION_MESSAGE,\r
398                                 null, new String[]{"plain", "bold", "italic"}\r
399                                 ,fontStyleMenuItem.getText()).toString();\r
400     if(selection!=null)\r
401     {\r
402       fontStyleMenuItem.setText(selection);\r
403       SetFont();\r
404     }\r
405 \r
406   }\r
407 \r
408   protected void colourTextMenuItem_actionPerformed(ActionEvent e)\r
409   {\r
410       updateResidueView();\r
411   }\r
412 \r
413   void SetFont()\r
414   {\r
415       int style = java.awt.Font.PLAIN;\r
416       if(fontStyleMenuItem.getText().equals("bold"))\r
417         style = java.awt.Font.BOLD;\r
418       else if(fontStyleMenuItem.getText().equals("italic"))\r
419         style = java.awt.Font.ITALIC;\r
420 \r
421       viewport.setFont(new java.awt.Font(fontNameMenuItem.getText(),\r
422                                            style,\r
423                                            Integer.parseInt(fontSizeMenuItem.getText())));\r
424       alignPanel.RefreshPanels();\r
425 \r
426   }\r
427 \r
428   protected void wrapMenuItem_actionPerformed(ActionEvent e)\r
429   {\r
430      updateResidueView();\r
431   }\r
432 \r
433 \r
434   public void viewBoxesMenuItem_actionPerformed(ActionEvent e)\r
435   {\r
436      updateResidueView();\r
437   }\r
438 \r
439   public void viewTextMenuItem_actionPerformed(ActionEvent e)\r
440   {\r
441      updateResidueView();\r
442   }\r
443 \r
444 \r
445   protected void renderGapsMenuItem_actionPerformed(ActionEvent e)\r
446   {\r
447     viewport.setRenderGaps(renderGapsMenuItem.isSelected());\r
448     alignPanel.RefreshPanels();\r
449   }\r
450 \r
451 \r
452   void updateResidueView()\r
453   {\r
454     if (viewport.getSelection().size() == 0)\r
455      {\r
456        for (int i = 0; i < viewport.alignment.getGroups().size(); i++)\r
457        {\r
458          SequenceGroup sg = (SequenceGroup) viewport.alignment.getGroups().elementAt(i);\r
459          sg.setDisplayBoxes( viewBoxesMenuItem.isSelected() );\r
460          sg.setDisplayText( viewTextMenuItem.isSelected() );\r
461          sg.setColourText( colourTextMenuItem.isSelected() );\r
462        }\r
463      }\r
464      else\r
465      {\r
466        SequenceGroup sg = viewport.alignment.findGroup( (Sequence) viewport.sel.sequenceAt(0));\r
467        if (alignPanel.seqPanel.isNewSelection(sg))\r
468        {\r
469          sg = viewport.getAlignment().addGroup();\r
470          for (int i = 0; i < viewport.getSelection().size(); i++)\r
471          {\r
472            viewport.alignment.removeFromGroup(viewport.alignment.findGroup( (\r
473                Sequence) viewport.sel.sequenceAt(i)),\r
474                                               (Sequence) viewport.sel.sequenceAt(\r
475                i));\r
476            viewport.alignment.addToGroup(sg,\r
477                                          (Sequence) viewport.sel.sequenceAt(i));\r
478          }\r
479        }\r
480 \r
481        sg.setDisplayBoxes(viewBoxesMenuItem.isSelected());\r
482        sg.setDisplayText(viewTextMenuItem.isSelected());\r
483        sg.setColourText(colourTextMenuItem.isSelected());\r
484      }\r
485     alignPanel.RefreshPanels();\r
486   }\r
487 \r
488 \r
489   public void consensusGraphMenuItem_actionPerformed(ActionEvent e)\r
490   {\r
491     alignPanel.setGraphPanelVisible( consensusGraphMenuItem.isSelected() );\r
492   }\r
493 \r
494   public void overviewMenuItem_actionPerformed(ActionEvent e)\r
495   {\r
496 \r
497     JInternalFrame frame = new JInternalFrame();\r
498     OverviewPanel overview = alignPanel.getOverviewPanel();\r
499    try{\r
500      overview = new OverviewPanel(alignPanel, viewport);\r
501      frame.setContentPane(overview);\r
502     Desktop.addInternalFrame(frame, "Overview " + this.getTitle(),\r
503                              frame.getWidth(), frame.getHeight());\r
504     frame.pack();\r
505     frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()\r
506     { public void internalFrameClosed(javax.swing.event.InternalFrameEvent evt)\r
507       {\r
508             alignPanel.setOverviewPanel(null);\r
509       };\r
510     });\r
511     alignPanel.setOverviewPanel( overview );\r
512 \r
513   }catch(java.lang.OutOfMemoryError ex)\r
514    {\r
515      JOptionPane.showInternalMessageDialog(this, "Sequence alignment too large to\nproduce overview image!!"\r
516                                    +"\nTry reducing the font size.",\r
517                                    "Out of memory", JOptionPane.WARNING_MESSAGE);\r
518    }\r
519 \r
520 \r
521   }\r
522 \r
523   protected void noColourmenuItem_actionPerformed(ActionEvent e)\r
524   {\r
525     alignPanel.setColourScheme(null, false);\r
526   }\r
527 \r
528 \r
529   public void clustalColour_actionPerformed(ActionEvent e)\r
530   {\r
531    // alignPanel.setColourScheme( new ClustalxColourScheme() );\r
532   }\r
533 \r
534   public void zappoColour_actionPerformed(ActionEvent e)\r
535   {\r
536     alignPanel.setColourScheme( new ZappoColourScheme(), conservationMenuItem.isSelected() );\r
537   }\r
538 \r
539   public void taylorColour_actionPerformed(ActionEvent e)\r
540   {\r
541     alignPanel.setColourScheme( new TaylorColourScheme(),conservationMenuItem.isSelected() );\r
542   }\r
543 \r
544 \r
545   public void hydrophobicityColour_actionPerformed(ActionEvent e)\r
546   {\r
547     alignPanel.setColourScheme( new HydrophobicColourScheme(),conservationMenuItem.isSelected() );\r
548   }\r
549 \r
550   public void helixColour_actionPerformed(ActionEvent e)\r
551   {\r
552     alignPanel.setColourScheme( new HelixColourScheme(),conservationMenuItem.isSelected() );\r
553   }\r
554 \r
555 \r
556   public void strandColour_actionPerformed(ActionEvent e)\r
557   {\r
558     alignPanel.setColourScheme( new StrandColourScheme() ,conservationMenuItem.isSelected() );\r
559   }\r
560 \r
561 \r
562   public void turnColour_actionPerformed(ActionEvent e)\r
563   {\r
564     alignPanel.setColourScheme( new TurnColourScheme() ,conservationMenuItem.isSelected() );\r
565   }\r
566 \r
567 \r
568   public void buriedColour_actionPerformed(ActionEvent e)\r
569   {\r
570     alignPanel.setColourScheme( new BuriedColourScheme() ,conservationMenuItem.isSelected() );\r
571   }\r
572 \r
573 \r
574   protected  void conservationMenuItem_actionPerformed(ActionEvent e)\r
575   {\r
576     alignPanel.setColourScheme ( alignPanel.seqPanel.getColourScheme(),conservationMenuItem.isSelected() );\r
577     conservationColourIncMenuItem.setEnabled( conservationMenuItem.isSelected() );\r
578   }\r
579 \r
580 \r
581 \r
582   public void conservationColourIncMenuItem_actionPerformed(ActionEvent e)\r
583  {\r
584    ConservationIncrementPanel cip = new ConservationIncrementPanel(viewport, alignPanel);\r
585    JInternalFrame frame = new JInternalFrame();\r
586    frame.setContentPane(cip);\r
587    Desktop.addInternalFrame(frame, "Conservation Colour Increment", 400,90);\r
588    frame.setMaximizable(false);\r
589  }\r
590 \r
591 \r
592   public void abovePIDColour_actionPerformed(ActionEvent e)\r
593   {\r
594     alignPanel.setColourScheme( new PIDColourScheme() ,conservationMenuItem.isSelected() );\r
595   }\r
596 \r
597 \r
598   public void userDefinedColour_actionPerformed(ActionEvent e)\r
599   {\r
600     JInternalFrame frame = new JInternalFrame();\r
601     UserDefinedColours chooser = new UserDefinedColours( frame, alignPanel.seqPanel );\r
602     frame.setContentPane(chooser);\r
603     Desktop.addInternalFrame(frame,"User defined colours", 450,540 );\r
604     frame.setResizable(false);\r
605     frame.setIconifiable(false);\r
606     frame.setMaximizable(false);\r
607   }\r
608 \r
609   public void PIDColour_actionPerformed(ActionEvent e)\r
610   {\r
611     alignPanel.setColourScheme( new PIDColourScheme(),conservationMenuItem.isSelected() );\r
612   }\r
613 \r
614 \r
615   public void BLOSUM62Colour_actionPerformed(ActionEvent e)\r
616   {\r
617     alignPanel.setColourScheme( new Blosum62ColourScheme(viewport) ,conservationMenuItem.isSelected() );\r
618   }\r
619 \r
620 \r
621 \r
622   protected void schemeKeyMenuItem_actionPerformed(ActionEvent e)\r
623   {\r
624     ColourKey colourKey = new ColourKey( alignPanel.seqPanel.getColourScheme() );\r
625     Desktop.addInternalFrame(colourKey, "Colour scheme key", 400, 320);\r
626   }\r
627 \r
628 \r
629   public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)\r
630   {\r
631     addHistoryItem("sort");\r
632     AlignmentSorter.sortByPID(viewport.getAlignment(), viewport.getAlignment().getSequenceAt(0));\r
633     alignPanel.RefreshPanels();\r
634   }\r
635 \r
636   public void sortIDMenuItem_actionPerformed(ActionEvent e)\r
637   {\r
638     addHistoryItem("sort");\r
639     AlignmentSorter.sortByID( viewport.getAlignment() );\r
640     alignPanel.RefreshPanels();\r
641   }\r
642 \r
643   public void sortGroupMenuItem_actionPerformed(ActionEvent e)\r
644   {\r
645     addHistoryItem("sort");\r
646     AlignmentSorter.sortGroups(viewport.getAlignment());\r
647     AlignmentSorter.sortGroups(viewport.getAlignment());\r
648     alignPanel.RefreshPanels();\r
649   }\r
650 \r
651   public void sortTreeOrderMenuItem_actionPerformed(ActionEvent e)\r
652   {\r
653     addHistoryItem("sort");\r
654     if(viewport.getCurrentTree()==null)\r
655       return;\r
656 \r
657     AlignmentSorter.sortByTree(viewport.getAlignment(), viewport.getCurrentTree());\r
658     alignPanel.RefreshPanels();\r
659   }\r
660 \r
661   public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)\r
662   {\r
663 \r
664   }\r
665 \r
666   public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)\r
667   {\r
668     if(viewport.getSelection().size()<2)\r
669       JOptionPane.showInternalMessageDialog(this, "You must select at least 2 sequences.", "Invalid Selection", JOptionPane.WARNING_MESSAGE);\r
670     else\r
671     {\r
672       JInternalFrame frame = new JInternalFrame();\r
673       frame.setContentPane(new PairwiseAlignPanel(viewport));\r
674       Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);\r
675     }\r
676   }\r
677 \r
678   public void PCAMenuItem_actionPerformed(ActionEvent e)\r
679   {\r
680     if( (viewport.getSelection().size()<4 && viewport.getSelection().size()>0)\r
681        || viewport.getAlignment().getHeight()<4)\r
682     {\r
683       JOptionPane.showInternalMessageDialog(this, "Principal component analysis must take\n"\r
684                                     +"at least 4 input sequences.",\r
685                                     "Sequence selection insufficient",\r
686                                     JOptionPane.WARNING_MESSAGE);\r
687       return;\r
688     }\r
689 \r
690     try{\r
691       PCAPanel pcaPanel = new PCAPanel(viewport, null);\r
692       JInternalFrame frame = new JInternalFrame();\r
693       frame.setContentPane(pcaPanel);\r
694       Desktop.addInternalFrame(frame, "Principal component analysis", 400, 400);\r
695    }catch(java.lang.OutOfMemoryError ex)\r
696    {\r
697      JOptionPane.showInternalMessageDialog(this, "Too many sequences selected\nfor Principal Component Analysis!!",\r
698                                    "Out of memory", JOptionPane.WARNING_MESSAGE);\r
699    }\r
700 \r
701 \r
702   }\r
703 \r
704   public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)\r
705   {\r
706     NewTreePanel("AV", "PID", "Average distance tree using PID");\r
707   }\r
708 \r
709   public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)\r
710   {\r
711     NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");\r
712   }\r
713 \r
714 \r
715   protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)\r
716   {\r
717     NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");\r
718   }\r
719 \r
720   protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)\r
721   {\r
722     NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62PID");\r
723   }\r
724 \r
725   void NewTreePanel(String type, String pwType, String title)\r
726   {\r
727     JInternalFrame frame = new javax.swing.JInternalFrame();\r
728     TreePanel tp=null;\r
729    if (viewport.getSelection() != null && viewport.getSelection().size() > 3)\r
730    {\r
731      tp = new TreePanel(viewport, viewport.getSelection().asVector(),type, pwType,\r
732                          viewport.getStartRes(), viewport.getEndRes());\r
733    }\r
734    else\r
735    {\r
736      tp = new TreePanel(viewport, viewport.getAlignment().getSequences(),\r
737                          type, pwType, viewport.getStartRes(),\r
738                          viewport.getEndRes());\r
739    }\r
740 \r
741    frame.setContentPane(tp);\r
742    Desktop.addInternalFrame(frame, title, 600, 500);\r
743   }\r
744 \r
745 \r
746 \r
747   public void clustalAlignMenuItem_actionPerformed(ActionEvent e)\r
748   {\r
749     JOptionPane.showInternalMessageDialog(this, "Jalview is currently being reengineered"\r
750                                   +"\nwithin the Barton Group, Dundee University."\r
751                                   +"\nThis will be available as a web service 2005",\r
752                                   "Web service", JOptionPane.INFORMATION_MESSAGE);\r
753   }\r
754 \r
755   public void pdbTest_actionPerformed(ActionEvent e)\r
756   {\r
757    String reply = JOptionPane.showInternalInputDialog(this, "Enter pdb code", "PDB test viewer", JOptionPane.QUESTION_MESSAGE);\r
758 \r
759    String url = "http://www.ebi.ac.uk/cgi-bin/pdbfetch?id=1a4u";\r
760    if (reply.length()>1)\r
761      url = "http://www.ebi.ac.uk/cgi-bin/pdbfetch?id="+reply;\r
762 \r
763    try\r
764    {\r
765      PDBfile pdb = new PDBfile(url,\r
766                                "URL");\r
767     Sequence seq = (Sequence)viewport.getAlignment().getSequenceAt(0);\r
768     seq.setPDBfile(pdb);\r
769      ( (PDBChain) pdb.chains.elementAt(seq.maxchain)).isVisible = true;\r
770      ( (PDBChain) pdb.chains.elementAt(seq.maxchain)).sequence = seq;\r
771   // ( (PDBChain) pdb.chains.elementAt(seq.maxchain)).colourBySequence();\r
772 \r
773      rotCanvas rc = new rotCanvas(pdb);\r
774      JInternalFrame frame = new JInternalFrame();\r
775      frame.setContentPane(rc);\r
776      Desktop.addInternalFrame(frame, url, 400,400);\r
777    }\r
778    catch (Exception ex)\r
779    {\r
780      ex.printStackTrace();\r
781    }\r
782 \r
783   }\r
784 \r
785 \r
786   public void doKeyPressed(KeyEvent evt)\r
787   {\r
788 \r
789     System.out.println(evt.getKeyChar());\r
790     if(evt.isControlDown() && evt.getKeyChar()=='f')\r
791       findMenuItem_actionPerformed(null);\r
792 \r
793   }\r
794 \r
795 \r
796 }\r