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