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