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