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