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