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