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