after merge
[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.seqPanel.seqCanvas.highlightSearchResults(null);\r
652     alignPanel.repaint();\r
653     PaintRefresher.Refresh(null, viewport.alignment);\r
654   }\r
655 \r
656   public void invertSequenceMenuItem_actionPerformed(ActionEvent e)\r
657   {\r
658     SequenceGroup sg = viewport.getSelectionGroup();\r
659     for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)\r
660     {\r
661       sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);\r
662     }\r
663 \r
664     PaintRefresher.Refresh(null, viewport.alignment);\r
665   }\r
666 \r
667   public void remove2LeftMenuItem_actionPerformed(ActionEvent e)\r
668   {\r
669     ColumnSelection colSel = viewport.getColumnSelection();\r
670     if (colSel.size() > 0)\r
671     {\r
672       addHistoryItem(new HistoryItem("Remove Left", viewport.alignment,\r
673                                      HistoryItem.HIDE));\r
674       int min = colSel.getMin();\r
675       viewport.getAlignment().trimLeft(min);\r
676       colSel.compensateForEdit(0, min);\r
677 \r
678       if (viewport.getSelectionGroup() != null)\r
679       {\r
680         viewport.getSelectionGroup().adjustForRemoveLeft(min);\r
681       }\r
682 \r
683       Vector groups = viewport.alignment.getGroups();\r
684       for (int i = 0; i < groups.size(); i++)\r
685       {\r
686         SequenceGroup sg = (SequenceGroup) groups.elementAt(i);\r
687         if (!sg.adjustForRemoveLeft(min))\r
688         {\r
689           viewport.alignment.deleteGroup(sg);\r
690         }\r
691       }\r
692       viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());\r
693     }\r
694   }\r
695 \r
696   public void remove2RightMenuItem_actionPerformed(ActionEvent e)\r
697   {\r
698     ColumnSelection colSel = viewport.getColumnSelection();\r
699     if (colSel.size() > 0)\r
700     {\r
701       addHistoryItem(new HistoryItem("Remove Right", viewport.alignment,\r
702                                      HistoryItem.HIDE));\r
703       int max = colSel.getMax();\r
704       viewport.getAlignment().trimRight(max);\r
705       if (viewport.getSelectionGroup() != null)\r
706       {\r
707         viewport.getSelectionGroup().adjustForRemoveRight(max);\r
708       }\r
709 \r
710       Vector groups = viewport.alignment.getGroups();\r
711       for (int i = 0; i < groups.size(); i++)\r
712       {\r
713         SequenceGroup sg = (SequenceGroup) groups.elementAt(i);\r
714         if (!sg.adjustForRemoveRight(max))\r
715         {\r
716           viewport.alignment.deleteGroup(sg);\r
717         }\r
718       }\r
719       viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());\r
720     }\r
721 \r
722   }\r
723 \r
724   public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)\r
725   {\r
726     addHistoryItem(new HistoryItem("Remove Gapped Columns",\r
727                                    viewport.alignment,\r
728                                    HistoryItem.HIDE));\r
729 \r
730     //This is to maintain viewport position on first residue\r
731     //of first sequence\r
732     SequenceI seq = viewport.alignment.getSequenceAt(0);\r
733     int startRes = seq.findPosition(viewport.startRes);\r
734 \r
735     viewport.getAlignment().removeGaps();\r
736 \r
737     viewport.setStartRes(seq.findIndex(startRes)-1);\r
738 \r
739     viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());\r
740   }\r
741 \r
742   public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)\r
743   {\r
744     addHistoryItem(new HistoryItem("Remove Gaps", viewport.alignment,\r
745                                    HistoryItem.HIDE));\r
746 \r
747     //This is to maintain viewport position on first residue\r
748     //of first sequence\r
749     SequenceI seq = viewport.alignment.getSequenceAt(0);\r
750     int startRes = seq.findPosition(viewport.startRes);\r
751 \r
752     SequenceI current;\r
753     int jSize;\r
754 \r
755     Vector seqs=null;\r
756 \r
757     int start=0, end = viewport.alignment.getWidth();\r
758 \r
759     if (viewport.getSelectionGroup() != null\r
760         && viewport.getSelectionGroup().sequences != null\r
761         && viewport.getSelectionGroup().sequences.size()>0)\r
762     {\r
763       seqs = viewport.getSelectionGroup().sequences;\r
764       start = viewport.getSelectionGroup().getStartRes();\r
765       end = viewport.getSelectionGroup().getEndRes()+1;\r
766     }\r
767     else\r
768       seqs = viewport.alignment.getSequences();\r
769 \r
770     for (int i = 0; i < seqs.size(); i++)\r
771     {\r
772       current = (SequenceI) seqs.elementAt(i);\r
773       jSize = current.getLength();\r
774 \r
775       // Removing a range is much quicker than removing gaps\r
776       // one by one for long sequences\r
777       int j = start;\r
778       int rangeStart=-1, rangeEnd=-1;\r
779 \r
780       do\r
781       {\r
782         if (jalview.util.Comparison.isGap(current.getCharAt(j)))\r
783         {\r
784           if(rangeStart==-1)\r
785            {\r
786              rangeStart = j;\r
787              rangeEnd = j+1;\r
788            }\r
789            else\r
790            {\r
791              rangeEnd++;\r
792            }\r
793            j++;\r
794         }\r
795         else\r
796         {\r
797           if(rangeStart>-1)\r
798           {\r
799             current.deleteChars(rangeStart, rangeEnd);\r
800             j-=rangeEnd-rangeStart;\r
801             jSize-=rangeEnd-rangeStart;\r
802             rangeStart = -1;\r
803             rangeEnd = -1;\r
804           }\r
805           else\r
806             j++;\r
807         }\r
808       }\r
809       while (j < end && j < jSize);\r
810       if(rangeStart>-1)\r
811       {\r
812        current.deleteChars(rangeStart, rangeEnd);\r
813       }\r
814     }\r
815     viewport.setStartRes(seq.findIndex(startRes)-1);\r
816     viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());\r
817   }\r
818 \r
819   public void alignmentChanged()\r
820   {\r
821     viewport.updateConsensus();\r
822     viewport.updateConservation ();\r
823     resetAllColourSchemes();\r
824     if(alignPanel.overviewPanel!=null)\r
825       alignPanel.overviewPanel.updateOverviewImage();\r
826     alignPanel.repaint();\r
827   }\r
828 \r
829   void resetAllColourSchemes()\r
830   {\r
831     ColourSchemeI cs = viewport.globalColourScheme;\r
832     if(cs!=null)\r
833     {\r
834       if (cs instanceof ClustalxColourScheme)\r
835       {\r
836         ( (ClustalxColourScheme) viewport.getGlobalColourScheme()).\r
837             resetClustalX(viewport.alignment.getSequences(),\r
838                           viewport.alignment.getWidth());\r
839       }\r
840 \r
841       cs.setConsensus(viewport.vconsensus);\r
842       if (cs.conservationApplied())\r
843       {\r
844         Alignment al = (Alignment) viewport.alignment;\r
845         Conservation c = new Conservation("All",\r
846                                           ResidueProperties.propHash, 3,\r
847                                           al.getSequences(), 0,\r
848                                           al.getWidth() - 1);\r
849         c.calculate();\r
850         c.verdict(false, viewport.ConsPercGaps);\r
851 \r
852         cs.setConservation(c);\r
853       }\r
854     }\r
855 \r
856     int s, sSize = viewport.alignment.getGroups().size();\r
857     for(s=0; s<sSize; s++)\r
858     {\r
859       SequenceGroup sg = (SequenceGroup)viewport.alignment.getGroups().elementAt(s);\r
860       if(sg.cs!=null && sg.cs instanceof ClustalxColourScheme)\r
861       {\r
862         ((ClustalxColourScheme)sg.cs).resetClustalX(sg.sequences, sg.getWidth());\r
863       }\r
864       sg.recalcConservation();\r
865     }\r
866   }\r
867 \r
868 \r
869 \r
870   public void findMenuItem_actionPerformed(ActionEvent e)\r
871   {\r
872     new Finder(alignPanel);\r
873   }\r
874 \r
875   public void font_actionPerformed(ActionEvent e)\r
876   {\r
877     new FontChooser(alignPanel);\r
878   }\r
879 \r
880 \r
881   public void seqLimits_itemStateChanged(ItemEvent e)\r
882   {\r
883     viewport.setShowJVSuffix(seqLimits.getState());\r
884     alignPanel.fontChanged();\r
885     alignPanel.repaint();\r
886   }\r
887 \r
888 \r
889   protected void colourTextMenuItem_actionPerformed(ActionEvent e)\r
890   {\r
891     viewport.setColourText(colourTextMenuItem.getState());\r
892     alignPanel.repaint();\r
893   }\r
894 \r
895   protected void wrapMenuItem_actionPerformed(ActionEvent e)\r
896   {\r
897     viewport.setWrapAlignment(wrapMenuItem.getState());\r
898     alignPanel.setWrapAlignment(wrapMenuItem.getState());\r
899     scaleAbove.setEnabled(wrapMenuItem.getState());\r
900     scaleLeft.setEnabled(wrapMenuItem.getState());\r
901     scaleRight.setEnabled(wrapMenuItem.getState());\r
902     alignPanel.repaint();\r
903   }\r
904 \r
905   protected void scaleAbove_actionPerformed(ActionEvent e)\r
906   {\r
907     viewport.setScaleAboveWrapped(scaleAbove.getState());\r
908     alignPanel.repaint();\r
909   }\r
910 \r
911   protected void scaleLeft_actionPerformed(ActionEvent e)\r
912   {\r
913     viewport.setScaleLeftWrapped(scaleLeft.getState());\r
914     alignPanel.repaint();\r
915   }\r
916 \r
917   protected void scaleRight_actionPerformed(ActionEvent e)\r
918   {\r
919     viewport.setScaleRightWrapped(scaleRight.getState());\r
920     alignPanel.repaint();\r
921   }\r
922 \r
923   public void viewBoxesMenuItem_actionPerformed(ActionEvent e)\r
924   {\r
925     viewport.setShowBoxes(viewBoxesMenuItem.getState());\r
926     alignPanel.repaint();\r
927   }\r
928 \r
929   public void viewTextMenuItem_actionPerformed(ActionEvent e)\r
930   {\r
931     viewport.setShowText(viewTextMenuItem.getState());\r
932     alignPanel.repaint();\r
933   }\r
934 \r
935   protected void renderGapsMenuItem_actionPerformed(ActionEvent e)\r
936   {\r
937     viewport.setRenderGaps(renderGapsMenuItem.getState());\r
938     alignPanel.repaint();\r
939   }\r
940 \r
941   public void annotationPanelMenuItem_actionPerformed(ActionEvent e)\r
942   {\r
943     viewport.setShowAnnotation(annotationPanelMenuItem.getState());\r
944     alignPanel.setAnnotationVisible(annotationPanelMenuItem.getState());\r
945   }\r
946 \r
947   public void overviewMenuItem_actionPerformed(ActionEvent e)\r
948   {\r
949     if (alignPanel.overviewPanel != null)\r
950     {\r
951       return;\r
952     }\r
953 \r
954     Frame frame = new Frame();\r
955     OverviewPanel overview = new OverviewPanel(alignPanel);\r
956     frame.add(overview);\r
957     // +50 must allow for applet frame window\r
958     jalview.bin.JalviewLite.addFrame(frame, "Overview " + this.getTitle(),\r
959                                      overview.preferredSize().width,\r
960                                      overview.preferredSize().height + 50);\r
961 \r
962     frame.pack();\r
963     frame.addWindowListener(new WindowAdapter()\r
964     {\r
965       public void windowClosing(WindowEvent e)\r
966       {\r
967         alignPanel.setOverviewPanel(null);\r
968       };\r
969     });\r
970 \r
971     alignPanel.setOverviewPanel(overview);\r
972 \r
973   }\r
974 \r
975   protected void noColourmenuItem_actionPerformed(ActionEvent e)\r
976   {\r
977     changeColour(null);\r
978   }\r
979 \r
980   public void clustalColour_actionPerformed(ActionEvent e)\r
981   {\r
982     abovePIDThreshold.setState(false);\r
983     changeColour(new ClustalxColourScheme(viewport.alignment.getSequences(),\r
984                                           viewport.alignment.getWidth()));\r
985   }\r
986 \r
987   public void zappoColour_actionPerformed(ActionEvent e)\r
988   {\r
989     changeColour(new ZappoColourScheme());\r
990   }\r
991 \r
992   public void taylorColour_actionPerformed(ActionEvent e)\r
993   {\r
994     changeColour(new TaylorColourScheme());\r
995   }\r
996 \r
997   public void hydrophobicityColour_actionPerformed(ActionEvent e)\r
998   {\r
999     changeColour(new HydrophobicColourScheme());\r
1000   }\r
1001 \r
1002   public void helixColour_actionPerformed(ActionEvent e)\r
1003   {\r
1004     changeColour(new HelixColourScheme());\r
1005   }\r
1006 \r
1007   public void strandColour_actionPerformed(ActionEvent e)\r
1008   {\r
1009     changeColour(new StrandColourScheme());\r
1010   }\r
1011 \r
1012   public void turnColour_actionPerformed(ActionEvent e)\r
1013   {\r
1014     changeColour(new TurnColourScheme());\r
1015   }\r
1016 \r
1017   public void buriedColour_actionPerformed(ActionEvent e)\r
1018   {\r
1019     changeColour(new BuriedColourScheme());\r
1020   }\r
1021 \r
1022   public void nucleotideColour_actionPerformed(ActionEvent e)\r
1023   {\r
1024     changeColour(new NucleotideColourScheme());\r
1025   }\r
1026 \r
1027   protected void applyToAllGroups_actionPerformed(ActionEvent e)\r
1028   {\r
1029     viewport.setColourAppliesToAllGroups(applyToAllGroups.getState());\r
1030   }\r
1031 \r
1032   void changeColour(ColourSchemeI cs)\r
1033   {\r
1034     int threshold = 0;\r
1035 \r
1036     if(cs!=null)\r
1037     {\r
1038       if (viewport.getAbovePIDThreshold())\r
1039       {\r
1040         threshold = SliderPanel.setPIDSliderSource(alignPanel, cs, "Background");\r
1041 \r
1042         cs.setThreshold(threshold, viewport.getIgnoreGapsConsensus());\r
1043 \r
1044         viewport.setGlobalColourScheme(cs);\r
1045       }\r
1046       else\r
1047       {\r
1048         cs.setThreshold(0, viewport.getIgnoreGapsConsensus());\r
1049       }\r
1050 \r
1051       if (viewport.getConservationSelected())\r
1052       {\r
1053 \r
1054         Alignment al = (Alignment) viewport.alignment;\r
1055         Conservation c = new Conservation("All",\r
1056                                           ResidueProperties.propHash, 3,\r
1057                                           al.getSequences(), 0,\r
1058                                           al.getWidth() - 1);\r
1059 \r
1060         c.calculate();\r
1061         c.verdict(false, viewport.ConsPercGaps);\r
1062 \r
1063         cs.setConservation(c);\r
1064 \r
1065         cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel, cs,\r
1066             "Background"));\r
1067 \r
1068       }\r
1069       else\r
1070       {\r
1071         cs.setConservation(null);\r
1072       }\r
1073 \r
1074       cs.setConsensus(viewport.vconsensus);\r
1075 \r
1076     }\r
1077     viewport.setGlobalColourScheme(cs);\r
1078 \r
1079     if (viewport.getColourAppliesToAllGroups())\r
1080     {\r
1081       Vector groups = viewport.alignment.getGroups();\r
1082       for (int i = 0; i < groups.size(); i++)\r
1083       {\r
1084         SequenceGroup sg = (SequenceGroup) groups.elementAt(i);\r
1085 \r
1086         if(cs==null)\r
1087         {\r
1088           sg.cs = null;\r
1089           continue;\r
1090         }\r
1091         if (cs instanceof ClustalxColourScheme)\r
1092         {\r
1093           sg.cs = new ClustalxColourScheme(sg.sequences, sg.getWidth());\r
1094         }\r
1095         else\r
1096         {\r
1097           try\r
1098           {\r
1099             sg.cs = (ColourSchemeI) cs.getClass().newInstance();\r
1100           }\r
1101           catch (Exception ex)\r
1102           {\r
1103             ex.printStackTrace();\r
1104             sg.cs = cs;\r
1105           }\r
1106         }\r
1107 \r
1108         if (viewport.getAbovePIDThreshold()\r
1109             || cs instanceof PIDColourScheme\r
1110             || cs instanceof Blosum62ColourScheme)\r
1111         {\r
1112           sg.cs.setThreshold(threshold, viewport.getIgnoreGapsConsensus());\r
1113           sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0, sg.getWidth()));\r
1114         }\r
1115         else\r
1116           sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());\r
1117 \r
1118         if (viewport.getConservationSelected())\r
1119         {\r
1120           Conservation c = new Conservation("Group",\r
1121                                             ResidueProperties.propHash, 3,\r
1122                                             sg.sequences, 0,\r
1123                                             viewport.alignment.getWidth() - 1);\r
1124           c.calculate();\r
1125           c.verdict(false, viewport.ConsPercGaps);\r
1126           sg.cs.setConservation(c);\r
1127         }\r
1128         else\r
1129         {\r
1130           sg.cs.setConservation(null);\r
1131           sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());\r
1132         }\r
1133 \r
1134       }\r
1135     }\r
1136 \r
1137 \r
1138     if (alignPanel.getOverviewPanel() != null)\r
1139     {\r
1140       alignPanel.getOverviewPanel().updateOverviewImage();\r
1141     }\r
1142 \r
1143     alignPanel.repaint();\r
1144   }\r
1145 \r
1146 \r
1147 \r
1148   protected void modifyPID_actionPerformed(ActionEvent e)\r
1149   {\r
1150     if (viewport.getAbovePIDThreshold() && viewport.globalColourScheme!=null)\r
1151     {\r
1152       SliderPanel.setPIDSliderSource(alignPanel, viewport.getGlobalColourScheme(),\r
1153                                      "Background");\r
1154       SliderPanel.showPIDSlider();\r
1155     }\r
1156   }\r
1157 \r
1158   protected void modifyConservation_actionPerformed(ActionEvent e)\r
1159   {\r
1160     if (viewport.getConservationSelected() && viewport.globalColourScheme!=null)\r
1161     {\r
1162       SliderPanel.setConservationSlider(alignPanel, viewport.globalColourScheme,\r
1163                                         "Background");\r
1164       SliderPanel.showConservationSlider();\r
1165     }\r
1166   }\r
1167 \r
1168   protected void conservationMenuItem_actionPerformed(ActionEvent e)\r
1169   {\r
1170     viewport.setConservationSelected(conservationMenuItem.getState());\r
1171 \r
1172     viewport.setAbovePIDThreshold(false);\r
1173     abovePIDThreshold.setState(false);\r
1174 \r
1175     changeColour(viewport.getGlobalColourScheme());\r
1176 \r
1177     modifyConservation_actionPerformed(null);\r
1178   }\r
1179 \r
1180   public void abovePIDThreshold_actionPerformed(ActionEvent e)\r
1181   {\r
1182     viewport.setAbovePIDThreshold(abovePIDThreshold.getState());\r
1183 \r
1184     conservationMenuItem.setState(false);\r
1185     viewport.setConservationSelected(false);\r
1186 \r
1187     changeColour(viewport.getGlobalColourScheme());\r
1188 \r
1189     modifyPID_actionPerformed(null);\r
1190   }\r
1191 \r
1192   public void userDefinedColour_actionPerformed(ActionEvent e)\r
1193   {\r
1194     new UserDefinedColours(alignPanel, null);\r
1195   }\r
1196 \r
1197   public void PIDColour_actionPerformed(ActionEvent e)\r
1198   {\r
1199     changeColour(new PIDColourScheme());\r
1200   }\r
1201 \r
1202   public void BLOSUM62Colour_actionPerformed(ActionEvent e)\r
1203   {\r
1204     changeColour(new Blosum62ColourScheme());\r
1205   }\r
1206 \r
1207   public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)\r
1208   {\r
1209     addHistoryItem(new HistoryItem("Pairwise Sort", viewport.alignment,\r
1210                                    HistoryItem.SORT));\r
1211     AlignmentSorter.sortByPID(viewport.getAlignment(),\r
1212                               viewport.getAlignment().getSequenceAt(0));\r
1213     alignPanel.repaint();\r
1214   }\r
1215 \r
1216   public void sortIDMenuItem_actionPerformed(ActionEvent e)\r
1217   {\r
1218     addHistoryItem(new HistoryItem("ID Sort", viewport.alignment,\r
1219                                    HistoryItem.SORT));\r
1220     AlignmentSorter.sortByID(viewport.getAlignment());\r
1221     alignPanel.repaint();\r
1222   }\r
1223 \r
1224   public void sortGroupMenuItem_actionPerformed(ActionEvent e)\r
1225   {\r
1226     addHistoryItem(new HistoryItem("Group Sort", viewport.alignment,\r
1227                                    HistoryItem.SORT));\r
1228     AlignmentSorter.sortByGroup(viewport.getAlignment());\r
1229     alignPanel.repaint();\r
1230 \r
1231   }\r
1232 \r
1233   public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)\r
1234   {\r
1235     RedundancyPanel sp = new RedundancyPanel(alignPanel);\r
1236     Frame frame = new Frame();\r
1237     frame.add(sp);\r
1238     jalview.bin.JalviewLite.addFrame(frame, "Redundancy threshold selection",\r
1239                                      400, 120);\r
1240 \r
1241   }\r
1242 \r
1243   public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)\r
1244   {\r
1245     if (viewport.getSelectionGroup().getSize() > 1)\r
1246     {\r
1247       Frame frame = new Frame();\r
1248       frame.add(new PairwiseAlignPanel(alignPanel));\r
1249       jalview.bin.JalviewLite.addFrame(frame, "Pairwise Alignment", 600, 500);\r
1250     }\r
1251   }\r
1252 \r
1253   public void PCAMenuItem_actionPerformed(ActionEvent e)\r
1254   {\r
1255     //are the sequences aligned?\r
1256     if (!viewport.alignment.isAligned())\r
1257     {\r
1258       SequenceI current;\r
1259       int Width = viewport.getAlignment().getWidth();\r
1260 \r
1261       for (int i = 0; i < viewport.getAlignment().getSequences().size();\r
1262            i++)\r
1263       {\r
1264         current = viewport.getAlignment().getSequenceAt(i);\r
1265 \r
1266         if (current.getLength() < Width)\r
1267         {\r
1268           current.insertCharAt(Width - 1, viewport.getGapCharacter());\r
1269         }\r
1270       }\r
1271       alignPanel.repaint();\r
1272     }\r
1273 \r
1274     if ( (viewport.getSelectionGroup() != null &&\r
1275           viewport.getSelectionGroup().getSize() < 4 &&\r
1276           viewport.getSelectionGroup().getSize() > 0)\r
1277         || viewport.getAlignment().getHeight() < 4)\r
1278     {\r
1279       return;\r
1280     }\r
1281 \r
1282     try\r
1283     {\r
1284       new PCAPanel(viewport);\r
1285     }\r
1286     catch (java.lang.OutOfMemoryError ex)\r
1287     {\r
1288     }\r
1289 \r
1290   }\r
1291 \r
1292   public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)\r
1293   {\r
1294     NewTreePanel("AV", "PID", "Average distance tree using PID");\r
1295   }\r
1296 \r
1297   public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)\r
1298   {\r
1299     NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");\r
1300   }\r
1301 \r
1302   protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)\r
1303   {\r
1304     NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");\r
1305   }\r
1306 \r
1307   protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)\r
1308   {\r
1309     NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62PID");\r
1310   }\r
1311 \r
1312   void NewTreePanel(String type, String pwType, String title)\r
1313   {\r
1314     //are the sequences aligned?\r
1315     if (!viewport.alignment.isAligned())\r
1316     {\r
1317       SequenceI current;\r
1318       int Width = viewport.getAlignment().getWidth();\r
1319 \r
1320       for (int i = 0; i < viewport.getAlignment().getSequences().size();\r
1321            i++)\r
1322       {\r
1323         current = viewport.getAlignment().getSequenceAt(i);\r
1324 \r
1325         if (current.getLength() < Width)\r
1326         {\r
1327           current.insertCharAt(Width - 1, viewport.getGapCharacter());\r
1328         }\r
1329       }\r
1330       alignPanel.repaint();\r
1331 \r
1332     }\r
1333 \r
1334     final TreePanel tp;\r
1335     if (viewport.getSelectionGroup() != null &&\r
1336         viewport.getSelectionGroup().getSize() > 3)\r
1337     {\r
1338       tp = new TreePanel(viewport, viewport.getSelectionGroup().sequences, type,\r
1339                          pwType,\r
1340                          0, viewport.alignment.getWidth());\r
1341     }\r
1342     else\r
1343     {\r
1344       tp = new TreePanel(viewport, viewport.getAlignment().getSequences(),\r
1345                          type, pwType, 0, viewport.alignment.getWidth());\r
1346     }\r
1347 \r
1348     addTreeMenuItem(tp, title);\r
1349 \r
1350     jalview.bin.JalviewLite.addFrame(tp, title, 600, 500);\r
1351   }\r
1352 \r
1353   void addTreeMenuItem(final TreePanel treePanel, String title)\r
1354   {\r
1355     final MenuItem item = new MenuItem(title);\r
1356     sortByTreeMenu.add(item);\r
1357     item.addActionListener(new java.awt.event.ActionListener()\r
1358     {\r
1359       public void actionPerformed(ActionEvent e)\r
1360       {\r
1361         addHistoryItem(new HistoryItem("Sort", viewport.alignment,\r
1362                                        HistoryItem.SORT));\r
1363         AlignmentSorter.sortByTree(viewport.getAlignment(), treePanel.getTree());\r
1364         alignPanel.repaint();\r
1365       }\r
1366     });\r
1367 \r
1368     treePanel.addWindowListener(new WindowAdapter()\r
1369     {\r
1370       public void windowClosing(WindowEvent e)\r
1371       {\r
1372         sortByTreeMenu.remove(item);\r
1373       };\r
1374     });\r
1375   }\r
1376 \r
1377   protected void documentation_actionPerformed(ActionEvent e)\r
1378   {\r
1379     showURL("http://www.jalview.org/help.html");\r
1380   }\r
1381 \r
1382   protected void about_actionPerformed(ActionEvent e)\r
1383   {\r
1384 \r
1385     class AboutPanel extends Canvas\r
1386     {\r
1387       String version;\r
1388       public AboutPanel(String version)\r
1389       { this.version = version; }\r
1390 \r
1391       public void paint(Graphics g)\r
1392       {\r
1393         g.setColor(Color.white);\r
1394         g.fillRect(0, 0, getSize().width, getSize().height);\r
1395         g.setFont(new Font("Helvetica", Font.PLAIN, 12));\r
1396         FontMetrics fm = g.getFontMetrics();\r
1397         int fh = fm.getHeight();\r
1398         int y = 5, x = 7;\r
1399         g.setColor(Color.black);\r
1400         g.setFont(new Font("Helvetica", Font.BOLD, 14));\r
1401         g.drawString("Jalview - Release "+version, 200, y += fh);\r
1402         g.setFont(new Font("Helvetica", Font.PLAIN, 12));\r
1403         g.drawString("Authors:  Michele Clamp, James Cuff, Steve Searle, Andrew Waterhouse, Jim Procter & Geoff Barton.",\r
1404                      x, y += fh * 2);\r
1405         g.drawString("Current development managed by Andrew Waterhouse; Barton Group, University of Dundee.",\r
1406                      x, y += fh);\r
1407         g.drawString(\r
1408             "For any issues relating to Jalview, email help@jalview.org", x,\r
1409             y += fh);\r
1410         g.drawString("If  you use JalView, please cite:", x, y += fh + 8);\r
1411         g.drawString("\"Clamp, M., Cuff, J., Searle, S. M. and Barton, G. J. (2004), The Jalview Java Alignment Editor\"",\r
1412                      x, y += fh);\r
1413         g.drawString("Bioinformatics,  2004 12;426-7.", x, y += fh);\r
1414       }\r
1415     }\r
1416 \r
1417     String version = "test";\r
1418     java.net.URL url = getClass().getResource("/.build_properties");\r
1419     if (url != null)\r
1420     {\r
1421       try\r
1422       {\r
1423         BufferedReader reader = new BufferedReader(new InputStreamReader(\r
1424             url.openStream()));\r
1425         String line;\r
1426         while ( (line = reader.readLine()) != null)\r
1427         {\r
1428           if (line.indexOf("VERSION") > -1)\r
1429           {\r
1430             version = line.substring(line.indexOf("=") + 1);\r
1431           }\r
1432         }\r
1433       }\r
1434       catch (Exception ex)\r
1435       {\r
1436         ex.printStackTrace();\r
1437       }\r
1438     }\r
1439 \r
1440 \r
1441     Frame frame = new Frame();\r
1442     frame.add(new AboutPanel(version));\r
1443     jalview.bin.JalviewLite.addFrame(frame, "Jalview", 580, 200);\r
1444 \r
1445   }\r
1446 \r
1447   /**\r
1448    * Displays the given URL in a new browser window\r
1449    *\r
1450    * @param url URL to display in browser window.\r
1451    * <br>New window will be named "HELP_WINDOW"\r
1452    */\r
1453   public void showURL(String url)\r
1454   {\r
1455     showURL(url, "HELP");\r
1456   }\r
1457 \r
1458   public void showURL(String url, String target)\r
1459   {\r
1460     if (applet == null)\r
1461     {\r
1462       System.out.println("Not running as applet - no browser available.");\r
1463     }\r
1464     else\r
1465     {\r
1466       try\r
1467       {\r
1468         applet.getAppletContext().showDocument(new java.net.URL(url),\r
1469                                                target);\r
1470       }\r
1471       catch (Exception ex)\r
1472       {\r
1473         ex.printStackTrace();\r
1474       }\r
1475     }\r
1476   }\r
1477 \r
1478 \r
1479   //////////////////////////////////////////////////////////////////////////////////\r
1480   //JBuilder Graphics here\r
1481 \r
1482     protected MenuBar alignFrameMenuBar = new MenuBar();\r
1483     protected Menu fileMenu = new Menu();\r
1484     protected MenuItem closeMenuItem = new MenuItem();\r
1485     protected Menu editMenu = new Menu();\r
1486     protected Menu viewMenu = new Menu();\r
1487     protected Menu colourMenu = new Menu();\r
1488     protected Menu calculateMenu = new Menu();\r
1489     protected MenuItem selectAllSequenceMenuItem = new MenuItem();\r
1490     protected MenuItem deselectAllSequenceMenuItem = new MenuItem();\r
1491     protected MenuItem invertSequenceMenuItem = new MenuItem();\r
1492     protected MenuItem remove2LeftMenuItem = new MenuItem();\r
1493     protected MenuItem remove2RightMenuItem = new MenuItem();\r
1494     protected MenuItem removeGappedColumnMenuItem = new MenuItem();\r
1495     protected MenuItem removeAllGapsMenuItem = new MenuItem();\r
1496     protected CheckboxMenuItem viewBoxesMenuItem = new CheckboxMenuItem();\r
1497     protected CheckboxMenuItem viewTextMenuItem = new CheckboxMenuItem();\r
1498     protected MenuItem sortPairwiseMenuItem = new MenuItem();\r
1499     protected MenuItem sortIDMenuItem = new MenuItem();\r
1500     protected MenuItem sortGroupMenuItem = new MenuItem();\r
1501     protected MenuItem removeRedundancyMenuItem = new MenuItem();\r
1502     protected MenuItem pairwiseAlignmentMenuItem = new MenuItem();\r
1503     protected MenuItem PCAMenuItem = new MenuItem();\r
1504     protected MenuItem averageDistanceTreeMenuItem = new MenuItem();\r
1505     protected MenuItem neighbourTreeMenuItem = new MenuItem();\r
1506     BorderLayout borderLayout1 = new BorderLayout();\r
1507     public Label statusBar = new Label();\r
1508     protected Menu outputTextboxMenu = new Menu();\r
1509     protected MenuItem clustalColour = new MenuItem();\r
1510     protected MenuItem zappoColour = new MenuItem();\r
1511     protected MenuItem taylorColour = new MenuItem();\r
1512     protected MenuItem hydrophobicityColour = new MenuItem();\r
1513     protected MenuItem helixColour = new MenuItem();\r
1514     protected MenuItem strandColour = new MenuItem();\r
1515     protected MenuItem turnColour = new MenuItem();\r
1516     protected MenuItem buriedColour = new MenuItem();\r
1517     protected MenuItem userDefinedColour = new MenuItem();\r
1518     protected MenuItem PIDColour = new MenuItem();\r
1519     protected MenuItem BLOSUM62Colour = new MenuItem();\r
1520     MenuItem njTreeBlosumMenuItem = new MenuItem();\r
1521     MenuItem avDistanceTreeBlosumMenuItem = new MenuItem();\r
1522     protected CheckboxMenuItem annotationPanelMenuItem = new CheckboxMenuItem();\r
1523     protected CheckboxMenuItem colourTextMenuItem = new CheckboxMenuItem();\r
1524     MenuItem overviewMenuItem = new MenuItem();\r
1525     protected MenuItem undoMenuItem = new MenuItem();\r
1526     protected MenuItem redoMenuItem = new MenuItem();\r
1527     protected CheckboxMenuItem conservationMenuItem = new CheckboxMenuItem();\r
1528     MenuItem noColourmenuItem = new MenuItem();\r
1529     protected CheckboxMenuItem wrapMenuItem = new CheckboxMenuItem();\r
1530     protected CheckboxMenuItem renderGapsMenuItem = new CheckboxMenuItem();\r
1531     MenuItem findMenuItem = new MenuItem();\r
1532     Menu searchMenu = new Menu();\r
1533     protected CheckboxMenuItem abovePIDThreshold = new CheckboxMenuItem();\r
1534     protected MenuItem nucleotideColour = new MenuItem();\r
1535     MenuItem deleteGroups = new MenuItem();\r
1536     MenuItem delete = new MenuItem();\r
1537     MenuItem copy = new MenuItem();\r
1538     MenuItem cut = new MenuItem();\r
1539     Menu Menu1 = new Menu();\r
1540     MenuItem pasteNew = new MenuItem();\r
1541     MenuItem pasteThis = new MenuItem();\r
1542     protected CheckboxMenuItem applyToAllGroups = new CheckboxMenuItem();\r
1543     protected MenuItem font = new MenuItem();\r
1544     protected CheckboxMenuItem scaleAbove = new CheckboxMenuItem();\r
1545     protected CheckboxMenuItem scaleLeft = new CheckboxMenuItem();\r
1546     protected CheckboxMenuItem scaleRight = new CheckboxMenuItem();\r
1547     MenuItem modifyPID = new MenuItem();\r
1548     MenuItem modifyConservation = new MenuItem();\r
1549     protected Menu sortByTreeMenu = new Menu();\r
1550     Menu sort = new Menu();\r
1551     Menu calculate = new Menu();\r
1552     MenuItem inputText = new MenuItem();\r
1553     Menu helpMenu = new Menu();\r
1554     MenuItem documentation = new MenuItem();\r
1555     MenuItem about = new MenuItem();\r
1556     protected CheckboxMenuItem seqLimits = new CheckboxMenuItem();\r
1557 \r
1558     private void jbInit() throws Exception {\r
1559 \r
1560       setMenuBar(alignFrameMenuBar);\r
1561 \r
1562       MenuItem item;\r
1563 \r
1564       // dynamically fill save as menu with available formats\r
1565       for (int i = 0; i < jalview.io.AppletFormatAdapter.formats.size(); i++)\r
1566       {\r
1567 \r
1568         item = new MenuItem( (String) jalview.io.AppletFormatAdapter.formats.\r
1569                             elementAt(\r
1570                                 i));\r
1571         item.addActionListener(new java.awt.event.ActionListener()\r
1572         {\r
1573           public void actionPerformed(ActionEvent e)\r
1574           {\r
1575             outputText_actionPerformed(e);\r
1576           }\r
1577         });\r
1578 \r
1579         outputTextboxMenu.add(item);\r
1580       }\r
1581 \r
1582 \r
1583         fileMenu.setLabel("File");\r
1584         closeMenuItem.setLabel("Close");\r
1585         closeMenuItem.addActionListener(new java.awt.event.ActionListener() {\r
1586                 public void actionPerformed(ActionEvent e) {\r
1587                     closeMenuItem_actionPerformed(e);\r
1588                 }\r
1589             });\r
1590         editMenu.setLabel("Edit");\r
1591         viewMenu.setLabel("View");\r
1592         colourMenu.setLabel("Colour");\r
1593         calculateMenu.setLabel("Calculate");\r
1594         selectAllSequenceMenuItem.setLabel("Select all");\r
1595         selectAllSequenceMenuItem.addActionListener(new java.awt.event.ActionListener() {\r
1596                 public void actionPerformed(ActionEvent e) {\r
1597                     selectAllSequenceMenuItem_actionPerformed(e);\r
1598                 }\r
1599             });\r
1600         deselectAllSequenceMenuItem.setLabel("Deselect All");\r
1601         deselectAllSequenceMenuItem.addActionListener(new java.awt.event.ActionListener() {\r
1602                 public void actionPerformed(ActionEvent e) {\r
1603                     deselectAllSequenceMenuItem_actionPerformed(e);\r
1604                 }\r
1605             });\r
1606         invertSequenceMenuItem.setLabel("Invert Selection");\r
1607         invertSequenceMenuItem.addActionListener(new java.awt.event.ActionListener() {\r
1608                 public void actionPerformed(ActionEvent e) {\r
1609                     invertSequenceMenuItem_actionPerformed(e);\r
1610                 }\r
1611             });\r
1612         remove2LeftMenuItem.setLabel("Remove Left");\r
1613         remove2LeftMenuItem.addActionListener(new java.awt.event.ActionListener() {\r
1614                 public void actionPerformed(ActionEvent e) {\r
1615                     remove2LeftMenuItem_actionPerformed(e);\r
1616                 }\r
1617             });\r
1618         remove2RightMenuItem.setLabel("Remove Right");\r
1619         remove2RightMenuItem.addActionListener(new java.awt.event.ActionListener() {\r
1620                 public void actionPerformed(ActionEvent e) {\r
1621                     remove2RightMenuItem_actionPerformed(e);\r
1622                 }\r
1623             });\r
1624         removeGappedColumnMenuItem.setLabel("Remove Empty Columns");\r
1625         removeGappedColumnMenuItem.addActionListener(new java.awt.event.ActionListener() {\r
1626                 public void actionPerformed(ActionEvent e) {\r
1627                     removeGappedColumnMenuItem_actionPerformed(e);\r
1628                 }\r
1629             });\r
1630         removeAllGapsMenuItem.setLabel("Remove All Gaps");\r
1631         removeAllGapsMenuItem.addActionListener(new java.awt.event.ActionListener() {\r
1632                 public void actionPerformed(ActionEvent e) {\r
1633                     removeAllGapsMenuItem_actionPerformed(e);\r
1634                 }\r
1635             });\r
1636         viewBoxesMenuItem.setLabel("Boxes");\r
1637         viewBoxesMenuItem.setState(true);\r
1638         viewBoxesMenuItem.addItemListener(new java.awt.event.ItemListener() {\r
1639                 public void itemStateChanged(ItemEvent e) {\r
1640                     viewBoxesMenuItem_actionPerformed(null);\r
1641                 }\r
1642             });\r
1643         viewTextMenuItem.setLabel("Text");\r
1644         viewTextMenuItem.setState(true);\r
1645         viewTextMenuItem.addItemListener(new java.awt.event.ItemListener() {\r
1646                 public void itemStateChanged(ItemEvent e) {\r
1647                     viewTextMenuItem_actionPerformed(null);\r
1648                 }\r
1649             });\r
1650         sortPairwiseMenuItem.setLabel("by Pairwise Identity");\r
1651         sortPairwiseMenuItem.addActionListener(new java.awt.event.ActionListener() {\r
1652                 public void actionPerformed(ActionEvent e) {\r
1653                     sortPairwiseMenuItem_actionPerformed(e);\r
1654                 }\r
1655             });\r
1656         sortIDMenuItem.setLabel("by ID");\r
1657         sortIDMenuItem.addActionListener(new java.awt.event.ActionListener() {\r
1658                 public void actionPerformed(ActionEvent e) {\r
1659                     sortIDMenuItem_actionPerformed(e);\r
1660                 }\r
1661             });\r
1662         sortGroupMenuItem.setLabel("by Group");\r
1663         sortGroupMenuItem.addActionListener(new java.awt.event.ActionListener() {\r
1664                 public void actionPerformed(ActionEvent e) {\r
1665                     sortGroupMenuItem_actionPerformed(e);\r
1666                 }\r
1667             });\r
1668         removeRedundancyMenuItem.setLabel("Remove Redundancy...");\r
1669         removeRedundancyMenuItem.addActionListener(new java.awt.event.ActionListener() {\r
1670                 public void actionPerformed(ActionEvent e) {\r
1671                     removeRedundancyMenuItem_actionPerformed(e);\r
1672                 }\r
1673             });\r
1674         pairwiseAlignmentMenuItem.setLabel("Pairwise Alignments...");\r
1675         pairwiseAlignmentMenuItem.addActionListener(new java.awt.event.ActionListener() {\r
1676                 public void actionPerformed(ActionEvent e) {\r
1677                     pairwiseAlignmentMenuItem_actionPerformed(e);\r
1678                 }\r
1679             });\r
1680         PCAMenuItem.setLabel("Principal Component Analysis");\r
1681         PCAMenuItem.addActionListener(new java.awt.event.ActionListener() {\r
1682                 public void actionPerformed(ActionEvent e) {\r
1683                     PCAMenuItem_actionPerformed(e);\r
1684                 }\r
1685             });\r
1686         averageDistanceTreeMenuItem.setLabel(\r
1687             "Average Distance Using % Identity");\r
1688         averageDistanceTreeMenuItem.addActionListener(new java.awt.event.ActionListener() {\r
1689                 public void actionPerformed(ActionEvent e) {\r
1690                     averageDistanceTreeMenuItem_actionPerformed(e);\r
1691                 }\r
1692             });\r
1693         neighbourTreeMenuItem.setLabel("Neighbour Joining Using % Identity");\r
1694         neighbourTreeMenuItem.addActionListener(new java.awt.event.ActionListener() {\r
1695                 public void actionPerformed(ActionEvent e) {\r
1696                     neighbourTreeMenuItem_actionPerformed(e);\r
1697                 }\r
1698             });\r
1699         alignFrameMenuBar.setFont(new java.awt.Font("Verdana", 0, 11));\r
1700         statusBar.setBackground(Color.white);\r
1701         statusBar.setFont(new java.awt.Font("Verdana", 0, 11));\r
1702         statusBar.setText("Status bar");\r
1703         outputTextboxMenu.setLabel("Output to Textbox");\r
1704         clustalColour.setLabel("Clustalx");\r
1705 \r
1706         clustalColour.addActionListener(new java.awt.event.ActionListener() {\r
1707                 public void actionPerformed(ActionEvent e) {\r
1708                     clustalColour_actionPerformed(e);\r
1709                 }\r
1710             });\r
1711         zappoColour.setLabel("Zappo");\r
1712         zappoColour.addActionListener(new java.awt.event.ActionListener() {\r
1713                 public void actionPerformed(ActionEvent e) {\r
1714                     zappoColour_actionPerformed(e);\r
1715                 }\r
1716             });\r
1717         taylorColour.setLabel("Taylor");\r
1718         taylorColour.addActionListener(new java.awt.event.ActionListener() {\r
1719                 public void actionPerformed(ActionEvent e) {\r
1720                     taylorColour_actionPerformed(e);\r
1721                 }\r
1722             });\r
1723         hydrophobicityColour.setLabel("Hydrophobicity");\r
1724         hydrophobicityColour.addActionListener(new java.awt.event.ActionListener() {\r
1725                 public void actionPerformed(ActionEvent e) {\r
1726                     hydrophobicityColour_actionPerformed(e);\r
1727                 }\r
1728             });\r
1729         helixColour.setLabel("Helix Propensity");\r
1730         helixColour.addActionListener(new java.awt.event.ActionListener() {\r
1731                 public void actionPerformed(ActionEvent e) {\r
1732                     helixColour_actionPerformed(e);\r
1733                 }\r
1734             });\r
1735         strandColour.setLabel("Strand Propensity");\r
1736         strandColour.addActionListener(new java.awt.event.ActionListener() {\r
1737                 public void actionPerformed(ActionEvent e) {\r
1738                     strandColour_actionPerformed(e);\r
1739                 }\r
1740             });\r
1741         turnColour.setLabel("Turn Propensity");\r
1742         turnColour.addActionListener(new java.awt.event.ActionListener() {\r
1743                 public void actionPerformed(ActionEvent e) {\r
1744                     turnColour_actionPerformed(e);\r
1745                 }\r
1746             });\r
1747         buriedColour.setLabel("Buried Index");\r
1748         buriedColour.addActionListener(new java.awt.event.ActionListener() {\r
1749                 public void actionPerformed(ActionEvent e) {\r
1750                     buriedColour_actionPerformed(e);\r
1751                 }\r
1752             });\r
1753         userDefinedColour.setLabel("User Defined...");\r
1754         userDefinedColour.addActionListener(new java.awt.event.ActionListener() {\r
1755                 public void actionPerformed(ActionEvent e) {\r
1756                     userDefinedColour_actionPerformed(e);\r
1757                 }\r
1758             });\r
1759         PIDColour.setLabel("Percentage Identity");\r
1760         PIDColour.addActionListener(new java.awt.event.ActionListener() {\r
1761                 public void actionPerformed(ActionEvent e) {\r
1762                     PIDColour_actionPerformed(e);\r
1763                 }\r
1764             });\r
1765         BLOSUM62Colour.setLabel("BLOSUM62 Score");\r
1766         BLOSUM62Colour.addActionListener(new java.awt.event.ActionListener() {\r
1767                 public void actionPerformed(ActionEvent e) {\r
1768                     BLOSUM62Colour_actionPerformed(e);\r
1769                 }\r
1770             });\r
1771         avDistanceTreeBlosumMenuItem.setLabel(\r
1772             "Average Distance Using BLOSUM62");\r
1773         avDistanceTreeBlosumMenuItem.addActionListener(new java.awt.event.ActionListener() {\r
1774                 public void actionPerformed(ActionEvent e) {\r
1775                     avTreeBlosumMenuItem_actionPerformed(e);\r
1776                 }\r
1777             });\r
1778         njTreeBlosumMenuItem.setLabel("Neighbour Joining Using BLOSUM62");\r
1779         njTreeBlosumMenuItem.addActionListener(new java.awt.event.ActionListener() {\r
1780                 public void actionPerformed(ActionEvent e) {\r
1781                     njTreeBlosumMenuItem_actionPerformed(e);\r
1782                 }\r
1783             });\r
1784         annotationPanelMenuItem.setActionCommand("");\r
1785         annotationPanelMenuItem.setState(true);\r
1786         annotationPanelMenuItem.setLabel("Show Annotations");\r
1787         annotationPanelMenuItem.addItemListener(new java.awt.event.ItemListener() {\r
1788                 public void itemStateChanged(ItemEvent e) {\r
1789                     annotationPanelMenuItem_actionPerformed(null);\r
1790                 }\r
1791             });\r
1792         colourTextMenuItem.setLabel("Colour Text");\r
1793         colourTextMenuItem.addItemListener(new java.awt.event.ItemListener() {\r
1794                 public void itemStateChanged(ItemEvent e) {\r
1795                     colourTextMenuItem_actionPerformed(null);\r
1796                 }\r
1797             });\r
1798         overviewMenuItem.setLabel("Overview Window");\r
1799         overviewMenuItem.addActionListener(new java.awt.event.ActionListener() {\r
1800                 public void actionPerformed(ActionEvent e) {\r
1801                     overviewMenuItem_actionPerformed(e);\r
1802                 }\r
1803             });\r
1804         undoMenuItem.setEnabled(false);\r
1805         undoMenuItem.setLabel("Undo");\r
1806         undoMenuItem.addActionListener(new java.awt.event.ActionListener() {\r
1807                 public void actionPerformed(ActionEvent e) {\r
1808                     undoMenuItem_actionPerformed(e);\r
1809                 }\r
1810             });\r
1811         redoMenuItem.setEnabled(false);\r
1812         redoMenuItem.setLabel("Redo");\r
1813         redoMenuItem.addActionListener(new java.awt.event.ActionListener() {\r
1814                 public void actionPerformed(ActionEvent e) {\r
1815                     redoMenuItem_actionPerformed(e);\r
1816                 }\r
1817             });\r
1818         conservationMenuItem.setLabel("by Conservation");\r
1819         conservationMenuItem.addItemListener(new java.awt.event.ItemListener() {\r
1820                 public void itemStateChanged(ItemEvent e) {\r
1821                     conservationMenuItem_actionPerformed(null);\r
1822                 }\r
1823             });\r
1824         noColourmenuItem.setLabel("None");\r
1825         noColourmenuItem.addActionListener(new java.awt.event.ActionListener() {\r
1826                 public void actionPerformed(ActionEvent e) {\r
1827                     noColourmenuItem_actionPerformed(e);\r
1828                 }\r
1829             });\r
1830         wrapMenuItem.setLabel("Wrap");\r
1831         wrapMenuItem.addItemListener(new java.awt.event.ItemListener() {\r
1832                 public void itemStateChanged(ItemEvent e) {\r
1833                     wrapMenuItem_actionPerformed(null);\r
1834                 }\r
1835             });\r
1836         renderGapsMenuItem.setLabel("Show Gaps");\r
1837         renderGapsMenuItem.setState(true);\r
1838         renderGapsMenuItem.addItemListener(new java.awt.event.ItemListener() {\r
1839                 public void itemStateChanged(ItemEvent e) {\r
1840                     renderGapsMenuItem_actionPerformed(null);\r
1841                 }\r
1842             });\r
1843         findMenuItem.setLabel("Find...");\r
1844         findMenuItem.addActionListener(new java.awt.event.ActionListener() {\r
1845                 public void actionPerformed(ActionEvent e) {\r
1846                     findMenuItem_actionPerformed(e);\r
1847                 }\r
1848             });\r
1849         searchMenu.setLabel("Search");\r
1850 \r
1851         abovePIDThreshold.setLabel("Above Identity Threshold");\r
1852         abovePIDThreshold.addItemListener(new java.awt.event.ItemListener() {\r
1853                 public void itemStateChanged(ItemEvent e) {\r
1854                     abovePIDThreshold_actionPerformed(null);\r
1855                 }\r
1856             });\r
1857         nucleotideColour.setLabel("Nucleotide");\r
1858         nucleotideColour.addActionListener(new java.awt.event.ActionListener() {\r
1859                 public void actionPerformed(ActionEvent e) {\r
1860                     nucleotideColour_actionPerformed(e);\r
1861                 }\r
1862             });\r
1863         deleteGroups.setLabel("Undefine Groups");\r
1864         deleteGroups.addActionListener(new java.awt.event.ActionListener() {\r
1865                 public void actionPerformed(ActionEvent e) {\r
1866                     deleteGroups_actionPerformed(e);\r
1867                 }\r
1868             });\r
1869         copy.setLabel("Copy");\r
1870         copy.addActionListener(new java.awt.event.ActionListener() {\r
1871                 public void actionPerformed(ActionEvent e) {\r
1872                     copy_actionPerformed(e);\r
1873                 }\r
1874             });\r
1875         cut.setLabel("Cut");\r
1876         cut.addActionListener(new java.awt.event.ActionListener() {\r
1877                 public void actionPerformed(ActionEvent e) {\r
1878                     cut_actionPerformed(e);\r
1879                 }\r
1880             });\r
1881         delete.setLabel("Delete");\r
1882         delete.addActionListener(new java.awt.event.ActionListener() {\r
1883                 public void actionPerformed(ActionEvent e) {\r
1884                     delete_actionPerformed(e);\r
1885                 }\r
1886             });\r
1887         Menu1.setLabel("Paste");\r
1888         pasteNew.setLabel("To New Alignment");\r
1889         pasteNew.addActionListener(new java.awt.event.ActionListener() {\r
1890                 public void actionPerformed(ActionEvent e) {\r
1891                     pasteNew_actionPerformed(e);\r
1892                 }\r
1893             });\r
1894         pasteThis.setLabel("Add To This Alignment");\r
1895         pasteThis.addActionListener(new java.awt.event.ActionListener() {\r
1896                 public void actionPerformed(ActionEvent e) {\r
1897                     pasteThis_actionPerformed(e);\r
1898                 }\r
1899             });\r
1900         applyToAllGroups.setLabel("Apply Colour To All Groups");\r
1901         applyToAllGroups.setState(true);\r
1902         applyToAllGroups.addItemListener(new java.awt.event.ItemListener() {\r
1903                 public void itemStateChanged(ItemEvent e) {\r
1904                     applyToAllGroups_actionPerformed(null);\r
1905                 }\r
1906             });\r
1907         font.setLabel("Font...");\r
1908         font.addActionListener(new java.awt.event.ActionListener() {\r
1909                 public void actionPerformed(ActionEvent e) {\r
1910                     font_actionPerformed(e);\r
1911                 }\r
1912             });\r
1913         scaleAbove.setLabel("Scale Above");\r
1914         scaleAbove.setState(true);\r
1915         scaleAbove.addItemListener(new java.awt.event.ItemListener() {\r
1916                 public void itemStateChanged(ItemEvent e) {\r
1917                     scaleAbove_actionPerformed(null);\r
1918                 }\r
1919             });\r
1920         scaleLeft.setEnabled(false);\r
1921         scaleLeft.setState(true);\r
1922         scaleLeft.setLabel("Scale Left");\r
1923         scaleLeft.addItemListener(new java.awt.event.ItemListener() {\r
1924                 public void itemStateChanged(ItemEvent e) {\r
1925                     scaleLeft_actionPerformed(null);\r
1926                 }\r
1927             });\r
1928         scaleRight.setEnabled(false);\r
1929         scaleRight.setState(true);\r
1930         scaleRight.setLabel("Scale Right");\r
1931         scaleRight.addItemListener(new java.awt.event.ItemListener() {\r
1932                 public void itemStateChanged(ItemEvent e) {\r
1933                     scaleRight_actionPerformed(null);\r
1934                 }\r
1935             });\r
1936         modifyPID.setLabel("Modify Identity Threshold...");\r
1937         modifyPID.addActionListener(new java.awt.event.ActionListener() {\r
1938                 public void actionPerformed(ActionEvent e) {\r
1939                     modifyPID_actionPerformed(e);\r
1940                 }\r
1941             });\r
1942         modifyConservation.setLabel("Modify Conservation Threshold...");\r
1943         modifyConservation.addActionListener(new java.awt.event.ActionListener() {\r
1944                 public void actionPerformed(ActionEvent e) {\r
1945                     modifyConservation_actionPerformed(e);\r
1946                 }\r
1947             });\r
1948         sortByTreeMenu.setLabel("By Tree Order");\r
1949         sort.setLabel("Sort");\r
1950         calculate.setLabel("Calculate Tree");\r
1951         inputText.setLabel("Input from textbox");\r
1952         inputText.addActionListener(new java.awt.event.ActionListener() {\r
1953                 public void actionPerformed(ActionEvent e) {\r
1954                     inputText_actionPerformed(e);\r
1955                 }\r
1956             });\r
1957 \r
1958         helpMenu.setLabel("Help");\r
1959         documentation.setLabel("Documentation");\r
1960         documentation.addActionListener(new java.awt.event.ActionListener() {\r
1961                 public void actionPerformed(ActionEvent e) {\r
1962                     documentation_actionPerformed(e);\r
1963                 }\r
1964             });\r
1965 \r
1966         about.setLabel("About...");\r
1967         about.addActionListener(new java.awt.event.ActionListener() {\r
1968                 public void actionPerformed(ActionEvent e) {\r
1969                     about_actionPerformed(e);\r
1970                 }\r
1971             });\r
1972           seqLimits.setState(true);\r
1973     seqLimits.setLabel("Show Sequence Limits");\r
1974     seqLimits.addItemListener(new ItemListener()\r
1975     {\r
1976       public void itemStateChanged(ItemEvent e)\r
1977       {\r
1978         seqLimits_itemStateChanged(e);\r
1979       }\r
1980     });\r
1981 \r
1982     alignFrameMenuBar.add(fileMenu);\r
1983         alignFrameMenuBar.add(editMenu);\r
1984         alignFrameMenuBar.add(searchMenu);\r
1985         alignFrameMenuBar.add(viewMenu);\r
1986         alignFrameMenuBar.add(colourMenu);\r
1987         alignFrameMenuBar.add(calculateMenu);\r
1988         alignFrameMenuBar.add(helpMenu);\r
1989         fileMenu.add(inputText);\r
1990         fileMenu.add(outputTextboxMenu);\r
1991         fileMenu.addSeparator();\r
1992         fileMenu.add(closeMenuItem);\r
1993         editMenu.add(undoMenuItem);\r
1994         editMenu.add(redoMenuItem);\r
1995         editMenu.add(cut);\r
1996         editMenu.add(copy);\r
1997         editMenu.add(Menu1);\r
1998         editMenu.add(delete);\r
1999         editMenu.addSeparator();\r
2000         editMenu.add(selectAllSequenceMenuItem);\r
2001         editMenu.add(deselectAllSequenceMenuItem);\r
2002         editMenu.add(invertSequenceMenuItem);\r
2003         editMenu.add(deleteGroups);\r
2004         editMenu.addSeparator();\r
2005         editMenu.add(remove2LeftMenuItem);\r
2006         editMenu.add(remove2RightMenuItem);\r
2007         editMenu.add(removeGappedColumnMenuItem);\r
2008         editMenu.add(removeAllGapsMenuItem);\r
2009         editMenu.add(removeRedundancyMenuItem);\r
2010         searchMenu.add(findMenuItem);\r
2011         viewMenu.add(font);\r
2012         viewMenu.addSeparator();\r
2013         viewMenu.add(seqLimits);\r
2014         viewMenu.addSeparator();\r
2015     viewMenu.add(wrapMenuItem);\r
2016         viewMenu.add(scaleAbove);\r
2017         viewMenu.add(scaleLeft);\r
2018         viewMenu.add(scaleRight);\r
2019         viewMenu.addSeparator();\r
2020     viewMenu.add(viewBoxesMenuItem);\r
2021         viewMenu.add(viewTextMenuItem);\r
2022         viewMenu.add(colourTextMenuItem);\r
2023         viewMenu.add(renderGapsMenuItem);\r
2024         viewMenu.add(annotationPanelMenuItem);\r
2025         viewMenu.addSeparator();\r
2026         viewMenu.add(overviewMenuItem);\r
2027         colourMenu.add(applyToAllGroups);\r
2028         colourMenu.addSeparator();\r
2029         colourMenu.add(noColourmenuItem);\r
2030         colourMenu.add(clustalColour);\r
2031         colourMenu.add(BLOSUM62Colour);\r
2032         colourMenu.add(PIDColour);\r
2033         colourMenu.add(zappoColour);\r
2034         colourMenu.add(taylorColour);\r
2035         colourMenu.add(hydrophobicityColour);\r
2036         colourMenu.add(helixColour);\r
2037         colourMenu.add(strandColour);\r
2038         colourMenu.add(turnColour);\r
2039         colourMenu.add(buriedColour);\r
2040         colourMenu.add(nucleotideColour);\r
2041         colourMenu.add(userDefinedColour);\r
2042         colourMenu.addSeparator();\r
2043         colourMenu.add(conservationMenuItem);\r
2044         colourMenu.add(modifyConservation);\r
2045         colourMenu.add(abovePIDThreshold);\r
2046         colourMenu.add(modifyPID);\r
2047         calculateMenu.add(sort);\r
2048         calculateMenu.add(calculate);\r
2049         calculateMenu.addSeparator();\r
2050         calculateMenu.add(pairwiseAlignmentMenuItem);\r
2051         calculateMenu.add(PCAMenuItem);\r
2052         this.add(statusBar, BorderLayout.SOUTH);\r
2053         Menu1.add(pasteNew);\r
2054         Menu1.add(pasteThis);\r
2055         sort.add(sortIDMenuItem);\r
2056         sort.add(sortByTreeMenu);\r
2057         sort.add(sortGroupMenuItem);\r
2058         sort.add(sortPairwiseMenuItem);\r
2059         calculate.add(averageDistanceTreeMenuItem);\r
2060         calculate.add(neighbourTreeMenuItem);\r
2061         calculate.add(avDistanceTreeBlosumMenuItem);\r
2062         calculate.add(njTreeBlosumMenuItem);\r
2063         helpMenu.add(documentation);\r
2064         helpMenu.add(about);\r
2065     }\r
2066 }\r
2067 \r