8af52d0e4dcc028acb9f6b9c9cd602aa6463400f
[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 java.awt.event.*;\r
20 import java.awt.*;\r
21 import javax.swing.*;\r
22 \r
23 public class AlignFrame extends GAlignFrame\r
24 {\r
25   AlignmentPanel alignPanel;\r
26   AlignViewport viewport;\r
27   public AlignFrame(AlignmentI al)\r
28   {\r
29     super();\r
30     viewport = new AlignViewport(al,true,true,true,false);\r
31     alignPanel = new AlignmentPanel(this, viewport);\r
32     getContentPane().add(alignPanel, java.awt.BorderLayout.CENTER);\r
33     fontNameMenuItem.setText(viewport.getFont().getName());\r
34     fontSizeMenuItem.setText(viewport.getFont().getSize()+"");\r
35   }\r
36 \r
37   protected void saveAs_actionPerformed(ActionEvent e)\r
38   {\r
39     JFileChooser chooser = new JFileChooser(jalview.bin.Cache.LAST_DIRECTORY);\r
40     chooser.setDialogTitle("Save Alignment to file - "+e.getActionCommand() +" format.");\r
41     chooser.setToolTipText("Save");\r
42     int value = chooser.showSaveDialog(this);\r
43     if(value == JFileChooser.APPROVE_OPTION)\r
44     {\r
45       String choice =  chooser.getSelectedFile().getPath();\r
46       jalview.bin.Cache.LAST_DIRECTORY = choice;\r
47       String output = FormatAdapter.get(e.getActionCommand(), viewport.getAlignment().getSequences());\r
48       try{\r
49         java.io.PrintWriter out = new java.io.PrintWriter( new java.io.FileWriter( choice )  );\r
50         out.println(output);\r
51         out.close();\r
52       }\r
53       catch(Exception ex){}\r
54     }\r
55 \r
56   }\r
57 \r
58   protected void outputText_actionPerformed(ActionEvent e)\r
59   {\r
60      CutAndPasteTransfer cap = new CutAndPasteTransfer(false);\r
61      JInternalFrame frame = new JInternalFrame();\r
62      cap.formatForOutput();\r
63      frame.setContentPane(cap);\r
64      Desktop.addInternalFrame(frame, "Alignment output - "+e.getActionCommand(), 600, 500);\r
65      cap.setText( FormatAdapter.get(e.getActionCommand(), viewport.getAlignment().getSequences()));\r
66   }\r
67 \r
68   protected void htmlMenuItem_actionPerformed(ActionEvent e)\r
69   {\r
70     HTMLOutput htmlOutput = new HTMLOutput(viewport.getAlignment(), alignPanel.seqPanel.getColourScheme());\r
71     htmlOutput = null;\r
72   }\r
73 \r
74   public void saveAsPostscriptMenuItem_actionPerformed(ActionEvent e)\r
75   {\r
76 \r
77   }\r
78 \r
79   public void closeMenuItem_actionPerformed(ActionEvent e)\r
80   {\r
81     try{\r
82       this.setClosed(true);\r
83     }catch(Exception ex){}\r
84   }\r
85 \r
86   public void groupsMenuItem_actionPerformed(ActionEvent e)\r
87   {\r
88 \r
89   }\r
90 \r
91   public void groupEditingMenuItem_actionPerformed(ActionEvent e)\r
92   {\r
93 \r
94   }\r
95 \r
96   public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)\r
97   {\r
98     Selection sel = viewport.getSelection();\r
99     for (int i=0; i<viewport.getAlignment().getSequences().size(); i++)\r
100       sel.addElement( viewport.getAlignment().getSequenceAt(i));\r
101     PaintRefresher.Refresh(null);\r
102   }\r
103 \r
104   public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)\r
105   {\r
106     viewport.getSelection().clear();\r
107     PaintRefresher.Refresh(null);\r
108   }\r
109 \r
110   public void invertSequenceMenuItem_actionPerformed(ActionEvent e)\r
111   {\r
112     Selection sel = viewport.getSelection();\r
113     for (int i=0; i<viewport.getAlignment().getSequences().size(); i++)\r
114     {\r
115       if (sel.contains(viewport.getAlignment().getSequenceAt(i)))\r
116         sel.removeElement(viewport.getAlignment().getSequenceAt(i));\r
117       else\r
118         sel.addElement(viewport.getAlignment().getSequenceAt(i));\r
119     }\r
120     PaintRefresher.Refresh(null);\r
121   }\r
122 \r
123   public void deleteSelectedMenuItem_actionPerformed(ActionEvent e)\r
124   {\r
125     for (int i=0;i < viewport.getSelection().size(); i++)\r
126             viewport.getAlignment().deleteSequence(viewport.getSelection().sequenceAt(i));\r
127 \r
128     viewport.getSelection().clear();\r
129     viewport.resetSeqLimits(alignPanel.seqPanel.seqCanvas.getHeight());\r
130     alignPanel.RefreshPanels();\r
131   }\r
132 \r
133   public void moveSelectedMenuItem_actionPerformed(ActionEvent e)\r
134   {\r
135     copySelectedMenuItem_actionPerformed(null);\r
136     deleteSelectedMenuItem_actionPerformed(null);\r
137     alignPanel.repaint();\r
138   }\r
139 \r
140   public void copySelectedMenuItem_actionPerformed(ActionEvent e)\r
141   {\r
142     if(viewport.getSelection().size()==0)\r
143       return;\r
144 \r
145    SequenceI[] s = new Sequence[viewport.getSelection().size()];\r
146    for (int i=0; i < viewport.getSelection().size(); i++) {\r
147      s[i] = new Sequence(viewport.getSelection().sequenceAt(i));\r
148     }\r
149     AlignFrame af = new AlignFrame(new Alignment(s));\r
150 \r
151     int newHeight = s.length * af.viewport.getCharHeight() + 200;\r
152     if(newHeight>500)\r
153       newHeight=500;\r
154     Desktop.addInternalFrame(af, "Copied sequences", 700,newHeight);\r
155   }\r
156 \r
157   public void deselectAllColumnsMenuItem_actionPerformed(ActionEvent e)\r
158   {\r
159     viewport.getColumnSelection().clear();\r
160     repaint();\r
161   }\r
162 \r
163   public void remove2LeftMenuItem_actionPerformed(ActionEvent e)\r
164   {\r
165     ColumnSelection colSel = viewport.getColumnSelection();\r
166     if (colSel.size() > 0)\r
167     {\r
168       int min = colSel.getMin();\r
169       viewport.getAlignment().trimLeft(min);\r
170       colSel.compensateForEdit(0,min);\r
171       alignPanel.RefreshPanels();\r
172     }\r
173   }\r
174 \r
175   public void remove2RightMenuItem_actionPerformed(ActionEvent e)\r
176   {\r
177     ColumnSelection colSel = viewport.getColumnSelection();\r
178     if (colSel.size() > 0)\r
179     {\r
180       int max = colSel.getMax();\r
181       if(max>1)\r
182         viewport.getAlignment().trimRight(max);\r
183 \r
184       alignPanel.RefreshPanels();\r
185     }\r
186 \r
187   }\r
188 \r
189   public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)\r
190   {\r
191     viewport.getAlignment().removeGaps();\r
192     alignPanel.RefreshPanels();\r
193   }\r
194 \r
195   public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)\r
196   {\r
197     SequenceI current;\r
198     int jSize;\r
199     for (int i=0; i < viewport.getAlignment().getSequences().size();i++)\r
200     {\r
201       current = viewport.getAlignment().getSequenceAt(i);\r
202       jSize = current.getLength();\r
203       for (int j=0; j < jSize; j++)\r
204         if (current.getCharAt(j)=='-' || current.getCharAt(j)=='.' || current.getCharAt(j)==' ')\r
205         {\r
206           current.deleteCharAt(j);\r
207           j--;\r
208           jSize--;\r
209         }\r
210     }\r
211 \r
212     alignPanel.RefreshPanels();\r
213   }\r
214 \r
215   public void setGapCharMenuItem_actionPerformed(ActionEvent e)\r
216   {\r
217     String thisChar = "-";\r
218     String nextChar = ".";\r
219     if(viewport.getGapCharacter().equals("-"))\r
220     {\r
221       thisChar = ".";\r
222       nextChar = "-";\r
223     }\r
224     setGapCharMenuItem.setText("Set gap character to \""+nextChar+"\"");\r
225     viewport.setGapCharacter(thisChar);\r
226   }\r
227 \r
228 \r
229   public void fontNameMenuItem_actionPerformed(ActionEvent e)\r
230   {\r
231     String fonts[] = java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();\r
232 \r
233 \r
234     String selection = JOptionPane.showInputDialog(this,\r
235                                 "Select font",\r
236                                 "Font selection",\r
237                                 JOptionPane.QUESTION_MESSAGE,\r
238                                 null,fonts\r
239                                 ,fontNameMenuItem.getText()).toString();\r
240     if(selection!=null)\r
241     {\r
242        fontNameMenuItem.setText(selection);\r
243        SetFont();\r
244      }\r
245 \r
246   }\r
247 \r
248   public void fontSizeMenuItem_actionPerformed(ActionEvent e)\r
249   {\r
250     String selection = JOptionPane.showInputDialog(this,\r
251                                 "Select font size",\r
252                                 "Font size",\r
253                                 JOptionPane.QUESTION_MESSAGE,\r
254                                 null, new String[]{"1","2","4","6","8","10","12","14","16","18","20"}\r
255                                 ,fontSizeMenuItem.getText()).toString();\r
256     if(selection!=null)\r
257      {\r
258        fontSizeMenuItem.setText(selection);\r
259        SetFont();\r
260      }\r
261   }\r
262 \r
263   public void fontStyleMenuItem_actionPerformed(ActionEvent e)\r
264   {\r
265     String selection = JOptionPane.showInputDialog(this,\r
266                                 "Select font style",\r
267                                 "Font style",\r
268                                 JOptionPane.QUESTION_MESSAGE,\r
269                                 null, new String[]{"plain", "bold", "italic"}\r
270                                 ,fontStyleMenuItem.getText()).toString();\r
271     if(selection!=null)\r
272     {\r
273       fontStyleMenuItem.setText(selection);\r
274       SetFont();\r
275     }\r
276 \r
277   }\r
278 \r
279   protected void colourTextMenuItem_actionPerformed(ActionEvent e)\r
280   {\r
281     viewport.setColourText( colourTextMenuItem.isSelected() );\r
282     alignPanel.RefreshPanels();\r
283   }\r
284 \r
285   void SetFont()\r
286   {\r
287       int style = java.awt.Font.PLAIN;\r
288       if(fontStyleMenuItem.getText().equals("bold"))\r
289         style = java.awt.Font.BOLD;\r
290       else if(fontStyleMenuItem.getText().equals("italic"))\r
291         style = java.awt.Font.ITALIC;\r
292 \r
293       viewport.setFont(new java.awt.Font(fontNameMenuItem.getText(),\r
294                                            style,\r
295                                            Integer.parseInt(fontSizeMenuItem.getText())));\r
296       alignPanel.RefreshPanels();\r
297 \r
298   }\r
299 \r
300   public void viewBoxesMenuItem_actionPerformed(ActionEvent e)\r
301   {\r
302     viewport.setShowBoxes( viewBoxesMenuItem.isSelected() );\r
303     alignPanel.RefreshPanels();\r
304   }\r
305 \r
306   public void viewTextMenuItem_actionPerformed(ActionEvent e)\r
307   {\r
308     viewport.setShowText( viewTextMenuItem.isSelected() );\r
309     alignPanel.RefreshPanels();\r
310   }\r
311 \r
312 \r
313   public void consensusGraphMenuItem_actionPerformed(ActionEvent e)\r
314   {\r
315     alignPanel.setGraphPanelVisible( consensusGraphMenuItem.isSelected() );\r
316   }\r
317 \r
318   public void overviewMenuItem_actionPerformed(ActionEvent e)\r
319   {\r
320 \r
321     JInternalFrame frame = new JInternalFrame();\r
322     OverviewPanel overview = alignPanel.getOverviewPanel();\r
323    try{\r
324      overview = new OverviewPanel(alignPanel, viewport);\r
325      frame.setContentPane(overview);\r
326     Desktop.addInternalFrame(frame, "Overview " + this.getTitle(),\r
327                              frame.getWidth(), frame.getHeight());\r
328     frame.pack();\r
329     frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()\r
330     { public void internalFrameClosed(javax.swing.event.InternalFrameEvent evt)\r
331       {\r
332             alignPanel.setOverviewPanel(null);\r
333       };\r
334     });\r
335     alignPanel.setOverviewPanel( overview );\r
336 \r
337   }catch(java.lang.OutOfMemoryError ex)\r
338    {\r
339      JOptionPane.showMessageDialog(this, "Sequence alignment too large to\nproduce overview image!!",\r
340                                    "Out of memory", JOptionPane.WARNING_MESSAGE);\r
341    }\r
342 \r
343 \r
344   }\r
345 \r
346 \r
347   public void clustalColour_actionPerformed(ActionEvent e)\r
348   {\r
349    // alignPanel.setColourScheme( new ClustalxColourScheme() );\r
350   }\r
351 \r
352   public void zappoColour_actionPerformed(ActionEvent e)\r
353   {\r
354     alignPanel.setColourScheme( new ZappoColourScheme() );\r
355   }\r
356 \r
357   public void taylorColour_actionPerformed(ActionEvent e)\r
358   {\r
359     alignPanel.setColourScheme( new TaylorColourScheme() );\r
360   }\r
361 \r
362 \r
363   public void hydrophobicityColour_actionPerformed(ActionEvent e)\r
364   {\r
365     alignPanel.setColourScheme( new HydrophobicColourScheme() );\r
366   }\r
367 \r
368   public void helixColour_actionPerformed(ActionEvent e)\r
369   {\r
370     alignPanel.seqPanel.setColourScheme( new HelixColourScheme() );\r
371   }\r
372 \r
373   public void strandColour_actionPerformed(ActionEvent e)\r
374   {\r
375     alignPanel.setColourScheme( new StrandColourScheme() );\r
376   }\r
377 \r
378   public void turnColour_actionPerformed(ActionEvent e)\r
379   {\r
380     alignPanel.setColourScheme( new TurnColourScheme() );\r
381   }\r
382 \r
383   public void buriedColour_actionPerformed(ActionEvent e)\r
384   {\r
385     alignPanel.setColourScheme( new BuriedColourScheme() );\r
386   }\r
387 \r
388   public void conservationColour_actionPerformed(ActionEvent e)\r
389   {\r
390 \r
391   }\r
392 \r
393   public void conservationColourIncMenuItem_actionPerformed(ActionEvent e)\r
394  {\r
395 \r
396  }\r
397 \r
398 \r
399   public void abovePIDColour_actionPerformed(ActionEvent e)\r
400   {\r
401     alignPanel.setColourScheme( new PIDColourScheme() );\r
402   }\r
403 \r
404 \r
405   public void userDefinedColour_actionPerformed(ActionEvent e)\r
406   {\r
407     JInternalFrame frame = new JInternalFrame();\r
408     UserDefinedColours chooser = new UserDefinedColours( frame, alignPanel.seqPanel );\r
409     frame.setContentPane(chooser);\r
410     Desktop.addInternalFrame(frame,"User defined colours", 450,540 );\r
411     frame.setResizable(false);\r
412     frame.setIconifiable(false);\r
413     frame.setMaximizable(false);\r
414   }\r
415 \r
416   public void PIDColour_actionPerformed(ActionEvent e)\r
417   {\r
418     alignPanel.setColourScheme( new PIDColourScheme() );\r
419   }\r
420 \r
421   public void BLOSUM62Colour_actionPerformed(ActionEvent e)\r
422   {\r
423     alignPanel.setColourScheme( new Blosum62ColourScheme(viewport) );\r
424   }\r
425 \r
426 \r
427   protected void schemeKeyMenuItem_actionPerformed(ActionEvent e)\r
428   {\r
429     ColourKey colourKey = new ColourKey( alignPanel.seqPanel.getColourScheme() );\r
430     Desktop.addInternalFrame(colourKey, "Colour scheme key", 400, 320);\r
431   }\r
432 \r
433 \r
434   public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)\r
435   {\r
436     AlignmentSorter.sortByPID(viewport.getAlignment(), viewport.getAlignment().getSequenceAt(0));\r
437     alignPanel.RefreshPanels();\r
438   }\r
439 \r
440   public void sortIDMenuItem_actionPerformed(ActionEvent e)\r
441   {\r
442     AlignmentSorter.sortByID( viewport.getAlignment() );\r
443     alignPanel.RefreshPanels();\r
444   }\r
445 \r
446   public void sortGroupMenuItem_actionPerformed(ActionEvent e)\r
447   {\r
448     AlignmentSorter.sortGroups(viewport.getAlignment());\r
449     AlignmentSorter.sortGroups(viewport.getAlignment());\r
450     alignPanel.RefreshPanels();\r
451   }\r
452 \r
453   public void sortTreeOrderMenuItem_actionPerformed(ActionEvent e)\r
454   {\r
455     if(viewport.getCurrentTree()==null)\r
456       return;\r
457 \r
458     AlignmentSorter.sortByTree(viewport.getAlignment(), viewport.getCurrentTree());\r
459     alignPanel.RefreshPanels();\r
460   }\r
461 \r
462   public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)\r
463   {\r
464 \r
465   }\r
466 \r
467   public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)\r
468   {\r
469     if(viewport.getSelection().size()<2)\r
470       JOptionPane.showMessageDialog(this, "You must select at least 2 sequences.", "Invalid Selection", JOptionPane.WARNING_MESSAGE);\r
471     else\r
472     {\r
473       JInternalFrame frame = new JInternalFrame();\r
474       frame.setContentPane(new PairwiseAlignPanel(viewport));\r
475       Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);\r
476     }\r
477   }\r
478 \r
479   public void PCAMenuItem_actionPerformed(ActionEvent e)\r
480   {\r
481     if( (viewport.getSelection().size()<4 && viewport.getSelection().size()>0)\r
482        || viewport.getAlignment().getHeight()<4)\r
483     {\r
484       JOptionPane.showMessageDialog(this, "Principal component analysis must take\n"\r
485                                     +"at least 4 input sequences.",\r
486                                     "Sequence selection insufficient",\r
487                                     JOptionPane.WARNING_MESSAGE);\r
488       return;\r
489     }\r
490 \r
491     PCAPanel pcaPanel = new PCAPanel(viewport, null);\r
492     JInternalFrame frame = new JInternalFrame();\r
493     frame.setContentPane(pcaPanel);\r
494     Desktop.addInternalFrame(frame, "Principal component analysis", 400,400);\r
495   }\r
496 \r
497   public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)\r
498   {\r
499     NewTreePanel("AV", "PID", "Average distance tree using PID");\r
500   }\r
501 \r
502   public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)\r
503   {\r
504     NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");\r
505   }\r
506 \r
507 \r
508   protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)\r
509   {\r
510     NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");\r
511   }\r
512 \r
513   protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)\r
514   {\r
515     NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62PID");\r
516   }\r
517 \r
518   void NewTreePanel(String type, String pwType, String title)\r
519   {\r
520     JInternalFrame frame = new javax.swing.JInternalFrame();\r
521     TreePanel tp=null;\r
522    if (viewport.getSelection() != null && viewport.getSelection().size() > 3)\r
523    {\r
524      tp = new TreePanel(viewport, viewport.getSelection().asVector(),type, pwType,\r
525                          viewport.getStartRes(), viewport.getEndRes());\r
526    }\r
527    else\r
528    {\r
529      tp = new TreePanel(viewport, viewport.getAlignment().getSequences(),\r
530                          type, pwType, viewport.getStartRes(),\r
531                          viewport.getEndRes());\r
532    }\r
533 \r
534    frame.setContentPane(tp);\r
535    Desktop.addInternalFrame(frame, title, 600, 500);\r
536   }\r
537 \r
538 \r
539 \r
540   public void clustalAlignMenuItem_actionPerformed(ActionEvent e)\r
541   {\r
542     JOptionPane.showMessageDialog(this, "Jalview is currently being reengineered"\r
543                                   +"\nwithin the Barton Group, Dundee University."\r
544                                   +"\nThis will be available as a web service 2005",\r
545                                   "Web service", JOptionPane.INFORMATION_MESSAGE);\r
546   }\r
547 \r
548 }\r