move sequences up and down
[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     viewport.setGlobalColourScheme( null );\r
639     changeColour();\r
640   }\r
641 \r
642 \r
643   public void clustalColour_actionPerformed(ActionEvent e)\r
644   {\r
645     viewport.setGlobalColourScheme(\r
646       new ClustalxColourScheme(viewport.alignment.getSequences(), viewport.alignment.getWidth()));\r
647     abovePIDThreshold.setSelected(false);\r
648     changeColour();\r
649   }\r
650 \r
651   public void zappoColour_actionPerformed(ActionEvent e)\r
652   {\r
653     viewport.setGlobalColourScheme(new ZappoColourScheme() );\r
654     changeColour();\r
655   }\r
656 \r
657   public void taylorColour_actionPerformed(ActionEvent e)\r
658   {\r
659     viewport.setGlobalColourScheme(new TaylorColourScheme() );\r
660     changeColour();\r
661   }\r
662 \r
663 \r
664   public void hydrophobicityColour_actionPerformed(ActionEvent e)\r
665   {\r
666     viewport.setGlobalColourScheme( new HydrophobicColourScheme() );\r
667     changeColour();\r
668   }\r
669 \r
670   public void helixColour_actionPerformed(ActionEvent e)\r
671   {\r
672     viewport.setGlobalColourScheme( new HelixColourScheme()  );\r
673     changeColour();\r
674   }\r
675 \r
676 \r
677   public void strandColour_actionPerformed(ActionEvent e)\r
678   {\r
679     viewport.setGlobalColourScheme(new StrandColourScheme() );\r
680     changeColour();\r
681   }\r
682 \r
683 \r
684   public void turnColour_actionPerformed(ActionEvent e)\r
685   {\r
686     viewport.setGlobalColourScheme(new TurnColourScheme() );\r
687     changeColour();\r
688   }\r
689 \r
690 \r
691   public void buriedColour_actionPerformed(ActionEvent e)\r
692   {\r
693     viewport.setGlobalColourScheme( new BuriedColourScheme() );\r
694     changeColour();\r
695   }\r
696 \r
697   public void nucleotideColour_actionPerformed(ActionEvent e)\r
698   {\r
699     viewport.setGlobalColourScheme( new NucleotideColourScheme() );\r
700     changeColour();\r
701   }\r
702 \r
703 \r
704   void changeColour()\r
705   {\r
706     if(abovePIDThreshold.isSelected())\r
707       abovePIDThreshold_actionPerformed(null);\r
708     else if(conservationMenuItem.isSelected())\r
709       conservationMenuItem_actionPerformed(null);\r
710 \r
711     alignPanel.RefreshPanels();\r
712   }\r
713 \r
714 \r
715   protected  void conservationMenuItem_actionPerformed(ActionEvent e)\r
716   {\r
717    if(abovePIDThreshold.isSelected())\r
718    {\r
719      abovePIDThreshold.setSelected(false);\r
720      Desktop.hidePIDSlider();\r
721    }\r
722 \r
723    viewport.setConservationSelected(conservationMenuItem.isSelected());\r
724 \r
725    ColourSchemeI oldCs = viewport.getGlobalColourScheme();\r
726 \r
727    ConservationColourScheme ccs = null;\r
728    if (oldCs instanceof ConservationColourScheme)\r
729          ccs = (ConservationColourScheme) oldCs;\r
730 \r
731        if (conservationMenuItem.isSelected())\r
732        {\r
733          Alignment al = (Alignment) viewport.alignment;\r
734          Conservation c = new Conservation("All",\r
735                                            ResidueProperties.propHash, 3,\r
736                                            al.getSequences(), 0,\r
737                                            al.getWidth());\r
738 \r
739          c.calculate();\r
740          c.verdict(false, 100);\r
741 \r
742          if (ccs != null)\r
743            ccs = new ConservationColourScheme(c, ccs.cs);\r
744          else\r
745            ccs = new ConservationColourScheme(c, oldCs);\r
746 \r
747 \r
748          int threshold = Desktop.setConservationSliderSource(alignPanel, ccs, "Background");\r
749 \r
750          ccs.inc = threshold;\r
751 \r
752          if (ccs.cs instanceof ResidueColourScheme)\r
753            ((ResidueColourScheme) ccs.cs).setThreshold(0);\r
754          else if (ccs.cs instanceof ScoreColourScheme)\r
755            ((ScoreColourScheme)ccs.cs).setThreshold(0);\r
756 \r
757          viewport.setGlobalColourScheme(ccs);\r
758 \r
759 \r
760        }\r
761        else if (oldCs instanceof ConservationColourScheme)\r
762        {\r
763          /// ie, if we remove ConservationColourScheme from backgroundColour\r
764          oldCs = ccs.cs;\r
765          viewport.setGlobalColourScheme(oldCs);\r
766          Desktop.hideConservationSlider();\r
767        }\r
768 \r
769        if(e!=null)\r
770          alignPanel.RefreshPanels();\r
771   }\r
772 \r
773 \r
774   public void abovePIDThreshold_actionPerformed(ActionEvent e)\r
775   {\r
776       if(conservationMenuItem.isSelected())\r
777         conservationMenuItem.setSelected(false);\r
778 \r
779       ColourSchemeI oldCs = viewport.getGlobalColourScheme();\r
780       int threshold = 0;\r
781       if (oldCs instanceof ConservationColourScheme)\r
782      {\r
783        ConservationColourScheme ccs = (ConservationColourScheme) oldCs;\r
784        oldCs = ccs.cs;\r
785      }\r
786 \r
787      if(abovePIDThreshold.isSelected())\r
788      {\r
789        threshold = Desktop.setPIDSliderSource(alignPanel, oldCs, "Background");\r
790        Desktop.hideConservationSlider();\r
791      }\r
792      else\r
793        Desktop.hidePIDSlider();\r
794 \r
795       if (oldCs instanceof ResidueColourScheme)\r
796           ((ResidueColourScheme) oldCs).setThreshold(threshold);\r
797       else if (oldCs instanceof ScoreColourScheme)\r
798           ((ScoreColourScheme)oldCs).setThreshold(threshold);\r
799 \r
800     viewport.setGlobalColourScheme(oldCs);\r
801      if(e!=null)\r
802         alignPanel.RefreshPanels();\r
803   }\r
804 \r
805 \r
806 \r
807   public void userDefinedColour_actionPerformed(ActionEvent e)\r
808   {\r
809     JInternalFrame frame = new JInternalFrame();\r
810     UserDefinedColours chooser = new UserDefinedColours( frame, alignPanel, null);\r
811     frame.setContentPane(chooser);\r
812     Desktop.addInternalFrame(frame,"User defined colours", 450,540 );\r
813     frame.setResizable(false);\r
814     frame.setIconifiable(false);\r
815     frame.setMaximizable(false);\r
816   }\r
817 \r
818   public void PIDColour_actionPerformed(ActionEvent e)\r
819   {\r
820     viewport.setGlobalColourScheme( new PIDColourScheme() );\r
821     alignPanel.setColourScheme( );\r
822   }\r
823 \r
824 \r
825   public void BLOSUM62Colour_actionPerformed(ActionEvent e)\r
826   {\r
827     viewport.setGlobalColourScheme( new Blosum62ColourScheme(viewport)  );\r
828     changeColour();\r
829   }\r
830 \r
831 \r
832 \r
833   public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)\r
834   {\r
835     addHistoryItem("sort");\r
836     AlignmentSorter.sortByPID(viewport.getAlignment(), viewport.getAlignment().getSequenceAt(0));\r
837     alignPanel.RefreshPanels();\r
838   }\r
839 \r
840   public void sortIDMenuItem_actionPerformed(ActionEvent e)\r
841   {\r
842     addHistoryItem("sort");\r
843     AlignmentSorter.sortByID( viewport.getAlignment() );\r
844     alignPanel.RefreshPanels();\r
845   }\r
846 \r
847   public void sortGroupMenuItem_actionPerformed(ActionEvent e)\r
848   {\r
849     addHistoryItem("sort");\r
850     AlignmentSorter.sortByGroup(viewport.getAlignment());\r
851     AlignmentSorter.sortGroups(viewport.getAlignment());\r
852     alignPanel.RefreshPanels();\r
853   }\r
854 \r
855   public void sortTreeOrderMenuItem_actionPerformed(ActionEvent e)\r
856   {\r
857     addHistoryItem("sort");\r
858     if(viewport.getCurrentTree()==null)\r
859       return;\r
860 \r
861     AlignmentSorter.sortByTree(viewport.getAlignment(), viewport.getCurrentTree());\r
862     alignPanel.RefreshPanels();\r
863   }\r
864 \r
865   public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)\r
866   {\r
867     RedundancyPanel sp = new RedundancyPanel(alignPanel);\r
868     JInternalFrame frame = new JInternalFrame();\r
869     frame.setContentPane(sp);\r
870     Desktop.addInternalFrame(frame, "Redundancy threshold selection", 400, 100);\r
871     frame.setMaximizable(false);\r
872     frame.setResizable(false);\r
873 \r
874   }\r
875 \r
876   public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)\r
877   {\r
878     if(viewport.getSelection().size()<2)\r
879       JOptionPane.showInternalMessageDialog(this, "You must select at least 2 sequences.", "Invalid Selection", JOptionPane.WARNING_MESSAGE);\r
880     else\r
881     {\r
882       JInternalFrame frame = new JInternalFrame();\r
883       frame.setContentPane(new PairwiseAlignPanel(viewport));\r
884       Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);\r
885     }\r
886   }\r
887 \r
888   public void PCAMenuItem_actionPerformed(ActionEvent e)\r
889   {\r
890     if( (viewport.getSelection().size()<4 && viewport.getSelection().size()>0)\r
891        || viewport.getAlignment().getHeight()<4)\r
892     {\r
893       JOptionPane.showInternalMessageDialog(this, "Principal component analysis must take\n"\r
894                                     +"at least 4 input sequences.",\r
895                                     "Sequence selection insufficient",\r
896                                     JOptionPane.WARNING_MESSAGE);\r
897       return;\r
898     }\r
899 \r
900     try{\r
901       PCAPanel pcaPanel = new PCAPanel(viewport, null);\r
902       JInternalFrame frame = new JInternalFrame();\r
903       frame.setContentPane(pcaPanel);\r
904       Desktop.addInternalFrame(frame, "Principal component analysis", 400, 400);\r
905    }catch(java.lang.OutOfMemoryError ex)\r
906    {\r
907      JOptionPane.showInternalMessageDialog(this, "Too many sequences selected\nfor Principal Component Analysis!!",\r
908                                    "Out of memory", JOptionPane.WARNING_MESSAGE);\r
909    }\r
910 \r
911 \r
912   }\r
913 \r
914   public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)\r
915   {\r
916     NewTreePanel("AV", "PID", "Average distance tree using PID");\r
917   }\r
918 \r
919   public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)\r
920   {\r
921     NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");\r
922   }\r
923 \r
924 \r
925   protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)\r
926   {\r
927     NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");\r
928   }\r
929 \r
930   protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)\r
931   {\r
932     NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62PID");\r
933   }\r
934 \r
935   void NewTreePanel(String type, String pwType, String title)\r
936   {\r
937     //are the sequences aligned?\r
938     if(!viewport.alignment.isAligned())\r
939     {\r
940       JOptionPane.showMessageDialog(Desktop.desktop, "The sequences must be aligned before creating a tree.",\r
941                                     "Sequences not aligned", JOptionPane.WARNING_MESSAGE);\r
942       return;\r
943     }\r
944 \r
945     JInternalFrame frame = new javax.swing.JInternalFrame();\r
946     TreePanel tp=null;\r
947    if (viewport.getSelection() != null && viewport.getSelection().size() > 3)\r
948    {\r
949      tp = new TreePanel(viewport, viewport.getSelection().asVector(),type, pwType,\r
950                          viewport.getStartRes(), viewport.getEndRes());\r
951    }\r
952    else\r
953    {\r
954      tp = new TreePanel(viewport, viewport.getAlignment().getSequences(),\r
955                          type, pwType, viewport.getStartRes(),\r
956                          viewport.getEndRes());\r
957    }\r
958 \r
959    frame.setContentPane(tp);\r
960    Desktop.addInternalFrame(frame, title, 600, 500);\r
961   }\r
962 \r
963 \r
964 \r
965 \r
966   public void clustalAlignMenuItem_actionPerformed(ActionEvent e)\r
967   {\r
968     JInternalFrame frame = new JInternalFrame();\r
969     ClustalThread ct = new ClustalThread(frame);\r
970     Thread t = new Thread(ct);\r
971     t.start();\r
972     frame.setContentPane(ct);\r
973      Desktop.addInternalFrame(frame, title, 300, 80);\r
974 \r
975   }\r
976 \r
977   class ClustalThread extends JPanel implements Runnable\r
978   {\r
979     Image [] image;\r
980     int imageIndex = 0;\r
981     boolean webServiceRunning = false;\r
982     JInternalFrame frame;\r
983     public ClustalThread(JInternalFrame frame)\r
984     {\r
985       this.frame = frame;\r
986       image = new Image[9];\r
987       for(int i=0; i<9; i++)\r
988       {\r
989         java.net.URL url = getClass().getResource("/dna" + (i+1) + ".gif");\r
990         if (url != null)\r
991         {\r
992           image[i] = java.awt.Toolkit.getDefaultToolkit().createImage(url);\r
993           MediaTracker mt = new MediaTracker(this);\r
994           mt.addImage(image[i], i);\r
995           try{mt.waitForID(i);}\r
996           catch(Exception ex){}\r
997         }\r
998       }\r
999       DNATwirler twirler = new DNATwirler();\r
1000       twirler.start();\r
1001       webServiceRunning = true;\r
1002     }\r
1003 \r
1004     class DNATwirler extends Thread\r
1005     {\r
1006       public void run()\r
1007       {\r
1008         while(webServiceRunning)\r
1009         {\r
1010           try{\r
1011             Thread.sleep(100);\r
1012             imageIndex++;\r
1013             imageIndex %=9;\r
1014             repaint();\r
1015           }\r
1016           catch(Exception ex){}\r
1017         }\r
1018       }\r
1019     }\r
1020 \r
1021     // JBPNote\r
1022     // Should check to see if the server settings are valid\r
1023     // Need visual-delay indication here.\r
1024     public void run()\r
1025        {\r
1026          jalview.ws.Jemboss jemboss = new jalview.ws.Jemboss();\r
1027          Vector sv = viewport.getAlignment().getSequences();\r
1028          SequenceI[] seqs = new SequenceI[sv.size()];\r
1029 \r
1030          int i = 0;\r
1031          do\r
1032          {\r
1033            seqs[i] = (SequenceI) sv.elementAt(i);\r
1034          }\r
1035          while (++i < sv.size());\r
1036 \r
1037          SequenceI[] alignment = jemboss.clustalW(seqs); // gaps removed within method\r
1038 \r
1039          if (alignment != null)\r
1040          {\r
1041            AlignFrame af = new AlignFrame(new Alignment(alignment));\r
1042           af.clustalColour.setSelected(true);\r
1043           af.clustalColour_actionPerformed(null);\r
1044            Desktop.addInternalFrame(af, getTitle().concat(" - ClustalW Alignment"),\r
1045                                     700, 500); // JBPNote - is there a new window geom. property ?\r
1046          }\r
1047          else\r
1048            JOptionPane.showMessageDialog(Desktop.desktop, "Problem obtaining clustal alignment", "Web service error",\r
1049                                          JOptionPane.WARNING_MESSAGE);\r
1050 \r
1051          webServiceRunning = false;\r
1052          try{\r
1053            frame.setClosed(true);\r
1054          }catch(Exception ex){}\r
1055        }\r
1056 \r
1057        public void paintComponent(Graphics g)\r
1058        {\r
1059          g.setColor(Color.white);\r
1060          g.fillRect(0,0,getWidth(), getHeight());\r
1061          if(image!=null)\r
1062          {\r
1063            g.drawImage(image[imageIndex],10,10,this);\r
1064          }\r
1065          g.setFont(new Font("Arial", Font.BOLD, 12));\r
1066          g.setColor(Color.black);\r
1067          g.drawString("Clustal Alignment Web Service running", 30,30);\r
1068        }\r
1069   }\r
1070 }\r