header updated
[jalview.git] / src / jalview / gui / PopupMenu.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer\r
3  * Copyright (C) 2006 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.WRITEABLE_FORMATS.length; i++)\r
119         {\r
120           JMenuItem item = new JMenuItem( jalview.io.FormatAdapter.WRITEABLE_FORMATS[i] );\r
121 \r
122           item.addActionListener(new java.awt.event.ActionListener()\r
123           {\r
124             public void actionPerformed(ActionEvent e)\r
125             {\r
126               outputText_actionPerformed(e);\r
127             }\r
128           });\r
129 \r
130           outputMenu.add(item);\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                   if (ap.overviewPanel != null)\r
210                     ap.overviewPanel.updateOverviewImage();\r
211                 }\r
212               });\r
213               add(menuItem);\r
214             }\r
215 \r
216             menuItem = new JMenuItem("Reveal All");\r
217             menuItem.addActionListener(new ActionListener()\r
218                 {\r
219                   public void actionPerformed(ActionEvent e)\r
220                   {\r
221                     ap.av.showAllHiddenSeqs();\r
222                     if (ap.overviewPanel != null)\r
223                       ap.overviewPanel.updateOverviewImage();\r
224                     }\r
225                 });\r
226 \r
227             add(menuItem);\r
228           }\r
229 \r
230 \r
231         }\r
232 \r
233 \r
234 \r
235         SequenceGroup sg = ap.av.getSelectionGroup();\r
236 \r
237         if (sg != null)\r
238         {\r
239             groupName.setText(sg.getName());\r
240 \r
241             if (sg.cs instanceof ZappoColourScheme)\r
242             {\r
243                 zappoColour.setSelected(true);\r
244             }\r
245             else if (sg.cs instanceof TaylorColourScheme)\r
246             {\r
247                 taylorColour.setSelected(true);\r
248             }\r
249             else if (sg.cs instanceof PIDColourScheme)\r
250             {\r
251                 PIDColour.setSelected(true);\r
252             }\r
253             else if (sg.cs instanceof Blosum62ColourScheme)\r
254             {\r
255                 BLOSUM62Colour.setSelected(true);\r
256             }\r
257             else if (sg.cs instanceof UserColourScheme)\r
258             {\r
259                 userDefinedColour.setSelected(true);\r
260             }\r
261             else if (sg.cs instanceof HydrophobicColourScheme)\r
262             {\r
263                 hydrophobicityColour.setSelected(true);\r
264             }\r
265             else if (sg.cs instanceof HelixColourScheme)\r
266             {\r
267                 helixColour.setSelected(true);\r
268             }\r
269             else if (sg.cs instanceof StrandColourScheme)\r
270             {\r
271                 strandColour.setSelected(true);\r
272             }\r
273             else if (sg.cs instanceof TurnColourScheme)\r
274             {\r
275                 turnColour.setSelected(true);\r
276             }\r
277             else if (sg.cs instanceof BuriedColourScheme)\r
278             {\r
279                 buriedColour.setSelected(true);\r
280             }\r
281             else if (sg.cs instanceof ClustalxColourScheme)\r
282             {\r
283                 clustalColour.setSelected(true);\r
284             }\r
285             else\r
286             {\r
287                 noColourmenuItem.setSelected(true);\r
288             }\r
289 \r
290             if (sg.cs!=null && sg.cs.conservationApplied())\r
291             {\r
292                 conservationMenuItem.setSelected(true);\r
293             }\r
294 \r
295             showText.setSelected(sg.getDisplayText());\r
296             showColourText.setSelected(sg.getColourText());\r
297             showBoxes.setSelected(sg.getDisplayBoxes());\r
298         }\r
299         else\r
300         {\r
301           groupMenu.setVisible(false);\r
302           editMenu.setVisible(false);\r
303         }\r
304 \r
305         if (!ap.av.alignment.getGroups().contains(sg))\r
306         {\r
307             unGroupMenuItem.setVisible(false);\r
308         }\r
309 \r
310 \r
311         if (seq == null)\r
312         {\r
313             sequenceMenu.setVisible(false);\r
314             pdbMenu.setVisible(false);\r
315         }\r
316 \r
317         if(links != null && links.size()>0)\r
318         {\r
319           JMenu linkMenu = new JMenu("Link");\r
320           JMenuItem item;\r
321           for(int i=0; i<links.size(); i++)\r
322           {\r
323             String link = links.elementAt(i).toString();\r
324             final String label = link.substring(0, link.indexOf("|"));\r
325             item = new JMenuItem(label);\r
326             final String url;\r
327 \r
328             if (link.indexOf("$SEQUENCE_ID$") > -1)\r
329             {\r
330               String id = seq.getName();\r
331               if (id.indexOf("|") > -1)\r
332                 id = id.substring(id.lastIndexOf("|") + 1);\r
333 \r
334               url = link.substring(link.indexOf("|") + 1,\r
335                                    link.indexOf("$SEQUENCE_ID$"))\r
336                   + id +\r
337                   link.substring(link.indexOf("$SEQUENCE_ID$") + 13);\r
338             }\r
339             else\r
340               url = link.substring(link.lastIndexOf("|")+1);\r
341 \r
342 \r
343             item.addActionListener(new java.awt.event.ActionListener()\r
344             {\r
345                 public void actionPerformed(ActionEvent e)\r
346                 {\r
347                     showLink(url);\r
348                 }\r
349             });\r
350 \r
351             linkMenu.add(item);\r
352           }\r
353           if(sequence!=null)\r
354             sequenceMenu.add(linkMenu);\r
355           else\r
356             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     }\r
1150 \r
1151   public void copy_actionPerformed(ActionEvent e)\r
1152   {\r
1153     ap.alignFrame.copy_actionPerformed(null);\r
1154   }\r
1155 \r
1156   public void cut_actionPerformed(ActionEvent e)\r
1157   {\r
1158     ap.alignFrame.cut_actionPerformed(null);\r
1159   }\r
1160 \r
1161   public void upperCase_actionPerformed(ActionEvent e)\r
1162   {\r
1163     SequenceGroup sg = ap.av.getSelectionGroup();\r
1164     if(sg==null)\r
1165       return;\r
1166 \r
1167     for(int g=0; g<sg.getSize(true); g++)\r
1168     {\r
1169     ( (SequenceI)sg.getSequences(true).elementAt(g))\r
1170         .changeCase(true, sg.getStartRes(), sg.getEndRes()+1);\r
1171     }\r
1172     ap.repaint();\r
1173   }\r
1174 \r
1175   public void lowerCase_actionPerformed(ActionEvent e)\r
1176   {\r
1177     SequenceGroup sg = ap.av.getSelectionGroup();\r
1178     if(sg==null)\r
1179       return;\r
1180 \r
1181     for(int g=0; g<sg.getSize(true); g++)\r
1182     {\r
1183        ( (SequenceI)sg.getSequences(true).elementAt(g))\r
1184            .changeCase(false, sg.getStartRes(), sg.getEndRes()+1);\r
1185     }\r
1186     ap.repaint();\r
1187   }\r
1188 \r
1189   public void toggle_actionPerformed(ActionEvent e)\r
1190   {\r
1191     SequenceGroup sg = ap.av.getSelectionGroup();\r
1192     if (sg == null)\r
1193       return;\r
1194 \r
1195     for (int g = 0; g < sg.getSize(true); g++)\r
1196     {\r
1197       ( (SequenceI)sg.getSequences(true).elementAt(g))\r
1198           .toggleCase(sg.getStartRes(), sg.getEndRes() + 1);\r
1199     }\r
1200 \r
1201     ap.repaint();\r
1202   }\r
1203 \r
1204   public void outputText_actionPerformed(ActionEvent e)\r
1205   {\r
1206     CutAndPasteTransfer cap = new CutAndPasteTransfer();\r
1207     Desktop.addInternalFrame(cap,\r
1208                              "Alignment output - " + e.getActionCommand(), 600,\r
1209                              500);\r
1210 \r
1211     String [] omitHidden = null;\r
1212 \r
1213     if(ap.av.hasHiddenColumns)\r
1214     {\r
1215       System.out.println("PROMPT USER HERE");\r
1216       omitHidden = ap.av.getViewAsString(true);\r
1217     }\r
1218 \r
1219     cap.setText(new FormatAdapter().formatSequences(\r
1220         e.getActionCommand(),\r
1221         ap.av.getSelectionAsNewSequence(),\r
1222         omitHidden));\r
1223   }\r
1224 \r
1225 \r
1226   public void pdbFromFile_actionPerformed(ActionEvent e)\r
1227   {\r
1228      jalview.io.JalviewFileChooser chooser\r
1229          = new jalview.io.JalviewFileChooser(jalview.bin.Cache.\r
1230          getProperty(\r
1231              "LAST_DIRECTORY"));\r
1232      chooser.setFileView(new jalview.io.JalviewFileView());\r
1233      chooser.setDialogTitle("Select a PDB file");\r
1234      chooser.setToolTipText("Load a PDB file");\r
1235 \r
1236      int value = chooser.showOpenDialog(null);\r
1237 \r
1238      if (value == jalview.io.JalviewFileChooser.APPROVE_OPTION)\r
1239      {\r
1240        PDBEntry entry = new PDBEntry();\r
1241        String choice = chooser.getSelectedFile().getPath();\r
1242        jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);\r
1243        try\r
1244        {\r
1245          MCview.PDBfile pdbfile = new MCview.PDBfile(choice,\r
1246                                        jalview.io.AppletFormatAdapter.FILE);\r
1247 \r
1248          if (pdbfile.id == null)\r
1249          {\r
1250            String reply = JOptionPane.showInternalInputDialog(\r
1251                Desktop.desktop,\r
1252                "Couldn't find a PDB id in the file supplied."\r
1253                + "Please enter an Id to identify this structure.",\r
1254                "No PDB Id in File", JOptionPane.QUESTION_MESSAGE);\r
1255            if (reply == null)\r
1256              return;\r
1257 \r
1258            entry.setId(reply);\r
1259          }\r
1260          else\r
1261            entry.setId(pdbfile.id);\r
1262        }\r
1263        catch (java.io.IOException ex)\r
1264        {\r
1265          ex.printStackTrace();\r
1266        }\r
1267 \r
1268        entry.setFile(choice);\r
1269        sequence.getDatasetSequence().addPDBId(entry);\r
1270      }\r
1271 \r
1272   }\r
1273 \r
1274   public void enterPDB_actionPerformed(ActionEvent e)\r
1275   {\r
1276     String id = JOptionPane.showInternalInputDialog(Desktop.desktop,\r
1277         "Enter PDB Id", "Enter PDB Id", JOptionPane.QUESTION_MESSAGE);\r
1278 \r
1279     if (id != null && id.length() > 0)\r
1280     {\r
1281       PDBEntry entry = new PDBEntry();\r
1282       entry.setId(id);\r
1283       sequence.getDatasetSequence()\r
1284           .addPDBId(entry);\r
1285     }\r
1286   }\r
1287 \r
1288   public void discoverPDB_actionPerformed(ActionEvent e)\r
1289   {\r
1290     new jalview.io.DBRefFetcher(\r
1291              ap.av.getAlignment(), ap.alignFrame).fetchDBRefs(false);\r
1292   }\r
1293 }\r