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