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