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