JAL-1355 (basic i18n support)
[jalview.git] / src / jalview / gui / PopupMenu.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8)\r
3  * Copyright (C) 2012 J Procter, AM Waterhouse, LM Lui, J Engelhardt, G Barton, M Clamp, S Searle\r
4  * \r
5  * This file is part of Jalview.\r
6  * \r
7  * Jalview is free software: you can redistribute it and/or\r
8  * modify it under the terms of the GNU General Public License \r
9  * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\r
10  *  \r
11  * Jalview is distributed in the hope that it will be useful, but \r
12  * WITHOUT ANY WARRANTY; without even the implied warranty \r
13  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR \r
14  * PURPOSE.  See the GNU General Public License for more details.\r
15  * \r
16  * You should have received a copy of the GNU General Public License along with Jalview.  If not, see <http://www.gnu.org/licenses/>.\r
17  */\r
18 package jalview.gui;\r
19 \r
20 import java.util.*;\r
21 \r
22 import java.awt.*;\r
23 import java.awt.event.*;\r
24 \r
25 import javax.swing.*;\r
26 \r
27 import jalview.analysis.*;\r
28 import jalview.commands.*;\r
29 import jalview.datamodel.*;\r
30 import jalview.io.*;\r
31 import jalview.schemes.*;\r
32 import jalview.util.GroupUrlLink;\r
33 import jalview.util.GroupUrlLink.UrlStringTooLongException;\r
34 import jalview.util.MessageManager;\r
35 import jalview.util.UrlLink;\r
36 \r
37 /**\r
38  * DOCUMENT ME!\r
39  * \r
40  * @author $author$\r
41  * @version $Revision: 1.118 $\r
42  */\r
43 public class PopupMenu extends JPopupMenu\r
44 {\r
45   JMenu groupMenu = new JMenu();\r
46 \r
47   JMenuItem groupName = new JMenuItem();\r
48 \r
49   protected JRadioButtonMenuItem clustalColour = new JRadioButtonMenuItem();\r
50 \r
51   protected JRadioButtonMenuItem zappoColour = new JRadioButtonMenuItem();\r
52 \r
53   protected JRadioButtonMenuItem taylorColour = new JRadioButtonMenuItem();\r
54 \r
55   protected JRadioButtonMenuItem hydrophobicityColour = new JRadioButtonMenuItem();\r
56 \r
57   protected JRadioButtonMenuItem helixColour = new JRadioButtonMenuItem();\r
58 \r
59   protected JRadioButtonMenuItem strandColour = new JRadioButtonMenuItem();\r
60 \r
61   protected JRadioButtonMenuItem turnColour = new JRadioButtonMenuItem();\r
62 \r
63   protected JRadioButtonMenuItem buriedColour = new JRadioButtonMenuItem();\r
64 \r
65   protected JCheckBoxMenuItem abovePIDColour = new JCheckBoxMenuItem();\r
66 \r
67   protected JRadioButtonMenuItem userDefinedColour = new JRadioButtonMenuItem();\r
68 \r
69   protected JRadioButtonMenuItem PIDColour = new JRadioButtonMenuItem();\r
70 \r
71   protected JRadioButtonMenuItem BLOSUM62Colour = new JRadioButtonMenuItem();\r
72 \r
73   protected JRadioButtonMenuItem purinePyrimidineColour = new JRadioButtonMenuItem();\r
74 \r
75   // protected JRadioButtonMenuItem covariationColour = new\r
76   // JRadioButtonMenuItem();\r
77 \r
78   JRadioButtonMenuItem noColourmenuItem = new JRadioButtonMenuItem();\r
79 \r
80   protected JCheckBoxMenuItem conservationMenuItem = new JCheckBoxMenuItem();\r
81 \r
82   AlignmentPanel ap;\r
83 \r
84   JMenu sequenceMenu = new JMenu();\r
85 \r
86   JMenuItem sequenceName = new JMenuItem();\r
87 \r
88   JMenuItem sequenceDetails = new JMenuItem();\r
89 \r
90   JMenuItem sequenceSelDetails = new JMenuItem();\r
91 \r
92   SequenceI sequence;\r
93   JMenuItem createGroupMenuItem = new JMenuItem();\r
94   JMenuItem unGroupMenuItem = new JMenuItem();\r
95 \r
96   JMenuItem outline = new JMenuItem();\r
97 \r
98   JRadioButtonMenuItem nucleotideMenuItem = new JRadioButtonMenuItem();\r
99 \r
100   JMenu colourMenu = new JMenu();\r
101 \r
102   JCheckBoxMenuItem showBoxes = new JCheckBoxMenuItem();\r
103 \r
104   JCheckBoxMenuItem showText = new JCheckBoxMenuItem();\r
105 \r
106   JCheckBoxMenuItem showColourText = new JCheckBoxMenuItem();\r
107 \r
108   JCheckBoxMenuItem displayNonconserved = new JCheckBoxMenuItem();\r
109 \r
110   JMenu editMenu = new JMenu();\r
111 \r
112   JMenuItem cut = new JMenuItem();\r
113 \r
114   JMenuItem copy = new JMenuItem();\r
115 \r
116   JMenuItem upperCase = new JMenuItem();\r
117 \r
118   JMenuItem lowerCase = new JMenuItem();\r
119 \r
120   JMenuItem toggle = new JMenuItem();\r
121 \r
122   JMenu pdbMenu = new JMenu();\r
123 \r
124   JMenuItem pdbFromFile = new JMenuItem();\r
125 \r
126   JMenuItem enterPDB = new JMenuItem();\r
127 \r
128   JMenuItem discoverPDB = new JMenuItem();\r
129 \r
130   JMenu outputMenu = new JMenu();\r
131 \r
132   JMenuItem sequenceFeature = new JMenuItem();\r
133 \r
134   JMenuItem textColour = new JMenuItem();\r
135 \r
136   JMenu jMenu1 = new JMenu();\r
137 \r
138   JMenu structureMenu = new JMenu();\r
139 \r
140   JMenu viewStructureMenu = new JMenu();\r
141 \r
142   // JMenu colStructureMenu = new JMenu();\r
143   JMenuItem editSequence = new JMenuItem();\r
144 \r
145   // JMenuItem annotationMenuItem = new JMenuItem();\r
146 \r
147   JMenu groupLinksMenu;\r
148 \r
149   /**\r
150    * Creates a new PopupMenu object.\r
151    * \r
152    * @param ap\r
153    *          DOCUMENT ME!\r
154    * @param seq\r
155    *          DOCUMENT ME!\r
156    */\r
157   public PopupMenu(final AlignmentPanel ap, Sequence seq, Vector links)\r
158   {\r
159     this(ap, seq, links, null);\r
160   }\r
161 \r
162   /**\r
163    * \r
164    * @param ap\r
165    * @param seq\r
166    * @param links\r
167    * @param groupLinks\r
168    */\r
169   public PopupMenu(final AlignmentPanel ap, final SequenceI seq,\r
170           Vector links, Vector groupLinks)\r
171   {\r
172     // /////////////////////////////////////////////////////////\r
173     // If this is activated from the sequence panel, the user may want to\r
174     // edit or annotate a particular residue. Therefore display the residue menu\r
175     //\r
176     // If from the IDPanel, we must display the sequence menu\r
177     // ////////////////////////////////////////////////////////\r
178     this.ap = ap;\r
179     sequence = seq;\r
180 \r
181     ButtonGroup colours = new ButtonGroup();\r
182     colours.add(noColourmenuItem);\r
183     colours.add(clustalColour);\r
184     colours.add(zappoColour);\r
185     colours.add(taylorColour);\r
186     colours.add(hydrophobicityColour);\r
187     colours.add(helixColour);\r
188     colours.add(strandColour);\r
189     colours.add(turnColour);\r
190     colours.add(buriedColour);\r
191     colours.add(abovePIDColour);\r
192     colours.add(userDefinedColour);\r
193     colours.add(PIDColour);\r
194     colours.add(BLOSUM62Colour);\r
195     colours.add(purinePyrimidineColour);\r
196     // colours.add(covariationColour);\r
197 \r
198     for (int i = 0; i < jalview.io.FormatAdapter.WRITEABLE_FORMATS.length; i++)\r
199     {\r
200       JMenuItem item = new JMenuItem(\r
201               jalview.io.FormatAdapter.WRITEABLE_FORMATS[i]);\r
202 \r
203       item.addActionListener(new java.awt.event.ActionListener()\r
204       {\r
205         public void actionPerformed(ActionEvent e)\r
206         {\r
207           outputText_actionPerformed(e);\r
208         }\r
209       });\r
210 \r
211       outputMenu.add(item);\r
212     }\r
213 \r
214     try\r
215     {\r
216       jbInit();\r
217     } catch (Exception e)\r
218     {\r
219       e.printStackTrace();\r
220     }\r
221 \r
222     JMenuItem menuItem;\r
223     if (seq != null)\r
224     {\r
225       sequenceMenu.setText(sequence.getName());\r
226 \r
227       if (seq.getDatasetSequence().getPDBId() != null\r
228               && seq.getDatasetSequence().getPDBId().size() > 0)\r
229       {\r
230         java.util.Enumeration e = seq.getDatasetSequence().getPDBId()\r
231                 .elements();\r
232 \r
233         while (e.hasMoreElements())\r
234         {\r
235           final PDBEntry pdb = (PDBEntry) e.nextElement();\r
236 \r
237           menuItem = new JMenuItem();\r
238           menuItem.setText(pdb.getId());\r
239           menuItem.addActionListener(new java.awt.event.ActionListener()\r
240           {\r
241             public void actionPerformed(ActionEvent e)\r
242             {\r
243               // TODO re JAL-860: optionally open dialog or provide a menu entry\r
244               // allowing user to open just one structure per sequence\r
245               new AppJmol(pdb, ap.av.collateForPDB(new PDBEntry[]\r
246               { pdb })[0], null, ap);\r
247               // new PDBViewer(pdb, seqs2, null, ap, AppletFormatAdapter.FILE);\r
248             }\r
249 \r
250           });\r
251           viewStructureMenu.add(menuItem);\r
252 \r
253           /*\r
254            * menuItem = new JMenuItem(); menuItem.setText(pdb.getId());\r
255            * menuItem.addActionListener(new java.awt.event.ActionListener() {\r
256            * public void actionPerformed(ActionEvent e) {\r
257            * colourByStructure(pdb.getId()); } });\r
258            * colStructureMenu.add(menuItem);\r
259            */\r
260         }\r
261       }\r
262       else\r
263       {\r
264         if (ap.av.getAlignment().isNucleotide() == false)\r
265         {\r
266           structureMenu.remove(viewStructureMenu);\r
267         }\r
268         // structureMenu.remove(colStructureMenu);\r
269       }\r
270 \r
271       if (ap.av.getAlignment().isNucleotide() == true)\r
272       {\r
273         AlignmentAnnotation[] aa = ap.av.getAlignment()\r
274                 .getAlignmentAnnotation();\r
275         for (int i = 0; i < aa.length; i++)\r
276         {\r
277           if (aa[i].getRNAStruc() != null)\r
278           {\r
279             final String rnastruc = aa[i].getRNAStruc();\r
280             final String structureLine = aa[i].label;\r
281             menuItem = new JMenuItem();\r
282             menuItem.setText(MessageManager.formatMessage("label.2d_rna_structure_line", new String[]{structureLine}));\r
283             menuItem.addActionListener(new java.awt.event.ActionListener()\r
284             {\r
285               public void actionPerformed(ActionEvent e)\r
286               {\r
287                 new AppVarna(structureLine, seq, seq.getSequenceAsString(),\r
288                         rnastruc, seq.getName(), ap);\r
289               }\r
290             });\r
291             viewStructureMenu.add(menuItem);\r
292           }\r
293         }\r
294 \r
295         // SequenceFeatures[] test = seq.getSequenceFeatures();\r
296 \r
297         if (seq.getAnnotation() != null)\r
298         {\r
299           AlignmentAnnotation seqAnno[] = seq.getAnnotation();\r
300           for (int i = 0; i < seqAnno.length; i++)\r
301           {\r
302             if (seqAnno[i].getRNAStruc() != null)\r
303             {\r
304               final String rnastruc = seqAnno[i].getRNAStruc();\r
305 \r
306               // TODO: make rnastrucF a bit more nice\r
307               menuItem = new JMenuItem();\r
308               menuItem.setText(MessageManager.formatMessage("label.2d_rna_sequence_name", new String[]{seq.getName()}));\r
309               menuItem.addActionListener(new java.awt.event.ActionListener()\r
310               {\r
311                 public void actionPerformed(ActionEvent e)\r
312                 {\r
313                   // TODO: VARNA does'nt print gaps in the sequence\r
314                   new AppVarna(seq.getName() + " structure", seq, seq\r
315                           .getSequenceAsString(), rnastruc, seq.getName(),\r
316                           ap);\r
317                 }\r
318               });\r
319               viewStructureMenu.add(menuItem);\r
320             }\r
321           }\r
322         }\r
323 \r
324       }\r
325 \r
326       menuItem = new JMenuItem(MessageManager.getString("action.hide_sequences"));\r
327       menuItem.addActionListener(new java.awt.event.ActionListener()\r
328       {\r
329         public void actionPerformed(ActionEvent e)\r
330         {\r
331           hideSequences(false);\r
332         }\r
333       });\r
334       add(menuItem);\r
335 \r
336       if (ap.av.getSelectionGroup() != null\r
337               && ap.av.getSelectionGroup().getSize() > 1)\r
338       {\r
339         menuItem = new JMenuItem(MessageManager.formatMessage("label.represent_group_with", new String[]{seq.getName()}));\r
340         menuItem.addActionListener(new java.awt.event.ActionListener()\r
341         {\r
342           public void actionPerformed(ActionEvent e)\r
343           {\r
344             hideSequences(true);\r
345           }\r
346         });\r
347         sequenceMenu.add(menuItem);\r
348       }\r
349 \r
350       if (ap.av.hasHiddenRows())\r
351       {\r
352         final int index = ap.av.getAlignment().findIndex(seq);\r
353 \r
354         if (ap.av.adjustForHiddenSeqs(index)\r
355                 - ap.av.adjustForHiddenSeqs(index - 1) > 1)\r
356         {\r
357           menuItem = new JMenuItem(MessageManager.getString("action.reveal_sequences"));\r
358           menuItem.addActionListener(new ActionListener()\r
359           {\r
360             public void actionPerformed(ActionEvent e)\r
361             {\r
362               ap.av.showSequence(index);\r
363               if (ap.overviewPanel != null)\r
364               {\r
365                 ap.overviewPanel.updateOverviewImage();\r
366               }\r
367             }\r
368           });\r
369           add(menuItem);\r
370         }\r
371       }\r
372     }\r
373     // for the case when no sequences are even visible\r
374     if (ap.av.hasHiddenRows())\r
375     {\r
376       {\r
377         menuItem = new JMenuItem(MessageManager.getString("action.reveal_all"));\r
378         menuItem.addActionListener(new ActionListener()\r
379         {\r
380           public void actionPerformed(ActionEvent e)\r
381           {\r
382             ap.av.showAllHiddenSeqs();\r
383             if (ap.overviewPanel != null)\r
384             {\r
385               ap.overviewPanel.updateOverviewImage();\r
386             }\r
387           }\r
388         });\r
389 \r
390         add(menuItem);\r
391       }\r
392 \r
393     }\r
394 \r
395     SequenceGroup sg = ap.av.getSelectionGroup();\r
396     boolean isDefinedGroup = (sg!=null) ? ap.av.getAlignment().getGroups().contains(sg) : false;\r
397 \r
398     if (sg != null && sg.getSize() > 0)\r
399     {      \r
400       groupName.setText(MessageManager.formatMessage("label.name_param", new String[]{sg.getName()}));\r
401       groupName.setText(MessageManager.getString("label.edit_name_and_description_current_group"));\r
402 \r
403       if (sg.cs instanceof ZappoColourScheme)\r
404       {\r
405         zappoColour.setSelected(true);\r
406       }\r
407       else if (sg.cs instanceof TaylorColourScheme)\r
408       {\r
409         taylorColour.setSelected(true);\r
410       }\r
411       else if (sg.cs instanceof PIDColourScheme)\r
412       {\r
413         PIDColour.setSelected(true);\r
414       }\r
415       else if (sg.cs instanceof Blosum62ColourScheme)\r
416       {\r
417         BLOSUM62Colour.setSelected(true);\r
418       }\r
419       else if (sg.cs instanceof UserColourScheme)\r
420       {\r
421         userDefinedColour.setSelected(true);\r
422       }\r
423       else if (sg.cs instanceof HydrophobicColourScheme)\r
424       {\r
425         hydrophobicityColour.setSelected(true);\r
426       }\r
427       else if (sg.cs instanceof HelixColourScheme)\r
428       {\r
429         helixColour.setSelected(true);\r
430       }\r
431       else if (sg.cs instanceof StrandColourScheme)\r
432       {\r
433         strandColour.setSelected(true);\r
434       }\r
435       else if (sg.cs instanceof TurnColourScheme)\r
436       {\r
437         turnColour.setSelected(true);\r
438       }\r
439       else if (sg.cs instanceof BuriedColourScheme)\r
440       {\r
441         buriedColour.setSelected(true);\r
442       }\r
443       else if (sg.cs instanceof ClustalxColourScheme)\r
444       {\r
445         clustalColour.setSelected(true);\r
446       }\r
447       else if (sg.cs instanceof PurinePyrimidineColourScheme)\r
448       {\r
449         purinePyrimidineColour.setSelected(true);\r
450       }\r
451       /*\r
452        * else if (sg.cs instanceof CovariationColourScheme) {\r
453        * covariationColour.setSelected(true); }\r
454        */\r
455       else\r
456       {\r
457         noColourmenuItem.setSelected(true);\r
458       }\r
459 \r
460       if (sg.cs != null && sg.cs.conservationApplied())\r
461       {\r
462         conservationMenuItem.setSelected(true);\r
463       }\r
464       displayNonconserved.setSelected(sg.getShowNonconserved());\r
465       showText.setSelected(sg.getDisplayText());\r
466       showColourText.setSelected(sg.getColourText());\r
467       showBoxes.setSelected(sg.getDisplayBoxes());\r
468       // add any groupURLs to the groupURL submenu and make it visible\r
469       if (groupLinks != null && groupLinks.size() > 0)\r
470       {\r
471         buildGroupURLMenu(sg, groupLinks);\r
472       }\r
473       // Add a 'show all structures' for the current selection\r
474       Hashtable<String, PDBEntry> pdbe = new Hashtable<String, PDBEntry>();\r
475       SequenceI sqass = null;\r
476       for (SequenceI sq : ap.av.getSequenceSelection())\r
477       {\r
478         Vector<PDBEntry> pes = (Vector<PDBEntry>) sq.getDatasetSequence()\r
479                 .getPDBId();\r
480         if (pes != null)\r
481         {\r
482           for (PDBEntry pe : pes)\r
483           {\r
484             pdbe.put(pe.getId(), pe);\r
485             if (sqass == null)\r
486             {\r
487               sqass = sq;\r
488             }\r
489           }\r
490         }\r
491       }\r
492       if (pdbe.size() > 0)\r
493       {\r
494         final PDBEntry[] pe = pdbe.values().toArray(\r
495                 new PDBEntry[pdbe.size()]);\r
496         final JMenuItem gpdbview;\r
497         if (pdbe.size() == 1)\r
498         {\r
499           structureMenu.add(gpdbview = new JMenuItem(MessageManager.formatMessage("label.view_structure_for", new String[]{sqass.getDisplayId(false)})));\r
500         }\r
501         else\r
502         {\r
503           structureMenu.add(gpdbview = new JMenuItem(MessageManager.formatMessage("label.view_all_structures", new String[]{new Integer(pdbe.size()).toString()})));\r
504         }\r
505         gpdbview.setToolTipText(MessageManager.getString("label.open_new_jmol_view_with_all_structures_associated_current_selection_superimpose_using_alignment"));\r
506         gpdbview.addActionListener(new ActionListener()\r
507         {\r
508 \r
509           @Override\r
510           public void actionPerformed(ActionEvent e)\r
511           {\r
512             new AppJmol(ap, pe, ap.av.collateForPDB(pe));\r
513           }\r
514         });\r
515       }\r
516     }\r
517     else\r
518     {\r
519       groupMenu.setVisible(false);\r
520       editMenu.setVisible(false);\r
521     }\r
522 \r
523     if (!isDefinedGroup)\r
524     {\r
525       createGroupMenuItem.setVisible(true);\r
526       unGroupMenuItem.setVisible(false);\r
527       jMenu1.setText(MessageManager.getString("action.edit_new_group"));\r
528     } else {\r
529       createGroupMenuItem.setVisible(false);\r
530       unGroupMenuItem.setVisible(true);\r
531       jMenu1.setText(MessageManager.getString("action.edit_group"));\r
532     }\r
533 \r
534     if (seq == null)\r
535     {\r
536       sequenceMenu.setVisible(false);\r
537       structureMenu.setVisible(false);\r
538     }\r
539 \r
540     if (links != null && links.size() > 0)\r
541     {\r
542 \r
543       JMenu linkMenu = new JMenu(MessageManager.getString("action.link"));\r
544       Vector linkset = new Vector();\r
545       for (int i = 0; i < links.size(); i++)\r
546       {\r
547         String link = links.elementAt(i).toString();\r
548         UrlLink urlLink = null;\r
549         try\r
550         {\r
551           urlLink = new UrlLink(link);\r
552         } catch (Exception foo)\r
553         {\r
554           jalview.bin.Cache.log.error("Exception for URLLink '" + link\r
555                   + "'", foo);\r
556           continue;\r
557         }\r
558         ;\r
559         if (!urlLink.isValid())\r
560         {\r
561           jalview.bin.Cache.log.error(urlLink.getInvalidMessage());\r
562           continue;\r
563         }\r
564         final String label = urlLink.getLabel();\r
565         if (seq != null && urlLink.isDynamic())\r
566         {\r
567 \r
568           // collect matching db-refs\r
569           DBRefEntry[] dbr = jalview.util.DBRefUtils.selectRefs(\r
570                   seq.getDBRef(), new String[]\r
571                   { urlLink.getTarget() });\r
572           // collect id string too\r
573           String id = seq.getName();\r
574           String descr = seq.getDescription();\r
575           if (descr != null && descr.length() < 1)\r
576           {\r
577             descr = null;\r
578           }\r
579 \r
580           if (dbr != null)\r
581           {\r
582             for (int r = 0; r < dbr.length; r++)\r
583             {\r
584               if (id != null && dbr[r].getAccessionId().equals(id))\r
585               {\r
586                 // suppress duplicate link creation for the bare sequence ID\r
587                 // string with this link\r
588                 id = null;\r
589               }\r
590               // create Bare ID link for this RUL\r
591               String[] urls = urlLink.makeUrls(dbr[r].getAccessionId(),\r
592                       true);\r
593               if (urls != null)\r
594               {\r
595                 for (int u = 0; u < urls.length; u += 2)\r
596                 {\r
597                   if (!linkset.contains(urls[u] + "|" + urls[u + 1]))\r
598                   {\r
599                     linkset.addElement(urls[u] + "|" + urls[u + 1]);\r
600                     addshowLink(linkMenu, label + "|" + urls[u],\r
601                             urls[u + 1]);\r
602                   }\r
603                 }\r
604               }\r
605             }\r
606           }\r
607           if (id != null)\r
608           {\r
609             // create Bare ID link for this RUL\r
610             String[] urls = urlLink.makeUrls(id, true);\r
611             if (urls != null)\r
612             {\r
613               for (int u = 0; u < urls.length; u += 2)\r
614               {\r
615                 if (!linkset.contains(urls[u] + "|" + urls[u + 1]))\r
616                 {\r
617                   linkset.addElement(urls[u] + "|" + urls[u + 1]);\r
618                   addshowLink(linkMenu, label, urls[u + 1]);\r
619                 }\r
620               }\r
621             }\r
622           }\r
623           // Create urls from description but only for URL links which are regex\r
624           // links\r
625           if (descr != null && urlLink.getRegexReplace() != null)\r
626           {\r
627             // create link for this URL from description where regex matches\r
628             String[] urls = urlLink.makeUrls(descr, true);\r
629             if (urls != null)\r
630             {\r
631               for (int u = 0; u < urls.length; u += 2)\r
632               {\r
633                 if (!linkset.contains(urls[u] + "|" + urls[u + 1]))\r
634                 {\r
635                   linkset.addElement(urls[u] + "|" + urls[u + 1]);\r
636                   addshowLink(linkMenu, label, urls[u + 1]);\r
637                 }\r
638               }\r
639             }\r
640           }\r
641         }\r
642         else\r
643         {\r
644           if (!linkset.contains(label + "|" + urlLink.getUrl_prefix()))\r
645           {\r
646             linkset.addElement(label + "|" + urlLink.getUrl_prefix());\r
647             // Add a non-dynamic link\r
648             addshowLink(linkMenu, label, urlLink.getUrl_prefix());\r
649           }\r
650         }\r
651       }\r
652       if (sequence != null)\r
653       {\r
654         sequenceMenu.add(linkMenu);\r
655       }\r
656       else\r
657       {\r
658         add(linkMenu);\r
659       }\r
660     }\r
661   }\r
662 \r
663   private void buildGroupURLMenu(SequenceGroup sg, Vector groupLinks)\r
664   {\r
665 \r
666     // TODO: usability: thread off the generation of group url content so root\r
667     // menu appears asap\r
668     // sequence only URLs\r
669     // ID/regex match URLs\r
670     groupLinksMenu = new JMenu(MessageManager.getString("action.group_link"));\r
671     JMenu[] linkMenus = new JMenu[]\r
672     { null, new JMenu(MessageManager.getString("action.ids")), new JMenu(MessageManager.getString("action.sequences")),\r
673         new JMenu(MessageManager.getString("action.ids_sequences")) }; // three types of url that might be\r
674                                           // created.\r
675     SequenceI[] seqs = ap.av.getSelectionAsNewSequence();\r
676     String[][] idandseqs = GroupUrlLink.formStrings(seqs);\r
677     Hashtable commonDbrefs = new Hashtable();\r
678     for (int sq = 0; sq < seqs.length; sq++)\r
679     {\r
680 \r
681       int start = seqs[sq].findPosition(sg.getStartRes()), end = seqs[sq]\r
682               .findPosition(sg.getEndRes());\r
683       // just collect ids from dataset sequence\r
684       // TODO: check if IDs collected from selecton group intersects with the\r
685       // current selection, too\r
686       SequenceI sqi = seqs[sq];\r
687       while (sqi.getDatasetSequence() != null)\r
688       {\r
689         sqi = sqi.getDatasetSequence();\r
690       }\r
691       DBRefEntry[] dbr = sqi.getDBRef();\r
692       if (dbr != null && dbr.length > 0)\r
693       {\r
694         for (int d = 0; d < dbr.length; d++)\r
695         {\r
696           String src = dbr[d].getSource(); // jalview.util.DBRefUtils.getCanonicalName(dbr[d].getSource()).toUpperCase();\r
697           Object[] sarray = (Object[]) commonDbrefs.get(src);\r
698           if (sarray == null)\r
699           {\r
700             sarray = new Object[2];\r
701             sarray[0] = new int[]\r
702             { 0 };\r
703             sarray[1] = new String[seqs.length];\r
704 \r
705             commonDbrefs.put(src, sarray);\r
706           }\r
707 \r
708           if (((String[]) sarray[1])[sq] == null)\r
709           {\r
710             if (!dbr[d].hasMap()\r
711                     || (dbr[d].getMap().locateMappedRange(start, end) != null))\r
712             {\r
713               ((String[]) sarray[1])[sq] = dbr[d].getAccessionId();\r
714               ((int[]) sarray[0])[0]++;\r
715             }\r
716           }\r
717         }\r
718       }\r
719     }\r
720     // now create group links for all distinct ID/sequence sets.\r
721     boolean addMenu = false; // indicates if there are any group links to give\r
722                              // to user\r
723     for (int i = 0; i < groupLinks.size(); i++)\r
724     {\r
725       String link = groupLinks.elementAt(i).toString();\r
726       GroupUrlLink urlLink = null;\r
727       try\r
728       {\r
729         urlLink = new GroupUrlLink(link);\r
730       } catch (Exception foo)\r
731       {\r
732         jalview.bin.Cache.log.error("Exception for GroupURLLink '" + link\r
733                 + "'", foo);\r
734         continue;\r
735       }\r
736       ;\r
737       if (!urlLink.isValid())\r
738       {\r
739         jalview.bin.Cache.log.error(urlLink.getInvalidMessage());\r
740         continue;\r
741       }\r
742       final String label = urlLink.getLabel();\r
743       boolean usingNames = false;\r
744       // Now see which parts of the group apply for this URL\r
745       String ltarget = urlLink.getTarget(); // jalview.util.DBRefUtils.getCanonicalName(urlLink.getTarget());\r
746       Object[] idset = (Object[]) commonDbrefs.get(ltarget.toUpperCase());\r
747       String[] seqstr, ids; // input to makeUrl\r
748       if (idset != null)\r
749       {\r
750         int numinput = ((int[]) idset[0])[0];\r
751         String[] allids = ((String[]) idset[1]);\r
752         seqstr = new String[numinput];\r
753         ids = new String[numinput];\r
754         for (int sq = 0, idcount = 0; sq < seqs.length; sq++)\r
755         {\r
756           if (allids[sq] != null)\r
757           {\r
758             ids[idcount] = allids[sq];\r
759             seqstr[idcount++] = idandseqs[1][sq];\r
760           }\r
761         }\r
762       }\r
763       else\r
764       {\r
765         // just use the id/seq set\r
766         seqstr = idandseqs[1];\r
767         ids = idandseqs[0];\r
768         usingNames = true;\r
769       }\r
770       // and try and make the groupURL!\r
771 \r
772       Object[] urlset = null;\r
773       try\r
774       {\r
775         urlset = urlLink.makeUrlStubs(ids, seqstr,\r
776                 "FromJalview" + System.currentTimeMillis(), false);\r
777       } catch (UrlStringTooLongException e)\r
778       {\r
779       }\r
780       if (urlset != null)\r
781       {\r
782         int type = urlLink.getGroupURLType() & 3;\r
783         // System.out.println(urlLink.getGroupURLType()\r
784         // +" "+((String[])urlset[3])[0]);\r
785         // first two bits ofurlLink type bitfield are sequenceids and sequences\r
786         // TODO: FUTURE: ensure the groupURL menu structure can be generalised\r
787         addshowLink(linkMenus[type], label\r
788                 + (((type & 1) == 1) ? ("("\r
789                         + (usingNames ? "Names" : ltarget) + ")") : ""),\r
790                 urlLink, urlset);\r
791         addMenu = true;\r
792       }\r
793     }\r
794     if (addMenu)\r
795     {\r
796       groupLinksMenu = new JMenu(MessageManager.getString("action.group_link"));\r
797       for (int m = 0; m < linkMenus.length; m++)\r
798       {\r
799         if (linkMenus[m] != null\r
800                 && linkMenus[m].getMenuComponentCount() > 0)\r
801         {\r
802           groupLinksMenu.add(linkMenus[m]);\r
803         }\r
804       }\r
805 \r
806       groupMenu.add(groupLinksMenu);\r
807     }\r
808   }\r
809 \r
810   /**\r
811    * add a show URL menu item to the given linkMenu\r
812    * \r
813    * @param linkMenu\r
814    * @param label\r
815    *          - menu label string\r
816    * @param url\r
817    *          - url to open\r
818    */\r
819   private void addshowLink(JMenu linkMenu, String label, final String url)\r
820   {\r
821     JMenuItem item = new JMenuItem(label);\r
822     item.setToolTipText(MessageManager.formatMessage("label.open_url_param", new String[]{url}));\r
823     item.addActionListener(new java.awt.event.ActionListener()\r
824     {\r
825       public void actionPerformed(ActionEvent e)\r
826       {\r
827         new Thread(new Runnable()\r
828         {\r
829 \r
830           public void run()\r
831           {\r
832             showLink(url);\r
833           }\r
834 \r
835         }).start();\r
836       }\r
837     });\r
838 \r
839     linkMenu.add(item);\r
840   }\r
841 \r
842   /**\r
843    * add a late bound groupURL item to the given linkMenu\r
844    * \r
845    * @param linkMenu\r
846    * @param label\r
847    *          - menu label string\r
848    * @param urlgenerator\r
849    *          GroupURLLink used to generate URL\r
850    * @param urlstub\r
851    *          Object array returned from the makeUrlStubs function.\r
852    */\r
853   private void addshowLink(JMenu linkMenu, String label,\r
854           final GroupUrlLink urlgenerator, final Object[] urlstub)\r
855   {\r
856     JMenuItem item = new JMenuItem(label);\r
857     item.setToolTipText(MessageManager.formatMessage("label.open_url_seqs_param", new Object[]{urlgenerator.getUrl_prefix(),urlgenerator.getNumberInvolved(urlstub)}));\r
858     // TODO: put in info about what is being sent.\r
859     item.addActionListener(new java.awt.event.ActionListener()\r
860     {\r
861       public void actionPerformed(ActionEvent e)\r
862       {\r
863         new Thread(new Runnable()\r
864         {\r
865 \r
866           public void run()\r
867           {\r
868             try\r
869             {\r
870               showLink(urlgenerator.constructFrom(urlstub));\r
871             } catch (UrlStringTooLongException e)\r
872             {\r
873             }\r
874           }\r
875 \r
876         }).start();\r
877       }\r
878     });\r
879 \r
880     linkMenu.add(item);\r
881   }\r
882 \r
883   /**\r
884    * DOCUMENT ME!\r
885    * \r
886    * @throws Exception\r
887    *           DOCUMENT ME!\r
888    */\r
889   private void jbInit() throws Exception\r
890   {\r
891     groupMenu.setText(MessageManager.getString("label.group"));\r
892     groupMenu.setText(MessageManager.getString("label.selection"));\r
893     groupName.setText(MessageManager.getString("label.name"));\r
894     groupName.addActionListener(new java.awt.event.ActionListener()\r
895     {\r
896       public void actionPerformed(ActionEvent e)\r
897       {\r
898         groupName_actionPerformed();\r
899       }\r
900     });\r
901     sequenceMenu.setText(MessageManager.getString("label.sequence"));\r
902     sequenceName.setText(MessageManager.getString("label.edit_name_description"));\r
903     sequenceName.addActionListener(new java.awt.event.ActionListener()\r
904     {\r
905       public void actionPerformed(ActionEvent e)\r
906       {\r
907         sequenceName_actionPerformed();\r
908       }\r
909     });\r
910     sequenceDetails.setText(MessageManager.getString("label.sequence_details") + "...");\r
911     sequenceDetails.addActionListener(new java.awt.event.ActionListener()\r
912     {\r
913       public void actionPerformed(ActionEvent e)\r
914       {\r
915         sequenceDetails_actionPerformed();\r
916       }\r
917     });\r
918     sequenceSelDetails.setText(MessageManager.getString("label.sequence_details") + "...");\r
919     sequenceSelDetails\r
920             .addActionListener(new java.awt.event.ActionListener()\r
921             {\r
922               public void actionPerformed(ActionEvent e)\r
923               {\r
924                 sequenceSelectionDetails_actionPerformed();\r
925               }\r
926             });\r
927     PIDColour.setFocusPainted(false);\r
928     unGroupMenuItem.setText(MessageManager.getString("action.remove_group"));\r
929     unGroupMenuItem.addActionListener(new java.awt.event.ActionListener()\r
930     {\r
931       public void actionPerformed(ActionEvent e)\r
932       {\r
933         unGroupMenuItem_actionPerformed();\r
934       }\r
935     });\r
936     createGroupMenuItem.setText(MessageManager.getString("action.create_group"));\r
937     createGroupMenuItem.addActionListener(new java.awt.event.ActionListener()\r
938     {\r
939       public void actionPerformed(ActionEvent e)\r
940       {\r
941         createGroupMenuItem_actionPerformed();\r
942       }\r
943     });\r
944 \r
945     outline.setText(MessageManager.getString("action.border_colour"));\r
946     outline.addActionListener(new java.awt.event.ActionListener()\r
947     {\r
948       public void actionPerformed(ActionEvent e)\r
949       {\r
950         outline_actionPerformed();\r
951       }\r
952     });\r
953     nucleotideMenuItem.setText(MessageManager.getString("label.nucleotide"));\r
954     nucleotideMenuItem.addActionListener(new ActionListener()\r
955     {\r
956       public void actionPerformed(ActionEvent e)\r
957       {\r
958         nucleotideMenuItem_actionPerformed();\r
959       }\r
960     });\r
961     colourMenu.setText(MessageManager.getString("label.group_colour"));\r
962     showBoxes.setText(MessageManager.getString("action.boxes"));\r
963     showBoxes.setState(true);\r
964     showBoxes.addActionListener(new ActionListener()\r
965     {\r
966       public void actionPerformed(ActionEvent e)\r
967       {\r
968         showBoxes_actionPerformed();\r
969       }\r
970     });\r
971     showText.setText(MessageManager.getString("action.text"));\r
972     showText.setState(true);\r
973     showText.addActionListener(new ActionListener()\r
974     {\r
975       public void actionPerformed(ActionEvent e)\r
976       {\r
977         showText_actionPerformed();\r
978       }\r
979     });\r
980     showColourText.setText(MessageManager.getString("label.colour_text"));\r
981     showColourText.addActionListener(new ActionListener()\r
982     {\r
983       public void actionPerformed(ActionEvent e)\r
984       {\r
985         showColourText_actionPerformed();\r
986       }\r
987     });\r
988     displayNonconserved.setText(MessageManager.getString("label.show_non_conversed"));\r
989     displayNonconserved.setState(true);\r
990     displayNonconserved.addActionListener(new ActionListener()\r
991     {\r
992       public void actionPerformed(ActionEvent e)\r
993       {\r
994         showNonconserved_actionPerformed();\r
995       }\r
996     });\r
997     editMenu.setText(MessageManager.getString("action.edit"));\r
998     cut.setText(MessageManager.getString("action.cut"));\r
999     cut.addActionListener(new ActionListener()\r
1000     {\r
1001       public void actionPerformed(ActionEvent e)\r
1002       {\r
1003         cut_actionPerformed();\r
1004       }\r
1005     });\r
1006     upperCase.setText(MessageManager.getString("label.to_upper_case"));\r
1007     upperCase.addActionListener(new ActionListener()\r
1008     {\r
1009       public void actionPerformed(ActionEvent e)\r
1010       {\r
1011         changeCase(e);\r
1012       }\r
1013     });\r
1014     copy.setText(MessageManager.getString("action.copy"));\r
1015     copy.addActionListener(new ActionListener()\r
1016     {\r
1017       public void actionPerformed(ActionEvent e)\r
1018       {\r
1019         copy_actionPerformed();\r
1020       }\r
1021     });\r
1022     lowerCase.setText(MessageManager.getString("label.to_lower_case"));\r
1023     lowerCase.addActionListener(new ActionListener()\r
1024     {\r
1025       public void actionPerformed(ActionEvent e)\r
1026       {\r
1027         changeCase(e);\r
1028       }\r
1029     });\r
1030     toggle.setText(MessageManager.getString("label.toggle_case"));\r
1031     toggle.addActionListener(new ActionListener()\r
1032     {\r
1033       public void actionPerformed(ActionEvent e)\r
1034       {\r
1035         changeCase(e);\r
1036       }\r
1037     });\r
1038     pdbMenu.setText(MessageManager.getString("label.associate_structure_with_sequence"));\r
1039     pdbFromFile.setText(MessageManager.getString("label.from_file"));\r
1040     pdbFromFile.addActionListener(new ActionListener()\r
1041     {\r
1042       public void actionPerformed(ActionEvent e)\r
1043       {\r
1044         pdbFromFile_actionPerformed();\r
1045       }\r
1046     });\r
1047     enterPDB.setText(MessageManager.getString("label.enter_pdb_id"));\r
1048     enterPDB.addActionListener(new ActionListener()\r
1049     {\r
1050       public void actionPerformed(ActionEvent e)\r
1051       {\r
1052         enterPDB_actionPerformed();\r
1053       }\r
1054     });\r
1055     discoverPDB.setText(MessageManager.getString("label.discover_pdb_ids"));\r
1056     discoverPDB.addActionListener(new ActionListener()\r
1057     {\r
1058       public void actionPerformed(ActionEvent e)\r
1059       {\r
1060         discoverPDB_actionPerformed();\r
1061       }\r
1062     });\r
1063     outputMenu.setText(MessageManager.getString("label.out_to_textbox") + "...");\r
1064     sequenceFeature.setText(MessageManager.getString("label.create_sequence_feature"));\r
1065     sequenceFeature.addActionListener(new ActionListener()\r
1066     {\r
1067       public void actionPerformed(ActionEvent e)\r
1068       {\r
1069         sequenceFeature_actionPerformed();\r
1070       }\r
1071     });\r
1072     textColour.setText(MessageManager.getString("label.text_colour"));\r
1073     textColour.addActionListener(new ActionListener()\r
1074     {\r
1075       public void actionPerformed(ActionEvent e)\r
1076       {\r
1077         textColour_actionPerformed();\r
1078       }\r
1079     });\r
1080     jMenu1.setText(MessageManager.getString("label.group"));\r
1081     structureMenu.setText(MessageManager.getString("label.structure"));\r
1082     viewStructureMenu.setText(MessageManager.getString("label.view_structure"));\r
1083     // colStructureMenu.setText("Colour By Structure");\r
1084     editSequence.setText(MessageManager.getString("label.edit_sequence") + "...");\r
1085     editSequence.addActionListener(new ActionListener()\r
1086     {\r
1087       public void actionPerformed(ActionEvent actionEvent)\r
1088       {\r
1089         editSequence_actionPerformed(actionEvent);\r
1090       }\r
1091     });\r
1092 \r
1093     /*\r
1094      * annotationMenuItem.setText("By Annotation");\r
1095      * annotationMenuItem.addActionListener(new ActionListener() { public void\r
1096      * actionPerformed(ActionEvent actionEvent) {\r
1097      * annotationMenuItem_actionPerformed(actionEvent); } });\r
1098      */\r
1099     groupMenu.add(sequenceSelDetails);\r
1100     add(groupMenu);\r
1101     add(sequenceMenu);\r
1102     this.add(structureMenu);\r
1103     groupMenu.add(editMenu);\r
1104     groupMenu.add(outputMenu);\r
1105     groupMenu.add(sequenceFeature);\r
1106     groupMenu.add(createGroupMenuItem);\r
1107     groupMenu.add(unGroupMenuItem);\r
1108     groupMenu.add(jMenu1);\r
1109     sequenceMenu.add(sequenceName);\r
1110     sequenceMenu.add(sequenceDetails);\r
1111     colourMenu.add(textColour);\r
1112     colourMenu.add(noColourmenuItem);\r
1113     colourMenu.add(clustalColour);\r
1114     colourMenu.add(BLOSUM62Colour);\r
1115     colourMenu.add(PIDColour);\r
1116     colourMenu.add(zappoColour);\r
1117     colourMenu.add(taylorColour);\r
1118     colourMenu.add(hydrophobicityColour);\r
1119     colourMenu.add(helixColour);\r
1120     colourMenu.add(strandColour);\r
1121     colourMenu.add(turnColour);\r
1122     colourMenu.add(buriedColour);\r
1123     colourMenu.add(nucleotideMenuItem);\r
1124     if (ap.getAlignment().isNucleotide())\r
1125     {\r
1126       colourMenu.add(purinePyrimidineColour);\r
1127     }\r
1128     // colourMenu.add(covariationColour);\r
1129     colourMenu.add(userDefinedColour);\r
1130 \r
1131     if (jalview.gui.UserDefinedColours.getUserColourSchemes() != null)\r
1132     {\r
1133       java.util.Enumeration userColours = jalview.gui.UserDefinedColours\r
1134               .getUserColourSchemes().keys();\r
1135 \r
1136       while (userColours.hasMoreElements())\r
1137       {\r
1138         JMenuItem item = new JMenuItem(userColours.nextElement().toString());\r
1139         item.addActionListener(new ActionListener()\r
1140         {\r
1141           public void actionPerformed(ActionEvent evt)\r
1142           {\r
1143             userDefinedColour_actionPerformed(evt);\r
1144           }\r
1145         });\r
1146         colourMenu.add(item);\r
1147       }\r
1148     }\r
1149 \r
1150     colourMenu.addSeparator();\r
1151     colourMenu.add(abovePIDColour);\r
1152     colourMenu.add(conservationMenuItem);\r
1153     // colourMenu.add(annotationMenuItem);\r
1154     editMenu.add(copy);\r
1155     editMenu.add(cut);\r
1156     editMenu.add(editSequence);\r
1157     editMenu.add(upperCase);\r
1158     editMenu.add(lowerCase);\r
1159     editMenu.add(toggle);\r
1160     pdbMenu.add(pdbFromFile);\r
1161     pdbMenu.add(enterPDB);\r
1162     pdbMenu.add(discoverPDB);\r
1163     jMenu1.add(groupName);\r
1164     jMenu1.add(colourMenu);\r
1165     jMenu1.add(showBoxes);\r
1166     jMenu1.add(showText);\r
1167     jMenu1.add(showColourText);\r
1168     jMenu1.add(outline);\r
1169     jMenu1.add(displayNonconserved);\r
1170     structureMenu.add(pdbMenu);\r
1171     structureMenu.add(viewStructureMenu);\r
1172     // structureMenu.add(colStructureMenu);\r
1173     noColourmenuItem.setText(MessageManager.getString("label.none"));\r
1174     noColourmenuItem.addActionListener(new java.awt.event.ActionListener()\r
1175     {\r
1176       public void actionPerformed(ActionEvent e)\r
1177       {\r
1178         noColourmenuItem_actionPerformed();\r
1179       }\r
1180     });\r
1181 \r
1182     clustalColour.setText(MessageManager.getString("label.clustalx_colours"));\r
1183     clustalColour.addActionListener(new java.awt.event.ActionListener()\r
1184     {\r
1185       public void actionPerformed(ActionEvent e)\r
1186       {\r
1187         clustalColour_actionPerformed();\r
1188       }\r
1189     });\r
1190     zappoColour.setText(MessageManager.getString("label.zappo"));\r
1191     zappoColour.addActionListener(new java.awt.event.ActionListener()\r
1192     {\r
1193       public void actionPerformed(ActionEvent e)\r
1194       {\r
1195         zappoColour_actionPerformed();\r
1196       }\r
1197     });\r
1198     taylorColour.setText(MessageManager.getString("label.taylor"));\r
1199     taylorColour.addActionListener(new java.awt.event.ActionListener()\r
1200     {\r
1201       public void actionPerformed(ActionEvent e)\r
1202       {\r
1203         taylorColour_actionPerformed();\r
1204       }\r
1205     });\r
1206     hydrophobicityColour.setText(MessageManager.getString("label.hydrophobicity"));\r
1207     hydrophobicityColour\r
1208             .addActionListener(new java.awt.event.ActionListener()\r
1209             {\r
1210               public void actionPerformed(ActionEvent e)\r
1211               {\r
1212                 hydrophobicityColour_actionPerformed();\r
1213               }\r
1214             });\r
1215     helixColour.setText(MessageManager.getString("label.helix_propensity"));\r
1216     helixColour.addActionListener(new java.awt.event.ActionListener()\r
1217     {\r
1218       public void actionPerformed(ActionEvent e)\r
1219       {\r
1220         helixColour_actionPerformed();\r
1221       }\r
1222     });\r
1223     strandColour.setText(MessageManager.getString("label.strand_propensity"));\r
1224     strandColour.addActionListener(new java.awt.event.ActionListener()\r
1225     {\r
1226       public void actionPerformed(ActionEvent e)\r
1227       {\r
1228         strandColour_actionPerformed();\r
1229       }\r
1230     });\r
1231     turnColour.setText(MessageManager.getString("label.turn_propensity"));\r
1232     turnColour.addActionListener(new java.awt.event.ActionListener()\r
1233     {\r
1234       public void actionPerformed(ActionEvent e)\r
1235       {\r
1236         turnColour_actionPerformed();\r
1237       }\r
1238     });\r
1239     buriedColour.setText(MessageManager.getString("label.buried_index"));\r
1240     buriedColour.addActionListener(new java.awt.event.ActionListener()\r
1241     {\r
1242       public void actionPerformed(ActionEvent e)\r
1243       {\r
1244         buriedColour_actionPerformed();\r
1245       }\r
1246     });\r
1247     abovePIDColour.setText(MessageManager.getString("label.above_identity_percentage"));\r
1248     abovePIDColour.addActionListener(new java.awt.event.ActionListener()\r
1249     {\r
1250       public void actionPerformed(ActionEvent e)\r
1251       {\r
1252         abovePIDColour_actionPerformed();\r
1253       }\r
1254     });\r
1255     userDefinedColour.setText(MessageManager.getString("action.user_defined"));\r
1256     userDefinedColour.addActionListener(new java.awt.event.ActionListener()\r
1257     {\r
1258       public void actionPerformed(ActionEvent e)\r
1259       {\r
1260         userDefinedColour_actionPerformed(e);\r
1261       }\r
1262     });\r
1263     PIDColour.setText(MessageManager.getString("label.percentage_identity"));\r
1264     PIDColour.addActionListener(new java.awt.event.ActionListener()\r
1265     {\r
1266       public void actionPerformed(ActionEvent e)\r
1267       {\r
1268         PIDColour_actionPerformed();\r
1269       }\r
1270     });\r
1271     BLOSUM62Colour.setText(MessageManager.getString("label.blosum62"));\r
1272     BLOSUM62Colour.addActionListener(new java.awt.event.ActionListener()\r
1273     {\r
1274       public void actionPerformed(ActionEvent e)\r
1275       {\r
1276         BLOSUM62Colour_actionPerformed();\r
1277       }\r
1278     });\r
1279     purinePyrimidineColour.setText(MessageManager.getString("label.purine_pyrimidine"));\r
1280     purinePyrimidineColour\r
1281             .addActionListener(new java.awt.event.ActionListener()\r
1282             {\r
1283               public void actionPerformed(ActionEvent e)\r
1284               {\r
1285                 purinePyrimidineColour_actionPerformed();\r
1286               }\r
1287             });\r
1288     /*\r
1289      * covariationColour.addActionListener(new java.awt.event.ActionListener() {\r
1290      * public void actionPerformed(ActionEvent e) {\r
1291      * covariationColour_actionPerformed(); } });\r
1292      */\r
1293 \r
1294     conservationMenuItem.setText(MessageManager.getString("label.conservation"));\r
1295     conservationMenuItem\r
1296             .addActionListener(new java.awt.event.ActionListener()\r
1297             {\r
1298               public void actionPerformed(ActionEvent e)\r
1299               {\r
1300                 conservationMenuItem_actionPerformed();\r
1301               }\r
1302             });\r
1303   }\r
1304 \r
1305   protected void sequenceSelectionDetails_actionPerformed()\r
1306   {\r
1307     createSequenceDetailsReport(ap.av.getSequenceSelection());\r
1308   }\r
1309 \r
1310   protected void sequenceDetails_actionPerformed()\r
1311   {\r
1312     createSequenceDetailsReport(new SequenceI[]\r
1313     { sequence });\r
1314   }\r
1315 \r
1316   public void createSequenceDetailsReport(SequenceI[] sequences)\r
1317   {\r
1318     CutAndPasteHtmlTransfer cap = new CutAndPasteHtmlTransfer();\r
1319     StringBuffer contents = new StringBuffer();\r
1320     for (SequenceI seq : sequences)\r
1321     {           \r
1322       contents.append("<p><h2>" + MessageManager.formatMessage("label.create_sequence_details_report_annotation_for", new String[]{seq.getDisplayId(true)})\r
1323               + "</h2></p><p>");\r
1324       new SequenceAnnotationReport(null)\r
1325               .createSequenceAnnotationReport(\r
1326                       contents,\r
1327                       seq,\r
1328                       true,\r
1329                       true,\r
1330                       false,\r
1331                       (ap.seqPanel.seqCanvas.fr != null) ? ap.seqPanel.seqCanvas.fr.minmax\r
1332                               : null);\r
1333       contents.append("</p>");\r
1334     }\r
1335     cap.setText("<html>" + contents.toString() + "</html>");\r
1336 \r
1337     Desktop.instance.addInternalFrame(cap, MessageManager.formatMessage("label.sequece_details_for", (sequences.length == 1 ? new String[]{sequences[0].getDisplayId(true)}: new String[]{MessageManager.getString("label.selection")}))\r
1338                 ,500, 400);\r
1339 \r
1340   }\r
1341 \r
1342   protected void showNonconserved_actionPerformed()\r
1343   {\r
1344     getGroup().setShowNonconserved(displayNonconserved.isSelected());\r
1345     refresh();\r
1346   }\r
1347 \r
1348   /**\r
1349    * call to refresh view after settings change\r
1350    */\r
1351   void refresh()\r
1352   {\r
1353     ap.updateAnnotation();\r
1354     ap.paintAlignment(true);\r
1355 \r
1356     PaintRefresher.Refresh(this, ap.av.getSequenceSetId());\r
1357   }\r
1358 \r
1359   /**\r
1360    * DOCUMENT ME!\r
1361    * \r
1362    * @param e\r
1363    *          DOCUMENT ME!\r
1364    */\r
1365   protected void clustalColour_actionPerformed()\r
1366   {\r
1367     SequenceGroup sg = getGroup();\r
1368     sg.cs = new ClustalxColourScheme(sg, ap.av.getHiddenRepSequences());\r
1369     refresh();\r
1370   }\r
1371 \r
1372   /**\r
1373    * DOCUMENT ME!\r
1374    * \r
1375    * @param e\r
1376    *          DOCUMENT ME!\r
1377    */\r
1378   protected void zappoColour_actionPerformed()\r
1379   {\r
1380     getGroup().cs = new ZappoColourScheme();\r
1381     refresh();\r
1382   }\r
1383 \r
1384   /**\r
1385    * DOCUMENT ME!\r
1386    * \r
1387    * @param e\r
1388    *          DOCUMENT ME!\r
1389    */\r
1390   protected void taylorColour_actionPerformed()\r
1391   {\r
1392     getGroup().cs = new TaylorColourScheme();\r
1393     refresh();\r
1394   }\r
1395 \r
1396   /**\r
1397    * DOCUMENT ME!\r
1398    * \r
1399    * @param e\r
1400    *          DOCUMENT ME!\r
1401    */\r
1402   protected void hydrophobicityColour_actionPerformed()\r
1403   {\r
1404     getGroup().cs = new HydrophobicColourScheme();\r
1405     refresh();\r
1406   }\r
1407 \r
1408   /**\r
1409    * DOCUMENT ME!\r
1410    * \r
1411    * @param e\r
1412    *          DOCUMENT ME!\r
1413    */\r
1414   protected void helixColour_actionPerformed()\r
1415   {\r
1416     getGroup().cs = new HelixColourScheme();\r
1417     refresh();\r
1418   }\r
1419 \r
1420   /**\r
1421    * DOCUMENT ME!\r
1422    * \r
1423    * @param e\r
1424    *          DOCUMENT ME!\r
1425    */\r
1426   protected void strandColour_actionPerformed()\r
1427   {\r
1428     getGroup().cs = new StrandColourScheme();\r
1429     refresh();\r
1430   }\r
1431 \r
1432   /**\r
1433    * DOCUMENT ME!\r
1434    * \r
1435    * @param e\r
1436    *          DOCUMENT ME!\r
1437    */\r
1438   protected void turnColour_actionPerformed()\r
1439   {\r
1440     getGroup().cs = new TurnColourScheme();\r
1441     refresh();\r
1442   }\r
1443 \r
1444   /**\r
1445    * DOCUMENT ME!\r
1446    * \r
1447    * @param e\r
1448    *          DOCUMENT ME!\r
1449    */\r
1450   protected void buriedColour_actionPerformed()\r
1451   {\r
1452     getGroup().cs = new BuriedColourScheme();\r
1453     refresh();\r
1454   }\r
1455 \r
1456   /**\r
1457    * DOCUMENT ME!\r
1458    * \r
1459    * @param e\r
1460    *          DOCUMENT ME!\r
1461    */\r
1462   public void nucleotideMenuItem_actionPerformed()\r
1463   {\r
1464     getGroup().cs = new NucleotideColourScheme();\r
1465     refresh();\r
1466   }\r
1467 \r
1468   protected void purinePyrimidineColour_actionPerformed()\r
1469   {\r
1470     getGroup().cs = new PurinePyrimidineColourScheme();\r
1471     refresh();\r
1472   }\r
1473 \r
1474   /*\r
1475    * protected void covariationColour_actionPerformed() { getGroup().cs = new\r
1476    * CovariationColourScheme(sequence.getAnnotation()[0]); refresh(); }\r
1477    */\r
1478   /**\r
1479    * DOCUMENT ME!\r
1480    * \r
1481    * @param e\r
1482    *          DOCUMENT ME!\r
1483    */\r
1484   protected void abovePIDColour_actionPerformed()\r
1485   {\r
1486     SequenceGroup sg = getGroup();\r
1487     if (sg.cs == null)\r
1488     {\r
1489       return;\r
1490     }\r
1491 \r
1492     if (abovePIDColour.isSelected())\r
1493     {\r
1494       sg.cs.setConsensus(AAFrequency.calculate(\r
1495               sg.getSequences(ap.av.getHiddenRepSequences()),\r
1496               sg.getStartRes(), sg.getEndRes() + 1));\r
1497 \r
1498       int threshold = SliderPanel.setPIDSliderSource(ap, sg.cs, getGroup()\r
1499               .getName());\r
1500 \r
1501       sg.cs.setThreshold(threshold, ap.av.getIgnoreGapsConsensus());\r
1502 \r
1503       SliderPanel.showPIDSlider();\r
1504     }\r
1505     else\r
1506     // remove PIDColouring\r
1507     {\r
1508       sg.cs.setThreshold(0, ap.av.getIgnoreGapsConsensus());\r
1509     }\r
1510 \r
1511     refresh();\r
1512   }\r
1513 \r
1514   /**\r
1515    * DOCUMENT ME!\r
1516    * \r
1517    * @param e\r
1518    *          DOCUMENT ME!\r
1519    */\r
1520   protected void userDefinedColour_actionPerformed(ActionEvent e)\r
1521   {\r
1522     SequenceGroup sg = getGroup();\r
1523 \r
1524     if (e.getSource().equals(userDefinedColour))\r
1525     {\r
1526       new UserDefinedColours(ap, sg);\r
1527     }\r
1528     else\r
1529     {\r
1530       UserColourScheme udc = (UserColourScheme) UserDefinedColours\r
1531               .getUserColourSchemes().get(e.getActionCommand());\r
1532 \r
1533       sg.cs = udc;\r
1534     }\r
1535     refresh();\r
1536   }\r
1537 \r
1538   /**\r
1539    * DOCUMENT ME!\r
1540    * \r
1541    * @param e\r
1542    *          DOCUMENT ME!\r
1543    */\r
1544   protected void PIDColour_actionPerformed()\r
1545   {\r
1546     SequenceGroup sg = getGroup();\r
1547     sg.cs = new PIDColourScheme();\r
1548     sg.cs.setConsensus(AAFrequency.calculate(\r
1549             sg.getSequences(ap.av.getHiddenRepSequences()),\r
1550             sg.getStartRes(), sg.getEndRes() + 1));\r
1551     refresh();\r
1552   }\r
1553 \r
1554   /**\r
1555    * DOCUMENT ME!\r
1556    * \r
1557    * @param e\r
1558    *          DOCUMENT ME!\r
1559    */\r
1560   protected void BLOSUM62Colour_actionPerformed()\r
1561   {\r
1562     SequenceGroup sg = getGroup();\r
1563 \r
1564     sg.cs = new Blosum62ColourScheme();\r
1565 \r
1566     sg.cs.setConsensus(AAFrequency.calculate(\r
1567             sg.getSequences(ap.av.getHiddenRepSequences()),\r
1568             sg.getStartRes(), sg.getEndRes() + 1));\r
1569 \r
1570     refresh();\r
1571   }\r
1572 \r
1573   /**\r
1574    * DOCUMENT ME!\r
1575    * \r
1576    * @param e\r
1577    *          DOCUMENT ME!\r
1578    */\r
1579   protected void noColourmenuItem_actionPerformed()\r
1580   {\r
1581     getGroup().cs = null;\r
1582     refresh();\r
1583   }\r
1584 \r
1585   /**\r
1586    * DOCUMENT ME!\r
1587    * \r
1588    * @param e\r
1589    *          DOCUMENT ME!\r
1590    */\r
1591   protected void conservationMenuItem_actionPerformed()\r
1592   {\r
1593     SequenceGroup sg = getGroup();\r
1594     if (sg.cs == null)\r
1595     {\r
1596       return;\r
1597     }\r
1598 \r
1599     if (conservationMenuItem.isSelected())\r
1600     {\r
1601       Conservation c = new Conservation(MessageManager.getString("label.group"),\r
1602               ResidueProperties.propHash, 3, sg.getSequences(ap.av\r
1603                       .getHiddenRepSequences()), sg.getStartRes(),\r
1604               sg.getEndRes() + 1);\r
1605 \r
1606       c.calculate();\r
1607       c.verdict(false, ap.av.getConsPercGaps());\r
1608 \r
1609       sg.cs.setConservation(c);\r
1610 \r
1611       SliderPanel.setConservationSlider(ap, sg.cs, sg.getName());\r
1612       SliderPanel.showConservationSlider();\r
1613     }\r
1614     else\r
1615     // remove ConservationColouring\r
1616     {\r
1617       sg.cs.setConservation(null);\r
1618     }\r
1619 \r
1620     refresh();\r
1621   }\r
1622 \r
1623   public void annotationMenuItem_actionPerformed(ActionEvent actionEvent)\r
1624   {\r
1625     SequenceGroup sg = getGroup();\r
1626     if (sg == null)\r
1627     {\r
1628       return;\r
1629     }\r
1630 \r
1631     AnnotationColourGradient acg = new AnnotationColourGradient(\r
1632             sequence.getAnnotation()[0], null,\r
1633             AnnotationColourGradient.NO_THRESHOLD);\r
1634 \r
1635     acg.setPredefinedColours(true);\r
1636     sg.cs = acg;\r
1637 \r
1638     refresh();\r
1639   }\r
1640 \r
1641   /**\r
1642    * DOCUMENT ME!\r
1643    * \r
1644    * @param e\r
1645    *          DOCUMENT ME!\r
1646    */\r
1647   protected void groupName_actionPerformed()\r
1648   {\r
1649 \r
1650     SequenceGroup sg = getGroup();\r
1651     EditNameDialog dialog = new EditNameDialog(sg.getName(),\r
1652             sg.getDescription(), "       " + MessageManager.getString("label.group_name") + " ",\r
1653             MessageManager.getString("label.group_description") + " ", MessageManager.getString("label.edit_group_name_description"),\r
1654             ap.alignFrame);\r
1655 \r
1656     if (!dialog.accept)\r
1657     {\r
1658       return;\r
1659     }\r
1660 \r
1661     sg.setName(dialog.getName());\r
1662     sg.setDescription(dialog.getDescription());\r
1663     refresh();\r
1664   }\r
1665 \r
1666   /**\r
1667    * Get selection group - adding it to the alignment if necessary.\r
1668    * \r
1669    * @return sequence group to operate on\r
1670    */\r
1671   SequenceGroup getGroup()\r
1672   {\r
1673     SequenceGroup sg = ap.av.getSelectionGroup();\r
1674     // this method won't add a new group if it already exists\r
1675     if (sg != null)\r
1676     {\r
1677       ap.av.getAlignment().addGroup(sg);\r
1678     }\r
1679 \r
1680     return sg;\r
1681   }\r
1682 \r
1683   /**\r
1684    * DOCUMENT ME!\r
1685    * \r
1686    * @param e\r
1687    *          DOCUMENT ME!\r
1688    */\r
1689   void sequenceName_actionPerformed()\r
1690   {\r
1691     EditNameDialog dialog = new EditNameDialog(sequence.getName(),\r
1692             sequence.getDescription(), "       " + MessageManager.getString("label.sequence_name") + " ",\r
1693             MessageManager.getString("label.sequence_description") + " ", MessageManager.getString("label.edit_sequence_name_description"),\r
1694             ap.alignFrame);\r
1695 \r
1696     if (!dialog.accept)\r
1697     {\r
1698       return;\r
1699     }\r
1700 \r
1701     if (dialog.getName() != null)\r
1702     {\r
1703       if (dialog.getName().indexOf(" ") > -1)\r
1704       {\r
1705         JOptionPane.showMessageDialog(ap,\r
1706                 MessageManager.getString("label.spaces_converted_to_backslashes"),\r
1707                 MessageManager.getString("label.no_spaces_allowed_sequence_name"),\r
1708                 JOptionPane.WARNING_MESSAGE);\r
1709       }\r
1710 \r
1711       sequence.setName(dialog.getName().replace(' ', '_'));\r
1712       ap.paintAlignment(false);\r
1713     }\r
1714 \r
1715     sequence.setDescription(dialog.getDescription());\r
1716 \r
1717     ap.av.firePropertyChange("alignment", null, ap.av.getAlignment()\r
1718             .getSequences());\r
1719 \r
1720   }\r
1721 \r
1722   /**\r
1723    * DOCUMENT ME!\r
1724    * \r
1725    * @param e\r
1726    *          DOCUMENT ME!\r
1727    */\r
1728   void unGroupMenuItem_actionPerformed()\r
1729   {\r
1730     SequenceGroup sg = ap.av.getSelectionGroup();\r
1731     ap.av.getAlignment().deleteGroup(sg);\r
1732     ap.av.setSelectionGroup(null);\r
1733     refresh();\r
1734   }\r
1735   void createGroupMenuItem_actionPerformed()\r
1736   {\r
1737     getGroup(); // implicitly creates group - note - should apply defaults / use standard alignment window logic for this\r
1738     refresh();\r
1739   }\r
1740 \r
1741   /**\r
1742    * DOCUMENT ME!\r
1743    * \r
1744    * @param e\r
1745    *          DOCUMENT ME!\r
1746    */\r
1747   protected void outline_actionPerformed()\r
1748   {\r
1749     SequenceGroup sg = getGroup();\r
1750     Color col = JColorChooser.showDialog(this, MessageManager.getString("label.select_outline_colour"),\r
1751             Color.BLUE);\r
1752 \r
1753     if (col != null)\r
1754     {\r
1755       sg.setOutlineColour(col);\r
1756     }\r
1757 \r
1758     refresh();\r
1759   }\r
1760 \r
1761   /**\r
1762    * DOCUMENT ME!\r
1763    * \r
1764    * @param e\r
1765    *          DOCUMENT ME!\r
1766    */\r
1767   public void showBoxes_actionPerformed()\r
1768   {\r
1769     getGroup().setDisplayBoxes(showBoxes.isSelected());\r
1770     refresh();\r
1771   }\r
1772 \r
1773   /**\r
1774    * DOCUMENT ME!\r
1775    * \r
1776    * @param e\r
1777    *          DOCUMENT ME!\r
1778    */\r
1779   public void showText_actionPerformed()\r
1780   {\r
1781     getGroup().setDisplayText(showText.isSelected());\r
1782     refresh();\r
1783   }\r
1784 \r
1785   /**\r
1786    * DOCUMENT ME!\r
1787    * \r
1788    * @param e\r
1789    *          DOCUMENT ME!\r
1790    */\r
1791   public void showColourText_actionPerformed()\r
1792   {\r
1793     getGroup().setColourText(showColourText.isSelected());\r
1794     refresh();\r
1795   }\r
1796 \r
1797   public void showLink(String url)\r
1798   {\r
1799     try\r
1800     {\r
1801       jalview.util.BrowserLauncher.openURL(url);\r
1802     } catch (Exception ex)\r
1803     {\r
1804       JOptionPane\r
1805               .showInternalMessageDialog(\r
1806                       Desktop.desktop,\r
1807                       MessageManager.getString("label.web_browser_not_found_unix"),\r
1808                       MessageManager.getString("label.web_browser_not_found"), JOptionPane.WARNING_MESSAGE);\r
1809 \r
1810       ex.printStackTrace();\r
1811     }\r
1812   }\r
1813 \r
1814   void hideSequences(boolean representGroup)\r
1815   {\r
1816     SequenceGroup sg = ap.av.getSelectionGroup();\r
1817     if (sg == null || sg.getSize() < 1)\r
1818     {\r
1819       ap.av.hideSequence(new SequenceI[]\r
1820       { sequence });\r
1821       return;\r
1822     }\r
1823 \r
1824     ap.av.setSelectionGroup(null);\r
1825 \r
1826     if (representGroup)\r
1827     {\r
1828       ap.av.hideRepSequences(sequence, sg);\r
1829 \r
1830       return;\r
1831     }\r
1832 \r
1833     int gsize = sg.getSize();\r
1834     SequenceI[] hseqs;\r
1835 \r
1836     hseqs = new SequenceI[gsize];\r
1837 \r
1838     int index = 0;\r
1839     for (int i = 0; i < gsize; i++)\r
1840     {\r
1841       hseqs[index++] = sg.getSequenceAt(i);\r
1842     }\r
1843 \r
1844     ap.av.hideSequence(hseqs);\r
1845     // refresh(); TODO: ? needed ?\r
1846     ap.av.sendSelection();\r
1847   }\r
1848 \r
1849   public void copy_actionPerformed()\r
1850   {\r
1851     ap.alignFrame.copy_actionPerformed(null);\r
1852   }\r
1853 \r
1854   public void cut_actionPerformed()\r
1855   {\r
1856     ap.alignFrame.cut_actionPerformed(null);\r
1857   }\r
1858 \r
1859   void changeCase(ActionEvent e)\r
1860   {\r
1861     Object source = e.getSource();\r
1862     SequenceGroup sg = ap.av.getSelectionGroup();\r
1863 \r
1864     if (sg != null)\r
1865     {\r
1866       int[][] startEnd = ap.av.getVisibleRegionBoundaries(sg.getStartRes(),\r
1867               sg.getEndRes() + 1);\r
1868 \r
1869       String description;\r
1870       int caseChange;\r
1871 \r
1872       if (source == toggle)\r
1873       {\r
1874         description = MessageManager.getString("label.toggle_case");\r
1875         caseChange = ChangeCaseCommand.TOGGLE_CASE;\r
1876       }\r
1877       else if (source == upperCase)\r
1878       {\r
1879         description = MessageManager.getString("label.to_upper_case");\r
1880         caseChange = ChangeCaseCommand.TO_UPPER;\r
1881       }\r
1882       else\r
1883       {\r
1884         description = MessageManager.getString("label.to_lower_case");\r
1885         caseChange = ChangeCaseCommand.TO_LOWER;\r
1886       }\r
1887 \r
1888       ChangeCaseCommand caseCommand = new ChangeCaseCommand(description,\r
1889               sg.getSequencesAsArray(ap.av.getHiddenRepSequences()),\r
1890               startEnd, caseChange);\r
1891 \r
1892       ap.alignFrame.addHistoryItem(caseCommand);\r
1893 \r
1894       ap.av.firePropertyChange("alignment", null, ap.av.getAlignment()\r
1895               .getSequences());\r
1896 \r
1897     }\r
1898   }\r
1899 \r
1900   public void outputText_actionPerformed(ActionEvent e)\r
1901   {\r
1902     CutAndPasteTransfer cap = new CutAndPasteTransfer();\r
1903     cap.setForInput(null);\r
1904     Desktop.addInternalFrame(cap,\r
1905             MessageManager.formatMessage("label.alignment_output_command", new String[]{e.getActionCommand()}), 600, 500);\r
1906 \r
1907     String[] omitHidden = null;\r
1908 \r
1909     System.out.println("PROMPT USER HERE"); // TODO: decide if a prompt happens\r
1910     // or we simply trust the user wants\r
1911     // wysiwig behaviour\r
1912     SequenceGroup sg = ap.av.getSelectionGroup();\r
1913     ColumnSelection csel = new ColumnSelection(ap.av.getColumnSelection());\r
1914     omitHidden = ap.av.getViewAsString(true);\r
1915     Alignment oal = new Alignment(ap.av.getSequenceSelection());\r
1916     AlignmentAnnotation[] nala = ap.av.getAlignment()\r
1917             .getAlignmentAnnotation();\r
1918     if (nala != null)\r
1919     {\r
1920       for (int i = 0; i < nala.length; i++)\r
1921       {\r
1922         AlignmentAnnotation na = nala[i];\r
1923         oal.addAnnotation(na);\r
1924       }\r
1925     }\r
1926     cap.setText(new FormatAdapter().formatSequences(e.getActionCommand(),\r
1927             oal, omitHidden, csel, sg));\r
1928     oal = null;\r
1929   }\r
1930 \r
1931   public void pdbFromFile_actionPerformed()\r
1932   {\r
1933     jalview.io.JalviewFileChooser chooser = new jalview.io.JalviewFileChooser(\r
1934             jalview.bin.Cache.getProperty("LAST_DIRECTORY"));\r
1935     chooser.setFileView(new jalview.io.JalviewFileView());\r
1936     chooser.setDialogTitle(MessageManager.formatMessage("label.select_pdb_file_for", new String[]{sequence.getDisplayId(false)}));\r
1937     chooser.setToolTipText(MessageManager.formatMessage("label.load_pdb_file_associate_with_sequence", new String[]{new Integer(sequence.getDisplayId(false)).toString()}));\r
1938 \r
1939     int value = chooser.showOpenDialog(null);\r
1940 \r
1941     if (value == jalview.io.JalviewFileChooser.APPROVE_OPTION)\r
1942     {\r
1943       String choice = chooser.getSelectedFile().getPath();\r
1944       jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);\r
1945       new AssociatePdbFileWithSeq().associatePdbWithSeq(choice,\r
1946               jalview.io.AppletFormatAdapter.FILE, sequence, true);\r
1947     }\r
1948 \r
1949   }\r
1950 \r
1951   public void enterPDB_actionPerformed()\r
1952   {\r
1953     String id = JOptionPane.showInternalInputDialog(Desktop.desktop,\r
1954             MessageManager.getString("label.enter_pdb_id"), MessageManager.getString("label.enter_pdb_id"), JOptionPane.QUESTION_MESSAGE);\r
1955 \r
1956     if (id != null && id.length() > 0)\r
1957     {\r
1958       PDBEntry entry = new PDBEntry();\r
1959       entry.setId(id.toUpperCase());\r
1960       sequence.getDatasetSequence().addPDBId(entry);\r
1961     }\r
1962   }\r
1963 \r
1964   public void discoverPDB_actionPerformed()\r
1965   {\r
1966 \r
1967     final SequenceI[] sequences = ((ap.av.getSelectionGroup() == null) ? new SequenceI[]\r
1968     { sequence }\r
1969             : ap.av.getSequenceSelection());\r
1970     Thread discpdb = new Thread(new Runnable()\r
1971     {\r
1972       public void run()\r
1973       {\r
1974 \r
1975         new jalview.ws.DBRefFetcher(sequences, ap.alignFrame)\r
1976                 .fetchDBRefs(false);\r
1977       }\r
1978 \r
1979     });\r
1980     discpdb.start();\r
1981   }\r
1982 \r
1983   public void sequenceFeature_actionPerformed()\r
1984   {\r
1985     SequenceGroup sg = ap.av.getSelectionGroup();\r
1986     if (sg == null)\r
1987     {\r
1988       return;\r
1989     }\r
1990 \r
1991     int rsize = 0, gSize = sg.getSize();\r
1992     SequenceI[] rseqs, seqs = new SequenceI[gSize];\r
1993     SequenceFeature[] tfeatures, features = new SequenceFeature[gSize];\r
1994 \r
1995     for (int i = 0; i < gSize; i++)\r
1996     {\r
1997       int start = sg.getSequenceAt(i).findPosition(sg.getStartRes());\r
1998       int end = sg.findEndRes(sg.getSequenceAt(i));\r
1999       if (start <= end)\r
2000       {\r
2001         seqs[rsize] = sg.getSequenceAt(i).getDatasetSequence();\r
2002         features[rsize] = new SequenceFeature(null, null, null, start, end,\r
2003                 "Jalview");\r
2004         rsize++;\r
2005       }\r
2006     }\r
2007     rseqs = new SequenceI[rsize];\r
2008     tfeatures = new SequenceFeature[rsize];\r
2009     System.arraycopy(seqs, 0, rseqs, 0, rsize);\r
2010     System.arraycopy(features, 0, tfeatures, 0, rsize);\r
2011     features = tfeatures;\r
2012     seqs = rseqs;\r
2013     if (ap.seqPanel.seqCanvas.getFeatureRenderer().amendFeatures(seqs,\r
2014             features, true, ap))\r
2015     {\r
2016       ap.alignFrame.setShowSeqFeatures(true);\r
2017       ap.highlightSearchResults(null);\r
2018     }\r
2019   }\r
2020 \r
2021   public void textColour_actionPerformed()\r
2022   {\r
2023     SequenceGroup sg = getGroup();\r
2024     if (sg != null)\r
2025     {\r
2026       new TextColourChooser().chooseColour(ap, sg);\r
2027     }\r
2028   }\r
2029 \r
2030   public void colourByStructure(String pdbid)\r
2031   {\r
2032     Annotation[] anots = ap.av.getStructureSelectionManager()\r
2033             .colourSequenceFromStructure(sequence, pdbid);\r
2034 \r
2035     AlignmentAnnotation an = new AlignmentAnnotation("Structure",\r
2036             "Coloured by " + pdbid, anots);\r
2037 \r
2038     ap.av.getAlignment().addAnnotation(an);\r
2039     an.createSequenceMapping(sequence, 0, true);\r
2040     // an.adjustForAlignment();\r
2041     ap.av.getAlignment().setAnnotationIndex(an, 0);\r
2042 \r
2043     ap.adjustAnnotationHeight();\r
2044 \r
2045     sequence.addAlignmentAnnotation(an);\r
2046 \r
2047   }\r
2048 \r
2049   public void editSequence_actionPerformed(ActionEvent actionEvent)\r
2050   {\r
2051     SequenceGroup sg = ap.av.getSelectionGroup();\r
2052 \r
2053     if (sg != null)\r
2054     {\r
2055       if (sequence == null)\r
2056         sequence = (Sequence) sg.getSequenceAt(0);\r
2057 \r
2058       EditNameDialog dialog = new EditNameDialog(\r
2059               sequence.getSequenceAsString(sg.getStartRes(),\r
2060                       sg.getEndRes() + 1), null, MessageManager.getString("label.edit_sequence"), null,\r
2061                       MessageManager.getString("label.edit_sequence"), ap.alignFrame);\r
2062 \r
2063       if (dialog.accept)\r
2064       {\r
2065         EditCommand editCommand = new EditCommand(MessageManager.getString("label.edit_sequences"),\r
2066                 EditCommand.REPLACE, dialog.getName().replace(' ',\r
2067                         ap.av.getGapCharacter()),\r
2068                 sg.getSequencesAsArray(ap.av.getHiddenRepSequences()),\r
2069                 sg.getStartRes(), sg.getEndRes() + 1, ap.av.getAlignment());\r
2070 \r
2071         ap.alignFrame.addHistoryItem(editCommand);\r
2072 \r
2073         ap.av.firePropertyChange("alignment", null, ap.av.getAlignment()\r
2074                 .getSequences());\r
2075       }\r
2076     }\r
2077   }\r
2078 \r
2079 }\r