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