Preferences panel added
[jalview.git] / src / jalview / gui / AlignFrame.java
1 /********************\r
2  * 2004 Jalview Reengineered\r
3  * Barton Group\r
4  * Dundee University\r
5  *\r
6  * AM Waterhouse\r
7  *******************/\r
8 \r
9 \r
10 \r
11 \r
12 package jalview.gui;\r
13 \r
14 import jalview.jbgui.GAlignFrame;\r
15 import jalview.schemes.*;\r
16 import jalview.datamodel.*;\r
17 import jalview.analysis.*;\r
18 import jalview.io.*;\r
19 import jalview.ws.*;\r
20 import java.awt.*;\r
21 import java.awt.event.*;\r
22 import java.awt.print.*;\r
23 import javax.swing.*;\r
24 import javax.swing.event.*;\r
25 import java.util.*;\r
26 import java.awt.datatransfer.*;\r
27 \r
28 \r
29 public class AlignFrame extends GAlignFrame\r
30 {\r
31   final AlignmentPanel alignPanel;\r
32   final AlignViewport viewport;\r
33   public static final int NEW_WINDOW_WIDTH = 700;\r
34   public static final int NEW_WINDOW_HEIGHT = 500;\r
35 \r
36   public AlignFrame(AlignmentI al)\r
37   {\r
38     try{\r
39       String ip = java.net.InetAddress.getLocalHost().getHostAddress();\r
40       if( !ip.startsWith("10."))\r
41         webService.setVisible(false);\r
42     }\r
43     catch(java.net.UnknownHostException e){}\r
44     viewport = new AlignViewport(al);\r
45 \r
46 \r
47     alignPanel = new AlignmentPanel(this, viewport);\r
48     alignPanel.annotationPanel.adjustPanelHeight();\r
49     alignPanel.annotationSpaceFillerHolder.setPreferredSize(alignPanel.annotationPanel.getPreferredSize());\r
50     alignPanel.annotationScroller.setPreferredSize(alignPanel.annotationPanel.getPreferredSize());\r
51     alignPanel.setAnnotationVisible( viewport.getShowAnnotation() );\r
52 \r
53     getContentPane().add(alignPanel, java.awt.BorderLayout.CENTER);\r
54 \r
55     addInternalFrameListener(new InternalFrameAdapter()\r
56    {\r
57      public void internalFrameActivated(InternalFrameEvent evt)\r
58      {\r
59           javax.swing.SwingUtilities.invokeLater(new Runnable()\r
60           {\r
61             public void run()\r
62             {      alignPanel.requestFocus();    }\r
63           });\r
64 \r
65      }\r
66    });\r
67 \r
68   }\r
69 \r
70   protected void saveAs_actionPerformed(ActionEvent e)\r
71   {\r
72     String suffix [] = null;\r
73     if(e.getActionCommand().equals("FASTA"))\r
74       suffix = new String[]{"fa", "fasta"};\r
75     else if(e.getActionCommand().equals("MSF"))\r
76       suffix = new String[]{"msf"};\r
77     else if(e.getActionCommand().equals("CLUSTAL"))\r
78       suffix = new String[]{"aln"};\r
79     else if(e.getActionCommand().equals("BLC"))\r
80       suffix = new String[]{"blc"};\r
81     else if(e.getActionCommand().equals("PIR"))\r
82       suffix = new String[]{"pir"};\r
83     else if(e.getActionCommand().equals("PFAM"))\r
84       suffix = new String[]{"pfam"};\r
85 \r
86 \r
87     JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.getProperty("LAST_DIRECTORY")\r
88         , suffix, e.getActionCommand()+" file");\r
89     chooser.setFileView(new JalviewFileView());\r
90     chooser.setDialogTitle("Save Alignment to file - "+e.getActionCommand() +" format.");\r
91     chooser.setToolTipText("Save");\r
92     int value = chooser.showSaveDialog(this);\r
93     if(value == JalviewFileChooser.APPROVE_OPTION)\r
94     {\r
95       String choice =  chooser.getSelectedFile().getPath();\r
96       jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);\r
97       String output = FormatAdapter.get(e.getActionCommand(), viewport.getAlignment().getSequences());\r
98       try{\r
99         java.io.PrintWriter out = new java.io.PrintWriter( new java.io.FileWriter( choice )  );\r
100         out.println(output);\r
101         out.close();\r
102       }\r
103       catch(Exception ex){}\r
104     }\r
105 \r
106   }\r
107 \r
108   protected void outputText_actionPerformed(ActionEvent e)\r
109   {\r
110      CutAndPasteTransfer cap = new CutAndPasteTransfer(false);\r
111      JInternalFrame frame = new JInternalFrame();\r
112      cap.formatForOutput();\r
113      frame.setContentPane(cap);\r
114      Desktop.addInternalFrame(frame, "Alignment output - "+e.getActionCommand(), 600, 500);\r
115      cap.setText( FormatAdapter.get(e.getActionCommand(), viewport.getAlignment().getSequences()));\r
116   }\r
117 \r
118   protected void htmlMenuItem_actionPerformed(ActionEvent e)\r
119   {\r
120     HTMLOutput htmlOutput = new HTMLOutput(viewport);\r
121     htmlOutput = null;\r
122   }\r
123 \r
124   protected void createPNG_actionPerformed(ActionEvent e)\r
125   {\r
126     alignPanel.makePNG();\r
127   }\r
128 \r
129   protected void epsFile_actionPerformed(ActionEvent e)\r
130   {\r
131     alignPanel.makeEPS();\r
132   }\r
133 \r
134 \r
135   public void printMenuItem_actionPerformed(ActionEvent e)\r
136   {\r
137     //Putting in a thread avoids Swing painting problems\r
138     PrintThread thread = new PrintThread();\r
139     thread.start();\r
140   }\r
141 \r
142   class PrintThread extends Thread\r
143   {\r
144     public void run()\r
145     {\r
146       PrinterJob printJob = PrinterJob.getPrinterJob();\r
147       PageFormat pf = printJob.pageDialog(printJob.defaultPage());\r
148       printJob.setPrintable(alignPanel, pf);\r
149       if (printJob.printDialog())\r
150       {\r
151         try\r
152         {\r
153           printJob.print();\r
154         }\r
155         catch (Exception PrintException)\r
156         {\r
157           PrintException.printStackTrace();\r
158         }\r
159       }\r
160     }\r
161 \r
162   }\r
163 \r
164 \r
165 \r
166 \r
167   public void closeMenuItem_actionPerformed(ActionEvent e)\r
168   {\r
169     try{\r
170       this.setClosed(true);\r
171     }catch(Exception ex){}\r
172   }\r
173 \r
174   Stack historyList = new Stack();\r
175   Stack redoList = new Stack();\r
176 \r
177   void updateEditMenuBar()\r
178   {\r
179     if(historyList.size()>0)\r
180      {\r
181        undoMenuItem.setEnabled(true);\r
182        Object [] history = (Object[])historyList.get(0);\r
183        undoMenuItem.setText("Undo "+history[0]);\r
184      }\r
185     else\r
186     {\r
187       undoMenuItem.setEnabled(false);\r
188       undoMenuItem.setText("Undo");\r
189     }\r
190 \r
191     if(redoList.size()>0)\r
192      {\r
193        redoMenuItem.setEnabled(true);\r
194        Object [] history = (Object[])redoList.get(0);\r
195        redoMenuItem.setText("Redo "+history[0]);\r
196      }\r
197     else\r
198     {\r
199       redoMenuItem.setEnabled(false);\r
200       redoMenuItem.setText("Redo");\r
201     }\r
202   }\r
203 \r
204   public void addHistoryItem(String type)\r
205   {\r
206     // must make sure we add new sequence objects her, not refs to the existing sequences\r
207     redoList.clear();\r
208     SequenceI[] seq = new SequenceI[viewport.getAlignment().getHeight()];\r
209     for(int i=0; i<viewport.getAlignment().getHeight(); i++)\r
210     {\r
211       seq[i] = new Sequence( viewport.getAlignment().getSequenceAt(i).getName(),\r
212                              viewport.getAlignment().getSequenceAt(i).getSequence());\r
213     }\r
214 \r
215     historyList.add(0, new Object[]{type,  seq} );\r
216     updateEditMenuBar();\r
217   }\r
218 \r
219   protected void undoMenuItem_actionPerformed(ActionEvent e)\r
220   {\r
221     Object [] history = (Object[])historyList.remove(0);\r
222     // add the redo state before continuing!!\r
223     SequenceI[] seq = new SequenceI[viewport.getAlignment().getHeight()];\r
224     for (int i = 0; i < viewport.getAlignment().getHeight(); i++)\r
225     {\r
226       seq[i] = new Sequence(viewport.getAlignment().getSequenceAt(i).getName(),\r
227                             viewport.getAlignment().getSequenceAt(i).\r
228                             getSequence());\r
229     }\r
230     /////////\r
231 \r
232     redoList.add(0, new Object[] {history[0], seq});\r
233 \r
234       seq = (SequenceI[]) history[1];\r
235       viewport.setAlignment( new Alignment(seq) );\r
236       updateEditMenuBar();\r
237       viewport.updateConsensus();\r
238       alignPanel.repaint();\r
239   }\r
240 \r
241   public void moveSelectedSequences(boolean up)\r
242   {\r
243     SequenceGroup sg = viewport.getSelectionGroup();\r
244     if (sg == null)\r
245       return;\r
246 \r
247     if (up)\r
248     {\r
249       for (int i = 1; i < viewport.alignment.getHeight(); i++)\r
250       {\r
251         SequenceI seq = viewport.alignment.getSequenceAt(i);\r
252         if (!sg.sequences.contains(seq))\r
253           continue;\r
254 \r
255         SequenceI temp = viewport.alignment.getSequenceAt(i - 1);\r
256         if (sg.sequences.contains(temp))\r
257           continue;\r
258 \r
259         viewport.alignment.getSequences().setElementAt(temp, i);\r
260         viewport.alignment.getSequences().setElementAt(seq, i - 1);\r
261       }\r
262     }\r
263     else\r
264     {\r
265       for (int i = viewport.alignment.getHeight() - 2; i > -1; i--)\r
266       {\r
267         SequenceI seq = viewport.alignment.getSequenceAt(i);\r
268         if (!sg.sequences.contains(seq))\r
269           continue;\r
270 \r
271         SequenceI temp = viewport.alignment.getSequenceAt(i + 1);\r
272         if (sg.sequences.contains(temp))\r
273           continue;\r
274 \r
275         viewport.alignment.getSequences().setElementAt(temp, i);\r
276         viewport.alignment.getSequences().setElementAt(seq, i + 1);\r
277       }\r
278     }\r
279 \r
280     alignPanel.repaint();\r
281   }\r
282 \r
283 \r
284 \r
285   protected void copy_actionPerformed(ActionEvent e)\r
286   {\r
287    if(viewport.getSelectionGroup()==null)\r
288      return;\r
289 \r
290    SequenceGroup sg = viewport.getSelectionGroup();\r
291 \r
292      Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();\r
293      StringBuffer buffer= new StringBuffer();\r
294 \r
295        for(int i=0; i<sg.getSize(); i++)\r
296        {\r
297          SequenceI seq = sg.getSequenceAt(i);\r
298          buffer.append( seq.getName()+"\t"+seq.findPosition( sg.getStartRes() ) +"\t"\r
299                         +seq.findPosition( sg.getEndRes() )+ "\t"\r
300                         +sg.getSequenceAt(i).getSequence(sg.getStartRes(), sg.getEndRes()+1)+"\n");\r
301        }\r
302      c.setContents( new StringSelection( buffer.toString()) , null ) ;\r
303 \r
304   }\r
305 \r
306 \r
307   protected void pasteNew_actionPerformed(ActionEvent e)\r
308   {\r
309     paste(true);\r
310   }\r
311 \r
312   protected void pasteThis_actionPerformed(ActionEvent e)\r
313   {\r
314     addHistoryItem("Paste");\r
315     paste(false);\r
316   }\r
317 \r
318   void paste(boolean newAlignment)\r
319   {\r
320     try{\r
321       Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();\r
322       Transferable contents = c.getContents(this);\r
323       if (contents == null)\r
324         return;\r
325 \r
326       String str = (String) contents.getTransferData(DataFlavor.stringFlavor);\r
327       StringTokenizer st = new StringTokenizer(str);\r
328       ArrayList seqs = new ArrayList();\r
329       while (st.hasMoreElements())\r
330       {\r
331         String name = st.nextToken();\r
332         int start = Integer.parseInt(st.nextToken());\r
333         int end = Integer.parseInt(st.nextToken());\r
334         Sequence sequence = new Sequence(name,st.nextToken(), start, end);\r
335 \r
336         if(!newAlignment)\r
337           viewport.alignment.addSequence(sequence);\r
338         else\r
339           seqs.add(sequence);\r
340       }\r
341 \r
342       if(newAlignment)\r
343       {\r
344         SequenceI[] newSeqs = new SequenceI[seqs.size()];\r
345         seqs.toArray(newSeqs);\r
346         AlignFrame af = new AlignFrame(new Alignment(newSeqs));\r
347         Desktop.addInternalFrame(af, "Copied sequences", NEW_WINDOW_WIDTH, NEW_WINDOW_HEIGHT);\r
348       }\r
349       else\r
350       {\r
351         viewport.setEndSeq(viewport.alignment.getHeight());\r
352         viewport.alignment.getWidth();\r
353         viewport.updateConservation();\r
354         viewport.updateConsensus();\r
355         alignPanel.repaint();\r
356       }\r
357 \r
358     }catch(Exception ex){}// could be anything being pasted in here\r
359 \r
360   }\r
361 \r
362 \r
363   protected void cut_actionPerformed(ActionEvent e)\r
364   {\r
365     copy_actionPerformed(null);\r
366     delete_actionPerformed(null);\r
367   }\r
368 \r
369   protected void delete_actionPerformed(ActionEvent e)\r
370   {\r
371     addHistoryItem("Delete");\r
372     if (viewport.getSelectionGroup() == null)\r
373       return;\r
374 \r
375      SequenceGroup sg = viewport.getSelectionGroup();\r
376      for (int i=0;i < sg.sequences.size(); i++)\r
377      {\r
378        SequenceI seq = sg.getSequenceAt(i);\r
379        int index = viewport.getAlignment().findIndex(seq);\r
380        seq.deleteChars(sg.getStartRes(), sg.getEndRes()+1);\r
381 \r
382        if(seq.getSequence().length()<1)\r
383           viewport.getAlignment().deleteSequence(seq);\r
384       else\r
385           viewport.getAlignment().getSequences().setElementAt(seq, index);\r
386      }\r
387 \r
388      viewport.setSelectionGroup(null);\r
389      viewport.alignment.deleteGroup(sg);\r
390      viewport.resetSeqLimits( alignPanel.seqPanel.seqCanvas.getHeight());\r
391      if(viewport.getAlignment().getHeight()<1)\r
392      try\r
393      {\r
394        this.setClosed(true);\r
395      }catch(Exception ex){}\r
396    viewport.updateConservation();\r
397    viewport.updateConsensus();\r
398      alignPanel.repaint();\r
399 \r
400   }\r
401 \r
402 \r
403 \r
404   protected void redoMenuItem_actionPerformed(ActionEvent e)\r
405   {\r
406      Object [] history = (Object[])redoList.remove(0);\r
407      SequenceI[] seq = (SequenceI[]) history[1];\r
408      viewport.setAlignment( new Alignment(seq) );\r
409      updateEditMenuBar();\r
410      viewport.updateConsensus();\r
411      alignPanel.repaint();\r
412      alignPanel.repaint();\r
413   }\r
414 \r
415 \r
416   protected void deleteGroups_actionPerformed(ActionEvent e)\r
417   {\r
418     viewport.alignment.deleteAllGroups();\r
419     viewport.setSelectionGroup(null);\r
420 \r
421     alignPanel.repaint();\r
422   }\r
423 \r
424 \r
425 \r
426   public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)\r
427   {\r
428     SequenceGroup sg = new SequenceGroup();\r
429     for (int i=0; i<viewport.getAlignment().getSequences().size(); i++)\r
430       sg.addSequence( viewport.getAlignment().getSequenceAt(i));\r
431     sg.setEndRes(viewport.alignment.getWidth());\r
432     viewport.setSelectionGroup(sg);\r
433     PaintRefresher.Refresh(null);\r
434   }\r
435 \r
436   public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)\r
437   {\r
438     viewport.setSelectionGroup(null);\r
439     viewport.getColumnSelection().clear();\r
440     viewport.setSelectionGroup(null);\r
441     PaintRefresher.Refresh(null);\r
442   }\r
443 \r
444   public void invertSequenceMenuItem_actionPerformed(ActionEvent e)\r
445   {\r
446     SequenceGroup sg = viewport.getSelectionGroup();\r
447     for (int i=0; i<viewport.getAlignment().getSequences().size(); i++)\r
448       sg.addOrRemove (viewport.getAlignment().getSequenceAt(i));\r
449 \r
450     PaintRefresher.Refresh(null);\r
451   }\r
452 \r
453   public void remove2LeftMenuItem_actionPerformed(ActionEvent e)\r
454   {\r
455     addHistoryItem("delete columns");\r
456     ColumnSelection colSel = viewport.getColumnSelection();\r
457     if (colSel.size() > 0)\r
458     {\r
459       int min = colSel.getMin();\r
460       viewport.getAlignment().trimLeft(min);\r
461       colSel.compensateForEdit(0,min);\r
462 \r
463       if(viewport.getSelectionGroup()!=null)\r
464         viewport.getSelectionGroup().adjustForRemoveLeft(min);\r
465 \r
466       Vector groups = viewport.alignment.getGroups();\r
467       for(int i=0; i<groups.size(); i++)\r
468       {\r
469         SequenceGroup sg = (SequenceGroup) groups.get(i);\r
470         if(!sg.adjustForRemoveLeft(min))\r
471           viewport.alignment.deleteGroup(sg);\r
472       }\r
473 \r
474       alignPanel.repaint();\r
475     }\r
476   }\r
477 \r
478   public void remove2RightMenuItem_actionPerformed(ActionEvent e)\r
479   {\r
480     addHistoryItem("delete columns");\r
481     ColumnSelection colSel = viewport.getColumnSelection();\r
482     if (colSel.size() > 0)\r
483     {\r
484       int max = colSel.getMax();\r
485       viewport.getAlignment().trimRight(max);\r
486       if(viewport.getSelectionGroup()!=null)\r
487         viewport.getSelectionGroup().adjustForRemoveRight(max);\r
488 \r
489       Vector groups = viewport.alignment.getGroups();\r
490       for(int i=0; i<groups.size(); i++)\r
491       {\r
492         SequenceGroup sg = (SequenceGroup) groups.get(i);\r
493         if(!sg.adjustForRemoveRight(max))\r
494           viewport.alignment.deleteGroup(sg);\r
495       }\r
496 \r
497 \r
498 \r
499       alignPanel.repaint();\r
500     }\r
501 \r
502   }\r
503 \r
504   public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)\r
505   {\r
506     addHistoryItem("delete gapped columns");\r
507     viewport.getAlignment().removeGaps();\r
508     viewport.updateConservation();\r
509     viewport.updateConsensus();\r
510     alignPanel.repaint();\r
511   }\r
512 \r
513   public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)\r
514   {\r
515     addHistoryItem("delete all gaps");\r
516     SequenceI current;\r
517     int jSize;\r
518     for (int i=0; i < viewport.getAlignment().getSequences().size();i++)\r
519     {\r
520       current = viewport.getAlignment().getSequenceAt(i);\r
521       jSize = current.getLength();\r
522       for (int j=0; j < jSize; j++)\r
523         if(jalview.util.Comparison.isGap(current.getCharAt(j)))\r
524         {\r
525           current.deleteCharAt(j);\r
526           j--;\r
527           jSize--;\r
528         }\r
529     }\r
530     viewport.updateConservation();\r
531     viewport.updateConsensus();\r
532     alignPanel.repaint();\r
533   }\r
534 \r
535 \r
536   protected void preferences_actionPerformed(ActionEvent e)\r
537 {\r
538     Preferences pref = new Preferences(viewport);\r
539 }\r
540 \r
541 \r
542   public void findMenuItem_actionPerformed(ActionEvent e)\r
543   {\r
544     JInternalFrame frame = new JInternalFrame();\r
545     Finder finder = new Finder(viewport, alignPanel, frame);\r
546     frame.setContentPane(finder);\r
547     Desktop.addInternalFrame(frame, "Find", 340,110, false);\r
548     frame.setLayer(JLayeredPane.PALETTE_LAYER);\r
549 \r
550   }\r
551 \r
552 \r
553   public void font_actionPerformed(ActionEvent e)\r
554   {\r
555     FontChooser fc = new FontChooser( alignPanel );\r
556   }\r
557 \r
558   protected void fullSeqId_actionPerformed(ActionEvent e)\r
559   {\r
560     viewport.setShowFullId( fullSeqId.isSelected() );\r
561 \r
562     alignPanel.idPanel.idCanvas.setPreferredSize( alignPanel.calculateIdWidth() );\r
563     alignPanel.repaint();\r
564   }\r
565 \r
566   protected void colourTextMenuItem_actionPerformed(ActionEvent e)\r
567   {\r
568       viewport.setColourText( colourTextMenuItem.isSelected() );\r
569       alignPanel.repaint();\r
570   }\r
571 \r
572   protected void wrapMenuItem_actionPerformed(ActionEvent e)\r
573   {\r
574     viewport.setWrapAlignment( wrapMenuItem.isSelected() );\r
575     alignPanel.setWrapAlignment( wrapMenuItem.isSelected() );\r
576     scaleAbove.setVisible( wrapMenuItem.isSelected() );\r
577     scaleLeft.setVisible( wrapMenuItem.isSelected() );\r
578     scaleRight.setVisible( wrapMenuItem.isSelected() );\r
579     alignPanel.repaint();\r
580   }\r
581 \r
582   protected void scaleAbove_actionPerformed(ActionEvent e)\r
583   {\r
584     viewport.setScaleAboveWrapped(scaleAbove.isSelected());\r
585     alignPanel.repaint();\r
586   }\r
587 \r
588   protected void scaleLeft_actionPerformed(ActionEvent e)\r
589   {\r
590     viewport.setScaleLeftWrapped(scaleLeft.isSelected());\r
591     alignPanel.repaint();\r
592   }\r
593 \r
594   protected void scaleRight_actionPerformed(ActionEvent e)\r
595   {\r
596     viewport.setScaleRightWrapped(scaleRight.isSelected());\r
597     alignPanel.repaint();\r
598   }\r
599 \r
600 \r
601 \r
602   public void viewBoxesMenuItem_actionPerformed(ActionEvent e)\r
603   {\r
604     viewport.setShowBoxes( viewBoxesMenuItem.isSelected() );\r
605     alignPanel.repaint();\r
606   }\r
607 \r
608   public void viewTextMenuItem_actionPerformed(ActionEvent e)\r
609   {\r
610     viewport.setShowText( viewTextMenuItem.isSelected() );\r
611     alignPanel.repaint();\r
612   }\r
613 \r
614 \r
615   protected void renderGapsMenuItem_actionPerformed(ActionEvent e)\r
616   {\r
617     viewport.setRenderGaps(renderGapsMenuItem.isSelected());\r
618     alignPanel.repaint();\r
619   }\r
620 \r
621   public void sequenceFeatures_actionPerformed(ActionEvent evt)\r
622   {\r
623     viewport.showSequenceFeatures(sequenceFeatures.isSelected());\r
624     if(viewport.showSequenceFeatures && !((Alignment)viewport.alignment).featuresAdded)\r
625     {\r
626          AlignmentUtil.fetchSequenceFeatures( viewport.alignment , alignPanel);\r
627          ((Alignment)viewport.alignment).featuresAdded = true;\r
628     }\r
629     alignPanel.repaint();\r
630   }\r
631 \r
632   public void annotationPanelMenuItem_actionPerformed(ActionEvent e)\r
633   {\r
634     if(annotationPanelMenuItem.isSelected() && viewport.getWrapAlignment())\r
635     {\r
636       annotationPanelMenuItem.setSelected(false);\r
637       return;\r
638     }\r
639     viewport.setShowAnnotation( annotationPanelMenuItem.isSelected() );\r
640     alignPanel.setAnnotationVisible( annotationPanelMenuItem.isSelected() );\r
641   }\r
642 \r
643   public void overviewMenuItem_actionPerformed(ActionEvent e)\r
644   {\r
645     if (alignPanel.overviewPanel != null)\r
646       return;\r
647 \r
648     JInternalFrame frame = new JInternalFrame();\r
649     OverviewPanel overview = new OverviewPanel(alignPanel);\r
650      frame.setContentPane(overview);\r
651     Desktop.addInternalFrame(frame, "Overview " + this.getTitle(),\r
652                              frame.getWidth(), frame.getHeight());\r
653     frame.pack();\r
654     frame.setLayer(JLayeredPane.PALETTE_LAYER);\r
655     frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()\r
656     { public void internalFrameClosed(javax.swing.event.InternalFrameEvent evt)\r
657       {\r
658             alignPanel.setOverviewPanel(null);\r
659       };\r
660     });\r
661 \r
662     alignPanel.setOverviewPanel( overview );\r
663 \r
664 \r
665   }\r
666 \r
667   protected void noColourmenuItem_actionPerformed(ActionEvent e)\r
668   {\r
669     changeColour( null );\r
670   }\r
671 \r
672 \r
673   public void clustalColour_actionPerformed(ActionEvent e)\r
674   {\r
675     abovePIDThreshold.setSelected(false);\r
676     changeColour(new ClustalxColourScheme(viewport.alignment.getSequences(), viewport.alignment.getWidth()));\r
677   }\r
678 \r
679   public void zappoColour_actionPerformed(ActionEvent e)\r
680   {\r
681     changeColour(new ZappoColourScheme());\r
682   }\r
683 \r
684   public void taylorColour_actionPerformed(ActionEvent e)\r
685   {\r
686     changeColour(new TaylorColourScheme());\r
687   }\r
688 \r
689 \r
690   public void hydrophobicityColour_actionPerformed(ActionEvent e)\r
691   {\r
692     changeColour( new HydrophobicColourScheme() );\r
693   }\r
694 \r
695   public void helixColour_actionPerformed(ActionEvent e)\r
696   {\r
697     changeColour(new HelixColourScheme() );\r
698   }\r
699 \r
700 \r
701   public void strandColour_actionPerformed(ActionEvent e)\r
702   {\r
703     changeColour(new StrandColourScheme());\r
704   }\r
705 \r
706 \r
707   public void turnColour_actionPerformed(ActionEvent e)\r
708   {\r
709     changeColour(new TurnColourScheme());\r
710   }\r
711 \r
712 \r
713   public void buriedColour_actionPerformed(ActionEvent e)\r
714   {\r
715     changeColour(new BuriedColourScheme() );\r
716   }\r
717 \r
718   public void nucleotideColour_actionPerformed(ActionEvent e)\r
719   {\r
720     changeColour(new NucleotideColourScheme());\r
721   }\r
722 \r
723 \r
724   protected void applyToAllGroups_actionPerformed(ActionEvent e)\r
725   {\r
726     viewport.setColourAppliesToAllGroups(applyToAllGroups.isSelected());\r
727   }\r
728 \r
729 \r
730 \r
731   void changeColour(ColourSchemeI cs)\r
732   {\r
733     int threshold = 0;\r
734 \r
735     if ( viewport.getAbovePIDThreshold() )\r
736     {\r
737       threshold = SliderPanel.setPIDSliderSource(alignPanel, cs, "Background");\r
738 \r
739       if (cs instanceof ResidueColourScheme)\r
740         ( (ResidueColourScheme) cs).setThreshold(threshold);\r
741       else if (cs instanceof ScoreColourScheme)\r
742         ( (ScoreColourScheme) cs).setThreshold(threshold);\r
743 \r
744       viewport.setGlobalColourScheme(cs);\r
745     }\r
746     else if (cs instanceof ResidueColourScheme)\r
747       ( (ResidueColourScheme) cs).setThreshold(0);\r
748     else if (cs instanceof ScoreColourScheme)\r
749       ( (ScoreColourScheme) cs).setThreshold(0);\r
750 \r
751 \r
752 \r
753     if (viewport.getConservationSelected())\r
754     {\r
755       ConservationColourScheme ccs = null;\r
756 \r
757       Alignment al = (Alignment) viewport.alignment;\r
758       Conservation c = new Conservation("All",\r
759                                         ResidueProperties.propHash, 3,\r
760                                         al.getSequences(), 0,\r
761                                         al.getWidth() - 1);\r
762 \r
763       c.calculate();\r
764       c.verdict(false, viewport.ConsPercGaps);\r
765 \r
766       ccs = new ConservationColourScheme(c, cs);\r
767 \r
768       // MUST NOTIFY THE COLOURSCHEME OF CONSENSUS!\r
769       ccs.setConsensus( viewport.vconsensus );\r
770       viewport.setGlobalColourScheme(ccs);\r
771 \r
772       SliderPanel.setConservationSlider(alignPanel, ccs, "Background");\r
773 \r
774     }\r
775     else\r
776     {\r
777         // MUST NOTIFY THE COLOURSCHEME OF CONSENSUS!\r
778         if (cs != null)\r
779           cs.setConsensus(viewport.vconsensus);\r
780         viewport.setGlobalColourScheme(cs);\r
781     }\r
782 \r
783 \r
784     if(viewport.getColourAppliesToAllGroups())\r
785     {\r
786       Vector groups = viewport.alignment.getGroups();\r
787       for(int i=0; i<groups.size(); i++)\r
788       {\r
789         SequenceGroup sg = (SequenceGroup)groups.elementAt(i);\r
790 \r
791         if (cs instanceof ClustalxColourScheme)\r
792         {\r
793           sg.cs = new ClustalxColourScheme(sg.sequences, sg.getWidth());\r
794         }\r
795         else\r
796           try\r
797           {\r
798             sg.cs = (ColourSchemeI) cs.getClass().newInstance();\r
799           }\r
800           catch (Exception ex)\r
801           {\r
802             ex.printStackTrace();\r
803             sg.cs = cs;\r
804           }\r
805 \r
806         if(viewport.getAbovePIDThreshold())\r
807         {\r
808           if (sg.cs instanceof ResidueColourScheme)\r
809             ( (ResidueColourScheme) sg.cs).setThreshold(threshold);\r
810           else if (sg.cs instanceof ScoreColourScheme)\r
811             ( (ScoreColourScheme) sg.cs).setThreshold(threshold);\r
812 \r
813            sg.cs.setConsensus( AAFrequency.calculate(sg.sequences, 0, sg.getWidth()) );\r
814         }\r
815 \r
816         if( viewport.getConservationSelected() )\r
817         {\r
818           Conservation c = new Conservation("Group",\r
819                                             ResidueProperties.propHash, 3,\r
820                                             sg.sequences, 0, viewport.alignment.getWidth()-1);\r
821           c.calculate();\r
822           c.verdict(false, viewport.ConsPercGaps);\r
823           ConservationColourScheme ccs = new ConservationColourScheme(c, sg.cs);\r
824 \r
825           // MUST NOTIFY THE COLOURSCHEME OF CONSENSUS!\r
826           ccs.setConsensus( AAFrequency.calculate(sg.sequences, 0, sg.getWidth()));\r
827           sg.cs = ccs;\r
828         }\r
829         else\r
830         {\r
831           // MUST NOTIFY THE COLOURSCHEME OF CONSENSUS!\r
832           sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0, sg.getWidth()));\r
833         }\r
834 \r
835       }\r
836     }\r
837 \r
838     if(alignPanel.getOverviewPanel()!=null)\r
839       alignPanel.getOverviewPanel().updateOverviewImage();\r
840     alignPanel.repaint();\r
841   }\r
842 \r
843   protected void modifyPID_actionPerformed(ActionEvent e)\r
844   {\r
845       if(viewport.getAbovePIDThreshold())\r
846       {\r
847         SliderPanel.setPIDSliderSource(alignPanel, viewport.getGlobalColourScheme(),\r
848                                    "Background");\r
849         SliderPanel.showPIDSlider();\r
850       }\r
851   }\r
852 \r
853   protected void modifyConservation_actionPerformed(ActionEvent e)\r
854   {\r
855     if(viewport.getConservationSelected())\r
856     {\r
857       SliderPanel.setConservationSlider(alignPanel, viewport.globalColourScheme,\r
858                                         "Background");\r
859       SliderPanel.showConservationSlider();\r
860     }\r
861   }\r
862 \r
863 \r
864   protected  void conservationMenuItem_actionPerformed(ActionEvent e)\r
865   {\r
866     viewport.setConservationSelected(conservationMenuItem.isSelected());\r
867 \r
868     viewport.setAbovePIDThreshold(false);\r
869     abovePIDThreshold.setSelected(false);\r
870 \r
871    ColourSchemeI cs = viewport.getGlobalColourScheme();\r
872    if(cs instanceof ConservationColourScheme )\r
873      changeColour( ((ConservationColourScheme)cs).cs );\r
874     else\r
875       changeColour( cs );\r
876 \r
877     modifyConservation_actionPerformed(null);\r
878   }\r
879 \r
880   public void abovePIDThreshold_actionPerformed(ActionEvent e)\r
881   {\r
882     viewport.setAbovePIDThreshold(abovePIDThreshold.isSelected());\r
883 \r
884     conservationMenuItem.setSelected(false);\r
885     viewport.setConservationSelected(false);\r
886 \r
887     ColourSchemeI cs = viewport.getGlobalColourScheme();\r
888 \r
889     if(cs instanceof ConservationColourScheme )\r
890         changeColour( ((ConservationColourScheme)cs).cs );\r
891     else\r
892         changeColour( cs );\r
893 \r
894     modifyPID_actionPerformed(null);\r
895   }\r
896 \r
897 \r
898 \r
899   public void userDefinedColour_actionPerformed(ActionEvent e)\r
900   {\r
901     UserDefinedColours chooser = new UserDefinedColours( alignPanel, null);\r
902   }\r
903 \r
904   public void PIDColour_actionPerformed(ActionEvent e)\r
905   {\r
906     changeColour( new PIDColourScheme() );\r
907   }\r
908 \r
909 \r
910   public void BLOSUM62Colour_actionPerformed(ActionEvent e)\r
911   {\r
912     changeColour(new Blosum62ColourScheme() );\r
913   }\r
914 \r
915 \r
916 \r
917   public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)\r
918   {\r
919     addHistoryItem("sort");\r
920     AlignmentSorter.sortByPID(viewport.getAlignment(), viewport.getAlignment().getSequenceAt(0));\r
921     alignPanel.repaint();\r
922   }\r
923 \r
924   public void sortIDMenuItem_actionPerformed(ActionEvent e)\r
925   {\r
926     addHistoryItem("sort");\r
927     AlignmentSorter.sortByID( viewport.getAlignment() );\r
928     alignPanel.repaint();\r
929   }\r
930 \r
931   public void sortGroupMenuItem_actionPerformed(ActionEvent e)\r
932   {\r
933     addHistoryItem("sort");\r
934     AlignmentSorter.sortByGroup(viewport.getAlignment());\r
935     AlignmentSorter.sortGroups(viewport.getAlignment());\r
936     alignPanel.repaint();\r
937   }\r
938 \r
939   public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)\r
940   {\r
941     RedundancyPanel sp = new RedundancyPanel(alignPanel);\r
942     JInternalFrame frame = new JInternalFrame();\r
943     frame.setContentPane(sp);\r
944     Desktop.addInternalFrame(frame, "Redundancy threshold selection", 400, 100, false);\r
945 \r
946   }\r
947 \r
948   public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)\r
949   {\r
950     if(viewport.getSelectionGroup().getSize()<2)\r
951       JOptionPane.showInternalMessageDialog(this, "You must select at least 2 sequences.", "Invalid Selection", JOptionPane.WARNING_MESSAGE);\r
952     else\r
953     {\r
954       JInternalFrame frame = new JInternalFrame();\r
955       frame.setContentPane(new PairwiseAlignPanel(viewport));\r
956       Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);\r
957     }\r
958   }\r
959 \r
960   public void PCAMenuItem_actionPerformed(ActionEvent e)\r
961   {\r
962 \r
963     if( (viewport.getSelectionGroup()!=null && viewport.getSelectionGroup().getSize()<4 && viewport.getSelectionGroup().getSize()>0)\r
964        || viewport.getAlignment().getHeight()<4)\r
965     {\r
966       JOptionPane.showInternalMessageDialog(this, "Principal component analysis must take\n"\r
967                                     +"at least 4 input sequences.",\r
968                                     "Sequence selection insufficient",\r
969                                     JOptionPane.WARNING_MESSAGE);\r
970       return;\r
971     }\r
972 \r
973     try{\r
974       PCAPanel pcaPanel = new PCAPanel(viewport, null);\r
975       JInternalFrame frame = new JInternalFrame();\r
976       frame.setContentPane(pcaPanel);\r
977       Desktop.addInternalFrame(frame, "Principal component analysis", 400, 400);\r
978    }catch(java.lang.OutOfMemoryError ex)\r
979    {\r
980      JOptionPane.showInternalMessageDialog(this, "Too many sequences selected\nfor Principal Component Analysis!!",\r
981                                    "Out of memory", JOptionPane.WARNING_MESSAGE);\r
982    }\r
983 \r
984 \r
985   }\r
986 \r
987   public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)\r
988   {\r
989     NewTreePanel("AV", "PID", "Average distance tree using PID");\r
990   }\r
991 \r
992   public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)\r
993   {\r
994     NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");\r
995   }\r
996 \r
997 \r
998   protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)\r
999   {\r
1000     NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");\r
1001   }\r
1002 \r
1003   protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)\r
1004   {\r
1005     NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62PID");\r
1006   }\r
1007 \r
1008   void NewTreePanel(String type, String pwType, String title)\r
1009   {\r
1010     //are the sequences aligned?\r
1011     if(!viewport.alignment.isAligned())\r
1012     {\r
1013       JOptionPane.showMessageDialog(Desktop.desktop, "The sequences must be aligned before creating a tree.",\r
1014                                     "Sequences not aligned", JOptionPane.WARNING_MESSAGE);\r
1015       return;\r
1016     }\r
1017 \r
1018     final TreePanel tp;\r
1019     if (viewport.getSelectionGroup() != null &&\r
1020         viewport.getSelectionGroup().getSize() > 3)\r
1021     {\r
1022       tp = new TreePanel(viewport, viewport.getSelectionGroup().sequences, type,\r
1023                          pwType,\r
1024                          0, viewport.alignment.getWidth());\r
1025     }\r
1026     else\r
1027     {\r
1028       tp = new TreePanel(viewport, viewport.getAlignment().getSequences(),\r
1029                          type, pwType, 0, viewport.alignment.getWidth());\r
1030     }\r
1031 \r
1032    addTreeMenuItem(tp, title);\r
1033 \r
1034    Desktop.addInternalFrame(tp, title, 600, 500);\r
1035   }\r
1036 \r
1037   void addTreeMenuItem(final TreePanel treePanel, String title)\r
1038   {\r
1039     final JMenuItem item = new JMenuItem(title);\r
1040     sortByTreeMenu.add(item);\r
1041     item.addActionListener(new java.awt.event.ActionListener()\r
1042     {\r
1043       public void actionPerformed(ActionEvent e)\r
1044       {\r
1045         addHistoryItem("sort");\r
1046         AlignmentSorter.sortByTree(viewport.getAlignment(), treePanel.getTree());\r
1047         alignPanel.repaint();\r
1048       }\r
1049     });\r
1050 \r
1051     treePanel.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()\r
1052     {\r
1053       public void internalFrameClosed(javax.swing.event.InternalFrameEvent evt)\r
1054       {\r
1055         sortByTreeMenu.remove(item);\r
1056       };\r
1057     });\r
1058 \r
1059   }\r
1060 \r
1061 \r
1062   public void clustalAlignMenuItem_actionPerformed(ActionEvent e)\r
1063   {\r
1064      WebserviceInfo info = new WebserviceInfo("Clustal web service",\r
1065      "\"Thompson, J.D., Higgins, D.G. and Gibson, T.J. (1994) CLUSTAL W: improving the sensitivity of progressive multiple"+\r
1066      " sequence alignment through sequence weighting, position specific gap penalties and weight matrix choice."\r
1067     +" Nucleic Acids Research, submitted, June 1994.",\r
1068      450, 150);\r
1069 \r
1070     ClustalThread thread = new ClustalThread(info);\r
1071     thread.start();\r
1072   }\r
1073 \r
1074     class ClustalThread extends Thread\r
1075     {\r
1076       WebserviceInfo info;\r
1077       public ClustalThread(WebserviceInfo info)\r
1078       {this.info = info; }\r
1079 \r
1080       public void run()\r
1081       {\r
1082         info.setStatus(WebserviceInfo.STATE_RUNNING);\r
1083         jalview.ws.Jemboss jemboss = new jalview.ws.Jemboss();\r
1084         Vector sv = viewport.getAlignment().getSequences();\r
1085         SequenceI[] seqs = new SequenceI[sv.size()];\r
1086 \r
1087         int i = 0;\r
1088         do\r
1089         {\r
1090           seqs[i] = (SequenceI) sv.elementAt(i);\r
1091         }\r
1092         while (++i < sv.size());\r
1093 \r
1094         SequenceI[] alignment = jemboss.clustalW(seqs); // gaps removed within method\r
1095         if (alignment != null)\r
1096         {\r
1097           AlignFrame af = new AlignFrame(new Alignment(alignment));\r
1098           Desktop.addInternalFrame(af, title.concat(" - ClustalW Alignment"),\r
1099                                    NEW_WINDOW_WIDTH, NEW_WINDOW_HEIGHT);\r
1100           af.clustalColour_actionPerformed(null);\r
1101           af.clustalColour.setSelected(true);\r
1102           info.setStatus(WebserviceInfo.STATE_STOPPED_OK);\r
1103         }\r
1104         else\r
1105         {\r
1106             info.setStatus(WebserviceInfo.STATE_STOPPED_ERROR);\r
1107             info.appendProgressText("Problem obtaining clustal alignment");\r
1108         }\r
1109       }\r
1110     }\r
1111 \r
1112   protected void jpred_actionPerformed(ActionEvent e)\r
1113 {\r
1114 \r
1115     if (viewport.getSelectionGroup() != null && viewport.getSelectionGroup().getSize()>0)\r
1116     {\r
1117       // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!\r
1118       SequenceGroup seqs = viewport.getSelectionGroup();\r
1119       if (seqs.getSize() == 1 || !viewport.alignment.isAligned())\r
1120       {\r
1121         JPredClient ct = new JPredClient( (SequenceI)seqs.getSequenceAt(0));\r
1122       }\r
1123       else\r
1124       {\r
1125         int sz;\r
1126         SequenceI[] msa = new SequenceI[sz=seqs.getSize()];\r
1127         for (int i = 0; i < sz; i++)\r
1128         {\r
1129           msa[i] = (SequenceI) seqs.getSequenceAt(i);\r
1130         }\r
1131 \r
1132         JPredClient ct = new JPredClient(msa);\r
1133       }\r
1134 \r
1135     }\r
1136     else\r
1137     {\r
1138       Vector seqs = viewport.getAlignment().getSequences();\r
1139 \r
1140       if (seqs.size() == 1 || !viewport.alignment.isAligned())\r
1141       {\r
1142         JPredClient ct = new JPredClient( (SequenceI)\r
1143                                          seqs.elementAt(0));\r
1144       }\r
1145       else\r
1146       {\r
1147         SequenceI[] msa = new SequenceI[seqs.size()];\r
1148         for (int i = 0; i < seqs.size(); i++)\r
1149         {\r
1150           msa[i] = (SequenceI) seqs.elementAt(i);\r
1151         }\r
1152 \r
1153         JPredClient ct = new JPredClient(msa);\r
1154       }\r
1155 \r
1156     }\r
1157   }\r
1158   protected void msaAlignMenuItem_actionPerformed(ActionEvent e)\r
1159   {\r
1160     // TODO:resolve which menu item was actually selected\r
1161     // Now, check we have enough sequences\r
1162       if (viewport.getSelectionGroup() != null && viewport.getSelectionGroup().getSize()>1)\r
1163       {\r
1164         // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!\r
1165         SequenceGroup seqs = viewport.getSelectionGroup();\r
1166         int sz;\r
1167         SequenceI[] msa = new SequenceI[sz=seqs.getSize()];\r
1168         for (int i = 0; i < sz; i++)\r
1169         {\r
1170           msa[i] = (SequenceI) seqs.getSequenceAt(i);\r
1171         }\r
1172 \r
1173         MsaWSClient ct = new jalview.ws.MsaWSClient(msa);\r
1174       }\r
1175       else\r
1176       {\r
1177         Vector seqs = viewport.getAlignment().getSequences();\r
1178 \r
1179         if (seqs.size() > 1) {\r
1180           SequenceI[] msa = new SequenceI[seqs.size()];\r
1181           for (int i = 0; i < seqs.size(); i++)\r
1182           {\r
1183             msa[i] = (SequenceI) seqs.elementAt(i);\r
1184           }\r
1185 \r
1186           MsaWSClient ct = new MsaWSClient(msa);\r
1187         }\r
1188 \r
1189       }\r
1190     }\r
1191 \r
1192     protected void LoadtreeMenuItem_actionPerformed(ActionEvent e) {\r
1193     // Pick the tree file\r
1194     JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.\r
1195         getProperty("LAST_DIRECTORY"));\r
1196     chooser.setFileView(new JalviewFileView());\r
1197     chooser.setDialogTitle("Select a newick-like tree file");\r
1198     chooser.setToolTipText("Load a tree file");\r
1199     int value = chooser.showOpenDialog(null);\r
1200     if (value == JalviewFileChooser.APPROVE_OPTION)\r
1201     {\r
1202       String choice = chooser.getSelectedFile().getPath();\r
1203       jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);\r
1204       TreePanel treepanel = null;\r
1205       try\r
1206       {\r
1207         jalview.io.NewickFile fin = new jalview.io.NewickFile(choice, "File");\r
1208         fin.parse();\r
1209 \r
1210         if (fin.getTree() != null)\r
1211         {\r
1212           TreePanel tp = null;\r
1213           tp = new TreePanel(viewport, viewport.getAlignment().getSequences(),\r
1214                              fin, "FromFile", choice);\r
1215           Desktop.addInternalFrame(tp, title, 600, 500);\r
1216           addTreeMenuItem(tp, title);\r
1217         }\r
1218       }\r
1219       catch (Exception ex)\r
1220       {\r
1221         JOptionPane.showMessageDialog(Desktop.desktop,\r
1222                                       "Problem reading tree file",\r
1223                                       ex.getMessage(),\r
1224                                       JOptionPane.WARNING_MESSAGE);\r
1225         ex.printStackTrace();\r
1226       }\r
1227     }\r
1228   }\r
1229 \r
1230 }\r