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