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