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