117dd14e02d7fb987fa3aa6ff3b6a6e289e2042d
[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.schemes.*;\r
23 import jalview.datamodel.*;\r
24 import jalview.analysis.*;\r
25 import jalview.io.*;\r
26 import java.awt.*;\r
27 import java.awt.event.*;\r
28 import java.util.*;\r
29 import java.io.InputStreamReader;\r
30 import java.io.BufferedReader;\r
31 import java.net.URL;\r
32 \r
33 \r
34 public class AlignFrame extends Frame\r
35 {\r
36   final AlignmentPanel alignPanel;\r
37   public final AlignViewport viewport;\r
38   int NEW_WINDOW_WIDTH = 700;\r
39   int NEW_WINDOW_HEIGHT = 500;\r
40   jalview.bin.JalviewLite applet;\r
41 \r
42 \r
43   public AlignFrame(AlignmentI al, jalview.bin.JalviewLite applet, String title)\r
44   {\r
45     try{\r
46       jbInit();\r
47     }catch(Exception ex)\r
48     {\r
49       ex.printStackTrace();\r
50     }\r
51     this.applet = applet;\r
52     viewport = new AlignViewport(al, applet);\r
53     alignPanel = new AlignmentPanel(this, viewport);\r
54     add(alignPanel);\r
55     alignPanel.validate();\r
56 \r
57     if(applet!=null)\r
58     {\r
59       String treeFile = applet.getParameter("treeFile");\r
60       if (treeFile != null)\r
61       {\r
62         try\r
63         {\r
64           jalview.io.NewickFile fin = new jalview.io.NewickFile(applet.\r
65               getCodeBase() + treeFile, "URL");\r
66           fin.parse();\r
67 \r
68           if (fin.getTree() != null)\r
69           {\r
70             TreePanel tp = null;\r
71             tp = new TreePanel(viewport, viewport.getAlignment().getSequences(),\r
72                                fin, "FromFile", applet.getCodeBase() + treeFile);\r
73             jalview.bin.JalviewLite.addFrame(tp, treeFile, 600, 500);\r
74             addTreeMenuItem(tp, treeFile);\r
75           }\r
76         }\r
77         catch (Exception ex)\r
78         {\r
79           ex.printStackTrace();\r
80         }\r
81       }\r
82 \r
83       String param = applet.getParameter("sortBy");\r
84       if (param != null)\r
85       {\r
86         if (param.equalsIgnoreCase("Id"))\r
87           sortIDMenuItem_actionPerformed(null);\r
88         else if (param.equalsIgnoreCase("Pairwise Identity"))\r
89           sortPairwiseMenuItem_actionPerformed(null);\r
90       }\r
91 \r
92       param = applet.getParameter("wrap");\r
93       if (param != null)\r
94       {\r
95         if (param.equalsIgnoreCase("true"))\r
96         {\r
97           wrapMenuItem.setState(true);\r
98           wrapMenuItem_actionPerformed(null);\r
99         }\r
100       }\r
101 \r
102       try\r
103       {\r
104         param = applet.getParameter("windowWidth");\r
105         if (param != null)\r
106         {\r
107           int width = Integer.parseInt(param);\r
108           NEW_WINDOW_WIDTH = width;\r
109         }\r
110         param = applet.getParameter("windowHeight");\r
111         if (param != null)\r
112         {\r
113           int height = Integer.parseInt(param);\r
114           NEW_WINDOW_HEIGHT = height;\r
115         }\r
116       }\r
117       catch (Exception ex)\r
118       {}\r
119 \r
120     }\r
121 \r
122     this.addWindowListener(new WindowAdapter()\r
123     {\r
124       public void windowClosing(WindowEvent e)\r
125           {\r
126             closeMenuItem_actionPerformed(null);\r
127           }\r
128     });\r
129 \r
130     viewport.addPropertyChangeListener(new java.beans.PropertyChangeListener()\r
131     {\r
132      public void propertyChange(java.beans.PropertyChangeEvent evt)\r
133      {\r
134        if (evt.getPropertyName().equals("alignment"))\r
135        {\r
136          alignmentChanged();\r
137        }\r
138      }\r
139    });\r
140 \r
141    jalview.bin.JalviewLite.addFrame(this, title,\r
142                                     NEW_WINDOW_WIDTH,\r
143                                     NEW_WINDOW_HEIGHT);\r
144 \r
145 \r
146   }\r
147 \r
148   public AlignViewport getAlignViewport()\r
149   {\r
150     return viewport;\r
151   }\r
152 \r
153   public SeqCanvas getSeqcanvas()\r
154   {\r
155     return alignPanel.seqPanel.seqCanvas;\r
156   }\r
157 \r
158 \r
159   /**\r
160    * DOCUMENT ME!\r
161    *\r
162    * @param String DOCUMENT ME!\r
163    */\r
164 \r
165   public void parseFeaturesFile(String file)\r
166   {\r
167     try\r
168     {\r
169       URL url = new URL(file);\r
170 \r
171       BufferedReader in =  new BufferedReader(new InputStreamReader(url.openStream()));\r
172       SequenceI seq = null;\r
173       String line, type, desc, token;\r
174 \r
175       int index, start, end;\r
176       StringTokenizer st;\r
177       SequenceFeature sf;\r
178       FeatureRenderer fr = alignPanel.seqPanel.seqCanvas.getFeatureRenderer();\r
179       int lineNo = 0;\r
180       while ( (line = in.readLine()) != null)\r
181       {\r
182         lineNo++;\r
183         st = new StringTokenizer(line, "\t");\r
184         if (st.countTokens() == 2)\r
185         {\r
186           type = st.nextToken();\r
187           UserColourScheme ucs = new UserColourScheme(st.nextToken());\r
188           fr.setColour(type, ucs.findColour("A"));\r
189           continue;\r
190         }\r
191 \r
192         while (st.hasMoreElements())\r
193         {\r
194           desc = st.nextToken();\r
195           token = st.nextToken();\r
196           if (!token.equals("ID_NOT_SPECIFIED"))\r
197           {\r
198             index = viewport.alignment.findIndex(viewport.alignment.findName(\r
199                 token));\r
200             st.nextToken();\r
201           }\r
202           else\r
203           {\r
204             index = Integer.parseInt(st.nextToken());\r
205           }\r
206 \r
207           start = Integer.parseInt(st.nextToken());\r
208           end = Integer.parseInt(st.nextToken());\r
209 \r
210           seq = viewport.alignment.getSequenceAt(index);\r
211           start = seq.findIndex(start) - 1;\r
212           end = seq.findIndex(end) - 1;\r
213 \r
214           type = st.nextToken();\r
215 \r
216           if(fr.getColour(type)==null)\r
217           {\r
218             // Probably the old style groups file\r
219             UserColourScheme ucs = new UserColourScheme(type);\r
220             fr.setColour(type, ucs.findColour("A"));\r
221           }\r
222 \r
223           sf = new SequenceFeature(type, desc, "", start, end);\r
224 \r
225           seq.addSequenceFeature(sf);\r
226         }\r
227       }\r
228 \r
229       viewport.showSequenceFeatures = true;\r
230 \r
231       alignPanel.repaint();\r
232 \r
233     }\r
234     catch (Exception ex)\r
235     {\r
236       System.out.println("Error parsing groups file: " + ex);\r
237     }\r
238   }\r
239 \r
240 \r
241   public void inputText_actionPerformed(ActionEvent e)\r
242   {\r
243     CutAndPasteTransfer cap = new CutAndPasteTransfer(true, applet);\r
244     Frame frame = new Frame();\r
245     frame.add(cap);\r
246     jalview.bin.JalviewLite.addFrame(frame, "Cut & Paste Input", 500, 500);\r
247   }\r
248 \r
249   protected void outputText_actionPerformed(ActionEvent e)\r
250   {\r
251     CutAndPasteTransfer cap = new CutAndPasteTransfer(false, applet);\r
252     Frame frame = new Frame();\r
253     frame.add(cap);\r
254     jalview.bin.JalviewLite.addFrame(frame,\r
255                                      "Alignment output - " + e.getActionCommand(),\r
256                                      600, 500);\r
257     cap.setText(new AppletFormatAdapter().formatSequences(e.getActionCommand(),\r
258                                               viewport.getAlignment().getSequences(),\r
259                                                       viewport.showJVSuffix));\r
260   }\r
261 \r
262   public void closeMenuItem_actionPerformed(ActionEvent e)\r
263   {\r
264     PaintRefresher.components.remove(viewport.alignment);\r
265     if(PaintRefresher.components.size()==0 && applet==null)\r
266       System.exit(0);\r
267   }\r
268 \r
269   Stack historyList = new Stack();\r
270   Stack redoList = new Stack();\r
271 \r
272   void updateEditMenuBar()\r
273   {\r
274     if (historyList.size() > 0)\r
275     {\r
276       undoMenuItem.setEnabled(true);\r
277       HistoryItem hi = (HistoryItem) historyList.peek();\r
278       undoMenuItem.setLabel("Undo " + hi.getDescription());\r
279     }\r
280     else\r
281     {\r
282       undoMenuItem.setEnabled(false);\r
283       undoMenuItem.setLabel("Undo");\r
284     }\r
285 \r
286     if (redoList.size() > 0)\r
287     {\r
288       redoMenuItem.setEnabled(true);\r
289       HistoryItem hi = (HistoryItem) redoList.peek();\r
290       redoMenuItem.setLabel("Redo " + hi.getDescription());\r
291     }\r
292     else\r
293     {\r
294       redoMenuItem.setEnabled(false);\r
295       redoMenuItem.setLabel("Redo");\r
296     }\r
297   }\r
298 \r
299   public void addHistoryItem(HistoryItem hi)\r
300   {\r
301     historyList.push(hi);\r
302     updateEditMenuBar();\r
303   }\r
304 \r
305   protected void undoMenuItem_actionPerformed(ActionEvent e)\r
306   {\r
307     HistoryItem hi = (HistoryItem) historyList.pop();\r
308     redoList.push(new HistoryItem(hi.getDescription(), viewport.alignment,\r
309                                   HistoryItem.HIDE));\r
310     restoreHistoryItem(hi);\r
311     viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());\r
312   }\r
313 \r
314   protected void redoMenuItem_actionPerformed(ActionEvent e)\r
315   {\r
316     HistoryItem hi = (HistoryItem) redoList.pop();\r
317     restoreHistoryItem(hi);\r
318     updateEditMenuBar();\r
319     viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());\r
320   }\r
321 \r
322   // used by undo and redo\r
323   void restoreHistoryItem(HistoryItem hi)\r
324   {\r
325     if (hi.getType() == HistoryItem.SORT)\r
326     {\r
327       for (int i = 0; i < hi.getSequences().size(); i++)\r
328       {\r
329         viewport.alignment.getSequences().setElementAt(hi.getSequences().\r
330             elementAt(i), i);\r
331       }\r
332     }\r
333     else\r
334     {\r
335       for (int i = 0; i < hi.getSequences().size(); i++)\r
336       {\r
337         SequenceI restore = (SequenceI) hi.getSequences().elementAt(i);\r
338         if (restore.getLength() == 0)\r
339         {\r
340           // log.System.out.println(hi.getHidden().elementAt(i));\r
341           restore.setSequence(hi.getHidden().elementAt(i).toString());\r
342           viewport.alignment.getSequences().insertElementAt(\r
343               restore,\r
344               hi.getAlignIndex(i));\r
345         }\r
346         else\r
347         {\r
348           restore.setSequence(hi.getHidden().elementAt(i).toString());\r
349         }\r
350       }\r
351       if (hi.getType() == HistoryItem.PASTE)\r
352       {\r
353         for (int i = viewport.alignment.getHeight() - 1;\r
354              i > hi.getSequences().size() - 1; i--)\r
355         {\r
356           viewport.alignment.deleteSequence(i);\r
357         }\r
358       }\r
359     }\r
360 \r
361     updateEditMenuBar();\r
362 \r
363     viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());\r
364   }\r
365 \r
366   public void moveSelectedSequences(boolean up)\r
367   {\r
368     SequenceGroup sg = viewport.getSelectionGroup();\r
369     if (sg == null)\r
370     {\r
371       return;\r
372     }\r
373 \r
374     if (up)\r
375     {\r
376       for (int i = 1; i < viewport.alignment.getHeight(); i++)\r
377       {\r
378         SequenceI seq = viewport.alignment.getSequenceAt(i);\r
379         if (!sg.sequences.contains(seq))\r
380         {\r
381           continue;\r
382         }\r
383 \r
384         SequenceI temp = viewport.alignment.getSequenceAt(i - 1);\r
385         if (sg.sequences.contains(temp))\r
386         {\r
387           continue;\r
388         }\r
389 \r
390         viewport.alignment.getSequences().setElementAt(temp, i);\r
391         viewport.alignment.getSequences().setElementAt(seq, i - 1);\r
392       }\r
393     }\r
394     else\r
395     {\r
396       for (int i = viewport.alignment.getHeight() - 2; i > -1; i--)\r
397       {\r
398         SequenceI seq = viewport.alignment.getSequenceAt(i);\r
399         if (!sg.sequences.contains(seq))\r
400         {\r
401           continue;\r
402         }\r
403 \r
404         SequenceI temp = viewport.alignment.getSequenceAt(i + 1);\r
405         if (sg.sequences.contains(temp))\r
406         {\r
407           continue;\r
408         }\r
409 \r
410         viewport.alignment.getSequences().setElementAt(temp, i);\r
411         viewport.alignment.getSequences().setElementAt(seq, i + 1);\r
412       }\r
413     }\r
414 \r
415     alignPanel.repaint();\r
416   }\r
417 \r
418   StringBuffer copiedSequences;\r
419   protected void copy_actionPerformed(ActionEvent e)\r
420   {\r
421     if (viewport.getSelectionGroup() == null)\r
422     {\r
423       return;\r
424     }\r
425 \r
426     SequenceGroup sg = viewport.getSelectionGroup();\r
427     copiedSequences = new StringBuffer();\r
428     Hashtable orderedSeqs = new Hashtable();\r
429     for (int i = 0; i < sg.getSize(); i++)\r
430     {\r
431       SequenceI seq = sg.getSequenceAt(i);\r
432       int index = viewport.alignment.findIndex(seq);\r
433       orderedSeqs.put(index + "", seq);\r
434     }\r
435 \r
436     int index = 0, startRes, endRes;\r
437     char ch;\r
438 \r
439     for (int i = 0; i < sg.getSize(); i++)\r
440     {\r
441         SequenceI seq = null;\r
442 \r
443         while (seq == null)\r
444         {\r
445             if (orderedSeqs.containsKey(index + ""))\r
446             {\r
447                 seq = (SequenceI) orderedSeqs.get(index + "");\r
448                 index++;\r
449 \r
450                 break;\r
451             }\r
452             else\r
453             {\r
454                 index++;\r
455             }\r
456         }\r
457 \r
458         //FIND START RES\r
459         //Returns residue following index if gap\r
460         startRes = seq.findPosition(sg.getStartRes());\r
461 \r
462         //FIND END RES\r
463         //Need to find the residue preceeding index if gap\r
464         endRes = 0;\r
465 \r
466         for (int j = 0; j < sg.getEndRes()+1 && j < seq.getLength(); j++)\r
467         {\r
468           ch = seq.getCharAt(j);\r
469           if (!jalview.util.Comparison.isGap( (ch)))\r
470           {\r
471             endRes++;\r
472           }\r
473         }\r
474 \r
475         if(endRes>0)\r
476         {\r
477           endRes += seq.getStart() -1;\r
478         }\r
479 \r
480         copiedSequences.append(seq.getName() + "\t" +\r
481             startRes + "\t" +\r
482             endRes + "\t" +\r
483             seq.getSequence(sg.getStartRes(),\r
484                 sg.getEndRes() + 1) + "\n");\r
485     }\r
486 \r
487   }\r
488 \r
489   protected void pasteNew_actionPerformed(ActionEvent e)\r
490   {\r
491     paste(true);\r
492   }\r
493 \r
494   protected void pasteThis_actionPerformed(ActionEvent e)\r
495   {\r
496     addHistoryItem(new HistoryItem("Paste Sequences", viewport.alignment,\r
497                                    HistoryItem.PASTE));\r
498     paste(false);\r
499   }\r
500 \r
501   void paste(boolean newAlignment)\r
502   {\r
503     try\r
504     {\r
505       if (copiedSequences == null)\r
506       {\r
507         return;\r
508       }\r
509 \r
510       StringTokenizer st = new StringTokenizer(copiedSequences.toString());\r
511       Vector seqs = new Vector();\r
512       while (st.hasMoreElements())\r
513       {\r
514         String name = st.nextToken();\r
515         int start = Integer.parseInt(st.nextToken());\r
516         int end = Integer.parseInt(st.nextToken());\r
517         Sequence sequence = new Sequence(name, st.nextToken(), start, end);\r
518 \r
519         if (!newAlignment)\r
520         {\r
521           viewport.alignment.addSequence(sequence);\r
522         }\r
523         else\r
524         {\r
525           seqs.addElement(sequence);\r
526         }\r
527       }\r
528 \r
529       if (newAlignment)\r
530       {\r
531         SequenceI[] newSeqs = new SequenceI[seqs.size()];\r
532         for (int i = 0; i < seqs.size(); i++)\r
533         {\r
534           newSeqs[i] = (SequenceI) seqs.elementAt(i);\r
535         }\r
536 \r
537         String newtitle = new String("Copied sequences");\r
538         if (getTitle().startsWith("Copied sequences"))\r
539         {\r
540           newtitle = getTitle();\r
541         }\r
542         else\r
543         {\r
544           newtitle = newtitle.concat("- from " + getTitle());\r
545         }\r
546         AlignFrame af = new AlignFrame(new Alignment(newSeqs), applet, newtitle);\r
547 \r
548         jalview.bin.JalviewLite.addFrame(af, newtitle, NEW_WINDOW_WIDTH,\r
549                                          NEW_WINDOW_HEIGHT);\r
550       }\r
551       else\r
552       {\r
553         viewport.setEndSeq(viewport.alignment.getHeight());\r
554         viewport.alignment.getWidth();\r
555         viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());\r
556       }\r
557 \r
558     }\r
559     catch (Exception ex)\r
560     {} // could be anything being pasted in here\r
561 \r
562   }\r
563 \r
564   protected void cut_actionPerformed(ActionEvent e)\r
565   {\r
566     copy_actionPerformed(null);\r
567     delete_actionPerformed(null);\r
568   }\r
569 \r
570   protected void delete_actionPerformed(ActionEvent e)\r
571   {\r
572     addHistoryItem(new HistoryItem("Delete Sequences", viewport.alignment,\r
573                                    HistoryItem.HIDE));\r
574     if (viewport.getSelectionGroup() == null)\r
575     {\r
576       return;\r
577     }\r
578 \r
579 \r
580     SequenceGroup sg = viewport.getSelectionGroup();\r
581     boolean allSequences = false;\r
582     if(sg.sequences.size()==viewport.alignment.getHeight())\r
583           allSequences = true;\r
584 \r
585     for (int i = 0; i < sg.sequences.size(); i++)\r
586     {\r
587       SequenceI seq = sg.getSequenceAt(i);\r
588       int index = viewport.getAlignment().findIndex(seq);\r
589       seq.deleteChars(sg.getStartRes(), sg.getEndRes() + 1);\r
590 \r
591       // If the cut affects all sequences, remove highlighted columns\r
592       if (allSequences)\r
593       {\r
594         viewport.getColumnSelection().removeElements(sg.getStartRes(),\r
595                                                      sg.getEndRes() + 1);\r
596       }\r
597 \r
598 \r
599       if (seq.getSequence().length() < 1)\r
600       {\r
601         viewport.getAlignment().deleteSequence(seq);\r
602       }\r
603       else\r
604       {\r
605         viewport.getAlignment().getSequences().setElementAt(seq, index);\r
606       }\r
607     }\r
608 \r
609     viewport.setSelectionGroup(null);\r
610     viewport.alignment.deleteGroup(sg);\r
611     viewport.resetSeqLimits(alignPanel.seqPanel.seqCanvas.getSize().height);\r
612     if (viewport.getAlignment().getHeight() < 1)\r
613     {\r
614       try\r
615       {\r
616         this.setVisible(false);\r
617       }\r
618       catch (Exception ex)\r
619       {}\r
620     }\r
621     viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());\r
622 \r
623   }\r
624 \r
625   protected void deleteGroups_actionPerformed(ActionEvent e)\r
626   {\r
627     viewport.alignment.deleteAllGroups();\r
628     viewport.setSelectionGroup(null);\r
629 \r
630     alignPanel.repaint();\r
631   }\r
632 \r
633   public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)\r
634   {\r
635     SequenceGroup sg = new SequenceGroup();\r
636     for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)\r
637     {\r
638       sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);\r
639     }\r
640     sg.setEndRes(viewport.alignment.getWidth()-1);\r
641     viewport.setSelectionGroup(sg);\r
642     alignPanel.repaint();\r
643     PaintRefresher.Refresh(null, viewport.alignment);\r
644   }\r
645 \r
646   public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)\r
647   {\r
648     viewport.setSelectionGroup(null);\r
649     viewport.getColumnSelection().clear();\r
650     viewport.setSelectionGroup(null);\r
651     alignPanel.repaint();\r
652     PaintRefresher.Refresh(null, viewport.alignment);\r
653   }\r
654 \r
655   public void invertSequenceMenuItem_actionPerformed(ActionEvent e)\r
656   {\r
657     SequenceGroup sg = viewport.getSelectionGroup();\r
658     for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)\r
659     {\r
660       sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);\r
661     }\r
662 \r
663     PaintRefresher.Refresh(null, viewport.alignment);\r
664   }\r
665 \r
666   public void remove2LeftMenuItem_actionPerformed(ActionEvent e)\r
667   {\r
668     ColumnSelection colSel = viewport.getColumnSelection();\r
669     if (colSel.size() > 0)\r
670     {\r
671       addHistoryItem(new HistoryItem("Remove Left", viewport.alignment,\r
672                                      HistoryItem.HIDE));\r
673       int min = colSel.getMin();\r
674       viewport.getAlignment().trimLeft(min);\r
675       colSel.compensateForEdit(0, min);\r
676 \r
677       if (viewport.getSelectionGroup() != null)\r
678       {\r
679         viewport.getSelectionGroup().adjustForRemoveLeft(min);\r
680       }\r
681 \r
682       Vector groups = viewport.alignment.getGroups();\r
683       for (int i = 0; i < groups.size(); i++)\r
684       {\r
685         SequenceGroup sg = (SequenceGroup) groups.elementAt(i);\r
686         if (!sg.adjustForRemoveLeft(min))\r
687         {\r
688           viewport.alignment.deleteGroup(sg);\r
689         }\r
690       }\r
691       viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());\r
692     }\r
693   }\r
694 \r
695   public void remove2RightMenuItem_actionPerformed(ActionEvent e)\r
696   {\r
697     ColumnSelection colSel = viewport.getColumnSelection();\r
698     if (colSel.size() > 0)\r
699     {\r
700       addHistoryItem(new HistoryItem("Remove Right", viewport.alignment,\r
701                                      HistoryItem.HIDE));\r
702       int max = colSel.getMax();\r
703       viewport.getAlignment().trimRight(max);\r
704       if (viewport.getSelectionGroup() != null)\r
705       {\r
706         viewport.getSelectionGroup().adjustForRemoveRight(max);\r
707       }\r
708 \r
709       Vector groups = viewport.alignment.getGroups();\r
710       for (int i = 0; i < groups.size(); i++)\r
711       {\r
712         SequenceGroup sg = (SequenceGroup) groups.elementAt(i);\r
713         if (!sg.adjustForRemoveRight(max))\r
714         {\r
715           viewport.alignment.deleteGroup(sg);\r
716         }\r
717       }\r
718       viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());\r
719     }\r
720 \r
721   }\r
722 \r
723   public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)\r
724   {\r
725     addHistoryItem(new HistoryItem("Remove Gapped Columns",\r
726                                    viewport.alignment,\r
727                                    HistoryItem.HIDE));\r
728 \r
729     //This is to maintain viewport position on first residue\r
730     //of first sequence\r
731     SequenceI seq = viewport.alignment.getSequenceAt(0);\r
732     int startRes = seq.findPosition(viewport.startRes);\r
733 \r
734     viewport.getAlignment().removeGaps();\r
735 \r
736     viewport.setStartRes(seq.findIndex(startRes)-1);\r
737 \r
738     viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());\r
739   }\r
740 \r
741   public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)\r
742   {\r
743     addHistoryItem(new HistoryItem("Remove Gaps", viewport.alignment,\r
744                                    HistoryItem.HIDE));\r
745 \r
746     //This is to maintain viewport position on first residue\r
747     //of first sequence\r
748     SequenceI seq = viewport.alignment.getSequenceAt(0);\r
749     int startRes = seq.findPosition(viewport.startRes);\r
750 \r
751     SequenceI current;\r
752     int jSize;\r
753 \r
754     Vector seqs=null;\r
755 \r
756     int start=0, end = viewport.alignment.getWidth();\r
757 \r
758     if (viewport.getSelectionGroup() != null\r
759         && viewport.getSelectionGroup().sequences != null\r
760         && viewport.getSelectionGroup().sequences.size()>0)\r
761     {\r
762       seqs = viewport.getSelectionGroup().sequences;\r
763       start = viewport.getSelectionGroup().getStartRes();\r
764       end = viewport.getSelectionGroup().getEndRes()+1;\r
765     }\r
766     else\r
767       seqs = viewport.alignment.getSequences();\r
768 \r
769     for (int i = 0; i < seqs.size(); i++)\r
770     {\r
771       current = (SequenceI) seqs.elementAt(i);\r
772       jSize = current.getLength();\r
773 \r
774       // Removing a range is much quicker than removing gaps\r
775       // one by one for long sequences\r
776       int j = start;\r
777       int rangeStart=-1, rangeEnd=-1;\r
778 \r
779       do\r
780       {\r
781         if (jalview.util.Comparison.isGap(current.getCharAt(j)))\r
782         {\r
783           if(rangeStart==-1)\r
784            {\r
785              rangeStart = j;\r
786              rangeEnd = j+1;\r
787            }\r
788            else\r
789            {\r
790              rangeEnd++;\r
791            }\r
792            j++;\r
793         }\r
794         else\r
795         {\r
796           if(rangeStart>-1)\r
797           {\r
798             current.deleteChars(rangeStart, rangeEnd);\r
799             j-=rangeEnd-rangeStart;\r
800             jSize-=rangeEnd-rangeStart;\r
801             rangeStart = -1;\r
802             rangeEnd = -1;\r
803           }\r
804           else\r
805             j++;\r
806         }\r
807       }\r
808       while (j < end && j < jSize);\r
809       if(rangeStart>-1)\r
810       {\r
811        current.deleteChars(rangeStart, rangeEnd);\r
812       }\r
813     }\r
814     viewport.setStartRes(seq.findIndex(startRes)-1);\r
815     viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());\r
816   }\r
817 \r
818   public void alignmentChanged()\r
819   {\r
820     viewport.updateConsensus();\r
821     viewport.updateConservation ();\r
822     resetAllColourSchemes();\r
823     if(alignPanel.overviewPanel!=null)\r
824       alignPanel.overviewPanel.updateOverviewImage();\r
825     alignPanel.repaint();\r
826   }\r
827 \r
828   void resetAllColourSchemes()\r
829   {\r
830     ColourSchemeI cs = viewport.globalColourScheme;\r
831     if(cs!=null)\r
832     {\r
833       if (cs instanceof ClustalxColourScheme)\r
834       {\r
835         ( (ClustalxColourScheme) viewport.getGlobalColourScheme()).\r
836             resetClustalX(viewport.alignment.getSequences(),\r
837                           viewport.alignment.getWidth());\r
838       }\r
839 \r
840       cs.setConsensus(viewport.vconsensus);\r
841       if (cs.conservationApplied())\r
842       {\r
843         Alignment al = (Alignment) viewport.alignment;\r
844         Conservation c = new Conservation("All",\r
845                                           ResidueProperties.propHash, 3,\r
846                                           al.getSequences(), 0,\r
847                                           al.getWidth() - 1);\r
848         c.calculate();\r
849         c.verdict(false, viewport.ConsPercGaps);\r
850 \r
851         cs.setConservation(c);\r
852       }\r
853     }\r
854 \r
855     int s, sSize = viewport.alignment.getGroups().size();\r
856     for(s=0; s<sSize; s++)\r
857     {\r
858       SequenceGroup sg = (SequenceGroup)viewport.alignment.getGroups().elementAt(s);\r
859       if(sg.cs!=null && sg.cs instanceof ClustalxColourScheme)\r
860       {\r
861         ((ClustalxColourScheme)sg.cs).resetClustalX(sg.sequences, sg.getWidth());\r
862       }\r
863       sg.recalcConservation();\r
864     }\r
865   }\r
866 \r
867 \r
868 \r
869   public void findMenuItem_actionPerformed(ActionEvent e)\r
870   {\r
871     new Finder(alignPanel);\r
872   }\r
873 \r
874   public void font_actionPerformed(ActionEvent e)\r
875   {\r
876     new FontChooser(alignPanel);\r
877   }\r
878 \r
879 \r
880   public void seqLimits_itemStateChanged(ItemEvent e)\r
881   {\r
882     viewport.setShowJVSuffix(seqLimits.getState());\r
883     alignPanel.fontChanged();\r
884     alignPanel.repaint();\r
885   }\r
886 \r
887 \r
888   protected void colourTextMenuItem_actionPerformed(ActionEvent e)\r
889   {\r
890     viewport.setColourText(colourTextMenuItem.getState());\r
891     alignPanel.repaint();\r
892   }\r
893 \r
894   protected void wrapMenuItem_actionPerformed(ActionEvent e)\r
895   {\r
896     viewport.setWrapAlignment(wrapMenuItem.getState());\r
897     alignPanel.setWrapAlignment(wrapMenuItem.getState());\r
898     scaleAbove.setEnabled(wrapMenuItem.getState());\r
899     scaleLeft.setEnabled(wrapMenuItem.getState());\r
900     scaleRight.setEnabled(wrapMenuItem.getState());\r
901     alignPanel.repaint();\r
902   }\r
903 \r
904   protected void scaleAbove_actionPerformed(ActionEvent e)\r
905   {\r
906     viewport.setScaleAboveWrapped(scaleAbove.getState());\r
907     alignPanel.repaint();\r
908   }\r
909 \r
910   protected void scaleLeft_actionPerformed(ActionEvent e)\r
911   {\r
912     viewport.setScaleLeftWrapped(scaleLeft.getState());\r
913     alignPanel.repaint();\r
914   }\r
915 \r
916   protected void scaleRight_actionPerformed(ActionEvent e)\r
917   {\r
918     viewport.setScaleRightWrapped(scaleRight.getState());\r
919     alignPanel.repaint();\r
920   }\r
921 \r
922   public void viewBoxesMenuItem_actionPerformed(ActionEvent e)\r
923   {\r
924     viewport.setShowBoxes(viewBoxesMenuItem.getState());\r
925     alignPanel.repaint();\r
926   }\r
927 \r
928   public void viewTextMenuItem_actionPerformed(ActionEvent e)\r
929   {\r
930     viewport.setShowText(viewTextMenuItem.getState());\r
931     alignPanel.repaint();\r
932   }\r
933 \r
934   protected void renderGapsMenuItem_actionPerformed(ActionEvent e)\r
935   {\r
936     viewport.setRenderGaps(renderGapsMenuItem.getState());\r
937     alignPanel.repaint();\r
938   }\r
939 \r
940   public void annotationPanelMenuItem_actionPerformed(ActionEvent e)\r
941   {\r
942     viewport.setShowAnnotation(annotationPanelMenuItem.getState());\r
943     alignPanel.setAnnotationVisible(annotationPanelMenuItem.getState());\r
944   }\r
945 \r
946   public void overviewMenuItem_actionPerformed(ActionEvent e)\r
947   {\r
948     if (alignPanel.overviewPanel != null)\r
949     {\r
950       return;\r
951     }\r
952 \r
953     Frame frame = new Frame();\r
954     OverviewPanel overview = new OverviewPanel(alignPanel);\r
955     frame.add(overview);\r
956     // +50 must allow for applet frame window\r
957     jalview.bin.JalviewLite.addFrame(frame, "Overview " + this.getTitle(),\r
958                                      overview.preferredSize().width,\r
959                                      overview.preferredSize().height + 50);\r
960 \r
961     frame.pack();\r
962     frame.addWindowListener(new WindowAdapter()\r
963     {\r
964       public void windowClosing(WindowEvent e)\r
965       {\r
966         alignPanel.setOverviewPanel(null);\r
967       };\r
968     });\r
969 \r
970     alignPanel.setOverviewPanel(overview);\r
971 \r
972   }\r
973 \r
974   protected void noColourmenuItem_actionPerformed(ActionEvent e)\r
975   {\r
976     changeColour(null);\r
977   }\r
978 \r
979   public void clustalColour_actionPerformed(ActionEvent e)\r
980   {\r
981     abovePIDThreshold.setState(false);\r
982     changeColour(new ClustalxColourScheme(viewport.alignment.getSequences(),\r
983                                           viewport.alignment.getWidth()));\r
984   }\r
985 \r
986   public void zappoColour_actionPerformed(ActionEvent e)\r
987   {\r
988     changeColour(new ZappoColourScheme());\r
989   }\r
990 \r
991   public void taylorColour_actionPerformed(ActionEvent e)\r
992   {\r
993     changeColour(new TaylorColourScheme());\r
994   }\r
995 \r
996   public void hydrophobicityColour_actionPerformed(ActionEvent e)\r
997   {\r
998     changeColour(new HydrophobicColourScheme());\r
999   }\r
1000 \r
1001   public void helixColour_actionPerformed(ActionEvent e)\r
1002   {\r
1003     changeColour(new HelixColourScheme());\r
1004   }\r
1005 \r
1006   public void strandColour_actionPerformed(ActionEvent e)\r
1007   {\r
1008     changeColour(new StrandColourScheme());\r
1009   }\r
1010 \r
1011   public void turnColour_actionPerformed(ActionEvent e)\r
1012   {\r
1013     changeColour(new TurnColourScheme());\r
1014   }\r
1015 \r
1016   public void buriedColour_actionPerformed(ActionEvent e)\r
1017   {\r
1018     changeColour(new BuriedColourScheme());\r
1019   }\r
1020 \r
1021   public void nucleotideColour_actionPerformed(ActionEvent e)\r
1022   {\r
1023     changeColour(new NucleotideColourScheme());\r
1024   }\r
1025 \r
1026   protected void applyToAllGroups_actionPerformed(ActionEvent e)\r
1027   {\r
1028     viewport.setColourAppliesToAllGroups(applyToAllGroups.getState());\r
1029   }\r
1030 \r
1031   void changeColour(ColourSchemeI cs)\r
1032   {\r
1033     int threshold = 0;\r
1034 \r
1035     if(cs!=null)\r
1036     {\r
1037       if (viewport.getAbovePIDThreshold())\r
1038       {\r
1039         threshold = SliderPanel.setPIDSliderSource(alignPanel, cs, "Background");\r
1040 \r
1041         cs.setThreshold(threshold, viewport.getIgnoreGapsConsensus());\r
1042 \r
1043         viewport.setGlobalColourScheme(cs);\r
1044       }\r
1045       else\r
1046       {\r
1047         cs.setThreshold(0, viewport.getIgnoreGapsConsensus());\r
1048       }\r
1049 \r
1050       if (viewport.getConservationSelected())\r
1051       {\r
1052 \r
1053         Alignment al = (Alignment) viewport.alignment;\r
1054         Conservation c = new Conservation("All",\r
1055                                           ResidueProperties.propHash, 3,\r
1056                                           al.getSequences(), 0,\r
1057                                           al.getWidth() - 1);\r
1058 \r
1059         c.calculate();\r
1060         c.verdict(false, viewport.ConsPercGaps);\r
1061 \r
1062         cs.setConservation(c);\r
1063 \r
1064         cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel, cs,\r
1065             "Background"));\r
1066 \r
1067       }\r
1068       else\r
1069       {\r
1070         cs.setConservation(null);\r
1071       }\r
1072 \r
1073       cs.setConsensus(viewport.vconsensus);\r
1074 \r
1075     }\r
1076     viewport.setGlobalColourScheme(cs);\r
1077 \r
1078     if (viewport.getColourAppliesToAllGroups())\r
1079     {\r
1080       Vector groups = viewport.alignment.getGroups();\r
1081       for (int i = 0; i < groups.size(); i++)\r
1082       {\r
1083         SequenceGroup sg = (SequenceGroup) groups.elementAt(i);\r
1084 \r
1085         if(cs==null)\r
1086         {\r
1087           sg.cs = null;\r
1088           continue;\r
1089         }\r
1090         if (cs instanceof ClustalxColourScheme)\r
1091         {\r
1092           sg.cs = new ClustalxColourScheme(sg.sequences, sg.getWidth());\r
1093         }\r
1094         else\r
1095         {\r
1096           try\r
1097           {\r
1098             sg.cs = (ColourSchemeI) cs.getClass().newInstance();\r
1099           }\r
1100           catch (Exception ex)\r
1101           {\r
1102             ex.printStackTrace();\r
1103             sg.cs = cs;\r
1104           }\r
1105         }\r
1106 \r
1107         if (viewport.getAbovePIDThreshold()\r
1108             || cs instanceof PIDColourScheme\r
1109             || cs instanceof Blosum62ColourScheme)\r
1110         {\r
1111           sg.cs.setThreshold(threshold, viewport.getIgnoreGapsConsensus());\r
1112           sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0, sg.getWidth()));\r
1113         }\r
1114         else\r
1115           sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());\r
1116 \r
1117         if (viewport.getConservationSelected())\r
1118         {\r
1119           Conservation c = new Conservation("Group",\r
1120                                             ResidueProperties.propHash, 3,\r
1121                                             sg.sequences, 0,\r
1122                                             viewport.alignment.getWidth() - 1);\r
1123           c.calculate();\r
1124           c.verdict(false, viewport.ConsPercGaps);\r
1125           sg.cs.setConservation(c);\r
1126         }\r
1127         else\r
1128         {\r
1129           sg.cs.setConservation(null);\r
1130           sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());\r
1131         }\r
1132 \r
1133       }\r
1134     }\r
1135 \r
1136 \r
1137     if (alignPanel.getOverviewPanel() != null)\r
1138     {\r
1139       alignPanel.getOverviewPanel().updateOverviewImage();\r
1140     }\r
1141 \r
1142     alignPanel.repaint();\r
1143   }\r
1144 \r
1145 \r
1146 \r
1147   protected void modifyPID_actionPerformed(ActionEvent e)\r
1148   {\r
1149     if (viewport.getAbovePIDThreshold() && viewport.globalColourScheme!=null)\r
1150     {\r
1151       SliderPanel.setPIDSliderSource(alignPanel, viewport.getGlobalColourScheme(),\r
1152                                      "Background");\r
1153       SliderPanel.showPIDSlider();\r
1154     }\r
1155   }\r
1156 \r
1157   protected void modifyConservation_actionPerformed(ActionEvent e)\r
1158   {\r
1159     if (viewport.getConservationSelected() && viewport.globalColourScheme!=null)\r
1160     {\r
1161       SliderPanel.setConservationSlider(alignPanel, viewport.globalColourScheme,\r
1162                                         "Background");\r
1163       SliderPanel.showConservationSlider();\r
1164     }\r
1165   }\r
1166 \r
1167   protected void conservationMenuItem_actionPerformed(ActionEvent e)\r
1168   {\r
1169     viewport.setConservationSelected(conservationMenuItem.getState());\r
1170 \r
1171     viewport.setAbovePIDThreshold(false);\r
1172     abovePIDThreshold.setState(false);\r
1173 \r
1174     changeColour(viewport.getGlobalColourScheme());\r
1175 \r
1176     modifyConservation_actionPerformed(null);\r
1177   }\r
1178 \r
1179   public void abovePIDThreshold_actionPerformed(ActionEvent e)\r
1180   {\r
1181     viewport.setAbovePIDThreshold(abovePIDThreshold.getState());\r
1182 \r
1183     conservationMenuItem.setState(false);\r
1184     viewport.setConservationSelected(false);\r
1185 \r
1186     changeColour(viewport.getGlobalColourScheme());\r
1187 \r
1188     modifyPID_actionPerformed(null);\r
1189   }\r
1190 \r
1191   public void userDefinedColour_actionPerformed(ActionEvent e)\r
1192   {\r
1193     new UserDefinedColours(alignPanel, null);\r
1194   }\r
1195 \r
1196   public void PIDColour_actionPerformed(ActionEvent e)\r
1197   {\r
1198     changeColour(new PIDColourScheme());\r
1199   }\r
1200 \r
1201   public void BLOSUM62Colour_actionPerformed(ActionEvent e)\r
1202   {\r
1203     changeColour(new Blosum62ColourScheme());\r
1204   }\r
1205 \r
1206   public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)\r
1207   {\r
1208     addHistoryItem(new HistoryItem("Pairwise Sort", viewport.alignment,\r
1209                                    HistoryItem.SORT));\r
1210     AlignmentSorter.sortByPID(viewport.getAlignment(),\r
1211                               viewport.getAlignment().getSequenceAt(0));\r
1212     alignPanel.repaint();\r
1213   }\r
1214 \r
1215   public void sortIDMenuItem_actionPerformed(ActionEvent e)\r
1216   {\r
1217     addHistoryItem(new HistoryItem("ID Sort", viewport.alignment,\r
1218                                    HistoryItem.SORT));\r
1219     AlignmentSorter.sortByID(viewport.getAlignment());\r
1220     alignPanel.repaint();\r
1221   }\r
1222 \r
1223   public void sortGroupMenuItem_actionPerformed(ActionEvent e)\r
1224   {\r
1225     addHistoryItem(new HistoryItem("Group Sort", viewport.alignment,\r
1226                                    HistoryItem.SORT));\r
1227     AlignmentSorter.sortByGroup(viewport.getAlignment());\r
1228     alignPanel.repaint();\r
1229 \r
1230   }\r
1231 \r
1232   public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)\r
1233   {\r
1234     RedundancyPanel sp = new RedundancyPanel(alignPanel);\r
1235     Frame frame = new Frame();\r
1236     frame.add(sp);\r
1237     jalview.bin.JalviewLite.addFrame(frame, "Redundancy threshold selection",\r
1238                                      400, 120);\r
1239 \r
1240   }\r
1241 \r
1242   public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)\r
1243   {\r
1244     if (viewport.getSelectionGroup().getSize() > 1)\r
1245     {\r
1246       Frame frame = new Frame();\r
1247       frame.add(new PairwiseAlignPanel(alignPanel));\r
1248       jalview.bin.JalviewLite.addFrame(frame, "Pairwise Alignment", 600, 500);\r
1249     }\r
1250   }\r
1251 \r
1252   public void PCAMenuItem_actionPerformed(ActionEvent e)\r
1253   {\r
1254     //are the sequences aligned?\r
1255     if (!viewport.alignment.isAligned())\r
1256     {\r
1257       SequenceI current;\r
1258       int Width = viewport.getAlignment().getWidth();\r
1259 \r
1260       for (int i = 0; i < viewport.getAlignment().getSequences().size();\r
1261            i++)\r
1262       {\r
1263         current = viewport.getAlignment().getSequenceAt(i);\r
1264 \r
1265         if (current.getLength() < Width)\r
1266         {\r
1267           current.insertCharAt(Width - 1, viewport.getGapCharacter());\r
1268         }\r
1269       }\r
1270       alignPanel.repaint();\r
1271     }\r
1272 \r
1273     if ( (viewport.getSelectionGroup() != null &&\r
1274           viewport.getSelectionGroup().getSize() < 4 &&\r
1275           viewport.getSelectionGroup().getSize() > 0)\r
1276         || viewport.getAlignment().getHeight() < 4)\r
1277     {\r
1278       return;\r
1279     }\r
1280 \r
1281     try\r
1282     {\r
1283       new PCAPanel(viewport);\r
1284     }\r
1285     catch (java.lang.OutOfMemoryError ex)\r
1286     {\r
1287     }\r
1288 \r
1289   }\r
1290 \r
1291   public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)\r
1292   {\r
1293     NewTreePanel("AV", "PID", "Average distance tree using PID");\r
1294   }\r
1295 \r
1296   public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)\r
1297   {\r
1298     NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");\r
1299   }\r
1300 \r
1301   protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)\r
1302   {\r
1303     NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");\r
1304   }\r
1305 \r
1306   protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)\r
1307   {\r
1308     NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62PID");\r
1309   }\r
1310 \r
1311   void NewTreePanel(String type, String pwType, String title)\r
1312   {\r
1313     //are the sequences aligned?\r
1314     if (!viewport.alignment.isAligned())\r
1315     {\r
1316       SequenceI current;\r
1317       int Width = viewport.getAlignment().getWidth();\r
1318 \r
1319       for (int i = 0; i < viewport.getAlignment().getSequences().size();\r
1320            i++)\r
1321       {\r
1322         current = viewport.getAlignment().getSequenceAt(i);\r
1323 \r
1324         if (current.getLength() < Width)\r
1325         {\r
1326           current.insertCharAt(Width - 1, viewport.getGapCharacter());\r
1327         }\r
1328       }\r
1329       alignPanel.repaint();\r
1330 \r
1331     }\r
1332 \r
1333     final TreePanel tp;\r
1334     if (viewport.getSelectionGroup() != null &&\r
1335         viewport.getSelectionGroup().getSize() > 3)\r
1336     {\r
1337       tp = new TreePanel(viewport, viewport.getSelectionGroup().sequences, type,\r
1338                          pwType,\r
1339                          0, viewport.alignment.getWidth());\r
1340     }\r
1341     else\r
1342     {\r
1343       tp = new TreePanel(viewport, viewport.getAlignment().getSequences(),\r
1344                          type, pwType, 0, viewport.alignment.getWidth());\r
1345     }\r
1346 \r
1347     addTreeMenuItem(tp, title);\r
1348 \r
1349     jalview.bin.JalviewLite.addFrame(tp, title, 600, 500);\r
1350   }\r
1351 \r
1352   void addTreeMenuItem(final TreePanel treePanel, String title)\r
1353   {\r
1354     final MenuItem item = new MenuItem(title);\r
1355     sortByTreeMenu.add(item);\r
1356     item.addActionListener(new java.awt.event.ActionListener()\r
1357     {\r
1358       public void actionPerformed(ActionEvent e)\r
1359       {\r
1360         addHistoryItem(new HistoryItem("Sort", viewport.alignment,\r
1361                                        HistoryItem.SORT));\r
1362         AlignmentSorter.sortByTree(viewport.getAlignment(), treePanel.getTree());\r
1363         alignPanel.repaint();\r
1364       }\r
1365     });\r
1366 \r
1367     treePanel.addWindowListener(new WindowAdapter()\r
1368     {\r
1369       public void windowClosing(WindowEvent e)\r
1370       {\r
1371         sortByTreeMenu.remove(item);\r
1372       };\r
1373     });\r
1374   }\r
1375 \r
1376   protected void documentation_actionPerformed(ActionEvent e)\r
1377   {\r
1378     showURL("http://www.jalview.org/help.html");\r
1379   }\r
1380 \r
1381   protected void about_actionPerformed(ActionEvent e)\r
1382   {\r
1383 \r
1384     class AboutPanel extends Canvas\r
1385     {\r
1386       String version;\r
1387       public AboutPanel(String version)\r
1388       { this.version = version; }\r
1389 \r
1390       public void paint(Graphics g)\r
1391       {\r
1392         g.setColor(Color.white);\r
1393         g.fillRect(0, 0, getSize().width, getSize().height);\r
1394         g.setFont(new Font("Helvetica", Font.PLAIN, 12));\r
1395         FontMetrics fm = g.getFontMetrics();\r
1396         int fh = fm.getHeight();\r
1397         int y = 5, x = 7;\r
1398         g.setColor(Color.black);\r
1399         g.setFont(new Font("Helvetica", Font.BOLD, 14));\r
1400         g.drawString("Jalview - Release "+version, 200, y += fh);\r
1401         g.setFont(new Font("Helvetica", Font.PLAIN, 12));\r
1402         g.drawString("Authors:  Michele Clamp, James Cuff, Steve Searle, Andrew Waterhouse, Jim Procter & Geoff Barton.",\r
1403                      x, y += fh * 2);\r
1404         g.drawString("Current development managed by Andrew Waterhouse; Barton Group, University of Dundee.",\r
1405                      x, y += fh);\r
1406         g.drawString(\r
1407             "For any issues relating to Jalview, email help@jalview.org", x,\r
1408             y += fh);\r
1409         g.drawString("If  you use JalView, please cite:", x, y += fh + 8);\r
1410         g.drawString("\"Clamp, M., Cuff, J., Searle, S. M. and Barton, G. J. (2004), The Jalview Java Alignment Editor\"",\r
1411                      x, y += fh);\r
1412         g.drawString("Bioinformatics,  2004 12;426-7.", x, y += fh);\r
1413       }\r
1414     }\r
1415 \r
1416     String version = "test";\r
1417     java.net.URL url = getClass().getResource("/.build_properties");\r
1418     if (url != null)\r
1419     {\r
1420       try\r
1421       {\r
1422         BufferedReader reader = new BufferedReader(new InputStreamReader(\r
1423             url.openStream()));\r
1424         String line;\r
1425         while ( (line = reader.readLine()) != null)\r
1426         {\r
1427           if (line.indexOf("VERSION") > -1)\r
1428           {\r
1429             version = line.substring(line.indexOf("=") + 1);\r
1430           }\r
1431         }\r
1432       }\r
1433       catch (Exception ex)\r
1434       {\r
1435         ex.printStackTrace();\r
1436       }\r
1437     }\r
1438 \r
1439 \r
1440     Frame frame = new Frame();\r
1441     frame.add(new AboutPanel(version));\r
1442     jalview.bin.JalviewLite.addFrame(frame, "Jalview", 580, 200);\r
1443 \r
1444   }\r
1445 \r
1446   /**\r
1447    * Displays the given URL in a new browser window\r
1448    *\r
1449    * @param url URL to display in browser window.\r
1450    * <br>New window will be named "HELP_WINDOW"\r
1451    */\r
1452   public void showURL(String url)\r
1453   {\r
1454     showURL(url, "HELP");\r
1455   }\r
1456 \r
1457   public void showURL(String url, String target)\r
1458   {\r
1459     if (applet == null)\r
1460     {\r
1461       System.out.println("Not running as applet - no browser available.");\r
1462     }\r
1463     else\r
1464     {\r
1465       try\r
1466       {\r
1467         applet.getAppletContext().showDocument(new java.net.URL(url),\r
1468                                                target);\r
1469       }\r
1470       catch (Exception ex)\r
1471       {\r
1472         ex.printStackTrace();\r
1473       }\r
1474     }\r
1475   }\r
1476 \r
1477 \r
1478   //////////////////////////////////////////////////////////////////////////////////\r
1479   //JBuilder Graphics here\r
1480 \r
1481     protected MenuBar alignFrameMenuBar = new MenuBar();\r
1482     protected Menu fileMenu = new Menu();\r
1483     protected MenuItem closeMenuItem = new MenuItem();\r
1484     protected Menu editMenu = new Menu();\r
1485     protected Menu viewMenu = new Menu();\r
1486     protected Menu colourMenu = new Menu();\r
1487     protected Menu calculateMenu = new Menu();\r
1488     protected MenuItem selectAllSequenceMenuItem = new MenuItem();\r
1489     protected MenuItem deselectAllSequenceMenuItem = new MenuItem();\r
1490     protected MenuItem invertSequenceMenuItem = new MenuItem();\r
1491     protected MenuItem remove2LeftMenuItem = new MenuItem();\r
1492     protected MenuItem remove2RightMenuItem = new MenuItem();\r
1493     protected MenuItem removeGappedColumnMenuItem = new MenuItem();\r
1494     protected MenuItem removeAllGapsMenuItem = new MenuItem();\r
1495     protected CheckboxMenuItem viewBoxesMenuItem = new CheckboxMenuItem();\r
1496     protected CheckboxMenuItem viewTextMenuItem = new CheckboxMenuItem();\r
1497     protected MenuItem sortPairwiseMenuItem = new MenuItem();\r
1498     protected MenuItem sortIDMenuItem = new MenuItem();\r
1499     protected MenuItem sortGroupMenuItem = new MenuItem();\r
1500     protected MenuItem removeRedundancyMenuItem = new MenuItem();\r
1501     protected MenuItem pairwiseAlignmentMenuItem = new MenuItem();\r
1502     protected MenuItem PCAMenuItem = new MenuItem();\r
1503     protected MenuItem averageDistanceTreeMenuItem = new MenuItem();\r
1504     protected MenuItem neighbourTreeMenuItem = new MenuItem();\r
1505     BorderLayout borderLayout1 = new BorderLayout();\r
1506     public Label statusBar = new Label();\r
1507     protected Menu outputTextboxMenu = new Menu();\r
1508     protected MenuItem clustalColour = new MenuItem();\r
1509     protected MenuItem zappoColour = new MenuItem();\r
1510     protected MenuItem taylorColour = new MenuItem();\r
1511     protected MenuItem hydrophobicityColour = new MenuItem();\r
1512     protected MenuItem helixColour = new MenuItem();\r
1513     protected MenuItem strandColour = new MenuItem();\r
1514     protected MenuItem turnColour = new MenuItem();\r
1515     protected MenuItem buriedColour = new MenuItem();\r
1516     protected MenuItem userDefinedColour = new MenuItem();\r
1517     protected MenuItem PIDColour = new MenuItem();\r
1518     protected MenuItem BLOSUM62Colour = new MenuItem();\r
1519     MenuItem njTreeBlosumMenuItem = new MenuItem();\r
1520     MenuItem avDistanceTreeBlosumMenuItem = new MenuItem();\r
1521     protected CheckboxMenuItem annotationPanelMenuItem = new CheckboxMenuItem();\r
1522     protected CheckboxMenuItem colourTextMenuItem = new CheckboxMenuItem();\r
1523     MenuItem overviewMenuItem = new MenuItem();\r
1524     protected MenuItem undoMenuItem = new MenuItem();\r
1525     protected MenuItem redoMenuItem = new MenuItem();\r
1526     protected CheckboxMenuItem conservationMenuItem = new CheckboxMenuItem();\r
1527     MenuItem noColourmenuItem = new MenuItem();\r
1528     protected CheckboxMenuItem wrapMenuItem = new CheckboxMenuItem();\r
1529     protected CheckboxMenuItem renderGapsMenuItem = new CheckboxMenuItem();\r
1530     MenuItem findMenuItem = new MenuItem();\r
1531     Menu searchMenu = new Menu();\r
1532     protected CheckboxMenuItem abovePIDThreshold = new CheckboxMenuItem();\r
1533     protected MenuItem nucleotideColour = new MenuItem();\r
1534     MenuItem deleteGroups = new MenuItem();\r
1535     MenuItem delete = new MenuItem();\r
1536     MenuItem copy = new MenuItem();\r
1537     MenuItem cut = new MenuItem();\r
1538     Menu Menu1 = new Menu();\r
1539     MenuItem pasteNew = new MenuItem();\r
1540     MenuItem pasteThis = new MenuItem();\r
1541     protected CheckboxMenuItem applyToAllGroups = new CheckboxMenuItem();\r
1542     protected MenuItem font = new MenuItem();\r
1543     protected CheckboxMenuItem scaleAbove = new CheckboxMenuItem();\r
1544     protected CheckboxMenuItem scaleLeft = new CheckboxMenuItem();\r
1545     protected CheckboxMenuItem scaleRight = new CheckboxMenuItem();\r
1546     MenuItem modifyPID = new MenuItem();\r
1547     MenuItem modifyConservation = new MenuItem();\r
1548     protected Menu sortByTreeMenu = new Menu();\r
1549     Menu sort = new Menu();\r
1550     Menu calculate = new Menu();\r
1551     MenuItem inputText = new MenuItem();\r
1552     Menu helpMenu = new Menu();\r
1553     MenuItem documentation = new MenuItem();\r
1554     MenuItem about = new MenuItem();\r
1555     protected CheckboxMenuItem seqLimits = new CheckboxMenuItem();\r
1556 \r
1557     private void jbInit() throws Exception {\r
1558 \r
1559       setMenuBar(alignFrameMenuBar);\r
1560 \r
1561       MenuItem item;\r
1562 \r
1563       // dynamically fill save as menu with available formats\r
1564       for (int i = 0; i < jalview.io.AppletFormatAdapter.formats.size(); i++)\r
1565       {\r
1566 \r
1567         item = new MenuItem( (String) jalview.io.AppletFormatAdapter.formats.\r
1568                             elementAt(\r
1569                                 i));\r
1570         item.addActionListener(new java.awt.event.ActionListener()\r
1571         {\r
1572           public void actionPerformed(ActionEvent e)\r
1573           {\r
1574             outputText_actionPerformed(e);\r
1575           }\r
1576         });\r
1577 \r
1578         outputTextboxMenu.add(item);\r
1579       }\r
1580 \r
1581 \r
1582         fileMenu.setLabel("File");\r
1583         closeMenuItem.setLabel("Close");\r
1584         closeMenuItem.addActionListener(new java.awt.event.ActionListener() {\r
1585                 public void actionPerformed(ActionEvent e) {\r
1586                     closeMenuItem_actionPerformed(e);\r
1587                 }\r
1588             });\r
1589         editMenu.setLabel("Edit");\r
1590         viewMenu.setLabel("View");\r
1591         colourMenu.setLabel("Colour");\r
1592         calculateMenu.setLabel("Calculate");\r
1593         selectAllSequenceMenuItem.setLabel("Select all");\r
1594         selectAllSequenceMenuItem.addActionListener(new java.awt.event.ActionListener() {\r
1595                 public void actionPerformed(ActionEvent e) {\r
1596                     selectAllSequenceMenuItem_actionPerformed(e);\r
1597                 }\r
1598             });\r
1599         deselectAllSequenceMenuItem.setLabel("Deselect All");\r
1600         deselectAllSequenceMenuItem.addActionListener(new java.awt.event.ActionListener() {\r
1601                 public void actionPerformed(ActionEvent e) {\r
1602                     deselectAllSequenceMenuItem_actionPerformed(e);\r
1603                 }\r
1604             });\r
1605         invertSequenceMenuItem.setLabel("Invert Selection");\r
1606         invertSequenceMenuItem.addActionListener(new java.awt.event.ActionListener() {\r
1607                 public void actionPerformed(ActionEvent e) {\r
1608                     invertSequenceMenuItem_actionPerformed(e);\r
1609                 }\r
1610             });\r
1611         remove2LeftMenuItem.setLabel("Remove Left");\r
1612         remove2LeftMenuItem.addActionListener(new java.awt.event.ActionListener() {\r
1613                 public void actionPerformed(ActionEvent e) {\r
1614                     remove2LeftMenuItem_actionPerformed(e);\r
1615                 }\r
1616             });\r
1617         remove2RightMenuItem.setLabel("Remove Right");\r
1618         remove2RightMenuItem.addActionListener(new java.awt.event.ActionListener() {\r
1619                 public void actionPerformed(ActionEvent e) {\r
1620                     remove2RightMenuItem_actionPerformed(e);\r
1621                 }\r
1622             });\r
1623         removeGappedColumnMenuItem.setLabel("Remove Empty Columns");\r
1624         removeGappedColumnMenuItem.addActionListener(new java.awt.event.ActionListener() {\r
1625                 public void actionPerformed(ActionEvent e) {\r
1626                     removeGappedColumnMenuItem_actionPerformed(e);\r
1627                 }\r
1628             });\r
1629         removeAllGapsMenuItem.setLabel("Remove All Gaps");\r
1630         removeAllGapsMenuItem.addActionListener(new java.awt.event.ActionListener() {\r
1631                 public void actionPerformed(ActionEvent e) {\r
1632                     removeAllGapsMenuItem_actionPerformed(e);\r
1633                 }\r
1634             });\r
1635         viewBoxesMenuItem.setLabel("Boxes");\r
1636         viewBoxesMenuItem.setState(true);\r
1637         viewBoxesMenuItem.addItemListener(new java.awt.event.ItemListener() {\r
1638                 public void itemStateChanged(ItemEvent e) {\r
1639                     viewBoxesMenuItem_actionPerformed(null);\r
1640                 }\r
1641             });\r
1642         viewTextMenuItem.setLabel("Text");\r
1643         viewTextMenuItem.setState(true);\r
1644         viewTextMenuItem.addItemListener(new java.awt.event.ItemListener() {\r
1645                 public void itemStateChanged(ItemEvent e) {\r
1646                     viewTextMenuItem_actionPerformed(null);\r
1647                 }\r
1648             });\r
1649         sortPairwiseMenuItem.setLabel("by Pairwise Identity");\r
1650         sortPairwiseMenuItem.addActionListener(new java.awt.event.ActionListener() {\r
1651                 public void actionPerformed(ActionEvent e) {\r
1652                     sortPairwiseMenuItem_actionPerformed(e);\r
1653                 }\r
1654             });\r
1655         sortIDMenuItem.setLabel("by ID");\r
1656         sortIDMenuItem.addActionListener(new java.awt.event.ActionListener() {\r
1657                 public void actionPerformed(ActionEvent e) {\r
1658                     sortIDMenuItem_actionPerformed(e);\r
1659                 }\r
1660             });\r
1661         sortGroupMenuItem.setLabel("by Group");\r
1662         sortGroupMenuItem.addActionListener(new java.awt.event.ActionListener() {\r
1663                 public void actionPerformed(ActionEvent e) {\r
1664                     sortGroupMenuItem_actionPerformed(e);\r
1665                 }\r
1666             });\r
1667         removeRedundancyMenuItem.setLabel("Remove Redundancy...");\r
1668         removeRedundancyMenuItem.addActionListener(new java.awt.event.ActionListener() {\r
1669                 public void actionPerformed(ActionEvent e) {\r
1670                     removeRedundancyMenuItem_actionPerformed(e);\r
1671                 }\r
1672             });\r
1673         pairwiseAlignmentMenuItem.setLabel("Pairwise Alignments...");\r
1674         pairwiseAlignmentMenuItem.addActionListener(new java.awt.event.ActionListener() {\r
1675                 public void actionPerformed(ActionEvent e) {\r
1676                     pairwiseAlignmentMenuItem_actionPerformed(e);\r
1677                 }\r
1678             });\r
1679         PCAMenuItem.setLabel("Principal Component Analysis");\r
1680         PCAMenuItem.addActionListener(new java.awt.event.ActionListener() {\r
1681                 public void actionPerformed(ActionEvent e) {\r
1682                     PCAMenuItem_actionPerformed(e);\r
1683                 }\r
1684             });\r
1685         averageDistanceTreeMenuItem.setLabel(\r
1686             "Average Distance Using % Identity");\r
1687         averageDistanceTreeMenuItem.addActionListener(new java.awt.event.ActionListener() {\r
1688                 public void actionPerformed(ActionEvent e) {\r
1689                     averageDistanceTreeMenuItem_actionPerformed(e);\r
1690                 }\r
1691             });\r
1692         neighbourTreeMenuItem.setLabel("Neighbour Joining Using % Identity");\r
1693         neighbourTreeMenuItem.addActionListener(new java.awt.event.ActionListener() {\r
1694                 public void actionPerformed(ActionEvent e) {\r
1695                     neighbourTreeMenuItem_actionPerformed(e);\r
1696                 }\r
1697             });\r
1698         alignFrameMenuBar.setFont(new java.awt.Font("Verdana", 0, 11));\r
1699         statusBar.setBackground(Color.white);\r
1700         statusBar.setFont(new java.awt.Font("Verdana", 0, 11));\r
1701         statusBar.setText("Status bar");\r
1702         outputTextboxMenu.setLabel("Output to Textbox");\r
1703         clustalColour.setLabel("Clustalx");\r
1704 \r
1705         clustalColour.addActionListener(new java.awt.event.ActionListener() {\r
1706                 public void actionPerformed(ActionEvent e) {\r
1707                     clustalColour_actionPerformed(e);\r
1708                 }\r
1709             });\r
1710         zappoColour.setLabel("Zappo");\r
1711         zappoColour.addActionListener(new java.awt.event.ActionListener() {\r
1712                 public void actionPerformed(ActionEvent e) {\r
1713                     zappoColour_actionPerformed(e);\r
1714                 }\r
1715             });\r
1716         taylorColour.setLabel("Taylor");\r
1717         taylorColour.addActionListener(new java.awt.event.ActionListener() {\r
1718                 public void actionPerformed(ActionEvent e) {\r
1719                     taylorColour_actionPerformed(e);\r
1720                 }\r
1721             });\r
1722         hydrophobicityColour.setLabel("Hydrophobicity");\r
1723         hydrophobicityColour.addActionListener(new java.awt.event.ActionListener() {\r
1724                 public void actionPerformed(ActionEvent e) {\r
1725                     hydrophobicityColour_actionPerformed(e);\r
1726                 }\r
1727             });\r
1728         helixColour.setLabel("Helix Propensity");\r
1729         helixColour.addActionListener(new java.awt.event.ActionListener() {\r
1730                 public void actionPerformed(ActionEvent e) {\r
1731                     helixColour_actionPerformed(e);\r
1732                 }\r
1733             });\r
1734         strandColour.setLabel("Strand Propensity");\r
1735         strandColour.addActionListener(new java.awt.event.ActionListener() {\r
1736                 public void actionPerformed(ActionEvent e) {\r
1737                     strandColour_actionPerformed(e);\r
1738                 }\r
1739             });\r
1740         turnColour.setLabel("Turn Propensity");\r
1741         turnColour.addActionListener(new java.awt.event.ActionListener() {\r
1742                 public void actionPerformed(ActionEvent e) {\r
1743                     turnColour_actionPerformed(e);\r
1744                 }\r
1745             });\r
1746         buriedColour.setLabel("Buried Index");\r
1747         buriedColour.addActionListener(new java.awt.event.ActionListener() {\r
1748                 public void actionPerformed(ActionEvent e) {\r
1749                     buriedColour_actionPerformed(e);\r
1750                 }\r
1751             });\r
1752         userDefinedColour.setLabel("User Defined...");\r
1753         userDefinedColour.addActionListener(new java.awt.event.ActionListener() {\r
1754                 public void actionPerformed(ActionEvent e) {\r
1755                     userDefinedColour_actionPerformed(e);\r
1756                 }\r
1757             });\r
1758         PIDColour.setLabel("Percentage Identity");\r
1759         PIDColour.addActionListener(new java.awt.event.ActionListener() {\r
1760                 public void actionPerformed(ActionEvent e) {\r
1761                     PIDColour_actionPerformed(e);\r
1762                 }\r
1763             });\r
1764         BLOSUM62Colour.setLabel("BLOSUM62 Score");\r
1765         BLOSUM62Colour.addActionListener(new java.awt.event.ActionListener() {\r
1766                 public void actionPerformed(ActionEvent e) {\r
1767                     BLOSUM62Colour_actionPerformed(e);\r
1768                 }\r
1769             });\r
1770         avDistanceTreeBlosumMenuItem.setLabel(\r
1771             "Average Distance Using BLOSUM62");\r
1772         avDistanceTreeBlosumMenuItem.addActionListener(new java.awt.event.ActionListener() {\r
1773                 public void actionPerformed(ActionEvent e) {\r
1774                     avTreeBlosumMenuItem_actionPerformed(e);\r
1775                 }\r
1776             });\r
1777         njTreeBlosumMenuItem.setLabel("Neighbour Joining Using BLOSUM62");\r
1778         njTreeBlosumMenuItem.addActionListener(new java.awt.event.ActionListener() {\r
1779                 public void actionPerformed(ActionEvent e) {\r
1780                     njTreeBlosumMenuItem_actionPerformed(e);\r
1781                 }\r
1782             });\r
1783         annotationPanelMenuItem.setActionCommand("");\r
1784         annotationPanelMenuItem.setState(true);\r
1785         annotationPanelMenuItem.setLabel("Show Annotations");\r
1786         annotationPanelMenuItem.addItemListener(new java.awt.event.ItemListener() {\r
1787                 public void itemStateChanged(ItemEvent e) {\r
1788                     annotationPanelMenuItem_actionPerformed(null);\r
1789                 }\r
1790             });\r
1791         colourTextMenuItem.setLabel("Colour Text");\r
1792         colourTextMenuItem.addItemListener(new java.awt.event.ItemListener() {\r
1793                 public void itemStateChanged(ItemEvent e) {\r
1794                     colourTextMenuItem_actionPerformed(null);\r
1795                 }\r
1796             });\r
1797         overviewMenuItem.setLabel("Overview Window");\r
1798         overviewMenuItem.addActionListener(new java.awt.event.ActionListener() {\r
1799                 public void actionPerformed(ActionEvent e) {\r
1800                     overviewMenuItem_actionPerformed(e);\r
1801                 }\r
1802             });\r
1803         undoMenuItem.setEnabled(false);\r
1804         undoMenuItem.setLabel("Undo");\r
1805         undoMenuItem.addActionListener(new java.awt.event.ActionListener() {\r
1806                 public void actionPerformed(ActionEvent e) {\r
1807                     undoMenuItem_actionPerformed(e);\r
1808                 }\r
1809             });\r
1810         redoMenuItem.setEnabled(false);\r
1811         redoMenuItem.setLabel("Redo");\r
1812         redoMenuItem.addActionListener(new java.awt.event.ActionListener() {\r
1813                 public void actionPerformed(ActionEvent e) {\r
1814                     redoMenuItem_actionPerformed(e);\r
1815                 }\r
1816             });\r
1817         conservationMenuItem.setLabel("by Conservation");\r
1818         conservationMenuItem.addItemListener(new java.awt.event.ItemListener() {\r
1819                 public void itemStateChanged(ItemEvent e) {\r
1820                     conservationMenuItem_actionPerformed(null);\r
1821                 }\r
1822             });\r
1823         noColourmenuItem.setLabel("None");\r
1824         noColourmenuItem.addActionListener(new java.awt.event.ActionListener() {\r
1825                 public void actionPerformed(ActionEvent e) {\r
1826                     noColourmenuItem_actionPerformed(e);\r
1827                 }\r
1828             });\r
1829         wrapMenuItem.setLabel("Wrap");\r
1830         wrapMenuItem.addItemListener(new java.awt.event.ItemListener() {\r
1831                 public void itemStateChanged(ItemEvent e) {\r
1832                     wrapMenuItem_actionPerformed(null);\r
1833                 }\r
1834             });\r
1835         renderGapsMenuItem.setLabel("Show Gaps");\r
1836         renderGapsMenuItem.setState(true);\r
1837         renderGapsMenuItem.addItemListener(new java.awt.event.ItemListener() {\r
1838                 public void itemStateChanged(ItemEvent e) {\r
1839                     renderGapsMenuItem_actionPerformed(null);\r
1840                 }\r
1841             });\r
1842         findMenuItem.setLabel("Find...");\r
1843         findMenuItem.addActionListener(new java.awt.event.ActionListener() {\r
1844                 public void actionPerformed(ActionEvent e) {\r
1845                     findMenuItem_actionPerformed(e);\r
1846                 }\r
1847             });\r
1848         searchMenu.setLabel("Search");\r
1849 \r
1850         abovePIDThreshold.setLabel("Above Identity Threshold");\r
1851         abovePIDThreshold.addItemListener(new java.awt.event.ItemListener() {\r
1852                 public void itemStateChanged(ItemEvent e) {\r
1853                     abovePIDThreshold_actionPerformed(null);\r
1854                 }\r
1855             });\r
1856         nucleotideColour.setLabel("Nucleotide");\r
1857         nucleotideColour.addActionListener(new java.awt.event.ActionListener() {\r
1858                 public void actionPerformed(ActionEvent e) {\r
1859                     nucleotideColour_actionPerformed(e);\r
1860                 }\r
1861             });\r
1862         deleteGroups.setLabel("Undefine Groups");\r
1863         deleteGroups.addActionListener(new java.awt.event.ActionListener() {\r
1864                 public void actionPerformed(ActionEvent e) {\r
1865                     deleteGroups_actionPerformed(e);\r
1866                 }\r
1867             });\r
1868         copy.setLabel("Copy");\r
1869         copy.addActionListener(new java.awt.event.ActionListener() {\r
1870                 public void actionPerformed(ActionEvent e) {\r
1871                     copy_actionPerformed(e);\r
1872                 }\r
1873             });\r
1874         cut.setLabel("Cut");\r
1875         cut.addActionListener(new java.awt.event.ActionListener() {\r
1876                 public void actionPerformed(ActionEvent e) {\r
1877                     cut_actionPerformed(e);\r
1878                 }\r
1879             });\r
1880         delete.setLabel("Delete");\r
1881         delete.addActionListener(new java.awt.event.ActionListener() {\r
1882                 public void actionPerformed(ActionEvent e) {\r
1883                     delete_actionPerformed(e);\r
1884                 }\r
1885             });\r
1886         Menu1.setLabel("Paste");\r
1887         pasteNew.setLabel("To New Alignment");\r
1888         pasteNew.addActionListener(new java.awt.event.ActionListener() {\r
1889                 public void actionPerformed(ActionEvent e) {\r
1890                     pasteNew_actionPerformed(e);\r
1891                 }\r
1892             });\r
1893         pasteThis.setLabel("Add To This Alignment");\r
1894         pasteThis.addActionListener(new java.awt.event.ActionListener() {\r
1895                 public void actionPerformed(ActionEvent e) {\r
1896                     pasteThis_actionPerformed(e);\r
1897                 }\r
1898             });\r
1899         applyToAllGroups.setLabel("Apply Colour To All Groups");\r
1900         applyToAllGroups.setState(true);\r
1901         applyToAllGroups.addItemListener(new java.awt.event.ItemListener() {\r
1902                 public void itemStateChanged(ItemEvent e) {\r
1903                     applyToAllGroups_actionPerformed(null);\r
1904                 }\r
1905             });\r
1906         font.setLabel("Font...");\r
1907         font.addActionListener(new java.awt.event.ActionListener() {\r
1908                 public void actionPerformed(ActionEvent e) {\r
1909                     font_actionPerformed(e);\r
1910                 }\r
1911             });\r
1912         scaleAbove.setLabel("Scale Above");\r
1913         scaleAbove.setState(true);\r
1914         scaleAbove.addItemListener(new java.awt.event.ItemListener() {\r
1915                 public void itemStateChanged(ItemEvent e) {\r
1916                     scaleAbove_actionPerformed(null);\r
1917                 }\r
1918             });\r
1919         scaleLeft.setEnabled(false);\r
1920         scaleLeft.setState(true);\r
1921         scaleLeft.setLabel("Scale Left");\r
1922         scaleLeft.addItemListener(new java.awt.event.ItemListener() {\r
1923                 public void itemStateChanged(ItemEvent e) {\r
1924                     scaleLeft_actionPerformed(null);\r
1925                 }\r
1926             });\r
1927         scaleRight.setEnabled(false);\r
1928         scaleRight.setState(true);\r
1929         scaleRight.setLabel("Scale Right");\r
1930         scaleRight.addItemListener(new java.awt.event.ItemListener() {\r
1931                 public void itemStateChanged(ItemEvent e) {\r
1932                     scaleRight_actionPerformed(null);\r
1933                 }\r
1934             });\r
1935         modifyPID.setLabel("Modify Identity Threshold...");\r
1936         modifyPID.addActionListener(new java.awt.event.ActionListener() {\r
1937                 public void actionPerformed(ActionEvent e) {\r
1938                     modifyPID_actionPerformed(e);\r
1939                 }\r
1940             });\r
1941         modifyConservation.setLabel("Modify Conservation Threshold...");\r
1942         modifyConservation.addActionListener(new java.awt.event.ActionListener() {\r
1943                 public void actionPerformed(ActionEvent e) {\r
1944                     modifyConservation_actionPerformed(e);\r
1945                 }\r
1946             });\r
1947         sortByTreeMenu.setLabel("By Tree Order");\r
1948         sort.setLabel("Sort");\r
1949         calculate.setLabel("Calculate Tree");\r
1950         inputText.setLabel("Input from textbox");\r
1951         inputText.addActionListener(new java.awt.event.ActionListener() {\r
1952                 public void actionPerformed(ActionEvent e) {\r
1953                     inputText_actionPerformed(e);\r
1954                 }\r
1955             });\r
1956 \r
1957         helpMenu.setLabel("Help");\r
1958         documentation.setLabel("Documentation");\r
1959         documentation.addActionListener(new java.awt.event.ActionListener() {\r
1960                 public void actionPerformed(ActionEvent e) {\r
1961                     documentation_actionPerformed(e);\r
1962                 }\r
1963             });\r
1964 \r
1965         about.setLabel("About...");\r
1966         about.addActionListener(new java.awt.event.ActionListener() {\r
1967                 public void actionPerformed(ActionEvent e) {\r
1968                     about_actionPerformed(e);\r
1969                 }\r
1970             });\r
1971           seqLimits.setState(true);\r
1972     seqLimits.setLabel("Show Sequence Limits");\r
1973     seqLimits.addItemListener(new ItemListener()\r
1974     {\r
1975       public void itemStateChanged(ItemEvent e)\r
1976       {\r
1977         seqLimits_itemStateChanged(e);\r
1978       }\r
1979     });\r
1980 \r
1981     alignFrameMenuBar.add(fileMenu);\r
1982         alignFrameMenuBar.add(editMenu);\r
1983         alignFrameMenuBar.add(searchMenu);\r
1984         alignFrameMenuBar.add(viewMenu);\r
1985         alignFrameMenuBar.add(colourMenu);\r
1986         alignFrameMenuBar.add(calculateMenu);\r
1987         alignFrameMenuBar.add(helpMenu);\r
1988         fileMenu.add(inputText);\r
1989         fileMenu.add(outputTextboxMenu);\r
1990         fileMenu.addSeparator();\r
1991         fileMenu.add(closeMenuItem);\r
1992         editMenu.add(undoMenuItem);\r
1993         editMenu.add(redoMenuItem);\r
1994         editMenu.add(cut);\r
1995         editMenu.add(copy);\r
1996         editMenu.add(Menu1);\r
1997         editMenu.add(delete);\r
1998         editMenu.addSeparator();\r
1999         editMenu.add(selectAllSequenceMenuItem);\r
2000         editMenu.add(deselectAllSequenceMenuItem);\r
2001         editMenu.add(invertSequenceMenuItem);\r
2002         editMenu.add(deleteGroups);\r
2003         editMenu.addSeparator();\r
2004         editMenu.add(remove2LeftMenuItem);\r
2005         editMenu.add(remove2RightMenuItem);\r
2006         editMenu.add(removeGappedColumnMenuItem);\r
2007         editMenu.add(removeAllGapsMenuItem);\r
2008         editMenu.add(removeRedundancyMenuItem);\r
2009         searchMenu.add(findMenuItem);\r
2010         viewMenu.add(font);\r
2011         viewMenu.addSeparator();\r
2012         viewMenu.add(seqLimits);\r
2013         viewMenu.addSeparator();\r
2014     viewMenu.add(wrapMenuItem);\r
2015         viewMenu.add(scaleAbove);\r
2016         viewMenu.add(scaleLeft);\r
2017         viewMenu.add(scaleRight);\r
2018         viewMenu.addSeparator();\r
2019     viewMenu.add(viewBoxesMenuItem);\r
2020         viewMenu.add(viewTextMenuItem);\r
2021         viewMenu.add(colourTextMenuItem);\r
2022         viewMenu.add(renderGapsMenuItem);\r
2023         viewMenu.add(annotationPanelMenuItem);\r
2024         viewMenu.addSeparator();\r
2025         viewMenu.add(overviewMenuItem);\r
2026         colourMenu.add(applyToAllGroups);\r
2027         colourMenu.addSeparator();\r
2028         colourMenu.add(noColourmenuItem);\r
2029         colourMenu.add(clustalColour);\r
2030         colourMenu.add(BLOSUM62Colour);\r
2031         colourMenu.add(PIDColour);\r
2032         colourMenu.add(zappoColour);\r
2033         colourMenu.add(taylorColour);\r
2034         colourMenu.add(hydrophobicityColour);\r
2035         colourMenu.add(helixColour);\r
2036         colourMenu.add(strandColour);\r
2037         colourMenu.add(turnColour);\r
2038         colourMenu.add(buriedColour);\r
2039         colourMenu.add(nucleotideColour);\r
2040         colourMenu.add(userDefinedColour);\r
2041         colourMenu.addSeparator();\r
2042         colourMenu.add(conservationMenuItem);\r
2043         colourMenu.add(modifyConservation);\r
2044         colourMenu.add(abovePIDThreshold);\r
2045         colourMenu.add(modifyPID);\r
2046         calculateMenu.add(sort);\r
2047         calculateMenu.add(calculate);\r
2048         calculateMenu.addSeparator();\r
2049         calculateMenu.add(pairwiseAlignmentMenuItem);\r
2050         calculateMenu.add(PCAMenuItem);\r
2051         this.add(statusBar, BorderLayout.SOUTH);\r
2052         Menu1.add(pasteNew);\r
2053         Menu1.add(pasteThis);\r
2054         sort.add(sortIDMenuItem);\r
2055         sort.add(sortByTreeMenu);\r
2056         sort.add(sortGroupMenuItem);\r
2057         sort.add(sortPairwiseMenuItem);\r
2058         calculate.add(averageDistanceTreeMenuItem);\r
2059         calculate.add(neighbourTreeMenuItem);\r
2060         calculate.add(avDistanceTreeBlosumMenuItem);\r
2061         calculate.add(njTreeBlosumMenuItem);\r
2062         helpMenu.add(documentation);\r
2063         helpMenu.add(about);\r
2064     }\r
2065 }\r
2066 \r