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