Keep startRes the same after removing columns
[jalview.git] / src / jalview / appletgui / AlignFrame.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer\r
3  * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
4  *\r
5  * This program is free software; you can redistribute it and/or\r
6  * modify it under the terms of the GNU General Public License\r
7  * as published by the Free Software Foundation; either version 2\r
8  * of the License, or (at your option) any later version.\r
9  *\r
10  * This program is distributed in the hope that it will be useful,\r
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13  * GNU General Public License for more details.\r
14  *\r
15  * You should have received a copy of the GNU General Public License\r
16  * along with this program; if not, write to the Free Software\r
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
18  */\r
19 \r
20 package jalview.appletgui;\r
21 \r
22 import jalview.jbappletgui.GAlignFrame;\r
23 import jalview.schemes.*;\r
24 import jalview.datamodel.*;\r
25 import jalview.analysis.*;\r
26 import jalview.io.*;\r
27 import java.awt.*;\r
28 import java.awt.event.*;\r
29 import java.util.*;\r
30 import java.io.InputStreamReader;\r
31 import java.io.BufferedReader;\r
32 \r
33 public class AlignFrame\r
34     extends GAlignFrame\r
35 {\r
36   final AlignmentPanel alignPanel;\r
37   final AlignViewport viewport;\r
38   public static final int NEW_WINDOW_WIDTH = 700;\r
39   public static final int NEW_WINDOW_HEIGHT = 500;\r
40   jalview.bin.JalviewLite applet;\r
41 \r
42   public AlignFrame(AlignmentI al)\r
43   {\r
44     this.applet = null;\r
45     viewport = new AlignViewport(al, null);\r
46     alignPanel = new AlignmentPanel(this, viewport);\r
47     add(alignPanel);\r
48     alignPanel.validate();\r
49 \r
50     this.addWindowListener(new WindowAdapter()\r
51     {\r
52       public void windowClosing(WindowEvent e)\r
53       {\r
54         closeMenuItem_actionPerformed(null);\r
55       }\r
56     });\r
57 \r
58   }\r
59 \r
60 \r
61   public AlignFrame(AlignmentI al, jalview.bin.JalviewLite applet)\r
62   {\r
63     this.applet = applet;\r
64     viewport = new AlignViewport(al, applet);\r
65     alignPanel = new AlignmentPanel(this, viewport);\r
66     add(alignPanel);\r
67     alignPanel.validate();\r
68 \r
69     String treeFile = applet.getParameter("treeFile");\r
70     if (treeFile != null)\r
71     {\r
72       try\r
73       {\r
74         treeFile = treeFile;\r
75         jalview.io.NewickFile fin = new jalview.io.NewickFile(applet.\r
76             getCodeBase() + treeFile, "URL");\r
77         fin.parse();\r
78 \r
79         if (fin.getTree() != null)\r
80         {\r
81           TreePanel tp = null;\r
82           tp = new TreePanel(viewport, viewport.getAlignment().getSequences(),\r
83                              fin, "FromFile", applet.getCodeBase() + treeFile);\r
84           jalview.bin.JalviewLite.addFrame(tp, treeFile, 600, 500);\r
85           addTreeMenuItem(tp, treeFile);\r
86         }\r
87       }\r
88       catch (Exception ex)\r
89       {\r
90         ex.printStackTrace();\r
91       }\r
92     }\r
93 \r
94     this.addWindowListener(new WindowAdapter()\r
95     {\r
96       public void windowClosing(WindowEvent e)\r
97           {\r
98             closeMenuItem_actionPerformed(null);\r
99           }\r
100     });\r
101 \r
102 \r
103 \r
104   }\r
105 \r
106   public void inputText_actionPerformed(ActionEvent e)\r
107   {\r
108     CutAndPasteTransfer cap = new CutAndPasteTransfer(true);\r
109     Frame frame = new Frame();\r
110     frame.add(cap);\r
111     jalview.bin.JalviewLite.addFrame(frame, "Cut & Paste Input", 500, 500);\r
112   }\r
113 \r
114   protected void outputText_actionPerformed(ActionEvent e)\r
115   {\r
116     CutAndPasteTransfer cap = new CutAndPasteTransfer(false);\r
117     Frame frame = new Frame();\r
118     frame.add(cap);\r
119     jalview.bin.JalviewLite.addFrame(frame,\r
120                                      "Alignment output - " + e.getActionCommand(),\r
121                                      600, 500);\r
122     cap.setText(FormatAdapter.formatSequences(e.getActionCommand(),\r
123                                               viewport.getAlignment().\r
124                                               getSequences()));\r
125   }\r
126 \r
127   public void closeMenuItem_actionPerformed(ActionEvent e)\r
128   {\r
129     PaintRefresher.components.remove(viewport.alignment);\r
130     dispose();\r
131   }\r
132 \r
133   Stack historyList = new Stack();\r
134   Stack redoList = new Stack();\r
135 \r
136   void updateEditMenuBar()\r
137   {\r
138     if (historyList.size() > 0)\r
139     {\r
140       undoMenuItem.setEnabled(true);\r
141       HistoryItem hi = (HistoryItem) historyList.peek();\r
142       undoMenuItem.setLabel("Undo " + hi.getDescription());\r
143     }\r
144     else\r
145     {\r
146       undoMenuItem.setEnabled(false);\r
147       undoMenuItem.setLabel("Undo");\r
148     }\r
149 \r
150     if (redoList.size() > 0)\r
151     {\r
152       redoMenuItem.setEnabled(true);\r
153       HistoryItem hi = (HistoryItem) redoList.peek();\r
154       redoMenuItem.setLabel("Redo " + hi.getDescription());\r
155     }\r
156     else\r
157     {\r
158       redoMenuItem.setEnabled(false);\r
159       redoMenuItem.setLabel("Redo");\r
160     }\r
161   }\r
162 \r
163   public void addHistoryItem(HistoryItem hi)\r
164   {\r
165     historyList.push(hi);\r
166     updateEditMenuBar();\r
167   }\r
168 \r
169   protected void undoMenuItem_actionPerformed(ActionEvent e)\r
170   {\r
171     HistoryItem hi = (HistoryItem) historyList.pop();\r
172     redoList.push(new HistoryItem(hi.getDescription(), viewport.alignment,\r
173                                   HistoryItem.HIDE));\r
174     restoreHistoryItem(hi);\r
175   }\r
176 \r
177   protected void redoMenuItem_actionPerformed(ActionEvent e)\r
178   {\r
179     HistoryItem hi = (HistoryItem) redoList.pop();\r
180     restoreHistoryItem(hi);\r
181     updateEditMenuBar();\r
182     viewport.updateConsensus();\r
183     alignPanel.repaint();\r
184     alignPanel.repaint();\r
185   }\r
186 \r
187   // used by undo and redo\r
188   void restoreHistoryItem(HistoryItem hi)\r
189   {\r
190     if (hi.getType() == HistoryItem.SORT)\r
191     {\r
192       for (int i = 0; i < hi.getSequences().size(); i++)\r
193       {\r
194         viewport.alignment.getSequences().setElementAt(hi.getSequences().\r
195             elementAt(i), i);\r
196       }\r
197     }\r
198     else\r
199     {\r
200       for (int i = 0; i < hi.getSequences().size(); i++)\r
201       {\r
202         SequenceI restore = (SequenceI) hi.getSequences().elementAt(i);\r
203         if (restore.getLength() == 0)\r
204         {\r
205           // log.System.out.println(hi.getHidden().elementAt(i));\r
206           restore.setSequence(hi.getHidden().elementAt(i).toString());\r
207           viewport.alignment.getSequences().insertElementAt(\r
208               restore,\r
209               hi.getAlignIndex(i));\r
210         }\r
211         else\r
212         {\r
213           restore.setSequence(hi.getHidden().elementAt(i).toString());\r
214         }\r
215       }\r
216       if (hi.getType() == HistoryItem.PASTE)\r
217       {\r
218         for (int i = viewport.alignment.getHeight() - 1;\r
219              i > hi.getSequences().size() - 1; i--)\r
220         {\r
221           viewport.alignment.deleteSequence(i);\r
222         }\r
223       }\r
224     }\r
225 \r
226     updateEditMenuBar();\r
227 \r
228     viewport.updateConsensus();\r
229     viewport.updateConservation();\r
230     alignPanel.repaint();\r
231   }\r
232 \r
233   public void moveSelectedSequences(boolean up)\r
234   {\r
235     SequenceGroup sg = viewport.getSelectionGroup();\r
236     if (sg == null)\r
237     {\r
238       return;\r
239     }\r
240 \r
241     if (up)\r
242     {\r
243       for (int i = 1; i < viewport.alignment.getHeight(); i++)\r
244       {\r
245         SequenceI seq = viewport.alignment.getSequenceAt(i);\r
246         if (!sg.sequences.contains(seq))\r
247         {\r
248           continue;\r
249         }\r
250 \r
251         SequenceI temp = viewport.alignment.getSequenceAt(i - 1);\r
252         if (sg.sequences.contains(temp))\r
253         {\r
254           continue;\r
255         }\r
256 \r
257         viewport.alignment.getSequences().setElementAt(temp, i);\r
258         viewport.alignment.getSequences().setElementAt(seq, i - 1);\r
259       }\r
260     }\r
261     else\r
262     {\r
263       for (int i = viewport.alignment.getHeight() - 2; i > -1; i--)\r
264       {\r
265         SequenceI seq = viewport.alignment.getSequenceAt(i);\r
266         if (!sg.sequences.contains(seq))\r
267         {\r
268           continue;\r
269         }\r
270 \r
271         SequenceI temp = viewport.alignment.getSequenceAt(i + 1);\r
272         if (sg.sequences.contains(temp))\r
273         {\r
274           continue;\r
275         }\r
276 \r
277         viewport.alignment.getSequences().setElementAt(temp, i);\r
278         viewport.alignment.getSequences().setElementAt(seq, i + 1);\r
279       }\r
280     }\r
281 \r
282     alignPanel.repaint();\r
283   }\r
284 \r
285   StringBuffer copiedSequences;\r
286   protected void copy_actionPerformed(ActionEvent e)\r
287   {\r
288     if (viewport.getSelectionGroup() == null)\r
289     {\r
290       return;\r
291     }\r
292 \r
293     SequenceGroup sg = viewport.getSelectionGroup();\r
294     copiedSequences = new StringBuffer();\r
295     Hashtable orderedSeqs = new Hashtable();\r
296     for (int i = 0; i < sg.getSize(); i++)\r
297     {\r
298       SequenceI seq = sg.getSequenceAt(i);\r
299       int index = viewport.alignment.findIndex(seq);\r
300       orderedSeqs.put(index + "", seq);\r
301     }\r
302 \r
303     int index = 0, startRes, endRes;\r
304     char ch;\r
305 \r
306     for (int i = 0; i < sg.getSize(); i++)\r
307     {\r
308         SequenceI seq = null;\r
309 \r
310         while (seq == null)\r
311         {\r
312             if (orderedSeqs.containsKey(index + ""))\r
313             {\r
314                 seq = (SequenceI) orderedSeqs.get(index + "");\r
315                 index++;\r
316 \r
317                 break;\r
318             }\r
319             else\r
320             {\r
321                 index++;\r
322             }\r
323         }\r
324 \r
325         //FIND START RES\r
326         //Returns residue following index if gap\r
327         startRes = seq.findPosition(sg.getStartRes());\r
328 \r
329         //FIND END RES\r
330         //Need to find the residue preceeding index if gap\r
331         endRes = 0;\r
332 \r
333         for (int j = 0; j < sg.getEndRes()+1 && j < seq.getLength(); j++)\r
334         {\r
335           ch = seq.getCharAt(j);\r
336           if (!jalview.util.Comparison.isGap( (ch)))\r
337           {\r
338             endRes++;\r
339           }\r
340         }\r
341 \r
342         if(endRes>0)\r
343         {\r
344           endRes += seq.getStart() -1;\r
345         }\r
346 \r
347         copiedSequences.append(seq.getName() + "\t" +\r
348             startRes + "\t" +\r
349             endRes + "\t" +\r
350             seq.getSequence(sg.getStartRes(),\r
351                 sg.getEndRes() + 1) + "\n");\r
352     }\r
353 \r
354   }\r
355 \r
356   protected void pasteNew_actionPerformed(ActionEvent e)\r
357   {\r
358     paste(true);\r
359   }\r
360 \r
361   protected void pasteThis_actionPerformed(ActionEvent e)\r
362   {\r
363     addHistoryItem(new HistoryItem("Paste Sequences", viewport.alignment,\r
364                                    HistoryItem.PASTE));\r
365     paste(false);\r
366   }\r
367 \r
368   void paste(boolean newAlignment)\r
369   {\r
370     try\r
371     {\r
372       if (copiedSequences == null)\r
373       {\r
374         return;\r
375       }\r
376 \r
377       StringTokenizer st = new StringTokenizer(copiedSequences.toString());\r
378       Vector seqs = new Vector();\r
379       while (st.hasMoreElements())\r
380       {\r
381         String name = st.nextToken();\r
382         int start = Integer.parseInt(st.nextToken());\r
383         int end = Integer.parseInt(st.nextToken());\r
384         Sequence sequence = new Sequence(name, st.nextToken(), start, end);\r
385 \r
386         if (!newAlignment)\r
387         {\r
388           viewport.alignment.addSequence(sequence);\r
389         }\r
390         else\r
391         {\r
392           seqs.addElement(sequence);\r
393         }\r
394       }\r
395 \r
396       if (newAlignment)\r
397       {\r
398         SequenceI[] newSeqs = new SequenceI[seqs.size()];\r
399         for (int i = 0; i < seqs.size(); i++)\r
400         {\r
401           newSeqs[i] = (SequenceI) seqs.elementAt(i);\r
402         }\r
403 \r
404         AlignFrame af = new AlignFrame(new Alignment(newSeqs), applet);\r
405         String newtitle = new String("Copied sequences");\r
406         if (getTitle().startsWith("Copied sequences"))\r
407         {\r
408           newtitle = getTitle();\r
409         }\r
410         else\r
411         {\r
412           newtitle = newtitle.concat("- from " + getTitle());\r
413         }\r
414         jalview.bin.JalviewLite.addFrame(af, newtitle, NEW_WINDOW_WIDTH,\r
415                                          NEW_WINDOW_HEIGHT);\r
416       }\r
417       else\r
418       {\r
419         viewport.setEndSeq(viewport.alignment.getHeight());\r
420         viewport.alignment.getWidth();\r
421         viewport.updateConservation();\r
422         viewport.updateConsensus();\r
423         alignPanel.repaint();\r
424       }\r
425 \r
426     }\r
427     catch (Exception ex)\r
428     {} // could be anything being pasted in here\r
429 \r
430   }\r
431 \r
432   protected void cut_actionPerformed(ActionEvent e)\r
433   {\r
434     copy_actionPerformed(null);\r
435     delete_actionPerformed(null);\r
436   }\r
437 \r
438   protected void delete_actionPerformed(ActionEvent e)\r
439   {\r
440     addHistoryItem(new HistoryItem("Delete Sequences", viewport.alignment,\r
441                                    HistoryItem.HIDE));\r
442     if (viewport.getSelectionGroup() == null)\r
443     {\r
444       return;\r
445     }\r
446 \r
447 \r
448     SequenceGroup sg = viewport.getSelectionGroup();\r
449     boolean allSequences = false;\r
450     if(sg.sequences.size()==viewport.alignment.getHeight())\r
451           allSequences = true;\r
452 \r
453     for (int i = 0; i < sg.sequences.size(); i++)\r
454     {\r
455       SequenceI seq = sg.getSequenceAt(i);\r
456       int index = viewport.getAlignment().findIndex(seq);\r
457       seq.deleteChars(sg.getStartRes(), sg.getEndRes() + 1);\r
458 \r
459       // If the cut affects all sequences, remove highlighted columns\r
460       if (allSequences)\r
461       {\r
462         viewport.getColumnSelection().removeElements(sg.getStartRes(),\r
463                                                      sg.getEndRes() + 1);\r
464       }\r
465 \r
466 \r
467       if (seq.getSequence().length() < 1)\r
468       {\r
469         viewport.getAlignment().deleteSequence(seq);\r
470       }\r
471       else\r
472       {\r
473         viewport.getAlignment().getSequences().setElementAt(seq, index);\r
474       }\r
475     }\r
476 \r
477     viewport.setSelectionGroup(null);\r
478     viewport.alignment.deleteGroup(sg);\r
479     viewport.resetSeqLimits(alignPanel.seqPanel.seqCanvas.getSize().height);\r
480     if (viewport.getAlignment().getHeight() < 1)\r
481     {\r
482       try\r
483       {\r
484         this.setVisible(false);\r
485       }\r
486       catch (Exception ex)\r
487       {}\r
488     }\r
489     viewport.updateConservation();\r
490     viewport.updateConsensus();\r
491     alignPanel.repaint();\r
492 \r
493   }\r
494 \r
495   protected void deleteGroups_actionPerformed(ActionEvent e)\r
496   {\r
497     viewport.alignment.deleteAllGroups();\r
498     viewport.setSelectionGroup(null);\r
499 \r
500     alignPanel.repaint();\r
501   }\r
502 \r
503   public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)\r
504   {\r
505     SequenceGroup sg = new SequenceGroup();\r
506     for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)\r
507     {\r
508       sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);\r
509     }\r
510     sg.setEndRes(viewport.alignment.getWidth()-1);\r
511     viewport.setSelectionGroup(sg);\r
512     alignPanel.repaint();\r
513     PaintRefresher.Refresh(null, viewport.alignment);\r
514   }\r
515 \r
516   public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)\r
517   {\r
518     viewport.setSelectionGroup(null);\r
519     viewport.getColumnSelection().clear();\r
520     viewport.setSelectionGroup(null);\r
521     PaintRefresher.Refresh(null, viewport.alignment);\r
522   }\r
523 \r
524   public void invertSequenceMenuItem_actionPerformed(ActionEvent e)\r
525   {\r
526     SequenceGroup sg = viewport.getSelectionGroup();\r
527     for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)\r
528     {\r
529       sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);\r
530     }\r
531 \r
532     PaintRefresher.Refresh(null, viewport.alignment);\r
533   }\r
534 \r
535   public void remove2LeftMenuItem_actionPerformed(ActionEvent e)\r
536   {\r
537     ColumnSelection colSel = viewport.getColumnSelection();\r
538     if (colSel.size() > 0)\r
539     {\r
540       addHistoryItem(new HistoryItem("Remove Left", viewport.alignment,\r
541                                      HistoryItem.HIDE));\r
542       int min = colSel.getMin();\r
543       viewport.getAlignment().trimLeft(min);\r
544       colSel.compensateForEdit(0, min);\r
545 \r
546       if (viewport.getSelectionGroup() != null)\r
547       {\r
548         viewport.getSelectionGroup().adjustForRemoveLeft(min);\r
549       }\r
550 \r
551       Vector groups = viewport.alignment.getGroups();\r
552       for (int i = 0; i < groups.size(); i++)\r
553       {\r
554         SequenceGroup sg = (SequenceGroup) groups.elementAt(i);\r
555         if (!sg.adjustForRemoveLeft(min))\r
556         {\r
557           viewport.alignment.deleteGroup(sg);\r
558         }\r
559       }\r
560 \r
561       alignPanel.repaint();\r
562     }\r
563   }\r
564 \r
565   public void remove2RightMenuItem_actionPerformed(ActionEvent e)\r
566   {\r
567     ColumnSelection colSel = viewport.getColumnSelection();\r
568     if (colSel.size() > 0)\r
569     {\r
570       addHistoryItem(new HistoryItem("Remove Right", viewport.alignment,\r
571                                      HistoryItem.HIDE));\r
572       int max = colSel.getMax();\r
573       viewport.getAlignment().trimRight(max);\r
574       if (viewport.getSelectionGroup() != null)\r
575       {\r
576         viewport.getSelectionGroup().adjustForRemoveRight(max);\r
577       }\r
578 \r
579       Vector groups = viewport.alignment.getGroups();\r
580       for (int i = 0; i < groups.size(); i++)\r
581       {\r
582         SequenceGroup sg = (SequenceGroup) groups.elementAt(i);\r
583         if (!sg.adjustForRemoveRight(max))\r
584         {\r
585           viewport.alignment.deleteGroup(sg);\r
586         }\r
587       }\r
588 \r
589       alignPanel.repaint();\r
590     }\r
591 \r
592   }\r
593 \r
594   public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)\r
595   {\r
596     addHistoryItem(new HistoryItem("Remove Gapped Columns",\r
597                                    viewport.alignment,\r
598                                    HistoryItem.HIDE));\r
599 \r
600     //This is to maintain viewport position on first residue\r
601     //of first sequence\r
602     SequenceI seq = viewport.alignment.getSequenceAt(0);\r
603     int startRes = seq.findPosition(viewport.startRes);\r
604 \r
605     viewport.getAlignment().removeGaps();\r
606 \r
607     viewport.setStartRes(seq.findIndex(startRes)-1);\r
608 \r
609     viewport.updateConservation();\r
610     viewport.updateConsensus();\r
611     resetAllClustalSchemes();\r
612     alignPanel.repaint();\r
613   }\r
614 \r
615   public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)\r
616   {\r
617     addHistoryItem(new HistoryItem("Remove Gaps", viewport.alignment,\r
618                                    HistoryItem.HIDE));\r
619 \r
620     //This is to maintain viewport position on first residue\r
621     //of first sequence\r
622     SequenceI seq = viewport.alignment.getSequenceAt(0);\r
623     int startRes = seq.findPosition(viewport.startRes);\r
624 \r
625     SequenceI current;\r
626     int jSize;\r
627 \r
628     Vector seqs=null;\r
629 \r
630     int start=0, end = viewport.alignment.getWidth();\r
631 \r
632     if (viewport.getSelectionGroup() != null\r
633         && viewport.getSelectionGroup().sequences != null\r
634         && viewport.getSelectionGroup().sequences.size()>0)\r
635     {\r
636       seqs = viewport.getSelectionGroup().sequences;\r
637       start = viewport.getSelectionGroup().getStartRes();\r
638       end = viewport.getSelectionGroup().getEndRes();\r
639     }\r
640     else\r
641       seqs = viewport.alignment.getSequences();\r
642 \r
643     for (int i = 0; i <seqs.size(); i++)\r
644     {\r
645       current = (SequenceI)seqs.elementAt(i);\r
646       jSize = current.getLength();\r
647 \r
648       int j = start;\r
649       do\r
650       {\r
651         if (jalview.util.Comparison.isGap(current.getCharAt(j)))\r
652         {\r
653           current.deleteCharAt(j);\r
654           j--;\r
655           jSize--;\r
656         }\r
657         j++;\r
658       }\r
659       while(j < end && j < jSize) ;\r
660     }\r
661 \r
662     viewport.setStartRes(seq.findIndex(startRes)-1);\r
663     resetAllClustalSchemes();\r
664     viewport.updateConservation();\r
665     viewport.updateConsensus();\r
666     alignPanel.repaint();\r
667   }\r
668 \r
669   void resetAllClustalSchemes()\r
670   {\r
671     if(viewport.getGlobalColourScheme()!=null\r
672        && viewport.getGlobalColourScheme() instanceof ClustalxColourScheme)\r
673     {\r
674       ((ClustalxColourScheme)viewport.getGlobalColourScheme()).\r
675           resetClustalX(viewport.alignment.getSequences(),\r
676                         viewport.alignment.getWidth());\r
677     }\r
678 \r
679     int s, sSize = viewport.alignment.getGroups().size();\r
680     for(s=0; s<sSize; s++)\r
681     {\r
682       SequenceGroup sg = (SequenceGroup)viewport.alignment.getGroups().elementAt(s);\r
683       if(sg.cs instanceof ClustalxColourScheme)\r
684       {\r
685         ((ClustalxColourScheme)sg.cs).resetClustalX(sg.sequences, sg.getWidth());\r
686       }\r
687     }\r
688   }\r
689 \r
690 \r
691 \r
692   public void findMenuItem_actionPerformed(ActionEvent e)\r
693   {\r
694     Finder finder = new Finder(alignPanel);\r
695   }\r
696 \r
697   public void font_actionPerformed(ActionEvent e)\r
698   {\r
699     Frame frame = new Frame();\r
700     FontChooser fc = new FontChooser(alignPanel, frame);\r
701     frame.add(fc);\r
702     jalview.bin.JalviewLite.addFrame(frame, "Change Font", 440, 100);\r
703 \r
704   }\r
705 \r
706   protected void fullSeqId_actionPerformed(ActionEvent e)\r
707   {\r
708     viewport.setShowFullId(fullSeqId.getState());\r
709     alignPanel.fontChanged();\r
710     alignPanel.repaint();\r
711   }\r
712 \r
713   protected void colourTextMenuItem_actionPerformed(ActionEvent e)\r
714   {\r
715     viewport.setColourText(colourTextMenuItem.getState());\r
716     alignPanel.repaint();\r
717   }\r
718 \r
719   protected void wrapMenuItem_actionPerformed(ActionEvent e)\r
720   {\r
721     viewport.setWrapAlignment(wrapMenuItem.getState());\r
722     alignPanel.setWrapAlignment(wrapMenuItem.getState());\r
723     scaleAbove.setEnabled(wrapMenuItem.getState());\r
724     scaleLeft.setEnabled(wrapMenuItem.getState());\r
725     scaleRight.setEnabled(wrapMenuItem.getState());\r
726     alignPanel.repaint();\r
727   }\r
728 \r
729   protected void scaleAbove_actionPerformed(ActionEvent e)\r
730   {\r
731     viewport.setScaleAboveWrapped(scaleAbove.getState());\r
732     alignPanel.repaint();\r
733   }\r
734 \r
735   protected void scaleLeft_actionPerformed(ActionEvent e)\r
736   {\r
737     viewport.setScaleLeftWrapped(scaleLeft.getState());\r
738     alignPanel.repaint();\r
739   }\r
740 \r
741   protected void scaleRight_actionPerformed(ActionEvent e)\r
742   {\r
743     viewport.setScaleRightWrapped(scaleRight.getState());\r
744     alignPanel.repaint();\r
745   }\r
746 \r
747   public void viewBoxesMenuItem_actionPerformed(ActionEvent e)\r
748   {\r
749     viewport.setShowBoxes(viewBoxesMenuItem.getState());\r
750     alignPanel.repaint();\r
751   }\r
752 \r
753   public void viewTextMenuItem_actionPerformed(ActionEvent e)\r
754   {\r
755     viewport.setShowText(viewTextMenuItem.getState());\r
756     alignPanel.repaint();\r
757   }\r
758 \r
759   protected void renderGapsMenuItem_actionPerformed(ActionEvent e)\r
760   {\r
761     viewport.setRenderGaps(renderGapsMenuItem.getState());\r
762     alignPanel.repaint();\r
763   }\r
764 \r
765   public void annotationPanelMenuItem_actionPerformed(ActionEvent e)\r
766   {\r
767     if (annotationPanelMenuItem.getState() && viewport.getWrapAlignment())\r
768     {\r
769       annotationPanelMenuItem.setState(false);\r
770       return;\r
771     }\r
772     viewport.setShowAnnotation(annotationPanelMenuItem.getState());\r
773     alignPanel.setAnnotationVisible(annotationPanelMenuItem.getState());\r
774   }\r
775 \r
776   public void overviewMenuItem_actionPerformed(ActionEvent e)\r
777   {\r
778     if (alignPanel.overviewPanel != null)\r
779     {\r
780       return;\r
781     }\r
782 \r
783     Frame frame = new Frame();\r
784     OverviewPanel overview = new OverviewPanel(alignPanel);\r
785     frame.add(overview);\r
786     // +50 must allow for applet frame window\r
787     jalview.bin.JalviewLite.addFrame(frame, "Overview " + this.getTitle(),\r
788                                      overview.preferredSize().width,\r
789                                      overview.preferredSize().height + 50);\r
790 \r
791     frame.pack();\r
792     frame.addWindowListener(new WindowAdapter()\r
793     {\r
794       public void windowClosing(WindowEvent e)\r
795       {\r
796         alignPanel.setOverviewPanel(null);\r
797       };\r
798     });\r
799 \r
800     alignPanel.setOverviewPanel(overview);\r
801 \r
802   }\r
803 \r
804   protected void noColourmenuItem_actionPerformed(ActionEvent e)\r
805   {\r
806     changeColour(null);\r
807   }\r
808 \r
809   public void clustalColour_actionPerformed(ActionEvent e)\r
810   {\r
811     abovePIDThreshold.setState(false);\r
812     changeColour(new ClustalxColourScheme(viewport.alignment.getSequences(),\r
813                                           viewport.alignment.getWidth()));\r
814   }\r
815 \r
816   public void zappoColour_actionPerformed(ActionEvent e)\r
817   {\r
818     changeColour(new ZappoColourScheme());\r
819   }\r
820 \r
821   public void taylorColour_actionPerformed(ActionEvent e)\r
822   {\r
823     changeColour(new TaylorColourScheme());\r
824   }\r
825 \r
826   public void hydrophobicityColour_actionPerformed(ActionEvent e)\r
827   {\r
828     changeColour(new HydrophobicColourScheme());\r
829   }\r
830 \r
831   public void helixColour_actionPerformed(ActionEvent e)\r
832   {\r
833     changeColour(new HelixColourScheme());\r
834   }\r
835 \r
836   public void strandColour_actionPerformed(ActionEvent e)\r
837   {\r
838     changeColour(new StrandColourScheme());\r
839   }\r
840 \r
841   public void turnColour_actionPerformed(ActionEvent e)\r
842   {\r
843     changeColour(new TurnColourScheme());\r
844   }\r
845 \r
846   public void buriedColour_actionPerformed(ActionEvent e)\r
847   {\r
848     changeColour(new BuriedColourScheme());\r
849   }\r
850 \r
851   public void nucleotideColour_actionPerformed(ActionEvent e)\r
852   {\r
853     changeColour(new NucleotideColourScheme());\r
854   }\r
855 \r
856   protected void applyToAllGroups_actionPerformed(ActionEvent e)\r
857   {\r
858     viewport.setColourAppliesToAllGroups(applyToAllGroups.getState());\r
859   }\r
860 \r
861   void changeColour(ColourSchemeI cs)\r
862   {\r
863     int threshold = 0;\r
864 \r
865     if(cs!=null)\r
866     {\r
867       if (viewport.getAbovePIDThreshold())\r
868       {\r
869         threshold = SliderPanel.setPIDSliderSource(alignPanel, cs, "Background");\r
870 \r
871         cs.setThreshold(threshold, viewport.getIgnoreGapsConsensus());\r
872 \r
873         viewport.setGlobalColourScheme(cs);\r
874       }\r
875       else\r
876       {\r
877         cs.setThreshold(0, viewport.getIgnoreGapsConsensus());\r
878       }\r
879 \r
880       if (viewport.getConservationSelected())\r
881       {\r
882 \r
883         Alignment al = (Alignment) viewport.alignment;\r
884         Conservation c = new Conservation("All",\r
885                                           ResidueProperties.propHash, 3,\r
886                                           al.getSequences(), 0,\r
887                                           al.getWidth() - 1);\r
888 \r
889         c.calculate();\r
890         c.verdict(false, viewport.ConsPercGaps);\r
891 \r
892         cs.setConservation(c);\r
893 \r
894         cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel, cs,\r
895             "Background"));\r
896 \r
897       }\r
898       else\r
899       {\r
900         cs.setConservation(null);\r
901       }\r
902 \r
903       cs.setConsensus(viewport.vconsensus);\r
904 \r
905     }\r
906     viewport.setGlobalColourScheme(cs);\r
907 \r
908     if (viewport.getColourAppliesToAllGroups())\r
909     {\r
910       Vector groups = viewport.alignment.getGroups();\r
911       for (int i = 0; i < groups.size(); i++)\r
912       {\r
913         SequenceGroup sg = (SequenceGroup) groups.elementAt(i);\r
914 \r
915         if(cs==null)\r
916         {\r
917           sg.cs = null;\r
918           continue;\r
919         }\r
920         if (cs instanceof ClustalxColourScheme)\r
921         {\r
922           sg.cs = new ClustalxColourScheme(sg.sequences, sg.getWidth());\r
923         }\r
924         else\r
925         {\r
926           try\r
927           {\r
928             sg.cs = (ColourSchemeI) cs.getClass().newInstance();\r
929           }\r
930           catch (Exception ex)\r
931           {\r
932             ex.printStackTrace();\r
933             sg.cs = cs;\r
934           }\r
935         }\r
936 \r
937         if (viewport.getAbovePIDThreshold()\r
938             || cs instanceof PIDColourScheme\r
939             || cs instanceof Blosum62ColourScheme)\r
940         {\r
941           sg.cs.setThreshold(threshold, viewport.getIgnoreGapsConsensus());\r
942           sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0, sg.getWidth()));\r
943         }\r
944         else\r
945           sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());\r
946 \r
947         if (viewport.getConservationSelected())\r
948         {\r
949           Conservation c = new Conservation("Group",\r
950                                             ResidueProperties.propHash, 3,\r
951                                             sg.sequences, 0,\r
952                                             viewport.alignment.getWidth() - 1);\r
953           c.calculate();\r
954           c.verdict(false, viewport.ConsPercGaps);\r
955           sg.cs.setConservation(c);\r
956         }\r
957         else\r
958         {\r
959           sg.cs.setConservation(null);\r
960           sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());\r
961         }\r
962 \r
963       }\r
964     }\r
965 \r
966 \r
967     if (alignPanel.getOverviewPanel() != null)\r
968     {\r
969       alignPanel.getOverviewPanel().updateOverviewImage();\r
970     }\r
971 \r
972     alignPanel.repaint();\r
973   }\r
974 \r
975 \r
976 \r
977   protected void modifyPID_actionPerformed(ActionEvent e)\r
978   {\r
979     if (viewport.getAbovePIDThreshold() && viewport.globalColourScheme!=null)\r
980     {\r
981       SliderPanel.setPIDSliderSource(alignPanel, viewport.getGlobalColourScheme(),\r
982                                      "Background");\r
983       SliderPanel.showPIDSlider();\r
984     }\r
985   }\r
986 \r
987   protected void modifyConservation_actionPerformed(ActionEvent e)\r
988   {\r
989     if (viewport.getConservationSelected() && viewport.globalColourScheme!=null)\r
990     {\r
991       SliderPanel.setConservationSlider(alignPanel, viewport.globalColourScheme,\r
992                                         "Background");\r
993       SliderPanel.showConservationSlider();\r
994     }\r
995   }\r
996 \r
997   protected void conservationMenuItem_actionPerformed(ActionEvent e)\r
998   {\r
999     viewport.setConservationSelected(conservationMenuItem.getState());\r
1000 \r
1001     viewport.setAbovePIDThreshold(false);\r
1002     abovePIDThreshold.setState(false);\r
1003 \r
1004     changeColour(viewport.getGlobalColourScheme());\r
1005 \r
1006     modifyConservation_actionPerformed(null);\r
1007   }\r
1008 \r
1009   public void abovePIDThreshold_actionPerformed(ActionEvent e)\r
1010   {\r
1011     viewport.setAbovePIDThreshold(abovePIDThreshold.getState());\r
1012 \r
1013     conservationMenuItem.setState(false);\r
1014     viewport.setConservationSelected(false);\r
1015 \r
1016     changeColour(viewport.getGlobalColourScheme());\r
1017 \r
1018     modifyPID_actionPerformed(null);\r
1019   }\r
1020 \r
1021   public void userDefinedColour_actionPerformed(ActionEvent e)\r
1022   {\r
1023     UserDefinedColours chooser = new UserDefinedColours(alignPanel, null);\r
1024   }\r
1025 \r
1026   public void PIDColour_actionPerformed(ActionEvent e)\r
1027   {\r
1028     changeColour(new PIDColourScheme());\r
1029   }\r
1030 \r
1031   public void BLOSUM62Colour_actionPerformed(ActionEvent e)\r
1032   {\r
1033     changeColour(new Blosum62ColourScheme());\r
1034   }\r
1035 \r
1036   public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)\r
1037   {\r
1038     addHistoryItem(new HistoryItem("Pairwise Sort", viewport.alignment,\r
1039                                    HistoryItem.SORT));\r
1040     AlignmentSorter.sortByPID(viewport.getAlignment(),\r
1041                               viewport.getAlignment().getSequenceAt(0));\r
1042     alignPanel.repaint();\r
1043   }\r
1044 \r
1045   public void sortIDMenuItem_actionPerformed(ActionEvent e)\r
1046   {\r
1047     addHistoryItem(new HistoryItem("ID Sort", viewport.alignment,\r
1048                                    HistoryItem.SORT));\r
1049     AlignmentSorter.sortByID(viewport.getAlignment());\r
1050     alignPanel.repaint();\r
1051   }\r
1052 \r
1053   public void sortGroupMenuItem_actionPerformed(ActionEvent e)\r
1054   {\r
1055     addHistoryItem(new HistoryItem("Group Sort", viewport.alignment,\r
1056                                    HistoryItem.SORT));\r
1057     AlignmentSorter.sortByGroup(viewport.getAlignment());\r
1058     alignPanel.repaint();\r
1059 \r
1060   }\r
1061 \r
1062   public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)\r
1063   {\r
1064     RedundancyPanel sp = new RedundancyPanel(alignPanel);\r
1065     Frame frame = new Frame();\r
1066     frame.add(sp);\r
1067     jalview.bin.JalviewLite.addFrame(frame, "Redundancy threshold selection",\r
1068                                      400, 120);\r
1069 \r
1070   }\r
1071 \r
1072   public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)\r
1073   {\r
1074     if (viewport.getSelectionGroup().getSize() > 1)\r
1075     {\r
1076       Frame frame = new Frame();\r
1077       frame.add(new PairwiseAlignPanel(viewport));\r
1078       jalview.bin.JalviewLite.addFrame(frame, "Pairwise Alignment", 600, 500);\r
1079     }\r
1080   }\r
1081 \r
1082   public void PCAMenuItem_actionPerformed(ActionEvent e)\r
1083   {\r
1084 \r
1085     if ( (viewport.getSelectionGroup() != null &&\r
1086           viewport.getSelectionGroup().getSize() < 4 &&\r
1087           viewport.getSelectionGroup().getSize() > 0)\r
1088         || viewport.getAlignment().getHeight() < 4)\r
1089     {\r
1090       return;\r
1091     }\r
1092 \r
1093     try\r
1094     {\r
1095       PCAPanel pcaPanel = new PCAPanel(viewport, null);\r
1096       Frame frame = new Frame();\r
1097       frame.add(pcaPanel);\r
1098       jalview.bin.JalviewLite.addFrame(frame, "Principal component analysis",\r
1099                                        400, 400);\r
1100     }\r
1101     catch (java.lang.OutOfMemoryError ex)\r
1102     {\r
1103     }\r
1104 \r
1105   }\r
1106 \r
1107   public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)\r
1108   {\r
1109     NewTreePanel("AV", "PID", "Average distance tree using PID");\r
1110   }\r
1111 \r
1112   public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)\r
1113   {\r
1114     NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");\r
1115   }\r
1116 \r
1117   protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)\r
1118   {\r
1119     NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");\r
1120   }\r
1121 \r
1122   protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)\r
1123   {\r
1124     NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62PID");\r
1125   }\r
1126 \r
1127   void NewTreePanel(String type, String pwType, String title)\r
1128   {\r
1129     //are the sequences aligned?\r
1130     if (!viewport.alignment.isAligned())\r
1131     {\r
1132       SequenceI current;\r
1133       int Width = viewport.getAlignment().getWidth();\r
1134 \r
1135       for (int i = 0; i < viewport.getAlignment().getSequences().size();\r
1136            i++)\r
1137       {\r
1138         current = viewport.getAlignment().getSequenceAt(i);\r
1139 \r
1140         if (current.getLength() < Width)\r
1141         {\r
1142           current.insertCharAt(Width - 1, viewport.getGapCharacter());\r
1143         }\r
1144       }\r
1145       alignPanel.repaint();\r
1146 \r
1147     }\r
1148 \r
1149     final TreePanel tp;\r
1150     if (viewport.getSelectionGroup() != null &&\r
1151         viewport.getSelectionGroup().getSize() > 3)\r
1152     {\r
1153       tp = new TreePanel(viewport, viewport.getSelectionGroup().sequences, type,\r
1154                          pwType,\r
1155                          0, viewport.alignment.getWidth());\r
1156     }\r
1157     else\r
1158     {\r
1159       tp = new TreePanel(viewport, viewport.getAlignment().getSequences(),\r
1160                          type, pwType, 0, viewport.alignment.getWidth());\r
1161     }\r
1162 \r
1163     addTreeMenuItem(tp, title);\r
1164 \r
1165     jalview.bin.JalviewLite.addFrame(tp, title, 600, 500);\r
1166   }\r
1167 \r
1168   void addTreeMenuItem(final TreePanel treePanel, String title)\r
1169   {\r
1170     final MenuItem item = new MenuItem(title);\r
1171     sortByTreeMenu.add(item);\r
1172     item.addActionListener(new java.awt.event.ActionListener()\r
1173     {\r
1174       public void actionPerformed(ActionEvent e)\r
1175       {\r
1176         addHistoryItem(new HistoryItem("Sort", viewport.alignment,\r
1177                                        HistoryItem.SORT));\r
1178         AlignmentSorter.sortByTree(viewport.getAlignment(), treePanel.getTree());\r
1179         alignPanel.repaint();\r
1180       }\r
1181     });\r
1182 \r
1183     treePanel.addWindowListener(new WindowAdapter()\r
1184     {\r
1185       public void windowClosing(WindowEvent e)\r
1186       {\r
1187         sortByTreeMenu.remove(item);\r
1188       };\r
1189     });\r
1190   }\r
1191 \r
1192   protected void documentation_actionPerformed(ActionEvent e)\r
1193   {\r
1194     jalview.bin.JalviewLite.showURL("http://www.jalview.org/help.html");\r
1195   }\r
1196 \r
1197   protected void about_actionPerformed(ActionEvent e)\r
1198   {\r
1199 \r
1200     class AboutPanel extends Canvas\r
1201     {\r
1202       String version;\r
1203       public AboutPanel(String version)\r
1204       { this.version = version; }\r
1205 \r
1206       public void paint(Graphics g)\r
1207       {\r
1208         g.setColor(Color.white);\r
1209         g.fillRect(0, 0, getSize().width, getSize().height);\r
1210         g.setFont(new Font("Helvetica", Font.PLAIN, 12));\r
1211         FontMetrics fm = g.getFontMetrics();\r
1212         int fh = fm.getHeight();\r
1213         int y = 5, x = 7;\r
1214         g.setColor(Color.black);\r
1215         g.setFont(new Font("Helvetica", Font.BOLD, 14));\r
1216         g.drawString("Jalview - Release "+version, 200, y += fh);\r
1217         g.setFont(new Font("Helvetica", Font.PLAIN, 12));\r
1218         g.drawString("Authors:  Michele Clamp, James Cuff, Steve Searle, Andrew Waterhouse, Jim Procter & Geoff Barton.",\r
1219                      x, y += fh * 2);\r
1220         g.drawString("Current development managed by Andrew Waterhouse; Barton Group, University of Dundee.",\r
1221                      x, y += fh);\r
1222         g.drawString(\r
1223             "For any issues relating to Jalview, email help@jalview.org", x,\r
1224             y += fh);\r
1225         g.drawString("If  you use JalView, please cite:", x, y += fh + 8);\r
1226         g.drawString("\"Clamp, M., Cuff, J., Searle, S. M. and Barton, G. J. (2004), The Jalview Java Alignment Editor\"",\r
1227                      x, y += fh);\r
1228         g.drawString("Bioinformatics,  2004 12;426-7.", x, y += fh);\r
1229       }\r
1230     }\r
1231 \r
1232     String version = "test";\r
1233     java.net.URL url = getClass().getResource("/.build_properties");\r
1234     if (url != null)\r
1235     {\r
1236       try\r
1237       {\r
1238         BufferedReader reader = new BufferedReader(new InputStreamReader(\r
1239             url.openStream()));\r
1240         String line;\r
1241         while ( (line = reader.readLine()) != null)\r
1242         {\r
1243           if (line.indexOf("VERSION") > -1)\r
1244           {\r
1245             version = line.substring(line.indexOf("=") + 1);\r
1246           }\r
1247         }\r
1248       }\r
1249       catch (Exception ex)\r
1250       {\r
1251         ex.printStackTrace();\r
1252       }\r
1253     }\r
1254 \r
1255 \r
1256     Frame frame = new Frame();\r
1257     frame.add(new AboutPanel(version));\r
1258     jalview.bin.JalviewLite.addFrame(frame, "Jalview", 580, 200);\r
1259 \r
1260   }\r
1261 }\r