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