Maintain PID or conservation status when changing colour
[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 javax.swing.event.*;\r
25 import java.util.*;\r
26 \r
27 public class AlignFrame extends GAlignFrame\r
28 {\r
29   final AlignmentPanel alignPanel;\r
30   final AlignViewport viewport;\r
31   public AlignFrame(AlignmentI al)\r
32   {\r
33     super();\r
34     viewport = new AlignViewport(al,true,true,true,false);\r
35     alignPanel = new AlignmentPanel(this, viewport);\r
36     getContentPane().add(alignPanel, java.awt.BorderLayout.CENTER);\r
37     fontNameMenuItem.setText(viewport.getFont().getName());\r
38     fontSizeMenuItem.setText(viewport.getFont().getSize()+"");\r
39   }\r
40 \r
41   protected void saveAs_actionPerformed(ActionEvent e)\r
42   {\r
43     JFileChooser chooser = new JFileChooser(jalview.bin.Cache.LAST_DIRECTORY);\r
44     chooser.setDialogTitle("Save Alignment to file - "+e.getActionCommand() +" format.");\r
45     chooser.setToolTipText("Save");\r
46     int value = chooser.showSaveDialog(this);\r
47     if(value == JFileChooser.APPROVE_OPTION)\r
48     {\r
49       String choice =  chooser.getSelectedFile().getPath();\r
50       jalview.bin.Cache.LAST_DIRECTORY = choice;\r
51       String output = FormatAdapter.get(e.getActionCommand(), viewport.getAlignment().getSequences());\r
52       try{\r
53         java.io.PrintWriter out = new java.io.PrintWriter( new java.io.FileWriter( choice )  );\r
54         out.println(output);\r
55         out.close();\r
56       }\r
57       catch(Exception ex){}\r
58     }\r
59 \r
60   }\r
61 \r
62   protected void outputText_actionPerformed(ActionEvent e)\r
63   {\r
64      CutAndPasteTransfer cap = new CutAndPasteTransfer(false);\r
65      JInternalFrame frame = new JInternalFrame();\r
66      cap.formatForOutput();\r
67      frame.setContentPane(cap);\r
68      Desktop.addInternalFrame(frame, "Alignment output - "+e.getActionCommand(), 600, 500);\r
69      cap.setText( FormatAdapter.get(e.getActionCommand(), viewport.getAlignment().getSequences()));\r
70   }\r
71 \r
72   protected void htmlMenuItem_actionPerformed(ActionEvent e)\r
73   {\r
74     HTMLOutput htmlOutput = new HTMLOutput(viewport);\r
75     htmlOutput = null;\r
76   }\r
77 \r
78   public void printMenuItem_actionPerformed(ActionEvent e)\r
79   {\r
80     //Putting in a thread avoids Swing painting problems\r
81     PrintThread thread = new PrintThread();\r
82     thread.start();\r
83   }\r
84 \r
85   class PrintThread extends Thread\r
86   {\r
87     public void run()\r
88     {\r
89       PrinterJob printJob = PrinterJob.getPrinterJob();\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   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 \r
204   public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)\r
205   {\r
206     Selection sel = viewport.getSelection();\r
207     for (int i=0; i<viewport.getAlignment().getSequences().size(); i++)\r
208       sel.addElement( viewport.getAlignment().getSequenceAt(i));\r
209     PaintRefresher.Refresh(null);\r
210   }\r
211 \r
212   public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)\r
213   {\r
214     viewport.getSelection().clear();\r
215     PaintRefresher.Refresh(null);\r
216   }\r
217 \r
218   public void invertSequenceMenuItem_actionPerformed(ActionEvent e)\r
219   {\r
220     Selection sel = viewport.getSelection();\r
221     for (int i=0; i<viewport.getAlignment().getSequences().size(); i++)\r
222     {\r
223       if (sel.contains(viewport.getAlignment().getSequenceAt(i)))\r
224         sel.removeElement(viewport.getAlignment().getSequenceAt(i));\r
225       else\r
226         sel.addElement(viewport.getAlignment().getSequenceAt(i));\r
227     }\r
228     PaintRefresher.Refresh(null);\r
229   }\r
230 \r
231 \r
232   public void deselectAllColumnsMenuItem_actionPerformed(ActionEvent e)\r
233   {\r
234     viewport.getColumnSelection().clear();\r
235     repaint();\r
236   }\r
237 \r
238   public void remove2LeftMenuItem_actionPerformed(ActionEvent e)\r
239   {\r
240     addHistoryItem("delete columns");\r
241     ColumnSelection colSel = viewport.getColumnSelection();\r
242     if (colSel.size() > 0)\r
243     {\r
244       int min = colSel.getMin();\r
245       viewport.getAlignment().trimLeft(min);\r
246       colSel.compensateForEdit(0,min);\r
247       alignPanel.RefreshPanels();\r
248     }\r
249   }\r
250 \r
251   public void remove2RightMenuItem_actionPerformed(ActionEvent e)\r
252   {\r
253     addHistoryItem("delete columns");\r
254     ColumnSelection colSel = viewport.getColumnSelection();\r
255     if (colSel.size() > 0)\r
256     {\r
257       int max = colSel.getMax();\r
258       if(max>1)\r
259         viewport.getAlignment().trimRight(max);\r
260 \r
261       alignPanel.RefreshPanels();\r
262     }\r
263 \r
264   }\r
265 \r
266   public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)\r
267   {\r
268     addHistoryItem("delete gapped columns");\r
269     viewport.getAlignment().removeGaps();\r
270     alignPanel.RefreshPanels();\r
271   }\r
272 \r
273   public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)\r
274   {\r
275     addHistoryItem("delete all gaps");\r
276     SequenceI current;\r
277     int jSize;\r
278     for (int i=0; i < viewport.getAlignment().getSequences().size();i++)\r
279     {\r
280       current = viewport.getAlignment().getSequenceAt(i);\r
281       jSize = current.getLength();\r
282       for (int j=0; j < jSize; j++)\r
283         if(jalview.util.Comparison.isGap(current.getCharAt(j)))\r
284         {\r
285           current.deleteCharAt(j);\r
286           j--;\r
287           jSize--;\r
288         }\r
289     }\r
290 \r
291     alignPanel.RefreshPanels();\r
292   }\r
293 \r
294   public void setGapCharMenuItem_actionPerformed(ActionEvent e)\r
295   {\r
296     char thisChar = '-';\r
297     char nextChar = '.';\r
298     if(viewport.getGapCharacter()=='-')\r
299     {\r
300       thisChar = '.';\r
301       nextChar = '-';\r
302     }\r
303     setGapCharMenuItem.setText("Set gap character to \""+nextChar+"\"");\r
304     viewport.setGapCharacter(thisChar);\r
305     alignPanel.RefreshPanels();\r
306   }\r
307 \r
308   public void findMenuItem_actionPerformed(ActionEvent e)\r
309   {\r
310     JOptionPane op = new JOptionPane();\r
311     JInternalFrame frame =  op.createInternalFrame(this, "Find");\r
312     Finder finder = new Finder(viewport, alignPanel, frame);\r
313     frame.setContentPane(finder);\r
314     frame.setSize(300,110);\r
315     frame.setVisible(true);\r
316   }\r
317 \r
318 \r
319 \r
320   public void fontNameMenuItem_actionPerformed(ActionEvent e)\r
321   {\r
322     String fonts[] = java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();\r
323 \r
324 \r
325     String selection = JOptionPane.showInternalInputDialog(this,\r
326                                 "Select font",\r
327                                 "Font selection",\r
328                                 JOptionPane.QUESTION_MESSAGE,\r
329                                 null,fonts\r
330                                 ,fontNameMenuItem.getText()).toString();\r
331     if(selection!=null)\r
332     {\r
333        fontNameMenuItem.setText(selection);\r
334        SetFont();\r
335      }\r
336 \r
337   }\r
338 \r
339   public void fontSizeMenuItem_actionPerformed(ActionEvent e)\r
340   {\r
341     String selection = JOptionPane.showInternalInputDialog(this,\r
342                                 "Select font size",\r
343                                 "Font size",\r
344                                 JOptionPane.QUESTION_MESSAGE,\r
345                                 null, new String[]{"1","2","4","6","8","10","12","14","16","18","20"}\r
346                                 ,fontSizeMenuItem.getText()).toString();\r
347     if(selection!=null)\r
348      {\r
349        fontSizeMenuItem.setText(selection);\r
350        SetFont();\r
351      }\r
352   }\r
353 \r
354   public void fontStyleMenuItem_actionPerformed(ActionEvent e)\r
355   {\r
356     String selection = JOptionPane.showInternalInputDialog(this,\r
357                                 "Select font style",\r
358                                 "Font style",\r
359                                 JOptionPane.QUESTION_MESSAGE,\r
360                                 null, new String[]{"plain", "bold", "italic"}\r
361                                 ,fontStyleMenuItem.getText()).toString();\r
362     if(selection!=null)\r
363     {\r
364       fontStyleMenuItem.setText(selection);\r
365       SetFont();\r
366     }\r
367 \r
368   }\r
369 \r
370   protected void colourTextMenuItem_actionPerformed(ActionEvent e)\r
371   {\r
372       viewport.setColourText( colourTextMenuItem.isSelected() );\r
373       alignPanel.RefreshPanels();\r
374   }\r
375 \r
376   void SetFont()\r
377   {\r
378       int style = java.awt.Font.PLAIN;\r
379       if(fontStyleMenuItem.getText().equals("bold"))\r
380         style = java.awt.Font.BOLD;\r
381       else if(fontStyleMenuItem.getText().equals("italic"))\r
382         style = java.awt.Font.ITALIC;\r
383 \r
384       viewport.setFont(new java.awt.Font(fontNameMenuItem.getText(),\r
385                                            style,\r
386                                            Integer.parseInt(fontSizeMenuItem.getText())));\r
387       alignPanel.RefreshPanels();\r
388 \r
389   }\r
390 \r
391   protected void wrapMenuItem_actionPerformed(ActionEvent e)\r
392   {\r
393     viewport.setWrapAlignment( wrapMenuItem.isSelected() );\r
394     alignPanel.RefreshPanels();\r
395   }\r
396 \r
397 \r
398   public void viewBoxesMenuItem_actionPerformed(ActionEvent e)\r
399   {\r
400     viewport.setShowBoxes( viewBoxesMenuItem.isSelected() );\r
401     alignPanel.RefreshPanels();\r
402   }\r
403 \r
404   public void viewTextMenuItem_actionPerformed(ActionEvent e)\r
405   {\r
406     viewport.setShowText( viewTextMenuItem.isSelected() );\r
407     alignPanel.RefreshPanels();\r
408   }\r
409 \r
410 \r
411   protected void renderGapsMenuItem_actionPerformed(ActionEvent e)\r
412   {\r
413     viewport.setRenderGaps(renderGapsMenuItem.isSelected());\r
414     alignPanel.RefreshPanels();\r
415   }\r
416 \r
417 \r
418   public void consensusGraphMenuItem_actionPerformed(ActionEvent e)\r
419   {\r
420     alignPanel.setGraphPanelVisible( consensusGraphMenuItem.isSelected() );\r
421   }\r
422 \r
423   public void overviewMenuItem_actionPerformed(ActionEvent e)\r
424   {\r
425 \r
426     JInternalFrame frame = new JInternalFrame();\r
427     OverviewPanel overview = alignPanel.getOverviewPanel();\r
428    try{\r
429      overview = new OverviewPanel(alignPanel, viewport);\r
430      frame.setContentPane(overview);\r
431     Desktop.addInternalFrame(frame, "Overview " + this.getTitle(),\r
432                              frame.getWidth(), frame.getHeight());\r
433     frame.pack();\r
434     frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()\r
435     { public void internalFrameClosed(javax.swing.event.InternalFrameEvent evt)\r
436       {\r
437             alignPanel.setOverviewPanel(null);\r
438       };\r
439     });\r
440     alignPanel.setOverviewPanel( overview );\r
441 \r
442   }catch(java.lang.OutOfMemoryError ex)\r
443    {\r
444      JOptionPane.showInternalMessageDialog(this, "Sequence alignment too large to\nproduce overview image!!"\r
445                                    +"\nTry reducing the font size.",\r
446                                    "Out of memory", JOptionPane.WARNING_MESSAGE);\r
447    }\r
448 \r
449 \r
450   }\r
451 \r
452   protected void noColourmenuItem_actionPerformed(ActionEvent e)\r
453   {\r
454     viewport.setGlobalColourScheme( null );\r
455     changeColour();\r
456   }\r
457 \r
458 \r
459   public void clustalColour_actionPerformed(ActionEvent e)\r
460   {\r
461     viewport.setGlobalColourScheme(new ClustalxColourScheme( ));\r
462     changeColour();\r
463   }\r
464 \r
465   public void zappoColour_actionPerformed(ActionEvent e)\r
466   {\r
467     viewport.setGlobalColourScheme(new ZappoColourScheme() );\r
468     changeColour();\r
469   }\r
470 \r
471   public void taylorColour_actionPerformed(ActionEvent e)\r
472   {\r
473     viewport.setGlobalColourScheme(new TaylorColourScheme() );\r
474     changeColour();\r
475   }\r
476 \r
477 \r
478   public void hydrophobicityColour_actionPerformed(ActionEvent e)\r
479   {\r
480     viewport.setGlobalColourScheme( new HydrophobicColourScheme() );\r
481     changeColour();\r
482   }\r
483 \r
484   public void helixColour_actionPerformed(ActionEvent e)\r
485   {\r
486     viewport.setGlobalColourScheme( new HelixColourScheme()  );\r
487     changeColour();\r
488   }\r
489 \r
490 \r
491   public void strandColour_actionPerformed(ActionEvent e)\r
492   {\r
493     viewport.setGlobalColourScheme(new StrandColourScheme() );\r
494     changeColour();\r
495   }\r
496 \r
497 \r
498   public void turnColour_actionPerformed(ActionEvent e)\r
499   {\r
500     viewport.setGlobalColourScheme(new TurnColourScheme() );\r
501     changeColour();\r
502   }\r
503 \r
504 \r
505   public void buriedColour_actionPerformed(ActionEvent e)\r
506   {\r
507     viewport.setGlobalColourScheme( new BuriedColourScheme() );\r
508     changeColour();\r
509   }\r
510 \r
511   void changeColour()\r
512   {\r
513     if(abovePIDThreshold.isSelected())\r
514     {\r
515       abovePIDThreshold_actionPerformed(null);\r
516       alignPanel.setColourScheme( );\r
517     }\r
518     else if(conservationMenuItem.isSelected())\r
519       conservationMenuItem_actionPerformed(null);\r
520     else\r
521       alignPanel.setColourScheme( );\r
522 \r
523   }\r
524 \r
525   protected  void conservationMenuItem_actionPerformed(ActionEvent e)\r
526   {\r
527     viewport.setConservationSelected(conservationMenuItem.isSelected());\r
528 \r
529     alignPanel.setColourScheme();\r
530     ColourSchemeI oldCs = viewport.getGlobalColourScheme();\r
531 \r
532     if(conservationMenuItem.isSelected())\r
533     {\r
534       if(sliderPanel!=null)\r
535       {\r
536         sliderPanel.cs = oldCs;\r
537       }\r
538 \r
539       else\r
540       {\r
541         sliderPanel = new SliderPanel(alignPanel, 30, true,\r
542                                       viewport.getGlobalColourScheme());\r
543         JInternalFrame frame = new JInternalFrame();\r
544         frame.setContentPane(sliderPanel);\r
545         Desktop.addInternalFrame(frame, "Conservation Colour Increment", 400,\r
546                                  90);\r
547         frame.setMaximizable(false);\r
548         frame.setResizable(false);\r
549         frame.addInternalFrameListener(new javax.swing.event.\r
550                                        InternalFrameAdapter()\r
551         {\r
552           public void internalFrameClosed(javax.swing.event.InternalFrameEvent\r
553                                           evt)\r
554           {\r
555             sliderPanel = null;\r
556           };\r
557         });\r
558       }\r
559     }\r
560     else\r
561     {\r
562         if(oldCs instanceof ConservationColourScheme)\r
563         {\r
564           ConservationColourScheme ccs = (ConservationColourScheme)oldCs;\r
565           viewport.setGlobalColourScheme( ccs.cs );\r
566         }\r
567         alignPanel.setColourScheme();\r
568     }\r
569 \r
570   }\r
571 \r
572   SliderPanel sliderPanel;\r
573   public void abovePIDThreshold_actionPerformed(ActionEvent e)\r
574   {\r
575     ColourSchemeI oldCs = viewport.getGlobalColourScheme();\r
576     int threshold = 0;\r
577 \r
578     if(abovePIDThreshold.isSelected())\r
579     {\r
580       if(sliderPanel!=null)\r
581         sliderPanel.cs = oldCs;\r
582 \r
583       else\r
584       {\r
585         sliderPanel = new SliderPanel(alignPanel, 70, false, oldCs);\r
586         JInternalFrame frame = new JInternalFrame();\r
587         frame.setContentPane(sliderPanel);\r
588         Desktop.addInternalFrame(frame, "Percentage Identity Threshold", 400,\r
589                                  90);\r
590         frame.setMaximizable(false);\r
591         frame.setResizable(false);\r
592         frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()\r
593         {\r
594           public void internalFrameClosed(javax.swing.event.InternalFrameEvent evt)\r
595           {\r
596             sliderPanel = null;\r
597           };\r
598         });\r
599 \r
600       }\r
601 \r
602       threshold = sliderPanel.getValue();\r
603     }\r
604 \r
605     if (oldCs instanceof ResidueColourScheme)\r
606     {\r
607       ResidueColourScheme rcs = (ResidueColourScheme) oldCs;\r
608       rcs.setThreshold(threshold);\r
609     }\r
610     else if (oldCs instanceof ScoreColourScheme)\r
611     {\r
612       ScoreColourScheme scs = (ScoreColourScheme) oldCs;\r
613       scs.setThreshold(threshold);\r
614     }\r
615 \r
616     alignPanel.setColourScheme();\r
617 \r
618   }\r
619 \r
620 \r
621 \r
622   public void userDefinedColour_actionPerformed(ActionEvent e)\r
623   {\r
624     JInternalFrame frame = new JInternalFrame();\r
625     UserDefinedColours chooser = new UserDefinedColours( frame, alignPanel, null);\r
626     frame.setContentPane(chooser);\r
627     Desktop.addInternalFrame(frame,"User defined colours", 450,540 );\r
628     frame.setResizable(false);\r
629     frame.setIconifiable(false);\r
630     frame.setMaximizable(false);\r
631   }\r
632 \r
633   public void PIDColour_actionPerformed(ActionEvent e)\r
634   {\r
635     viewport.setGlobalColourScheme( new PIDColourScheme() );\r
636     alignPanel.setColourScheme( );\r
637   }\r
638 \r
639 \r
640   public void BLOSUM62Colour_actionPerformed(ActionEvent e)\r
641   {\r
642     viewport.setGlobalColourScheme( new Blosum62ColourScheme(viewport)  );\r
643     alignPanel.setColourScheme();\r
644   }\r
645 \r
646 \r
647 \r
648   protected void schemeKeyMenuItem_actionPerformed(ActionEvent e)\r
649   {\r
650     ColourKey colourKey = new ColourKey( viewport.getGlobalColourScheme() );\r
651     Desktop.addInternalFrame(colourKey, "Colour scheme key", 400, 320);\r
652   }\r
653 \r
654 \r
655   public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)\r
656   {\r
657     addHistoryItem("sort");\r
658     AlignmentSorter.sortByPID(viewport.getAlignment(), viewport.getAlignment().getSequenceAt(0));\r
659     alignPanel.RefreshPanels();\r
660   }\r
661 \r
662   public void sortIDMenuItem_actionPerformed(ActionEvent e)\r
663   {\r
664     addHistoryItem("sort");\r
665     AlignmentSorter.sortByID( viewport.getAlignment() );\r
666     alignPanel.RefreshPanels();\r
667   }\r
668 \r
669   public void sortGroupMenuItem_actionPerformed(ActionEvent e)\r
670   {\r
671     addHistoryItem("sort");\r
672     AlignmentSorter.sortByGroup(viewport.getAlignment());\r
673     AlignmentSorter.sortGroups(viewport.getAlignment());\r
674     alignPanel.RefreshPanels();\r
675   }\r
676 \r
677   public void sortTreeOrderMenuItem_actionPerformed(ActionEvent e)\r
678   {\r
679     addHistoryItem("sort");\r
680     if(viewport.getCurrentTree()==null)\r
681       return;\r
682 \r
683     AlignmentSorter.sortByTree(viewport.getAlignment(), viewport.getCurrentTree());\r
684     alignPanel.RefreshPanels();\r
685   }\r
686 \r
687   public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)\r
688   {\r
689     RedundancyPanel sp = new RedundancyPanel(alignPanel);\r
690     JInternalFrame frame = new JInternalFrame();\r
691     frame.setContentPane(sp);\r
692     Desktop.addInternalFrame(frame, "Redundancy threshold selection", 400, 100);\r
693     frame.setMaximizable(false);\r
694     frame.setResizable(false);\r
695 \r
696   }\r
697 \r
698   public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)\r
699   {\r
700     if(viewport.getSelection().size()<2)\r
701       JOptionPane.showInternalMessageDialog(this, "You must select at least 2 sequences.", "Invalid Selection", JOptionPane.WARNING_MESSAGE);\r
702     else\r
703     {\r
704       JInternalFrame frame = new JInternalFrame();\r
705       frame.setContentPane(new PairwiseAlignPanel(viewport));\r
706       Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);\r
707     }\r
708   }\r
709 \r
710   public void PCAMenuItem_actionPerformed(ActionEvent e)\r
711   {\r
712     if( (viewport.getSelection().size()<4 && viewport.getSelection().size()>0)\r
713        || viewport.getAlignment().getHeight()<4)\r
714     {\r
715       JOptionPane.showInternalMessageDialog(this, "Principal component analysis must take\n"\r
716                                     +"at least 4 input sequences.",\r
717                                     "Sequence selection insufficient",\r
718                                     JOptionPane.WARNING_MESSAGE);\r
719       return;\r
720     }\r
721 \r
722     try{\r
723       PCAPanel pcaPanel = new PCAPanel(viewport, null);\r
724       JInternalFrame frame = new JInternalFrame();\r
725       frame.setContentPane(pcaPanel);\r
726       Desktop.addInternalFrame(frame, "Principal component analysis", 400, 400);\r
727    }catch(java.lang.OutOfMemoryError ex)\r
728    {\r
729      JOptionPane.showInternalMessageDialog(this, "Too many sequences selected\nfor Principal Component Analysis!!",\r
730                                    "Out of memory", JOptionPane.WARNING_MESSAGE);\r
731    }\r
732 \r
733 \r
734   }\r
735 \r
736   public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)\r
737   {\r
738     NewTreePanel("AV", "PID", "Average distance tree using PID");\r
739   }\r
740 \r
741   public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)\r
742   {\r
743     NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");\r
744   }\r
745 \r
746 \r
747   protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)\r
748   {\r
749     NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");\r
750   }\r
751 \r
752   protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)\r
753   {\r
754     NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62PID");\r
755   }\r
756 \r
757   void NewTreePanel(String type, String pwType, String title)\r
758   {\r
759     JInternalFrame frame = new javax.swing.JInternalFrame();\r
760     TreePanel tp=null;\r
761    if (viewport.getSelection() != null && viewport.getSelection().size() > 3)\r
762    {\r
763      tp = new TreePanel(viewport, viewport.getSelection().asVector(),type, pwType,\r
764                          viewport.getStartRes(), viewport.getEndRes());\r
765    }\r
766    else\r
767    {\r
768      tp = new TreePanel(viewport, viewport.getAlignment().getSequences(),\r
769                          type, pwType, viewport.getStartRes(),\r
770                          viewport.getEndRes());\r
771    }\r
772 \r
773    frame.setContentPane(tp);\r
774    Desktop.addInternalFrame(frame, title, 600, 500);\r
775   }\r
776 \r
777 \r
778 \r
779   public void clustalAlignMenuItem_actionPerformed(ActionEvent e)\r
780   {\r
781     JOptionPane.showInternalMessageDialog(this, "Jalview is currently being reengineered"\r
782                                   +"\nwithin the Barton Group, Dundee University."\r
783                                   +"\nThis will be available as a web service 2005",\r
784                                   "Web service", JOptionPane.INFORMATION_MESSAGE);\r
785   }\r
786 \r
787   public void pdbTest_actionPerformed(ActionEvent e)\r
788   {\r
789    String reply = JOptionPane.showInternalInputDialog(this, "Enter pdb code", "PDB test viewer", JOptionPane.QUESTION_MESSAGE);\r
790 \r
791    String url = "http://www.ebi.ac.uk/cgi-bin/pdbfetch?id=1a4u";\r
792    if (reply.length()>1)\r
793      url = "http://www.ebi.ac.uk/cgi-bin/pdbfetch?id="+reply;\r
794 \r
795    try\r
796    {\r
797      PDBfile pdb = new PDBfile(url,\r
798                                "URL");\r
799     Sequence seq = (Sequence)viewport.getAlignment().getSequenceAt(0);\r
800     seq.setPDBfile(pdb);\r
801      ( (PDBChain) pdb.chains.elementAt(seq.maxchain)).isVisible = true;\r
802      ( (PDBChain) pdb.chains.elementAt(seq.maxchain)).sequence = seq;\r
803   // ( (PDBChain) pdb.chains.elementAt(seq.maxchain)).colourBySequence();\r
804 \r
805      rotCanvas rc = new rotCanvas(pdb);\r
806      JInternalFrame frame = new JInternalFrame();\r
807      frame.setContentPane(rc);\r
808      Desktop.addInternalFrame(frame, url, 400,400);\r
809    }\r
810    catch (Exception ex)\r
811    {\r
812      ex.printStackTrace();\r
813    }\r
814 \r
815   }\r
816 \r
817 \r
818   public void doKeyPressed(KeyEvent evt)\r
819   {\r
820 \r
821     System.out.println(evt.getKeyChar());\r
822     if(evt.isControlDown() && evt.getKeyChar()=='f')\r
823       findMenuItem_actionPerformed(null);\r
824 \r
825   }\r
826 \r
827 \r
828 }\r