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