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