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