Commands, history, consensus, refresh updated
[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   protected void undoMenuItem_actionPerformed()\r
704   {\r
705     CommandI command = (CommandI)viewport.historyList.pop();\r
706     viewport.redoList.push(command);\r
707     command.undoCommand();\r
708 \r
709     viewport.hasHiddenColumns = viewport.colSel.getHiddenColumns() != null;\r
710     updateEditMenuBar();\r
711     viewport.firePropertyChange("alignment", null,\r
712                                 viewport.getAlignment().getSequences());\r
713   }\r
714 \r
715   protected void redoMenuItem_actionPerformed()\r
716   {\r
717     CommandI command = (CommandI) viewport.redoList.pop();\r
718     viewport.historyList.push(command);\r
719     command.doCommand();\r
720     viewport.hasHiddenColumns = viewport.colSel.getHiddenColumns()!=null;\r
721 \r
722     updateEditMenuBar();\r
723     viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());\r
724   }\r
725 \r
726 \r
727   public void moveSelectedSequences(boolean up)\r
728   {\r
729     SequenceGroup sg = viewport.getSelectionGroup();\r
730     if (sg == null)\r
731     {\r
732       return;\r
733     }\r
734 \r
735     if (up)\r
736     {\r
737       for (int i = 1; i < viewport.alignment.getHeight(); i++)\r
738       {\r
739         SequenceI seq = viewport.alignment.getSequenceAt(i);\r
740         if (!sg.getSequences(false).contains(seq))\r
741         {\r
742           continue;\r
743         }\r
744 \r
745         SequenceI temp = viewport.alignment.getSequenceAt(i - 1);\r
746         if (sg.getSequences(false).contains(temp))\r
747         {\r
748           continue;\r
749         }\r
750 \r
751         viewport.alignment.getSequences().setElementAt(temp, i);\r
752         viewport.alignment.getSequences().setElementAt(seq, i - 1);\r
753       }\r
754     }\r
755     else\r
756     {\r
757       for (int i = viewport.alignment.getHeight() - 2; i > -1; i--)\r
758       {\r
759         SequenceI seq = viewport.alignment.getSequenceAt(i);\r
760         if (!sg.getSequences(true).contains(seq))\r
761         {\r
762           continue;\r
763         }\r
764 \r
765         SequenceI temp = viewport.alignment.getSequenceAt(i + 1);\r
766         if (sg.getSequences(true).contains(temp))\r
767         {\r
768           continue;\r
769         }\r
770 \r
771         viewport.alignment.getSequences().setElementAt(temp, i);\r
772         viewport.alignment.getSequences().setElementAt(seq, i + 1);\r
773       }\r
774     }\r
775 \r
776     alignPanel.repaint();\r
777   }\r
778 \r
779   static StringBuffer copiedSequences;\r
780   static Vector copiedHiddenColumns;\r
781   protected void copy_actionPerformed()\r
782   {\r
783     if (viewport.getSelectionGroup() == null)\r
784     {\r
785       return;\r
786     }\r
787 \r
788     SequenceGroup sg = viewport.getSelectionGroup();\r
789     copiedSequences = new StringBuffer();\r
790     Hashtable orderedSeqs = new Hashtable();\r
791     for (int i = 0; i < sg.getSize(false); i++)\r
792     {\r
793       SequenceI seq = sg.getSequenceAt(i);\r
794       int index = viewport.alignment.findIndex(seq);\r
795       orderedSeqs.put(index + "", seq);\r
796     }\r
797 \r
798     int index = 0, startRes, endRes;\r
799     char ch;\r
800 \r
801     if (viewport.hasHiddenColumns && viewport.getSelectionGroup() != null)\r
802     {\r
803       copiedHiddenColumns = new Vector();\r
804       int hiddenOffset = viewport.getSelectionGroup().getStartRes();\r
805       for (int i = 0; i < viewport.getColumnSelection().getHiddenColumns().size();\r
806            i++)\r
807       {\r
808         int[] region = (int[])\r
809             viewport.getColumnSelection().getHiddenColumns().elementAt(i);\r
810 \r
811         copiedHiddenColumns.addElement(new int[]\r
812                                  {region[0] - hiddenOffset,\r
813                                  region[1] - hiddenOffset});\r
814       }\r
815     }\r
816     else\r
817       copiedHiddenColumns = null;\r
818 \r
819 \r
820     for (int i = 0; i < sg.getSize(false); i++)\r
821     {\r
822         SequenceI seq = null;\r
823 \r
824         while (seq == null)\r
825         {\r
826             if (orderedSeqs.containsKey(index + ""))\r
827             {\r
828                 seq = (SequenceI) orderedSeqs.get(index + "");\r
829                 index++;\r
830 \r
831                 break;\r
832             }\r
833             else\r
834             {\r
835                 index++;\r
836             }\r
837         }\r
838 \r
839         //FIND START RES\r
840         //Returns residue following index if gap\r
841         startRes = seq.findPosition(sg.getStartRes());\r
842 \r
843         //FIND END RES\r
844         //Need to find the residue preceeding index if gap\r
845         endRes = 0;\r
846 \r
847         for (int j = 0; j < sg.getEndRes()+1 && j < seq.getLength(); j++)\r
848         {\r
849           ch = seq.getCharAt(j);\r
850           if (!jalview.util.Comparison.isGap( (ch)))\r
851           {\r
852             endRes++;\r
853           }\r
854         }\r
855 \r
856         if(endRes>0)\r
857         {\r
858           endRes += seq.getStart() -1;\r
859         }\r
860 \r
861         copiedSequences.append(seq.getName() + "\t" +\r
862             startRes + "\t" +\r
863             endRes + "\t" +\r
864             seq.getSequence(sg.getStartRes(),\r
865                 sg.getEndRes() + 1) + "\n");\r
866     }\r
867 \r
868   }\r
869 \r
870   protected void pasteNew_actionPerformed()\r
871   {\r
872     paste(true);\r
873   }\r
874 \r
875   protected void pasteThis_actionPerformed()\r
876   {\r
877     paste(false);\r
878   }\r
879 \r
880   void paste(boolean newAlignment)\r
881   {\r
882     try\r
883     {\r
884       if (copiedSequences == null)\r
885       {\r
886         return;\r
887       }\r
888 \r
889       StringTokenizer st = new StringTokenizer(copiedSequences.toString());\r
890       Vector seqs = new Vector();\r
891       while (st.hasMoreElements())\r
892       {\r
893         String name = st.nextToken();\r
894         int start = Integer.parseInt(st.nextToken());\r
895         int end = Integer.parseInt(st.nextToken());\r
896         seqs.addElement(new Sequence(name, st.nextToken(), start, end));\r
897       }\r
898       SequenceI[] newSeqs = new SequenceI[seqs.size()];\r
899       for (int i = 0; i < seqs.size(); i++)\r
900       {\r
901         newSeqs[i] = (SequenceI) seqs.elementAt(i);\r
902       }\r
903 \r
904       if (newAlignment)\r
905       {\r
906         String newtitle = new String("Copied sequences");\r
907         if (getTitle().startsWith("Copied sequences"))\r
908         {\r
909           newtitle = getTitle();\r
910         }\r
911         else\r
912         {\r
913           newtitle = newtitle.concat("- from " + getTitle());\r
914         }\r
915         AlignFrame af = new AlignFrame(new Alignment(newSeqs),\r
916                                        viewport.applet,\r
917                                        newtitle,\r
918                                        false);\r
919         if (copiedHiddenColumns != null)\r
920         {\r
921           for (int i = 0; i < copiedHiddenColumns.size(); i++)\r
922           {\r
923             int[] region = (int[]) copiedHiddenColumns.elementAt(i);\r
924             af.viewport.hideColumns(region[0], region[1]);\r
925           }\r
926         }\r
927 \r
928 \r
929         jalview.bin.JalviewLite.addFrame(af, newtitle, DEFAULT_WIDTH,\r
930                                          DEFAULT_HEIGHT);\r
931       }\r
932       else\r
933       {\r
934         //!newAlignment\r
935         addHistoryItem(new EditCommand(\r
936             "Add sequences",\r
937             EditCommand.PASTE,\r
938             newSeqs,\r
939             0,\r
940             viewport.alignment.getWidth(),\r
941             viewport.alignment)\r
942             );\r
943 \r
944         viewport.setEndSeq(viewport.alignment.getHeight());\r
945         viewport.alignment.getWidth();\r
946         viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());\r
947       }\r
948 \r
949     }\r
950     catch (Exception ex)\r
951     {} // could be anything being pasted in here\r
952 \r
953   }\r
954 \r
955   protected void cut_actionPerformed()\r
956   {\r
957     copy_actionPerformed();\r
958     delete_actionPerformed();\r
959   }\r
960 \r
961   protected void delete_actionPerformed()\r
962   {\r
963 \r
964     SequenceGroup sg = viewport.getSelectionGroup();\r
965     if (sg == null)\r
966     {\r
967       return;\r
968     }\r
969 \r
970     Vector seqs = new Vector();\r
971     SequenceI seq;\r
972     for (int i = 0; i < sg.getSize(false); i++)\r
973     {\r
974       seq = sg.getSequenceAt(i);\r
975       seqs.addElement(seq);\r
976     }\r
977 \r
978 \r
979    // If the cut affects all sequences, remove highlighted columns\r
980    if (sg.getSize(false) == viewport.alignment.getHeight())\r
981    {\r
982      viewport.getColumnSelection().removeElements(sg.getStartRes(),\r
983          sg.getEndRes() + 1);\r
984    }\r
985 \r
986 \r
987     SequenceI [] cut = new SequenceI[seqs.size()];\r
988     for(int i=0; i<seqs.size(); i++)\r
989       cut[i] = (SequenceI)seqs.elementAt(i);\r
990 \r
991 \r
992     /*\r
993     //ADD HISTORY ITEM\r
994     */\r
995     addHistoryItem(new EditCommand("Cut Sequences",\r
996                                       EditCommand.CUT,\r
997                                       cut,\r
998                                       sg.getStartRes(),\r
999                                       sg.getEndRes()-sg.getStartRes()+1,\r
1000                                       viewport.alignment));\r
1001 \r
1002 \r
1003     viewport.setSelectionGroup(null);\r
1004     viewport.alignment.deleteGroup(sg);\r
1005 \r
1006     viewport.firePropertyChange("alignment", null,\r
1007                                   viewport.getAlignment().getSequences());\r
1008 \r
1009     if (viewport.getAlignment().getHeight() < 1)\r
1010     {\r
1011         this.setVisible(false);\r
1012     }\r
1013   }\r
1014 \r
1015   protected void deleteGroups_actionPerformed()\r
1016   {\r
1017     viewport.alignment.deleteAllGroups();\r
1018     viewport.sequenceColours=null;\r
1019     viewport.setSelectionGroup(null);\r
1020 \r
1021     alignPanel.repaint();\r
1022   }\r
1023 \r
1024   public void selectAllSequenceMenuItem_actionPerformed()\r
1025   {\r
1026     SequenceGroup sg = new SequenceGroup();\r
1027     for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)\r
1028     {\r
1029       sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);\r
1030     }\r
1031     sg.setEndRes(viewport.alignment.getWidth()-1);\r
1032     viewport.setSelectionGroup(sg);\r
1033     alignPanel.repaint();\r
1034     PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());\r
1035   }\r
1036 \r
1037   public void deselectAllSequenceMenuItem_actionPerformed()\r
1038   {\r
1039     if(viewport.cursorMode)\r
1040     {\r
1041       alignPanel.seqPanel.keyboardNo1=null;\r
1042       alignPanel.seqPanel.keyboardNo2=null;\r
1043     }\r
1044     viewport.setSelectionGroup(null);\r
1045     viewport.getColumnSelection().clear();\r
1046     viewport.setSelectionGroup(null);\r
1047     alignPanel.idPanel.idCanvas.searchResults = null;\r
1048     alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);\r
1049     alignPanel.repaint();\r
1050     PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());\r
1051   }\r
1052 \r
1053   public void invertSequenceMenuItem_actionPerformed()\r
1054   {\r
1055     SequenceGroup sg = viewport.getSelectionGroup();\r
1056     for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)\r
1057     {\r
1058       sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);\r
1059     }\r
1060 \r
1061     PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());\r
1062   }\r
1063 \r
1064   void trimAlignment(boolean trimLeft)\r
1065   {\r
1066     ColumnSelection colSel = viewport.getColumnSelection();\r
1067     int column;\r
1068 \r
1069     if (colSel.size() > 0)\r
1070     {\r
1071       if(trimLeft)\r
1072         column = colSel.getMin();\r
1073       else\r
1074         column = colSel.getMax();\r
1075 \r
1076       SequenceI [] seqs;\r
1077       if(viewport.getSelectionGroup()!=null)\r
1078         seqs = viewport.getSelectionGroup().getSequencesAsArray(true);\r
1079       else\r
1080         seqs = viewport.alignment.getSequencesArray();\r
1081 \r
1082 \r
1083       TrimRegionCommand trimRegion;\r
1084       if(trimLeft)\r
1085       {\r
1086         trimRegion = new TrimRegionCommand("Remove Left",\r
1087                                     TrimRegionCommand.TRIM_LEFT,\r
1088                                     seqs,\r
1089                                     column,\r
1090                                     viewport.alignment,\r
1091                                     viewport.colSel,\r
1092                                     viewport.selectionGroup);\r
1093         viewport.setStartRes(0);\r
1094       }\r
1095      else\r
1096      {\r
1097        trimRegion = new TrimRegionCommand("Remove Right",\r
1098                                    TrimRegionCommand.TRIM_RIGHT,\r
1099                                    seqs,\r
1100                                    column,\r
1101                                    viewport.alignment,\r
1102                                    viewport.colSel,\r
1103                                    viewport.selectionGroup);\r
1104      }\r
1105 \r
1106      statusBar.setText("Removed "+trimRegion.getSize()+" columns.");\r
1107 \r
1108 \r
1109       addHistoryItem(trimRegion);\r
1110 \r
1111       Vector groups = viewport.alignment.getGroups();\r
1112 \r
1113       for (int i = 0; i < groups.size(); i++)\r
1114       {\r
1115         SequenceGroup sg = (SequenceGroup) groups.elementAt(i);\r
1116 \r
1117         if ( (trimLeft && !sg.adjustForRemoveLeft(column))\r
1118             || (!trimLeft && !sg.adjustForRemoveRight(column)))\r
1119         {\r
1120           viewport.alignment.deleteGroup(sg);\r
1121         }\r
1122       }\r
1123 \r
1124       viewport.firePropertyChange("alignment", null,\r
1125                                   viewport.getAlignment().getSequences());\r
1126     }\r
1127   }\r
1128 \r
1129 \r
1130   public void removeGappedColumnMenuItem_actionPerformed()\r
1131   {\r
1132     int start = 0, end = viewport.alignment.getWidth()-1;\r
1133 \r
1134     SequenceI[] seqs;\r
1135     if (viewport.getSelectionGroup() != null)\r
1136     {\r
1137       seqs = viewport.getSelectionGroup().getSequencesAsArray(true);\r
1138       start = viewport.getSelectionGroup().getStartRes();\r
1139       end = viewport.getSelectionGroup().getEndRes();\r
1140     }\r
1141     else\r
1142       seqs = viewport.alignment.getSequencesArray();\r
1143 \r
1144 \r
1145     RemoveGapColCommand removeGapCols =\r
1146         new RemoveGapColCommand("Remove Gapped Columns",\r
1147                                 seqs,\r
1148                                 start, end,\r
1149                                 viewport.getGapCharacter());\r
1150 \r
1151     addHistoryItem(removeGapCols);\r
1152 \r
1153     statusBar.setText("Removed "+removeGapCols.getSize()+" empty columns.");\r
1154 \r
1155     //This is to maintain viewport position on first residue\r
1156     //of first sequence\r
1157     SequenceI seq = viewport.alignment.getSequenceAt(0);\r
1158     int startRes = seq.findPosition(viewport.startRes);\r
1159    // ShiftList shifts;\r
1160    // viewport.getAlignment().removeGaps(shifts=new ShiftList());\r
1161    // edit.alColumnChanges=shifts.getInverse();\r
1162    // if (viewport.hasHiddenColumns)\r
1163    //   viewport.getColumnSelection().compensateForEdits(shifts);\r
1164    viewport.setStartRes(seq.findIndex(startRes)-1);\r
1165    viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());\r
1166 \r
1167   }\r
1168 \r
1169   public void removeAllGapsMenuItem_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     //This is to maintain viewport position on first residue\r
1184     //of first sequence\r
1185     SequenceI seq = viewport.alignment.getSequenceAt(0);\r
1186     int startRes = seq.findPosition(viewport.startRes);\r
1187 \r
1188     addHistoryItem(new RemoveGapsCommand("Remove Gaps",\r
1189                                            seqs,\r
1190                                            start, end,\r
1191                      viewport.getGapCharacter()));\r
1192 \r
1193     viewport.setStartRes(seq.findIndex(startRes)-1);\r
1194 \r
1195     viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());\r
1196 \r
1197   }\r
1198 \r
1199   public void findMenuItem_actionPerformed()\r
1200   {\r
1201     new Finder(alignPanel);\r
1202   }\r
1203 \r
1204   public void font_actionPerformed()\r
1205   {\r
1206     new FontChooser(alignPanel);\r
1207   }\r
1208 \r
1209 \r
1210   public void seqLimits_itemStateChanged()\r
1211   {\r
1212     viewport.setShowJVSuffix(seqLimits.getState());\r
1213     alignPanel.fontChanged();\r
1214     alignPanel.repaint();\r
1215   }\r
1216 \r
1217 \r
1218   protected void colourTextMenuItem_actionPerformed()\r
1219   {\r
1220     viewport.setColourText(colourTextMenuItem.getState());\r
1221     alignPanel.repaint();\r
1222   }\r
1223 \r
1224   protected void wrapMenuItem_actionPerformed()\r
1225   {\r
1226     viewport.setWrapAlignment(wrapMenuItem.getState());\r
1227     alignPanel.setWrapAlignment(wrapMenuItem.getState());\r
1228     scaleAbove.setEnabled(wrapMenuItem.getState());\r
1229     scaleLeft.setEnabled(wrapMenuItem.getState());\r
1230     scaleRight.setEnabled(wrapMenuItem.getState());\r
1231     alignPanel.repaint();\r
1232   }\r
1233 \r
1234 \r
1235   protected void scaleAbove_actionPerformed()\r
1236   {\r
1237     viewport.setScaleAboveWrapped(scaleAbove.getState());\r
1238     alignPanel.repaint();\r
1239   }\r
1240 \r
1241   protected void scaleLeft_actionPerformed()\r
1242   {\r
1243     viewport.setScaleLeftWrapped(scaleLeft.getState());\r
1244     alignPanel.repaint();\r
1245   }\r
1246 \r
1247   protected void scaleRight_actionPerformed()\r
1248   {\r
1249     viewport.setScaleRightWrapped(scaleRight.getState());\r
1250     alignPanel.repaint();\r
1251   }\r
1252 \r
1253   public void viewBoxesMenuItem_actionPerformed()\r
1254   {\r
1255     viewport.setShowBoxes(viewBoxesMenuItem.getState());\r
1256     alignPanel.repaint();\r
1257   }\r
1258 \r
1259   public void viewTextMenuItem_actionPerformed()\r
1260   {\r
1261     viewport.setShowText(viewTextMenuItem.getState());\r
1262     alignPanel.repaint();\r
1263   }\r
1264 \r
1265   protected void renderGapsMenuItem_actionPerformed()\r
1266   {\r
1267     viewport.setRenderGaps(renderGapsMenuItem.getState());\r
1268     alignPanel.repaint();\r
1269   }\r
1270 \r
1271   public void annotationPanelMenuItem_actionPerformed()\r
1272   {\r
1273     viewport.setShowAnnotation(annotationPanelMenuItem.getState());\r
1274     alignPanel.setAnnotationVisible(annotationPanelMenuItem.getState());\r
1275   }\r
1276 \r
1277   public void featureSettings_actionPerformed()\r
1278   {\r
1279     new FeatureSettings(viewport, alignPanel);\r
1280   }\r
1281 \r
1282   public void overviewMenuItem_actionPerformed()\r
1283   {\r
1284     if (alignPanel.overviewPanel != null)\r
1285     {\r
1286       return;\r
1287     }\r
1288 \r
1289     Frame frame = new Frame();\r
1290     OverviewPanel overview = new OverviewPanel(alignPanel);\r
1291     frame.add(overview);\r
1292     // +50 must allow for applet frame window\r
1293     jalview.bin.JalviewLite.addFrame(frame, "Overview " + this.getTitle(),\r
1294                                      overview.preferredSize().width,\r
1295                                      overview.preferredSize().height + 50);\r
1296 \r
1297     frame.pack();\r
1298     frame.addWindowListener(new WindowAdapter()\r
1299     {\r
1300       public void windowClosing(WindowEvent e)\r
1301       {\r
1302         alignPanel.setOverviewPanel(null);\r
1303       };\r
1304     });\r
1305 \r
1306     alignPanel.setOverviewPanel(overview);\r
1307 \r
1308   }\r
1309 \r
1310   protected void noColourmenuItem_actionPerformed()\r
1311   {\r
1312     changeColour(null);\r
1313   }\r
1314 \r
1315   public void clustalColour_actionPerformed()\r
1316   {\r
1317     abovePIDThreshold.setState(false);\r
1318     changeColour(new ClustalxColourScheme(viewport.alignment.getSequences(),\r
1319                                           viewport.alignment.getWidth()));\r
1320   }\r
1321 \r
1322   public void zappoColour_actionPerformed()\r
1323   {\r
1324     changeColour(new ZappoColourScheme());\r
1325   }\r
1326 \r
1327   public void taylorColour_actionPerformed()\r
1328   {\r
1329     changeColour(new TaylorColourScheme());\r
1330   }\r
1331 \r
1332   public void hydrophobicityColour_actionPerformed()\r
1333   {\r
1334     changeColour(new HydrophobicColourScheme());\r
1335   }\r
1336 \r
1337   public void helixColour_actionPerformed()\r
1338   {\r
1339     changeColour(new HelixColourScheme());\r
1340   }\r
1341 \r
1342   public void strandColour_actionPerformed()\r
1343   {\r
1344     changeColour(new StrandColourScheme());\r
1345   }\r
1346 \r
1347   public void turnColour_actionPerformed()\r
1348   {\r
1349     changeColour(new TurnColourScheme());\r
1350   }\r
1351 \r
1352   public void buriedColour_actionPerformed()\r
1353   {\r
1354     changeColour(new BuriedColourScheme());\r
1355   }\r
1356 \r
1357   public void nucleotideColour_actionPerformed()\r
1358   {\r
1359     changeColour(new NucleotideColourScheme());\r
1360   }\r
1361 \r
1362   protected void applyToAllGroups_actionPerformed()\r
1363   {\r
1364     viewport.setColourAppliesToAllGroups(applyToAllGroups.getState());\r
1365   }\r
1366 \r
1367   void changeColour(ColourSchemeI cs)\r
1368   {\r
1369     int threshold = 0;\r
1370 \r
1371     if(cs!=null)\r
1372     {\r
1373       if (viewport.getAbovePIDThreshold())\r
1374       {\r
1375         threshold = SliderPanel.setPIDSliderSource(alignPanel, cs, "Background");\r
1376 \r
1377         cs.setThreshold(threshold, viewport.getIgnoreGapsConsensus());\r
1378 \r
1379         viewport.setGlobalColourScheme(cs);\r
1380       }\r
1381       else\r
1382       {\r
1383         cs.setThreshold(0, viewport.getIgnoreGapsConsensus());\r
1384       }\r
1385 \r
1386       if (viewport.getConservationSelected())\r
1387       {\r
1388 \r
1389         Alignment al = (Alignment) viewport.alignment;\r
1390         Conservation c = new Conservation("All",\r
1391                                           ResidueProperties.propHash, 3,\r
1392                                           al.getSequences(), 0,\r
1393                                           al.getWidth() - 1);\r
1394 \r
1395         c.calculate();\r
1396         c.verdict(false, viewport.ConsPercGaps);\r
1397 \r
1398         cs.setConservation(c);\r
1399 \r
1400         cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel, cs,\r
1401             "Background"));\r
1402 \r
1403       }\r
1404       else\r
1405       {\r
1406         cs.setConservation(null);\r
1407       }\r
1408 \r
1409       cs.setConsensus(viewport.hconsensus);\r
1410 \r
1411     }\r
1412     viewport.setGlobalColourScheme(cs);\r
1413 \r
1414     if (viewport.getColourAppliesToAllGroups())\r
1415     {\r
1416       Vector groups = viewport.alignment.getGroups();\r
1417       for (int i = 0; i < groups.size(); i++)\r
1418       {\r
1419         SequenceGroup sg = (SequenceGroup) groups.elementAt(i);\r
1420 \r
1421         if(cs==null)\r
1422         {\r
1423           sg.cs = null;\r
1424           continue;\r
1425         }\r
1426         if (cs instanceof ClustalxColourScheme)\r
1427         {\r
1428           sg.cs = new ClustalxColourScheme(sg.getSequences(true), sg.getWidth());\r
1429         }\r
1430         else\r
1431         {\r
1432           try\r
1433           {\r
1434             sg.cs = (ColourSchemeI) cs.getClass().newInstance();\r
1435           }\r
1436           catch (Exception ex)\r
1437           {\r
1438             ex.printStackTrace();\r
1439             sg.cs = cs;\r
1440           }\r
1441         }\r
1442 \r
1443         if (viewport.getAbovePIDThreshold()\r
1444             || cs instanceof PIDColourScheme\r
1445             || cs instanceof Blosum62ColourScheme)\r
1446         {\r
1447           sg.cs.setThreshold(threshold, viewport.getIgnoreGapsConsensus());\r
1448           sg.cs.setConsensus(AAFrequency.calculate(sg.getSequences(true), 0, sg.getWidth()));\r
1449         }\r
1450         else\r
1451           sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());\r
1452 \r
1453         if (viewport.getConservationSelected())\r
1454         {\r
1455           Conservation c = new Conservation("Group",\r
1456                                             ResidueProperties.propHash, 3,\r
1457                                             sg.getSequences(true), 0,\r
1458                                             viewport.alignment.getWidth() - 1);\r
1459           c.calculate();\r
1460           c.verdict(false, viewport.ConsPercGaps);\r
1461           sg.cs.setConservation(c);\r
1462         }\r
1463         else\r
1464         {\r
1465           sg.cs.setConservation(null);\r
1466           sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());\r
1467         }\r
1468 \r
1469       }\r
1470     }\r
1471 \r
1472 \r
1473     if (alignPanel.getOverviewPanel() != null)\r
1474     {\r
1475       alignPanel.getOverviewPanel().updateOverviewImage();\r
1476     }\r
1477 \r
1478     alignPanel.repaint();\r
1479   }\r
1480 \r
1481 \r
1482 \r
1483   protected void modifyPID_actionPerformed()\r
1484   {\r
1485     if (viewport.getAbovePIDThreshold() && viewport.globalColourScheme!=null)\r
1486     {\r
1487       SliderPanel.setPIDSliderSource(alignPanel, viewport.getGlobalColourScheme(),\r
1488                                      "Background");\r
1489       SliderPanel.showPIDSlider();\r
1490     }\r
1491   }\r
1492 \r
1493   protected void modifyConservation_actionPerformed()\r
1494   {\r
1495     if (viewport.getConservationSelected() && viewport.globalColourScheme!=null)\r
1496     {\r
1497       SliderPanel.setConservationSlider(alignPanel, viewport.globalColourScheme,\r
1498                                         "Background");\r
1499       SliderPanel.showConservationSlider();\r
1500     }\r
1501   }\r
1502 \r
1503   protected void conservationMenuItem_actionPerformed()\r
1504   {\r
1505     viewport.setConservationSelected(conservationMenuItem.getState());\r
1506 \r
1507     viewport.setAbovePIDThreshold(false);\r
1508     abovePIDThreshold.setState(false);\r
1509 \r
1510     changeColour(viewport.getGlobalColourScheme());\r
1511 \r
1512     modifyConservation_actionPerformed();\r
1513   }\r
1514 \r
1515   public void abovePIDThreshold_actionPerformed()\r
1516   {\r
1517     viewport.setAbovePIDThreshold(abovePIDThreshold.getState());\r
1518 \r
1519     conservationMenuItem.setState(false);\r
1520     viewport.setConservationSelected(false);\r
1521 \r
1522     changeColour(viewport.getGlobalColourScheme());\r
1523 \r
1524     modifyPID_actionPerformed();\r
1525   }\r
1526 \r
1527   public void userDefinedColour_actionPerformed()\r
1528   {\r
1529     new UserDefinedColours(alignPanel, null);\r
1530   }\r
1531 \r
1532   public void PIDColour_actionPerformed()\r
1533   {\r
1534     changeColour(new PIDColourScheme());\r
1535   }\r
1536 \r
1537   public void BLOSUM62Colour_actionPerformed()\r
1538   {\r
1539     changeColour(new Blosum62ColourScheme());\r
1540   }\r
1541 \r
1542   public void sortPairwiseMenuItem_actionPerformed()\r
1543   {\r
1544     SequenceI [] oldOrder = viewport.getAlignment().getSequencesArray();\r
1545     AlignmentSorter.sortByPID(viewport.getAlignment(),\r
1546                               viewport.getAlignment().getSequenceAt(0));\r
1547     addHistoryItem(new OrderCommand("Pairwise Sort", oldOrder, viewport.alignment));\r
1548     alignPanel.repaint();\r
1549   }\r
1550 \r
1551   public void sortIDMenuItem_actionPerformed()\r
1552   {\r
1553   //  addHistoryItem(new HistoryItem("ID Sort", viewport.alignment,\r
1554    //                                HistoryItem.SORT));\r
1555     AlignmentSorter.sortByID(viewport.getAlignment());\r
1556     alignPanel.repaint();\r
1557   }\r
1558 \r
1559   public void sortGroupMenuItem_actionPerformed()\r
1560   {\r
1561   //  addHistoryItem(new HistoryItem("Group Sort", viewport.alignment,\r
1562   //                                 HistoryItem.SORT));\r
1563     AlignmentSorter.sortByGroup(viewport.getAlignment());\r
1564     alignPanel.repaint();\r
1565 \r
1566   }\r
1567 \r
1568   public void removeRedundancyMenuItem_actionPerformed()\r
1569   {\r
1570      new RedundancyPanel(alignPanel);\r
1571   }\r
1572 \r
1573   public void pairwiseAlignmentMenuItem_actionPerformed()\r
1574   {\r
1575     if (viewport.getSelectionGroup()!=null\r
1576         && viewport.getSelectionGroup().getSize(false) > 1)\r
1577     {\r
1578       Frame frame = new Frame();\r
1579       frame.add(new PairwiseAlignPanel(alignPanel));\r
1580       jalview.bin.JalviewLite.addFrame(frame, "Pairwise Alignment", 600, 500);\r
1581     }\r
1582   }\r
1583 \r
1584   public void PCAMenuItem_actionPerformed()\r
1585   {\r
1586     //are the sequences aligned?\r
1587     if (!viewport.alignment.isAligned())\r
1588     {\r
1589       SequenceI current;\r
1590       int Width = viewport.getAlignment().getWidth();\r
1591 \r
1592       for (int i = 0; i < viewport.getAlignment().getSequences().size();\r
1593            i++)\r
1594       {\r
1595         current = viewport.getAlignment().getSequenceAt(i);\r
1596 \r
1597         if (current.getLength() < Width)\r
1598         {\r
1599           current.insertCharAt(Width - 1, viewport.getGapCharacter());\r
1600         }\r
1601       }\r
1602       alignPanel.repaint();\r
1603     }\r
1604 \r
1605     if ( (viewport.getSelectionGroup() != null &&\r
1606           viewport.getSelectionGroup().getSize(false) < 4 &&\r
1607           viewport.getSelectionGroup().getSize(false) > 0)\r
1608         || viewport.getAlignment().getHeight() < 4)\r
1609     {\r
1610       return;\r
1611     }\r
1612 \r
1613     try\r
1614     {\r
1615       new PCAPanel(viewport);\r
1616     }\r
1617     catch (java.lang.OutOfMemoryError ex)\r
1618     {\r
1619     }\r
1620 \r
1621   }\r
1622 \r
1623   public void averageDistanceTreeMenuItem_actionPerformed()\r
1624   {\r
1625     NewTreePanel("AV", "PID", "Average distance tree using PID");\r
1626   }\r
1627 \r
1628   public void neighbourTreeMenuItem_actionPerformed()\r
1629   {\r
1630     NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");\r
1631   }\r
1632 \r
1633   protected void njTreeBlosumMenuItem_actionPerformed()\r
1634   {\r
1635     NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");\r
1636   }\r
1637 \r
1638   protected void avTreeBlosumMenuItem_actionPerformed()\r
1639   {\r
1640     NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62PID");\r
1641   }\r
1642 \r
1643   void NewTreePanel(String type, String pwType, String title)\r
1644   {\r
1645     //are the sequences aligned?\r
1646     if (!viewport.alignment.isAligned())\r
1647     {\r
1648       SequenceI current;\r
1649       int Width = viewport.getAlignment().getWidth();\r
1650 \r
1651       for (int i = 0; i < viewport.getAlignment().getSequences().size();\r
1652            i++)\r
1653       {\r
1654         current = viewport.getAlignment().getSequenceAt(i);\r
1655 \r
1656         if (current.getLength() < Width)\r
1657         {\r
1658           current.insertCharAt(Width - 1, viewport.getGapCharacter());\r
1659         }\r
1660       }\r
1661       alignPanel.repaint();\r
1662 \r
1663     }\r
1664 \r
1665     if ( (viewport.getSelectionGroup() != null &&\r
1666           viewport.getSelectionGroup().getSize(false) > 1)\r
1667       || (viewport.getSelectionGroup() == null\r
1668           && viewport.alignment.getHeight() > 1))\r
1669     {\r
1670       final TreePanel tp = new TreePanel(viewport,\r
1671                                          type,\r
1672                                          pwType);\r
1673 \r
1674       addTreeMenuItem(tp, title);\r
1675 \r
1676       jalview.bin.JalviewLite.addFrame(tp, title, 600, 500);\r
1677     }\r
1678   }\r
1679 \r
1680   void loadTree_actionPerformed()\r
1681   {\r
1682       CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this);\r
1683       cap.setText("Paste your Newick tree file here.");\r
1684       cap.treeImport = true;\r
1685       Frame frame = new Frame();\r
1686       frame.add(cap);\r
1687       jalview.bin.JalviewLite.addFrame(frame, "Paste Newick file ", 400, 300);\r
1688   }\r
1689 \r
1690   public void loadTree(jalview.io.NewickFile tree, String treeFile)\r
1691   {\r
1692     TreePanel tp = new TreePanel(viewport,\r
1693                                  treeFile,\r
1694                                  "From File - ",\r
1695                                  tree);\r
1696     jalview.bin.JalviewLite.addFrame(tp, treeFile, 600, 500);\r
1697     addTreeMenuItem(tp, treeFile);\r
1698   }\r
1699 \r
1700   void addTreeMenuItem(final TreePanel treePanel, String title)\r
1701   {\r
1702     final MenuItem item = new MenuItem(title);\r
1703     sortByTreeMenu.add(item);\r
1704     item.addActionListener(new java.awt.event.ActionListener()\r
1705     {\r
1706       public void actionPerformed(ActionEvent evt)\r
1707       {\r
1708       //  addHistoryItem(new HistoryItem("Sort", viewport.alignment,\r
1709       //                                 HistoryItem.SORT));\r
1710         AlignmentSorter.sortByTree(viewport.getAlignment(), treePanel.getTree());\r
1711         alignPanel.repaint();\r
1712       }\r
1713     });\r
1714 \r
1715     treePanel.addWindowListener(new WindowAdapter()\r
1716     {\r
1717       public void windowClosing(WindowEvent e)\r
1718       {\r
1719         sortByTreeMenu.remove(item);\r
1720       };\r
1721     });\r
1722   }\r
1723 \r
1724   protected void documentation_actionPerformed()\r
1725   {\r
1726     showURL("http://www.jalview.org/help.html", "HELP");\r
1727   }\r
1728 \r
1729   protected void about_actionPerformed()\r
1730   {\r
1731 \r
1732     class AboutPanel extends Canvas\r
1733     {\r
1734       String version;\r
1735       public AboutPanel(String version)\r
1736       { this.version = version; }\r
1737 \r
1738       public void paint(Graphics g)\r
1739       {\r
1740         g.setColor(Color.white);\r
1741         g.fillRect(0, 0, getSize().width, getSize().height);\r
1742         g.setFont(new Font("Helvetica", Font.PLAIN, 12));\r
1743         FontMetrics fm = g.getFontMetrics();\r
1744         int fh = fm.getHeight();\r
1745         int y = 5, x = 7;\r
1746         g.setColor(Color.black);\r
1747         g.setFont(new Font("Helvetica", Font.BOLD, 14));\r
1748         g.drawString("Jalview - Release "+version, 200, y += fh);\r
1749         g.setFont(new Font("Helvetica", Font.PLAIN, 12));\r
1750         g.drawString("Authors:  Michele Clamp, James Cuff, Steve Searle, Andrew Waterhouse, Jim Procter & Geoff Barton.",\r
1751                      x, y += fh * 2);\r
1752         g.drawString("Current development managed by Andrew Waterhouse; Barton Group, University of Dundee.",\r
1753                      x, y += fh);\r
1754         g.drawString(\r
1755             "For any issues relating to Jalview, email help@jalview.org", x,\r
1756             y += fh);\r
1757         g.drawString("If  you use JalView, please cite:", x, y += fh + 8);\r
1758         g.drawString("\"Clamp, M., Cuff, J., Searle, S. M. and Barton, G. J. (2004), The Jalview Java Alignment Editor\"",\r
1759                      x, y += fh);\r
1760         g.drawString("Bioinformatics,  2004 20;426-7.", x, y += fh);\r
1761       }\r
1762     }\r
1763 \r
1764     String version = "test";\r
1765     java.net.URL url = getClass().getResource("/.build_properties");\r
1766     if (url != null)\r
1767     {\r
1768       try\r
1769       {\r
1770         BufferedReader reader = new BufferedReader(new InputStreamReader(\r
1771             url.openStream()));\r
1772         String line;\r
1773         while ( (line = reader.readLine()) != null)\r
1774         {\r
1775           if (line.indexOf("VERSION") > -1)\r
1776           {\r
1777             version = line.substring(line.indexOf("=") + 1);\r
1778           }\r
1779         }\r
1780       }\r
1781       catch (Exception ex)\r
1782       {\r
1783         ex.printStackTrace();\r
1784       }\r
1785     }\r
1786 \r
1787 \r
1788     Frame frame = new Frame();\r
1789     frame.add(new AboutPanel(version));\r
1790     jalview.bin.JalviewLite.addFrame(frame, "Jalview", 580, 200);\r
1791 \r
1792   }\r
1793 \r
1794   public void showURL(String url, String target)\r
1795   {\r
1796     if (viewport.applet == null)\r
1797     {\r
1798       System.out.println("Not running as applet - no browser available.");\r
1799     }\r
1800     else\r
1801     {\r
1802       try\r
1803       {\r
1804         System.out.println("Show url: "+url);\r
1805         viewport.applet.getAppletContext().showDocument(new java.net.URL(url),\r
1806                                                target);\r
1807       }\r
1808       catch (Exception ex)\r
1809       {\r
1810         ex.printStackTrace();\r
1811       }\r
1812     }\r
1813   }\r
1814 \r
1815 \r
1816   //////////////////////////////////////////////////////////////////////////////////\r
1817   //JBuilder Graphics here\r
1818 \r
1819     protected MenuBar alignFrameMenuBar = new MenuBar();\r
1820     protected Menu fileMenu = new Menu("File");\r
1821     protected MenuItem loadApplication = new MenuItem("View in Full Application");\r
1822     protected MenuItem loadTree = new MenuItem("Load Associated Tree");\r
1823     protected MenuItem closeMenuItem = new MenuItem("Close");\r
1824     protected Menu editMenu = new Menu("Edit");\r
1825     protected Menu viewMenu = new Menu("View");\r
1826     protected Menu colourMenu = new Menu("Colour");\r
1827     protected Menu calculateMenu = new Menu("Calculate");\r
1828     protected MenuItem selectAllSequenceMenuItem = new MenuItem("Select all");\r
1829     protected MenuItem deselectAllSequenceMenuItem = new MenuItem("Deselect All");\r
1830     protected MenuItem invertSequenceMenuItem = new MenuItem("Invert Selection");\r
1831     protected MenuItem remove2LeftMenuItem = new MenuItem();\r
1832     protected MenuItem remove2RightMenuItem = new MenuItem();\r
1833     protected MenuItem removeGappedColumnMenuItem = new MenuItem();\r
1834     protected MenuItem removeAllGapsMenuItem = new MenuItem();\r
1835     protected CheckboxMenuItem viewBoxesMenuItem = new CheckboxMenuItem();\r
1836     protected CheckboxMenuItem viewTextMenuItem = new CheckboxMenuItem();\r
1837     protected MenuItem sortPairwiseMenuItem = new MenuItem();\r
1838     protected MenuItem sortIDMenuItem = new MenuItem();\r
1839     protected MenuItem sortGroupMenuItem = new MenuItem();\r
1840     protected MenuItem removeRedundancyMenuItem = new MenuItem();\r
1841     protected MenuItem pairwiseAlignmentMenuItem = new MenuItem();\r
1842     protected MenuItem PCAMenuItem = new MenuItem();\r
1843     protected MenuItem averageDistanceTreeMenuItem = new MenuItem();\r
1844     protected MenuItem neighbourTreeMenuItem = new MenuItem();\r
1845     BorderLayout borderLayout1 = new BorderLayout();\r
1846     public Label statusBar = new Label();\r
1847     protected Menu outputTextboxMenu = new Menu();\r
1848     protected MenuItem clustalColour = new MenuItem();\r
1849     protected MenuItem zappoColour = new MenuItem();\r
1850     protected MenuItem taylorColour = new MenuItem();\r
1851     protected MenuItem hydrophobicityColour = new MenuItem();\r
1852     protected MenuItem helixColour = new MenuItem();\r
1853     protected MenuItem strandColour = new MenuItem();\r
1854     protected MenuItem turnColour = new MenuItem();\r
1855     protected MenuItem buriedColour = new MenuItem();\r
1856     protected MenuItem userDefinedColour = new MenuItem();\r
1857     protected MenuItem PIDColour = new MenuItem();\r
1858     protected MenuItem BLOSUM62Colour = new MenuItem();\r
1859     MenuItem njTreeBlosumMenuItem = new MenuItem();\r
1860     MenuItem avDistanceTreeBlosumMenuItem = new MenuItem();\r
1861     protected CheckboxMenuItem annotationPanelMenuItem = new CheckboxMenuItem();\r
1862     protected CheckboxMenuItem colourTextMenuItem = new CheckboxMenuItem();\r
1863     MenuItem overviewMenuItem = new MenuItem();\r
1864     protected MenuItem undoMenuItem = new MenuItem();\r
1865     protected MenuItem redoMenuItem = new MenuItem();\r
1866     protected CheckboxMenuItem conservationMenuItem = new CheckboxMenuItem();\r
1867     MenuItem noColourmenuItem = new MenuItem();\r
1868     protected CheckboxMenuItem wrapMenuItem = new CheckboxMenuItem();\r
1869     protected CheckboxMenuItem renderGapsMenuItem = new CheckboxMenuItem();\r
1870     MenuItem findMenuItem = new MenuItem();\r
1871   protected CheckboxMenuItem abovePIDThreshold = new CheckboxMenuItem();\r
1872     protected MenuItem nucleotideColour = new MenuItem();\r
1873     MenuItem deleteGroups = new MenuItem();\r
1874     MenuItem delete = new MenuItem();\r
1875     MenuItem copy = new MenuItem();\r
1876     MenuItem cut = new MenuItem();\r
1877     Menu pasteMenu = new Menu();\r
1878     MenuItem pasteNew = new MenuItem();\r
1879     MenuItem pasteThis = new MenuItem();\r
1880     protected CheckboxMenuItem applyToAllGroups = new CheckboxMenuItem();\r
1881     protected MenuItem font = new MenuItem();\r
1882     protected CheckboxMenuItem scaleAbove = new CheckboxMenuItem();\r
1883     protected CheckboxMenuItem scaleLeft = new CheckboxMenuItem();\r
1884     protected CheckboxMenuItem scaleRight = new CheckboxMenuItem();\r
1885     MenuItem modifyPID = new MenuItem();\r
1886     MenuItem modifyConservation = new MenuItem();\r
1887     protected CheckboxMenuItem autoCalculate\r
1888         = new CheckboxMenuItem("Autocalculate Consensus", true);\r
1889     protected Menu sortByTreeMenu = new Menu();\r
1890     Menu sort = new Menu();\r
1891     Menu calculate = new Menu();\r
1892     MenuItem inputText = new MenuItem();\r
1893     Menu helpMenu = new Menu();\r
1894     MenuItem documentation = new MenuItem();\r
1895     MenuItem about = new MenuItem();\r
1896     protected CheckboxMenuItem seqLimits = new CheckboxMenuItem();\r
1897   Panel embeddedMenu;\r
1898   Label embeddedEdit;\r
1899   Label embeddedSelect;\r
1900   Label embeddedView;\r
1901   Label embeddedFormat;\r
1902   Label embeddedColour;\r
1903   Label embeddedFile;\r
1904   Label embeddedHelp;\r
1905   Label embeddedCalculate;\r
1906   FlowLayout flowLayout1;\r
1907 \r
1908   private void jbInit() throws Exception {\r
1909 \r
1910       setMenuBar(alignFrameMenuBar);\r
1911 \r
1912       MenuItem item;\r
1913 \r
1914       // dynamically fill save as menu with available formats\r
1915       for (int i = 0; i < jalview.io.AppletFormatAdapter.WRITEABLE_FORMATS.length; i++)\r
1916       {\r
1917 \r
1918         item = new MenuItem( jalview.io.AppletFormatAdapter.WRITEABLE_FORMATS[i]);\r
1919 \r
1920         item.addActionListener(new java.awt.event.ActionListener()\r
1921         {\r
1922           public void actionPerformed(ActionEvent e)\r
1923           {\r
1924             outputText_actionPerformed(e);\r
1925           }\r
1926         });\r
1927 \r
1928         outputTextboxMenu.add(item);\r
1929       }\r
1930         closeMenuItem.addActionListener(this);\r
1931         loadApplication.addActionListener(this);\r
1932 \r
1933         loadTree.addActionListener(this);\r
1934         selectAllSequenceMenuItem.addActionListener(this);\r
1935         deselectAllSequenceMenuItem.addActionListener(this);\r
1936         invertSequenceMenuItem.addActionListener(this);\r
1937         remove2LeftMenuItem.setLabel("Remove Left");\r
1938         remove2LeftMenuItem.addActionListener(this);\r
1939         remove2RightMenuItem.setLabel("Remove Right");\r
1940         remove2RightMenuItem.addActionListener(this);\r
1941         removeGappedColumnMenuItem.setLabel("Remove Empty Columns");\r
1942         removeGappedColumnMenuItem.addActionListener(this);\r
1943         removeAllGapsMenuItem.setLabel("Remove All Gaps");\r
1944         removeAllGapsMenuItem.addActionListener(this);\r
1945         viewBoxesMenuItem.setLabel("Boxes");\r
1946         viewBoxesMenuItem.setState(true);\r
1947         viewBoxesMenuItem.addItemListener(this);\r
1948         viewTextMenuItem.setLabel("Text");\r
1949         viewTextMenuItem.setState(true);\r
1950         viewTextMenuItem.addItemListener(this);\r
1951         sortPairwiseMenuItem.setLabel("by Pairwise Identity");\r
1952         sortPairwiseMenuItem.addActionListener(this);\r
1953         sortIDMenuItem.setLabel("by ID");\r
1954         sortIDMenuItem.addActionListener(this);\r
1955         sortGroupMenuItem.setLabel("by Group");\r
1956         sortGroupMenuItem.addActionListener(this);\r
1957         removeRedundancyMenuItem.setLabel("Remove Redundancy...");\r
1958         removeRedundancyMenuItem.addActionListener(this);\r
1959         pairwiseAlignmentMenuItem.setLabel("Pairwise Alignments...");\r
1960         pairwiseAlignmentMenuItem.addActionListener(this);\r
1961         PCAMenuItem.setLabel("Principal Component Analysis");\r
1962         PCAMenuItem.addActionListener(this);\r
1963         averageDistanceTreeMenuItem.setLabel(\r
1964             "Average Distance Using % Identity");\r
1965         averageDistanceTreeMenuItem.addActionListener(this);\r
1966         neighbourTreeMenuItem.setLabel("Neighbour Joining Using % Identity");\r
1967         neighbourTreeMenuItem.addActionListener(this);\r
1968         alignFrameMenuBar.setFont(new java.awt.Font("Verdana", 0, 11));\r
1969         statusBar.setBackground(Color.white);\r
1970         statusBar.setFont(new java.awt.Font("Verdana", 0, 11));\r
1971         statusBar.setText("Status bar");\r
1972         outputTextboxMenu.setLabel("Output to Textbox");\r
1973         clustalColour.setLabel("Clustalx");\r
1974 \r
1975         clustalColour.addActionListener(this);\r
1976         zappoColour.setLabel("Zappo");\r
1977         zappoColour.addActionListener(this);\r
1978         taylorColour.setLabel("Taylor");\r
1979         taylorColour.addActionListener(this);\r
1980         hydrophobicityColour.setLabel("Hydrophobicity");\r
1981         hydrophobicityColour.addActionListener(this);\r
1982         helixColour.setLabel("Helix Propensity");\r
1983         helixColour.addActionListener(this);\r
1984         strandColour.setLabel("Strand Propensity");\r
1985         strandColour.addActionListener(this);\r
1986         turnColour.setLabel("Turn Propensity");\r
1987         turnColour.addActionListener(this);\r
1988         buriedColour.setLabel("Buried Index");\r
1989         buriedColour.addActionListener(this);\r
1990         userDefinedColour.setLabel("User Defined...");\r
1991         userDefinedColour.addActionListener(this);\r
1992         PIDColour.setLabel("Percentage Identity");\r
1993         PIDColour.addActionListener(this);\r
1994         BLOSUM62Colour.setLabel("BLOSUM62 Score");\r
1995         BLOSUM62Colour.addActionListener(this);\r
1996         avDistanceTreeBlosumMenuItem.setLabel(\r
1997             "Average Distance Using BLOSUM62");\r
1998         avDistanceTreeBlosumMenuItem.addActionListener(this);\r
1999         njTreeBlosumMenuItem.setLabel("Neighbour Joining Using BLOSUM62");\r
2000         njTreeBlosumMenuItem.addActionListener(this);\r
2001         annotationPanelMenuItem.setLabel("Show Annotations");\r
2002         annotationPanelMenuItem.addItemListener(this);\r
2003         colourTextMenuItem.setLabel("Colour Text");\r
2004         colourTextMenuItem.addItemListener(this);\r
2005         overviewMenuItem.setLabel("Overview Window");\r
2006         overviewMenuItem.addActionListener(this);\r
2007         undoMenuItem.setEnabled(false);\r
2008         undoMenuItem.setLabel("Undo");\r
2009         undoMenuItem.addActionListener(this);\r
2010         redoMenuItem.setEnabled(false);\r
2011         redoMenuItem.setLabel("Redo");\r
2012         redoMenuItem.addActionListener(this);\r
2013         conservationMenuItem.setLabel("by Conservation");\r
2014         conservationMenuItem.addItemListener(this);\r
2015         noColourmenuItem.setLabel("None");\r
2016         noColourmenuItem.addActionListener(this);\r
2017         wrapMenuItem.setLabel("Wrap");\r
2018         wrapMenuItem.addItemListener(this);\r
2019         renderGapsMenuItem.setLabel("Show Gaps");\r
2020         renderGapsMenuItem.setState(true);\r
2021         renderGapsMenuItem.addItemListener(this);\r
2022         findMenuItem.setLabel("Find...");\r
2023         findMenuItem.addActionListener(this);\r
2024     abovePIDThreshold.setLabel("Above Identity Threshold");\r
2025         abovePIDThreshold.addItemListener(this);\r
2026         nucleotideColour.setLabel("Nucleotide");\r
2027         nucleotideColour.addActionListener(this);\r
2028         deleteGroups.setLabel("Undefine Groups");\r
2029         deleteGroups.addActionListener(this);\r
2030         copy.setLabel("Copy");\r
2031         copy.addActionListener(this);\r
2032         cut.setLabel("Cut");\r
2033         cut.addActionListener(this);\r
2034         delete.setLabel("Delete");\r
2035         delete.addActionListener(this);\r
2036         pasteMenu.setLabel("Paste");\r
2037         pasteNew.setLabel("To New Alignment");\r
2038         pasteNew.addActionListener(this);\r
2039         pasteThis.setLabel("Add To This Alignment");\r
2040         pasteThis.addActionListener(this);\r
2041         applyToAllGroups.setLabel("Apply Colour To All Groups");\r
2042         applyToAllGroups.setState(true);\r
2043         applyToAllGroups.addItemListener(this);\r
2044         font.setLabel("Font...");\r
2045         font.addActionListener(this);\r
2046         scaleAbove.setLabel("Scale Above");\r
2047         scaleAbove.setState(true);\r
2048         scaleAbove.setEnabled(false);\r
2049         scaleAbove.addItemListener(this);\r
2050         scaleLeft.setEnabled(false);\r
2051         scaleLeft.setState(true);\r
2052         scaleLeft.setLabel("Scale Left");\r
2053         scaleLeft.addItemListener(this);\r
2054         scaleRight.setEnabled(false);\r
2055         scaleRight.setState(true);\r
2056         scaleRight.setLabel("Scale Right");\r
2057         scaleRight.addItemListener(this);\r
2058         modifyPID.setLabel("Modify Identity Threshold...");\r
2059         modifyPID.addActionListener(this);\r
2060         modifyConservation.setLabel("Modify Conservation Threshold...");\r
2061         modifyConservation.addActionListener(this);\r
2062         sortByTreeMenu.setLabel("By Tree Order");\r
2063         sort.setLabel("Sort");\r
2064         calculate.setLabel("Calculate Tree");\r
2065         autoCalculate.addItemListener(this);\r
2066         inputText.setLabel("Input from textbox");\r
2067         inputText.addActionListener(this);\r
2068 \r
2069         helpMenu.setLabel("Help");\r
2070         documentation.setLabel("Documentation");\r
2071         documentation.addActionListener(this);\r
2072 \r
2073         about.setLabel("About...");\r
2074         about.addActionListener(this);\r
2075           seqLimits.setState(true);\r
2076     seqLimits.setLabel("Show Sequence Limits");\r
2077     seqLimits.addItemListener(this);\r
2078     featureSettings.setLabel("Feature Settings...");\r
2079     featureSettings.addActionListener(this);\r
2080     sequenceFeatures.setLabel("Sequence Features");\r
2081     sequenceFeatures.addItemListener(this);\r
2082     sequenceFeatures.setState(false);\r
2083     annotationColour.setLabel("by Annotation...");\r
2084     annotationColour.addActionListener(this);\r
2085     invertSequenceMenuItem.setLabel("Invert Sequence Selection");\r
2086     invertColSel.setLabel("Invert Column Selection");\r
2087     menu1.setLabel("Show");\r
2088     showColumns.setLabel("All Columns ");\r
2089     showSeqs.setLabel("All Sequences");\r
2090     menu2.setLabel("Hide");\r
2091     hideColumns.setLabel("Selected Columns");\r
2092     hideSequences.setLabel("Selected Sequences");\r
2093     invertColSel.addActionListener(this);\r
2094     showColumns.addActionListener(this);\r
2095     showSeqs.addActionListener(this);\r
2096     hideColumns.addActionListener(this);\r
2097     hideSequences.addActionListener(this);\r
2098     formatMenu.setLabel("Format");\r
2099     selectMenu.setLabel("Select");\r
2100     alignFrameMenuBar.add(fileMenu);\r
2101         alignFrameMenuBar.add(editMenu);\r
2102     alignFrameMenuBar.add(selectMenu);\r
2103     alignFrameMenuBar.add(viewMenu);\r
2104     alignFrameMenuBar.add(formatMenu);\r
2105     alignFrameMenuBar.add(colourMenu);\r
2106         alignFrameMenuBar.add(calculateMenu);\r
2107         alignFrameMenuBar.add(helpMenu);\r
2108         fileMenu.add(inputText);\r
2109         fileMenu.add(outputTextboxMenu);\r
2110         if(jalviewServletURL!=null)\r
2111           fileMenu.add(loadApplication);\r
2112         fileMenu.addSeparator();\r
2113         fileMenu.add(loadTree);\r
2114         fileMenu.add(closeMenuItem);\r
2115         editMenu.add(undoMenuItem);\r
2116         editMenu.add(redoMenuItem);\r
2117         editMenu.add(cut);\r
2118         editMenu.add(copy);\r
2119         editMenu.add(pasteMenu);\r
2120         editMenu.add(delete);\r
2121     editMenu.addSeparator();\r
2122         editMenu.add(remove2LeftMenuItem);\r
2123         editMenu.add(remove2RightMenuItem);\r
2124         editMenu.add(removeGappedColumnMenuItem);\r
2125         editMenu.add(removeAllGapsMenuItem);\r
2126         editMenu.add(removeRedundancyMenuItem);\r
2127     viewMenu.add(menu1);\r
2128     viewMenu.add(menu2);\r
2129     viewMenu.addSeparator();\r
2130     viewMenu.add(annotationPanelMenuItem);\r
2131     viewMenu.addSeparator();\r
2132         viewMenu.add(sequenceFeatures);\r
2133         viewMenu.add(featureSettings);\r
2134     viewMenu.addSeparator();\r
2135         viewMenu.add(overviewMenuItem);\r
2136         colourMenu.add(applyToAllGroups);\r
2137         colourMenu.addSeparator();\r
2138         colourMenu.add(noColourmenuItem);\r
2139         colourMenu.add(clustalColour);\r
2140         colourMenu.add(BLOSUM62Colour);\r
2141         colourMenu.add(PIDColour);\r
2142         colourMenu.add(zappoColour);\r
2143         colourMenu.add(taylorColour);\r
2144         colourMenu.add(hydrophobicityColour);\r
2145         colourMenu.add(helixColour);\r
2146         colourMenu.add(strandColour);\r
2147         colourMenu.add(turnColour);\r
2148         colourMenu.add(buriedColour);\r
2149         colourMenu.add(nucleotideColour);\r
2150         colourMenu.add(userDefinedColour);\r
2151         colourMenu.addSeparator();\r
2152         colourMenu.add(conservationMenuItem);\r
2153         colourMenu.add(modifyConservation);\r
2154         colourMenu.add(abovePIDThreshold);\r
2155         colourMenu.add(modifyPID);\r
2156     colourMenu.add(annotationColour);\r
2157     calculateMenu.add(sort);\r
2158         calculateMenu.add(calculate);\r
2159         calculateMenu.addSeparator();\r
2160         calculateMenu.add(pairwiseAlignmentMenuItem);\r
2161         calculateMenu.add(PCAMenuItem);\r
2162         calculateMenu.add(autoCalculate);\r
2163         this.add(statusBar, BorderLayout.SOUTH);\r
2164         pasteMenu.add(pasteNew);\r
2165         pasteMenu.add(pasteThis);\r
2166         sort.add(sortIDMenuItem);\r
2167         sort.add(sortByTreeMenu);\r
2168         sort.add(sortGroupMenuItem);\r
2169         sort.add(sortPairwiseMenuItem);\r
2170         calculate.add(averageDistanceTreeMenuItem);\r
2171         calculate.add(neighbourTreeMenuItem);\r
2172         calculate.add(avDistanceTreeBlosumMenuItem);\r
2173         calculate.add(njTreeBlosumMenuItem);\r
2174         helpMenu.add(documentation);\r
2175         helpMenu.add(about);\r
2176     menu1.add(showColumns);\r
2177     menu1.add(showSeqs);\r
2178     menu2.add(hideColumns);\r
2179     menu2.add(hideSequences);\r
2180     formatMenu.add(font);\r
2181     formatMenu.add(seqLimits);\r
2182     formatMenu.add(wrapMenuItem);\r
2183     formatMenu.add(scaleAbove);\r
2184     formatMenu.add(scaleLeft);\r
2185     formatMenu.add(scaleRight);\r
2186     formatMenu.add(viewBoxesMenuItem);\r
2187     formatMenu.add(viewTextMenuItem);\r
2188     formatMenu.add(colourTextMenuItem);\r
2189     formatMenu.add(renderGapsMenuItem);\r
2190     selectMenu.add(findMenuItem);\r
2191     selectMenu.addSeparator();\r
2192     selectMenu.add(selectAllSequenceMenuItem);\r
2193     selectMenu.add(deselectAllSequenceMenuItem);\r
2194     selectMenu.add(invertSequenceMenuItem);\r
2195     selectMenu.add(invertColSel);\r
2196     selectMenu.add(deleteGroups);\r
2197   }\r
2198 \r
2199   public void setEmbedded()\r
2200   {\r
2201 \r
2202     embeddedMenu = new Panel();\r
2203     embeddedEdit = new Label("Edit");\r
2204     embeddedSelect = new Label("Select");\r
2205     embeddedView = new Label("View");\r
2206     embeddedFormat = new Label("Label");\r
2207     embeddedColour = new Label("Colour");\r
2208     embeddedFile = new Label("File");\r
2209     embeddedHelp = new Label("Help");\r
2210     embeddedCalculate = new Label("Calculate");\r
2211     flowLayout1 = new FlowLayout();\r
2212     embeddedMenu.setBackground(Color.lightGray);\r
2213     embeddedMenu.setLayout(flowLayout1);\r
2214     embeddedEdit.setFont(new java.awt.Font("Arial", Font.PLAIN, 10));\r
2215     embeddedSelect.setFont(new java.awt.Font("Arial", Font.PLAIN, 10));\r
2216     embeddedView.setFont(new java.awt.Font("Arial", Font.PLAIN, 10));\r
2217     embeddedFormat.setFont(new java.awt.Font("Arial", Font.PLAIN, 10));\r
2218     embeddedColour.setFont(new java.awt.Font("Arial", Font.PLAIN, 10));\r
2219     embeddedFile.setFont(new java.awt.Font("Arial", Font.PLAIN, 10));\r
2220     embeddedHelp.setFont(new java.awt.Font("Arial", Font.PLAIN, 10));\r
2221     embeddedCalculate.setFont(new java.awt.Font("Arial", Font.PLAIN, 10));\r
2222     embeddedMenu.add(embeddedFile);\r
2223     embeddedMenu.add(embeddedEdit);\r
2224     embeddedMenu.add(embeddedSelect);\r
2225     embeddedMenu.add(embeddedView);\r
2226     embeddedMenu.add(embeddedFormat);\r
2227     embeddedMenu.add(embeddedColour);\r
2228     embeddedMenu.add(embeddedCalculate);\r
2229     embeddedMenu.add(embeddedHelp);\r
2230     flowLayout1.setAlignment(FlowLayout.LEFT);\r
2231     flowLayout1.setHgap(2);\r
2232     flowLayout1.setVgap(0);\r
2233     embeddedFile.addMouseListener(this);\r
2234     embeddedEdit.addMouseListener(this);\r
2235     embeddedSelect.addMouseListener(this);\r
2236     embeddedView.addMouseListener(this);\r
2237     embeddedFormat.addMouseListener(this);\r
2238     embeddedColour.addMouseListener(this);\r
2239     embeddedCalculate.addMouseListener(this);\r
2240     embeddedHelp.addMouseListener(this);\r
2241 \r
2242    // setVisible(false);\r
2243     fileMenu.remove(closeMenuItem);\r
2244     fileMenu.remove(3); // Seperator\r
2245 \r
2246     viewport.applet.setLayout(new BorderLayout());\r
2247     viewport.applet.add(embeddedMenu, BorderLayout.NORTH);\r
2248     viewport.applet.add(statusBar, BorderLayout.SOUTH);\r
2249    // viewport.applet.validate();\r
2250 \r
2251     alignPanel.setSize(viewport.applet.size().width, viewport.applet.size().height\r
2252                        - embeddedMenu.HEIGHT - statusBar.HEIGHT);\r
2253 \r
2254      viewport.applet.add(alignPanel, BorderLayout.CENTER);\r
2255      viewport.applet.validate();\r
2256 \r
2257   }\r
2258 \r
2259 \r
2260 \r
2261   PopupMenu filePopup, editPopup, searchPopup,\r
2262       viewPopup, colourPopup, calculatePopup, helpPopup;\r
2263   MenuItem featureSettings = new MenuItem();\r
2264   CheckboxMenuItem sequenceFeatures = new CheckboxMenuItem();\r
2265   MenuItem annotationColour = new MenuItem();\r
2266   MenuItem invertColSel = new MenuItem();\r
2267   Menu menu1 = new Menu();\r
2268   MenuItem showColumns = new MenuItem();\r
2269   MenuItem showSeqs = new MenuItem();\r
2270   Menu menu2 = new Menu();\r
2271   MenuItem hideColumns = new MenuItem();\r
2272   MenuItem hideSequences = new MenuItem();\r
2273   Menu formatMenu = new Menu();\r
2274   Menu selectMenu = new Menu();\r
2275 \r
2276   public void mousePressed(MouseEvent evt)\r
2277   {\r
2278     PopupMenu popup = null;\r
2279     Label source = (Label)evt.getSource();\r
2280     if(source==embeddedFile)\r
2281     {\r
2282       popup = filePopup = genPopupMenu(filePopup, fileMenu);\r
2283     }\r
2284     else if(source==embeddedEdit)\r
2285     {\r
2286       popup = editPopup = genPopupMenu(editPopup, editMenu);\r
2287     }\r
2288     else if(source==embeddedSelect)\r
2289     {\r
2290       popup = searchPopup = genPopupMenu(searchPopup, selectMenu);\r
2291     }\r
2292     else if(source==embeddedView)\r
2293     {\r
2294       popup = viewPopup = genPopupMenu(viewPopup, viewMenu);\r
2295     }\r
2296     else if (source ==embeddedFormat)\r
2297     {\r
2298       popup = viewPopup = genPopupMenu(viewPopup, formatMenu);\r
2299     }\r
2300     else if(source==embeddedColour)\r
2301     {\r
2302       popup = colourPopup = genPopupMenu(colourPopup, colourMenu);\r
2303     }\r
2304     else if(source==embeddedCalculate)\r
2305     {\r
2306       popup = calculatePopup = genPopupMenu(calculatePopup, calculateMenu);\r
2307     }\r
2308     else if(source==embeddedHelp)\r
2309     {\r
2310       popup = helpPopup = genPopupMenu(helpPopup, helpMenu);\r
2311     }\r
2312 \r
2313     embeddedMenu.add(popup);\r
2314     popup.show(embeddedMenu,\r
2315                source.getBounds().x,\r
2316                source.getBounds().y + source.getBounds().getSize().height);\r
2317   }\r
2318 \r
2319   PopupMenu genPopupMenu(PopupMenu popup, Menu original)\r
2320   {\r
2321     if(popup!=null)\r
2322     {\r
2323       return popup;\r
2324     }\r
2325     popup = new PopupMenu();\r
2326     int m, mSize = original.getItemCount();\r
2327     for(m=0; m<mSize; m++)\r
2328     {\r
2329       popup.add(original.getItem(m));\r
2330       mSize--;\r
2331       m--;\r
2332     }\r
2333 \r
2334     return popup;\r
2335   }\r
2336   public void mouseClicked(MouseEvent evt)\r
2337   {}\r
2338   public void mouseReleased(MouseEvent evt)\r
2339   {}\r
2340   public void mouseEntered(MouseEvent evt)\r
2341   {}\r
2342   public void mouseExited(MouseEvent evt)\r
2343   {}\r
2344 \r
2345 }\r
2346 \r