delete gaps bug fixed
[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     alignPanel.setColourScheme();\r
456   }\r
457 \r
458 \r
459   public void clustalColour_actionPerformed(ActionEvent e)\r
460   {\r
461     viewport.setGlobalColourScheme(new ClustalxColourScheme( ));\r
462     alignPanel.setColourScheme(  );\r
463   }\r
464 \r
465   public void zappoColour_actionPerformed(ActionEvent e)\r
466   {\r
467     viewport.setGlobalColourScheme(new ZappoColourScheme() );\r
468     alignPanel.setColourScheme(  );\r
469   }\r
470 \r
471   public void taylorColour_actionPerformed(ActionEvent e)\r
472   {\r
473     viewport.setGlobalColourScheme(new TaylorColourScheme() );\r
474     alignPanel.setColourScheme(  );\r
475   }\r
476 \r
477 \r
478   public void hydrophobicityColour_actionPerformed(ActionEvent e)\r
479   {\r
480     viewport.setGlobalColourScheme( new HydrophobicColourScheme() );\r
481     alignPanel.setColourScheme( );\r
482   }\r
483 \r
484   public void helixColour_actionPerformed(ActionEvent e)\r
485   {\r
486     viewport.setGlobalColourScheme( new HelixColourScheme()  );\r
487     alignPanel.setColourScheme();\r
488   }\r
489 \r
490 \r
491   public void strandColour_actionPerformed(ActionEvent e)\r
492   {\r
493     viewport.setGlobalColourScheme(new StrandColourScheme() );\r
494     alignPanel.setColourScheme(  );\r
495   }\r
496 \r
497 \r
498   public void turnColour_actionPerformed(ActionEvent e)\r
499   {\r
500     viewport.setGlobalColourScheme(new TurnColourScheme() );\r
501     alignPanel.setColourScheme(  );\r
502   }\r
503 \r
504 \r
505   public void buriedColour_actionPerformed(ActionEvent e)\r
506   {\r
507     viewport.setGlobalColourScheme( new BuriedColourScheme() );\r
508     alignPanel.setColourScheme( );\r
509   }\r
510 \r
511 \r
512   protected  void conservationMenuItem_actionPerformed(ActionEvent e)\r
513   {\r
514     viewport.setConservationSelected(conservationMenuItem.isSelected());\r
515     alignPanel.setColourScheme();\r
516 \r
517     if(conservationMenuItem.isSelected())\r
518     {\r
519       SliderPanel sp = new SliderPanel(alignPanel, 30, true, viewport.getGlobalColourScheme());\r
520       JInternalFrame frame = new JInternalFrame();\r
521       frame.setContentPane(sp);\r
522       Desktop.addInternalFrame(frame, "Conservation Colour Increment", 400, 90);\r
523       frame.setMaximizable(false);\r
524       frame.setResizable(false);\r
525     }\r
526   }\r
527 \r
528 \r
529   public void abovePIDThreshold_actionPerformed(ActionEvent e)\r
530   {\r
531     if(abovePIDThreshold.isSelected())\r
532     {\r
533       SliderPanel sp = new SliderPanel(alignPanel, 70, false,\r
534                                        viewport.getGlobalColourScheme());\r
535       JInternalFrame frame = new JInternalFrame();\r
536       frame.setContentPane(sp);\r
537       Desktop.addInternalFrame(frame, "Percentage Identity Threshold", 400, 90);\r
538       frame.setMaximizable(false);\r
539       frame.setResizable(false);\r
540     }\r
541   }\r
542 \r
543 \r
544   public void userDefinedColour_actionPerformed(ActionEvent e)\r
545   {\r
546     JInternalFrame frame = new JInternalFrame();\r
547     UserDefinedColours chooser = new UserDefinedColours( frame, alignPanel, null);\r
548     frame.setContentPane(chooser);\r
549     Desktop.addInternalFrame(frame,"User defined colours", 450,540 );\r
550     frame.setResizable(false);\r
551     frame.setIconifiable(false);\r
552     frame.setMaximizable(false);\r
553   }\r
554 \r
555   public void PIDColour_actionPerformed(ActionEvent e)\r
556   {\r
557     viewport.setGlobalColourScheme( new PIDColourScheme() );\r
558     alignPanel.setColourScheme( );\r
559   }\r
560 \r
561 \r
562   public void BLOSUM62Colour_actionPerformed(ActionEvent e)\r
563   {\r
564     viewport.setGlobalColourScheme( new Blosum62ColourScheme(viewport)  );\r
565     alignPanel.setColourScheme();\r
566   }\r
567 \r
568 \r
569 \r
570   protected void schemeKeyMenuItem_actionPerformed(ActionEvent e)\r
571   {\r
572     ColourKey colourKey = new ColourKey( viewport.getGlobalColourScheme() );\r
573     Desktop.addInternalFrame(colourKey, "Colour scheme key", 400, 320);\r
574   }\r
575 \r
576 \r
577   public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)\r
578   {\r
579     addHistoryItem("sort");\r
580     AlignmentSorter.sortByPID(viewport.getAlignment(), viewport.getAlignment().getSequenceAt(0));\r
581     alignPanel.RefreshPanels();\r
582   }\r
583 \r
584   public void sortIDMenuItem_actionPerformed(ActionEvent e)\r
585   {\r
586     addHistoryItem("sort");\r
587     AlignmentSorter.sortByID( viewport.getAlignment() );\r
588     alignPanel.RefreshPanels();\r
589   }\r
590 \r
591   public void sortGroupMenuItem_actionPerformed(ActionEvent e)\r
592   {\r
593     addHistoryItem("sort");\r
594     AlignmentSorter.sortByGroup(viewport.getAlignment());\r
595     AlignmentSorter.sortGroups(viewport.getAlignment());\r
596     alignPanel.RefreshPanels();\r
597   }\r
598 \r
599   public void sortTreeOrderMenuItem_actionPerformed(ActionEvent e)\r
600   {\r
601     addHistoryItem("sort");\r
602     if(viewport.getCurrentTree()==null)\r
603       return;\r
604 \r
605     AlignmentSorter.sortByTree(viewport.getAlignment(), viewport.getCurrentTree());\r
606     alignPanel.RefreshPanels();\r
607   }\r
608 \r
609   public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)\r
610   {\r
611     RedundancyPanel sp = new RedundancyPanel(alignPanel);\r
612     JInternalFrame frame = new JInternalFrame();\r
613     frame.setContentPane(sp);\r
614     Desktop.addInternalFrame(frame, "Redundancy threshold selection", 400, 100);\r
615     frame.setMaximizable(false);\r
616     frame.setResizable(false);\r
617 \r
618   }\r
619 \r
620   public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)\r
621   {\r
622     if(viewport.getSelection().size()<2)\r
623       JOptionPane.showInternalMessageDialog(this, "You must select at least 2 sequences.", "Invalid Selection", JOptionPane.WARNING_MESSAGE);\r
624     else\r
625     {\r
626       JInternalFrame frame = new JInternalFrame();\r
627       frame.setContentPane(new PairwiseAlignPanel(viewport));\r
628       Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);\r
629     }\r
630   }\r
631 \r
632   public void PCAMenuItem_actionPerformed(ActionEvent e)\r
633   {\r
634     if( (viewport.getSelection().size()<4 && viewport.getSelection().size()>0)\r
635        || viewport.getAlignment().getHeight()<4)\r
636     {\r
637       JOptionPane.showInternalMessageDialog(this, "Principal component analysis must take\n"\r
638                                     +"at least 4 input sequences.",\r
639                                     "Sequence selection insufficient",\r
640                                     JOptionPane.WARNING_MESSAGE);\r
641       return;\r
642     }\r
643 \r
644     try{\r
645       PCAPanel pcaPanel = new PCAPanel(viewport, null);\r
646       JInternalFrame frame = new JInternalFrame();\r
647       frame.setContentPane(pcaPanel);\r
648       Desktop.addInternalFrame(frame, "Principal component analysis", 400, 400);\r
649    }catch(java.lang.OutOfMemoryError ex)\r
650    {\r
651      JOptionPane.showInternalMessageDialog(this, "Too many sequences selected\nfor Principal Component Analysis!!",\r
652                                    "Out of memory", JOptionPane.WARNING_MESSAGE);\r
653    }\r
654 \r
655 \r
656   }\r
657 \r
658   public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)\r
659   {\r
660     NewTreePanel("AV", "PID", "Average distance tree using PID");\r
661   }\r
662 \r
663   public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)\r
664   {\r
665     NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");\r
666   }\r
667 \r
668 \r
669   protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)\r
670   {\r
671     NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");\r
672   }\r
673 \r
674   protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)\r
675   {\r
676     NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62PID");\r
677   }\r
678 \r
679   void NewTreePanel(String type, String pwType, String title)\r
680   {\r
681     JInternalFrame frame = new javax.swing.JInternalFrame();\r
682     TreePanel tp=null;\r
683    if (viewport.getSelection() != null && viewport.getSelection().size() > 3)\r
684    {\r
685      tp = new TreePanel(viewport, viewport.getSelection().asVector(),type, pwType,\r
686                          viewport.getStartRes(), viewport.getEndRes());\r
687    }\r
688    else\r
689    {\r
690      tp = new TreePanel(viewport, viewport.getAlignment().getSequences(),\r
691                          type, pwType, viewport.getStartRes(),\r
692                          viewport.getEndRes());\r
693    }\r
694 \r
695    frame.setContentPane(tp);\r
696    Desktop.addInternalFrame(frame, title, 600, 500);\r
697   }\r
698 \r
699 \r
700 \r
701   public void clustalAlignMenuItem_actionPerformed(ActionEvent e)\r
702   {\r
703     JOptionPane.showInternalMessageDialog(this, "Jalview is currently being reengineered"\r
704                                   +"\nwithin the Barton Group, Dundee University."\r
705                                   +"\nThis will be available as a web service 2005",\r
706                                   "Web service", JOptionPane.INFORMATION_MESSAGE);\r
707   }\r
708 \r
709   public void pdbTest_actionPerformed(ActionEvent e)\r
710   {\r
711    String reply = JOptionPane.showInternalInputDialog(this, "Enter pdb code", "PDB test viewer", JOptionPane.QUESTION_MESSAGE);\r
712 \r
713    String url = "http://www.ebi.ac.uk/cgi-bin/pdbfetch?id=1a4u";\r
714    if (reply.length()>1)\r
715      url = "http://www.ebi.ac.uk/cgi-bin/pdbfetch?id="+reply;\r
716 \r
717    try\r
718    {\r
719      PDBfile pdb = new PDBfile(url,\r
720                                "URL");\r
721     Sequence seq = (Sequence)viewport.getAlignment().getSequenceAt(0);\r
722     seq.setPDBfile(pdb);\r
723      ( (PDBChain) pdb.chains.elementAt(seq.maxchain)).isVisible = true;\r
724      ( (PDBChain) pdb.chains.elementAt(seq.maxchain)).sequence = seq;\r
725   // ( (PDBChain) pdb.chains.elementAt(seq.maxchain)).colourBySequence();\r
726 \r
727      rotCanvas rc = new rotCanvas(pdb);\r
728      JInternalFrame frame = new JInternalFrame();\r
729      frame.setContentPane(rc);\r
730      Desktop.addInternalFrame(frame, url, 400,400);\r
731    }\r
732    catch (Exception ex)\r
733    {\r
734      ex.printStackTrace();\r
735    }\r
736 \r
737   }\r
738 \r
739 \r
740   public void doKeyPressed(KeyEvent evt)\r
741   {\r
742 \r
743     System.out.println(evt.getKeyChar());\r
744     if(evt.isControlDown() && evt.getKeyChar()=='f')\r
745       findMenuItem_actionPerformed(null);\r
746 \r
747   }\r
748 \r
749 \r
750 }\r