Associate pdb files
[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 outputMenu = new JMenu();\r
81   JMenu pdbMenu = new JMenu();\r
82   JMenuItem pdbFromFile = new JMenuItem();\r
83   JMenuItem enterPDB = new JMenuItem();\r
84   JMenuItem discoverPDB = new JMenuItem();\r
85 \r
86   /**\r
87      * Creates a new PopupMenu object.\r
88      *\r
89      * @param ap DOCUMENT ME!\r
90      * @param seq DOCUMENT ME!\r
91      */\r
92     public PopupMenu(final AlignmentPanel ap, Sequence seq, Vector links)\r
93     {\r
94         ///////////////////////////////////////////////////////////\r
95         // If this is activated from the sequence panel, the user may want to\r
96         // edit or annotate a particular residue. Therefore display the residue menu\r
97         //\r
98         // If from the IDPanel, we must display the sequence menu\r
99         //////////////////////////////////////////////////////////\r
100         this.ap = ap;\r
101         sequence = seq;\r
102 \r
103         ButtonGroup colours = new ButtonGroup();\r
104         colours.add(noColourmenuItem);\r
105         colours.add(clustalColour);\r
106         colours.add(zappoColour);\r
107         colours.add(taylorColour);\r
108         colours.add(hydrophobicityColour);\r
109         colours.add(helixColour);\r
110         colours.add(strandColour);\r
111         colours.add(turnColour);\r
112         colours.add(buriedColour);\r
113         colours.add(abovePIDColour);\r
114         colours.add(userDefinedColour);\r
115         colours.add(PIDColour);\r
116         colours.add(BLOSUM62Colour);\r
117 \r
118         for (int i = 0; i < jalview.io.FormatAdapter.formats.size(); i++)\r
119         {\r
120           JMenuItem item = new JMenuItem( (String) jalview.io.FormatAdapter.formats.\r
121                                          elementAt(\r
122                                              i));\r
123           item.addActionListener(new java.awt.event.ActionListener()\r
124           {\r
125             public void actionPerformed(ActionEvent e)\r
126             {\r
127               outputText_actionPerformed(e);\r
128             }\r
129           });\r
130 \r
131           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           JMenuItem menuItem;\r
148           if( seq.getDatasetSequence().getPDBId() != null)\r
149           {\r
150             java.util.Enumeration e = seq.getDatasetSequence().getPDBId().\r
151                 elements();\r
152 \r
153             while (e.hasMoreElements())\r
154             {\r
155               final PDBEntry pdb = (PDBEntry) e.nextElement();\r
156 \r
157               menuItem = new JMenuItem();\r
158               menuItem.setText("View PDB entry: " + pdb.getId());\r
159               menuItem.addActionListener(new java.awt.event.ActionListener()\r
160               {\r
161                 public void actionPerformed(ActionEvent e)\r
162                 {\r
163                   new PDBViewer(pdb, sequence, ap.seqPanel.seqCanvas);\r
164                 }\r
165               });\r
166               sequenceMenu.add(menuItem);\r
167             }\r
168           }\r
169 \r
170           menuItem = new JMenuItem("Hide Sequences");\r
171           menuItem.addActionListener(new java.awt.event.ActionListener()\r
172               {\r
173                 public void actionPerformed(ActionEvent e)\r
174                 {\r
175                   hideSequences(false);\r
176                 }\r
177               });\r
178           sequenceMenu.add(menuItem);\r
179 \r
180           if(ap.av.getSelectionGroup() !=null\r
181              && ap.av.getSelectionGroup().getSize(false)>1)\r
182           {\r
183             menuItem = new JMenuItem("Represent Group with " + seq.getName());\r
184             menuItem.addActionListener(new java.awt.event.ActionListener()\r
185             {\r
186               public void actionPerformed(ActionEvent e)\r
187               {\r
188                 hideSequences(true);\r
189               }\r
190             });\r
191             sequenceMenu.add(menuItem);\r
192           }\r
193 \r
194           if (ap.av.hasHiddenRows)\r
195           {\r
196             final int index = ap.av.alignment.findIndex(seq);\r
197 \r
198             if (ap.av.adjustForHiddenSeqs(index) -\r
199                 ap.av.adjustForHiddenSeqs(index - 1) > 1)\r
200             {\r
201               menuItem = new JMenuItem("Reveal");\r
202               menuItem.addActionListener(new ActionListener()\r
203               {\r
204                 public void actionPerformed(ActionEvent e)\r
205                 {\r
206                   ap.av.showSequence(index);\r
207                   ap.repaint();\r
208                   if (ap.overviewPanel != null)\r
209                     ap.overviewPanel.updateOverviewImage();\r
210                 }\r
211               });\r
212               sequenceMenu.add(menuItem);\r
213             }\r
214 \r
215             menuItem = new JMenuItem("Reveal All");\r
216             menuItem.addActionListener(new ActionListener()\r
217                 {\r
218                   public void actionPerformed(ActionEvent e)\r
219                   {\r
220                     ap.av.showAllHiddenSeqs();\r
221                     ap.repaint();\r
222                     if (ap.overviewPanel != null)\r
223                       ap.overviewPanel.updateOverviewImage();\r
224                       }\r
225                 });\r
226 \r
227             sequenceMenu.add(menuItem);\r
228 \r
229 \r
230 \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         else\r
313         {\r
314             groupMenu.insertSeparator(3);\r
315         }\r
316 \r
317         if (seq == null)\r
318         {\r
319             sequenceMenu.setVisible(false);\r
320             pdbMenu.setVisible(false);\r
321         }\r
322 \r
323         if(links != null && links.size()>0)\r
324         {\r
325           JMenu linkMenu = new JMenu("Link");\r
326           JMenuItem item;\r
327           for(int i=0; i<links.size(); i++)\r
328           {\r
329             String link = links.elementAt(i).toString();\r
330             final String label = link.substring(0, link.indexOf("|"));\r
331             item = new JMenuItem(label);\r
332             final String url;\r
333 \r
334             if (link.indexOf("$SEQUENCE_ID$") > -1)\r
335             {\r
336               String id = seq.getName();\r
337               if (id.indexOf("|") > -1)\r
338                 id = id.substring(id.lastIndexOf("|") + 1);\r
339 \r
340               url = link.substring(link.indexOf("|") + 1,\r
341                                    link.indexOf("$SEQUENCE_ID$"))\r
342                   + id +\r
343                   link.substring(link.indexOf("$SEQUENCE_ID$") + 13);\r
344             }\r
345             else\r
346               url = link.substring(link.lastIndexOf("|")+1);\r
347 \r
348 \r
349             item.addActionListener(new java.awt.event.ActionListener()\r
350             {\r
351                 public void actionPerformed(ActionEvent e)\r
352                 {\r
353                     showLink(url);\r
354                 }\r
355             });\r
356 \r
357             linkMenu.add(item);\r
358           }\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("Group");\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     outputMenu.setText("Output to Textbox...");\r
485     pdbMenu.setText("Associate Structure with Sequence");\r
486     pdbFromFile.setText("From File");\r
487     pdbFromFile.addActionListener(new ActionListener()\r
488     {\r
489       public void actionPerformed(ActionEvent e)\r
490       {\r
491         pdbFromFile_actionPerformed(e);\r
492       }\r
493     });\r
494     enterPDB.setText("Enter PDB Id");\r
495     enterPDB.addActionListener(new ActionListener()\r
496     {\r
497       public void actionPerformed(ActionEvent e)\r
498       {\r
499         enterPDB_actionPerformed(e);\r
500       }\r
501     });\r
502     discoverPDB.setText("Discover PDB ids");\r
503     discoverPDB.addActionListener(new ActionListener()\r
504     {\r
505       public void actionPerformed(ActionEvent e)\r
506       {\r
507         discoverPDB_actionPerformed(e);\r
508       }\r
509     });\r
510     add(groupMenu);\r
511 \r
512     this.add(editMenu);\r
513     this.add(outputMenu);\r
514     add(sequenceMenu);\r
515     this.add(pdbMenu);\r
516     groupMenu.add(groupName);\r
517         groupMenu.addSeparator();\r
518         groupMenu.add(unGroupMenuItem);\r
519         groupMenu.add(colourMenu);\r
520         groupMenu.addSeparator();\r
521         groupMenu.add(showBoxes);\r
522         groupMenu.add(showText);\r
523         groupMenu.add(showColourText);\r
524         groupMenu.addSeparator();\r
525         groupMenu.add(outline);\r
526         sequenceMenu.add(sequenceName);\r
527         colourMenu.add(noColourmenuItem);\r
528         colourMenu.add(clustalColour);\r
529         colourMenu.add(BLOSUM62Colour);\r
530         colourMenu.add(PIDColour);\r
531         colourMenu.add(zappoColour);\r
532         colourMenu.add(taylorColour);\r
533         colourMenu.add(hydrophobicityColour);\r
534         colourMenu.add(helixColour);\r
535         colourMenu.add(strandColour);\r
536         colourMenu.add(turnColour);\r
537         colourMenu.add(buriedColour);\r
538         colourMenu.add(nucleotideMenuItem);\r
539         colourMenu.add(userDefinedColour);\r
540 \r
541         if(jalview.gui.UserDefinedColours.getUserColourSchemes()!=null)\r
542         {\r
543           java.util.Enumeration userColours = jalview.gui.UserDefinedColours.\r
544               getUserColourSchemes().keys();\r
545 \r
546           while (userColours.hasMoreElements())\r
547           {\r
548             JMenuItem item = new JMenuItem(userColours.\r
549                 nextElement().toString());\r
550             item.addActionListener(new ActionListener()\r
551             {\r
552               public void actionPerformed(ActionEvent evt)\r
553               {\r
554                 userDefinedColour_actionPerformed(evt);\r
555               }\r
556             });\r
557             colourMenu.add(item);\r
558           }\r
559         }\r
560 \r
561 \r
562         colourMenu.addSeparator();\r
563         colourMenu.add(abovePIDColour);\r
564         colourMenu.add(conservationMenuItem);\r
565     editMenu.add(copy);\r
566     editMenu.add(cut);\r
567     editMenu.add(upperCase);\r
568     editMenu.add(lowerCase);\r
569     editMenu.add(toggle);\r
570     pdbMenu.add(pdbFromFile);\r
571     pdbMenu.add(enterPDB);\r
572     pdbMenu.add(discoverPDB);\r
573     noColourmenuItem.setText("None");\r
574         noColourmenuItem.addActionListener(new java.awt.event.ActionListener()\r
575             {\r
576                 public void actionPerformed(ActionEvent e)\r
577                 {\r
578                     noColourmenuItem_actionPerformed(e);\r
579                 }\r
580             });\r
581 \r
582         clustalColour.setText("Clustalx colours");\r
583         clustalColour.addActionListener(new java.awt.event.ActionListener()\r
584             {\r
585                 public void actionPerformed(ActionEvent e)\r
586                 {\r
587                     clustalColour_actionPerformed(e);\r
588                 }\r
589             });\r
590         zappoColour.setText("Zappo");\r
591         zappoColour.addActionListener(new java.awt.event.ActionListener()\r
592             {\r
593                 public void actionPerformed(ActionEvent e)\r
594                 {\r
595                     zappoColour_actionPerformed(e);\r
596                 }\r
597             });\r
598         taylorColour.setText("Taylor");\r
599         taylorColour.addActionListener(new java.awt.event.ActionListener()\r
600             {\r
601                 public void actionPerformed(ActionEvent e)\r
602                 {\r
603                     taylorColour_actionPerformed(e);\r
604                 }\r
605             });\r
606         hydrophobicityColour.setText("Hydrophobicity");\r
607         hydrophobicityColour.addActionListener(new java.awt.event.ActionListener()\r
608             {\r
609                 public void actionPerformed(ActionEvent e)\r
610                 {\r
611                     hydrophobicityColour_actionPerformed(e);\r
612                 }\r
613             });\r
614         helixColour.setText("Helix propensity");\r
615         helixColour.addActionListener(new java.awt.event.ActionListener()\r
616             {\r
617                 public void actionPerformed(ActionEvent e)\r
618                 {\r
619                     helixColour_actionPerformed(e);\r
620                 }\r
621             });\r
622         strandColour.setText("Strand propensity");\r
623         strandColour.addActionListener(new java.awt.event.ActionListener()\r
624             {\r
625                 public void actionPerformed(ActionEvent e)\r
626                 {\r
627                     strandColour_actionPerformed(e);\r
628                 }\r
629             });\r
630         turnColour.setText("Turn propensity");\r
631         turnColour.addActionListener(new java.awt.event.ActionListener()\r
632             {\r
633                 public void actionPerformed(ActionEvent e)\r
634                 {\r
635                     turnColour_actionPerformed(e);\r
636                 }\r
637             });\r
638         buriedColour.setText("Buried Index");\r
639         buriedColour.addActionListener(new java.awt.event.ActionListener()\r
640             {\r
641                 public void actionPerformed(ActionEvent e)\r
642                 {\r
643                     buriedColour_actionPerformed(e);\r
644                 }\r
645             });\r
646         abovePIDColour.setText("Above % Identity");\r
647         abovePIDColour.addActionListener(new java.awt.event.ActionListener()\r
648             {\r
649                 public void actionPerformed(ActionEvent e)\r
650                 {\r
651                     abovePIDColour_actionPerformed(e);\r
652                 }\r
653             });\r
654         userDefinedColour.setText("User Defined...");\r
655         userDefinedColour.addActionListener(new java.awt.event.ActionListener()\r
656             {\r
657                 public void actionPerformed(ActionEvent e)\r
658                 {\r
659                     userDefinedColour_actionPerformed(e);\r
660                 }\r
661             });\r
662         PIDColour.setText("Percentage Identity");\r
663         PIDColour.addActionListener(new java.awt.event.ActionListener()\r
664             {\r
665                 public void actionPerformed(ActionEvent e)\r
666                 {\r
667                     PIDColour_actionPerformed(e);\r
668                 }\r
669             });\r
670         BLOSUM62Colour.setText("BLOSUM62");\r
671         BLOSUM62Colour.addActionListener(new java.awt.event.ActionListener()\r
672             {\r
673                 public void actionPerformed(ActionEvent e)\r
674                 {\r
675                     BLOSUM62Colour_actionPerformed(e);\r
676                 }\r
677             });\r
678         conservationMenuItem.setText("Conservation");\r
679         conservationMenuItem.addActionListener(new java.awt.event.ActionListener()\r
680             {\r
681                 public void actionPerformed(ActionEvent e)\r
682                 {\r
683                     conservationMenuItem_actionPerformed(e);\r
684                 }\r
685             });\r
686     }\r
687 \r
688     /**\r
689      * DOCUMENT ME!\r
690      */\r
691     void refresh()\r
692     {\r
693         if (ap.overviewPanel != null)\r
694           ap.overviewPanel.updateOverviewImage();\r
695 \r
696         ap.seqPanel.repaint();\r
697     }\r
698 \r
699     /**\r
700      * DOCUMENT ME!\r
701      *\r
702      * @param e DOCUMENT ME!\r
703      */\r
704     protected void clustalColour_actionPerformed(ActionEvent e)\r
705     {\r
706         SequenceGroup sg = getGroup();\r
707         sg.cs = new ClustalxColourScheme(sg.getSequences(true),\r
708                 ap.av.alignment.getWidth());\r
709         refresh();\r
710     }\r
711 \r
712     /**\r
713      * DOCUMENT ME!\r
714      *\r
715      * @param e DOCUMENT ME!\r
716      */\r
717     protected void zappoColour_actionPerformed(ActionEvent e)\r
718     {\r
719         getGroup().cs = new ZappoColourScheme();\r
720         refresh();\r
721     }\r
722 \r
723     /**\r
724      * DOCUMENT ME!\r
725      *\r
726      * @param e DOCUMENT ME!\r
727      */\r
728     protected void taylorColour_actionPerformed(ActionEvent e)\r
729     {\r
730         getGroup().cs = new TaylorColourScheme();\r
731         refresh();\r
732     }\r
733 \r
734     /**\r
735      * DOCUMENT ME!\r
736      *\r
737      * @param e DOCUMENT ME!\r
738      */\r
739     protected void hydrophobicityColour_actionPerformed(ActionEvent e)\r
740     {\r
741         getGroup().cs = new HydrophobicColourScheme();\r
742         refresh();\r
743     }\r
744 \r
745     /**\r
746      * DOCUMENT ME!\r
747      *\r
748      * @param e DOCUMENT ME!\r
749      */\r
750     protected void helixColour_actionPerformed(ActionEvent e)\r
751     {\r
752         getGroup().cs = new HelixColourScheme();\r
753         refresh();\r
754     }\r
755 \r
756     /**\r
757      * DOCUMENT ME!\r
758      *\r
759      * @param e DOCUMENT ME!\r
760      */\r
761     protected void strandColour_actionPerformed(ActionEvent e)\r
762     {\r
763         getGroup().cs = new StrandColourScheme();\r
764         refresh();\r
765     }\r
766 \r
767     /**\r
768      * DOCUMENT ME!\r
769      *\r
770      * @param e DOCUMENT ME!\r
771      */\r
772     protected void turnColour_actionPerformed(ActionEvent e)\r
773     {\r
774         getGroup().cs = new TurnColourScheme();\r
775         refresh();\r
776     }\r
777 \r
778     /**\r
779      * DOCUMENT ME!\r
780      *\r
781      * @param e DOCUMENT ME!\r
782      */\r
783     protected void buriedColour_actionPerformed(ActionEvent e)\r
784     {\r
785         getGroup().cs = new BuriedColourScheme();\r
786         refresh();\r
787     }\r
788 \r
789     /**\r
790      * DOCUMENT ME!\r
791      *\r
792      * @param e DOCUMENT ME!\r
793      */\r
794     public void nucleotideMenuItem_actionPerformed(ActionEvent e)\r
795     {\r
796         getGroup().cs = new NucleotideColourScheme();\r
797         refresh();\r
798     }\r
799 \r
800     /**\r
801      * DOCUMENT ME!\r
802      *\r
803      * @param e DOCUMENT ME!\r
804      */\r
805     protected void abovePIDColour_actionPerformed(ActionEvent e)\r
806     {\r
807         SequenceGroup sg = getGroup();\r
808         if(sg.cs==null)\r
809           return;\r
810 \r
811         if (abovePIDColour.isSelected())\r
812         {\r
813             sg.cs.setConsensus(AAFrequency.calculate(\r
814                     sg.getSequences(true), 0,\r
815                     ap.av.alignment.getWidth()));\r
816 \r
817             int threshold = SliderPanel.setPIDSliderSource(ap, sg.cs,\r
818                     getGroup().getName());\r
819 \r
820            sg.cs.setThreshold(threshold, ap.av.getIgnoreGapsConsensus());\r
821 \r
822             SliderPanel.showPIDSlider();\r
823         }\r
824         else // remove PIDColouring\r
825         {\r
826             sg.cs.setThreshold(0, ap.av.getIgnoreGapsConsensus());\r
827         }\r
828 \r
829         refresh();\r
830     }\r
831 \r
832     /**\r
833      * DOCUMENT ME!\r
834      *\r
835      * @param e DOCUMENT ME!\r
836      */\r
837     protected void userDefinedColour_actionPerformed(ActionEvent e)\r
838     {\r
839        SequenceGroup sg = getGroup();\r
840 \r
841        if (e.getActionCommand().equals("User Defined..."))\r
842          new UserDefinedColours(ap, sg);\r
843        else\r
844        {\r
845          UserColourScheme udc = (UserColourScheme) UserDefinedColours.\r
846              getUserColourSchemes().get(e.getActionCommand());\r
847 \r
848          sg.cs = udc;\r
849        }\r
850      }\r
851     /**\r
852      * DOCUMENT ME!\r
853      *\r
854      * @param e DOCUMENT ME!\r
855      */\r
856     protected void PIDColour_actionPerformed(ActionEvent e)\r
857     {\r
858         SequenceGroup sg = getGroup();\r
859         sg.cs = new PIDColourScheme();\r
860         sg.cs.setConsensus(AAFrequency.calculate(sg.getSequences(true), 0,\r
861                 ap.av.alignment.getWidth()));\r
862         refresh();\r
863     }\r
864 \r
865     /**\r
866      * DOCUMENT ME!\r
867      *\r
868      * @param e DOCUMENT ME!\r
869      */\r
870     protected void BLOSUM62Colour_actionPerformed(ActionEvent e)\r
871     {\r
872         SequenceGroup sg = getGroup();\r
873 \r
874         sg.cs = new Blosum62ColourScheme();\r
875 \r
876         sg.cs.setConsensus(AAFrequency.calculate(sg.getSequences(true), 0,\r
877                 ap.av.alignment.getWidth()));\r
878 \r
879         refresh();\r
880     }\r
881 \r
882     /**\r
883      * DOCUMENT ME!\r
884      *\r
885      * @param e DOCUMENT ME!\r
886      */\r
887     protected void noColourmenuItem_actionPerformed(ActionEvent e)\r
888     {\r
889         getGroup().cs = null;\r
890         refresh();\r
891     }\r
892 \r
893     /**\r
894      * DOCUMENT ME!\r
895      *\r
896      * @param e DOCUMENT ME!\r
897      */\r
898     protected void conservationMenuItem_actionPerformed(ActionEvent e)\r
899     {\r
900         SequenceGroup sg = getGroup();\r
901         if(sg.cs==null)\r
902           return;\r
903 \r
904         if (conservationMenuItem.isSelected())\r
905         {\r
906             Conservation c = new Conservation("Group",\r
907                     ResidueProperties.propHash, 3,\r
908                     sg.getSequences(true), 0,\r
909                     ap.av.alignment.getWidth());\r
910 \r
911             c.calculate();\r
912             c.verdict(false, ap.av.ConsPercGaps);\r
913 \r
914             sg.cs.setConservation(c);\r
915 \r
916             SliderPanel.setConservationSlider(ap, sg.cs, sg.getName());\r
917             SliderPanel.showConservationSlider();\r
918         }\r
919         else // remove ConservationColouring\r
920         {\r
921             sg.cs.setConservation(null);\r
922         }\r
923 \r
924         refresh();\r
925     }\r
926 \r
927     /**\r
928      * DOCUMENT ME!\r
929      *\r
930      * @param e DOCUMENT ME!\r
931      */\r
932     protected void groupName_actionPerformed(ActionEvent e)\r
933     {\r
934         SequenceGroup sg = getGroup();\r
935         String reply = JOptionPane.showInternalInputDialog(Desktop.desktop,\r
936                 "Enter new group name", "Edit group name",\r
937                 JOptionPane.QUESTION_MESSAGE);\r
938 \r
939         if (reply == null)\r
940         {\r
941             return;\r
942         }\r
943 \r
944         sg.setName(reply);\r
945         groupName.setText(reply);\r
946     }\r
947 \r
948     /**\r
949      * DOCUMENT ME!\r
950      *\r
951      * @param e DOCUMENT ME!\r
952      */\r
953     protected void analyze_actionPerformed(ActionEvent e)\r
954     {\r
955         CutAndPasteTransfer cap = new CutAndPasteTransfer();\r
956         JInternalFrame frame = new JInternalFrame();\r
957         frame.setContentPane(cap);\r
958         Desktop.addInternalFrame(frame, "Analyze this - ", 400, 300);\r
959 \r
960         SequenceGroup sg = getGroup();\r
961         StringBuffer sb = new StringBuffer();\r
962 \r
963         for (int i = 0; i < sg.getSize(false); i++)\r
964         {\r
965             Sequence tmp = (Sequence) sg.getSequences(false).elementAt(i);\r
966             sb.append(tmp.getSequence(sg.getStartRes(), sg.getEndRes() + 1));\r
967             sb.append("\n");\r
968         }\r
969 \r
970         sb.append("Something amazing will happen soon");\r
971         cap.setText(sb.toString());\r
972     }\r
973 \r
974     /**\r
975      * DOCUMENT ME!\r
976      *\r
977      * @return DOCUMENT ME!\r
978      */\r
979     SequenceGroup getGroup()\r
980     {\r
981         SequenceGroup sg = ap.av.getSelectionGroup();\r
982       // this method won't add a new group if it already exists\r
983         if(sg!=null)\r
984           ap.av.alignment.addGroup(sg);\r
985 \r
986         return sg;\r
987     }\r
988 \r
989     /**\r
990      * DOCUMENT ME!\r
991      *\r
992      * @param e DOCUMENT ME!\r
993      */\r
994     void sequenceName_actionPerformed(ActionEvent e)\r
995     {\r
996       JLabel idlabel = new JLabel(  "       Sequence Name ");\r
997       JLabel desclabel = new JLabel("Sequence Description ");\r
998       idlabel.setFont(new Font("Courier", Font.PLAIN, 12));\r
999       desclabel.setFont(new Font("Courier", Font.PLAIN, 12));\r
1000       JTextField id = new JTextField(sequence.getName(), 40);\r
1001       JTextField description = new JTextField(sequence.getDescription(), 40);\r
1002       JPanel panel = new JPanel(new BorderLayout());\r
1003       JPanel panel2 = new JPanel(new BorderLayout());\r
1004       panel2.add(idlabel, BorderLayout.WEST);\r
1005       panel2.add(id, BorderLayout.CENTER);\r
1006       panel.add(panel2, BorderLayout.NORTH);\r
1007       panel2 = new JPanel(new BorderLayout());\r
1008       panel2.add(desclabel, BorderLayout.WEST);\r
1009       panel2.add(description, BorderLayout.CENTER);\r
1010       panel.add(panel2, BorderLayout.SOUTH);\r
1011 \r
1012 \r
1013        int reply = JOptionPane.showInternalConfirmDialog(Desktop.desktop,\r
1014           panel, "Edit Sequence Name/Description",\r
1015           JOptionPane.OK_CANCEL_OPTION );\r
1016 \r
1017 \r
1018         if (reply != JOptionPane.OK_OPTION )\r
1019         {\r
1020             return;\r
1021         }\r
1022 \r
1023         String s = id.getText();\r
1024 \r
1025         if (s != null)\r
1026         {\r
1027             if (s.indexOf(" ") > -1)\r
1028             {\r
1029                 JOptionPane.showMessageDialog(ap,\r
1030                     "Spaces have been converted to \"_\"",\r
1031                     "No spaces allowed in Sequence Name",\r
1032                     JOptionPane.WARNING_MESSAGE);\r
1033             }\r
1034 \r
1035             s = s.replace(' ', '_');\r
1036             sequence.getDatasetSequence().setName(s);\r
1037             sequence.setName(s);\r
1038             ap.repaint();\r
1039         }\r
1040 \r
1041         sequence.getDatasetSequence().setDescription(description.getText());\r
1042         sequence.setDescription(description.getText());\r
1043     }\r
1044 \r
1045     /**\r
1046      * DOCUMENT ME!\r
1047      *\r
1048      * @param e DOCUMENT ME!\r
1049      */\r
1050     void unGroupMenuItem_actionPerformed(ActionEvent e)\r
1051     {\r
1052         SequenceGroup sg = ap.av.getSelectionGroup();\r
1053         ap.av.alignment.deleteGroup(sg);\r
1054         ap.av.setSelectionGroup(null);\r
1055         refresh();\r
1056     }\r
1057 \r
1058 \r
1059     /**\r
1060      * DOCUMENT ME!\r
1061      *\r
1062      * @param e DOCUMENT ME!\r
1063      */\r
1064     protected void outline_actionPerformed(ActionEvent e)\r
1065     {\r
1066         SequenceGroup sg = getGroup();\r
1067         Color col = JColorChooser.showDialog(this, "Select Outline Colour",\r
1068                 Color.BLUE);\r
1069 \r
1070         if (col != null)\r
1071         {\r
1072             sg.setOutlineColour(col);\r
1073         }\r
1074 \r
1075         refresh();\r
1076     }\r
1077 \r
1078     /**\r
1079      * DOCUMENT ME!\r
1080      *\r
1081      * @param e DOCUMENT ME!\r
1082      */\r
1083     public void showBoxes_actionPerformed(ActionEvent e)\r
1084     {\r
1085         getGroup().setDisplayBoxes(showBoxes.isSelected());\r
1086         refresh();\r
1087     }\r
1088 \r
1089     /**\r
1090      * DOCUMENT ME!\r
1091      *\r
1092      * @param e DOCUMENT ME!\r
1093      */\r
1094     public void showText_actionPerformed(ActionEvent e)\r
1095     {\r
1096         getGroup().setDisplayText(showText.isSelected());\r
1097         refresh();\r
1098     }\r
1099 \r
1100     /**\r
1101      * DOCUMENT ME!\r
1102      *\r
1103      * @param e DOCUMENT ME!\r
1104      */\r
1105     public void showColourText_actionPerformed(ActionEvent e)\r
1106     {\r
1107         getGroup().setColourText(showColourText.isSelected());\r
1108         refresh();\r
1109     }\r
1110 \r
1111     public void showLink(String url)\r
1112     {\r
1113       try\r
1114       {\r
1115         jalview.util.BrowserLauncher.openURL(url);\r
1116       }\r
1117       catch (Exception ex)\r
1118       {\r
1119         JOptionPane.showInternalMessageDialog(Desktop.desktop,\r
1120             "Unixers: Couldn't find default web browser."\r
1121            +"\nAdd the full path to your browser in Preferences.",\r
1122            "Web browser not found", JOptionPane.WARNING_MESSAGE );\r
1123 \r
1124 \r
1125         ex.printStackTrace();\r
1126       }\r
1127     }\r
1128 \r
1129     void hideSequences(boolean representGroup)\r
1130     {\r
1131       SequenceGroup sg = ap.av.getSelectionGroup();\r
1132       if(sg==null || sg.getSize(false)<1)\r
1133       {\r
1134         ap.av.hideSequence(sequence);\r
1135         return;\r
1136       }\r
1137 \r
1138         int index = 0;\r
1139         while(index < sg.getSize(false))\r
1140         {\r
1141           if(representGroup && sg.getSequenceAt(index)!=sequence)\r
1142           {\r
1143             sequence.addHiddenSequence(sg.getSequenceAt(index));\r
1144             ap.av.hideSequence(sg.getSequenceAt(index));\r
1145           }\r
1146           else if(!representGroup)\r
1147           {\r
1148             ap.av.hideSequence(sg.getSequenceAt(index));\r
1149           }\r
1150           index ++;\r
1151         }\r
1152 \r
1153         ap.av.setSelectionGroup(null);\r
1154         refresh();\r
1155     }\r
1156 \r
1157   public void copy_actionPerformed(ActionEvent e)\r
1158   {\r
1159     ap.alignFrame.copy_actionPerformed(null);\r
1160   }\r
1161 \r
1162   public void cut_actionPerformed(ActionEvent e)\r
1163   {\r
1164     ap.alignFrame.cut_actionPerformed(null);\r
1165   }\r
1166 \r
1167   public void upperCase_actionPerformed(ActionEvent e)\r
1168   {\r
1169     SequenceGroup sg = ap.av.getSelectionGroup();\r
1170     if(sg==null)\r
1171       return;\r
1172 \r
1173     for(int g=0; g<sg.getSize(true); g++)\r
1174     {\r
1175     ( (SequenceI)sg.getSequences(true).elementAt(g))\r
1176         .changeCase(true, sg.getStartRes(), sg.getEndRes()+1);\r
1177     }\r
1178     ap.repaint();\r
1179   }\r
1180 \r
1181   public void lowerCase_actionPerformed(ActionEvent e)\r
1182   {\r
1183     SequenceGroup sg = ap.av.getSelectionGroup();\r
1184     if(sg==null)\r
1185       return;\r
1186 \r
1187     for(int g=0; g<sg.getSize(true); g++)\r
1188     {\r
1189        ( (SequenceI)sg.getSequences(true).elementAt(g))\r
1190            .changeCase(false, sg.getStartRes(), sg.getEndRes()+1);\r
1191     }\r
1192     ap.repaint();\r
1193   }\r
1194 \r
1195   public void toggle_actionPerformed(ActionEvent e)\r
1196   {\r
1197     SequenceGroup sg = ap.av.getSelectionGroup();\r
1198     if (sg == null)\r
1199       return;\r
1200 \r
1201     for (int g = 0; g < sg.getSize(true); g++)\r
1202     {\r
1203       ( (SequenceI)sg.getSequences(true).elementAt(g))\r
1204           .toggleCase(sg.getStartRes(), sg.getEndRes() + 1);\r
1205     }\r
1206 \r
1207     ap.repaint();\r
1208   }\r
1209 \r
1210   public void outputText_actionPerformed(ActionEvent e)\r
1211   {\r
1212     CutAndPasteTransfer cap = new CutAndPasteTransfer();\r
1213     Desktop.addInternalFrame(cap,\r
1214                              "Alignment output - " + e.getActionCommand(), 600,\r
1215                              500);\r
1216 \r
1217     String [] omitHidden = null;\r
1218 \r
1219     if(ap.av.hasHiddenColumns)\r
1220     {\r
1221       System.out.println("PROMPT USER HERE");\r
1222       omitHidden = ap.av.getViewAsString(true);\r
1223     }\r
1224 \r
1225     cap.setText(new FormatAdapter().formatSequences(\r
1226         e.getActionCommand(),\r
1227         ap.av.getSelectionAsNewSequence(),\r
1228         omitHidden));\r
1229   }\r
1230 \r
1231 \r
1232   public void pdbFromFile_actionPerformed(ActionEvent e)\r
1233   {\r
1234      jalview.io.JalviewFileChooser chooser\r
1235          = new jalview.io.JalviewFileChooser(jalview.bin.Cache.\r
1236          getProperty(\r
1237              "LAST_DIRECTORY"));\r
1238      chooser.setFileView(new jalview.io.JalviewFileView());\r
1239      chooser.setDialogTitle("Select a PDB file");\r
1240      chooser.setToolTipText("Load a PDB file");\r
1241 \r
1242      int value = chooser.showOpenDialog(null);\r
1243 \r
1244      if (value == jalview.io.JalviewFileChooser.APPROVE_OPTION)\r
1245      {\r
1246        PDBEntry entry = new PDBEntry();\r
1247        String choice = chooser.getSelectedFile().getPath();\r
1248        jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);\r
1249        try\r
1250        {\r
1251          MCview.PDBfile pdbfile = new MCview.PDBfile(choice,\r
1252                                        jalview.io.AppletFormatAdapter.FILE);\r
1253 \r
1254          if (pdbfile.id == null)\r
1255          {\r
1256            String reply = JOptionPane.showInternalInputDialog(\r
1257                Desktop.desktop,\r
1258                "Couldn't find a PDB id in the file supplied."\r
1259                + "Please enter an Id to identify this structure.",\r
1260                "No PDB Id in File", JOptionPane.QUESTION_MESSAGE);\r
1261            if (reply == null)\r
1262              return;\r
1263 \r
1264            entry.setId(reply);\r
1265          }\r
1266          else\r
1267            entry.setId(pdbfile.id);\r
1268        }\r
1269        catch (java.io.IOException ex)\r
1270        {\r
1271          ex.printStackTrace();\r
1272        }\r
1273 \r
1274        entry.setFile(choice);\r
1275        sequence.getDatasetSequence().addPDBId(entry);\r
1276      }\r
1277 \r
1278   }\r
1279 \r
1280   public void enterPDB_actionPerformed(ActionEvent e)\r
1281   {\r
1282     int size = (ap.av.getSelectionGroup() == null ? 0 :\r
1283                 ap.av.getSelectionGroup().getSize(false));\r
1284 \r
1285     if (size == 0 || size > 1)\r
1286     {\r
1287       JOptionPane.showInternalMessageDialog(\r
1288           Desktop.desktop,\r
1289           "Select a single sequence to specify a PDB id for first",\r
1290           "Select Single Selected", JOptionPane.WARNING_MESSAGE);\r
1291       return;\r
1292     }\r
1293 \r
1294     String id = JOptionPane.showInternalInputDialog(Desktop.desktop,\r
1295         "Enter PDB Id", "Enter PDB Id", JOptionPane.QUESTION_MESSAGE);\r
1296 \r
1297     if (id != null && id.length() > 0)\r
1298     {\r
1299       PDBEntry entry = new PDBEntry();\r
1300       entry.setId(id);\r
1301       ap.av.getSelectionGroup().getSequenceAt(0).getDatasetSequence()\r
1302           .addPDBId(entry);\r
1303     }\r
1304   }\r
1305 \r
1306   public void discoverPDB_actionPerformed(ActionEvent e)\r
1307   {\r
1308     new jalview.io.DBRefFetcher(\r
1309              ap.av.getAlignment(), ap.alignFrame).fetchDBRefs(false);\r
1310   }\r
1311 }\r