set description for groups
[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 import jalview.datamodel.*;\r
25 import jalview.schemes.*;\r
26 import jalview.commands.ChangeCaseCommand;\r
27 \r
28 import java.awt.*;\r
29 import java.awt.event.*;\r
30 \r
31 import javax.swing.*;\r
32 \r
33 import java.util.Vector;\r
34 import jalview.io.FormatAdapter;\r
35 \r
36 \r
37 /**\r
38  * DOCUMENT ME!\r
39  *\r
40  * @author $author$\r
41  * @version $Revision$\r
42  */\r
43 public class PopupMenu extends JPopupMenu\r
44 {\r
45     JMenu groupMenu = new JMenu();\r
46     JMenuItem groupName = new JMenuItem();\r
47     protected JRadioButtonMenuItem clustalColour = new JRadioButtonMenuItem();\r
48     protected JRadioButtonMenuItem zappoColour = new JRadioButtonMenuItem();\r
49     protected JRadioButtonMenuItem taylorColour = new JRadioButtonMenuItem();\r
50     protected JRadioButtonMenuItem hydrophobicityColour = new JRadioButtonMenuItem();\r
51     protected JRadioButtonMenuItem helixColour = new JRadioButtonMenuItem();\r
52     protected JRadioButtonMenuItem strandColour = new JRadioButtonMenuItem();\r
53     protected JRadioButtonMenuItem turnColour = new JRadioButtonMenuItem();\r
54     protected JRadioButtonMenuItem buriedColour = new JRadioButtonMenuItem();\r
55     protected JCheckBoxMenuItem abovePIDColour = new JCheckBoxMenuItem();\r
56     protected JRadioButtonMenuItem userDefinedColour = new JRadioButtonMenuItem();\r
57     protected JRadioButtonMenuItem PIDColour = new JRadioButtonMenuItem();\r
58     protected JRadioButtonMenuItem BLOSUM62Colour = new JRadioButtonMenuItem();\r
59     JRadioButtonMenuItem noColourmenuItem = new JRadioButtonMenuItem();\r
60     protected JCheckBoxMenuItem conservationMenuItem = new JCheckBoxMenuItem();\r
61     AlignmentPanel ap;\r
62     JMenu sequenceMenu = new JMenu();\r
63     JMenuItem sequenceName = new JMenuItem();\r
64     Sequence sequence;\r
65     JMenuItem unGroupMenuItem = new JMenuItem();\r
66     JMenuItem outline = new JMenuItem();\r
67     JRadioButtonMenuItem nucleotideMenuItem = new JRadioButtonMenuItem();\r
68     JMenu colourMenu = new JMenu();\r
69     JCheckBoxMenuItem showBoxes = new JCheckBoxMenuItem();\r
70     JCheckBoxMenuItem showText = new JCheckBoxMenuItem();\r
71     JCheckBoxMenuItem showColourText = new JCheckBoxMenuItem();\r
72   JMenu editMenu = new JMenu();\r
73   JMenuItem cut = new JMenuItem();\r
74   JMenuItem copy = new JMenuItem();\r
75   JMenuItem upperCase = new JMenuItem();\r
76   JMenuItem lowerCase = new JMenuItem();\r
77   JMenuItem toggle = new JMenuItem();\r
78   JMenu pdbMenu = new JMenu();\r
79   JMenuItem pdbFromFile = new JMenuItem();\r
80   JMenuItem enterPDB = new JMenuItem();\r
81   JMenuItem discoverPDB = new JMenuItem();\r
82   JMenu outputMenu = new JMenu();\r
83   JMenuItem sequenceFeature = new JMenuItem();\r
84   JMenuItem textColour = new JMenuItem();\r
85   JMenu jMenu1 = new JMenu();\r
86 \r
87   /**\r
88      * Creates a new PopupMenu object.\r
89      *\r
90      * @param ap DOCUMENT ME!\r
91      * @param seq DOCUMENT ME!\r
92      */\r
93     public PopupMenu(final AlignmentPanel ap, Sequence seq, Vector links)\r
94     {\r
95         ///////////////////////////////////////////////////////////\r
96         // If this is activated from the sequence panel, the user may want to\r
97         // edit or annotate a particular residue. Therefore display the residue menu\r
98         //\r
99         // If from the IDPanel, we must display the sequence menu\r
100         //////////////////////////////////////////////////////////\r
101         this.ap = ap;\r
102         sequence = seq;\r
103 \r
104         ButtonGroup colours = new ButtonGroup();\r
105         colours.add(noColourmenuItem);\r
106         colours.add(clustalColour);\r
107         colours.add(zappoColour);\r
108         colours.add(taylorColour);\r
109         colours.add(hydrophobicityColour);\r
110         colours.add(helixColour);\r
111         colours.add(strandColour);\r
112         colours.add(turnColour);\r
113         colours.add(buriedColour);\r
114         colours.add(abovePIDColour);\r
115         colours.add(userDefinedColour);\r
116         colours.add(PIDColour);\r
117         colours.add(BLOSUM62Colour);\r
118 \r
119         for (int i = 0; i < jalview.io.FormatAdapter.WRITEABLE_FORMATS.length; i++)\r
120         {\r
121           JMenuItem item = new JMenuItem( jalview.io.FormatAdapter.WRITEABLE_FORMATS[i] );\r
122 \r
123           item.addActionListener(new java.awt.event.ActionListener()\r
124           {\r
125             public void actionPerformed(ActionEvent e)\r
126             {\r
127               outputText_actionPerformed(e);\r
128             }\r
129           });\r
130 \r
131           outputMenu.add(item);\r
132         }\r
133 \r
134 \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           sequenceMenu.setText(sequence.getName());\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()>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();\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();\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();\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();\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();\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();\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();\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();\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();\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         changeCase(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();\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         changeCase(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         changeCase(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();\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();\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();\r
504       }\r
505     });\r
506     outputMenu.setText("Output to Textbox...");\r
507     sequenceFeature.setText("Create Sequence Feature");\r
508     sequenceFeature.addActionListener(new ActionListener()\r
509     {\r
510       public void actionPerformed(ActionEvent e)\r
511       {\r
512         sequenceFeature_actionPerformed();\r
513       }\r
514     });\r
515     textColour.setText("Text Colour");\r
516     textColour.addActionListener(new ActionListener()\r
517     {\r
518       public void actionPerformed(ActionEvent e)\r
519       {\r
520         textColour_actionPerformed();\r
521       }\r
522     });\r
523     jMenu1.setText("Group");\r
524     add(groupMenu);\r
525 \r
526     add(sequenceMenu);\r
527     groupMenu.add(editMenu);\r
528     groupMenu.add(outputMenu);\r
529     groupMenu.add(sequenceFeature);\r
530     groupMenu.add(jMenu1);\r
531     sequenceMenu.add(sequenceName);\r
532     sequenceMenu.add(pdbMenu);\r
533     colourMenu.add(textColour);\r
534     colourMenu.add(noColourmenuItem);\r
535         colourMenu.add(clustalColour);\r
536         colourMenu.add(BLOSUM62Colour);\r
537         colourMenu.add(PIDColour);\r
538         colourMenu.add(zappoColour);\r
539         colourMenu.add(taylorColour);\r
540         colourMenu.add(hydrophobicityColour);\r
541         colourMenu.add(helixColour);\r
542         colourMenu.add(strandColour);\r
543         colourMenu.add(turnColour);\r
544         colourMenu.add(buriedColour);\r
545         colourMenu.add(nucleotideMenuItem);\r
546         colourMenu.add(userDefinedColour);\r
547 \r
548         if(jalview.gui.UserDefinedColours.getUserColourSchemes()!=null)\r
549         {\r
550           java.util.Enumeration userColours = jalview.gui.UserDefinedColours.\r
551               getUserColourSchemes().keys();\r
552 \r
553           while (userColours.hasMoreElements())\r
554           {\r
555             JMenuItem item = new JMenuItem(userColours.\r
556                 nextElement().toString());\r
557             item.addActionListener(new ActionListener()\r
558             {\r
559               public void actionPerformed(ActionEvent evt)\r
560               {\r
561                 userDefinedColour_actionPerformed(evt);\r
562               }\r
563             });\r
564             colourMenu.add(item);\r
565           }\r
566         }\r
567 \r
568 \r
569         colourMenu.addSeparator();\r
570         colourMenu.add(abovePIDColour);\r
571         colourMenu.add(conservationMenuItem);\r
572     editMenu.add(copy);\r
573     editMenu.add(cut);\r
574     editMenu.add(upperCase);\r
575     editMenu.add(lowerCase);\r
576     editMenu.add(toggle);\r
577     pdbMenu.add(pdbFromFile);\r
578     pdbMenu.add(enterPDB);\r
579     pdbMenu.add(discoverPDB);\r
580     jMenu1.add(groupName);\r
581     jMenu1.add(unGroupMenuItem);\r
582     jMenu1.add(colourMenu);\r
583     jMenu1.add(showBoxes);\r
584     jMenu1.add(showText);\r
585     jMenu1.add(showColourText);\r
586     jMenu1.add(outline);\r
587     noColourmenuItem.setText("None");\r
588         noColourmenuItem.addActionListener(new java.awt.event.ActionListener()\r
589             {\r
590                 public void actionPerformed(ActionEvent e)\r
591                 {\r
592                     noColourmenuItem_actionPerformed();\r
593                 }\r
594             });\r
595 \r
596         clustalColour.setText("Clustalx colours");\r
597         clustalColour.addActionListener(new java.awt.event.ActionListener()\r
598             {\r
599                 public void actionPerformed(ActionEvent e)\r
600                 {\r
601                     clustalColour_actionPerformed();\r
602                 }\r
603             });\r
604         zappoColour.setText("Zappo");\r
605         zappoColour.addActionListener(new java.awt.event.ActionListener()\r
606             {\r
607                 public void actionPerformed(ActionEvent e)\r
608                 {\r
609                     zappoColour_actionPerformed();\r
610                 }\r
611             });\r
612         taylorColour.setText("Taylor");\r
613         taylorColour.addActionListener(new java.awt.event.ActionListener()\r
614             {\r
615                 public void actionPerformed(ActionEvent e)\r
616                 {\r
617                     taylorColour_actionPerformed();\r
618                 }\r
619             });\r
620         hydrophobicityColour.setText("Hydrophobicity");\r
621         hydrophobicityColour.addActionListener(new java.awt.event.ActionListener()\r
622             {\r
623                 public void actionPerformed(ActionEvent e)\r
624                 {\r
625                     hydrophobicityColour_actionPerformed();\r
626                 }\r
627             });\r
628         helixColour.setText("Helix propensity");\r
629         helixColour.addActionListener(new java.awt.event.ActionListener()\r
630             {\r
631                 public void actionPerformed(ActionEvent e)\r
632                 {\r
633                     helixColour_actionPerformed();\r
634                 }\r
635             });\r
636         strandColour.setText("Strand propensity");\r
637         strandColour.addActionListener(new java.awt.event.ActionListener()\r
638             {\r
639                 public void actionPerformed(ActionEvent e)\r
640                 {\r
641                     strandColour_actionPerformed();\r
642                 }\r
643             });\r
644         turnColour.setText("Turn propensity");\r
645         turnColour.addActionListener(new java.awt.event.ActionListener()\r
646             {\r
647                 public void actionPerformed(ActionEvent e)\r
648                 {\r
649                     turnColour_actionPerformed();\r
650                 }\r
651             });\r
652         buriedColour.setText("Buried Index");\r
653         buriedColour.addActionListener(new java.awt.event.ActionListener()\r
654             {\r
655                 public void actionPerformed(ActionEvent e)\r
656                 {\r
657                     buriedColour_actionPerformed();\r
658                 }\r
659             });\r
660         abovePIDColour.setText("Above % Identity");\r
661         abovePIDColour.addActionListener(new java.awt.event.ActionListener()\r
662             {\r
663                 public void actionPerformed(ActionEvent e)\r
664                 {\r
665                     abovePIDColour_actionPerformed();\r
666                 }\r
667             });\r
668         userDefinedColour.setText("User Defined...");\r
669         userDefinedColour.addActionListener(new java.awt.event.ActionListener()\r
670             {\r
671                 public void actionPerformed(ActionEvent e)\r
672                 {\r
673                     userDefinedColour_actionPerformed(e);\r
674                 }\r
675             });\r
676         PIDColour.setText("Percentage Identity");\r
677         PIDColour.addActionListener(new java.awt.event.ActionListener()\r
678             {\r
679                 public void actionPerformed(ActionEvent e)\r
680                 {\r
681                     PIDColour_actionPerformed();\r
682                 }\r
683             });\r
684         BLOSUM62Colour.setText("BLOSUM62");\r
685         BLOSUM62Colour.addActionListener(new java.awt.event.ActionListener()\r
686             {\r
687                 public void actionPerformed(ActionEvent e)\r
688                 {\r
689                     BLOSUM62Colour_actionPerformed();\r
690                 }\r
691             });\r
692         conservationMenuItem.setText("Conservation");\r
693         conservationMenuItem.addActionListener(new java.awt.event.ActionListener()\r
694             {\r
695                 public void actionPerformed(ActionEvent e)\r
696                 {\r
697                     conservationMenuItem_actionPerformed();\r
698                 }\r
699             });\r
700     }\r
701 \r
702     /**\r
703      * DOCUMENT ME!\r
704      */\r
705     void refresh()\r
706     {\r
707         if (ap.overviewPanel != null)\r
708           ap.overviewPanel.updateOverviewImage();\r
709 \r
710         PaintRefresher.Refresh(this, ap.av.getSequenceSetId());\r
711     }\r
712 \r
713     /**\r
714      * DOCUMENT ME!\r
715      *\r
716      * @param e DOCUMENT ME!\r
717      */\r
718     protected void clustalColour_actionPerformed()\r
719     {\r
720         SequenceGroup sg = getGroup();\r
721         sg.cs = new ClustalxColourScheme(sg.getSequences(ap.av.hiddenRepSequences),\r
722                 ap.av.alignment.getWidth());\r
723         refresh();\r
724     }\r
725 \r
726     /**\r
727      * DOCUMENT ME!\r
728      *\r
729      * @param e DOCUMENT ME!\r
730      */\r
731     protected void zappoColour_actionPerformed()\r
732     {\r
733         getGroup().cs = new ZappoColourScheme();\r
734         refresh();\r
735     }\r
736 \r
737     /**\r
738      * DOCUMENT ME!\r
739      *\r
740      * @param e DOCUMENT ME!\r
741      */\r
742     protected void taylorColour_actionPerformed()\r
743     {\r
744         getGroup().cs = new TaylorColourScheme();\r
745         refresh();\r
746     }\r
747 \r
748     /**\r
749      * DOCUMENT ME!\r
750      *\r
751      * @param e DOCUMENT ME!\r
752      */\r
753     protected void hydrophobicityColour_actionPerformed()\r
754     {\r
755         getGroup().cs = new HydrophobicColourScheme();\r
756         refresh();\r
757     }\r
758 \r
759     /**\r
760      * DOCUMENT ME!\r
761      *\r
762      * @param e DOCUMENT ME!\r
763      */\r
764     protected void helixColour_actionPerformed()\r
765     {\r
766         getGroup().cs = new HelixColourScheme();\r
767         refresh();\r
768     }\r
769 \r
770     /**\r
771      * DOCUMENT ME!\r
772      *\r
773      * @param e DOCUMENT ME!\r
774      */\r
775     protected void strandColour_actionPerformed()\r
776     {\r
777         getGroup().cs = new StrandColourScheme();\r
778         refresh();\r
779     }\r
780 \r
781     /**\r
782      * DOCUMENT ME!\r
783      *\r
784      * @param e DOCUMENT ME!\r
785      */\r
786     protected void turnColour_actionPerformed()\r
787     {\r
788         getGroup().cs = new TurnColourScheme();\r
789         refresh();\r
790     }\r
791 \r
792     /**\r
793      * DOCUMENT ME!\r
794      *\r
795      * @param e DOCUMENT ME!\r
796      */\r
797     protected void buriedColour_actionPerformed()\r
798     {\r
799         getGroup().cs = new BuriedColourScheme();\r
800         refresh();\r
801     }\r
802 \r
803     /**\r
804      * DOCUMENT ME!\r
805      *\r
806      * @param e DOCUMENT ME!\r
807      */\r
808     public void nucleotideMenuItem_actionPerformed()\r
809     {\r
810         getGroup().cs = new NucleotideColourScheme();\r
811         refresh();\r
812     }\r
813 \r
814     /**\r
815      * DOCUMENT ME!\r
816      *\r
817      * @param e DOCUMENT ME!\r
818      */\r
819     protected void abovePIDColour_actionPerformed()\r
820     {\r
821         SequenceGroup sg = getGroup();\r
822         if(sg.cs==null)\r
823           return;\r
824 \r
825         if (abovePIDColour.isSelected())\r
826         {\r
827           sg.cs.setConsensus(AAFrequency.calculate(\r
828               sg.getSequences(ap.av.hiddenRepSequences), sg.getStartRes(),\r
829               sg.getEndRes() + 1));\r
830 \r
831             int threshold = SliderPanel.setPIDSliderSource(ap, sg.cs,\r
832                     getGroup().getName());\r
833 \r
834            sg.cs.setThreshold(threshold, ap.av.getIgnoreGapsConsensus());\r
835 \r
836             SliderPanel.showPIDSlider();\r
837         }\r
838         else // remove PIDColouring\r
839         {\r
840             sg.cs.setThreshold(0, ap.av.getIgnoreGapsConsensus());\r
841         }\r
842 \r
843         refresh();\r
844     }\r
845 \r
846     /**\r
847      * DOCUMENT ME!\r
848      *\r
849      * @param e DOCUMENT ME!\r
850      */\r
851     protected void userDefinedColour_actionPerformed(ActionEvent e)\r
852     {\r
853        SequenceGroup sg = getGroup();\r
854 \r
855        if (e.getActionCommand().equals("User Defined..."))\r
856          new UserDefinedColours(ap, sg);\r
857        else\r
858        {\r
859          UserColourScheme udc = (UserColourScheme) UserDefinedColours.\r
860              getUserColourSchemes().get(e.getActionCommand());\r
861 \r
862          sg.cs = udc;\r
863        }\r
864        refresh();\r
865      }\r
866     /**\r
867      * DOCUMENT ME!\r
868      *\r
869      * @param e DOCUMENT ME!\r
870      */\r
871     protected void PIDColour_actionPerformed()\r
872     {\r
873         SequenceGroup sg = getGroup();\r
874         sg.cs = new PIDColourScheme();\r
875         sg.cs.setConsensus(AAFrequency.calculate(sg.getSequences(ap.av.hiddenRepSequences),\r
876                                                  sg.getStartRes(),\r
877                                                  sg.getEndRes() + 1));\r
878         refresh();\r
879     }\r
880 \r
881     /**\r
882      * DOCUMENT ME!\r
883      *\r
884      * @param e DOCUMENT ME!\r
885      */\r
886     protected void BLOSUM62Colour_actionPerformed()\r
887     {\r
888         SequenceGroup sg = getGroup();\r
889 \r
890         sg.cs = new Blosum62ColourScheme();\r
891 \r
892         sg.cs.setConsensus(AAFrequency.calculate(sg.getSequences(ap.av.hiddenRepSequences),\r
893                                                  sg.getStartRes(),\r
894                                                  sg.getEndRes() + 1));\r
895 \r
896         refresh();\r
897     }\r
898 \r
899     /**\r
900      * DOCUMENT ME!\r
901      *\r
902      * @param e DOCUMENT ME!\r
903      */\r
904     protected void noColourmenuItem_actionPerformed()\r
905     {\r
906         getGroup().cs = null;\r
907         refresh();\r
908     }\r
909 \r
910     /**\r
911      * DOCUMENT ME!\r
912      *\r
913      * @param e DOCUMENT ME!\r
914      */\r
915     protected void conservationMenuItem_actionPerformed()\r
916     {\r
917         SequenceGroup sg = getGroup();\r
918         if(sg.cs==null)\r
919           return;\r
920 \r
921         if (conservationMenuItem.isSelected())\r
922         {\r
923             Conservation c = new Conservation("Group",\r
924                     ResidueProperties.propHash, 3,\r
925                     sg.getSequences(ap.av.hiddenRepSequences),\r
926                     sg.getStartRes(),\r
927                     sg.getEndRes() + 1);\r
928 \r
929             c.calculate();\r
930             c.verdict(false, ap.av.ConsPercGaps);\r
931 \r
932             sg.cs.setConservation(c);\r
933 \r
934             SliderPanel.setConservationSlider(ap, sg.cs, sg.getName());\r
935             SliderPanel.showConservationSlider();\r
936         }\r
937         else // remove ConservationColouring\r
938         {\r
939             sg.cs.setConservation(null);\r
940         }\r
941 \r
942         refresh();\r
943     }\r
944 \r
945     /**\r
946      * DOCUMENT ME!\r
947      *\r
948      * @param e DOCUMENT ME!\r
949      */\r
950     protected void groupName_actionPerformed()\r
951     {\r
952 \r
953       SequenceGroup sg = getGroup();\r
954       EditNameDialog dialog = new EditNameDialog(sg.getName(),\r
955                                                  sg.getDescription(),\r
956                                                  "       Group Name ",\r
957                                                  "Group Description ",\r
958                                                  "Edit Group Name/Description");\r
959 \r
960       if (!dialog.accept)\r
961       {\r
962         return;\r
963       }\r
964 \r
965       sg.setName(dialog.getName());\r
966       sg.setDescription(dialog.getDescription());\r
967     }\r
968 \r
969 \r
970     /**\r
971      * DOCUMENT ME!\r
972      *\r
973      * @return DOCUMENT ME!\r
974      */\r
975     SequenceGroup getGroup()\r
976     {\r
977         SequenceGroup sg = ap.av.getSelectionGroup();\r
978       // this method won't add a new group if it already exists\r
979         if(sg!=null)\r
980           ap.av.alignment.addGroup(sg);\r
981 \r
982         return sg;\r
983     }\r
984 \r
985     /**\r
986      * DOCUMENT ME!\r
987      *\r
988      * @param e DOCUMENT ME!\r
989      */\r
990     void sequenceName_actionPerformed()\r
991     {\r
992       EditNameDialog dialog = new EditNameDialog(sequence.getName(),\r
993                                                  sequence.getDescription(),\r
994                                                  "       Sequence Name ",\r
995                                                  "Sequence Description ",\r
996                                                  "Edit Sequence Name/Description");\r
997 \r
998         if (!dialog.accept)\r
999         {\r
1000             return;\r
1001         }\r
1002 \r
1003         if (dialog.getName() != null)\r
1004         {\r
1005             if (dialog.getName().indexOf(" ") > -1)\r
1006             {\r
1007                 JOptionPane.showMessageDialog(ap,\r
1008                     "Spaces have been converted to \"_\"",\r
1009                     "No spaces allowed in Sequence Name",\r
1010                     JOptionPane.WARNING_MESSAGE);\r
1011             }\r
1012 \r
1013             sequence.setName(dialog.getName().replace(' ', '_'));\r
1014             ap.repaint();\r
1015         }\r
1016 \r
1017         sequence.setDescription(dialog.getDescription());\r
1018 \r
1019         ap.av.firePropertyChange("alignment", null,\r
1020                                   ap.av.getAlignment().getSequences());\r
1021 \r
1022     }\r
1023 \r
1024     /**\r
1025      * DOCUMENT ME!\r
1026      *\r
1027      * @param e DOCUMENT ME!\r
1028      */\r
1029     void unGroupMenuItem_actionPerformed()\r
1030     {\r
1031         SequenceGroup sg = ap.av.getSelectionGroup();\r
1032         ap.av.alignment.deleteGroup(sg);\r
1033         ap.av.setSelectionGroup(null);\r
1034         refresh();\r
1035     }\r
1036 \r
1037 \r
1038     /**\r
1039      * DOCUMENT ME!\r
1040      *\r
1041      * @param e DOCUMENT ME!\r
1042      */\r
1043     protected void outline_actionPerformed()\r
1044     {\r
1045         SequenceGroup sg = getGroup();\r
1046         Color col = JColorChooser.showDialog(this, "Select Outline Colour",\r
1047                 Color.BLUE);\r
1048 \r
1049         if (col != null)\r
1050         {\r
1051             sg.setOutlineColour(col);\r
1052         }\r
1053 \r
1054         refresh();\r
1055     }\r
1056 \r
1057     /**\r
1058      * DOCUMENT ME!\r
1059      *\r
1060      * @param e DOCUMENT ME!\r
1061      */\r
1062     public void showBoxes_actionPerformed()\r
1063     {\r
1064         getGroup().setDisplayBoxes(showBoxes.isSelected());\r
1065         refresh();\r
1066     }\r
1067 \r
1068     /**\r
1069      * DOCUMENT ME!\r
1070      *\r
1071      * @param e DOCUMENT ME!\r
1072      */\r
1073     public void showText_actionPerformed()\r
1074     {\r
1075         getGroup().setDisplayText(showText.isSelected());\r
1076         refresh();\r
1077     }\r
1078 \r
1079     /**\r
1080      * DOCUMENT ME!\r
1081      *\r
1082      * @param e DOCUMENT ME!\r
1083      */\r
1084     public void showColourText_actionPerformed()\r
1085     {\r
1086         getGroup().setColourText(showColourText.isSelected());\r
1087         refresh();\r
1088     }\r
1089 \r
1090     public void showLink(String url)\r
1091     {\r
1092       try\r
1093       {\r
1094         jalview.util.BrowserLauncher.openURL(url);\r
1095       }\r
1096       catch (Exception ex)\r
1097       {\r
1098         JOptionPane.showInternalMessageDialog(Desktop.desktop,\r
1099             "Unixers: Couldn't find default web browser."\r
1100            +"\nAdd the full path to your browser in Preferences.",\r
1101            "Web browser not found", JOptionPane.WARNING_MESSAGE );\r
1102 \r
1103 \r
1104         ex.printStackTrace();\r
1105       }\r
1106     }\r
1107 \r
1108     void hideSequences(boolean representGroup)\r
1109     {\r
1110       SequenceGroup sg = ap.av.getSelectionGroup();\r
1111       if(sg==null || sg.getSize()<1)\r
1112       {\r
1113         ap.av.hideSequence(new SequenceI[]{sequence});\r
1114         return;\r
1115       }\r
1116 \r
1117       ap.av.setSelectionGroup(null);\r
1118 \r
1119       if (representGroup)\r
1120       {\r
1121         ap.av.hideRepSequences(sequence, sg);\r
1122 \r
1123         return;\r
1124       }\r
1125 \r
1126       int gsize = sg.getSize();\r
1127       SequenceI[] hseqs;\r
1128 \r
1129       hseqs = new SequenceI[gsize];\r
1130 \r
1131       int index = 0;\r
1132       for (int i = 0; i < gsize; i++)\r
1133       {\r
1134         hseqs[index++] = sg.getSequenceAt(i);\r
1135       }\r
1136 \r
1137       ap.av.hideSequence(hseqs);\r
1138     }\r
1139 \r
1140   public void copy_actionPerformed()\r
1141   {\r
1142     ap.alignFrame.copy_actionPerformed(null);\r
1143   }\r
1144 \r
1145   public void cut_actionPerformed()\r
1146   {\r
1147     ap.alignFrame.cut_actionPerformed(null);\r
1148   }\r
1149 \r
1150   void changeCase(ActionEvent e)\r
1151   {\r
1152     Object source = e.getSource();\r
1153     SequenceGroup sg = ap.av.getSelectionGroup();\r
1154     Vector regions = new Vector();\r
1155     if (sg != null)\r
1156     {\r
1157       int start = sg.getStartRes();\r
1158       int end = sg.getEndRes() + 1;\r
1159 \r
1160       do\r
1161       {\r
1162         if (ap.av.hasHiddenColumns)\r
1163         {\r
1164           if(start==0)\r
1165             start = ap.av.colSel.adjustForHiddenColumns(start);\r
1166 \r
1167           end = ap.av.colSel.getHiddenBoundaryRight(start);\r
1168           if (start == end)\r
1169             end = sg.getEndRes() + 1;\r
1170           if (end > sg.getEndRes())\r
1171             end = sg.getEndRes() + 1;\r
1172         }\r
1173 \r
1174         regions.addElement(new int[]\r
1175                            {start, end});\r
1176 \r
1177         if (ap.av.hasHiddenColumns)\r
1178         {\r
1179           start = ap.av.colSel.adjustForHiddenColumns(end);\r
1180           start = ap.av.colSel.getHiddenBoundaryLeft(start) + 1;\r
1181         }\r
1182       }\r
1183       while (end < sg.getEndRes());\r
1184 \r
1185       int[][] startEnd = new int[regions.size()][2];\r
1186       for (int i = 0; i < regions.size(); i++)\r
1187       {\r
1188         startEnd[i] = (int[]) regions.elementAt(i);\r
1189       }\r
1190 \r
1191 \r
1192       String description;\r
1193       int caseChange;\r
1194 \r
1195       if(source==toggle)\r
1196       {\r
1197         description = "Toggle Case";\r
1198         caseChange = ChangeCaseCommand.TOGGLE_CASE;\r
1199       }\r
1200       else if(source==upperCase)\r
1201       {\r
1202         description = "To Upper Case";\r
1203         caseChange = ChangeCaseCommand.TO_UPPER;\r
1204       }\r
1205       else\r
1206       {\r
1207         description = "To Lower Case";\r
1208         caseChange = ChangeCaseCommand.TO_LOWER;\r
1209       }\r
1210 \r
1211       ChangeCaseCommand caseCommand = new ChangeCaseCommand(\r
1212           description, sg.getSequencesAsArray(ap.av.hiddenRepSequences),\r
1213           startEnd, caseChange\r
1214           );\r
1215 \r
1216       ap.alignFrame.addHistoryItem(caseCommand);\r
1217 \r
1218 \r
1219       ap.av.firePropertyChange("alignment", null,\r
1220                                 ap.av.getAlignment().getSequences());\r
1221 \r
1222     }\r
1223   }\r
1224 \r
1225   public void outputText_actionPerformed(ActionEvent e)\r
1226   {\r
1227     CutAndPasteTransfer cap = new CutAndPasteTransfer();\r
1228     cap.setForInput(null);\r
1229     Desktop.addInternalFrame(cap,\r
1230                              "Alignment output - " + e.getActionCommand(), 600,\r
1231                              500);\r
1232 \r
1233     String [] omitHidden = null;\r
1234 \r
1235     if(ap.av.hasHiddenColumns)\r
1236     {\r
1237       System.out.println("PROMPT USER HERE");\r
1238       omitHidden = ap.av.getViewAsString(true);\r
1239     }\r
1240 \r
1241     cap.setText(new FormatAdapter().formatSequences(\r
1242         e.getActionCommand(),\r
1243         ap.av.getSelectionAsNewSequence(),\r
1244         omitHidden));\r
1245   }\r
1246 \r
1247 \r
1248   public void pdbFromFile_actionPerformed()\r
1249   {\r
1250      jalview.io.JalviewFileChooser chooser\r
1251          = new jalview.io.JalviewFileChooser(jalview.bin.Cache.\r
1252          getProperty(\r
1253              "LAST_DIRECTORY"));\r
1254      chooser.setFileView(new jalview.io.JalviewFileView());\r
1255      chooser.setDialogTitle("Select a PDB file");\r
1256      chooser.setToolTipText("Load a PDB file");\r
1257 \r
1258      int value = chooser.showOpenDialog(null);\r
1259 \r
1260      if (value == jalview.io.JalviewFileChooser.APPROVE_OPTION)\r
1261      {\r
1262        PDBEntry entry = new PDBEntry();\r
1263        String choice = chooser.getSelectedFile().getPath();\r
1264        jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);\r
1265        try\r
1266        {\r
1267          MCview.PDBfile pdbfile = new MCview.PDBfile(choice,\r
1268                                        jalview.io.AppletFormatAdapter.FILE);\r
1269 \r
1270          if (pdbfile.id == null)\r
1271          {\r
1272            String reply = JOptionPane.showInternalInputDialog(\r
1273                Desktop.desktop,\r
1274                "Couldn't find a PDB id in the file supplied."\r
1275                + "Please enter an Id to identify this structure.",\r
1276                "No PDB Id in File", JOptionPane.QUESTION_MESSAGE);\r
1277            if (reply == null)\r
1278              return;\r
1279 \r
1280            entry.setId(reply);\r
1281          }\r
1282          else\r
1283            entry.setId(pdbfile.id);\r
1284        }\r
1285        catch (java.io.IOException ex)\r
1286        {\r
1287          ex.printStackTrace();\r
1288        }\r
1289 \r
1290        entry.setFile(choice);\r
1291        sequence.getDatasetSequence().addPDBId(entry);\r
1292      }\r
1293 \r
1294   }\r
1295 \r
1296   public void enterPDB_actionPerformed()\r
1297   {\r
1298     String id = JOptionPane.showInternalInputDialog(Desktop.desktop,\r
1299         "Enter PDB Id", "Enter PDB Id", JOptionPane.QUESTION_MESSAGE);\r
1300 \r
1301     if (id != null && id.length() > 0)\r
1302     {\r
1303       PDBEntry entry = new PDBEntry();\r
1304       entry.setId(id);\r
1305       sequence.getDatasetSequence()\r
1306           .addPDBId(entry);\r
1307     }\r
1308   }\r
1309 \r
1310   public void discoverPDB_actionPerformed()\r
1311   {\r
1312     new jalview.io.DBRefFetcher(\r
1313              ap.av.getAlignment(), ap.alignFrame).fetchDBRefs(false);\r
1314   }\r
1315 \r
1316   public void sequenceFeature_actionPerformed()\r
1317   {\r
1318     SequenceGroup sg = ap.av.getSelectionGroup();\r
1319     if(sg==null)\r
1320       return;\r
1321 \r
1322     int gSize= sg.getSize();\r
1323     SequenceI [] seqs = new SequenceI[gSize];\r
1324     SequenceFeature [] features = new SequenceFeature[gSize];\r
1325 \r
1326     for (int i = 0; i < gSize; i++)\r
1327     {\r
1328       seqs[i] = sg.getSequenceAt(i).getDatasetSequence();\r
1329       int start = sg.getSequenceAt(i).findPosition(sg.getStartRes());\r
1330       int end = sg.findEndRes(sg.getSequenceAt(i));\r
1331       features[i] = new SequenceFeature(null,null, null,start,end,"Jalview");\r
1332     }\r
1333 \r
1334     if (ap.seqPanel.seqCanvas.getFeatureRenderer()\r
1335         .createNewFeatures(seqs, features))\r
1336     {\r
1337       ap.alignFrame.showSeqFeatures.setSelected(true);\r
1338       ap.av.setShowSequenceFeatures(true);\r
1339       ap.highlightSearchResults(null);\r
1340     }\r
1341   }\r
1342 \r
1343   public void textColour_actionPerformed()\r
1344   {\r
1345     SequenceGroup sg = getGroup();\r
1346     if (sg != null)\r
1347       new TextColourChooser().chooseColour(ap, sg);\r
1348   }\r
1349 }\r