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