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