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