PDBViewer available if necessary
[jalview.git] / src / jalview / gui / PopupMenu.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer\r
3  * Copyright (C) 2007 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 package jalview.gui;\r
20 \r
21 import java.util.*;\r
22 \r
23 import java.awt.*;\r
24 import java.awt.event.*;\r
25 import javax.swing.*;\r
26 \r
27 import MCview.*;\r
28 import jalview.analysis.*;\r
29 import jalview.commands.*;\r
30 import jalview.datamodel.*;\r
31 import jalview.io.*;\r
32 import jalview.schemes.*;\r
33 \r
34 /**\r
35  * DOCUMENT ME!\r
36  *\r
37  * @author $author$\r
38  * @version $Revision$\r
39  */\r
40 public class PopupMenu\r
41     extends JPopupMenu\r
42 {\r
43   JMenu groupMenu = new JMenu();\r
44   JMenuItem groupName = new JMenuItem();\r
45   protected JRadioButtonMenuItem clustalColour = new JRadioButtonMenuItem();\r
46   protected JRadioButtonMenuItem zappoColour = new JRadioButtonMenuItem();\r
47   protected JRadioButtonMenuItem taylorColour = new JRadioButtonMenuItem();\r
48   protected JRadioButtonMenuItem hydrophobicityColour = new\r
49       JRadioButtonMenuItem();\r
50   protected JRadioButtonMenuItem helixColour = new JRadioButtonMenuItem();\r
51   protected JRadioButtonMenuItem strandColour = new JRadioButtonMenuItem();\r
52   protected JRadioButtonMenuItem turnColour = new JRadioButtonMenuItem();\r
53   protected JRadioButtonMenuItem buriedColour = new JRadioButtonMenuItem();\r
54   protected JCheckBoxMenuItem abovePIDColour = new JCheckBoxMenuItem();\r
55   protected JRadioButtonMenuItem userDefinedColour = new JRadioButtonMenuItem();\r
56   protected JRadioButtonMenuItem PIDColour = new JRadioButtonMenuItem();\r
57   protected JRadioButtonMenuItem BLOSUM62Colour = new JRadioButtonMenuItem();\r
58   JRadioButtonMenuItem noColourmenuItem = new JRadioButtonMenuItem();\r
59   protected JCheckBoxMenuItem conservationMenuItem = new JCheckBoxMenuItem();\r
60   AlignmentPanel ap;\r
61   JMenu sequenceMenu = new JMenu();\r
62   JMenuItem sequenceName = new JMenuItem();\r
63   Sequence sequence;\r
64   JMenuItem unGroupMenuItem = new JMenuItem();\r
65   JMenuItem outline = new JMenuItem();\r
66   JRadioButtonMenuItem nucleotideMenuItem = new JRadioButtonMenuItem();\r
67   JMenu colourMenu = new JMenu();\r
68   JCheckBoxMenuItem showBoxes = new JCheckBoxMenuItem();\r
69   JCheckBoxMenuItem showText = new JCheckBoxMenuItem();\r
70   JCheckBoxMenuItem showColourText = new JCheckBoxMenuItem();\r
71   JMenu editMenu = new JMenu();\r
72   JMenuItem cut = new JMenuItem();\r
73   JMenuItem copy = new JMenuItem();\r
74   JMenuItem upperCase = new JMenuItem();\r
75   JMenuItem lowerCase = new JMenuItem();\r
76   JMenuItem toggle = new JMenuItem();\r
77   JMenu pdbMenu = new JMenu();\r
78   JMenuItem pdbFromFile = new JMenuItem();\r
79   JMenuItem enterPDB = new JMenuItem();\r
80   JMenuItem discoverPDB = new JMenuItem();\r
81   JMenu outputMenu = new JMenu();\r
82   JMenuItem sequenceFeature = new JMenuItem();\r
83   JMenuItem textColour = new JMenuItem();\r
84   JMenu jMenu1 = new JMenu();\r
85   JMenu structureMenu = new JMenu();\r
86   JMenu viewStructureMenu = new JMenu();\r
87  // JMenu colStructureMenu = new JMenu();\r
88   JMenuItem editSequence = new JMenuItem();\r
89  // JMenuItem annotationMenuItem = new JMenuItem();\r
90 \r
91   /**\r
92    * Creates a new PopupMenu object.\r
93    *\r
94    * @param ap DOCUMENT ME!\r
95    * @param seq DOCUMENT ME!\r
96    */\r
97   public PopupMenu(final AlignmentPanel ap, Sequence seq, Vector links)\r
98   {\r
99     ///////////////////////////////////////////////////////////\r
100     // If this is activated from the sequence panel, the user may want to\r
101     // edit or annotate a particular residue. Therefore display the residue menu\r
102     //\r
103     // If from the IDPanel, we must display the sequence menu\r
104     //////////////////////////////////////////////////////////\r
105     this.ap = ap;\r
106     sequence = seq;\r
107 \r
108     ButtonGroup colours = new ButtonGroup();\r
109     colours.add(noColourmenuItem);\r
110     colours.add(clustalColour);\r
111     colours.add(zappoColour);\r
112     colours.add(taylorColour);\r
113     colours.add(hydrophobicityColour);\r
114     colours.add(helixColour);\r
115     colours.add(strandColour);\r
116     colours.add(turnColour);\r
117     colours.add(buriedColour);\r
118     colours.add(abovePIDColour);\r
119     colours.add(userDefinedColour);\r
120     colours.add(PIDColour);\r
121     colours.add(BLOSUM62Colour);\r
122 \r
123     for (int i = 0; i < jalview.io.FormatAdapter.WRITEABLE_FORMATS.length; i++)\r
124     {\r
125       JMenuItem item = new JMenuItem(jalview.io.FormatAdapter.WRITEABLE_FORMATS[\r
126                                      i]);\r
127 \r
128       item.addActionListener(new java.awt.event.ActionListener()\r
129       {\r
130         public void actionPerformed(ActionEvent e)\r
131         {\r
132           outputText_actionPerformed(e);\r
133         }\r
134       });\r
135 \r
136       outputMenu.add(item);\r
137     }\r
138 \r
139     try\r
140     {\r
141       jbInit();\r
142     }\r
143     catch (Exception e)\r
144     {\r
145       e.printStackTrace();\r
146     }\r
147 \r
148     if (seq != null)\r
149     {\r
150       sequenceMenu.setText(sequence.getName());\r
151 \r
152       JMenuItem menuItem;\r
153       if (seq.getDatasetSequence().getPDBId() != null\r
154           && seq.getDatasetSequence().getPDBId().size()>0)\r
155       {\r
156         java.util.Enumeration e = seq.getDatasetSequence().getPDBId().\r
157             elements();\r
158 \r
159         while (e.hasMoreElements())\r
160         {\r
161           final PDBEntry pdb = (PDBEntry) e.nextElement();\r
162 \r
163           menuItem = new JMenuItem();\r
164           menuItem.setText(pdb.getId());\r
165           menuItem.addActionListener(new java.awt.event.ActionListener()\r
166           {\r
167             public void actionPerformed(ActionEvent e)\r
168             {\r
169               Vector seqs = new Vector();\r
170               for (int i = 0; i < ap.av.alignment.getHeight(); i++)\r
171               {\r
172                 Vector pdbs = ap.av.alignment.getSequenceAt(i).getDatasetSequence().getPDBId();\r
173                 if(pdbs==null)\r
174                   continue;\r
175 \r
176                 for(int p=0; p<pdbs.size(); p++)\r
177                 {\r
178                   PDBEntry p1 = (PDBEntry)pdbs.elementAt(p);\r
179                   if(p1.getId().equals(pdb.getId()))\r
180                   {\r
181                     if (!seqs.contains(ap.av.alignment.getSequenceAt(i)))\r
182                         seqs.addElement(ap.av.alignment.getSequenceAt(i));\r
183 \r
184                       continue;\r
185                   }\r
186                 }\r
187               }\r
188 \r
189               SequenceI [] seqs2 = new SequenceI[seqs.size()];\r
190               seqs.toArray(seqs2);\r
191 \r
192               new AppJmol(pdb, seqs2, null, ap);\r
193               //  new PDBViewer(pdb, seqs2, null, ap, AppletFormatAdapter.FILE);\r
194             }\r
195           });\r
196           viewStructureMenu.add(menuItem);\r
197 \r
198        /*   menuItem = new JMenuItem();\r
199           menuItem.setText(pdb.getId());\r
200           menuItem.addActionListener(new java.awt.event.ActionListener()\r
201           {\r
202             public void actionPerformed(ActionEvent e)\r
203             {\r
204               colourByStructure(pdb.getId());\r
205             }\r
206           });\r
207           colStructureMenu.add(menuItem);*/\r
208         }\r
209       }\r
210       else\r
211       {\r
212         structureMenu.remove(viewStructureMenu);\r
213        // structureMenu.remove(colStructureMenu);\r
214       }\r
215 \r
216       menuItem = new JMenuItem("Hide Sequences");\r
217       menuItem.addActionListener(new java.awt.event.ActionListener()\r
218       {\r
219         public void actionPerformed(ActionEvent e)\r
220         {\r
221           hideSequences(false);\r
222         }\r
223       });\r
224       add(menuItem);\r
225 \r
226       if (ap.av.getSelectionGroup() != null\r
227           && ap.av.getSelectionGroup().getSize() > 1)\r
228       {\r
229         menuItem = new JMenuItem("Represent Group with " + seq.getName());\r
230         menuItem.addActionListener(new java.awt.event.ActionListener()\r
231         {\r
232           public void actionPerformed(ActionEvent e)\r
233           {\r
234             hideSequences(true);\r
235           }\r
236         });\r
237         sequenceMenu.add(menuItem);\r
238       }\r
239 \r
240       if (ap.av.hasHiddenRows)\r
241       {\r
242         final int index = ap.av.alignment.findIndex(seq);\r
243 \r
244         if (ap.av.adjustForHiddenSeqs(index) -\r
245             ap.av.adjustForHiddenSeqs(index - 1) > 1)\r
246         {\r
247           menuItem = new JMenuItem("Reveal Sequences");\r
248           menuItem.addActionListener(new ActionListener()\r
249           {\r
250             public void actionPerformed(ActionEvent e)\r
251             {\r
252               ap.av.showSequence(index);\r
253               if (ap.overviewPanel != null)\r
254               {\r
255                 ap.overviewPanel.updateOverviewImage();\r
256               }\r
257             }\r
258           });\r
259           add(menuItem);\r
260         }\r
261 \r
262         menuItem = new JMenuItem("Reveal All");\r
263         menuItem.addActionListener(new ActionListener()\r
264         {\r
265           public void actionPerformed(ActionEvent e)\r
266           {\r
267             ap.av.showAllHiddenSeqs();\r
268             if (ap.overviewPanel != null)\r
269             {\r
270               ap.overviewPanel.updateOverviewImage();\r
271             }\r
272           }\r
273         });\r
274 \r
275         add(menuItem);\r
276       }\r
277 \r
278     }\r
279 \r
280     SequenceGroup sg = ap.av.getSelectionGroup();\r
281 \r
282     if (sg != null)\r
283     {\r
284       groupName.setText(sg.getName());\r
285 \r
286       if (sg.cs instanceof ZappoColourScheme)\r
287       {\r
288         zappoColour.setSelected(true);\r
289       }\r
290       else if (sg.cs instanceof TaylorColourScheme)\r
291       {\r
292         taylorColour.setSelected(true);\r
293       }\r
294       else if (sg.cs instanceof PIDColourScheme)\r
295       {\r
296         PIDColour.setSelected(true);\r
297       }\r
298       else if (sg.cs instanceof Blosum62ColourScheme)\r
299       {\r
300         BLOSUM62Colour.setSelected(true);\r
301       }\r
302       else if (sg.cs instanceof UserColourScheme)\r
303       {\r
304         userDefinedColour.setSelected(true);\r
305       }\r
306       else if (sg.cs instanceof HydrophobicColourScheme)\r
307       {\r
308         hydrophobicityColour.setSelected(true);\r
309       }\r
310       else if (sg.cs instanceof HelixColourScheme)\r
311       {\r
312         helixColour.setSelected(true);\r
313       }\r
314       else if (sg.cs instanceof StrandColourScheme)\r
315       {\r
316         strandColour.setSelected(true);\r
317       }\r
318       else if (sg.cs instanceof TurnColourScheme)\r
319       {\r
320         turnColour.setSelected(true);\r
321       }\r
322       else if (sg.cs instanceof BuriedColourScheme)\r
323       {\r
324         buriedColour.setSelected(true);\r
325       }\r
326       else if (sg.cs instanceof ClustalxColourScheme)\r
327       {\r
328         clustalColour.setSelected(true);\r
329       }\r
330       else\r
331       {\r
332         noColourmenuItem.setSelected(true);\r
333       }\r
334 \r
335       if (sg.cs != null && sg.cs.conservationApplied())\r
336       {\r
337         conservationMenuItem.setSelected(true);\r
338       }\r
339 \r
340       showText.setSelected(sg.getDisplayText());\r
341       showColourText.setSelected(sg.getColourText());\r
342       showBoxes.setSelected(sg.getDisplayBoxes());\r
343     }\r
344     else\r
345     {\r
346       groupMenu.setVisible(false);\r
347       editMenu.setVisible(false);\r
348     }\r
349 \r
350     if (!ap.av.alignment.getGroups().contains(sg))\r
351     {\r
352       unGroupMenuItem.setVisible(false);\r
353     }\r
354 \r
355     if (seq == null)\r
356     {\r
357       sequenceMenu.setVisible(false);\r
358       structureMenu.setVisible(false);\r
359     }\r
360 \r
361     if (links != null && links.size() > 0)\r
362     {\r
363       JMenu linkMenu = new JMenu("Link");\r
364       JMenuItem item;\r
365       for (int i = 0; i < links.size(); i++)\r
366       {\r
367         String link = links.elementAt(i).toString();\r
368         final String label = link.substring(0, link.indexOf("|"));\r
369         item = new JMenuItem(label);\r
370         final String url;\r
371 \r
372         if (link.indexOf("$SEQUENCE_ID$") > -1)\r
373         {\r
374           String id = seq.getName();\r
375           if (id.indexOf("|") > -1)\r
376           {\r
377             id = id.substring(id.lastIndexOf("|") + 1);\r
378           }\r
379 \r
380           url = link.substring(link.indexOf("|") + 1,\r
381                                link.indexOf("$SEQUENCE_ID$"))\r
382               + id +\r
383               link.substring(link.indexOf("$SEQUENCE_ID$") + 13);\r
384         }\r
385         else\r
386         {\r
387           url = link.substring(link.lastIndexOf("|") + 1);\r
388         }\r
389 \r
390         item.addActionListener(new java.awt.event.ActionListener()\r
391         {\r
392           public void actionPerformed(ActionEvent e)\r
393           {\r
394             showLink(url);\r
395           }\r
396         });\r
397 \r
398         linkMenu.add(item);\r
399       }\r
400       if (sequence != null)\r
401       {\r
402         sequenceMenu.add(linkMenu);\r
403       }\r
404       else\r
405       {\r
406         add(linkMenu);\r
407       }\r
408     }\r
409   }\r
410 \r
411   /**\r
412    * DOCUMENT ME!\r
413    *\r
414    * @throws Exception DOCUMENT ME!\r
415    */\r
416   private void jbInit()\r
417       throws Exception\r
418   {\r
419     groupMenu.setText("Group");\r
420     groupMenu.setText("Selection");\r
421     groupName.setText("Name");\r
422     groupName.addActionListener(new java.awt.event.ActionListener()\r
423     {\r
424       public void actionPerformed(ActionEvent e)\r
425       {\r
426         groupName_actionPerformed();\r
427       }\r
428     });\r
429     sequenceMenu.setText("Sequence");\r
430     sequenceName.setText("Edit Name/Description");\r
431     sequenceName.addActionListener(new java.awt.event.ActionListener()\r
432     {\r
433       public void actionPerformed(ActionEvent e)\r
434       {\r
435         sequenceName_actionPerformed();\r
436       }\r
437     });\r
438     PIDColour.setFocusPainted(false);\r
439     unGroupMenuItem.setText("Remove Group");\r
440     unGroupMenuItem.addActionListener(new java.awt.event.ActionListener()\r
441     {\r
442       public void actionPerformed(ActionEvent e)\r
443       {\r
444         unGroupMenuItem_actionPerformed();\r
445       }\r
446     });\r
447 \r
448     outline.setText("Border colour");\r
449     outline.addActionListener(new java.awt.event.ActionListener()\r
450     {\r
451       public void actionPerformed(ActionEvent e)\r
452       {\r
453         outline_actionPerformed();\r
454       }\r
455     });\r
456     nucleotideMenuItem.setText("Nucleotide");\r
457     nucleotideMenuItem.addActionListener(new ActionListener()\r
458     {\r
459       public void actionPerformed(ActionEvent e)\r
460       {\r
461         nucleotideMenuItem_actionPerformed();\r
462       }\r
463     });\r
464     colourMenu.setText("Group Colour");\r
465     showBoxes.setText("Boxes");\r
466     showBoxes.setState(true);\r
467     showBoxes.addActionListener(new ActionListener()\r
468     {\r
469       public void actionPerformed(ActionEvent e)\r
470       {\r
471         showBoxes_actionPerformed();\r
472       }\r
473     });\r
474     showText.setText("Text");\r
475     showText.setState(true);\r
476     showText.addActionListener(new ActionListener()\r
477     {\r
478       public void actionPerformed(ActionEvent e)\r
479       {\r
480         showText_actionPerformed();\r
481       }\r
482     });\r
483     showColourText.setText("Colour Text");\r
484     showColourText.addActionListener(new ActionListener()\r
485     {\r
486       public void actionPerformed(ActionEvent e)\r
487       {\r
488         showColourText_actionPerformed();\r
489       }\r
490     });\r
491     editMenu.setText("Edit");\r
492     cut.setText("Cut");\r
493     cut.addActionListener(new ActionListener()\r
494     {\r
495       public void actionPerformed(ActionEvent e)\r
496       {\r
497         cut_actionPerformed();\r
498       }\r
499     });\r
500     upperCase.setText("To Upper Case");\r
501     upperCase.addActionListener(new ActionListener()\r
502     {\r
503       public void actionPerformed(ActionEvent e)\r
504       {\r
505         changeCase(e);\r
506       }\r
507     });\r
508     copy.setText("Copy");\r
509     copy.addActionListener(new ActionListener()\r
510     {\r
511       public void actionPerformed(ActionEvent e)\r
512       {\r
513         copy_actionPerformed();\r
514       }\r
515     });\r
516     lowerCase.setText("To Lower Case");\r
517     lowerCase.addActionListener(new ActionListener()\r
518     {\r
519       public void actionPerformed(ActionEvent e)\r
520       {\r
521         changeCase(e);\r
522       }\r
523     });\r
524     toggle.setText("Toggle Case");\r
525     toggle.addActionListener(new ActionListener()\r
526     {\r
527       public void actionPerformed(ActionEvent e)\r
528       {\r
529         changeCase(e);\r
530       }\r
531     });\r
532     pdbMenu.setText("Associate Structure with Sequence");\r
533     pdbFromFile.setText("From File");\r
534     pdbFromFile.addActionListener(new ActionListener()\r
535     {\r
536       public void actionPerformed(ActionEvent e)\r
537       {\r
538         pdbFromFile_actionPerformed();\r
539       }\r
540     });\r
541     enterPDB.setText("Enter PDB Id");\r
542     enterPDB.addActionListener(new ActionListener()\r
543     {\r
544       public void actionPerformed(ActionEvent e)\r
545       {\r
546         enterPDB_actionPerformed();\r
547       }\r
548     });\r
549     discoverPDB.setText("Discover PDB ids");\r
550     discoverPDB.addActionListener(new ActionListener()\r
551     {\r
552       public void actionPerformed(ActionEvent e)\r
553       {\r
554         discoverPDB_actionPerformed();\r
555       }\r
556     });\r
557     outputMenu.setText("Output to Textbox...");\r
558     sequenceFeature.setText("Create Sequence Feature");\r
559     sequenceFeature.addActionListener(new ActionListener()\r
560     {\r
561       public void actionPerformed(ActionEvent e)\r
562       {\r
563         sequenceFeature_actionPerformed();\r
564       }\r
565     });\r
566     textColour.setText("Text Colour");\r
567     textColour.addActionListener(new ActionListener()\r
568     {\r
569       public void actionPerformed(ActionEvent e)\r
570       {\r
571         textColour_actionPerformed();\r
572       }\r
573     });\r
574     jMenu1.setText("Group");\r
575     structureMenu.setText("Structure");\r
576     viewStructureMenu.setText("View Structure");\r
577   //  colStructureMenu.setText("Colour By Structure");\r
578     editSequence.setText("Edit Sequence...");\r
579     editSequence.addActionListener(new ActionListener()\r
580     {\r
581       public void actionPerformed(ActionEvent actionEvent)\r
582       {\r
583         editSequence_actionPerformed(actionEvent);\r
584       }\r
585     });\r
586    /* annotationMenuItem.setText("By Annotation");\r
587     annotationMenuItem.addActionListener(new ActionListener()\r
588     {\r
589       public void actionPerformed(ActionEvent actionEvent)\r
590       {\r
591         annotationMenuItem_actionPerformed(actionEvent);\r
592       }\r
593     });*/\r
594 \r
595     add(groupMenu);\r
596 \r
597     add(sequenceMenu);\r
598     this.add(structureMenu);\r
599     groupMenu.add(editMenu);\r
600     groupMenu.add(outputMenu);\r
601     groupMenu.add(sequenceFeature);\r
602     groupMenu.add(jMenu1);\r
603     sequenceMenu.add(sequenceName);\r
604     colourMenu.add(textColour);\r
605     colourMenu.add(noColourmenuItem);\r
606     colourMenu.add(clustalColour);\r
607     colourMenu.add(BLOSUM62Colour);\r
608     colourMenu.add(PIDColour);\r
609     colourMenu.add(zappoColour);\r
610     colourMenu.add(taylorColour);\r
611     colourMenu.add(hydrophobicityColour);\r
612     colourMenu.add(helixColour);\r
613     colourMenu.add(strandColour);\r
614     colourMenu.add(turnColour);\r
615     colourMenu.add(buriedColour);\r
616     colourMenu.add(nucleotideMenuItem);\r
617     colourMenu.add(userDefinedColour);\r
618 \r
619     if (jalview.gui.UserDefinedColours.getUserColourSchemes() != null)\r
620     {\r
621       java.util.Enumeration userColours = jalview.gui.UserDefinedColours.\r
622           getUserColourSchemes().keys();\r
623 \r
624       while (userColours.hasMoreElements())\r
625       {\r
626         JMenuItem item = new JMenuItem(userColours.\r
627                                        nextElement().toString());\r
628         item.addActionListener(new ActionListener()\r
629         {\r
630           public void actionPerformed(ActionEvent evt)\r
631           {\r
632             userDefinedColour_actionPerformed(evt);\r
633           }\r
634         });\r
635         colourMenu.add(item);\r
636       }\r
637     }\r
638 \r
639     colourMenu.addSeparator();\r
640     colourMenu.add(abovePIDColour);\r
641     colourMenu.add(conservationMenuItem);\r
642     //colourMenu.add(annotationMenuItem);\r
643     editMenu.add(copy);\r
644     editMenu.add(cut);\r
645     editMenu.add(editSequence);\r
646     editMenu.add(upperCase);\r
647     editMenu.add(lowerCase);\r
648     editMenu.add(toggle);\r
649     pdbMenu.add(pdbFromFile);\r
650     pdbMenu.add(enterPDB);\r
651     pdbMenu.add(discoverPDB);\r
652     jMenu1.add(groupName);\r
653     jMenu1.add(unGroupMenuItem);\r
654     jMenu1.add(colourMenu);\r
655     jMenu1.add(showBoxes);\r
656     jMenu1.add(showText);\r
657     jMenu1.add(showColourText);\r
658     jMenu1.add(outline);\r
659     structureMenu.add(pdbMenu);\r
660     structureMenu.add(viewStructureMenu);\r
661    // structureMenu.add(colStructureMenu);\r
662     noColourmenuItem.setText("None");\r
663     noColourmenuItem.addActionListener(new java.awt.event.ActionListener()\r
664     {\r
665       public void actionPerformed(ActionEvent e)\r
666       {\r
667         noColourmenuItem_actionPerformed();\r
668       }\r
669     });\r
670 \r
671     clustalColour.setText("Clustalx colours");\r
672     clustalColour.addActionListener(new java.awt.event.ActionListener()\r
673     {\r
674       public void actionPerformed(ActionEvent e)\r
675       {\r
676         clustalColour_actionPerformed();\r
677       }\r
678     });\r
679     zappoColour.setText("Zappo");\r
680     zappoColour.addActionListener(new java.awt.event.ActionListener()\r
681     {\r
682       public void actionPerformed(ActionEvent e)\r
683       {\r
684         zappoColour_actionPerformed();\r
685       }\r
686     });\r
687     taylorColour.setText("Taylor");\r
688     taylorColour.addActionListener(new java.awt.event.ActionListener()\r
689     {\r
690       public void actionPerformed(ActionEvent e)\r
691       {\r
692         taylorColour_actionPerformed();\r
693       }\r
694     });\r
695     hydrophobicityColour.setText("Hydrophobicity");\r
696     hydrophobicityColour.addActionListener(new java.awt.event.ActionListener()\r
697     {\r
698       public void actionPerformed(ActionEvent e)\r
699       {\r
700         hydrophobicityColour_actionPerformed();\r
701       }\r
702     });\r
703     helixColour.setText("Helix propensity");\r
704     helixColour.addActionListener(new java.awt.event.ActionListener()\r
705     {\r
706       public void actionPerformed(ActionEvent e)\r
707       {\r
708         helixColour_actionPerformed();\r
709       }\r
710     });\r
711     strandColour.setText("Strand propensity");\r
712     strandColour.addActionListener(new java.awt.event.ActionListener()\r
713     {\r
714       public void actionPerformed(ActionEvent e)\r
715       {\r
716         strandColour_actionPerformed();\r
717       }\r
718     });\r
719     turnColour.setText("Turn propensity");\r
720     turnColour.addActionListener(new java.awt.event.ActionListener()\r
721     {\r
722       public void actionPerformed(ActionEvent e)\r
723       {\r
724         turnColour_actionPerformed();\r
725       }\r
726     });\r
727     buriedColour.setText("Buried Index");\r
728     buriedColour.addActionListener(new java.awt.event.ActionListener()\r
729     {\r
730       public void actionPerformed(ActionEvent e)\r
731       {\r
732         buriedColour_actionPerformed();\r
733       }\r
734     });\r
735     abovePIDColour.setText("Above % Identity");\r
736     abovePIDColour.addActionListener(new java.awt.event.ActionListener()\r
737     {\r
738       public void actionPerformed(ActionEvent e)\r
739       {\r
740         abovePIDColour_actionPerformed();\r
741       }\r
742     });\r
743     userDefinedColour.setText("User Defined...");\r
744     userDefinedColour.addActionListener(new java.awt.event.ActionListener()\r
745     {\r
746       public void actionPerformed(ActionEvent e)\r
747       {\r
748         userDefinedColour_actionPerformed(e);\r
749       }\r
750     });\r
751     PIDColour.setText("Percentage Identity");\r
752     PIDColour.addActionListener(new java.awt.event.ActionListener()\r
753     {\r
754       public void actionPerformed(ActionEvent e)\r
755       {\r
756         PIDColour_actionPerformed();\r
757       }\r
758     });\r
759     BLOSUM62Colour.setText("BLOSUM62");\r
760     BLOSUM62Colour.addActionListener(new java.awt.event.ActionListener()\r
761     {\r
762       public void actionPerformed(ActionEvent e)\r
763       {\r
764         BLOSUM62Colour_actionPerformed();\r
765       }\r
766     });\r
767     conservationMenuItem.setText("Conservation");\r
768     conservationMenuItem.addActionListener(new java.awt.event.ActionListener()\r
769     {\r
770       public void actionPerformed(ActionEvent e)\r
771       {\r
772         conservationMenuItem_actionPerformed();\r
773       }\r
774     });\r
775   }\r
776 \r
777   /**\r
778    * DOCUMENT ME!\r
779    */\r
780   void refresh()\r
781   {\r
782     ap.paintAlignment(true);\r
783 \r
784     PaintRefresher.Refresh(this, ap.av.getSequenceSetId());\r
785   }\r
786 \r
787   /**\r
788    * DOCUMENT ME!\r
789    *\r
790    * @param e DOCUMENT ME!\r
791    */\r
792   protected void clustalColour_actionPerformed()\r
793   {\r
794     SequenceGroup sg = getGroup();\r
795     sg.cs = new ClustalxColourScheme(sg.getSequences(ap.av.hiddenRepSequences),\r
796                                      ap.av.alignment.getWidth());\r
797     refresh();\r
798   }\r
799 \r
800   /**\r
801    * DOCUMENT ME!\r
802    *\r
803    * @param e DOCUMENT ME!\r
804    */\r
805   protected void zappoColour_actionPerformed()\r
806   {\r
807     getGroup().cs = new ZappoColourScheme();\r
808     refresh();\r
809   }\r
810 \r
811   /**\r
812    * DOCUMENT ME!\r
813    *\r
814    * @param e DOCUMENT ME!\r
815    */\r
816   protected void taylorColour_actionPerformed()\r
817   {\r
818     getGroup().cs = new TaylorColourScheme();\r
819     refresh();\r
820   }\r
821 \r
822   /**\r
823    * DOCUMENT ME!\r
824    *\r
825    * @param e DOCUMENT ME!\r
826    */\r
827   protected void hydrophobicityColour_actionPerformed()\r
828   {\r
829     getGroup().cs = new HydrophobicColourScheme();\r
830     refresh();\r
831   }\r
832 \r
833   /**\r
834    * DOCUMENT ME!\r
835    *\r
836    * @param e DOCUMENT ME!\r
837    */\r
838   protected void helixColour_actionPerformed()\r
839   {\r
840     getGroup().cs = new HelixColourScheme();\r
841     refresh();\r
842   }\r
843 \r
844   /**\r
845    * DOCUMENT ME!\r
846    *\r
847    * @param e DOCUMENT ME!\r
848    */\r
849   protected void strandColour_actionPerformed()\r
850   {\r
851     getGroup().cs = new StrandColourScheme();\r
852     refresh();\r
853   }\r
854 \r
855   /**\r
856    * DOCUMENT ME!\r
857    *\r
858    * @param e DOCUMENT ME!\r
859    */\r
860   protected void turnColour_actionPerformed()\r
861   {\r
862     getGroup().cs = new TurnColourScheme();\r
863     refresh();\r
864   }\r
865 \r
866   /**\r
867    * DOCUMENT ME!\r
868    *\r
869    * @param e DOCUMENT ME!\r
870    */\r
871   protected void buriedColour_actionPerformed()\r
872   {\r
873     getGroup().cs = new BuriedColourScheme();\r
874     refresh();\r
875   }\r
876 \r
877   /**\r
878    * DOCUMENT ME!\r
879    *\r
880    * @param e DOCUMENT ME!\r
881    */\r
882   public void nucleotideMenuItem_actionPerformed()\r
883   {\r
884     getGroup().cs = new NucleotideColourScheme();\r
885     refresh();\r
886   }\r
887 \r
888   /**\r
889    * DOCUMENT ME!\r
890    *\r
891    * @param e DOCUMENT ME!\r
892    */\r
893   protected void abovePIDColour_actionPerformed()\r
894   {\r
895     SequenceGroup sg = getGroup();\r
896     if (sg.cs == null)\r
897     {\r
898       return;\r
899     }\r
900 \r
901     if (abovePIDColour.isSelected())\r
902     {\r
903       sg.cs.setConsensus(AAFrequency.calculate(\r
904           sg.getSequences(ap.av.hiddenRepSequences), sg.getStartRes(),\r
905           sg.getEndRes() + 1));\r
906 \r
907       int threshold = SliderPanel.setPIDSliderSource(ap, sg.cs,\r
908           getGroup().getName());\r
909 \r
910       sg.cs.setThreshold(threshold, ap.av.getIgnoreGapsConsensus());\r
911 \r
912       SliderPanel.showPIDSlider();\r
913     }\r
914     else // remove PIDColouring\r
915     {\r
916       sg.cs.setThreshold(0, ap.av.getIgnoreGapsConsensus());\r
917     }\r
918 \r
919     refresh();\r
920   }\r
921 \r
922   /**\r
923    * DOCUMENT ME!\r
924    *\r
925    * @param e DOCUMENT ME!\r
926    */\r
927   protected void userDefinedColour_actionPerformed(ActionEvent e)\r
928   {\r
929     SequenceGroup sg = getGroup();\r
930 \r
931     if (e.getActionCommand().equals("User Defined..."))\r
932     {\r
933       new UserDefinedColours(ap, sg);\r
934     }\r
935     else\r
936     {\r
937       UserColourScheme udc = (UserColourScheme) UserDefinedColours.\r
938           getUserColourSchemes().get(e.getActionCommand());\r
939 \r
940       sg.cs = udc;\r
941     }\r
942     refresh();\r
943   }\r
944 \r
945   /**\r
946    * DOCUMENT ME!\r
947    *\r
948    * @param e DOCUMENT ME!\r
949    */\r
950   protected void PIDColour_actionPerformed()\r
951   {\r
952     SequenceGroup sg = getGroup();\r
953     sg.cs = new PIDColourScheme();\r
954     sg.cs.setConsensus(AAFrequency.calculate(sg.getSequences(ap.av.\r
955         hiddenRepSequences),\r
956                                              sg.getStartRes(),\r
957                                              sg.getEndRes() + 1));\r
958     refresh();\r
959   }\r
960 \r
961   /**\r
962    * DOCUMENT ME!\r
963    *\r
964    * @param e DOCUMENT ME!\r
965    */\r
966   protected void BLOSUM62Colour_actionPerformed()\r
967   {\r
968     SequenceGroup sg = getGroup();\r
969 \r
970     sg.cs = new Blosum62ColourScheme();\r
971 \r
972     sg.cs.setConsensus(AAFrequency.calculate(sg.getSequences(ap.av.\r
973         hiddenRepSequences),\r
974                                              sg.getStartRes(),\r
975                                              sg.getEndRes() + 1));\r
976 \r
977     refresh();\r
978   }\r
979 \r
980   /**\r
981    * DOCUMENT ME!\r
982    *\r
983    * @param e DOCUMENT ME!\r
984    */\r
985   protected void noColourmenuItem_actionPerformed()\r
986   {\r
987     getGroup().cs = null;\r
988     refresh();\r
989   }\r
990 \r
991   /**\r
992    * DOCUMENT ME!\r
993    *\r
994    * @param e DOCUMENT ME!\r
995    */\r
996   protected void conservationMenuItem_actionPerformed()\r
997   {\r
998     SequenceGroup sg = getGroup();\r
999     if (sg.cs == null)\r
1000     {\r
1001       return;\r
1002     }\r
1003 \r
1004     if (conservationMenuItem.isSelected())\r
1005     {\r
1006       Conservation c = new Conservation("Group",\r
1007                                         ResidueProperties.propHash, 3,\r
1008                                         sg.getSequences(ap.av.\r
1009           hiddenRepSequences),\r
1010                                         sg.getStartRes(),\r
1011                                         sg.getEndRes() + 1);\r
1012 \r
1013       c.calculate();\r
1014       c.verdict(false, ap.av.ConsPercGaps);\r
1015 \r
1016       sg.cs.setConservation(c);\r
1017 \r
1018       SliderPanel.setConservationSlider(ap, sg.cs, sg.getName());\r
1019       SliderPanel.showConservationSlider();\r
1020     }\r
1021     else // remove ConservationColouring\r
1022     {\r
1023       sg.cs.setConservation(null);\r
1024     }\r
1025 \r
1026     refresh();\r
1027   }\r
1028 \r
1029   public void annotationMenuItem_actionPerformed(ActionEvent actionEvent)\r
1030   {\r
1031     SequenceGroup sg = getGroup();\r
1032     if (sg == null)\r
1033     {\r
1034       return;\r
1035     }\r
1036 \r
1037     AnnotationColourGradient acg = new AnnotationColourGradient(\r
1038         sequence.getAnnotation()[0], null, AnnotationColourGradient.NO_THRESHOLD);\r
1039 \r
1040     acg.predefinedColours = true;\r
1041     sg.cs = acg;\r
1042 \r
1043     refresh();\r
1044   }\r
1045 \r
1046   /**\r
1047    * DOCUMENT ME!\r
1048    *\r
1049    * @param e DOCUMENT ME!\r
1050    */\r
1051   protected void groupName_actionPerformed()\r
1052   {\r
1053 \r
1054     SequenceGroup sg = getGroup();\r
1055     EditNameDialog dialog = new EditNameDialog(sg.getName(),\r
1056                                                sg.getDescription(),\r
1057                                                "       Group Name ",\r
1058                                                "Group Description ",\r
1059                                                "Edit Group Name/Description");\r
1060 \r
1061     if (!dialog.accept)\r
1062     {\r
1063       return;\r
1064     }\r
1065 \r
1066     sg.setName(dialog.getName());\r
1067     sg.setDescription(dialog.getDescription());\r
1068   }\r
1069 \r
1070   /**\r
1071    * DOCUMENT ME!\r
1072    *\r
1073    * @return DOCUMENT ME!\r
1074    */\r
1075   SequenceGroup getGroup()\r
1076   {\r
1077     SequenceGroup sg = ap.av.getSelectionGroup();\r
1078     // this method won't add a new group if it already exists\r
1079     if (sg != null)\r
1080     {\r
1081       ap.av.alignment.addGroup(sg);\r
1082     }\r
1083 \r
1084     return sg;\r
1085   }\r
1086 \r
1087   /**\r
1088    * DOCUMENT ME!\r
1089    *\r
1090    * @param e DOCUMENT ME!\r
1091    */\r
1092   void sequenceName_actionPerformed()\r
1093   {\r
1094     EditNameDialog dialog = new EditNameDialog(sequence.getName(),\r
1095                                                sequence.getDescription(),\r
1096                                                "       Sequence Name ",\r
1097                                                "Sequence Description ",\r
1098                                                "Edit Sequence Name/Description");\r
1099 \r
1100     if (!dialog.accept)\r
1101     {\r
1102       return;\r
1103     }\r
1104 \r
1105     if (dialog.getName() != null)\r
1106     {\r
1107       if (dialog.getName().indexOf(" ") > -1)\r
1108       {\r
1109         JOptionPane.showMessageDialog(ap,\r
1110                                       "Spaces have been converted to \"_\"",\r
1111                                       "No spaces allowed in Sequence Name",\r
1112                                       JOptionPane.WARNING_MESSAGE);\r
1113       }\r
1114 \r
1115       sequence.setName(dialog.getName().replace(' ', '_'));\r
1116       ap.paintAlignment(false);\r
1117     }\r
1118 \r
1119     sequence.setDescription(dialog.getDescription());\r
1120 \r
1121     ap.av.firePropertyChange("alignment", null,\r
1122                              ap.av.getAlignment().getSequences());\r
1123 \r
1124   }\r
1125 \r
1126   /**\r
1127    * DOCUMENT ME!\r
1128    *\r
1129    * @param e DOCUMENT ME!\r
1130    */\r
1131   void unGroupMenuItem_actionPerformed()\r
1132   {\r
1133     SequenceGroup sg = ap.av.getSelectionGroup();\r
1134     ap.av.alignment.deleteGroup(sg);\r
1135     ap.av.setSelectionGroup(null);\r
1136     refresh();\r
1137   }\r
1138 \r
1139   /**\r
1140    * DOCUMENT ME!\r
1141    *\r
1142    * @param e DOCUMENT ME!\r
1143    */\r
1144   protected void outline_actionPerformed()\r
1145   {\r
1146     SequenceGroup sg = getGroup();\r
1147     Color col = JColorChooser.showDialog(this, "Select Outline Colour",\r
1148                                          Color.BLUE);\r
1149 \r
1150     if (col != null)\r
1151     {\r
1152       sg.setOutlineColour(col);\r
1153     }\r
1154 \r
1155     refresh();\r
1156   }\r
1157 \r
1158   /**\r
1159    * DOCUMENT ME!\r
1160    *\r
1161    * @param e DOCUMENT ME!\r
1162    */\r
1163   public void showBoxes_actionPerformed()\r
1164   {\r
1165     getGroup().setDisplayBoxes(showBoxes.isSelected());\r
1166     refresh();\r
1167   }\r
1168 \r
1169   /**\r
1170    * DOCUMENT ME!\r
1171    *\r
1172    * @param e DOCUMENT ME!\r
1173    */\r
1174   public void showText_actionPerformed()\r
1175   {\r
1176     getGroup().setDisplayText(showText.isSelected());\r
1177     refresh();\r
1178   }\r
1179 \r
1180   /**\r
1181    * DOCUMENT ME!\r
1182    *\r
1183    * @param e DOCUMENT ME!\r
1184    */\r
1185   public void showColourText_actionPerformed()\r
1186   {\r
1187     getGroup().setColourText(showColourText.isSelected());\r
1188     refresh();\r
1189   }\r
1190 \r
1191   public void showLink(String url)\r
1192   {\r
1193     try\r
1194     {\r
1195       jalview.util.BrowserLauncher.openURL(url);\r
1196     }\r
1197     catch (Exception ex)\r
1198     {\r
1199       JOptionPane.showInternalMessageDialog(Desktop.desktop,\r
1200                                             "Unixers: Couldn't find default web browser."\r
1201                                             +\r
1202           "\nAdd the full path to your browser in Preferences.",\r
1203                                             "Web browser not found",\r
1204                                             JOptionPane.WARNING_MESSAGE);\r
1205 \r
1206       ex.printStackTrace();\r
1207     }\r
1208   }\r
1209 \r
1210   void hideSequences(boolean representGroup)\r
1211   {\r
1212     SequenceGroup sg = ap.av.getSelectionGroup();\r
1213     if (sg == null || sg.getSize() < 1)\r
1214     {\r
1215       ap.av.hideSequence(new SequenceI[]\r
1216                          {sequence});\r
1217       return;\r
1218     }\r
1219 \r
1220     ap.av.setSelectionGroup(null);\r
1221 \r
1222     if (representGroup)\r
1223     {\r
1224       ap.av.hideRepSequences(sequence, sg);\r
1225 \r
1226       return;\r
1227     }\r
1228 \r
1229     int gsize = sg.getSize();\r
1230     SequenceI[] hseqs;\r
1231 \r
1232     hseqs = new SequenceI[gsize];\r
1233 \r
1234     int index = 0;\r
1235     for (int i = 0; i < gsize; i++)\r
1236     {\r
1237       hseqs[index++] = sg.getSequenceAt(i);\r
1238     }\r
1239 \r
1240     ap.av.hideSequence(hseqs);\r
1241   }\r
1242 \r
1243   public void copy_actionPerformed()\r
1244   {\r
1245     ap.alignFrame.copy_actionPerformed(null);\r
1246   }\r
1247 \r
1248   public void cut_actionPerformed()\r
1249   {\r
1250     ap.alignFrame.cut_actionPerformed(null);\r
1251   }\r
1252 \r
1253   void changeCase(ActionEvent e)\r
1254   {\r
1255     Object source = e.getSource();\r
1256     SequenceGroup sg = ap.av.getSelectionGroup();\r
1257 \r
1258     if (sg != null)\r
1259     {\r
1260       int[][] startEnd = ap.av.getVisibleRegionBoundaries(\r
1261           sg.getStartRes(), sg.getEndRes() + 1);\r
1262 \r
1263       String description;\r
1264       int caseChange;\r
1265 \r
1266       if (source == toggle)\r
1267       {\r
1268         description = "Toggle Case";\r
1269         caseChange = ChangeCaseCommand.TOGGLE_CASE;\r
1270       }\r
1271       else if (source == upperCase)\r
1272       {\r
1273         description = "To Upper Case";\r
1274         caseChange = ChangeCaseCommand.TO_UPPER;\r
1275       }\r
1276       else\r
1277       {\r
1278         description = "To Lower Case";\r
1279         caseChange = ChangeCaseCommand.TO_LOWER;\r
1280       }\r
1281 \r
1282       ChangeCaseCommand caseCommand = new ChangeCaseCommand(\r
1283           description, sg.getSequencesAsArray(ap.av.hiddenRepSequences),\r
1284           startEnd, caseChange\r
1285           );\r
1286 \r
1287       ap.alignFrame.addHistoryItem(caseCommand);\r
1288 \r
1289       ap.av.firePropertyChange("alignment", null,\r
1290                                ap.av.getAlignment().getSequences());\r
1291 \r
1292     }\r
1293   }\r
1294 \r
1295   public void outputText_actionPerformed(ActionEvent e)\r
1296   {\r
1297     CutAndPasteTransfer cap = new CutAndPasteTransfer();\r
1298     cap.setForInput(null);\r
1299     Desktop.addInternalFrame(cap,\r
1300                              "Alignment output - " + e.getActionCommand(), 600,\r
1301                              500);\r
1302 \r
1303     String[] omitHidden = null;\r
1304 \r
1305     if (ap.av.hasHiddenColumns)\r
1306     {\r
1307       System.out.println("PROMPT USER HERE");\r
1308       omitHidden = ap.av.getViewAsString(true);\r
1309     }\r
1310 \r
1311     cap.setText(new FormatAdapter().formatSequences(\r
1312         e.getActionCommand(),\r
1313         ap.av.getSelectionAsNewSequence(),\r
1314         omitHidden));\r
1315   }\r
1316 \r
1317   public void pdbFromFile_actionPerformed()\r
1318   {\r
1319     jalview.io.JalviewFileChooser chooser\r
1320         = new jalview.io.JalviewFileChooser(jalview.bin.Cache.\r
1321                                             getProperty(\r
1322                                                 "LAST_DIRECTORY"));\r
1323     chooser.setFileView(new jalview.io.JalviewFileView());\r
1324     chooser.setDialogTitle("Select a PDB file");\r
1325     chooser.setToolTipText("Load a PDB file");\r
1326 \r
1327     int value = chooser.showOpenDialog(null);\r
1328 \r
1329     if (value == jalview.io.JalviewFileChooser.APPROVE_OPTION)\r
1330     {\r
1331       PDBEntry entry = new PDBEntry();\r
1332       String choice = chooser.getSelectedFile().getPath();\r
1333       jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);\r
1334       try\r
1335       {\r
1336         MCview.PDBfile pdbfile = new MCview.PDBfile(choice,\r
1337             jalview.io.AppletFormatAdapter.FILE);\r
1338 \r
1339         if (pdbfile.id == null)\r
1340         {\r
1341           String reply = JOptionPane.showInternalInputDialog(\r
1342               Desktop.desktop,\r
1343               "Couldn't find a PDB id in the file supplied."\r
1344               + "Please enter an Id to identify this structure.",\r
1345               "No PDB Id in File", JOptionPane.QUESTION_MESSAGE);\r
1346           if (reply == null)\r
1347           {\r
1348             return;\r
1349           }\r
1350 \r
1351           entry.setId(reply);\r
1352         }\r
1353         else\r
1354         {\r
1355           entry.setId(pdbfile.id);\r
1356         }\r
1357       }\r
1358       catch (java.io.IOException ex)\r
1359       {\r
1360         ex.printStackTrace();\r
1361       }\r
1362 \r
1363       entry.setFile(choice);\r
1364       sequence.getDatasetSequence().addPDBId(entry);\r
1365     }\r
1366 \r
1367   }\r
1368 \r
1369   public void enterPDB_actionPerformed()\r
1370   {\r
1371     String id = JOptionPane.showInternalInputDialog(Desktop.desktop,\r
1372         "Enter PDB Id", "Enter PDB Id", JOptionPane.QUESTION_MESSAGE);\r
1373 \r
1374     if (id != null && id.length() > 0)\r
1375     {\r
1376       PDBEntry entry = new PDBEntry();\r
1377       entry.setId(id.toUpperCase());\r
1378       sequence.getDatasetSequence()\r
1379           .addPDBId(entry);\r
1380     }\r
1381   }\r
1382 \r
1383   public void discoverPDB_actionPerformed()\r
1384   {\r
1385     SequenceI[] sequences =\r
1386          ap.av.selectionGroup == null ?\r
1387            new Sequence[]{sequence}\r
1388          : ap.av.selectionGroup.getSequencesInOrder(ap.av.alignment);\r
1389 \r
1390     new jalview.io.DBRefFetcher(sequences,\r
1391         ap.alignFrame).fetchDBRefs(false);\r
1392   }\r
1393 \r
1394   public void sequenceFeature_actionPerformed()\r
1395   {\r
1396     SequenceGroup sg = ap.av.getSelectionGroup();\r
1397     if (sg == null)\r
1398     {\r
1399       return;\r
1400     }\r
1401 \r
1402     int gSize = sg.getSize();\r
1403     SequenceI[] seqs = new SequenceI[gSize];\r
1404     SequenceFeature[] features = new SequenceFeature[gSize];\r
1405 \r
1406     for (int i = 0; i < gSize; i++)\r
1407     {\r
1408       seqs[i] = sg.getSequenceAt(i).getDatasetSequence();\r
1409       int start = sg.getSequenceAt(i).findPosition(sg.getStartRes());\r
1410       int end = sg.findEndRes(sg.getSequenceAt(i));\r
1411       features[i] = new SequenceFeature(null, null, null, start, end, "Jalview");\r
1412     }\r
1413 \r
1414     if (ap.seqPanel.seqCanvas.getFeatureRenderer()\r
1415         .amendFeatures(seqs, features, true, ap))\r
1416     {\r
1417       ap.alignFrame.showSeqFeatures.setSelected(true);\r
1418       ap.av.setShowSequenceFeatures(true);\r
1419       ap.highlightSearchResults(null);\r
1420     }\r
1421   }\r
1422 \r
1423   public void textColour_actionPerformed()\r
1424   {\r
1425     SequenceGroup sg = getGroup();\r
1426     if (sg != null)\r
1427     {\r
1428       new TextColourChooser().chooseColour(ap, sg);\r
1429     }\r
1430   }\r
1431 \r
1432   public void colourByStructure(String pdbid)\r
1433   {\r
1434     Annotation [] anots = jalview.structure.StructureSelectionManager.getStructureSelectionManager()\r
1435         .colourSequenceFromStructure(sequence, pdbid);\r
1436 \r
1437     AlignmentAnnotation an = new AlignmentAnnotation(\r
1438       "Structure", "Coloured by "+pdbid, anots);\r
1439 \r
1440     ap.av.alignment.addAnnotation(an);\r
1441     an.createSequenceMapping(sequence, 0, true);\r
1442     //an.adjustForAlignment();\r
1443     ap.av.alignment.setAnnotationIndex(an,0);\r
1444 \r
1445     ap.adjustAnnotationHeight();\r
1446 \r
1447     sequence.addAlignmentAnnotation(an);\r
1448 \r
1449     }\r
1450 \r
1451   public void editSequence_actionPerformed(ActionEvent actionEvent)\r
1452   {\r
1453       SequenceGroup sg = ap.av.getSelectionGroup();\r
1454 \r
1455       if(sg!=null)\r
1456       {\r
1457         if (sequence == null)\r
1458           sequence = (Sequence) sg.getSequenceAt(0);\r
1459 \r
1460         EditNameDialog dialog = new EditNameDialog(\r
1461             sequence.getSequenceAsString(\r
1462                 sg.getStartRes(),\r
1463                 sg.getEndRes() + 1),\r
1464             null,\r
1465             "Edit Sequence ",\r
1466             null,\r
1467             "Edit Sequence");\r
1468 \r
1469         if (dialog.accept)\r
1470         {\r
1471           EditCommand editCommand = new EditCommand(\r
1472               "Edit Sequences", EditCommand.REPLACE,\r
1473               dialog.getName().replace(' ', ap.av.getGapCharacter()),\r
1474               sg.getSequencesAsArray(ap.av.hiddenRepSequences),\r
1475               sg.getStartRes(), sg.getEndRes() + 1, ap.av.alignment\r
1476               );\r
1477 \r
1478           ap.alignFrame.addHistoryItem(editCommand);\r
1479 \r
1480           ap.av.firePropertyChange("alignment", null,\r
1481                                    ap.av.getAlignment().getSequences());\r
1482         }\r
1483       }\r
1484   }\r
1485 \r
1486 \r
1487 }\r