Formatting
[jalview.git] / src / jalview / appletgui / AlignFrame.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer\r
3  * Copyright (C) 2007 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 java.io.*;\r
23 import java.net.*;\r
24 import java.util.*;\r
25 \r
26 import java.awt.*;\r
27 import java.awt.event.*;\r
28 \r
29 import jalview.analysis.*;\r
30 import jalview.commands.*;\r
31 import jalview.datamodel.*;\r
32 import jalview.io.*;\r
33 import jalview.schemes.*;\r
34 \r
35 public class AlignFrame\r
36     extends Frame implements ActionListener,\r
37     ItemListener, KeyListener, MouseListener\r
38 {\r
39   public AlignmentPanel alignPanel;\r
40   public AlignViewport viewport;\r
41   int DEFAULT_WIDTH = 700;\r
42   int DEFAULT_HEIGHT = 500;\r
43 \r
44   String jalviewServletURL;\r
45 \r
46   public AlignFrame(AlignmentI al,\r
47                     jalview.bin.JalviewLite applet,\r
48                     String title,\r
49                     boolean embedded)\r
50   {\r
51 \r
52     if (applet != null)\r
53     {\r
54       jalviewServletURL = applet.getParameter("APPLICATION_URL");\r
55     }\r
56 \r
57     try\r
58     {\r
59       jbInit();\r
60     }\r
61     catch (Exception ex)\r
62     {\r
63       ex.printStackTrace();\r
64     }\r
65 \r
66     viewport = new AlignViewport(al, applet);\r
67     alignPanel = new AlignmentPanel(this, viewport);\r
68 \r
69     viewport.updateConservation(alignPanel);\r
70     viewport.updateConsensus(alignPanel);\r
71 \r
72     annotationPanelMenuItem.setState(viewport.showAnnotation);\r
73 \r
74     seqLimits.setState(viewport.showJVSuffix);\r
75 \r
76     if (applet != null)\r
77     {\r
78       String param = applet.getParameter("sortBy");\r
79       if (param != null)\r
80       {\r
81         if (param.equalsIgnoreCase("Id"))\r
82         {\r
83           sortIDMenuItem_actionPerformed();\r
84         }\r
85         else if (param.equalsIgnoreCase("Pairwise Identity"))\r
86         {\r
87           sortPairwiseMenuItem_actionPerformed();\r
88         }\r
89       }\r
90 \r
91       param = applet.getParameter("wrap");\r
92       if (param != null)\r
93       {\r
94         if (param.equalsIgnoreCase("true"))\r
95         {\r
96           wrapMenuItem.setState(true);\r
97           wrapMenuItem_actionPerformed();\r
98         }\r
99       }\r
100 \r
101       try\r
102       {\r
103         param = applet.getParameter("windowWidth");\r
104         if (param != null)\r
105         {\r
106           int width = Integer.parseInt(param);\r
107           DEFAULT_WIDTH = width;\r
108         }\r
109         param = applet.getParameter("windowHeight");\r
110         if (param != null)\r
111         {\r
112           int height = Integer.parseInt(param);\r
113           DEFAULT_HEIGHT = height;\r
114         }\r
115       }\r
116       catch (Exception ex)\r
117       {}\r
118 \r
119     }\r
120 \r
121     //Some JVMS send keyevents to Top frame or lowest panel,\r
122     //Havent worked out why yet. So add to both this frame and seqCanvas for now\r
123     this.addKeyListener(this);\r
124     alignPanel.seqPanel.seqCanvas.addKeyListener(this);\r
125     alignPanel.idPanel.idCanvas.addKeyListener(this);\r
126     alignPanel.scalePanel.addKeyListener(this);\r
127     alignPanel.annotationPanel.addKeyListener(this);\r
128 \r
129     if (embedded)\r
130     {\r
131       setEmbedded();\r
132     }\r
133     else\r
134     {\r
135       add(alignPanel, BorderLayout.CENTER);\r
136       jalview.bin.JalviewLite.addFrame(this, title, DEFAULT_WIDTH,\r
137                                        DEFAULT_HEIGHT);\r
138     }\r
139     alignPanel.validate();\r
140     alignPanel.repaint();\r
141   }\r
142 \r
143   public AlignViewport getAlignViewport()\r
144   {\r
145     return viewport;\r
146   }\r
147 \r
148   public SeqCanvas getSeqcanvas()\r
149   {\r
150     return alignPanel.seqPanel.seqCanvas;\r
151   }\r
152 \r
153   /**\r
154    * DOCUMENT ME!\r
155    *\r
156    * @param String DOCUMENT ME!\r
157    */\r
158 \r
159   public void parseFeaturesFile(String file, String type)\r
160   {\r
161     Hashtable featureLinks = new Hashtable();\r
162     boolean featuresFile = false;\r
163     try\r
164     {\r
165       featuresFile = new jalview.io.FeaturesFile(file,\r
166           type).parse(viewport.alignment,\r
167                       alignPanel.seqPanel.seqCanvas.\r
168                       getFeatureRenderer().featureColours,\r
169                       featureLinks,\r
170                       true);\r
171     }\r
172     catch (Exception ex)\r
173     {\r
174       ex.printStackTrace();\r
175     }\r
176 \r
177     if (featuresFile)\r
178     {\r
179       if (featureLinks.size() > 0)\r
180       {\r
181         alignPanel.seqPanel.seqCanvas\r
182             .getFeatureRenderer().featureLinks = featureLinks;\r
183       }\r
184       viewport.showSequenceFeatures = true;\r
185       sequenceFeatures.setState(true);\r
186       alignPanel.repaint();\r
187     }\r
188 \r
189   }\r
190 \r
191   public void keyPressed(KeyEvent evt)\r
192   {\r
193     if (viewport.cursorMode\r
194         && evt.getKeyCode() >= KeyEvent.VK_0\r
195         && evt.getKeyCode() <= KeyEvent.VK_9)\r
196     {\r
197       alignPanel.seqPanel.numberPressed(evt.getKeyChar());\r
198     }\r
199 \r
200     switch (evt.getKeyCode())\r
201     {\r
202       case 27: // escape key\r
203         deselectAllSequenceMenuItem_actionPerformed();\r
204         break;\r
205       case KeyEvent.VK_X:\r
206         if (evt.isControlDown() || evt.isMetaDown())\r
207         {\r
208           cut_actionPerformed();\r
209         }\r
210         break;\r
211       case KeyEvent.VK_C:\r
212         if (viewport.cursorMode && !evt.isControlDown())\r
213         {\r
214           alignPanel.seqPanel.setCursorColumn();\r
215         }\r
216         if (evt.isControlDown() || evt.isMetaDown())\r
217         {\r
218           copy_actionPerformed();\r
219         }\r
220         break;\r
221       case KeyEvent.VK_V:\r
222         if (evt.isControlDown())\r
223         {\r
224           paste(evt.isShiftDown());\r
225         }\r
226         break;\r
227       case KeyEvent.VK_A:\r
228         if (evt.isControlDown() || evt.isMetaDown())\r
229         {\r
230           selectAllSequenceMenuItem_actionPerformed();\r
231         }\r
232         break;\r
233       case KeyEvent.VK_DOWN:\r
234         if (viewport.cursorMode)\r
235         {\r
236           alignPanel.seqPanel.moveCursor(0, 1);\r
237         }\r
238         else\r
239         {\r
240           moveSelectedSequences(false);\r
241         }\r
242         break;\r
243 \r
244       case KeyEvent.VK_UP:\r
245         if (viewport.cursorMode)\r
246         {\r
247           alignPanel.seqPanel.moveCursor(0, -1);\r
248         }\r
249         else\r
250         {\r
251           moveSelectedSequences(true);\r
252         }\r
253         break;\r
254 \r
255       case KeyEvent.VK_LEFT:\r
256         if (viewport.cursorMode)\r
257         {\r
258           alignPanel.seqPanel.moveCursor( -1, 0);\r
259         }\r
260         break;\r
261 \r
262       case KeyEvent.VK_RIGHT:\r
263         if (viewport.cursorMode)\r
264         {\r
265           alignPanel.seqPanel.moveCursor(1, 0);\r
266         }\r
267         break;\r
268       case KeyEvent.VK_SPACE:\r
269         if (viewport.cursorMode)\r
270         {\r
271           alignPanel.seqPanel.insertGapAtCursor(evt.isControlDown()\r
272                                                 || evt.isShiftDown()\r
273                                                 || evt.isAltDown()\r
274               );\r
275         }\r
276         break;\r
277 \r
278       case KeyEvent.VK_DELETE:\r
279       case KeyEvent.VK_BACK_SPACE:\r
280         if (viewport.cursorMode)\r
281         {\r
282           alignPanel.seqPanel.deleteGapAtCursor(evt.isControlDown()\r
283                                                 || evt.isShiftDown()\r
284                                                 || evt.isAltDown());\r
285         }\r
286         else\r
287         {\r
288           cut_actionPerformed();\r
289           alignPanel.seqPanel.seqCanvas.repaint();\r
290         }\r
291         break;\r
292 \r
293       case KeyEvent.VK_S:\r
294         if (viewport.cursorMode)\r
295         {\r
296           alignPanel.seqPanel.setCursorRow();\r
297         }\r
298         break;\r
299       case KeyEvent.VK_P:\r
300         if (viewport.cursorMode)\r
301         {\r
302           alignPanel.seqPanel.setCursorPosition();\r
303         }\r
304         break;\r
305 \r
306       case KeyEvent.VK_ENTER:\r
307       case KeyEvent.VK_COMMA:\r
308         if (viewport.cursorMode)\r
309         {\r
310           alignPanel.seqPanel.setCursorRowAndColumn();\r
311         }\r
312         break;\r
313 \r
314       case KeyEvent.VK_Q:\r
315         if (viewport.cursorMode)\r
316         {\r
317           alignPanel.seqPanel.setSelectionAreaAtCursor(true);\r
318         }\r
319         break;\r
320       case KeyEvent.VK_M:\r
321         if (viewport.cursorMode)\r
322         {\r
323           alignPanel.seqPanel.setSelectionAreaAtCursor(false);\r
324         }\r
325         break;\r
326 \r
327       case KeyEvent.VK_F2:\r
328         viewport.cursorMode = !viewport.cursorMode;\r
329         statusBar.setText("Keyboard editing mode is " +\r
330                           (viewport.cursorMode ? "on" : "off"));\r
331         if (viewport.cursorMode)\r
332         {\r
333           alignPanel.seqPanel.seqCanvas.cursorX = viewport.startRes;\r
334           alignPanel.seqPanel.seqCanvas.cursorY = viewport.startSeq;\r
335         }\r
336         break;\r
337 \r
338       case KeyEvent.VK_F:\r
339         if (evt.isControlDown())\r
340         {\r
341           findMenuItem_actionPerformed();\r
342         }\r
343         break;\r
344 \r
345       case KeyEvent.VK_H:\r
346       {\r
347         boolean toggleSeqs = !evt.isControlDown();\r
348         boolean toggleCols = !evt.isShiftDown();\r
349         boolean hide = false;\r
350         SequenceGroup sg = viewport.getSelectionGroup();\r
351 \r
352         if (toggleSeqs)\r
353         {\r
354           if (sg != null && sg.getSize() != viewport.alignment.getHeight())\r
355           {\r
356             hide = true;\r
357             viewport.hideAllSelectedSeqs();\r
358           }\r
359           else if (! (toggleCols && viewport.colSel.getSelected().size() > 0))\r
360           {\r
361             viewport.showAllHiddenSeqs();\r
362           }\r
363         }\r
364 \r
365         if (toggleCols)\r
366         {\r
367           if (viewport.colSel.getSelected().size() > 0)\r
368           {\r
369             viewport.hideSelectedColumns();\r
370             if (!toggleSeqs)\r
371             {\r
372               viewport.selectionGroup = sg;\r
373             }\r
374           }\r
375           else if (!hide)\r
376           {\r
377             viewport.showAllHiddenColumns();\r
378           }\r
379         }\r
380         break;\r
381       }\r
382 \r
383       case KeyEvent.VK_PAGE_UP:\r
384         if (viewport.wrapAlignment)\r
385         {\r
386           alignPanel.scrollUp(true);\r
387         }\r
388         else\r
389         {\r
390           alignPanel.setScrollValues(viewport.startRes,\r
391                                      viewport.startSeq\r
392                                      - viewport.endSeq + viewport.startSeq);\r
393         }\r
394         break;\r
395 \r
396       case KeyEvent.VK_PAGE_DOWN:\r
397         if (viewport.wrapAlignment)\r
398         {\r
399           alignPanel.scrollUp(false);\r
400         }\r
401         else\r
402         {\r
403           alignPanel.setScrollValues(viewport.startRes,\r
404                                      viewport.startSeq\r
405                                      + viewport.endSeq - viewport.startSeq);\r
406         }\r
407         break;\r
408 \r
409       case KeyEvent.VK_Z:\r
410         if (evt.isControlDown())\r
411         {\r
412           undoMenuItem_actionPerformed();\r
413         }\r
414         break;\r
415 \r
416       case KeyEvent.VK_Y:\r
417         if (evt.isControlDown())\r
418         {\r
419           redoMenuItem_actionPerformed();\r
420         }\r
421         break;\r
422 \r
423       case KeyEvent.VK_L:\r
424         if (evt.isControlDown())\r
425         {\r
426           trimAlignment(true);\r
427         }\r
428         break;\r
429 \r
430       case KeyEvent.VK_R:\r
431         if (evt.isControlDown())\r
432         {\r
433           trimAlignment(false);\r
434         }\r
435         break;\r
436 \r
437       case KeyEvent.VK_E:\r
438         if (evt.isControlDown())\r
439         {\r
440           if (evt.isShiftDown())\r
441           {\r
442             this.removeAllGapsMenuItem_actionPerformed();\r
443           }\r
444           else\r
445           {\r
446             removeGappedColumnMenuItem_actionPerformed();\r
447           }\r
448         }\r
449         break;\r
450       case KeyEvent.VK_I:\r
451         if (evt.isControlDown())\r
452         {\r
453           if (evt.isAltDown())\r
454           {\r
455             viewport.invertColumnSelection();\r
456           }\r
457           else\r
458           {\r
459             this.invertSequenceMenuItem_actionPerformed();\r
460           }\r
461         }\r
462         break;\r
463 \r
464       case KeyEvent.VK_U:\r
465         if (evt.isControlDown())\r
466         {\r
467           this.deleteGroups_actionPerformed();\r
468         }\r
469         break;\r
470 \r
471       case KeyEvent.VK_T:\r
472         if (evt.isControlDown())\r
473         {\r
474           newView();\r
475         }\r
476         break;\r
477 \r
478     }\r
479     alignPanel.repaint();\r
480   }\r
481 \r
482   public void keyReleased(KeyEvent evt)\r
483   {}\r
484 \r
485   public void keyTyped(KeyEvent evt)\r
486   {}\r
487 \r
488   public void itemStateChanged(ItemEvent evt)\r
489   {\r
490     if (evt.getSource() == colourTextMenuItem)\r
491     {\r
492       colourTextMenuItem_actionPerformed();\r
493     }\r
494     else if (evt.getSource() == wrapMenuItem)\r
495     {\r
496       wrapMenuItem_actionPerformed();\r
497     }\r
498     else if (evt.getSource() == scaleAbove)\r
499     {\r
500       viewport.setScaleAboveWrapped(scaleAbove.getState());\r
501     }\r
502     else if (evt.getSource() == scaleLeft)\r
503     {\r
504       viewport.setScaleLeftWrapped(scaleLeft.getState());\r
505     }\r
506     else if (evt.getSource() == scaleRight)\r
507     {\r
508       viewport.setScaleRightWrapped(scaleRight.getState());\r
509     }\r
510     else if (evt.getSource() == seqLimits)\r
511     {\r
512       seqLimits_itemStateChanged();\r
513     }\r
514     else if (evt.getSource() == viewBoxesMenuItem)\r
515     {\r
516       viewport.setShowBoxes(viewBoxesMenuItem.getState());\r
517     }\r
518     else if (evt.getSource() == viewTextMenuItem)\r
519     {\r
520       viewport.setShowText(viewTextMenuItem.getState());\r
521     }\r
522     else if (evt.getSource() == renderGapsMenuItem)\r
523     {\r
524       viewport.setRenderGaps(renderGapsMenuItem.getState());\r
525     }\r
526     else if (evt.getSource() == annotationPanelMenuItem)\r
527     {\r
528       viewport.setShowAnnotation(annotationPanelMenuItem.getState());\r
529       alignPanel.setAnnotationVisible(annotationPanelMenuItem.getState());\r
530     }\r
531     else if (evt.getSource() == sequenceFeatures)\r
532     {\r
533       viewport.showSequenceFeatures(sequenceFeatures.getState());\r
534       alignPanel.seqPanel.seqCanvas.repaint();\r
535     }\r
536     else if (evt.getSource() == conservationMenuItem)\r
537     {\r
538       conservationMenuItem_actionPerformed();\r
539     }\r
540     else if (evt.getSource() == abovePIDThreshold)\r
541     {\r
542       abovePIDThreshold_actionPerformed();\r
543     }\r
544     else if (evt.getSource() == applyToAllGroups)\r
545     {\r
546       viewport.setColourAppliesToAllGroups(applyToAllGroups.getState());\r
547     }\r
548     else if (evt.getSource() == autoCalculate)\r
549     {\r
550       viewport.autocalculateConsensus = autoCalculate.getState();\r
551     }\r
552 \r
553     alignPanel.repaint();\r
554   }\r
555 \r
556   public void actionPerformed(ActionEvent evt)\r
557   {\r
558     Object source = evt.getSource();\r
559 \r
560     if (source == inputText)\r
561     {\r
562       inputText_actionPerformed();\r
563     }\r
564     else if (source == loadTree)\r
565     {\r
566       loadTree_actionPerformed();\r
567     }\r
568     else if (source == loadApplication)\r
569     {\r
570       launchFullApplication();\r
571     }\r
572     else if (source == loadAnnotations)\r
573     {\r
574       loadAnnotations();\r
575     }\r
576     else if (source == outputAnnotations)\r
577     {\r
578       outputAnnotations(true);\r
579     }\r
580     else if (source == outputFeatures)\r
581     {\r
582       outputFeatures(true, "Jalview");\r
583     }\r
584     else if (source == closeMenuItem)\r
585     {\r
586       closeMenuItem_actionPerformed();\r
587     }\r
588     else if (source == copy)\r
589     {\r
590       copy_actionPerformed();\r
591     }\r
592     else if (source == undoMenuItem)\r
593     {\r
594       undoMenuItem_actionPerformed();\r
595     }\r
596     else if (source == redoMenuItem)\r
597     {\r
598       redoMenuItem_actionPerformed();\r
599     }\r
600     else if (source == inputText)\r
601     {\r
602       inputText_actionPerformed();\r
603     }\r
604     else if (source == closeMenuItem)\r
605     {\r
606       closeMenuItem_actionPerformed();\r
607     }\r
608     else if (source == undoMenuItem)\r
609     {\r
610       undoMenuItem_actionPerformed();\r
611     }\r
612     else if (source == redoMenuItem)\r
613     {\r
614       redoMenuItem_actionPerformed();\r
615     }\r
616     else if (source == copy)\r
617     {\r
618       copy_actionPerformed();\r
619     }\r
620     else if (source == pasteNew)\r
621     {\r
622       pasteNew_actionPerformed();\r
623     }\r
624     else if (source == pasteThis)\r
625     {\r
626       pasteThis_actionPerformed();\r
627     }\r
628     else if (source == cut)\r
629     {\r
630       cut_actionPerformed();\r
631     }\r
632     else if (source == delete)\r
633     {\r
634       delete_actionPerformed();\r
635     }\r
636     else if (source == deleteGroups)\r
637     {\r
638       deleteGroups_actionPerformed();\r
639     }\r
640     else if (source == selectAllSequenceMenuItem)\r
641     {\r
642       selectAllSequenceMenuItem_actionPerformed();\r
643     }\r
644     else if (source == deselectAllSequenceMenuItem)\r
645     {\r
646       deselectAllSequenceMenuItem_actionPerformed();\r
647     }\r
648     else if (source == invertSequenceMenuItem)\r
649     {\r
650       invertSequenceMenuItem_actionPerformed();\r
651     }\r
652     else if (source == invertColSel)\r
653     {\r
654       viewport.invertColumnSelection();\r
655       alignPanel.repaint();\r
656     }\r
657     else if (source == remove2LeftMenuItem)\r
658     {\r
659       trimAlignment(true);\r
660     }\r
661     else if (source == remove2RightMenuItem)\r
662     {\r
663       trimAlignment(false);\r
664     }\r
665     else if (source == removeGappedColumnMenuItem)\r
666     {\r
667       removeGappedColumnMenuItem_actionPerformed();\r
668     }\r
669     else if (source == removeAllGapsMenuItem)\r
670     {\r
671       removeAllGapsMenuItem_actionPerformed();\r
672     }\r
673     else if (source == findMenuItem)\r
674     {\r
675       findMenuItem_actionPerformed();\r
676     }\r
677     else if (source == font)\r
678     {\r
679       new FontChooser(alignPanel);\r
680     }\r
681     else if (source == newView)\r
682     {\r
683       newView();\r
684     }\r
685     else if (source == showColumns)\r
686     {\r
687       viewport.showAllHiddenColumns();\r
688       alignPanel.repaint();\r
689     }\r
690     else if (source == showSeqs)\r
691     {\r
692       viewport.showAllHiddenSeqs();\r
693     }\r
694     else if (source == hideColumns)\r
695     {\r
696       viewport.hideSelectedColumns();\r
697       alignPanel.repaint();\r
698     }\r
699     else if (source == hideSequences && viewport.getSelectionGroup() != null)\r
700     {\r
701       viewport.hideAllSelectedSeqs();\r
702     }\r
703     else if (source == featureSettings)\r
704     {\r
705       new FeatureSettings(alignPanel);\r
706     }\r
707     else if (source == overviewMenuItem)\r
708     {\r
709       overviewMenuItem_actionPerformed();\r
710     }\r
711     else if (source == noColourmenuItem)\r
712     {\r
713       changeColour(null);\r
714     }\r
715     else if (source == clustalColour)\r
716     {\r
717       abovePIDThreshold.setState(false);\r
718       changeColour(new ClustalxColourScheme(viewport.alignment.getSequences(),\r
719                                             viewport.alignment.getWidth()));\r
720     }\r
721     else if (source == zappoColour)\r
722     {\r
723       changeColour(new ZappoColourScheme());\r
724     }\r
725     else if (source == taylorColour)\r
726     {\r
727       changeColour(new TaylorColourScheme());\r
728     }\r
729     else if (source == hydrophobicityColour)\r
730     {\r
731       changeColour(new HydrophobicColourScheme());\r
732     }\r
733     else if (source == helixColour)\r
734     {\r
735       changeColour(new HelixColourScheme());\r
736     }\r
737     else if (source == strandColour)\r
738     {\r
739       changeColour(new StrandColourScheme());\r
740     }\r
741     else if (source == turnColour)\r
742     {\r
743       changeColour(new TurnColourScheme());\r
744     }\r
745     else if (source == buriedColour)\r
746     {\r
747       changeColour(new BuriedColourScheme());\r
748     }\r
749     else if (source == nucleotideColour)\r
750     {\r
751       changeColour(new NucleotideColourScheme());\r
752     }\r
753     else if (source == modifyPID)\r
754     {\r
755       modifyPID_actionPerformed();\r
756     }\r
757     else if (source == modifyConservation)\r
758     {\r
759       modifyConservation_actionPerformed();\r
760     }\r
761     else if (source == userDefinedColour)\r
762     {\r
763       new UserDefinedColours(alignPanel, null);\r
764     }\r
765     else if (source == PIDColour)\r
766     {\r
767       changeColour(new PIDColourScheme());\r
768     }\r
769     else if (source == BLOSUM62Colour)\r
770     {\r
771       changeColour(new Blosum62ColourScheme());\r
772     }\r
773     else if (source == annotationColour)\r
774     {\r
775       new AnnotationColourChooser(viewport, alignPanel);\r
776     }\r
777     else if (source == sortPairwiseMenuItem)\r
778     {\r
779       sortPairwiseMenuItem_actionPerformed();\r
780     }\r
781     else if (source == sortIDMenuItem)\r
782     {\r
783       sortIDMenuItem_actionPerformed();\r
784     }\r
785     else if (source == sortGroupMenuItem)\r
786     {\r
787       sortGroupMenuItem_actionPerformed();\r
788     }\r
789     else if (source == removeRedundancyMenuItem)\r
790     {\r
791       removeRedundancyMenuItem_actionPerformed();\r
792     }\r
793     else if (source == pairwiseAlignmentMenuItem)\r
794     {\r
795       pairwiseAlignmentMenuItem_actionPerformed();\r
796     }\r
797     else if (source == PCAMenuItem)\r
798     {\r
799       PCAMenuItem_actionPerformed();\r
800     }\r
801     else if (source == averageDistanceTreeMenuItem)\r
802     {\r
803       averageDistanceTreeMenuItem_actionPerformed();\r
804     }\r
805     else if (source == neighbourTreeMenuItem)\r
806     {\r
807       neighbourTreeMenuItem_actionPerformed();\r
808     }\r
809     else if (source == njTreeBlosumMenuItem)\r
810     {\r
811       njTreeBlosumMenuItem_actionPerformed();\r
812     }\r
813     else if (source == avDistanceTreeBlosumMenuItem)\r
814     {\r
815       avTreeBlosumMenuItem_actionPerformed();\r
816     }\r
817     else if (source == documentation)\r
818     {\r
819       documentation_actionPerformed();\r
820     }\r
821     else if (source == about)\r
822     {\r
823       about_actionPerformed();\r
824     }\r
825 \r
826   }\r
827 \r
828   public void inputText_actionPerformed()\r
829   {\r
830     CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this);\r
831     Frame frame = new Frame();\r
832     frame.add(cap);\r
833     jalview.bin.JalviewLite.addFrame(frame, "Cut & Paste Input", 500, 500);\r
834   }\r
835 \r
836   protected void outputText_actionPerformed(ActionEvent e)\r
837   {\r
838     CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this);\r
839     Frame frame = new Frame();\r
840     frame.add(cap);\r
841     jalview.bin.JalviewLite.addFrame(frame,\r
842                                      "Alignment output - " + e.getActionCommand(),\r
843                                      600, 500);\r
844     cap.setText(new AppletFormatAdapter().formatSequences(e.getActionCommand(),\r
845         viewport.getAlignment(),\r
846         viewport.showJVSuffix));\r
847   }\r
848 \r
849   public void loadAnnotations()\r
850   {\r
851     CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this);\r
852     cap.setText("Paste your features / annotations file here.");\r
853     cap.setAnnotationImport();\r
854     Frame frame = new Frame();\r
855     frame.add(cap);\r
856     jalview.bin.JalviewLite.addFrame(frame, "Paste Annotations ", 400, 300);\r
857 \r
858   }\r
859 \r
860   public String outputAnnotations(boolean displayTextbox)\r
861   {\r
862     String annotation = new AnnotationFile().printAnnotations(\r
863         viewport.showAnnotation ? viewport.alignment.getAlignmentAnnotation() : null,\r
864         viewport.alignment.getGroups());\r
865 \r
866     if (displayTextbox)\r
867     {\r
868       CutAndPasteTransfer cap = new CutAndPasteTransfer(false, this);\r
869       Frame frame = new Frame();\r
870       frame.add(cap);\r
871       jalview.bin.JalviewLite.addFrame(frame,\r
872                                        "Annotations",\r
873                                        600, 500);\r
874       cap.setText(annotation);\r
875     }\r
876 \r
877     return annotation;\r
878   }\r
879 \r
880   public String outputFeatures(boolean displayTextbox, String format)\r
881   {\r
882     String features;\r
883     if (format.equalsIgnoreCase("Jalview"))\r
884     {\r
885       features = new FeaturesFile().printJalviewFormat(\r
886           viewport.alignment.getSequencesArray(),\r
887           viewport.featuresDisplayed);\r
888     }\r
889     else\r
890     {\r
891       features = new FeaturesFile().printGFFFormat(\r
892           viewport.alignment.getSequencesArray(),\r
893           viewport.featuresDisplayed);\r
894     }\r
895 \r
896     if (displayTextbox)\r
897     {\r
898       CutAndPasteTransfer cap = new CutAndPasteTransfer(false, this);\r
899       Frame frame = new Frame();\r
900       frame.add(cap);\r
901       jalview.bin.JalviewLite.addFrame(frame,\r
902                                        "Features",\r
903                                        600, 500);\r
904 \r
905       cap.setText(features);\r
906     }\r
907 \r
908     return features;\r
909   }\r
910 \r
911   void launchFullApplication()\r
912   {\r
913     StringBuffer url = new StringBuffer(jalviewServletURL);\r
914 \r
915     url.append("?open=" +\r
916                appendProtocol(viewport.applet.getParameter("file")));\r
917 \r
918     if (viewport.applet.getParameter("features") != null)\r
919     {\r
920       url.append("&features=");\r
921       url.append(appendProtocol(viewport.applet.getParameter("features")));\r
922     }\r
923 \r
924     if (viewport.applet.getParameter("annotations") != null)\r
925     {\r
926       url.append("&annotations=");\r
927       url.append(appendProtocol(viewport.applet.getParameter("annotations")));\r
928     }\r
929 \r
930     if (viewport.applet.getParameter("jnetfile") != null)\r
931     {\r
932       url.append("&annotations=");\r
933       url.append(appendProtocol(viewport.applet.getParameter("jnetfile")));\r
934     }\r
935 \r
936     if (viewport.applet.getParameter("defaultColour") != null)\r
937     {\r
938       url.append("&colour=" +\r
939                  removeWhiteSpace(viewport.applet.getParameter("defaultColour"))\r
940           );\r
941     }\r
942 \r
943     if (viewport.applet.getParameter("userDefinedColour") != null)\r
944     {\r
945       url.append("&colour=" +\r
946                  removeWhiteSpace(viewport.applet.getParameter(\r
947           "userDefinedColour"))\r
948           );\r
949     }\r
950 \r
951     showURL(url.toString(), "FULL_APP");\r
952   }\r
953 \r
954   String removeWhiteSpace(String colour)\r
955   {\r
956     StringBuffer sb = new StringBuffer();\r
957     for (int i = 0; i < colour.length(); i++)\r
958     {\r
959       if (Character.isWhitespace(colour.charAt(i)))\r
960       {\r
961         sb.append("%20");\r
962       }\r
963       else\r
964       {\r
965         sb.append(colour.charAt(i));\r
966       }\r
967     }\r
968 \r
969     return sb.toString();\r
970   }\r
971 \r
972   String appendProtocol(String url)\r
973   {\r
974     try\r
975     {\r
976       new URL(url);\r
977     }\r
978     catch (java.net.MalformedURLException ex)\r
979     {\r
980       url = viewport.applet.getCodeBase() + url;\r
981     }\r
982     return url;\r
983   }\r
984 \r
985   public void closeMenuItem_actionPerformed()\r
986   {\r
987     PaintRefresher.RemoveComponent(alignPanel);\r
988     PaintRefresher.RemoveComponent(alignPanel.seqPanel.seqCanvas);\r
989     PaintRefresher.RemoveComponent(alignPanel.idPanel.idCanvas);\r
990 \r
991     if (PaintRefresher.components.size() == 0 && viewport.applet == null)\r
992     {\r
993       System.exit(0);\r
994     }\r
995 \r
996     this.dispose();\r
997   }\r
998 \r
999   /**\r
1000    * DOCUMENT ME!\r
1001    */\r
1002   void updateEditMenuBar()\r
1003   {\r
1004 \r
1005     if (viewport.historyList.size() > 0)\r
1006     {\r
1007       undoMenuItem.setEnabled(true);\r
1008       CommandI command = (CommandI) viewport.historyList.peek();\r
1009       undoMenuItem.setLabel("Undo " + command.getDescription());\r
1010     }\r
1011     else\r
1012     {\r
1013       undoMenuItem.setEnabled(false);\r
1014       undoMenuItem.setLabel("Undo");\r
1015     }\r
1016 \r
1017     if (viewport.redoList.size() > 0)\r
1018     {\r
1019       redoMenuItem.setEnabled(true);\r
1020 \r
1021       CommandI command = (CommandI) viewport.redoList.peek();\r
1022       redoMenuItem.setLabel("Redo " + command.getDescription());\r
1023     }\r
1024     else\r
1025     {\r
1026       redoMenuItem.setEnabled(false);\r
1027       redoMenuItem.setLabel("Redo");\r
1028     }\r
1029   }\r
1030 \r
1031   public void addHistoryItem(CommandI command)\r
1032   {\r
1033     if (command.getSize() > 0)\r
1034     {\r
1035       viewport.historyList.push(command);\r
1036       viewport.redoList.removeAllElements();\r
1037       updateEditMenuBar();\r
1038       viewport.hasHiddenColumns = viewport.colSel.getHiddenColumns() != null;\r
1039     }\r
1040   }\r
1041 \r
1042   /**\r
1043    * DOCUMENT ME!\r
1044    *\r
1045    * @param e DOCUMENT ME!\r
1046    */\r
1047   protected void undoMenuItem_actionPerformed()\r
1048   {\r
1049     if (viewport.historyList.size() < 1)\r
1050     {\r
1051       return;\r
1052     }\r
1053 \r
1054     CommandI command = (CommandI) viewport.historyList.pop();\r
1055     viewport.redoList.push(command);\r
1056     command.undoCommand();\r
1057 \r
1058     AlignViewport originalSource = getOriginatingSource(command);\r
1059 \r
1060     originalSource.hasHiddenColumns = viewport.colSel.getHiddenColumns() != null;\r
1061     updateEditMenuBar();\r
1062     originalSource.firePropertyChange("alignment", null,\r
1063                                       originalSource.alignment.getSequences());\r
1064   }\r
1065 \r
1066   /**\r
1067    * DOCUMENT ME!\r
1068    *\r
1069    * @param e DOCUMENT ME!\r
1070    */\r
1071   protected void redoMenuItem_actionPerformed()\r
1072   {\r
1073     if (viewport.redoList.size() < 1)\r
1074     {\r
1075       return;\r
1076     }\r
1077 \r
1078     CommandI command = (CommandI) viewport.redoList.pop();\r
1079     viewport.historyList.push(command);\r
1080     command.doCommand();\r
1081 \r
1082     AlignViewport originalSource = getOriginatingSource(command);\r
1083     originalSource.hasHiddenColumns = viewport.colSel.getHiddenColumns() != null;\r
1084 \r
1085     updateEditMenuBar();\r
1086     originalSource.firePropertyChange("alignment", null,\r
1087                                       originalSource.alignment.getSequences());\r
1088   }\r
1089 \r
1090   AlignViewport getOriginatingSource(CommandI command)\r
1091   {\r
1092     AlignViewport originalSource = null;\r
1093     //For sequence removal and addition, we need to fire\r
1094     //the property change event FROM the viewport where the\r
1095     //original alignment was altered\r
1096     AlignmentI al = null;\r
1097     if (command instanceof EditCommand)\r
1098     {\r
1099       EditCommand editCommand = (EditCommand) command;\r
1100       al = editCommand.getAlignment();\r
1101       Vector comps = (Vector) PaintRefresher.components\r
1102           .get(viewport.getSequenceSetId());\r
1103       for (int i = 0; i < comps.size(); i++)\r
1104       {\r
1105         if (comps.elementAt(i) instanceof AlignmentPanel)\r
1106         {\r
1107           if (al == ( (AlignmentPanel) comps.elementAt(i)).av.alignment)\r
1108           {\r
1109             originalSource = ( (AlignmentPanel) comps.elementAt(i)).av;\r
1110             break;\r
1111           }\r
1112         }\r
1113       }\r
1114     }\r
1115 \r
1116     if (originalSource == null)\r
1117     {\r
1118       //The original view is closed, we must validate\r
1119       //the current view against the closed view first\r
1120       if (al != null)\r
1121       {\r
1122         PaintRefresher.validateSequences(al, viewport.alignment);\r
1123       }\r
1124 \r
1125       originalSource = viewport;\r
1126     }\r
1127 \r
1128     return originalSource;\r
1129   }\r
1130 \r
1131   public void moveSelectedSequences(boolean up)\r
1132   {\r
1133     SequenceGroup sg = viewport.getSelectionGroup();\r
1134     if (sg == null)\r
1135     {\r
1136       return;\r
1137     }\r
1138 \r
1139     if (up)\r
1140     {\r
1141       for (int i = 1; i < viewport.alignment.getHeight(); i++)\r
1142       {\r
1143         SequenceI seq = viewport.alignment.getSequenceAt(i);\r
1144         if (!sg.getSequences(null).contains(seq))\r
1145         {\r
1146           continue;\r
1147         }\r
1148 \r
1149         SequenceI temp = viewport.alignment.getSequenceAt(i - 1);\r
1150         if (sg.getSequences(null).contains(temp))\r
1151         {\r
1152           continue;\r
1153         }\r
1154 \r
1155         viewport.alignment.getSequences().setElementAt(temp, i);\r
1156         viewport.alignment.getSequences().setElementAt(seq, i - 1);\r
1157       }\r
1158     }\r
1159     else\r
1160     {\r
1161       for (int i = viewport.alignment.getHeight() - 2; i > -1; i--)\r
1162       {\r
1163         SequenceI seq = viewport.alignment.getSequenceAt(i);\r
1164         if (!sg.getSequences(viewport.hiddenRepSequences).contains(seq))\r
1165         {\r
1166           continue;\r
1167         }\r
1168 \r
1169         SequenceI temp = viewport.alignment.getSequenceAt(i + 1);\r
1170         if (sg.getSequences(viewport.hiddenRepSequences).contains(temp))\r
1171         {\r
1172           continue;\r
1173         }\r
1174 \r
1175         viewport.alignment.getSequences().setElementAt(temp, i);\r
1176         viewport.alignment.getSequences().setElementAt(seq, i + 1);\r
1177       }\r
1178     }\r
1179 \r
1180     alignPanel.repaint();\r
1181   }\r
1182 \r
1183   static StringBuffer copiedSequences;\r
1184   static Vector copiedHiddenColumns;\r
1185   protected void copy_actionPerformed()\r
1186   {\r
1187     if (viewport.getSelectionGroup() == null)\r
1188     {\r
1189       return;\r
1190     }\r
1191 \r
1192     SequenceGroup sg = viewport.getSelectionGroup();\r
1193     copiedSequences = new StringBuffer();\r
1194     Hashtable orderedSeqs = new Hashtable();\r
1195     for (int i = 0; i < sg.getSize(); i++)\r
1196     {\r
1197       SequenceI seq = sg.getSequenceAt(i);\r
1198       int index = viewport.alignment.findIndex(seq);\r
1199       orderedSeqs.put(index + "", seq);\r
1200     }\r
1201 \r
1202     int index = 0, startRes, endRes;\r
1203     char ch;\r
1204 \r
1205     if (viewport.hasHiddenColumns && viewport.getSelectionGroup() != null)\r
1206     {\r
1207       copiedHiddenColumns = new Vector();\r
1208       int hiddenOffset = viewport.getSelectionGroup().getStartRes();\r
1209       for (int i = 0; i < viewport.getColumnSelection().getHiddenColumns().size();\r
1210            i++)\r
1211       {\r
1212         int[] region = (int[])\r
1213             viewport.getColumnSelection().getHiddenColumns().elementAt(i);\r
1214 \r
1215         copiedHiddenColumns.addElement(new int[]\r
1216                                        {region[0] - hiddenOffset,\r
1217                                        region[1] - hiddenOffset});\r
1218       }\r
1219     }\r
1220     else\r
1221     {\r
1222       copiedHiddenColumns = null;\r
1223     }\r
1224 \r
1225     for (int i = 0; i < sg.getSize(); i++)\r
1226     {\r
1227       SequenceI seq = null;\r
1228 \r
1229       while (seq == null)\r
1230       {\r
1231         if (orderedSeqs.containsKey(index + ""))\r
1232         {\r
1233           seq = (SequenceI) orderedSeqs.get(index + "");\r
1234           index++;\r
1235 \r
1236           break;\r
1237         }\r
1238         else\r
1239         {\r
1240           index++;\r
1241         }\r
1242       }\r
1243 \r
1244       //FIND START RES\r
1245       //Returns residue following index if gap\r
1246       startRes = seq.findPosition(sg.getStartRes());\r
1247 \r
1248       //FIND END RES\r
1249       //Need to find the residue preceeding index if gap\r
1250       endRes = 0;\r
1251 \r
1252       for (int j = 0; j < sg.getEndRes() + 1 && j < seq.getLength(); j++)\r
1253       {\r
1254         ch = seq.getCharAt(j);\r
1255         if (!jalview.util.Comparison.isGap( (ch)))\r
1256         {\r
1257           endRes++;\r
1258         }\r
1259       }\r
1260 \r
1261       if (endRes > 0)\r
1262       {\r
1263         endRes += seq.getStart() - 1;\r
1264       }\r
1265 \r
1266       copiedSequences.append(seq.getName() + "\t" +\r
1267                              startRes + "\t" +\r
1268                              endRes + "\t" +\r
1269                              seq.getSequenceAsString(sg.getStartRes(),\r
1270           sg.getEndRes() + 1) + "\n");\r
1271     }\r
1272 \r
1273   }\r
1274 \r
1275   protected void pasteNew_actionPerformed()\r
1276   {\r
1277     paste(true);\r
1278   }\r
1279 \r
1280   protected void pasteThis_actionPerformed()\r
1281   {\r
1282     paste(false);\r
1283   }\r
1284 \r
1285   void paste(boolean newAlignment)\r
1286   {\r
1287     try\r
1288     {\r
1289 \r
1290       if (copiedSequences == null)\r
1291       {\r
1292         return;\r
1293       }\r
1294 \r
1295       StringTokenizer st = new StringTokenizer(copiedSequences.toString());\r
1296       Vector seqs = new Vector();\r
1297       while (st.hasMoreElements())\r
1298       {\r
1299         String name = st.nextToken();\r
1300         int start = Integer.parseInt(st.nextToken());\r
1301         int end = Integer.parseInt(st.nextToken());\r
1302         seqs.addElement(new Sequence(name, st.nextToken(), start, end));\r
1303       }\r
1304       SequenceI[] newSeqs = new SequenceI[seqs.size()];\r
1305       for (int i = 0; i < seqs.size(); i++)\r
1306       {\r
1307         newSeqs[i] = (SequenceI) seqs.elementAt(i);\r
1308       }\r
1309 \r
1310       if (newAlignment)\r
1311       {\r
1312         String newtitle = new String("Copied sequences");\r
1313         if (getTitle().startsWith("Copied sequences"))\r
1314         {\r
1315           newtitle = getTitle();\r
1316         }\r
1317         else\r
1318         {\r
1319           newtitle = newtitle.concat("- from " + getTitle());\r
1320         }\r
1321         AlignFrame af = new AlignFrame(new Alignment(newSeqs),\r
1322                                        viewport.applet,\r
1323                                        newtitle,\r
1324                                        false);\r
1325         if (copiedHiddenColumns != null)\r
1326         {\r
1327           for (int i = 0; i < copiedHiddenColumns.size(); i++)\r
1328           {\r
1329             int[] region = (int[]) copiedHiddenColumns.elementAt(i);\r
1330             af.viewport.hideColumns(region[0], region[1]);\r
1331           }\r
1332         }\r
1333 \r
1334         jalview.bin.JalviewLite.addFrame(af, newtitle, DEFAULT_WIDTH,\r
1335                                          DEFAULT_HEIGHT);\r
1336       }\r
1337       else\r
1338       {\r
1339         addSequences(newSeqs);\r
1340       }\r
1341 \r
1342     }\r
1343     catch (Exception ex)\r
1344     {} // could be anything being pasted in here\r
1345 \r
1346   }\r
1347 \r
1348   void addSequences(SequenceI[] seqs)\r
1349   {\r
1350     for (int i = 0; i < seqs.length; i++)\r
1351     {\r
1352       viewport.alignment.addSequence(seqs[i]);\r
1353     }\r
1354 \r
1355     //!newAlignment\r
1356     addHistoryItem(new EditCommand(\r
1357         "Add sequences",\r
1358         EditCommand.PASTE,\r
1359         seqs,\r
1360         0,\r
1361         viewport.alignment.getWidth(),\r
1362         viewport.alignment)\r
1363         );\r
1364 \r
1365     viewport.setEndSeq(viewport.alignment.getHeight());\r
1366     viewport.alignment.getWidth();\r
1367     viewport.firePropertyChange("alignment", null,\r
1368                                 viewport.alignment.getSequences());\r
1369 \r
1370   }\r
1371 \r
1372   protected void cut_actionPerformed()\r
1373   {\r
1374     copy_actionPerformed();\r
1375     delete_actionPerformed();\r
1376   }\r
1377 \r
1378   protected void delete_actionPerformed()\r
1379   {\r
1380 \r
1381     SequenceGroup sg = viewport.getSelectionGroup();\r
1382     if (sg == null)\r
1383     {\r
1384       return;\r
1385     }\r
1386 \r
1387     Vector seqs = new Vector();\r
1388     SequenceI seq;\r
1389     for (int i = 0; i < sg.getSize(); i++)\r
1390     {\r
1391       seq = sg.getSequenceAt(i);\r
1392       seqs.addElement(seq);\r
1393     }\r
1394 \r
1395     // If the cut affects all sequences, remove highlighted columns\r
1396     if (sg.getSize() == viewport.alignment.getHeight())\r
1397     {\r
1398       viewport.getColumnSelection().removeElements(sg.getStartRes(),\r
1399           sg.getEndRes() + 1);\r
1400     }\r
1401 \r
1402     SequenceI[] cut = new SequenceI[seqs.size()];\r
1403     for (int i = 0; i < seqs.size(); i++)\r
1404     {\r
1405       cut[i] = (SequenceI) seqs.elementAt(i);\r
1406     }\r
1407 \r
1408     /*\r
1409          //ADD HISTORY ITEM\r
1410      */\r
1411     addHistoryItem(new EditCommand("Cut Sequences",\r
1412                                    EditCommand.CUT,\r
1413                                    cut,\r
1414                                    sg.getStartRes(),\r
1415                                    sg.getEndRes() - sg.getStartRes() + 1,\r
1416                                    viewport.alignment));\r
1417 \r
1418     viewport.setSelectionGroup(null);\r
1419     viewport.alignment.deleteGroup(sg);\r
1420 \r
1421     viewport.firePropertyChange("alignment", null,\r
1422                                 viewport.getAlignment().getSequences());\r
1423 \r
1424     if (viewport.getAlignment().getHeight() < 1)\r
1425     {\r
1426       this.setVisible(false);\r
1427     }\r
1428   }\r
1429 \r
1430   protected void deleteGroups_actionPerformed()\r
1431   {\r
1432     viewport.alignment.deleteAllGroups();\r
1433     viewport.sequenceColours = null;\r
1434     viewport.setSelectionGroup(null);\r
1435 \r
1436     alignPanel.repaint();\r
1437   }\r
1438 \r
1439   public void selectAllSequenceMenuItem_actionPerformed()\r
1440   {\r
1441     SequenceGroup sg = new SequenceGroup();\r
1442     for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)\r
1443     {\r
1444       sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);\r
1445     }\r
1446     sg.setEndRes(viewport.alignment.getWidth() - 1);\r
1447     viewport.setSelectionGroup(sg);\r
1448     alignPanel.repaint();\r
1449     PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());\r
1450   }\r
1451 \r
1452   public void deselectAllSequenceMenuItem_actionPerformed()\r
1453   {\r
1454     if (viewport.cursorMode)\r
1455     {\r
1456       alignPanel.seqPanel.keyboardNo1 = null;\r
1457       alignPanel.seqPanel.keyboardNo2 = null;\r
1458     }\r
1459     viewport.setSelectionGroup(null);\r
1460     viewport.getColumnSelection().clear();\r
1461     viewport.setSelectionGroup(null);\r
1462     alignPanel.idPanel.idCanvas.searchResults = null;\r
1463     alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);\r
1464     alignPanel.repaint();\r
1465     PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());\r
1466   }\r
1467 \r
1468   public void invertSequenceMenuItem_actionPerformed()\r
1469   {\r
1470     SequenceGroup sg = viewport.getSelectionGroup();\r
1471     for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)\r
1472     {\r
1473       sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);\r
1474     }\r
1475 \r
1476     PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());\r
1477   }\r
1478 \r
1479   void trimAlignment(boolean trimLeft)\r
1480   {\r
1481     ColumnSelection colSel = viewport.getColumnSelection();\r
1482     int column;\r
1483 \r
1484     if (colSel.size() > 0)\r
1485     {\r
1486       if (trimLeft)\r
1487       {\r
1488         column = colSel.getMin();\r
1489       }\r
1490       else\r
1491       {\r
1492         column = colSel.getMax();\r
1493       }\r
1494 \r
1495       SequenceI[] seqs;\r
1496       if (viewport.getSelectionGroup() != null)\r
1497       {\r
1498         seqs = viewport.getSelectionGroup().getSequencesAsArray(viewport.\r
1499             hiddenRepSequences);\r
1500       }\r
1501       else\r
1502       {\r
1503         seqs = viewport.alignment.getSequencesArray();\r
1504       }\r
1505 \r
1506       TrimRegionCommand trimRegion;\r
1507       if (trimLeft)\r
1508       {\r
1509         trimRegion = new TrimRegionCommand("Remove Left",\r
1510                                            TrimRegionCommand.TRIM_LEFT,\r
1511                                            seqs,\r
1512                                            column,\r
1513                                            viewport.alignment,\r
1514                                            viewport.colSel,\r
1515                                            viewport.selectionGroup);\r
1516         viewport.setStartRes(0);\r
1517       }\r
1518       else\r
1519       {\r
1520         trimRegion = new TrimRegionCommand("Remove Right",\r
1521                                            TrimRegionCommand.TRIM_RIGHT,\r
1522                                            seqs,\r
1523                                            column,\r
1524                                            viewport.alignment,\r
1525                                            viewport.colSel,\r
1526                                            viewport.selectionGroup);\r
1527       }\r
1528 \r
1529       statusBar.setText("Removed " + trimRegion.getSize() + " columns.");\r
1530 \r
1531       addHistoryItem(trimRegion);\r
1532 \r
1533       Vector groups = viewport.alignment.getGroups();\r
1534 \r
1535       for (int i = 0; i < groups.size(); i++)\r
1536       {\r
1537         SequenceGroup sg = (SequenceGroup) groups.elementAt(i);\r
1538 \r
1539         if ( (trimLeft && !sg.adjustForRemoveLeft(column))\r
1540             || (!trimLeft && !sg.adjustForRemoveRight(column)))\r
1541         {\r
1542           viewport.alignment.deleteGroup(sg);\r
1543         }\r
1544       }\r
1545 \r
1546       viewport.firePropertyChange("alignment", null,\r
1547                                   viewport.getAlignment().getSequences());\r
1548     }\r
1549   }\r
1550 \r
1551   public void removeGappedColumnMenuItem_actionPerformed()\r
1552   {\r
1553     int start = 0, end = viewport.alignment.getWidth() - 1;\r
1554 \r
1555     SequenceI[] seqs;\r
1556     if (viewport.getSelectionGroup() != null)\r
1557     {\r
1558       seqs = viewport.getSelectionGroup().getSequencesAsArray(viewport.\r
1559           hiddenRepSequences);\r
1560       start = viewport.getSelectionGroup().getStartRes();\r
1561       end = viewport.getSelectionGroup().getEndRes();\r
1562     }\r
1563     else\r
1564     {\r
1565       seqs = viewport.alignment.getSequencesArray();\r
1566     }\r
1567 \r
1568     RemoveGapColCommand removeGapCols =\r
1569         new RemoveGapColCommand("Remove Gapped Columns",\r
1570                                 seqs,\r
1571                                 start, end,\r
1572                                 viewport.alignment);\r
1573 \r
1574     addHistoryItem(removeGapCols);\r
1575 \r
1576     statusBar.setText("Removed " + removeGapCols.getSize() + " empty columns.");\r
1577 \r
1578     //This is to maintain viewport position on first residue\r
1579     //of first sequence\r
1580     SequenceI seq = viewport.alignment.getSequenceAt(0);\r
1581     int startRes = seq.findPosition(viewport.startRes);\r
1582     // ShiftList shifts;\r
1583     // viewport.getAlignment().removeGaps(shifts=new ShiftList());\r
1584     // edit.alColumnChanges=shifts.getInverse();\r
1585     // if (viewport.hasHiddenColumns)\r
1586     //   viewport.getColumnSelection().compensateForEdits(shifts);\r
1587     viewport.setStartRes(seq.findIndex(startRes) - 1);\r
1588     viewport.firePropertyChange("alignment", null,\r
1589                                 viewport.getAlignment().getSequences());\r
1590 \r
1591   }\r
1592 \r
1593   public void removeAllGapsMenuItem_actionPerformed()\r
1594   {\r
1595     int start = 0, end = viewport.alignment.getWidth() - 1;\r
1596 \r
1597     SequenceI[] seqs;\r
1598     if (viewport.getSelectionGroup() != null)\r
1599     {\r
1600       seqs = viewport.getSelectionGroup().getSequencesAsArray(viewport.\r
1601           hiddenRepSequences);\r
1602       start = viewport.getSelectionGroup().getStartRes();\r
1603       end = viewport.getSelectionGroup().getEndRes();\r
1604     }\r
1605     else\r
1606     {\r
1607       seqs = viewport.alignment.getSequencesArray();\r
1608     }\r
1609 \r
1610     //This is to maintain viewport position on first residue\r
1611     //of first sequence\r
1612     SequenceI seq = viewport.alignment.getSequenceAt(0);\r
1613     int startRes = seq.findPosition(viewport.startRes);\r
1614 \r
1615     addHistoryItem(new RemoveGapsCommand("Remove Gaps",\r
1616                                          seqs,\r
1617                                          start, end,\r
1618                                          viewport.alignment));\r
1619 \r
1620     viewport.setStartRes(seq.findIndex(startRes) - 1);\r
1621 \r
1622     viewport.firePropertyChange("alignment", null,\r
1623                                 viewport.getAlignment().getSequences());\r
1624 \r
1625   }\r
1626 \r
1627   public void findMenuItem_actionPerformed()\r
1628   {\r
1629     new Finder(alignPanel);\r
1630   }\r
1631 \r
1632   public void newView()\r
1633   {\r
1634     AlignmentI newal;\r
1635     if (viewport.hasHiddenRows)\r
1636     {\r
1637       newal = new Alignment(viewport.getAlignment().\r
1638                             getHiddenSequences()\r
1639                             .getFullAlignment().\r
1640                             getSequencesArray());\r
1641     }\r
1642     else\r
1643     {\r
1644       newal = new Alignment(viewport.alignment.getSequencesArray());\r
1645     }\r
1646 \r
1647     if (viewport.alignment.getAlignmentAnnotation() != null)\r
1648     {\r
1649       for (int i = 0; i < viewport.alignment.getAlignmentAnnotation().length; i++)\r
1650       {\r
1651         if (!viewport.alignment.getAlignmentAnnotation()[i].autoCalculated)\r
1652         {\r
1653           newal.addAnnotation(viewport.alignment.getAlignmentAnnotation()[i]);\r
1654         }\r
1655       }\r
1656     }\r
1657 \r
1658     AlignFrame newaf = new AlignFrame(newal,\r
1659                                       viewport.applet,\r
1660                                       "",\r
1661                                       false);\r
1662 \r
1663     newaf.viewport.sequenceSetID = alignPanel.av.getSequenceSetId();\r
1664     PaintRefresher.Register(alignPanel, alignPanel.av.getSequenceSetId());\r
1665     PaintRefresher.Register(newaf.alignPanel,\r
1666                             newaf.alignPanel.av.getSequenceSetId());\r
1667 \r
1668     PaintRefresher.Register(newaf.alignPanel.idPanel.idCanvas,\r
1669                             newaf.alignPanel.av.getSequenceSetId());\r
1670     PaintRefresher.Register(newaf.alignPanel.seqPanel.seqCanvas,\r
1671                             newaf.alignPanel.av.getSequenceSetId());\r
1672 \r
1673     Vector comps = (Vector) PaintRefresher.components.get(viewport.\r
1674         getSequenceSetId());\r
1675     int viewSize = -1;\r
1676     for (int i = 0; i < comps.size(); i++)\r
1677     {\r
1678       if (comps.elementAt(i) instanceof AlignmentPanel)\r
1679       {\r
1680         viewSize++;\r
1681       }\r
1682     }\r
1683 \r
1684     String title = new String(this.getTitle());\r
1685     if (title.indexOf("(View") > -1)\r
1686     {\r
1687       title = title.substring(0, title.indexOf("(View"));\r
1688     }\r
1689 \r
1690     title += "(View " + viewSize + ")";\r
1691 \r
1692     newaf.setTitle(title.toString());\r
1693 \r
1694     newaf.viewport.historyList = viewport.historyList;\r
1695     newaf.viewport.redoList = viewport.redoList;\r
1696 \r
1697   }\r
1698 \r
1699   public void seqLimits_itemStateChanged()\r
1700   {\r
1701     viewport.setShowJVSuffix(seqLimits.getState());\r
1702     alignPanel.fontChanged();\r
1703     alignPanel.repaint();\r
1704   }\r
1705 \r
1706   protected void colourTextMenuItem_actionPerformed()\r
1707   {\r
1708     viewport.setColourText(colourTextMenuItem.getState());\r
1709     alignPanel.repaint();\r
1710   }\r
1711 \r
1712   protected void wrapMenuItem_actionPerformed()\r
1713   {\r
1714     viewport.setWrapAlignment(wrapMenuItem.getState());\r
1715     alignPanel.setWrapAlignment(wrapMenuItem.getState());\r
1716     scaleAbove.setEnabled(wrapMenuItem.getState());\r
1717     scaleLeft.setEnabled(wrapMenuItem.getState());\r
1718     scaleRight.setEnabled(wrapMenuItem.getState());\r
1719     alignPanel.repaint();\r
1720   }\r
1721 \r
1722   public void overviewMenuItem_actionPerformed()\r
1723   {\r
1724     if (alignPanel.overviewPanel != null)\r
1725     {\r
1726       return;\r
1727     }\r
1728 \r
1729     Frame frame = new Frame();\r
1730     OverviewPanel overview = new OverviewPanel(alignPanel);\r
1731     frame.add(overview);\r
1732     // +50 must allow for applet frame window\r
1733     jalview.bin.JalviewLite.addFrame(frame, "Overview " + this.getTitle(),\r
1734                                      overview.getPreferredSize().width,\r
1735                                      overview.getPreferredSize().height + 50);\r
1736 \r
1737     frame.pack();\r
1738     frame.addWindowListener(new WindowAdapter()\r
1739     {\r
1740       public void windowClosing(WindowEvent e)\r
1741       {\r
1742         alignPanel.setOverviewPanel(null);\r
1743       };\r
1744     });\r
1745 \r
1746     alignPanel.setOverviewPanel(overview);\r
1747 \r
1748   }\r
1749 \r
1750   void changeColour(ColourSchemeI cs)\r
1751   {\r
1752     int threshold = 0;\r
1753 \r
1754     if (cs != null)\r
1755     {\r
1756       if (viewport.getAbovePIDThreshold())\r
1757       {\r
1758         threshold = SliderPanel.setPIDSliderSource(alignPanel, cs, "Background");\r
1759 \r
1760         cs.setThreshold(threshold, viewport.getIgnoreGapsConsensus());\r
1761 \r
1762         viewport.setGlobalColourScheme(cs);\r
1763       }\r
1764       else\r
1765       {\r
1766         cs.setThreshold(0, viewport.getIgnoreGapsConsensus());\r
1767       }\r
1768 \r
1769       if (viewport.getConservationSelected())\r
1770       {\r
1771 \r
1772         Alignment al = (Alignment) viewport.alignment;\r
1773         Conservation c = new Conservation("All",\r
1774                                           ResidueProperties.propHash, 3,\r
1775                                           al.getSequences(), 0,\r
1776                                           al.getWidth() - 1);\r
1777 \r
1778         c.calculate();\r
1779         c.verdict(false, viewport.ConsPercGaps);\r
1780 \r
1781         cs.setConservation(c);\r
1782 \r
1783         cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel, cs,\r
1784             "Background"));\r
1785 \r
1786       }\r
1787       else\r
1788       {\r
1789         cs.setConservation(null);\r
1790       }\r
1791 \r
1792       cs.setConsensus(viewport.hconsensus);\r
1793 \r
1794     }\r
1795     viewport.setGlobalColourScheme(cs);\r
1796 \r
1797     if (viewport.getColourAppliesToAllGroups())\r
1798     {\r
1799       Vector groups = viewport.alignment.getGroups();\r
1800       for (int i = 0; i < groups.size(); i++)\r
1801       {\r
1802         SequenceGroup sg = (SequenceGroup) groups.elementAt(i);\r
1803 \r
1804         if (cs == null)\r
1805         {\r
1806           sg.cs = null;\r
1807           continue;\r
1808         }\r
1809         if (cs instanceof ClustalxColourScheme)\r
1810         {\r
1811           sg.cs = new ClustalxColourScheme(\r
1812               sg.getSequences(viewport.hiddenRepSequences),\r
1813               sg.getWidth());\r
1814         }\r
1815         else\r
1816         {\r
1817           try\r
1818           {\r
1819             sg.cs = (ColourSchemeI) cs.getClass().newInstance();\r
1820           }\r
1821           catch (Exception ex)\r
1822           {\r
1823             ex.printStackTrace();\r
1824             sg.cs = cs;\r
1825           }\r
1826         }\r
1827 \r
1828         if (viewport.getAbovePIDThreshold()\r
1829             || cs instanceof PIDColourScheme\r
1830             || cs instanceof Blosum62ColourScheme)\r
1831         {\r
1832           sg.cs.setThreshold(threshold, viewport.getIgnoreGapsConsensus());\r
1833           sg.cs.setConsensus(AAFrequency.calculate(\r
1834               sg.getSequences(viewport.hiddenRepSequences), 0, sg.getWidth()));\r
1835         }\r
1836         else\r
1837         {\r
1838           sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());\r
1839         }\r
1840 \r
1841         if (viewport.getConservationSelected())\r
1842         {\r
1843           Conservation c = new Conservation("Group",\r
1844                                             ResidueProperties.propHash, 3,\r
1845                                             sg.getSequences(viewport.\r
1846               hiddenRepSequences), 0,\r
1847                                             viewport.alignment.getWidth() - 1);\r
1848           c.calculate();\r
1849           c.verdict(false, viewport.ConsPercGaps);\r
1850           sg.cs.setConservation(c);\r
1851         }\r
1852         else\r
1853         {\r
1854           sg.cs.setConservation(null);\r
1855           sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());\r
1856         }\r
1857 \r
1858       }\r
1859     }\r
1860 \r
1861     if (alignPanel.getOverviewPanel() != null)\r
1862     {\r
1863       alignPanel.getOverviewPanel().updateOverviewImage();\r
1864     }\r
1865 \r
1866     alignPanel.repaint();\r
1867   }\r
1868 \r
1869   protected void modifyPID_actionPerformed()\r
1870   {\r
1871     if (viewport.getAbovePIDThreshold() && viewport.globalColourScheme != null)\r
1872     {\r
1873       SliderPanel.setPIDSliderSource(alignPanel, viewport.getGlobalColourScheme(),\r
1874                                      "Background");\r
1875       SliderPanel.showPIDSlider();\r
1876     }\r
1877   }\r
1878 \r
1879   protected void modifyConservation_actionPerformed()\r
1880   {\r
1881     if (viewport.getConservationSelected() && viewport.globalColourScheme != null)\r
1882     {\r
1883       SliderPanel.setConservationSlider(alignPanel, viewport.globalColourScheme,\r
1884                                         "Background");\r
1885       SliderPanel.showConservationSlider();\r
1886     }\r
1887   }\r
1888 \r
1889   protected void conservationMenuItem_actionPerformed()\r
1890   {\r
1891     viewport.setConservationSelected(conservationMenuItem.getState());\r
1892 \r
1893     viewport.setAbovePIDThreshold(false);\r
1894     abovePIDThreshold.setState(false);\r
1895 \r
1896     changeColour(viewport.getGlobalColourScheme());\r
1897 \r
1898     modifyConservation_actionPerformed();\r
1899   }\r
1900 \r
1901   public void abovePIDThreshold_actionPerformed()\r
1902   {\r
1903     viewport.setAbovePIDThreshold(abovePIDThreshold.getState());\r
1904 \r
1905     conservationMenuItem.setState(false);\r
1906     viewport.setConservationSelected(false);\r
1907 \r
1908     changeColour(viewport.getGlobalColourScheme());\r
1909 \r
1910     modifyPID_actionPerformed();\r
1911   }\r
1912 \r
1913   public void sortPairwiseMenuItem_actionPerformed()\r
1914   {\r
1915     SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();\r
1916     AlignmentSorter.sortByPID(viewport.getAlignment(),\r
1917                               viewport.getAlignment().getSequenceAt(0));\r
1918     addHistoryItem(new OrderCommand("Pairwise Sort", oldOrder,\r
1919                                     viewport.alignment));\r
1920     alignPanel.repaint();\r
1921   }\r
1922 \r
1923   public void sortIDMenuItem_actionPerformed()\r
1924   {\r
1925     //  addHistoryItem(new HistoryItem("ID Sort", viewport.alignment,\r
1926     //                                HistoryItem.SORT));\r
1927     AlignmentSorter.sortByID(viewport.getAlignment());\r
1928     alignPanel.repaint();\r
1929   }\r
1930 \r
1931   public void sortGroupMenuItem_actionPerformed()\r
1932   {\r
1933     //  addHistoryItem(new HistoryItem("Group Sort", viewport.alignment,\r
1934     //                                 HistoryItem.SORT));\r
1935     AlignmentSorter.sortByGroup(viewport.getAlignment());\r
1936     alignPanel.repaint();\r
1937 \r
1938   }\r
1939 \r
1940   public void removeRedundancyMenuItem_actionPerformed()\r
1941   {\r
1942     new RedundancyPanel(alignPanel);\r
1943   }\r
1944 \r
1945   public void pairwiseAlignmentMenuItem_actionPerformed()\r
1946   {\r
1947     if (viewport.getSelectionGroup() != null\r
1948         && viewport.getSelectionGroup().getSize() > 1)\r
1949     {\r
1950       Frame frame = new Frame();\r
1951       frame.add(new PairwiseAlignPanel(alignPanel));\r
1952       jalview.bin.JalviewLite.addFrame(frame, "Pairwise Alignment", 600, 500);\r
1953     }\r
1954   }\r
1955 \r
1956   public void PCAMenuItem_actionPerformed()\r
1957   {\r
1958     //are the sequences aligned?\r
1959     if (!viewport.alignment.isAligned())\r
1960     {\r
1961       SequenceI current;\r
1962       int Width = viewport.getAlignment().getWidth();\r
1963 \r
1964       for (int i = 0; i < viewport.getAlignment().getSequences().size();\r
1965            i++)\r
1966       {\r
1967         current = viewport.getAlignment().getSequenceAt(i);\r
1968 \r
1969         if (current.getLength() < Width)\r
1970         {\r
1971           current.insertCharAt(Width - 1, viewport.getGapCharacter());\r
1972         }\r
1973       }\r
1974       alignPanel.repaint();\r
1975     }\r
1976 \r
1977     if ( (viewport.getSelectionGroup() != null &&\r
1978           viewport.getSelectionGroup().getSize() < 4 &&\r
1979           viewport.getSelectionGroup().getSize() > 0)\r
1980         || viewport.getAlignment().getHeight() < 4)\r
1981     {\r
1982       return;\r
1983     }\r
1984 \r
1985     try\r
1986     {\r
1987       new PCAPanel(viewport);\r
1988     }\r
1989     catch (java.lang.OutOfMemoryError ex)\r
1990     {\r
1991     }\r
1992 \r
1993   }\r
1994 \r
1995   public void averageDistanceTreeMenuItem_actionPerformed()\r
1996   {\r
1997     NewTreePanel("AV", "PID", "Average distance tree using PID");\r
1998   }\r
1999 \r
2000   public void neighbourTreeMenuItem_actionPerformed()\r
2001   {\r
2002     NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");\r
2003   }\r
2004 \r
2005   protected void njTreeBlosumMenuItem_actionPerformed()\r
2006   {\r
2007     NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");\r
2008   }\r
2009 \r
2010   protected void avTreeBlosumMenuItem_actionPerformed()\r
2011   {\r
2012     NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");\r
2013   }\r
2014 \r
2015   void NewTreePanel(String type, String pwType, String title)\r
2016   {\r
2017     //are the sequences aligned?\r
2018     if (!viewport.alignment.isAligned())\r
2019     {\r
2020       SequenceI current;\r
2021       int Width = viewport.getAlignment().getWidth();\r
2022 \r
2023       for (int i = 0; i < viewport.getAlignment().getSequences().size();\r
2024            i++)\r
2025       {\r
2026         current = viewport.getAlignment().getSequenceAt(i);\r
2027 \r
2028         if (current.getLength() < Width)\r
2029         {\r
2030           current.insertCharAt(Width - 1, viewport.getGapCharacter());\r
2031         }\r
2032       }\r
2033       alignPanel.repaint();\r
2034 \r
2035     }\r
2036 \r
2037     if ( (viewport.getSelectionGroup() != null &&\r
2038           viewport.getSelectionGroup().getSize() > 1)\r
2039         || (viewport.getSelectionGroup() == null\r
2040             && viewport.alignment.getHeight() > 1))\r
2041     {\r
2042       final TreePanel tp = new TreePanel(viewport,\r
2043                                          type,\r
2044                                          pwType);\r
2045 \r
2046       addTreeMenuItem(tp, title);\r
2047 \r
2048       jalview.bin.JalviewLite.addFrame(tp, title, 600, 500);\r
2049     }\r
2050   }\r
2051 \r
2052   void loadTree_actionPerformed()\r
2053   {\r
2054     CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this);\r
2055     cap.setText("Paste your Newick tree file here.");\r
2056     cap.setTreeImport();\r
2057     Frame frame = new Frame();\r
2058     frame.add(cap);\r
2059     jalview.bin.JalviewLite.addFrame(frame, "Paste Newick file ", 400, 300);\r
2060   }\r
2061 \r
2062   public void loadTree(jalview.io.NewickFile tree, String treeFile)\r
2063   {\r
2064     TreePanel tp = new TreePanel(viewport,\r
2065                                  treeFile,\r
2066                                  "From File - ",\r
2067                                  tree);\r
2068     jalview.bin.JalviewLite.addFrame(tp, treeFile, 600, 500);\r
2069     addTreeMenuItem(tp, treeFile);\r
2070   }\r
2071 \r
2072   void addTreeMenuItem(final TreePanel treePanel, String title)\r
2073   {\r
2074     final MenuItem item = new MenuItem(title);\r
2075     sortByTreeMenu.add(item);\r
2076     item.addActionListener(new java.awt.event.ActionListener()\r
2077     {\r
2078       public void actionPerformed(ActionEvent evt)\r
2079       {\r
2080         //  addHistoryItem(new HistoryItem("Sort", viewport.alignment,\r
2081         //                                 HistoryItem.SORT));\r
2082         AlignmentSorter.sortByTree(viewport.getAlignment(), treePanel.getTree());\r
2083         alignPanel.repaint();\r
2084       }\r
2085     });\r
2086 \r
2087     treePanel.addWindowListener(new WindowAdapter()\r
2088     {\r
2089       public void windowClosing(WindowEvent e)\r
2090       {\r
2091         sortByTreeMenu.remove(item);\r
2092       };\r
2093     });\r
2094   }\r
2095 \r
2096   protected void documentation_actionPerformed()\r
2097   {\r
2098     showURL("http://www.jalview.org/help.html", "HELP");\r
2099   }\r
2100 \r
2101   protected void about_actionPerformed()\r
2102   {\r
2103 \r
2104     class AboutPanel\r
2105         extends Canvas\r
2106     {\r
2107       String version;\r
2108       public AboutPanel(String version)\r
2109       {\r
2110         this.version = version;\r
2111       }\r
2112 \r
2113       public void paint(Graphics g)\r
2114       {\r
2115         g.setColor(Color.white);\r
2116         g.fillRect(0, 0, getSize().width, getSize().height);\r
2117         g.setFont(new Font("Helvetica", Font.PLAIN, 12));\r
2118         FontMetrics fm = g.getFontMetrics();\r
2119         int fh = fm.getHeight();\r
2120         int y = 5, x = 7;\r
2121         g.setColor(Color.black);\r
2122         g.setFont(new Font("Helvetica", Font.BOLD, 14));\r
2123         g.drawString("Jalview - Release " + version, 200, y += fh);\r
2124         g.setFont(new Font("Helvetica", Font.PLAIN, 12));\r
2125         g.drawString("Authors:  Michele Clamp, James Cuff, Steve Searle, Andrew Waterhouse, Jim Procter & Geoff Barton.",\r
2126                      x, y += fh * 2);\r
2127         g.drawString("Current development managed by Andrew Waterhouse; Barton Group, University of Dundee.",\r
2128                      x, y += fh);\r
2129         g.drawString(\r
2130             "For any issues relating to Jalview, email help@jalview.org", x,\r
2131             y += fh);\r
2132         g.drawString("If  you use JalView, please cite:", x, y += fh + 8);\r
2133         g.drawString("\"Clamp, M., Cuff, J., Searle, S. M. and Barton, G. J. (2004), The Jalview Java Alignment Editor\"",\r
2134                      x, y += fh);\r
2135         g.drawString("Bioinformatics,  2004 20;426-7.", x, y += fh);\r
2136       }\r
2137     }\r
2138 \r
2139     String version = "test";\r
2140     java.net.URL url = getClass().getResource("/.build_properties");\r
2141     if (url != null)\r
2142     {\r
2143       try\r
2144       {\r
2145         BufferedReader reader = new BufferedReader(new InputStreamReader(\r
2146             url.openStream()));\r
2147         String line;\r
2148         while ( (line = reader.readLine()) != null)\r
2149         {\r
2150           if (line.indexOf("VERSION") > -1)\r
2151           {\r
2152             version = line.substring(line.indexOf("=") + 1);\r
2153           }\r
2154         }\r
2155       }\r
2156       catch (Exception ex)\r
2157       {\r
2158         ex.printStackTrace();\r
2159       }\r
2160     }\r
2161 \r
2162     Frame frame = new Frame();\r
2163     frame.add(new AboutPanel(version));\r
2164     jalview.bin.JalviewLite.addFrame(frame, "Jalview", 580, 200);\r
2165 \r
2166   }\r
2167 \r
2168   public void showURL(String url, String target)\r
2169   {\r
2170     if (viewport.applet == null)\r
2171     {\r
2172       System.out.println("Not running as applet - no browser available.");\r
2173     }\r
2174     else\r
2175     {\r
2176       try\r
2177       {\r
2178         System.out.println("Show url: " + url);\r
2179         viewport.applet.getAppletContext().showDocument(new java.net.URL(url),\r
2180             target);\r
2181       }\r
2182       catch (Exception ex)\r
2183       {\r
2184         ex.printStackTrace();\r
2185       }\r
2186     }\r
2187   }\r
2188 \r
2189   //////////////////////////////////////////////////////////////////////////////////\r
2190   //JBuilder Graphics here\r
2191 \r
2192   protected MenuBar alignFrameMenuBar = new MenuBar();\r
2193   protected Menu fileMenu = new Menu("File");\r
2194   protected MenuItem loadApplication = new MenuItem("View in Full Application");\r
2195   protected MenuItem loadTree = new MenuItem("Load Associated Tree ...");\r
2196   protected MenuItem loadAnnotations = new MenuItem(\r
2197       "Load Features/Annotations ...");\r
2198   protected MenuItem outputFeatures = new MenuItem("Export Features ...");\r
2199   protected MenuItem outputAnnotations = new MenuItem("Export Annotations ...");\r
2200 \r
2201   protected MenuItem closeMenuItem = new MenuItem("Close");\r
2202   protected Menu editMenu = new Menu("Edit");\r
2203   protected Menu viewMenu = new Menu("View");\r
2204   protected Menu colourMenu = new Menu("Colour");\r
2205   protected Menu calculateMenu = new Menu("Calculate");\r
2206   protected MenuItem selectAllSequenceMenuItem = new MenuItem("Select all");\r
2207   protected MenuItem deselectAllSequenceMenuItem = new MenuItem("Deselect All");\r
2208   protected MenuItem invertSequenceMenuItem = new MenuItem("Invert Selection");\r
2209   protected MenuItem remove2LeftMenuItem = new MenuItem();\r
2210   protected MenuItem remove2RightMenuItem = new MenuItem();\r
2211   protected MenuItem removeGappedColumnMenuItem = new MenuItem();\r
2212   protected MenuItem removeAllGapsMenuItem = new MenuItem();\r
2213   protected CheckboxMenuItem viewBoxesMenuItem = new CheckboxMenuItem();\r
2214   protected CheckboxMenuItem viewTextMenuItem = new CheckboxMenuItem();\r
2215   protected MenuItem sortPairwiseMenuItem = new MenuItem();\r
2216   protected MenuItem sortIDMenuItem = new MenuItem();\r
2217   protected MenuItem sortGroupMenuItem = new MenuItem();\r
2218   protected MenuItem removeRedundancyMenuItem = new MenuItem();\r
2219   protected MenuItem pairwiseAlignmentMenuItem = new MenuItem();\r
2220   protected MenuItem PCAMenuItem = new MenuItem();\r
2221   protected MenuItem averageDistanceTreeMenuItem = new MenuItem();\r
2222   protected MenuItem neighbourTreeMenuItem = new MenuItem();\r
2223   BorderLayout borderLayout1 = new BorderLayout();\r
2224   public Label statusBar = new Label();\r
2225   protected Menu outputTextboxMenu = new Menu();\r
2226   protected MenuItem clustalColour = new MenuItem();\r
2227   protected MenuItem zappoColour = new MenuItem();\r
2228   protected MenuItem taylorColour = new MenuItem();\r
2229   protected MenuItem hydrophobicityColour = new MenuItem();\r
2230   protected MenuItem helixColour = new MenuItem();\r
2231   protected MenuItem strandColour = new MenuItem();\r
2232   protected MenuItem turnColour = new MenuItem();\r
2233   protected MenuItem buriedColour = new MenuItem();\r
2234   protected MenuItem userDefinedColour = new MenuItem();\r
2235   protected MenuItem PIDColour = new MenuItem();\r
2236   protected MenuItem BLOSUM62Colour = new MenuItem();\r
2237   MenuItem njTreeBlosumMenuItem = new MenuItem();\r
2238   MenuItem avDistanceTreeBlosumMenuItem = new MenuItem();\r
2239   protected CheckboxMenuItem annotationPanelMenuItem = new CheckboxMenuItem();\r
2240   protected CheckboxMenuItem colourTextMenuItem = new CheckboxMenuItem();\r
2241   MenuItem overviewMenuItem = new MenuItem();\r
2242   protected MenuItem undoMenuItem = new MenuItem();\r
2243   protected MenuItem redoMenuItem = new MenuItem();\r
2244   protected CheckboxMenuItem conservationMenuItem = new CheckboxMenuItem();\r
2245   MenuItem noColourmenuItem = new MenuItem();\r
2246   protected CheckboxMenuItem wrapMenuItem = new CheckboxMenuItem();\r
2247   protected CheckboxMenuItem renderGapsMenuItem = new CheckboxMenuItem();\r
2248   MenuItem findMenuItem = new MenuItem();\r
2249   protected CheckboxMenuItem abovePIDThreshold = new CheckboxMenuItem();\r
2250   protected MenuItem nucleotideColour = new MenuItem();\r
2251   MenuItem deleteGroups = new MenuItem();\r
2252   MenuItem delete = new MenuItem();\r
2253   MenuItem copy = new MenuItem();\r
2254   MenuItem cut = new MenuItem();\r
2255   Menu pasteMenu = new Menu();\r
2256   MenuItem pasteNew = new MenuItem();\r
2257   MenuItem pasteThis = new MenuItem();\r
2258   protected CheckboxMenuItem applyToAllGroups = new CheckboxMenuItem();\r
2259   protected MenuItem font = new MenuItem();\r
2260   protected CheckboxMenuItem scaleAbove = new CheckboxMenuItem();\r
2261   protected CheckboxMenuItem scaleLeft = new CheckboxMenuItem();\r
2262   protected CheckboxMenuItem scaleRight = new CheckboxMenuItem();\r
2263   MenuItem modifyPID = new MenuItem();\r
2264   MenuItem modifyConservation = new MenuItem();\r
2265   protected CheckboxMenuItem autoCalculate\r
2266       = new CheckboxMenuItem("Autocalculate Consensus", true);\r
2267   protected Menu sortByTreeMenu = new Menu();\r
2268   Menu sort = new Menu();\r
2269   Menu calculate = new Menu();\r
2270   MenuItem inputText = new MenuItem();\r
2271   Menu helpMenu = new Menu();\r
2272   MenuItem documentation = new MenuItem();\r
2273   MenuItem about = new MenuItem();\r
2274   protected CheckboxMenuItem seqLimits = new CheckboxMenuItem();\r
2275   Panel embeddedMenu;\r
2276   Label embeddedEdit;\r
2277   Label embeddedSelect;\r
2278   Label embeddedView;\r
2279   Label embeddedFormat;\r
2280   Label embeddedColour;\r
2281   Label embeddedFile;\r
2282   Label embeddedHelp;\r
2283   Label embeddedCalculate;\r
2284   FlowLayout flowLayout1;\r
2285 \r
2286   private void jbInit()\r
2287       throws Exception\r
2288   {\r
2289 \r
2290     setMenuBar(alignFrameMenuBar);\r
2291 \r
2292     MenuItem item;\r
2293 \r
2294     // dynamically fill save as menu with available formats\r
2295     for (int i = 0; i < jalview.io.AppletFormatAdapter.WRITEABLE_FORMATS.length;\r
2296          i++)\r
2297     {\r
2298 \r
2299       item = new MenuItem(jalview.io.AppletFormatAdapter.WRITEABLE_FORMATS[i]);\r
2300 \r
2301       item.addActionListener(new java.awt.event.ActionListener()\r
2302       {\r
2303         public void actionPerformed(ActionEvent e)\r
2304         {\r
2305           outputText_actionPerformed(e);\r
2306         }\r
2307       });\r
2308 \r
2309       outputTextboxMenu.add(item);\r
2310     }\r
2311     closeMenuItem.addActionListener(this);\r
2312     loadApplication.addActionListener(this);\r
2313 \r
2314     loadTree.addActionListener(this);\r
2315     loadAnnotations.addActionListener(this);\r
2316     outputFeatures.addActionListener(this);\r
2317     outputAnnotations.addActionListener(this);\r
2318     selectAllSequenceMenuItem.addActionListener(this);\r
2319     deselectAllSequenceMenuItem.addActionListener(this);\r
2320     invertSequenceMenuItem.addActionListener(this);\r
2321     remove2LeftMenuItem.setLabel("Remove Left");\r
2322     remove2LeftMenuItem.addActionListener(this);\r
2323     remove2RightMenuItem.setLabel("Remove Right");\r
2324     remove2RightMenuItem.addActionListener(this);\r
2325     removeGappedColumnMenuItem.setLabel("Remove Empty Columns");\r
2326     removeGappedColumnMenuItem.addActionListener(this);\r
2327     removeAllGapsMenuItem.setLabel("Remove All Gaps");\r
2328     removeAllGapsMenuItem.addActionListener(this);\r
2329     viewBoxesMenuItem.setLabel("Boxes");\r
2330     viewBoxesMenuItem.setState(true);\r
2331     viewBoxesMenuItem.addItemListener(this);\r
2332     viewTextMenuItem.setLabel("Text");\r
2333     viewTextMenuItem.setState(true);\r
2334     viewTextMenuItem.addItemListener(this);\r
2335     sortPairwiseMenuItem.setLabel("by Pairwise Identity");\r
2336     sortPairwiseMenuItem.addActionListener(this);\r
2337     sortIDMenuItem.setLabel("by ID");\r
2338     sortIDMenuItem.addActionListener(this);\r
2339     sortGroupMenuItem.setLabel("by Group");\r
2340     sortGroupMenuItem.addActionListener(this);\r
2341     removeRedundancyMenuItem.setLabel("Remove Redundancy...");\r
2342     removeRedundancyMenuItem.addActionListener(this);\r
2343     pairwiseAlignmentMenuItem.setLabel("Pairwise Alignments...");\r
2344     pairwiseAlignmentMenuItem.addActionListener(this);\r
2345     PCAMenuItem.setLabel("Principal Component Analysis");\r
2346     PCAMenuItem.addActionListener(this);\r
2347     averageDistanceTreeMenuItem.setLabel(\r
2348         "Average Distance Using % Identity");\r
2349     averageDistanceTreeMenuItem.addActionListener(this);\r
2350     neighbourTreeMenuItem.setLabel("Neighbour Joining Using % Identity");\r
2351     neighbourTreeMenuItem.addActionListener(this);\r
2352     statusBar.setBackground(Color.white);\r
2353     statusBar.setFont(new java.awt.Font("Verdana", 0, 11));\r
2354     statusBar.setText("Status bar");\r
2355     outputTextboxMenu.setLabel("Output to Textbox");\r
2356     clustalColour.setLabel("Clustalx");\r
2357 \r
2358     clustalColour.addActionListener(this);\r
2359     zappoColour.setLabel("Zappo");\r
2360     zappoColour.addActionListener(this);\r
2361     taylorColour.setLabel("Taylor");\r
2362     taylorColour.addActionListener(this);\r
2363     hydrophobicityColour.setLabel("Hydrophobicity");\r
2364     hydrophobicityColour.addActionListener(this);\r
2365     helixColour.setLabel("Helix Propensity");\r
2366     helixColour.addActionListener(this);\r
2367     strandColour.setLabel("Strand Propensity");\r
2368     strandColour.addActionListener(this);\r
2369     turnColour.setLabel("Turn Propensity");\r
2370     turnColour.addActionListener(this);\r
2371     buriedColour.setLabel("Buried Index");\r
2372     buriedColour.addActionListener(this);\r
2373     userDefinedColour.setLabel("User Defined...");\r
2374     userDefinedColour.addActionListener(this);\r
2375     PIDColour.setLabel("Percentage Identity");\r
2376     PIDColour.addActionListener(this);\r
2377     BLOSUM62Colour.setLabel("BLOSUM62 Score");\r
2378     BLOSUM62Colour.addActionListener(this);\r
2379     avDistanceTreeBlosumMenuItem.setLabel(\r
2380         "Average Distance Using BLOSUM62");\r
2381     avDistanceTreeBlosumMenuItem.addActionListener(this);\r
2382     njTreeBlosumMenuItem.setLabel("Neighbour Joining Using BLOSUM62");\r
2383     njTreeBlosumMenuItem.addActionListener(this);\r
2384     annotationPanelMenuItem.setLabel("Show Annotations");\r
2385     annotationPanelMenuItem.addItemListener(this);\r
2386     colourTextMenuItem.setLabel("Colour Text");\r
2387     colourTextMenuItem.addItemListener(this);\r
2388     overviewMenuItem.setLabel("Overview Window");\r
2389     overviewMenuItem.addActionListener(this);\r
2390     undoMenuItem.setEnabled(false);\r
2391     undoMenuItem.setLabel("Undo");\r
2392     undoMenuItem.addActionListener(this);\r
2393     redoMenuItem.setEnabled(false);\r
2394     redoMenuItem.setLabel("Redo");\r
2395     redoMenuItem.addActionListener(this);\r
2396     conservationMenuItem.setLabel("by Conservation");\r
2397     conservationMenuItem.addItemListener(this);\r
2398     noColourmenuItem.setLabel("None");\r
2399     noColourmenuItem.addActionListener(this);\r
2400     wrapMenuItem.setLabel("Wrap");\r
2401     wrapMenuItem.addItemListener(this);\r
2402     renderGapsMenuItem.setLabel("Show Gaps");\r
2403     renderGapsMenuItem.setState(true);\r
2404     renderGapsMenuItem.addItemListener(this);\r
2405     findMenuItem.setLabel("Find...");\r
2406     findMenuItem.addActionListener(this);\r
2407     abovePIDThreshold.setLabel("Above Identity Threshold");\r
2408     abovePIDThreshold.addItemListener(this);\r
2409     nucleotideColour.setLabel("Nucleotide");\r
2410     nucleotideColour.addActionListener(this);\r
2411     deleteGroups.setLabel("Undefine Groups");\r
2412     deleteGroups.addActionListener(this);\r
2413     copy.setLabel("Copy");\r
2414     copy.addActionListener(this);\r
2415     cut.setLabel("Cut");\r
2416     cut.addActionListener(this);\r
2417     delete.setLabel("Delete");\r
2418     delete.addActionListener(this);\r
2419     pasteMenu.setLabel("Paste");\r
2420     pasteNew.setLabel("To New Alignment");\r
2421     pasteNew.addActionListener(this);\r
2422     pasteThis.setLabel("Add To This Alignment");\r
2423     pasteThis.addActionListener(this);\r
2424     applyToAllGroups.setLabel("Apply Colour To All Groups");\r
2425     applyToAllGroups.setState(true);\r
2426     applyToAllGroups.addItemListener(this);\r
2427     font.setLabel("Font...");\r
2428     font.addActionListener(this);\r
2429     scaleAbove.setLabel("Scale Above");\r
2430     scaleAbove.setState(true);\r
2431     scaleAbove.setEnabled(false);\r
2432     scaleAbove.addItemListener(this);\r
2433     scaleLeft.setEnabled(false);\r
2434     scaleLeft.setState(true);\r
2435     scaleLeft.setLabel("Scale Left");\r
2436     scaleLeft.addItemListener(this);\r
2437     scaleRight.setEnabled(false);\r
2438     scaleRight.setState(true);\r
2439     scaleRight.setLabel("Scale Right");\r
2440     scaleRight.addItemListener(this);\r
2441     modifyPID.setLabel("Modify Identity Threshold...");\r
2442     modifyPID.addActionListener(this);\r
2443     modifyConservation.setLabel("Modify Conservation Threshold...");\r
2444     modifyConservation.addActionListener(this);\r
2445     sortByTreeMenu.setLabel("By Tree Order");\r
2446     sort.setLabel("Sort");\r
2447     calculate.setLabel("Calculate Tree");\r
2448     autoCalculate.addItemListener(this);\r
2449     inputText.setLabel("Input from textbox");\r
2450     inputText.addActionListener(this);\r
2451 \r
2452     helpMenu.setLabel("Help");\r
2453     documentation.setLabel("Documentation");\r
2454     documentation.addActionListener(this);\r
2455 \r
2456     about.setLabel("About...");\r
2457     about.addActionListener(this);\r
2458     seqLimits.setState(true);\r
2459     seqLimits.setLabel("Show Sequence Limits");\r
2460     seqLimits.addItemListener(this);\r
2461     featureSettings.setLabel("Feature Settings...");\r
2462     featureSettings.addActionListener(this);\r
2463     sequenceFeatures.setLabel("Sequence Features");\r
2464     sequenceFeatures.addItemListener(this);\r
2465     sequenceFeatures.setState(false);\r
2466     annotationColour.setLabel("by Annotation...");\r
2467     annotationColour.addActionListener(this);\r
2468     invertSequenceMenuItem.setLabel("Invert Sequence Selection");\r
2469     invertColSel.setLabel("Invert Column Selection");\r
2470     menu1.setLabel("Show");\r
2471     showColumns.setLabel("All Columns ");\r
2472     showSeqs.setLabel("All Sequences");\r
2473     menu2.setLabel("Hide");\r
2474     hideColumns.setLabel("Selected Columns");\r
2475     hideSequences.setLabel("Selected Sequences");\r
2476     invertColSel.addActionListener(this);\r
2477     showColumns.addActionListener(this);\r
2478     showSeqs.addActionListener(this);\r
2479     hideColumns.addActionListener(this);\r
2480     hideSequences.addActionListener(this);\r
2481     formatMenu.setLabel("Format");\r
2482     selectMenu.setLabel("Select");\r
2483     newView.setLabel("New View");\r
2484     newView.addActionListener(this);\r
2485     alignFrameMenuBar.add(fileMenu);\r
2486     alignFrameMenuBar.add(editMenu);\r
2487     alignFrameMenuBar.add(selectMenu);\r
2488     alignFrameMenuBar.add(viewMenu);\r
2489     alignFrameMenuBar.add(formatMenu);\r
2490     alignFrameMenuBar.add(colourMenu);\r
2491     alignFrameMenuBar.add(calculateMenu);\r
2492     alignFrameMenuBar.add(helpMenu);\r
2493 \r
2494     fileMenu.add(inputText);\r
2495     fileMenu.add(loadTree);\r
2496     fileMenu.add(loadAnnotations);\r
2497 \r
2498     fileMenu.addSeparator();\r
2499     fileMenu.add(outputTextboxMenu);\r
2500     fileMenu.add(outputFeatures);\r
2501     fileMenu.add(outputAnnotations);\r
2502 \r
2503     if (jalviewServletURL != null)\r
2504     {\r
2505       fileMenu.add(loadApplication);\r
2506     }\r
2507 \r
2508     fileMenu.addSeparator();\r
2509     fileMenu.add(closeMenuItem);\r
2510 \r
2511     editMenu.add(undoMenuItem);\r
2512     editMenu.add(redoMenuItem);\r
2513     editMenu.add(cut);\r
2514     editMenu.add(copy);\r
2515     editMenu.add(pasteMenu);\r
2516     editMenu.add(delete);\r
2517     editMenu.addSeparator();\r
2518     editMenu.add(remove2LeftMenuItem);\r
2519     editMenu.add(remove2RightMenuItem);\r
2520     editMenu.add(removeGappedColumnMenuItem);\r
2521     editMenu.add(removeAllGapsMenuItem);\r
2522     editMenu.add(removeRedundancyMenuItem);\r
2523     viewMenu.add(newView);\r
2524     viewMenu.addSeparator();\r
2525     viewMenu.add(menu1);\r
2526     viewMenu.add(menu2);\r
2527     viewMenu.addSeparator();\r
2528     viewMenu.add(annotationPanelMenuItem);\r
2529     viewMenu.addSeparator();\r
2530     viewMenu.add(sequenceFeatures);\r
2531     viewMenu.add(featureSettings);\r
2532     viewMenu.addSeparator();\r
2533     viewMenu.add(overviewMenuItem);\r
2534     colourMenu.add(applyToAllGroups);\r
2535     colourMenu.addSeparator();\r
2536     colourMenu.add(noColourmenuItem);\r
2537     colourMenu.add(clustalColour);\r
2538     colourMenu.add(BLOSUM62Colour);\r
2539     colourMenu.add(PIDColour);\r
2540     colourMenu.add(zappoColour);\r
2541     colourMenu.add(taylorColour);\r
2542     colourMenu.add(hydrophobicityColour);\r
2543     colourMenu.add(helixColour);\r
2544     colourMenu.add(strandColour);\r
2545     colourMenu.add(turnColour);\r
2546     colourMenu.add(buriedColour);\r
2547     colourMenu.add(nucleotideColour);\r
2548     colourMenu.add(userDefinedColour);\r
2549     colourMenu.addSeparator();\r
2550     colourMenu.add(conservationMenuItem);\r
2551     colourMenu.add(modifyConservation);\r
2552     colourMenu.add(abovePIDThreshold);\r
2553     colourMenu.add(modifyPID);\r
2554     colourMenu.add(annotationColour);\r
2555     calculateMenu.add(sort);\r
2556     calculateMenu.add(calculate);\r
2557     calculateMenu.addSeparator();\r
2558     calculateMenu.add(pairwiseAlignmentMenuItem);\r
2559     calculateMenu.add(PCAMenuItem);\r
2560     calculateMenu.add(autoCalculate);\r
2561     this.add(statusBar, BorderLayout.SOUTH);\r
2562     pasteMenu.add(pasteNew);\r
2563     pasteMenu.add(pasteThis);\r
2564     sort.add(sortIDMenuItem);\r
2565     sort.add(sortByTreeMenu);\r
2566     sort.add(sortGroupMenuItem);\r
2567     sort.add(sortPairwiseMenuItem);\r
2568     calculate.add(averageDistanceTreeMenuItem);\r
2569     calculate.add(neighbourTreeMenuItem);\r
2570     calculate.add(avDistanceTreeBlosumMenuItem);\r
2571     calculate.add(njTreeBlosumMenuItem);\r
2572     helpMenu.add(documentation);\r
2573     helpMenu.add(about);\r
2574     menu1.add(showColumns);\r
2575     menu1.add(showSeqs);\r
2576     menu2.add(hideColumns);\r
2577     menu2.add(hideSequences);\r
2578     formatMenu.add(font);\r
2579     formatMenu.add(seqLimits);\r
2580     formatMenu.add(wrapMenuItem);\r
2581     formatMenu.add(scaleAbove);\r
2582     formatMenu.add(scaleLeft);\r
2583     formatMenu.add(scaleRight);\r
2584     formatMenu.add(viewBoxesMenuItem);\r
2585     formatMenu.add(viewTextMenuItem);\r
2586     formatMenu.add(colourTextMenuItem);\r
2587     formatMenu.add(renderGapsMenuItem);\r
2588     selectMenu.add(findMenuItem);\r
2589     selectMenu.addSeparator();\r
2590     selectMenu.add(selectAllSequenceMenuItem);\r
2591     selectMenu.add(deselectAllSequenceMenuItem);\r
2592     selectMenu.add(invertSequenceMenuItem);\r
2593     selectMenu.add(invertColSel);\r
2594     selectMenu.add(deleteGroups);\r
2595   }\r
2596 \r
2597   public void setEmbedded()\r
2598   {\r
2599 \r
2600     embeddedMenu = new Panel();\r
2601     embeddedEdit = new Label("Edit");\r
2602     embeddedSelect = new Label("Select");\r
2603     embeddedView = new Label("View");\r
2604     embeddedFormat = new Label("Format");\r
2605     embeddedColour = new Label("Colour");\r
2606     embeddedFile = new Label("File");\r
2607     embeddedHelp = new Label("Help");\r
2608     embeddedCalculate = new Label("Calculate");\r
2609     flowLayout1 = new FlowLayout();\r
2610     embeddedMenu.setBackground(Color.lightGray);\r
2611     embeddedMenu.setLayout(flowLayout1);\r
2612     embeddedEdit.setFont(new java.awt.Font("Arial", Font.PLAIN, 10));\r
2613     embeddedSelect.setFont(new java.awt.Font("Arial", Font.PLAIN, 10));\r
2614     embeddedView.setFont(new java.awt.Font("Arial", Font.PLAIN, 10));\r
2615     embeddedFormat.setFont(new java.awt.Font("Arial", Font.PLAIN, 10));\r
2616     embeddedColour.setFont(new java.awt.Font("Arial", Font.PLAIN, 10));\r
2617     embeddedFile.setFont(new java.awt.Font("Arial", Font.PLAIN, 10));\r
2618     embeddedHelp.setFont(new java.awt.Font("Arial", Font.PLAIN, 10));\r
2619     embeddedCalculate.setFont(new java.awt.Font("Arial", Font.PLAIN, 10));\r
2620     embeddedMenu.add(embeddedFile);\r
2621     embeddedMenu.add(embeddedEdit);\r
2622     embeddedMenu.add(embeddedSelect);\r
2623     embeddedMenu.add(embeddedView);\r
2624     embeddedMenu.add(embeddedFormat);\r
2625     embeddedMenu.add(embeddedColour);\r
2626     embeddedMenu.add(embeddedCalculate);\r
2627     embeddedMenu.add(embeddedHelp);\r
2628     flowLayout1.setAlignment(FlowLayout.LEFT);\r
2629     flowLayout1.setHgap(2);\r
2630     flowLayout1.setVgap(0);\r
2631     embeddedFile.addMouseListener(this);\r
2632     embeddedEdit.addMouseListener(this);\r
2633     embeddedSelect.addMouseListener(this);\r
2634     embeddedView.addMouseListener(this);\r
2635     embeddedFormat.addMouseListener(this);\r
2636     embeddedColour.addMouseListener(this);\r
2637     embeddedCalculate.addMouseListener(this);\r
2638     embeddedHelp.addMouseListener(this);\r
2639 \r
2640     fileMenu.remove(closeMenuItem);\r
2641     fileMenu.remove(3); // Seperator\r
2642 \r
2643     viewport.applet.setLayout(new BorderLayout());\r
2644     viewport.applet.add(embeddedMenu, BorderLayout.NORTH);\r
2645     viewport.applet.add(statusBar, BorderLayout.SOUTH);\r
2646 \r
2647     alignPanel.setSize(viewport.applet.getSize().width,\r
2648                        viewport.applet.getSize().height\r
2649                        - embeddedMenu.HEIGHT - statusBar.HEIGHT);\r
2650 \r
2651     viewport.applet.add(alignPanel, BorderLayout.CENTER);\r
2652     viewport.applet.validate();\r
2653 \r
2654   }\r
2655 \r
2656   PopupMenu filePopup, editPopup, searchPopup,\r
2657   viewPopup, formatPopup, colourPopup, calculatePopup, helpPopup;\r
2658   MenuItem featureSettings = new MenuItem();\r
2659   CheckboxMenuItem sequenceFeatures = new CheckboxMenuItem();\r
2660   MenuItem annotationColour = new MenuItem();\r
2661   MenuItem invertColSel = new MenuItem();\r
2662   Menu menu1 = new Menu();\r
2663   MenuItem showColumns = new MenuItem();\r
2664   MenuItem showSeqs = new MenuItem();\r
2665   Menu menu2 = new Menu();\r
2666   MenuItem hideColumns = new MenuItem();\r
2667   MenuItem hideSequences = new MenuItem();\r
2668   Menu formatMenu = new Menu();\r
2669   Menu selectMenu = new Menu();\r
2670   MenuItem newView = new MenuItem();\r
2671 \r
2672   public void mousePressed(MouseEvent evt)\r
2673   {\r
2674     PopupMenu popup = null;\r
2675     Label source = (Label) evt.getSource();\r
2676     if (source == embeddedFile)\r
2677     {\r
2678       popup = filePopup = genPopupMenu(filePopup, fileMenu);\r
2679     }\r
2680     else if (source == embeddedEdit)\r
2681     {\r
2682       popup = editPopup = genPopupMenu(editPopup, editMenu);\r
2683     }\r
2684     else if (source == embeddedSelect)\r
2685     {\r
2686       popup = searchPopup = genPopupMenu(searchPopup, selectMenu);\r
2687     }\r
2688     else if (source == embeddedView)\r
2689     {\r
2690       popup = viewPopup = genPopupMenu(viewPopup, viewMenu);\r
2691     }\r
2692     else if (source == embeddedFormat)\r
2693     {\r
2694       popup = formatPopup = genPopupMenu(formatPopup, formatMenu);\r
2695     }\r
2696     else if (source == embeddedColour)\r
2697     {\r
2698       popup = colourPopup = genPopupMenu(colourPopup, colourMenu);\r
2699     }\r
2700     else if (source == embeddedCalculate)\r
2701     {\r
2702       popup = calculatePopup = genPopupMenu(calculatePopup, calculateMenu);\r
2703     }\r
2704     else if (source == embeddedHelp)\r
2705     {\r
2706       popup = helpPopup = genPopupMenu(helpPopup, helpMenu);\r
2707     }\r
2708 \r
2709     embeddedMenu.add(popup);\r
2710     popup.show(embeddedMenu,\r
2711                source.getBounds().x,\r
2712                source.getBounds().y + source.getBounds().getSize().height);\r
2713   }\r
2714 \r
2715   PopupMenu genPopupMenu(PopupMenu popup, Menu original)\r
2716   {\r
2717     if (popup != null)\r
2718     {\r
2719       return popup;\r
2720     }\r
2721     popup = new PopupMenu();\r
2722     int m, mSize = original.getItemCount();\r
2723     for (m = 0; m < mSize; m++)\r
2724     {\r
2725       popup.add(original.getItem(m));\r
2726       mSize--;\r
2727       m--;\r
2728     }\r
2729 \r
2730     return popup;\r
2731   }\r
2732 \r
2733   public void mouseClicked(MouseEvent evt)\r
2734   {}\r
2735 \r
2736   public void mouseReleased(MouseEvent evt)\r
2737   {}\r
2738 \r
2739   public void mouseEntered(MouseEvent evt)\r
2740   {}\r
2741 \r
2742   public void mouseExited(MouseEvent evt)\r
2743   {}\r
2744 \r
2745 }\r