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