Fix overviewPanel bugs
[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 \r
206   public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)\r
207   {\r
208     Selection sel = viewport.getSelection();\r
209     for (int i=0; i<viewport.getAlignment().getSequences().size(); i++)\r
210       sel.addElement( viewport.getAlignment().getSequenceAt(i));\r
211     PaintRefresher.Refresh(null);\r
212   }\r
213 \r
214   public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)\r
215   {\r
216     viewport.getSelection().clear();\r
217     PaintRefresher.Refresh(null);\r
218   }\r
219 \r
220   public void invertSequenceMenuItem_actionPerformed(ActionEvent e)\r
221   {\r
222     Selection sel = viewport.getSelection();\r
223     for (int i=0; i<viewport.getAlignment().getSequences().size(); i++)\r
224     {\r
225       if (sel.contains(viewport.getAlignment().getSequenceAt(i)))\r
226         sel.removeElement(viewport.getAlignment().getSequenceAt(i));\r
227       else\r
228         sel.addElement(viewport.getAlignment().getSequenceAt(i));\r
229     }\r
230     PaintRefresher.Refresh(null);\r
231   }\r
232 \r
233 \r
234   public void deselectAllColumnsMenuItem_actionPerformed(ActionEvent e)\r
235   {\r
236     viewport.getColumnSelection().clear();\r
237     repaint();\r
238   }\r
239 \r
240   public void remove2LeftMenuItem_actionPerformed(ActionEvent e)\r
241   {\r
242     addHistoryItem("delete columns");\r
243     ColumnSelection colSel = viewport.getColumnSelection();\r
244     if (colSel.size() > 0)\r
245     {\r
246       int min = colSel.getMin();\r
247       viewport.getAlignment().trimLeft(min);\r
248       colSel.compensateForEdit(0,min);\r
249       alignPanel.RefreshPanels();\r
250     }\r
251   }\r
252 \r
253   public void remove2RightMenuItem_actionPerformed(ActionEvent e)\r
254   {\r
255     addHistoryItem("delete columns");\r
256     ColumnSelection colSel = viewport.getColumnSelection();\r
257     if (colSel.size() > 0)\r
258     {\r
259       int max = colSel.getMax();\r
260       if(max>1)\r
261         viewport.getAlignment().trimRight(max);\r
262 \r
263       alignPanel.RefreshPanels();\r
264     }\r
265 \r
266   }\r
267 \r
268   public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)\r
269   {\r
270     addHistoryItem("delete gapped columns");\r
271     viewport.getAlignment().removeGaps();\r
272     alignPanel.RefreshPanels();\r
273   }\r
274 \r
275   public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)\r
276   {\r
277     addHistoryItem("delete all gaps");\r
278     SequenceI current;\r
279     int jSize;\r
280     for (int i=0; i < viewport.getAlignment().getSequences().size();i++)\r
281     {\r
282       current = viewport.getAlignment().getSequenceAt(i);\r
283       jSize = current.getLength();\r
284       for (int j=0; j < jSize; j++)\r
285         if(jalview.util.Comparison.isGap(current.getCharAt(j)))\r
286         {\r
287           current.deleteCharAt(j);\r
288           j--;\r
289           jSize--;\r
290         }\r
291     }\r
292 \r
293     alignPanel.RefreshPanels();\r
294   }\r
295 \r
296   public void setGapCharMenuItem_actionPerformed(ActionEvent e)\r
297   {\r
298     char thisChar = '-';\r
299     char nextChar = '.';\r
300     if(viewport.getGapCharacter()=='-')\r
301     {\r
302       thisChar = '.';\r
303       nextChar = '-';\r
304     }\r
305     setGapCharMenuItem.setText("Set gap character to \""+nextChar+"\"");\r
306     viewport.setGapCharacter(thisChar);\r
307     alignPanel.RefreshPanels();\r
308   }\r
309 \r
310   public void findMenuItem_actionPerformed(ActionEvent e)\r
311   {\r
312     JOptionPane op = new JOptionPane();\r
313     JInternalFrame frame =  op.createInternalFrame(this, "Find");\r
314     Finder finder = new Finder(viewport, alignPanel, frame);\r
315     frame.setContentPane(finder);\r
316     frame.setSize(300,110);\r
317     frame.setVisible(true);\r
318   }\r
319 \r
320 \r
321 \r
322   public void fontNameMenuItem_actionPerformed(ActionEvent e)\r
323   {\r
324     String fonts[] = java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();\r
325 \r
326 \r
327     String selection = JOptionPane.showInternalInputDialog(this,\r
328                                 "Select font",\r
329                                 "Font selection",\r
330                                 JOptionPane.QUESTION_MESSAGE,\r
331                                 null,fonts\r
332                                 ,fontNameMenuItem.getText()).toString();\r
333     if(selection!=null)\r
334     {\r
335        fontNameMenuItem.setText(selection);\r
336        SetFont();\r
337      }\r
338 \r
339   }\r
340 \r
341   public void fontSizeMenuItem_actionPerformed(ActionEvent e)\r
342   {\r
343     String selection = JOptionPane.showInternalInputDialog(this,\r
344                                 "Select font size",\r
345                                 "Font size",\r
346                                 JOptionPane.QUESTION_MESSAGE,\r
347                                 null, new String[]{"1","2","4","6","8","10","12","14","16","18","20"}\r
348                                 ,fontSizeMenuItem.getText()).toString();\r
349     if(selection!=null)\r
350      {\r
351        fontSizeMenuItem.setText(selection);\r
352        SetFont();\r
353      }\r
354   }\r
355 \r
356   public void fontStyleMenuItem_actionPerformed(ActionEvent e)\r
357   {\r
358     String selection = JOptionPane.showInternalInputDialog(this,\r
359                                 "Select font style",\r
360                                 "Font style",\r
361                                 JOptionPane.QUESTION_MESSAGE,\r
362                                 null, new String[]{"plain", "bold", "italic"}\r
363                                 ,fontStyleMenuItem.getText()).toString();\r
364     if(selection!=null)\r
365     {\r
366       fontStyleMenuItem.setText(selection);\r
367       SetFont();\r
368     }\r
369 \r
370   }\r
371 \r
372   protected void colourTextMenuItem_actionPerformed(ActionEvent e)\r
373   {\r
374       viewport.setColourText( colourTextMenuItem.isSelected() );\r
375       alignPanel.RefreshPanels();\r
376   }\r
377 \r
378   void SetFont()\r
379   {\r
380       int style = java.awt.Font.PLAIN;\r
381       if(fontStyleMenuItem.getText().equals("bold"))\r
382         style = java.awt.Font.BOLD;\r
383       else if(fontStyleMenuItem.getText().equals("italic"))\r
384         style = java.awt.Font.ITALIC;\r
385 \r
386       viewport.setFont(new java.awt.Font(fontNameMenuItem.getText(),\r
387                                            style,\r
388                                            Integer.parseInt(fontSizeMenuItem.getText())));\r
389       alignPanel.RefreshPanels();\r
390 \r
391   }\r
392 \r
393   protected void wrapMenuItem_actionPerformed(ActionEvent e)\r
394   {\r
395     viewport.setWrapAlignment( wrapMenuItem.isSelected() );\r
396     alignPanel.RefreshPanels();\r
397   }\r
398 \r
399 \r
400   public void viewBoxesMenuItem_actionPerformed(ActionEvent e)\r
401   {\r
402     viewport.setShowBoxes( viewBoxesMenuItem.isSelected() );\r
403     alignPanel.RefreshPanels();\r
404   }\r
405 \r
406   public void viewTextMenuItem_actionPerformed(ActionEvent e)\r
407   {\r
408     viewport.setShowText( viewTextMenuItem.isSelected() );\r
409     alignPanel.RefreshPanels();\r
410   }\r
411 \r
412 \r
413   protected void renderGapsMenuItem_actionPerformed(ActionEvent e)\r
414   {\r
415     viewport.setRenderGaps(renderGapsMenuItem.isSelected());\r
416     alignPanel.RefreshPanels();\r
417   }\r
418 \r
419   public void secondaryStructure_actionPerformed(ActionEvent evt)\r
420   {\r
421     alignPanel.setSecondaryStructureVisible(secondaryStructure.isSelected());\r
422   }\r
423 \r
424   public void consensusGraphMenuItem_actionPerformed(ActionEvent e)\r
425   {\r
426     alignPanel.setGraphPanelVisible( consensusGraphMenuItem.isSelected() );\r
427   }\r
428 \r
429   public void overviewMenuItem_actionPerformed(ActionEvent e)\r
430   {\r
431     if (alignPanel.overviewPanel != null)\r
432       return;\r
433 \r
434     JInternalFrame frame = new JInternalFrame();\r
435     OverviewPanel overview = alignPanel.getOverviewPanel();\r
436    try{\r
437      overview = new OverviewPanel(alignPanel, viewport);\r
438      frame.setContentPane(overview);\r
439     Desktop.addInternalFrame(frame, "Overview " + this.getTitle(),\r
440                              frame.getWidth(), frame.getHeight());\r
441     frame.pack();\r
442     frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()\r
443     { public void internalFrameClosed(javax.swing.event.InternalFrameEvent evt)\r
444       {\r
445             alignPanel.setOverviewPanel(null);\r
446       };\r
447     });\r
448     alignPanel.setOverviewPanel( overview );\r
449 \r
450   }catch(java.lang.OutOfMemoryError ex)\r
451    {\r
452      JOptionPane.showInternalMessageDialog(this, "Sequence alignment too large to\nproduce overview image!!"\r
453                                    +"\nTry reducing the font size.",\r
454                                    "Out of memory", JOptionPane.WARNING_MESSAGE);\r
455    }\r
456 \r
457 \r
458   }\r
459 \r
460   protected void noColourmenuItem_actionPerformed(ActionEvent e)\r
461   {\r
462     viewport.setGlobalColourScheme( null );\r
463     changeColour();\r
464   }\r
465 \r
466 \r
467   public void Colour_actionPerformed(ActionEvent e)\r
468   {\r
469     viewport.setGlobalColourScheme(new ClustalxColourScheme( ));\r
470     conservationMenuItem.setSelected(false);\r
471     abovePIDThreshold.setSelected(false);\r
472     changeColour();\r
473   }\r
474 \r
475   public void zappoColour_actionPerformed(ActionEvent e)\r
476   {\r
477     viewport.setGlobalColourScheme(new ZappoColourScheme() );\r
478     changeColour();\r
479   }\r
480 \r
481   public void taylorColour_actionPerformed(ActionEvent e)\r
482   {\r
483     viewport.setGlobalColourScheme(new TaylorColourScheme() );\r
484     changeColour();\r
485   }\r
486 \r
487 \r
488   public void hydrophobicityColour_actionPerformed(ActionEvent e)\r
489   {\r
490     viewport.setGlobalColourScheme( new HydrophobicColourScheme() );\r
491     changeColour();\r
492   }\r
493 \r
494   public void helixColour_actionPerformed(ActionEvent e)\r
495   {\r
496     viewport.setGlobalColourScheme( new HelixColourScheme()  );\r
497     changeColour();\r
498   }\r
499 \r
500 \r
501   public void strandColour_actionPerformed(ActionEvent e)\r
502   {\r
503     viewport.setGlobalColourScheme(new StrandColourScheme() );\r
504     changeColour();\r
505   }\r
506 \r
507 \r
508   public void turnColour_actionPerformed(ActionEvent e)\r
509   {\r
510     viewport.setGlobalColourScheme(new TurnColourScheme() );\r
511     changeColour();\r
512   }\r
513 \r
514 \r
515   public void buriedColour_actionPerformed(ActionEvent e)\r
516   {\r
517     viewport.setGlobalColourScheme( new BuriedColourScheme() );\r
518     changeColour();\r
519   }\r
520 \r
521   void changeColour()\r
522   {\r
523     if(abovePIDThreshold.isSelected())\r
524       abovePIDThreshold_actionPerformed(null);\r
525     else if(conservationMenuItem.isSelected())\r
526       conservationMenuItem_actionPerformed(null);\r
527 \r
528 \r
529      alignPanel.RefreshPanels();\r
530   }\r
531 \r
532   void addConservationOrPIDColour()\r
533   {\r
534     int x=0, y=0, threshold = 70;\r
535 \r
536     if(sliderFrame!=null)\r
537        try\r
538        {\r
539          x = sliderFrame.getX();\r
540          y = sliderFrame.getY();\r
541          SliderPanel sp = (SliderPanel) sliderFrame.getContentPane();\r
542          threshold = sp.getValue();\r
543          sliderFrame.setClosed(true);\r
544        }\r
545        catch (Exception ex)\r
546        {    ex.printStackTrace();   }\r
547 \r
548      ColourSchemeI oldCs = viewport.getGlobalColourScheme();\r
549 \r
550      ConservationColourScheme ccs = null;\r
551      if (oldCs instanceof ConservationColourScheme)\r
552        ccs = (ConservationColourScheme) oldCs;\r
553 \r
554      if(conservationMenuItem.isSelected())\r
555      {\r
556        Alignment al = (Alignment)viewport.alignment;\r
557        Conservation c = new Conservation("All",\r
558                             ResidueProperties.propHash, 3, al.getSequences(), 0,\r
559                             al.getWidth() );\r
560 \r
561        c.calculate();\r
562        c.verdict(false, 100);\r
563 \r
564        if(ccs!=null)\r
565          ccs = new ConservationColourScheme(c, ccs.cs);\r
566        else\r
567          ccs = new ConservationColourScheme(c, oldCs);\r
568 \r
569         viewport.setGlobalColourScheme( ccs );\r
570 \r
571      }\r
572      else if(oldCs instanceof ConservationColourScheme)\r
573      {\r
574        oldCs = ccs.cs;\r
575        viewport.setGlobalColourScheme( oldCs );\r
576      }\r
577 \r
578 \r
579      if( conservationMenuItem.isSelected() || abovePIDThreshold.isSelected() )\r
580      {\r
581        sliderFrame = new JInternalFrame();\r
582        sliderFrame.setMaximizable(false);\r
583        sliderFrame.setResizable(false);\r
584 \r
585        SliderPanel sp = null;\r
586        if (conservationMenuItem.isSelected())\r
587        {\r
588         if(threshold > 50)\r
589           threshold = 30;\r
590         sp = new SliderPanel(alignPanel, threshold, true,ccs);\r
591         Desktop.addInternalFrame(sliderFrame, "Conservation Colour Increment  (Global colour)", 400, 90);\r
592         threshold = 0;\r
593        }\r
594        else if (abovePIDThreshold.isSelected())\r
595        {\r
596          sp = new SliderPanel(alignPanel, threshold, false, oldCs);\r
597          sp.cs = oldCs;\r
598          Desktop.addInternalFrame(sliderFrame, "Percentage Identity Threshold (Global colour)", 400, 90);\r
599        }\r
600 \r
601        sliderFrame.setContentPane(sp);\r
602        if(x!=0 && y!=0)\r
603                sliderFrame.setLocation(x,y);\r
604 \r
605      }\r
606      else\r
607        threshold = 0;\r
608 \r
609 \r
610      if (oldCs instanceof ResidueColourScheme)\r
611      {\r
612        ResidueColourScheme rcs = (ResidueColourScheme) oldCs;\r
613        rcs.setThreshold(threshold);\r
614      }\r
615      else if (oldCs instanceof ScoreColourScheme)\r
616      {\r
617        ScoreColourScheme scs = (ScoreColourScheme) oldCs;\r
618        scs.setThreshold(threshold);\r
619      }\r
620 \r
621 \r
622   }\r
623 \r
624   protected  void conservationMenuItem_actionPerformed(ActionEvent e)\r
625   {\r
626    if(abovePIDThreshold.isSelected())\r
627     abovePIDThreshold.setSelected(false);\r
628 \r
629    viewport.setConservationSelected(conservationMenuItem.isSelected());\r
630 \r
631    addConservationOrPIDColour();\r
632   }\r
633 \r
634   JInternalFrame sliderFrame;\r
635   public void abovePIDThreshold_actionPerformed(ActionEvent e)\r
636   {\r
637       if(conservationMenuItem.isSelected())\r
638         conservationMenuItem.setSelected(false);\r
639 \r
640       addConservationOrPIDColour();\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     alignPanel.setColourScheme();\r
667   }\r
668 \r
669 \r
670 \r
671   protected void schemeKeyMenuItem_actionPerformed(ActionEvent e)\r
672   {\r
673     ColourKey colourKey = new ColourKey( viewport.getGlobalColourScheme() );\r
674     Desktop.addInternalFrame(colourKey, "Colour scheme key", 400, 320);\r
675   }\r
676 \r
677 \r
678   public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)\r
679   {\r
680     addHistoryItem("sort");\r
681     AlignmentSorter.sortByPID(viewport.getAlignment(), viewport.getAlignment().getSequenceAt(0));\r
682     alignPanel.RefreshPanels();\r
683   }\r
684 \r
685   public void sortIDMenuItem_actionPerformed(ActionEvent e)\r
686   {\r
687     addHistoryItem("sort");\r
688     AlignmentSorter.sortByID( viewport.getAlignment() );\r
689     alignPanel.RefreshPanels();\r
690   }\r
691 \r
692   public void sortGroupMenuItem_actionPerformed(ActionEvent e)\r
693   {\r
694     addHistoryItem("sort");\r
695     AlignmentSorter.sortByGroup(viewport.getAlignment());\r
696     AlignmentSorter.sortGroups(viewport.getAlignment());\r
697     alignPanel.RefreshPanels();\r
698   }\r
699 \r
700   public void sortTreeOrderMenuItem_actionPerformed(ActionEvent e)\r
701   {\r
702     addHistoryItem("sort");\r
703     if(viewport.getCurrentTree()==null)\r
704       return;\r
705 \r
706     AlignmentSorter.sortByTree(viewport.getAlignment(), viewport.getCurrentTree());\r
707     alignPanel.RefreshPanels();\r
708   }\r
709 \r
710   public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)\r
711   {\r
712     RedundancyPanel sp = new RedundancyPanel(alignPanel);\r
713     JInternalFrame frame = new JInternalFrame();\r
714     frame.setContentPane(sp);\r
715     Desktop.addInternalFrame(frame, "Redundancy threshold selection", 400, 100);\r
716     frame.setMaximizable(false);\r
717     frame.setResizable(false);\r
718 \r
719   }\r
720 \r
721   public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)\r
722   {\r
723     if(viewport.getSelection().size()<2)\r
724       JOptionPane.showInternalMessageDialog(this, "You must select at least 2 sequences.", "Invalid Selection", JOptionPane.WARNING_MESSAGE);\r
725     else\r
726     {\r
727       JInternalFrame frame = new JInternalFrame();\r
728       frame.setContentPane(new PairwiseAlignPanel(viewport));\r
729       Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);\r
730     }\r
731   }\r
732 \r
733   public void PCAMenuItem_actionPerformed(ActionEvent e)\r
734   {\r
735     if( (viewport.getSelection().size()<4 && viewport.getSelection().size()>0)\r
736        || viewport.getAlignment().getHeight()<4)\r
737     {\r
738       JOptionPane.showInternalMessageDialog(this, "Principal component analysis must take\n"\r
739                                     +"at least 4 input sequences.",\r
740                                     "Sequence selection insufficient",\r
741                                     JOptionPane.WARNING_MESSAGE);\r
742       return;\r
743     }\r
744 \r
745     try{\r
746       PCAPanel pcaPanel = new PCAPanel(viewport, null);\r
747       JInternalFrame frame = new JInternalFrame();\r
748       frame.setContentPane(pcaPanel);\r
749       Desktop.addInternalFrame(frame, "Principal component analysis", 400, 400);\r
750    }catch(java.lang.OutOfMemoryError ex)\r
751    {\r
752      JOptionPane.showInternalMessageDialog(this, "Too many sequences selected\nfor Principal Component Analysis!!",\r
753                                    "Out of memory", JOptionPane.WARNING_MESSAGE);\r
754    }\r
755 \r
756 \r
757   }\r
758 \r
759   public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)\r
760   {\r
761     NewTreePanel("AV", "PID", "Average distance tree using PID");\r
762   }\r
763 \r
764   public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)\r
765   {\r
766     NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");\r
767   }\r
768 \r
769 \r
770   protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)\r
771   {\r
772     NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");\r
773   }\r
774 \r
775   protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)\r
776   {\r
777     NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62PID");\r
778   }\r
779 \r
780   void NewTreePanel(String type, String pwType, String title)\r
781   {\r
782     JInternalFrame frame = new javax.swing.JInternalFrame();\r
783     TreePanel tp=null;\r
784    if (viewport.getSelection() != null && viewport.getSelection().size() > 3)\r
785    {\r
786      tp = new TreePanel(viewport, viewport.getSelection().asVector(),type, pwType,\r
787                          viewport.getStartRes(), viewport.getEndRes());\r
788    }\r
789    else\r
790    {\r
791      tp = new TreePanel(viewport, viewport.getAlignment().getSequences(),\r
792                          type, pwType, viewport.getStartRes(),\r
793                          viewport.getEndRes());\r
794    }\r
795 \r
796    frame.setContentPane(tp);\r
797    Desktop.addInternalFrame(frame, title, 600, 500);\r
798   }\r
799 \r
800 \r
801 \r
802 \r
803   public void clustalAlignMenuItem_actionPerformed(ActionEvent e)\r
804   {\r
805     // JBPNote\r
806     // Should check to see if the server settings are valid\r
807     // Need visual-delay indication here.\r
808      jalview.ws.Jemboss jemboss = new jalview.ws.Jemboss();\r
809 \r
810     Vector sv = viewport.getAlignment().getSequences();\r
811     SequenceI[] seqs = new SequenceI[sv.size()];\r
812 \r
813     int i=0;\r
814     do\r
815     {\r
816       seqs[i] = (SequenceI) sv.elementAt(i);\r
817     } while (++i<sv.size());\r
818 \r
819     SequenceI[] alignment = jemboss.clustalW(seqs); // gaps removed within method\r
820 \r
821     if (alignment != null)\r
822     {\r
823       AlignFrame af = new AlignFrame(new Alignment(alignment));\r
824       Desktop.addInternalFrame(af, getTitle().concat(" - ClustalW Alignment"),\r
825                                700, 500); // JBPNote - is there a new window geom. property ?\r
826     }\r
827   }\r
828 \r
829 \r
830   public void pdbTest_actionPerformed(ActionEvent e)\r
831   {\r
832    String reply =\r
833        JOptionPane.showInternalInputDialog(this, "Enter pdb code",\r
834                                            "PDB test viewer", JOptionPane.QUESTION_MESSAGE);\r
835 \r
836    String url = "http://www.ebi.ac.uk/cgi-bin/pdbfetch?id=1a4u";\r
837    if (reply.length()>1)\r
838      url = "http://www.ebi.ac.uk/cgi-bin/pdbfetch?id="+reply;\r
839 \r
840    try\r
841    {\r
842      PDBfile pdb = new PDBfile(url,\r
843                                "URL");\r
844     Sequence seq = (Sequence)viewport.getAlignment().getSequenceAt(0);\r
845     seq.setPDBfile(pdb);\r
846      ( (PDBChain) pdb.chains.elementAt(seq.maxchain)).isVisible = true;\r
847      ( (PDBChain) pdb.chains.elementAt(seq.maxchain)).sequence = seq;\r
848   // ( (PDBChain) pdb.chains.elementAt(seq.maxchain)).colourBySequence();\r
849 \r
850      rotCanvas rc = new rotCanvas(pdb);\r
851      JInternalFrame frame = new JInternalFrame();\r
852      frame.setContentPane(rc);\r
853      Desktop.addInternalFrame(frame, url, 400,400);\r
854    }\r
855    catch (Exception ex)\r
856    {\r
857      ex.printStackTrace();\r
858    }\r
859 \r
860   }\r
861 \r
862 \r
863   public void doKeyPressed(KeyEvent evt)\r
864   {\r
865 \r
866     System.out.println(evt.getKeyChar());\r
867     if(evt.isControlDown() && evt.getKeyChar()=='f')\r
868       findMenuItem_actionPerformed(null);\r
869 \r
870   }\r
871 \r
872 \r
873 }\r