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