SequenceFeature display added
[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 jalview.ws.*;\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 import jalview.datamodel.SequenceI;\r
27 \r
28 public class AlignFrame extends GAlignFrame\r
29 {\r
30   final AlignmentPanel alignPanel;\r
31   final AlignViewport viewport;\r
32   public AlignFrame(AlignmentI al)\r
33   {\r
34     super();\r
35 \r
36     AlignmentUtil.addUniprotFeatures(al);\r
37 \r
38     viewport = new AlignViewport(al,true,true,true,false);\r
39     alignPanel = new AlignmentPanel(this, viewport);\r
40     getContentPane().add(alignPanel, java.awt.BorderLayout.CENTER);\r
41     fontNameMenuItem.setText(viewport.getFont().getName());\r
42     fontSizeMenuItem.setText(viewport.getFont().getSize()+"");\r
43   }\r
44 \r
45   protected void saveAs_actionPerformed(ActionEvent e)\r
46   {\r
47     JFileChooser chooser = new JFileChooser(jalview.bin.Cache.LAST_DIRECTORY);\r
48     chooser.setDialogTitle("Save Alignment to file - "+e.getActionCommand() +" format.");\r
49     chooser.setToolTipText("Save");\r
50     int value = chooser.showSaveDialog(this);\r
51     if(value == JFileChooser.APPROVE_OPTION)\r
52     {\r
53       String choice =  chooser.getSelectedFile().getPath();\r
54       jalview.bin.Cache.LAST_DIRECTORY = choice;\r
55       String output = FormatAdapter.get(e.getActionCommand(), viewport.getAlignment().getSequences());\r
56       try{\r
57         java.io.PrintWriter out = new java.io.PrintWriter( new java.io.FileWriter( choice )  );\r
58         out.println(output);\r
59         out.close();\r
60       }\r
61       catch(Exception ex){}\r
62     }\r
63 \r
64   }\r
65 \r
66   protected void outputText_actionPerformed(ActionEvent e)\r
67   {\r
68      CutAndPasteTransfer cap = new CutAndPasteTransfer(false);\r
69      JInternalFrame frame = new JInternalFrame();\r
70      cap.formatForOutput();\r
71      frame.setContentPane(cap);\r
72      Desktop.addInternalFrame(frame, "Alignment output - "+e.getActionCommand(), 600, 500);\r
73      cap.setText( FormatAdapter.get(e.getActionCommand(), viewport.getAlignment().getSequences()));\r
74   }\r
75 \r
76   protected void htmlMenuItem_actionPerformed(ActionEvent e)\r
77   {\r
78     HTMLOutput htmlOutput = new HTMLOutput(viewport);\r
79     htmlOutput = null;\r
80   }\r
81 \r
82   public void printMenuItem_actionPerformed(ActionEvent e)\r
83   {\r
84     //Putting in a thread avoids Swing painting problems\r
85     PrintThread thread = new PrintThread();\r
86     thread.start();\r
87   }\r
88 \r
89   class PrintThread extends Thread\r
90   {\r
91     public void run()\r
92     {\r
93       PrinterJob printJob = PrinterJob.getPrinterJob();\r
94       PageFormat pf = printJob.pageDialog(printJob.defaultPage());\r
95       printJob.setPrintable(alignPanel, pf);\r
96       if (printJob.printDialog())\r
97       {\r
98         try\r
99         {\r
100           printJob.print();\r
101         }\r
102         catch (Exception PrintException)\r
103         {\r
104           PrintException.printStackTrace();\r
105         }\r
106       }\r
107     }\r
108 \r
109   }\r
110 \r
111 \r
112 \r
113 \r
114   public void closeMenuItem_actionPerformed(ActionEvent e)\r
115   {\r
116     try{\r
117       this.setClosed(true);\r
118     }catch(Exception ex){}\r
119   }\r
120 \r
121   ArrayList  historyList = new ArrayList();\r
122   ArrayList redoList = new ArrayList();\r
123 \r
124   void updateEditMenuBar()\r
125   {\r
126     if(historyList.size()>0)\r
127      {\r
128        undoMenuItem.setEnabled(true);\r
129        Object [] history = (Object[])historyList.get(0);\r
130        undoMenuItem.setText("Undo "+history[0]);\r
131      }\r
132     else\r
133     {\r
134       undoMenuItem.setEnabled(false);\r
135       undoMenuItem.setText("Undo");\r
136     }\r
137 \r
138     if(redoList.size()>0)\r
139      {\r
140        redoMenuItem.setEnabled(true);\r
141        Object [] history = (Object[])redoList.get(0);\r
142        redoMenuItem.setText("Redo "+history[0]);\r
143      }\r
144     else\r
145     {\r
146       redoMenuItem.setEnabled(false);\r
147       redoMenuItem.setText("Redo");\r
148     }\r
149   }\r
150 \r
151   public void addHistoryItem(String type)\r
152   {\r
153     // must make sure we add new sequence objects her, not refs to the existing sequences\r
154     redoList.clear();\r
155     SequenceI[] seq = new SequenceI[viewport.getAlignment().getHeight()];\r
156     for(int i=0; i<viewport.getAlignment().getHeight(); i++)\r
157     {\r
158       seq[i] = new Sequence( viewport.getAlignment().getSequenceAt(i).getName(),\r
159                              viewport.getAlignment().getSequenceAt(i).getSequence());\r
160     }\r
161 \r
162     historyList.add(0, new Object[]{type,  seq} );\r
163     updateEditMenuBar();\r
164   }\r
165 \r
166   protected void undoMenuItem_actionPerformed(ActionEvent e)\r
167   {\r
168     Object [] history = (Object[])historyList.remove(0);\r
169     // add the redo state before continuing!!\r
170     SequenceI[] seq = new SequenceI[viewport.getAlignment().getHeight()];\r
171     for (int i = 0; i < viewport.getAlignment().getHeight(); i++)\r
172     {\r
173       seq[i] = new Sequence(viewport.getAlignment().getSequenceAt(i).getName(),\r
174                             viewport.getAlignment().getSequenceAt(i).\r
175                             getSequence());\r
176     }\r
177     /////////\r
178 \r
179     redoList.add(0, new Object[] {history[0], seq});\r
180 \r
181       seq = (SequenceI[]) history[1];\r
182       viewport.setAlignment( new Alignment(seq) );\r
183       updateEditMenuBar();\r
184       alignPanel.RefreshPanels();\r
185   }\r
186 \r
187 \r
188   protected void redoMenuItem_actionPerformed(ActionEvent e)\r
189   {\r
190      Object [] history = (Object[])redoList.remove(0);\r
191      SequenceI[] seq = (SequenceI[]) history[1];\r
192      viewport.setAlignment( new Alignment(seq) );\r
193      updateEditMenuBar();\r
194      alignPanel.RefreshPanels();\r
195   }\r
196 \r
197 \r
198   public void groupsMenuItem_actionPerformed(ActionEvent e)\r
199   {\r
200     GroupEditor geditor = new GroupEditor(viewport, alignPanel);\r
201     JInternalFrame frame = new JInternalFrame();\r
202     frame.setContentPane(geditor);\r
203     Desktop.addInternalFrame(frame, "Group editor", 710, 410);\r
204     frame.setResizable(false);\r
205   }\r
206 \r
207   protected void deleteGroups_actionPerformed(ActionEvent e)\r
208   {\r
209     viewport.alignment.deleteAllGroups();\r
210     viewport.getSelection().clear();\r
211 \r
212     alignPanel.RefreshPanels();\r
213   }\r
214 \r
215 \r
216 \r
217   public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)\r
218   {\r
219     Selection sel = viewport.getSelection();\r
220     for (int i=0; i<viewport.getAlignment().getSequences().size(); i++)\r
221       sel.addElement( viewport.getAlignment().getSequenceAt(i));\r
222     PaintRefresher.Refresh(null);\r
223   }\r
224 \r
225   public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)\r
226   {\r
227     viewport.setRubberbandGroup(null);\r
228     viewport.getSelection().clear();\r
229     PaintRefresher.Refresh(null);\r
230   }\r
231 \r
232   public void invertSequenceMenuItem_actionPerformed(ActionEvent e)\r
233   {\r
234     Selection sel = viewport.getSelection();\r
235     for (int i=0; i<viewport.getAlignment().getSequences().size(); i++)\r
236     {\r
237       if (sel.contains(viewport.getAlignment().getSequenceAt(i)))\r
238         sel.removeElement(viewport.getAlignment().getSequenceAt(i));\r
239       else\r
240         sel.addElement(viewport.getAlignment().getSequenceAt(i));\r
241     }\r
242     PaintRefresher.Refresh(null);\r
243   }\r
244 \r
245 \r
246   public void deselectAllColumnsMenuItem_actionPerformed(ActionEvent e)\r
247   {\r
248     viewport.getColumnSelection().clear();\r
249     repaint();\r
250   }\r
251 \r
252   public void remove2LeftMenuItem_actionPerformed(ActionEvent e)\r
253   {\r
254     addHistoryItem("delete columns");\r
255     ColumnSelection colSel = viewport.getColumnSelection();\r
256     if (colSel.size() > 0)\r
257     {\r
258       int min = colSel.getMin();\r
259       viewport.getAlignment().trimLeft(min);\r
260       colSel.compensateForEdit(0,min);\r
261       alignPanel.RefreshPanels();\r
262     }\r
263   }\r
264 \r
265   public void remove2RightMenuItem_actionPerformed(ActionEvent e)\r
266   {\r
267     addHistoryItem("delete columns");\r
268     ColumnSelection colSel = viewport.getColumnSelection();\r
269     if (colSel.size() > 0)\r
270     {\r
271       int max = colSel.getMax();\r
272       if(max>1)\r
273         viewport.getAlignment().trimRight(max);\r
274 \r
275       alignPanel.RefreshPanels();\r
276     }\r
277 \r
278   }\r
279 \r
280   public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)\r
281   {\r
282     addHistoryItem("delete gapped columns");\r
283     viewport.getAlignment().removeGaps();\r
284     alignPanel.RefreshPanels();\r
285   }\r
286 \r
287   public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)\r
288   {\r
289     addHistoryItem("delete all gaps");\r
290     SequenceI current;\r
291     int jSize;\r
292     for (int i=0; i < viewport.getAlignment().getSequences().size();i++)\r
293     {\r
294       current = viewport.getAlignment().getSequenceAt(i);\r
295       jSize = current.getLength();\r
296       for (int j=0; j < jSize; j++)\r
297         if(jalview.util.Comparison.isGap(current.getCharAt(j)))\r
298         {\r
299           current.deleteCharAt(j);\r
300           j--;\r
301           jSize--;\r
302         }\r
303     }\r
304 \r
305     alignPanel.RefreshPanels();\r
306   }\r
307 \r
308   public void setGapCharMenuItem_actionPerformed(ActionEvent e)\r
309   {\r
310     char thisChar = '-';\r
311     char nextChar = '.';\r
312     if(viewport.getGapCharacter()=='-')\r
313     {\r
314       thisChar = '.';\r
315       nextChar = '-';\r
316     }\r
317     setGapCharMenuItem.setText("Set gap character to \""+nextChar+"\"");\r
318     viewport.setGapCharacter(thisChar);\r
319     alignPanel.RefreshPanels();\r
320   }\r
321 \r
322   public void findMenuItem_actionPerformed(ActionEvent e)\r
323   {\r
324     JOptionPane op = new JOptionPane();\r
325     JInternalFrame frame =  op.createInternalFrame(this, "Find");\r
326     Finder finder = new Finder(viewport, alignPanel, frame);\r
327     frame.setClosable(true);\r
328     frame.setContentPane(finder);\r
329     frame.setSize(340,110);\r
330     frame.setVisible(true);\r
331   }\r
332 \r
333 \r
334 \r
335   public void fontNameMenuItem_actionPerformed(ActionEvent e)\r
336   {\r
337     String fonts[] = java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();\r
338 \r
339 \r
340     String selection = JOptionPane.showInternalInputDialog(this,\r
341                                 "Select font",\r
342                                 "Font selection",\r
343                                 JOptionPane.QUESTION_MESSAGE,\r
344                                 null,fonts\r
345                                 ,fontNameMenuItem.getText()).toString();\r
346     if(selection!=null)\r
347     {\r
348        fontNameMenuItem.setText(selection);\r
349        SetFont();\r
350      }\r
351 \r
352   }\r
353 \r
354   public void fontSizeMenuItem_actionPerformed(ActionEvent e)\r
355   {\r
356     String selection = JOptionPane.showInternalInputDialog(this,\r
357                                 "Select font size",\r
358                                 "Font size",\r
359                                 JOptionPane.QUESTION_MESSAGE,\r
360                                 null, new String[]{"1","2","4","6","8","10","12","14","16","18","20"}\r
361                                 ,fontSizeMenuItem.getText()).toString();\r
362     if(selection!=null)\r
363      {\r
364        fontSizeMenuItem.setText(selection);\r
365        SetFont();\r
366      }\r
367   }\r
368 \r
369   public void fontStyleMenuItem_actionPerformed(ActionEvent e)\r
370   {\r
371     String selection = JOptionPane.showInternalInputDialog(this,\r
372                                 "Select font style",\r
373                                 "Font style",\r
374                                 JOptionPane.QUESTION_MESSAGE,\r
375                                 null, new String[]{"plain", "bold", "italic"}\r
376                                 ,fontStyleMenuItem.getText()).toString();\r
377     if(selection!=null)\r
378     {\r
379       fontStyleMenuItem.setText(selection);\r
380       SetFont();\r
381     }\r
382 \r
383   }\r
384 \r
385   protected void colourTextMenuItem_actionPerformed(ActionEvent e)\r
386   {\r
387       viewport.setColourText( colourTextMenuItem.isSelected() );\r
388       alignPanel.RefreshPanels();\r
389   }\r
390 \r
391   void SetFont()\r
392   {\r
393       int style = java.awt.Font.PLAIN;\r
394       if(fontStyleMenuItem.getText().equals("bold"))\r
395         style = java.awt.Font.BOLD;\r
396       else if(fontStyleMenuItem.getText().equals("italic"))\r
397         style = java.awt.Font.ITALIC;\r
398 \r
399       viewport.setFont(new java.awt.Font(fontNameMenuItem.getText(),\r
400                                            style,\r
401                                            Integer.parseInt(fontSizeMenuItem.getText())));\r
402       alignPanel.RefreshPanels();\r
403 \r
404   }\r
405 \r
406   protected void wrapMenuItem_actionPerformed(ActionEvent e)\r
407   {\r
408     viewport.setWrapAlignment( wrapMenuItem.isSelected() );\r
409     alignPanel.setWrapAlignment( wrapMenuItem.isSelected() );\r
410   }\r
411 \r
412 \r
413   public void viewBoxesMenuItem_actionPerformed(ActionEvent e)\r
414   {\r
415     viewport.setShowBoxes( viewBoxesMenuItem.isSelected() );\r
416     alignPanel.RefreshPanels();\r
417   }\r
418 \r
419   public void viewTextMenuItem_actionPerformed(ActionEvent e)\r
420   {\r
421     viewport.setShowText( viewTextMenuItem.isSelected() );\r
422     alignPanel.RefreshPanels();\r
423   }\r
424 \r
425 \r
426   protected void renderGapsMenuItem_actionPerformed(ActionEvent e)\r
427   {\r
428     viewport.setRenderGaps(renderGapsMenuItem.isSelected());\r
429     alignPanel.RefreshPanels();\r
430   }\r
431 \r
432   public void sequenceFeatures_actionPerformed(ActionEvent evt)\r
433   {\r
434     viewport.showSequenceFeatures(sequenceFeatures.isSelected());\r
435     alignPanel.RefreshPanels();\r
436   }\r
437 \r
438   public void consensusGraphMenuItem_actionPerformed(ActionEvent e)\r
439   {\r
440     alignPanel.setGraphPanelVisible( consensusGraphMenuItem.isSelected() );\r
441   }\r
442 \r
443   public void overviewMenuItem_actionPerformed(ActionEvent e)\r
444   {\r
445     if (alignPanel.overviewPanel != null)\r
446       return;\r
447 \r
448     JInternalFrame frame = new JInternalFrame();\r
449     OverviewPanel overview = alignPanel.getOverviewPanel();\r
450    try{\r
451      overview = new OverviewPanel(alignPanel, viewport);\r
452      frame.setContentPane(overview);\r
453     Desktop.addInternalFrame(frame, "Overview " + this.getTitle(),\r
454                              frame.getWidth(), frame.getHeight());\r
455     frame.pack();\r
456     frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()\r
457     { public void internalFrameClosed(javax.swing.event.InternalFrameEvent evt)\r
458       {\r
459             alignPanel.setOverviewPanel(null);\r
460       };\r
461     });\r
462     alignPanel.setOverviewPanel( overview );\r
463 \r
464   }catch(java.lang.OutOfMemoryError ex)\r
465    {\r
466      JOptionPane.showInternalMessageDialog(this, "Sequence alignment too large to\nproduce overview image!!"\r
467                                    +"\nTry reducing the font size.",\r
468                                    "Out of memory", JOptionPane.WARNING_MESSAGE);\r
469    }\r
470 \r
471 \r
472   }\r
473 \r
474   protected void noColourmenuItem_actionPerformed(ActionEvent e)\r
475   {\r
476     viewport.setGlobalColourScheme( null );\r
477     changeColour();\r
478   }\r
479 \r
480 \r
481   public void clustalColour_actionPerformed(ActionEvent e)\r
482   {\r
483     viewport.setGlobalColourScheme(\r
484       new ClustalxColourScheme(viewport.alignment.getSequences(), viewport.alignment.getWidth()));\r
485     abovePIDThreshold.setSelected(false);\r
486     changeColour();\r
487   }\r
488 \r
489   public void zappoColour_actionPerformed(ActionEvent e)\r
490   {\r
491     viewport.setGlobalColourScheme(new ZappoColourScheme() );\r
492     changeColour();\r
493   }\r
494 \r
495   public void taylorColour_actionPerformed(ActionEvent e)\r
496   {\r
497     viewport.setGlobalColourScheme(new TaylorColourScheme() );\r
498     changeColour();\r
499   }\r
500 \r
501 \r
502   public void hydrophobicityColour_actionPerformed(ActionEvent e)\r
503   {\r
504     viewport.setGlobalColourScheme( new HydrophobicColourScheme() );\r
505     changeColour();\r
506   }\r
507 \r
508   public void helixColour_actionPerformed(ActionEvent e)\r
509   {\r
510     viewport.setGlobalColourScheme( new HelixColourScheme()  );\r
511     changeColour();\r
512   }\r
513 \r
514 \r
515   public void strandColour_actionPerformed(ActionEvent e)\r
516   {\r
517     viewport.setGlobalColourScheme(new StrandColourScheme() );\r
518     changeColour();\r
519   }\r
520 \r
521 \r
522   public void turnColour_actionPerformed(ActionEvent e)\r
523   {\r
524     viewport.setGlobalColourScheme(new TurnColourScheme() );\r
525     changeColour();\r
526   }\r
527 \r
528 \r
529   public void buriedColour_actionPerformed(ActionEvent e)\r
530   {\r
531     viewport.setGlobalColourScheme( new BuriedColourScheme() );\r
532     changeColour();\r
533   }\r
534 \r
535   public void nucleotideColour_actionPerformed(ActionEvent e)\r
536   {\r
537     viewport.setGlobalColourScheme( new NucleotideColourScheme() );\r
538     changeColour();\r
539   }\r
540 \r
541 \r
542   void changeColour()\r
543   {\r
544     if(abovePIDThreshold.isSelected())\r
545       abovePIDThreshold_actionPerformed(null);\r
546     else if(conservationMenuItem.isSelected())\r
547       conservationMenuItem_actionPerformed(null);\r
548 \r
549     alignPanel.RefreshPanels();\r
550   }\r
551 \r
552 \r
553   protected  void conservationMenuItem_actionPerformed(ActionEvent e)\r
554   {\r
555    if(abovePIDThreshold.isSelected())\r
556    {\r
557      abovePIDThreshold.setSelected(false);\r
558      Desktop.hidePIDSlider();\r
559    }\r
560 \r
561    viewport.setConservationSelected(conservationMenuItem.isSelected());\r
562 \r
563    ColourSchemeI oldCs = viewport.getGlobalColourScheme();\r
564 \r
565    ConservationColourScheme ccs = null;\r
566    if (oldCs instanceof ConservationColourScheme)\r
567          ccs = (ConservationColourScheme) oldCs;\r
568 \r
569        if (conservationMenuItem.isSelected())\r
570        {\r
571          Alignment al = (Alignment) viewport.alignment;\r
572          Conservation c = new Conservation("All",\r
573                                            ResidueProperties.propHash, 3,\r
574                                            al.getSequences(), 0,\r
575                                            al.getWidth());\r
576 \r
577          c.calculate();\r
578          c.verdict(false, 100);\r
579 \r
580          if (ccs != null)\r
581            ccs = new ConservationColourScheme(c, ccs.cs);\r
582          else\r
583            ccs = new ConservationColourScheme(c, oldCs);\r
584 \r
585 \r
586          int threshold = Desktop.setConservationSliderSource(alignPanel, ccs, "Background");\r
587 \r
588          ccs.inc = threshold;\r
589 \r
590          if (ccs.cs instanceof ResidueColourScheme)\r
591            ((ResidueColourScheme) ccs.cs).setThreshold(0);\r
592          else if (ccs.cs instanceof ScoreColourScheme)\r
593            ((ScoreColourScheme)ccs.cs).setThreshold(0);\r
594 \r
595          viewport.setGlobalColourScheme(ccs);\r
596 \r
597 \r
598        }\r
599        else if (oldCs instanceof ConservationColourScheme)\r
600        {\r
601          /// ie, if we remove ConservationColourScheme from backgroundColour\r
602          oldCs = ccs.cs;\r
603          viewport.setGlobalColourScheme(oldCs);\r
604          Desktop.hideConservationSlider();\r
605        }\r
606 \r
607        if(e!=null)\r
608          alignPanel.RefreshPanels();\r
609   }\r
610 \r
611 \r
612   public void abovePIDThreshold_actionPerformed(ActionEvent e)\r
613   {\r
614       if(conservationMenuItem.isSelected())\r
615         conservationMenuItem.setSelected(false);\r
616 \r
617       ColourSchemeI oldCs = viewport.getGlobalColourScheme();\r
618       int threshold = 0;\r
619       if (oldCs instanceof ConservationColourScheme)\r
620      {\r
621        ConservationColourScheme ccs = (ConservationColourScheme) oldCs;\r
622        oldCs = ccs.cs;\r
623      }\r
624 \r
625      if(abovePIDThreshold.isSelected())\r
626      {\r
627        threshold = Desktop.setPIDSliderSource(alignPanel, oldCs, "Background");\r
628        Desktop.hideConservationSlider();\r
629      }\r
630      else\r
631        Desktop.hidePIDSlider();\r
632 \r
633       if (oldCs instanceof ResidueColourScheme)\r
634           ((ResidueColourScheme) oldCs).setThreshold(threshold);\r
635       else if (oldCs instanceof ScoreColourScheme)\r
636           ((ScoreColourScheme)oldCs).setThreshold(threshold);\r
637 \r
638     viewport.setGlobalColourScheme(oldCs);\r
639      if(e!=null)\r
640         alignPanel.RefreshPanels();\r
641   }\r
642 \r
643 \r
644 \r
645   public void userDefinedColour_actionPerformed(ActionEvent e)\r
646   {\r
647     JInternalFrame frame = new JInternalFrame();\r
648     UserDefinedColours chooser = new UserDefinedColours( frame, alignPanel, null);\r
649     frame.setContentPane(chooser);\r
650     Desktop.addInternalFrame(frame,"User defined colours", 450,540 );\r
651     frame.setResizable(false);\r
652     frame.setIconifiable(false);\r
653     frame.setMaximizable(false);\r
654   }\r
655 \r
656   public void PIDColour_actionPerformed(ActionEvent e)\r
657   {\r
658     viewport.setGlobalColourScheme( new PIDColourScheme() );\r
659     alignPanel.setColourScheme( );\r
660   }\r
661 \r
662 \r
663   public void BLOSUM62Colour_actionPerformed(ActionEvent e)\r
664   {\r
665     viewport.setGlobalColourScheme( new Blosum62ColourScheme(viewport)  );\r
666     changeColour();\r
667   }\r
668 \r
669 \r
670 \r
671   public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)\r
672   {\r
673     addHistoryItem("sort");\r
674     AlignmentSorter.sortByPID(viewport.getAlignment(), viewport.getAlignment().getSequenceAt(0));\r
675     alignPanel.RefreshPanels();\r
676   }\r
677 \r
678   public void sortIDMenuItem_actionPerformed(ActionEvent e)\r
679   {\r
680     addHistoryItem("sort");\r
681     AlignmentSorter.sortByID( viewport.getAlignment() );\r
682     alignPanel.RefreshPanels();\r
683   }\r
684 \r
685   public void sortGroupMenuItem_actionPerformed(ActionEvent e)\r
686   {\r
687     addHistoryItem("sort");\r
688     AlignmentSorter.sortByGroup(viewport.getAlignment());\r
689     AlignmentSorter.sortGroups(viewport.getAlignment());\r
690     alignPanel.RefreshPanels();\r
691   }\r
692 \r
693   public void sortTreeOrderMenuItem_actionPerformed(ActionEvent e)\r
694   {\r
695     addHistoryItem("sort");\r
696     if(viewport.getCurrentTree()==null)\r
697       return;\r
698 \r
699     AlignmentSorter.sortByTree(viewport.getAlignment(), viewport.getCurrentTree());\r
700     alignPanel.RefreshPanels();\r
701   }\r
702 \r
703   public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)\r
704   {\r
705     RedundancyPanel sp = new RedundancyPanel(alignPanel);\r
706     JInternalFrame frame = new JInternalFrame();\r
707     frame.setContentPane(sp);\r
708     Desktop.addInternalFrame(frame, "Redundancy threshold selection", 400, 100);\r
709     frame.setMaximizable(false);\r
710     frame.setResizable(false);\r
711 \r
712   }\r
713 \r
714   public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)\r
715   {\r
716     if(viewport.getSelection().size()<2)\r
717       JOptionPane.showInternalMessageDialog(this, "You must select at least 2 sequences.", "Invalid Selection", JOptionPane.WARNING_MESSAGE);\r
718     else\r
719     {\r
720       JInternalFrame frame = new JInternalFrame();\r
721       frame.setContentPane(new PairwiseAlignPanel(viewport));\r
722       Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);\r
723     }\r
724   }\r
725 \r
726   public void PCAMenuItem_actionPerformed(ActionEvent e)\r
727   {\r
728     if( (viewport.getSelection().size()<4 && viewport.getSelection().size()>0)\r
729        || viewport.getAlignment().getHeight()<4)\r
730     {\r
731       JOptionPane.showInternalMessageDialog(this, "Principal component analysis must take\n"\r
732                                     +"at least 4 input sequences.",\r
733                                     "Sequence selection insufficient",\r
734                                     JOptionPane.WARNING_MESSAGE);\r
735       return;\r
736     }\r
737 \r
738     try{\r
739       PCAPanel pcaPanel = new PCAPanel(viewport, null);\r
740       JInternalFrame frame = new JInternalFrame();\r
741       frame.setContentPane(pcaPanel);\r
742       Desktop.addInternalFrame(frame, "Principal component analysis", 400, 400);\r
743    }catch(java.lang.OutOfMemoryError ex)\r
744    {\r
745      JOptionPane.showInternalMessageDialog(this, "Too many sequences selected\nfor Principal Component Analysis!!",\r
746                                    "Out of memory", JOptionPane.WARNING_MESSAGE);\r
747    }\r
748 \r
749 \r
750   }\r
751 \r
752   public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)\r
753   {\r
754     NewTreePanel("AV", "PID", "Average distance tree using PID");\r
755   }\r
756 \r
757   public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)\r
758   {\r
759     NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");\r
760   }\r
761 \r
762 \r
763   protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)\r
764   {\r
765     NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");\r
766   }\r
767 \r
768   protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)\r
769   {\r
770     NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62PID");\r
771   }\r
772 \r
773   void NewTreePanel(String type, String pwType, String title)\r
774   {\r
775     JInternalFrame frame = new javax.swing.JInternalFrame();\r
776     TreePanel tp=null;\r
777    if (viewport.getSelection() != null && viewport.getSelection().size() > 3)\r
778    {\r
779      tp = new TreePanel(viewport, viewport.getSelection().asVector(),type, pwType,\r
780                          viewport.getStartRes(), viewport.getEndRes());\r
781    }\r
782    else\r
783    {\r
784      tp = new TreePanel(viewport, viewport.getAlignment().getSequences(),\r
785                          type, pwType, viewport.getStartRes(),\r
786                          viewport.getEndRes());\r
787    }\r
788 \r
789    frame.setContentPane(tp);\r
790    Desktop.addInternalFrame(frame, title, 600, 500);\r
791   }\r
792 \r
793 \r
794 \r
795 \r
796   public void clustalAlignMenuItem_actionPerformed(ActionEvent e)\r
797   {\r
798     JInternalFrame frame = new JInternalFrame();\r
799     ClustalThread ct = new ClustalThread(frame);\r
800     Thread t = new Thread(ct);\r
801     t.start();\r
802     frame.setContentPane(ct);\r
803      Desktop.addInternalFrame(frame, title, 300, 80);\r
804 \r
805   }\r
806 \r
807   class ClustalThread extends JPanel implements Runnable\r
808   {\r
809     Image [] image;\r
810     int imageIndex = 0;\r
811     boolean webServiceRunning = false;\r
812     JInternalFrame frame;\r
813     public ClustalThread(JInternalFrame frame)\r
814     {\r
815       this.frame = frame;\r
816       image = new Image[9];\r
817       for(int i=0; i<9; i++)\r
818       {\r
819         java.net.URL url = getClass().getResource("/dna" + (i+1) + ".gif");\r
820         if (url != null)\r
821         {\r
822           image[i] = java.awt.Toolkit.getDefaultToolkit().createImage(url);\r
823           MediaTracker mt = new MediaTracker(this);\r
824           mt.addImage(image[i], i);\r
825           try{mt.waitForID(i);}\r
826           catch(Exception ex){}\r
827         }\r
828       }\r
829       DNATwirler twirler = new DNATwirler();\r
830       twirler.start();\r
831       webServiceRunning = true;\r
832     }\r
833 \r
834     class DNATwirler extends Thread\r
835     {\r
836       public void run()\r
837       {\r
838         while(webServiceRunning)\r
839         {\r
840           try{\r
841             Thread.sleep(100);\r
842             imageIndex++;\r
843             imageIndex %=9;\r
844             repaint();\r
845           }\r
846           catch(Exception ex){}\r
847         }\r
848       }\r
849     }\r
850 \r
851     // JBPNote\r
852     // Should check to see if the server settings are valid\r
853     // Need visual-delay indication here.\r
854     public void run()\r
855        {\r
856          jalview.ws.Jemboss jemboss = new jalview.ws.Jemboss();\r
857          Vector sv = viewport.getAlignment().getSequences();\r
858          SequenceI[] seqs = new SequenceI[sv.size()];\r
859 \r
860          int i = 0;\r
861          do\r
862          {\r
863            seqs[i] = (SequenceI) sv.elementAt(i);\r
864          }\r
865          while (++i < sv.size());\r
866 \r
867          SequenceI[] alignment = jemboss.clustalW(seqs); // gaps removed within method\r
868 \r
869          if (alignment != null)\r
870          {\r
871            AlignFrame af = new AlignFrame(new Alignment(alignment));\r
872           af.clustalColour.setSelected(true);\r
873           af.clustalColour_actionPerformed(null);\r
874            Desktop.addInternalFrame(af, getTitle().concat(" - ClustalW Alignment"),\r
875                                     700, 500); // JBPNote - is there a new window geom. property ?\r
876          }\r
877          else\r
878            JOptionPane.showMessageDialog(Desktop.desktop, "Problem obtaining clustal alignment", "Web service error",\r
879                                          JOptionPane.WARNING_MESSAGE);\r
880 \r
881          webServiceRunning = false;\r
882          try{\r
883            frame.setClosed(true);\r
884          }catch(Exception ex){}\r
885        }\r
886 \r
887        public void paintComponent(Graphics g)\r
888        {\r
889          g.setColor(Color.white);\r
890          g.fillRect(0,0,getWidth(), getHeight());\r
891          if(image!=null)\r
892          {\r
893            g.drawImage(image[imageIndex],10,10,this);\r
894          }\r
895          g.setFont(new Font("Arial", Font.BOLD, 12));\r
896          g.setColor(Color.black);\r
897          g.drawString("Clustal Alignment Web Service running", 30,30);\r
898        }\r
899   }\r
900 \r
901 \r
902   public void doKeyPressed(KeyEvent evt)\r
903   {\r
904     if(evt.isControlDown() && evt.getKeyChar()=='f')\r
905       findMenuItem_actionPerformed(null);\r
906   }\r
907 \r
908 \r
909 }\r