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