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