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