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