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