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