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