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