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