147c2dd020274cbcce590cfb020c8dcd498c95bf
[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.sequenceColours.clear();\r
984     viewport.setSelectionGroup(null);\r
985 \r
986     alignPanel.repaint();\r
987   }\r
988 \r
989   public void selectAllSequenceMenuItem_actionPerformed()\r
990   {\r
991     SequenceGroup sg = new SequenceGroup();\r
992     for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)\r
993     {\r
994       sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);\r
995     }\r
996     sg.setEndRes(viewport.alignment.getWidth()-1);\r
997     viewport.setSelectionGroup(sg);\r
998     alignPanel.repaint();\r
999     PaintRefresher.Refresh(null, viewport.alignment);\r
1000   }\r
1001 \r
1002   public void deselectAllSequenceMenuItem_actionPerformed()\r
1003   {\r
1004     if(viewport.cursorMode)\r
1005     {\r
1006       alignPanel.seqPanel.keyboardNo1=null;\r
1007       alignPanel.seqPanel.keyboardNo2=null;\r
1008     }\r
1009     viewport.setSelectionGroup(null);\r
1010     viewport.getColumnSelection().clear();\r
1011     viewport.setSelectionGroup(null);\r
1012     alignPanel.idPanel.idCanvas.searchResults = null;\r
1013     alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);\r
1014     alignPanel.repaint();\r
1015     PaintRefresher.Refresh(null, viewport.alignment);\r
1016   }\r
1017 \r
1018   public void invertSequenceMenuItem_actionPerformed()\r
1019   {\r
1020     SequenceGroup sg = viewport.getSelectionGroup();\r
1021     for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)\r
1022     {\r
1023       sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);\r
1024     }\r
1025 \r
1026     PaintRefresher.Refresh(null, viewport.alignment);\r
1027   }\r
1028 \r
1029   public void remove2LeftMenuItem_actionPerformed()\r
1030   {\r
1031   }\r
1032 \r
1033   public void remove2RightMenuItem_actionPerformed()\r
1034   {\r
1035   }\r
1036 \r
1037   public void removeGappedColumnMenuItem_actionPerformed()\r
1038   {\r
1039   }\r
1040 \r
1041   public void removeAllGapsMenuItem_actionPerformed()\r
1042   {\r
1043   }\r
1044 \r
1045   public void alignmentChanged()\r
1046   {\r
1047     viewport.alignment.padGaps();\r
1048     if(viewport.autocalculateConsensus)\r
1049     {\r
1050       viewport.updateConsensus();\r
1051       viewport.updateConservation();\r
1052     }\r
1053 \r
1054     resetAllColourSchemes();\r
1055     if(alignPanel.overviewPanel!=null)\r
1056       alignPanel.overviewPanel.updateOverviewImage();\r
1057 \r
1058     viewport.alignment.adjustSequenceAnnotations();\r
1059     alignPanel.repaint();\r
1060   }\r
1061 \r
1062   void resetAllColourSchemes()\r
1063   {\r
1064     ColourSchemeI cs = viewport.globalColourScheme;\r
1065     if(cs!=null)\r
1066     {\r
1067       if (cs instanceof ClustalxColourScheme)\r
1068       {\r
1069         ( (ClustalxColourScheme) viewport.getGlobalColourScheme()).\r
1070             resetClustalX(viewport.alignment.getSequences(),\r
1071                           viewport.alignment.getWidth());\r
1072       }\r
1073 \r
1074       cs.setConsensus(viewport.hconsensus);\r
1075       if (cs.conservationApplied())\r
1076       {\r
1077         Alignment al = (Alignment) viewport.alignment;\r
1078         Conservation c = new Conservation("All",\r
1079                                           ResidueProperties.propHash, 3,\r
1080                                           al.getSequences(), 0,\r
1081                                           al.getWidth() - 1);\r
1082         c.calculate();\r
1083         c.verdict(false, viewport.ConsPercGaps);\r
1084 \r
1085         cs.setConservation(c);\r
1086       }\r
1087     }\r
1088 \r
1089     int s, sSize = viewport.alignment.getGroups().size();\r
1090     for(s=0; s<sSize; s++)\r
1091     {\r
1092       SequenceGroup sg = (SequenceGroup)viewport.alignment.getGroups().elementAt(s);\r
1093       if(sg.cs!=null && sg.cs instanceof ClustalxColourScheme)\r
1094       {\r
1095         ((ClustalxColourScheme)sg.cs).resetClustalX(\r
1096             sg.getSequences(true), sg.getWidth());\r
1097       }\r
1098       sg.recalcConservation();\r
1099     }\r
1100   }\r
1101 \r
1102 \r
1103 \r
1104   public void findMenuItem_actionPerformed()\r
1105   {\r
1106     new Finder(alignPanel);\r
1107   }\r
1108 \r
1109   public void font_actionPerformed()\r
1110   {\r
1111     new FontChooser(alignPanel);\r
1112   }\r
1113 \r
1114 \r
1115   public void seqLimits_itemStateChanged()\r
1116   {\r
1117     viewport.setShowJVSuffix(seqLimits.getState());\r
1118     alignPanel.fontChanged();\r
1119     alignPanel.repaint();\r
1120   }\r
1121 \r
1122 \r
1123   protected void colourTextMenuItem_actionPerformed()\r
1124   {\r
1125     viewport.setColourText(colourTextMenuItem.getState());\r
1126     alignPanel.repaint();\r
1127   }\r
1128 \r
1129   protected void wrapMenuItem_actionPerformed()\r
1130   {\r
1131     viewport.setWrapAlignment(wrapMenuItem.getState());\r
1132     alignPanel.setWrapAlignment(wrapMenuItem.getState());\r
1133     scaleAbove.setEnabled(wrapMenuItem.getState());\r
1134     scaleLeft.setEnabled(wrapMenuItem.getState());\r
1135     scaleRight.setEnabled(wrapMenuItem.getState());\r
1136     alignPanel.repaint();\r
1137   }\r
1138 \r
1139 \r
1140   protected void scaleAbove_actionPerformed()\r
1141   {\r
1142     viewport.setScaleAboveWrapped(scaleAbove.getState());\r
1143     alignPanel.repaint();\r
1144   }\r
1145 \r
1146   protected void scaleLeft_actionPerformed()\r
1147   {\r
1148     viewport.setScaleLeftWrapped(scaleLeft.getState());\r
1149     alignPanel.repaint();\r
1150   }\r
1151 \r
1152   protected void scaleRight_actionPerformed()\r
1153   {\r
1154     viewport.setScaleRightWrapped(scaleRight.getState());\r
1155     alignPanel.repaint();\r
1156   }\r
1157 \r
1158   public void viewBoxesMenuItem_actionPerformed()\r
1159   {\r
1160     viewport.setShowBoxes(viewBoxesMenuItem.getState());\r
1161     alignPanel.repaint();\r
1162   }\r
1163 \r
1164   public void viewTextMenuItem_actionPerformed()\r
1165   {\r
1166     viewport.setShowText(viewTextMenuItem.getState());\r
1167     alignPanel.repaint();\r
1168   }\r
1169 \r
1170   protected void renderGapsMenuItem_actionPerformed()\r
1171   {\r
1172     viewport.setRenderGaps(renderGapsMenuItem.getState());\r
1173     alignPanel.repaint();\r
1174   }\r
1175 \r
1176   public void annotationPanelMenuItem_actionPerformed()\r
1177   {\r
1178     viewport.setShowAnnotation(annotationPanelMenuItem.getState());\r
1179     alignPanel.setAnnotationVisible(annotationPanelMenuItem.getState());\r
1180   }\r
1181 \r
1182   public void featureSettings_actionPerformed()\r
1183   {\r
1184     new FeatureSettings(viewport, alignPanel);\r
1185   }\r
1186 \r
1187   public void overviewMenuItem_actionPerformed()\r
1188   {\r
1189     if (alignPanel.overviewPanel != null)\r
1190     {\r
1191       return;\r
1192     }\r
1193 \r
1194     Frame frame = new Frame();\r
1195     OverviewPanel overview = new OverviewPanel(alignPanel);\r
1196     frame.add(overview);\r
1197     // +50 must allow for applet frame window\r
1198     jalview.bin.JalviewLite.addFrame(frame, "Overview " + this.getTitle(),\r
1199                                      overview.preferredSize().width,\r
1200                                      overview.preferredSize().height + 50);\r
1201 \r
1202     frame.pack();\r
1203     frame.addWindowListener(new WindowAdapter()\r
1204     {\r
1205       public void windowClosing(WindowEvent e)\r
1206       {\r
1207         alignPanel.setOverviewPanel(null);\r
1208       };\r
1209     });\r
1210 \r
1211     alignPanel.setOverviewPanel(overview);\r
1212 \r
1213   }\r
1214 \r
1215   protected void noColourmenuItem_actionPerformed()\r
1216   {\r
1217     changeColour(null);\r
1218   }\r
1219 \r
1220   public void clustalColour_actionPerformed()\r
1221   {\r
1222     abovePIDThreshold.setState(false);\r
1223     changeColour(new ClustalxColourScheme(viewport.alignment.getSequences(),\r
1224                                           viewport.alignment.getWidth()));\r
1225   }\r
1226 \r
1227   public void zappoColour_actionPerformed()\r
1228   {\r
1229     changeColour(new ZappoColourScheme());\r
1230   }\r
1231 \r
1232   public void taylorColour_actionPerformed()\r
1233   {\r
1234     changeColour(new TaylorColourScheme());\r
1235   }\r
1236 \r
1237   public void hydrophobicityColour_actionPerformed()\r
1238   {\r
1239     changeColour(new HydrophobicColourScheme());\r
1240   }\r
1241 \r
1242   public void helixColour_actionPerformed()\r
1243   {\r
1244     changeColour(new HelixColourScheme());\r
1245   }\r
1246 \r
1247   public void strandColour_actionPerformed()\r
1248   {\r
1249     changeColour(new StrandColourScheme());\r
1250   }\r
1251 \r
1252   public void turnColour_actionPerformed()\r
1253   {\r
1254     changeColour(new TurnColourScheme());\r
1255   }\r
1256 \r
1257   public void buriedColour_actionPerformed()\r
1258   {\r
1259     changeColour(new BuriedColourScheme());\r
1260   }\r
1261 \r
1262   public void nucleotideColour_actionPerformed()\r
1263   {\r
1264     changeColour(new NucleotideColourScheme());\r
1265   }\r
1266 \r
1267   protected void applyToAllGroups_actionPerformed()\r
1268   {\r
1269     viewport.setColourAppliesToAllGroups(applyToAllGroups.getState());\r
1270   }\r
1271 \r
1272   void changeColour(ColourSchemeI cs)\r
1273   {\r
1274     int threshold = 0;\r
1275 \r
1276     if(cs!=null)\r
1277     {\r
1278       if (viewport.getAbovePIDThreshold())\r
1279       {\r
1280         threshold = SliderPanel.setPIDSliderSource(alignPanel, cs, "Background");\r
1281 \r
1282         cs.setThreshold(threshold, viewport.getIgnoreGapsConsensus());\r
1283 \r
1284         viewport.setGlobalColourScheme(cs);\r
1285       }\r
1286       else\r
1287       {\r
1288         cs.setThreshold(0, viewport.getIgnoreGapsConsensus());\r
1289       }\r
1290 \r
1291       if (viewport.getConservationSelected())\r
1292       {\r
1293 \r
1294         Alignment al = (Alignment) viewport.alignment;\r
1295         Conservation c = new Conservation("All",\r
1296                                           ResidueProperties.propHash, 3,\r
1297                                           al.getSequences(), 0,\r
1298                                           al.getWidth() - 1);\r
1299 \r
1300         c.calculate();\r
1301         c.verdict(false, viewport.ConsPercGaps);\r
1302 \r
1303         cs.setConservation(c);\r
1304 \r
1305         cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel, cs,\r
1306             "Background"));\r
1307 \r
1308       }\r
1309       else\r
1310       {\r
1311         cs.setConservation(null);\r
1312       }\r
1313 \r
1314       cs.setConsensus(viewport.hconsensus);\r
1315 \r
1316     }\r
1317     viewport.setGlobalColourScheme(cs);\r
1318 \r
1319     if (viewport.getColourAppliesToAllGroups())\r
1320     {\r
1321       Vector groups = viewport.alignment.getGroups();\r
1322       for (int i = 0; i < groups.size(); i++)\r
1323       {\r
1324         SequenceGroup sg = (SequenceGroup) groups.elementAt(i);\r
1325 \r
1326         if(cs==null)\r
1327         {\r
1328           sg.cs = null;\r
1329           continue;\r
1330         }\r
1331         if (cs instanceof ClustalxColourScheme)\r
1332         {\r
1333           sg.cs = new ClustalxColourScheme(sg.getSequences(true), sg.getWidth());\r
1334         }\r
1335         else\r
1336         {\r
1337           try\r
1338           {\r
1339             sg.cs = (ColourSchemeI) cs.getClass().newInstance();\r
1340           }\r
1341           catch (Exception ex)\r
1342           {\r
1343             ex.printStackTrace();\r
1344             sg.cs = cs;\r
1345           }\r
1346         }\r
1347 \r
1348         if (viewport.getAbovePIDThreshold()\r
1349             || cs instanceof PIDColourScheme\r
1350             || cs instanceof Blosum62ColourScheme)\r
1351         {\r
1352           sg.cs.setThreshold(threshold, viewport.getIgnoreGapsConsensus());\r
1353           sg.cs.setConsensus(AAFrequency.calculate(sg.getSequences(true), 0, sg.getWidth()));\r
1354         }\r
1355         else\r
1356           sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());\r
1357 \r
1358         if (viewport.getConservationSelected())\r
1359         {\r
1360           Conservation c = new Conservation("Group",\r
1361                                             ResidueProperties.propHash, 3,\r
1362                                             sg.getSequences(true), 0,\r
1363                                             viewport.alignment.getWidth() - 1);\r
1364           c.calculate();\r
1365           c.verdict(false, viewport.ConsPercGaps);\r
1366           sg.cs.setConservation(c);\r
1367         }\r
1368         else\r
1369         {\r
1370           sg.cs.setConservation(null);\r
1371           sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());\r
1372         }\r
1373 \r
1374       }\r
1375     }\r
1376 \r
1377 \r
1378     if (alignPanel.getOverviewPanel() != null)\r
1379     {\r
1380       alignPanel.getOverviewPanel().updateOverviewImage();\r
1381     }\r
1382 \r
1383     alignPanel.repaint();\r
1384   }\r
1385 \r
1386 \r
1387 \r
1388   protected void modifyPID_actionPerformed()\r
1389   {\r
1390     if (viewport.getAbovePIDThreshold() && viewport.globalColourScheme!=null)\r
1391     {\r
1392       SliderPanel.setPIDSliderSource(alignPanel, viewport.getGlobalColourScheme(),\r
1393                                      "Background");\r
1394       SliderPanel.showPIDSlider();\r
1395     }\r
1396   }\r
1397 \r
1398   protected void modifyConservation_actionPerformed()\r
1399   {\r
1400     if (viewport.getConservationSelected() && viewport.globalColourScheme!=null)\r
1401     {\r
1402       SliderPanel.setConservationSlider(alignPanel, viewport.globalColourScheme,\r
1403                                         "Background");\r
1404       SliderPanel.showConservationSlider();\r
1405     }\r
1406   }\r
1407 \r
1408   protected void conservationMenuItem_actionPerformed()\r
1409   {\r
1410     viewport.setConservationSelected(conservationMenuItem.getState());\r
1411 \r
1412     viewport.setAbovePIDThreshold(false);\r
1413     abovePIDThreshold.setState(false);\r
1414 \r
1415     changeColour(viewport.getGlobalColourScheme());\r
1416 \r
1417     modifyConservation_actionPerformed();\r
1418   }\r
1419 \r
1420   public void abovePIDThreshold_actionPerformed()\r
1421   {\r
1422     viewport.setAbovePIDThreshold(abovePIDThreshold.getState());\r
1423 \r
1424     conservationMenuItem.setState(false);\r
1425     viewport.setConservationSelected(false);\r
1426 \r
1427     changeColour(viewport.getGlobalColourScheme());\r
1428 \r
1429     modifyPID_actionPerformed();\r
1430   }\r
1431 \r
1432   public void userDefinedColour_actionPerformed()\r
1433   {\r
1434     new UserDefinedColours(alignPanel, null);\r
1435   }\r
1436 \r
1437   public void PIDColour_actionPerformed()\r
1438   {\r
1439     changeColour(new PIDColourScheme());\r
1440   }\r
1441 \r
1442   public void BLOSUM62Colour_actionPerformed()\r
1443   {\r
1444     changeColour(new Blosum62ColourScheme());\r
1445   }\r
1446 \r
1447   public void sortPairwiseMenuItem_actionPerformed()\r
1448   {\r
1449   //  addHistoryItem(new HistoryItem("Pairwise Sort", viewport.alignment,\r
1450    //                                HistoryItem.SORT));\r
1451     AlignmentSorter.sortByPID(viewport.getAlignment(),\r
1452                               viewport.getAlignment().getSequenceAt(0));\r
1453     alignPanel.repaint();\r
1454   }\r
1455 \r
1456   public void sortIDMenuItem_actionPerformed()\r
1457   {\r
1458   //  addHistoryItem(new HistoryItem("ID Sort", viewport.alignment,\r
1459    //                                HistoryItem.SORT));\r
1460     AlignmentSorter.sortByID(viewport.getAlignment());\r
1461     alignPanel.repaint();\r
1462   }\r
1463 \r
1464   public void sortGroupMenuItem_actionPerformed()\r
1465   {\r
1466   //  addHistoryItem(new HistoryItem("Group Sort", viewport.alignment,\r
1467   //                                 HistoryItem.SORT));\r
1468     AlignmentSorter.sortByGroup(viewport.getAlignment());\r
1469     alignPanel.repaint();\r
1470 \r
1471   }\r
1472 \r
1473   public void removeRedundancyMenuItem_actionPerformed()\r
1474   {\r
1475      new RedundancyPanel(alignPanel);\r
1476   }\r
1477 \r
1478   public void pairwiseAlignmentMenuItem_actionPerformed()\r
1479   {\r
1480     if (viewport.getSelectionGroup()!=null\r
1481         && viewport.getSelectionGroup().getSize(false) > 1)\r
1482     {\r
1483       Frame frame = new Frame();\r
1484       frame.add(new PairwiseAlignPanel(alignPanel));\r
1485       jalview.bin.JalviewLite.addFrame(frame, "Pairwise Alignment", 600, 500);\r
1486     }\r
1487   }\r
1488 \r
1489   public void PCAMenuItem_actionPerformed()\r
1490   {\r
1491     //are the sequences aligned?\r
1492     if (!viewport.alignment.isAligned())\r
1493     {\r
1494       SequenceI current;\r
1495       int Width = viewport.getAlignment().getWidth();\r
1496 \r
1497       for (int i = 0; i < viewport.getAlignment().getSequences().size();\r
1498            i++)\r
1499       {\r
1500         current = viewport.getAlignment().getSequenceAt(i);\r
1501 \r
1502         if (current.getLength() < Width)\r
1503         {\r
1504           current.insertCharAt(Width - 1, viewport.getGapCharacter());\r
1505         }\r
1506       }\r
1507       alignPanel.repaint();\r
1508     }\r
1509 \r
1510     if ( (viewport.getSelectionGroup() != null &&\r
1511           viewport.getSelectionGroup().getSize(false) < 4 &&\r
1512           viewport.getSelectionGroup().getSize(false) > 0)\r
1513         || viewport.getAlignment().getHeight() < 4)\r
1514     {\r
1515       return;\r
1516     }\r
1517 \r
1518     try\r
1519     {\r
1520       new PCAPanel(viewport);\r
1521     }\r
1522     catch (java.lang.OutOfMemoryError ex)\r
1523     {\r
1524     }\r
1525 \r
1526   }\r
1527 \r
1528   public void averageDistanceTreeMenuItem_actionPerformed()\r
1529   {\r
1530     NewTreePanel("AV", "PID", "Average distance tree using PID");\r
1531   }\r
1532 \r
1533   public void neighbourTreeMenuItem_actionPerformed()\r
1534   {\r
1535     NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");\r
1536   }\r
1537 \r
1538   protected void njTreeBlosumMenuItem_actionPerformed()\r
1539   {\r
1540     NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");\r
1541   }\r
1542 \r
1543   protected void avTreeBlosumMenuItem_actionPerformed()\r
1544   {\r
1545     NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62PID");\r
1546   }\r
1547 \r
1548   void NewTreePanel(String type, String pwType, String title)\r
1549   {\r
1550     //are the sequences aligned?\r
1551     if (!viewport.alignment.isAligned())\r
1552     {\r
1553       SequenceI current;\r
1554       int Width = viewport.getAlignment().getWidth();\r
1555 \r
1556       for (int i = 0; i < viewport.getAlignment().getSequences().size();\r
1557            i++)\r
1558       {\r
1559         current = viewport.getAlignment().getSequenceAt(i);\r
1560 \r
1561         if (current.getLength() < Width)\r
1562         {\r
1563           current.insertCharAt(Width - 1, viewport.getGapCharacter());\r
1564         }\r
1565       }\r
1566       alignPanel.repaint();\r
1567 \r
1568     }\r
1569 \r
1570     if ( (viewport.getSelectionGroup() != null &&\r
1571           viewport.getSelectionGroup().getSize(false) > 1)\r
1572       || (viewport.getSelectionGroup() == null\r
1573           && viewport.alignment.getHeight() > 1))\r
1574     {\r
1575       final TreePanel tp = new TreePanel(viewport,\r
1576                                          type,\r
1577                                          pwType);\r
1578 \r
1579       addTreeMenuItem(tp, title);\r
1580 \r
1581       jalview.bin.JalviewLite.addFrame(tp, title, 600, 500);\r
1582     }\r
1583   }\r
1584 \r
1585   void loadTree_actionPerformed()\r
1586   {\r
1587       CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this);\r
1588       cap.setText("Paste your Newick tree file here.");\r
1589       cap.treeImport = true;\r
1590       Frame frame = new Frame();\r
1591       frame.add(cap);\r
1592       jalview.bin.JalviewLite.addFrame(frame, "Paste Newick file ", 400, 300);\r
1593   }\r
1594 \r
1595   public void loadTree(jalview.io.NewickFile tree, String treeFile)\r
1596   {\r
1597     TreePanel tp = new TreePanel(viewport,\r
1598                                  treeFile,\r
1599                                  "From File - ",\r
1600                                  tree);\r
1601     jalview.bin.JalviewLite.addFrame(tp, treeFile, 600, 500);\r
1602     addTreeMenuItem(tp, treeFile);\r
1603   }\r
1604 \r
1605   void addTreeMenuItem(final TreePanel treePanel, String title)\r
1606   {\r
1607     final MenuItem item = new MenuItem(title);\r
1608     sortByTreeMenu.add(item);\r
1609     item.addActionListener(new java.awt.event.ActionListener()\r
1610     {\r
1611       public void actionPerformed(ActionEvent evt)\r
1612       {\r
1613       //  addHistoryItem(new HistoryItem("Sort", viewport.alignment,\r
1614       //                                 HistoryItem.SORT));\r
1615         AlignmentSorter.sortByTree(viewport.getAlignment(), treePanel.getTree());\r
1616         alignPanel.repaint();\r
1617       }\r
1618     });\r
1619 \r
1620     treePanel.addWindowListener(new WindowAdapter()\r
1621     {\r
1622       public void windowClosing(WindowEvent e)\r
1623       {\r
1624         sortByTreeMenu.remove(item);\r
1625       };\r
1626     });\r
1627   }\r
1628 \r
1629   protected void documentation_actionPerformed()\r
1630   {\r
1631     showURL("http://www.jalview.org/help.html", "HELP");\r
1632   }\r
1633 \r
1634   protected void about_actionPerformed()\r
1635   {\r
1636 \r
1637     class AboutPanel extends Canvas\r
1638     {\r
1639       String version;\r
1640       public AboutPanel(String version)\r
1641       { this.version = version; }\r
1642 \r
1643       public void paint(Graphics g)\r
1644       {\r
1645         g.setColor(Color.white);\r
1646         g.fillRect(0, 0, getSize().width, getSize().height);\r
1647         g.setFont(new Font("Helvetica", Font.PLAIN, 12));\r
1648         FontMetrics fm = g.getFontMetrics();\r
1649         int fh = fm.getHeight();\r
1650         int y = 5, x = 7;\r
1651         g.setColor(Color.black);\r
1652         g.setFont(new Font("Helvetica", Font.BOLD, 14));\r
1653         g.drawString("Jalview - Release "+version, 200, y += fh);\r
1654         g.setFont(new Font("Helvetica", Font.PLAIN, 12));\r
1655         g.drawString("Authors:  Michele Clamp, James Cuff, Steve Searle, Andrew Waterhouse, Jim Procter & Geoff Barton.",\r
1656                      x, y += fh * 2);\r
1657         g.drawString("Current development managed by Andrew Waterhouse; Barton Group, University of Dundee.",\r
1658                      x, y += fh);\r
1659         g.drawString(\r
1660             "For any issues relating to Jalview, email help@jalview.org", x,\r
1661             y += fh);\r
1662         g.drawString("If  you use JalView, please cite:", x, y += fh + 8);\r
1663         g.drawString("\"Clamp, M., Cuff, J., Searle, S. M. and Barton, G. J. (2004), The Jalview Java Alignment Editor\"",\r
1664                      x, y += fh);\r
1665         g.drawString("Bioinformatics,  2004 20;426-7.", x, y += fh);\r
1666       }\r
1667     }\r
1668 \r
1669     String version = "test";\r
1670     java.net.URL url = getClass().getResource("/.build_properties");\r
1671     if (url != null)\r
1672     {\r
1673       try\r
1674       {\r
1675         BufferedReader reader = new BufferedReader(new InputStreamReader(\r
1676             url.openStream()));\r
1677         String line;\r
1678         while ( (line = reader.readLine()) != null)\r
1679         {\r
1680           if (line.indexOf("VERSION") > -1)\r
1681           {\r
1682             version = line.substring(line.indexOf("=") + 1);\r
1683           }\r
1684         }\r
1685       }\r
1686       catch (Exception ex)\r
1687       {\r
1688         ex.printStackTrace();\r
1689       }\r
1690     }\r
1691 \r
1692 \r
1693     Frame frame = new Frame();\r
1694     frame.add(new AboutPanel(version));\r
1695     jalview.bin.JalviewLite.addFrame(frame, "Jalview", 580, 200);\r
1696 \r
1697   }\r
1698 \r
1699   public void showURL(String url, String target)\r
1700   {\r
1701     if (viewport.applet == null)\r
1702     {\r
1703       System.out.println("Not running as applet - no browser available.");\r
1704     }\r
1705     else\r
1706     {\r
1707       try\r
1708       {\r
1709         System.out.println("Show url: "+url);\r
1710         viewport.applet.getAppletContext().showDocument(new java.net.URL(url),\r
1711                                                target);\r
1712       }\r
1713       catch (Exception ex)\r
1714       {\r
1715         ex.printStackTrace();\r
1716       }\r
1717     }\r
1718   }\r
1719 \r
1720 \r
1721   //////////////////////////////////////////////////////////////////////////////////\r
1722   //JBuilder Graphics here\r
1723 \r
1724     protected MenuBar alignFrameMenuBar = new MenuBar();\r
1725     protected Menu fileMenu = new Menu("File");\r
1726     protected MenuItem loadApplication = new MenuItem("View in Full Application");\r
1727     protected MenuItem loadTree = new MenuItem("Load Associated Tree");\r
1728     protected MenuItem closeMenuItem = new MenuItem("Close");\r
1729     protected Menu editMenu = new Menu("Edit");\r
1730     protected Menu viewMenu = new Menu("View");\r
1731     protected Menu colourMenu = new Menu("Colour");\r
1732     protected Menu calculateMenu = new Menu("Calculate");\r
1733     protected MenuItem selectAllSequenceMenuItem = new MenuItem("Select all");\r
1734     protected MenuItem deselectAllSequenceMenuItem = new MenuItem("Deselect All");\r
1735     protected MenuItem invertSequenceMenuItem = new MenuItem("Invert Selection");\r
1736     protected MenuItem remove2LeftMenuItem = new MenuItem();\r
1737     protected MenuItem remove2RightMenuItem = new MenuItem();\r
1738     protected MenuItem removeGappedColumnMenuItem = new MenuItem();\r
1739     protected MenuItem removeAllGapsMenuItem = new MenuItem();\r
1740     protected CheckboxMenuItem viewBoxesMenuItem = new CheckboxMenuItem();\r
1741     protected CheckboxMenuItem viewTextMenuItem = new CheckboxMenuItem();\r
1742     protected MenuItem sortPairwiseMenuItem = new MenuItem();\r
1743     protected MenuItem sortIDMenuItem = new MenuItem();\r
1744     protected MenuItem sortGroupMenuItem = new MenuItem();\r
1745     protected MenuItem removeRedundancyMenuItem = new MenuItem();\r
1746     protected MenuItem pairwiseAlignmentMenuItem = new MenuItem();\r
1747     protected MenuItem PCAMenuItem = new MenuItem();\r
1748     protected MenuItem averageDistanceTreeMenuItem = new MenuItem();\r
1749     protected MenuItem neighbourTreeMenuItem = new MenuItem();\r
1750     BorderLayout borderLayout1 = new BorderLayout();\r
1751     public Label statusBar = new Label();\r
1752     protected Menu outputTextboxMenu = new Menu();\r
1753     protected MenuItem clustalColour = new MenuItem();\r
1754     protected MenuItem zappoColour = new MenuItem();\r
1755     protected MenuItem taylorColour = new MenuItem();\r
1756     protected MenuItem hydrophobicityColour = new MenuItem();\r
1757     protected MenuItem helixColour = new MenuItem();\r
1758     protected MenuItem strandColour = new MenuItem();\r
1759     protected MenuItem turnColour = new MenuItem();\r
1760     protected MenuItem buriedColour = new MenuItem();\r
1761     protected MenuItem userDefinedColour = new MenuItem();\r
1762     protected MenuItem PIDColour = new MenuItem();\r
1763     protected MenuItem BLOSUM62Colour = new MenuItem();\r
1764     MenuItem njTreeBlosumMenuItem = new MenuItem();\r
1765     MenuItem avDistanceTreeBlosumMenuItem = new MenuItem();\r
1766     protected CheckboxMenuItem annotationPanelMenuItem = new CheckboxMenuItem();\r
1767     protected CheckboxMenuItem colourTextMenuItem = new CheckboxMenuItem();\r
1768     MenuItem overviewMenuItem = new MenuItem();\r
1769     protected MenuItem undoMenuItem = new MenuItem();\r
1770     protected MenuItem redoMenuItem = new MenuItem();\r
1771     protected CheckboxMenuItem conservationMenuItem = new CheckboxMenuItem();\r
1772     MenuItem noColourmenuItem = new MenuItem();\r
1773     protected CheckboxMenuItem wrapMenuItem = new CheckboxMenuItem();\r
1774     protected CheckboxMenuItem renderGapsMenuItem = new CheckboxMenuItem();\r
1775     MenuItem findMenuItem = new MenuItem();\r
1776     Menu searchMenu = new Menu();\r
1777     protected CheckboxMenuItem abovePIDThreshold = new CheckboxMenuItem();\r
1778     protected MenuItem nucleotideColour = new MenuItem();\r
1779     MenuItem deleteGroups = new MenuItem();\r
1780     MenuItem delete = new MenuItem();\r
1781     MenuItem copy = new MenuItem();\r
1782     MenuItem cut = new MenuItem();\r
1783     Menu pasteMenu = new Menu();\r
1784     MenuItem pasteNew = new MenuItem();\r
1785     MenuItem pasteThis = new MenuItem();\r
1786     protected CheckboxMenuItem applyToAllGroups = new CheckboxMenuItem();\r
1787     protected MenuItem font = new MenuItem();\r
1788     protected CheckboxMenuItem scaleAbove = new CheckboxMenuItem();\r
1789     protected CheckboxMenuItem scaleLeft = new CheckboxMenuItem();\r
1790     protected CheckboxMenuItem scaleRight = new CheckboxMenuItem();\r
1791     MenuItem modifyPID = new MenuItem();\r
1792     MenuItem modifyConservation = new MenuItem();\r
1793     protected CheckboxMenuItem autoCalculate\r
1794         = new CheckboxMenuItem("Autocalculate Consensus", true);\r
1795     protected Menu sortByTreeMenu = new Menu();\r
1796     Menu sort = new Menu();\r
1797     Menu calculate = new Menu();\r
1798     MenuItem inputText = new MenuItem();\r
1799     Menu helpMenu = new Menu();\r
1800     MenuItem documentation = new MenuItem();\r
1801     MenuItem about = new MenuItem();\r
1802     protected CheckboxMenuItem seqLimits = new CheckboxMenuItem();\r
1803   Panel embeddedMenu;\r
1804   Label embeddedEdit;\r
1805   Label embeddedSearch;\r
1806   Label embeddedView;\r
1807   Label embeddedColour;\r
1808   Label embeddedFile;\r
1809   Label embeddedHelp;\r
1810   Label embeddedCalculate;\r
1811   FlowLayout flowLayout1;\r
1812 \r
1813   private void jbInit() throws Exception {\r
1814 \r
1815       setMenuBar(alignFrameMenuBar);\r
1816 \r
1817       MenuItem item;\r
1818 \r
1819       // dynamically fill save as menu with available formats\r
1820       for (int i = 0; i < jalview.io.AppletFormatAdapter.WRITEABLE_FORMATS.length; i++)\r
1821       {\r
1822 \r
1823         item = new MenuItem( jalview.io.AppletFormatAdapter.WRITEABLE_FORMATS[i]);\r
1824 \r
1825         item.addActionListener(new java.awt.event.ActionListener()\r
1826         {\r
1827           public void actionPerformed(ActionEvent e)\r
1828           {\r
1829             outputText_actionPerformed(e);\r
1830           }\r
1831         });\r
1832 \r
1833         outputTextboxMenu.add(item);\r
1834       }\r
1835         closeMenuItem.addActionListener(this);\r
1836         loadApplication.addActionListener(this);\r
1837 \r
1838         loadTree.addActionListener(this);\r
1839         selectAllSequenceMenuItem.addActionListener(this);\r
1840         deselectAllSequenceMenuItem.addActionListener(this);\r
1841         invertSequenceMenuItem.addActionListener(this);\r
1842         remove2LeftMenuItem.setLabel("Remove Left");\r
1843         remove2LeftMenuItem.addActionListener(this);\r
1844         remove2RightMenuItem.setLabel("Remove Right");\r
1845         remove2RightMenuItem.addActionListener(this);\r
1846         removeGappedColumnMenuItem.setLabel("Remove Empty Columns");\r
1847         removeGappedColumnMenuItem.addActionListener(this);\r
1848         removeAllGapsMenuItem.setLabel("Remove All Gaps");\r
1849         removeAllGapsMenuItem.addActionListener(this);\r
1850         viewBoxesMenuItem.setLabel("Boxes");\r
1851         viewBoxesMenuItem.setState(true);\r
1852         viewBoxesMenuItem.addItemListener(this);\r
1853         viewTextMenuItem.setLabel("Text");\r
1854         viewTextMenuItem.setState(true);\r
1855         viewTextMenuItem.addItemListener(this);\r
1856         sortPairwiseMenuItem.setLabel("by Pairwise Identity");\r
1857         sortPairwiseMenuItem.addActionListener(this);\r
1858         sortIDMenuItem.setLabel("by ID");\r
1859         sortIDMenuItem.addActionListener(this);\r
1860         sortGroupMenuItem.setLabel("by Group");\r
1861         sortGroupMenuItem.addActionListener(this);\r
1862         removeRedundancyMenuItem.setLabel("Remove Redundancy...");\r
1863         removeRedundancyMenuItem.addActionListener(this);\r
1864         pairwiseAlignmentMenuItem.setLabel("Pairwise Alignments...");\r
1865         pairwiseAlignmentMenuItem.addActionListener(this);\r
1866         PCAMenuItem.setLabel("Principal Component Analysis");\r
1867         PCAMenuItem.addActionListener(this);\r
1868         averageDistanceTreeMenuItem.setLabel(\r
1869             "Average Distance Using % Identity");\r
1870         averageDistanceTreeMenuItem.addActionListener(this);\r
1871         neighbourTreeMenuItem.setLabel("Neighbour Joining Using % Identity");\r
1872         neighbourTreeMenuItem.addActionListener(this);\r
1873         alignFrameMenuBar.setFont(new java.awt.Font("Verdana", 0, 11));\r
1874         statusBar.setBackground(Color.white);\r
1875         statusBar.setFont(new java.awt.Font("Verdana", 0, 11));\r
1876         statusBar.setText("Status bar");\r
1877         outputTextboxMenu.setLabel("Output to Textbox");\r
1878         clustalColour.setLabel("Clustalx");\r
1879 \r
1880         clustalColour.addActionListener(this);\r
1881         zappoColour.setLabel("Zappo");\r
1882         zappoColour.addActionListener(this);\r
1883         taylorColour.setLabel("Taylor");\r
1884         taylorColour.addActionListener(this);\r
1885         hydrophobicityColour.setLabel("Hydrophobicity");\r
1886         hydrophobicityColour.addActionListener(this);\r
1887         helixColour.setLabel("Helix Propensity");\r
1888         helixColour.addActionListener(this);\r
1889         strandColour.setLabel("Strand Propensity");\r
1890         strandColour.addActionListener(this);\r
1891         turnColour.setLabel("Turn Propensity");\r
1892         turnColour.addActionListener(this);\r
1893         buriedColour.setLabel("Buried Index");\r
1894         buriedColour.addActionListener(this);\r
1895         userDefinedColour.setLabel("User Defined...");\r
1896         userDefinedColour.addActionListener(this);\r
1897         PIDColour.setLabel("Percentage Identity");\r
1898         PIDColour.addActionListener(this);\r
1899         BLOSUM62Colour.setLabel("BLOSUM62 Score");\r
1900         BLOSUM62Colour.addActionListener(this);\r
1901         avDistanceTreeBlosumMenuItem.setLabel(\r
1902             "Average Distance Using BLOSUM62");\r
1903         avDistanceTreeBlosumMenuItem.addActionListener(this);\r
1904         njTreeBlosumMenuItem.setLabel("Neighbour Joining Using BLOSUM62");\r
1905         njTreeBlosumMenuItem.addActionListener(this);\r
1906         annotationPanelMenuItem.setLabel("Show Annotations");\r
1907         annotationPanelMenuItem.addItemListener(this);\r
1908         colourTextMenuItem.setLabel("Colour Text");\r
1909         colourTextMenuItem.addItemListener(this);\r
1910         overviewMenuItem.setLabel("Overview Window");\r
1911         overviewMenuItem.addActionListener(this);\r
1912         undoMenuItem.setEnabled(false);\r
1913         undoMenuItem.setLabel("Undo");\r
1914         undoMenuItem.addActionListener(this);\r
1915         redoMenuItem.setEnabled(false);\r
1916         redoMenuItem.setLabel("Redo");\r
1917         redoMenuItem.addActionListener(this);\r
1918         conservationMenuItem.setLabel("by Conservation");\r
1919         conservationMenuItem.addItemListener(this);\r
1920         noColourmenuItem.setLabel("None");\r
1921         noColourmenuItem.addActionListener(this);\r
1922         wrapMenuItem.setLabel("Wrap");\r
1923         wrapMenuItem.addItemListener(this);\r
1924         renderGapsMenuItem.setLabel("Show Gaps");\r
1925         renderGapsMenuItem.setState(true);\r
1926         renderGapsMenuItem.addItemListener(this);\r
1927         findMenuItem.setLabel("Find...");\r
1928         findMenuItem.addActionListener(this);\r
1929         searchMenu.setLabel("Search");\r
1930 \r
1931         abovePIDThreshold.setLabel("Above Identity Threshold");\r
1932         abovePIDThreshold.addItemListener(this);\r
1933         nucleotideColour.setLabel("Nucleotide");\r
1934         nucleotideColour.addActionListener(this);\r
1935         deleteGroups.setLabel("Undefine Groups");\r
1936         deleteGroups.addActionListener(this);\r
1937         copy.setLabel("Copy");\r
1938         copy.addActionListener(this);\r
1939         cut.setLabel("Cut");\r
1940         cut.addActionListener(this);\r
1941         delete.setLabel("Delete");\r
1942         delete.addActionListener(this);\r
1943         pasteMenu.setLabel("Paste");\r
1944         pasteNew.setLabel("To New Alignment");\r
1945         pasteNew.addActionListener(this);\r
1946         pasteThis.setLabel("Add To This Alignment");\r
1947         pasteThis.addActionListener(this);\r
1948         applyToAllGroups.setLabel("Apply Colour To All Groups");\r
1949         applyToAllGroups.setState(true);\r
1950         applyToAllGroups.addItemListener(this);\r
1951         font.setLabel("Font...");\r
1952         font.addActionListener(this);\r
1953         scaleAbove.setLabel("Scale Above");\r
1954         scaleAbove.setState(true);\r
1955         scaleAbove.setEnabled(false);\r
1956         scaleAbove.addItemListener(this);\r
1957         scaleLeft.setEnabled(false);\r
1958         scaleLeft.setState(true);\r
1959         scaleLeft.setLabel("Scale Left");\r
1960         scaleLeft.addItemListener(this);\r
1961         scaleRight.setEnabled(false);\r
1962         scaleRight.setState(true);\r
1963         scaleRight.setLabel("Scale Right");\r
1964         scaleRight.addItemListener(this);\r
1965         modifyPID.setLabel("Modify Identity Threshold...");\r
1966         modifyPID.addActionListener(this);\r
1967         modifyConservation.setLabel("Modify Conservation Threshold...");\r
1968         modifyConservation.addActionListener(this);\r
1969         sortByTreeMenu.setLabel("By Tree Order");\r
1970         sort.setLabel("Sort");\r
1971         calculate.setLabel("Calculate Tree");\r
1972         autoCalculate.addItemListener(this);\r
1973         inputText.setLabel("Input from textbox");\r
1974         inputText.addActionListener(this);\r
1975 \r
1976         helpMenu.setLabel("Help");\r
1977         documentation.setLabel("Documentation");\r
1978         documentation.addActionListener(this);\r
1979 \r
1980         about.setLabel("About...");\r
1981         about.addActionListener(this);\r
1982           seqLimits.setState(true);\r
1983     seqLimits.setLabel("Show Sequence Limits");\r
1984     seqLimits.addItemListener(this);\r
1985     featureSettings.setLabel("Feature Settings...");\r
1986     featureSettings.addActionListener(this);\r
1987     sequenceFeatures.setLabel("Sequence Features");\r
1988     sequenceFeatures.addItemListener(this);\r
1989     sequenceFeatures.setState(false);\r
1990     annotationColour.setLabel("by Annotation...");\r
1991     annotationColour.addActionListener(this);\r
1992     invertSequenceMenuItem.setLabel("Invert Sequence Selection");\r
1993     invertColSel.setLabel("Invert Column Selection");\r
1994     menu1.setLabel("Show");\r
1995     showColumns.setLabel("All Columns ");\r
1996     showSeqs.setLabel("All Sequences");\r
1997     menu2.setLabel("Hide");\r
1998     hideColumns.setLabel("Selected Columns");\r
1999     hideSequences.setLabel("Selected Sequences");\r
2000     invertColSel.addActionListener(this);\r
2001     showColumns.addActionListener(this);\r
2002     showSeqs.addActionListener(this);\r
2003     hideColumns.addActionListener(this);\r
2004     hideSequences.addActionListener(this);\r
2005 \r
2006 \r
2007     alignFrameMenuBar.add(fileMenu);\r
2008         alignFrameMenuBar.add(editMenu);\r
2009         alignFrameMenuBar.add(searchMenu);\r
2010         alignFrameMenuBar.add(viewMenu);\r
2011         alignFrameMenuBar.add(colourMenu);\r
2012         alignFrameMenuBar.add(calculateMenu);\r
2013         alignFrameMenuBar.add(helpMenu);\r
2014         fileMenu.add(inputText);\r
2015         fileMenu.add(outputTextboxMenu);\r
2016         if(jalviewServletURL!=null)\r
2017           fileMenu.add(loadApplication);\r
2018         fileMenu.addSeparator();\r
2019         fileMenu.add(loadTree);\r
2020         fileMenu.add(closeMenuItem);\r
2021         editMenu.add(undoMenuItem);\r
2022         editMenu.add(redoMenuItem);\r
2023         editMenu.add(cut);\r
2024         editMenu.add(copy);\r
2025         editMenu.add(pasteMenu);\r
2026         editMenu.add(delete);\r
2027         editMenu.addSeparator();\r
2028         editMenu.add(selectAllSequenceMenuItem);\r
2029         editMenu.add(deselectAllSequenceMenuItem);\r
2030         editMenu.add(invertSequenceMenuItem);\r
2031     editMenu.add(invertColSel);\r
2032     editMenu.add(deleteGroups);\r
2033         editMenu.addSeparator();\r
2034         editMenu.add(remove2LeftMenuItem);\r
2035         editMenu.add(remove2RightMenuItem);\r
2036         editMenu.add(removeGappedColumnMenuItem);\r
2037         editMenu.add(removeAllGapsMenuItem);\r
2038         editMenu.add(removeRedundancyMenuItem);\r
2039         searchMenu.add(findMenuItem);\r
2040         viewMenu.add(font);\r
2041         viewMenu.addSeparator();\r
2042     viewMenu.add(menu1);\r
2043     viewMenu.add(menu2);\r
2044     viewMenu.addSeparator();\r
2045     viewMenu.add(wrapMenuItem);\r
2046         viewMenu.add(scaleAbove);\r
2047         viewMenu.add(scaleLeft);\r
2048         viewMenu.add(scaleRight);\r
2049         viewMenu.addSeparator();\r
2050     viewMenu.add(seqLimits);\r
2051     viewMenu.add(viewBoxesMenuItem);\r
2052         viewMenu.add(viewTextMenuItem);\r
2053         viewMenu.add(colourTextMenuItem);\r
2054         viewMenu.add(renderGapsMenuItem);\r
2055         viewMenu.add(annotationPanelMenuItem);\r
2056     viewMenu.addSeparator();\r
2057         viewMenu.add(sequenceFeatures);\r
2058         viewMenu.add(featureSettings);\r
2059     viewMenu.addSeparator();\r
2060         viewMenu.add(overviewMenuItem);\r
2061         colourMenu.add(applyToAllGroups);\r
2062         colourMenu.addSeparator();\r
2063         colourMenu.add(noColourmenuItem);\r
2064         colourMenu.add(clustalColour);\r
2065         colourMenu.add(BLOSUM62Colour);\r
2066         colourMenu.add(PIDColour);\r
2067         colourMenu.add(zappoColour);\r
2068         colourMenu.add(taylorColour);\r
2069         colourMenu.add(hydrophobicityColour);\r
2070         colourMenu.add(helixColour);\r
2071         colourMenu.add(strandColour);\r
2072         colourMenu.add(turnColour);\r
2073         colourMenu.add(buriedColour);\r
2074         colourMenu.add(nucleotideColour);\r
2075         colourMenu.add(userDefinedColour);\r
2076         colourMenu.addSeparator();\r
2077         colourMenu.add(conservationMenuItem);\r
2078         colourMenu.add(modifyConservation);\r
2079         colourMenu.add(abovePIDThreshold);\r
2080         colourMenu.add(modifyPID);\r
2081     colourMenu.add(annotationColour);\r
2082     calculateMenu.add(sort);\r
2083         calculateMenu.add(calculate);\r
2084         calculateMenu.addSeparator();\r
2085         calculateMenu.add(pairwiseAlignmentMenuItem);\r
2086         calculateMenu.add(PCAMenuItem);\r
2087         calculateMenu.add(autoCalculate);\r
2088         this.add(statusBar, BorderLayout.SOUTH);\r
2089         pasteMenu.add(pasteNew);\r
2090         pasteMenu.add(pasteThis);\r
2091         sort.add(sortIDMenuItem);\r
2092         sort.add(sortByTreeMenu);\r
2093         sort.add(sortGroupMenuItem);\r
2094         sort.add(sortPairwiseMenuItem);\r
2095         calculate.add(averageDistanceTreeMenuItem);\r
2096         calculate.add(neighbourTreeMenuItem);\r
2097         calculate.add(avDistanceTreeBlosumMenuItem);\r
2098         calculate.add(njTreeBlosumMenuItem);\r
2099         helpMenu.add(documentation);\r
2100         helpMenu.add(about);\r
2101     menu1.add(showColumns);\r
2102     menu1.add(showSeqs);\r
2103     menu2.add(hideColumns);\r
2104     menu2.add(hideSequences);\r
2105   }\r
2106 \r
2107   public void setEmbedded()\r
2108   {\r
2109 \r
2110     embeddedMenu = new Panel();\r
2111     embeddedEdit = new Label();\r
2112     embeddedSearch = new Label();\r
2113     embeddedView = new Label();\r
2114     embeddedColour = new Label();\r
2115     embeddedFile = new Label();\r
2116     embeddedHelp = new Label();\r
2117     embeddedCalculate = new Label();\r
2118     flowLayout1 = new FlowLayout();\r
2119     embeddedMenu.setBackground(Color.lightGray);\r
2120     embeddedMenu.setLayout(flowLayout1);\r
2121     embeddedEdit.setText("Edit");\r
2122     embeddedEdit.setFont(new java.awt.Font("Arial", Font.PLAIN, 10));\r
2123     embeddedSearch.setText("Search");\r
2124     embeddedSearch.setFont(new java.awt.Font("Arial", Font.PLAIN, 10));\r
2125     embeddedView.setText("View");\r
2126     embeddedView.setFont(new java.awt.Font("Arial", Font.PLAIN, 10));\r
2127     embeddedColour.setText("Colour");\r
2128     embeddedColour.setFont(new java.awt.Font("Arial", Font.PLAIN, 10));\r
2129     embeddedFile.setFont(new java.awt.Font("Arial", Font.PLAIN, 10));\r
2130     embeddedFile.setText("File");\r
2131     embeddedHelp.setFont(new java.awt.Font("Arial", Font.PLAIN, 10));\r
2132     embeddedHelp.setText("Help");\r
2133     embeddedCalculate.setFont(new java.awt.Font("Arial", Font.PLAIN, 10));\r
2134     embeddedCalculate.setText("Calculate");\r
2135     embeddedMenu.add(embeddedFile);\r
2136     embeddedMenu.add(embeddedEdit);\r
2137     embeddedMenu.add(embeddedSearch);\r
2138     embeddedMenu.add(embeddedView);\r
2139     embeddedMenu.add(embeddedColour);\r
2140     embeddedMenu.add(embeddedCalculate);\r
2141     embeddedMenu.add(embeddedHelp);\r
2142     flowLayout1.setAlignment(FlowLayout.LEFT);\r
2143     flowLayout1.setHgap(2);\r
2144     flowLayout1.setVgap(0);\r
2145     embeddedFile.addMouseListener(this);\r
2146     embeddedEdit.addMouseListener(this);\r
2147     embeddedSearch.addMouseListener(this);\r
2148     embeddedView.addMouseListener(this);\r
2149     embeddedColour.addMouseListener(this);\r
2150     embeddedCalculate.addMouseListener(this);\r
2151     embeddedHelp.addMouseListener(this);\r
2152 \r
2153    // setVisible(false);\r
2154     fileMenu.remove(closeMenuItem);\r
2155     fileMenu.remove(3); // Seperator\r
2156 \r
2157     viewport.applet.setLayout(new BorderLayout());\r
2158     viewport.applet.add(embeddedMenu, BorderLayout.NORTH);\r
2159     viewport.applet.add(statusBar, BorderLayout.SOUTH);\r
2160    // viewport.applet.validate();\r
2161 \r
2162     alignPanel.setSize(viewport.applet.size().width, viewport.applet.size().height\r
2163                        - embeddedMenu.HEIGHT - statusBar.HEIGHT);\r
2164 \r
2165      viewport.applet.add(alignPanel, BorderLayout.CENTER);\r
2166      viewport.applet.validate();\r
2167 \r
2168   }\r
2169 \r
2170 \r
2171 \r
2172   PopupMenu filePopup, editPopup, searchPopup,\r
2173       viewPopup, colourPopup, calculatePopup, helpPopup;\r
2174   MenuItem featureSettings = new MenuItem();\r
2175   CheckboxMenuItem sequenceFeatures = new CheckboxMenuItem();\r
2176   MenuItem annotationColour = new MenuItem();\r
2177   MenuItem invertColSel = new MenuItem();\r
2178   Menu menu1 = new Menu();\r
2179   MenuItem showColumns = new MenuItem();\r
2180   MenuItem showSeqs = new MenuItem();\r
2181   Menu menu2 = new Menu();\r
2182   MenuItem hideColumns = new MenuItem();\r
2183   MenuItem hideSequences = new MenuItem();\r
2184 \r
2185   public void mousePressed(MouseEvent evt)\r
2186   {\r
2187     PopupMenu popup = null;\r
2188     Label source = (Label)evt.getSource();\r
2189     if(source==embeddedFile)\r
2190     {\r
2191       popup = filePopup = genPopupMenu(filePopup, fileMenu);\r
2192     }\r
2193     else if(source==embeddedEdit)\r
2194     {\r
2195       popup = editPopup = genPopupMenu(editPopup, editMenu);\r
2196     }\r
2197     else if(source==embeddedSearch)\r
2198     {\r
2199       popup = searchPopup = genPopupMenu(searchPopup, searchMenu);\r
2200     }\r
2201     else if(source==embeddedView)\r
2202     {\r
2203       popup = viewPopup = genPopupMenu(viewPopup, viewMenu);\r
2204     }\r
2205     else if(source==embeddedColour)\r
2206     {\r
2207       popup = colourPopup = genPopupMenu(colourPopup, colourMenu);\r
2208     }\r
2209     else if(source==embeddedCalculate)\r
2210     {\r
2211       popup = calculatePopup = genPopupMenu(calculatePopup, calculateMenu);\r
2212     }\r
2213     else if(source==embeddedHelp)\r
2214     {\r
2215       popup = helpPopup = genPopupMenu(helpPopup, helpMenu);\r
2216     }\r
2217 \r
2218     embeddedMenu.add(popup);\r
2219     popup.show(embeddedMenu,\r
2220                source.getBounds().x,\r
2221                source.getBounds().y + source.getBounds().getSize().height);\r
2222   }\r
2223 \r
2224   PopupMenu genPopupMenu(PopupMenu popup, Menu original)\r
2225   {\r
2226     if(popup!=null)\r
2227     {\r
2228       return popup;\r
2229     }\r
2230     popup = new PopupMenu();\r
2231     int m, mSize = original.getItemCount();\r
2232     for(m=0; m<mSize; m++)\r
2233     {\r
2234       popup.add(original.getItem(m));\r
2235       mSize--;\r
2236       m--;\r
2237     }\r
2238 \r
2239     return popup;\r
2240   }\r
2241   public void mouseClicked(MouseEvent evt)\r
2242   {}\r
2243   public void mouseReleased(MouseEvent evt)\r
2244   {}\r
2245   public void mouseEntered(MouseEvent evt)\r
2246   {}\r
2247   public void mouseExited(MouseEvent evt)\r
2248   {}\r
2249 \r
2250 }\r
2251 \r