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