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