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