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