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