recovery of identical dataset sequence object on undo (rather than creation of a...
[jalview.git] / src / jalview / appletgui / APopupMenu.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer\r
3  * Copyright (C) 2007 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 \r
20 package jalview.appletgui;\r
21 \r
22 import java.util.*;\r
23 \r
24 import java.awt.*;\r
25 import java.awt.event.*;\r
26 \r
27 import jalview.analysis.*;\r
28 import jalview.commands.*;\r
29 import jalview.datamodel.*;\r
30 import jalview.schemes.*;\r
31 import jalview.io.AppletFormatAdapter;\r
32 \r
33 public class APopupMenu\r
34     extends java.awt.PopupMenu implements ActionListener, ItemListener\r
35 {\r
36   Menu groupMenu = new Menu();\r
37   MenuItem editGroupName = new MenuItem();\r
38   protected MenuItem clustalColour = new MenuItem();\r
39   protected MenuItem zappoColour = new MenuItem();\r
40   protected MenuItem taylorColour = new MenuItem();\r
41   protected MenuItem hydrophobicityColour = new MenuItem();\r
42   protected MenuItem helixColour = new MenuItem();\r
43   protected MenuItem strandColour = new MenuItem();\r
44   protected MenuItem turnColour = new MenuItem();\r
45   protected MenuItem buriedColour = new MenuItem();\r
46   protected CheckboxMenuItem abovePIDColour = new CheckboxMenuItem();\r
47   protected MenuItem userDefinedColour = new MenuItem();\r
48   protected MenuItem PIDColour = new MenuItem();\r
49   protected MenuItem BLOSUM62Colour = new MenuItem();\r
50   MenuItem noColourmenuItem = new MenuItem();\r
51   protected CheckboxMenuItem conservationMenuItem = new CheckboxMenuItem();\r
52 \r
53   final AlignmentPanel ap;\r
54   MenuItem unGroupMenuItem = new MenuItem();\r
55   MenuItem nucleotideMenuItem = new MenuItem();\r
56   Menu colourMenu = new Menu();\r
57   CheckboxMenuItem showBoxes = new CheckboxMenuItem();\r
58   CheckboxMenuItem showText = new CheckboxMenuItem();\r
59   CheckboxMenuItem showColourText = new CheckboxMenuItem();\r
60   Menu editMenu = new Menu("Edit");\r
61   MenuItem copy = new MenuItem("Copy (Jalview Only)");\r
62   MenuItem cut = new MenuItem("Cut (Jalview Only)");\r
63   MenuItem toUpper = new MenuItem("To Upper Case");\r
64   MenuItem toLower = new MenuItem("To Lower Case");\r
65   MenuItem toggleCase = new MenuItem("Toggle Case");\r
66   Menu outputmenu = new Menu();\r
67   Menu seqMenu = new Menu();\r
68   MenuItem pdb = new MenuItem();\r
69   MenuItem hideSeqs = new MenuItem();\r
70   MenuItem repGroup = new MenuItem();\r
71   MenuItem sequenceName = new MenuItem("Edit Name/Description");\r
72   MenuItem sequenceFeature = new MenuItem("Create Sequence Feature");\r
73   MenuItem editSequence = new MenuItem("Edit Sequence");\r
74 \r
75   Sequence seq;\r
76   MenuItem revealAll = new MenuItem();\r
77   Menu menu1 = new Menu();\r
78 \r
79   public APopupMenu(AlignmentPanel apanel, final Sequence seq, Vector links)\r
80   {\r
81     ///////////////////////////////////////////////////////////\r
82     // If this is activated from the sequence panel, the user may want to\r
83     // edit or annotate a particular residue. Therefore display the residue menu\r
84     //\r
85     // If from the IDPanel, we must display the sequence menu\r
86     //////////////////////////////////////////////////////////\r
87 \r
88     this.ap = apanel;\r
89     this.seq = seq;\r
90 \r
91     try\r
92     {\r
93       jbInit();\r
94     }\r
95     catch (Exception e)\r
96     {\r
97       e.printStackTrace();\r
98     }\r
99 \r
100     for (int i = 0; i < jalview.io.AppletFormatAdapter.WRITEABLE_FORMATS.length;\r
101          i++)\r
102     {\r
103       MenuItem item = new MenuItem(jalview.io.AppletFormatAdapter.\r
104                                    WRITEABLE_FORMATS[i]);\r
105 \r
106       item.addActionListener(this);\r
107       outputmenu.add(item);\r
108     }\r
109 \r
110     SequenceGroup sg = ap.av.getSelectionGroup();\r
111 \r
112     if (sg != null && sg.getSize() > 0)\r
113     {\r
114       editGroupName.setLabel(sg.getName());\r
115       showText.setState(sg.getDisplayText());\r
116       showColourText.setState(sg.getColourText());\r
117       showBoxes.setState(sg.getDisplayBoxes());\r
118       if (!ap.av.alignment.getGroups().contains(sg))\r
119       {\r
120         groupMenu.remove(unGroupMenuItem);\r
121       }\r
122 \r
123     }\r
124     else\r
125     {\r
126       remove(hideSeqs);\r
127       remove(groupMenu);\r
128     }\r
129 \r
130     if (links != null)\r
131     {\r
132       Menu linkMenu = new Menu("Link");\r
133       MenuItem item;\r
134       String link;\r
135       for (int i = 0; i < links.size(); i++)\r
136       {\r
137         link = links.elementAt(i).toString();\r
138         final String target = link.substring(0, link.indexOf("|"));\r
139         item = new MenuItem(target);\r
140 \r
141         final String url;\r
142 \r
143         if (link.indexOf("$SEQUENCE_ID$") > -1)\r
144         {\r
145           String id = seq.getName();\r
146           if (id.indexOf("|") > -1)\r
147           {\r
148             id = id.substring(id.lastIndexOf("|") + 1);\r
149           }\r
150 \r
151           url = link.substring(link.indexOf("|") + 1,\r
152                                link.indexOf("$SEQUENCE_ID$"))\r
153               + id +\r
154               link.substring(link.indexOf("$SEQUENCE_ID$") + 13);\r
155         }\r
156         else\r
157         {\r
158           url = link.substring(link.lastIndexOf("|") + 1);\r
159         }\r
160 \r
161         item.addActionListener(new java.awt.event.ActionListener()\r
162         {\r
163           public void actionPerformed(ActionEvent e)\r
164           {\r
165             ap.alignFrame.showURL(url, target);\r
166           }\r
167         });\r
168         linkMenu.add(item);\r
169       }\r
170       if (seq != null)\r
171       {\r
172         seqMenu.add(linkMenu);\r
173       }\r
174       else\r
175       {\r
176         add(linkMenu);\r
177       }\r
178     }\r
179     if (seq != null)\r
180     {\r
181       seqMenu.setLabel(seq.getName());\r
182       repGroup.setLabel("Represent Group with " + seq.getName());\r
183     }\r
184     else\r
185     {\r
186       remove(seqMenu);\r
187     }\r
188 \r
189     if (!ap.av.hasHiddenRows)\r
190     {\r
191       remove(revealAll);\r
192     }\r
193   }\r
194 \r
195   public void itemStateChanged(ItemEvent evt)\r
196   {\r
197     if (evt.getSource() == abovePIDColour)\r
198     {\r
199       abovePIDColour_itemStateChanged();\r
200     }\r
201     else if (evt.getSource() == showColourText)\r
202     {\r
203       showColourText_itemStateChanged();\r
204     }\r
205     else if (evt.getSource() == showText)\r
206     {\r
207       showText_itemStateChanged();\r
208     }\r
209     else if (evt.getSource() == showBoxes)\r
210     {\r
211       showBoxes_itemStateChanged();\r
212     }\r
213   }\r
214 \r
215   public void actionPerformed(ActionEvent evt)\r
216   {\r
217     Object source = evt.getSource();\r
218     if (source == clustalColour)\r
219     {\r
220       clustalColour_actionPerformed();\r
221     }\r
222     else if (source == zappoColour)\r
223     {\r
224       zappoColour_actionPerformed();\r
225     }\r
226     else if (source == taylorColour)\r
227     {\r
228       taylorColour_actionPerformed();\r
229     }\r
230     else if (source == hydrophobicityColour)\r
231     {\r
232       hydrophobicityColour_actionPerformed();\r
233     }\r
234     else if (source == helixColour)\r
235     {\r
236       helixColour_actionPerformed();\r
237     }\r
238     else if (source == strandColour)\r
239     {\r
240       strandColour_actionPerformed();\r
241     }\r
242     else if (source == turnColour)\r
243     {\r
244       turnColour_actionPerformed();\r
245     }\r
246     else if (source == buriedColour)\r
247     {\r
248       buriedColour_actionPerformed();\r
249     }\r
250     else if (source == nucleotideMenuItem)\r
251     {\r
252       nucleotideMenuItem_actionPerformed();\r
253     }\r
254 \r
255     else if (source == userDefinedColour)\r
256     {\r
257       userDefinedColour_actionPerformed();\r
258     }\r
259     else if (source == PIDColour)\r
260     {\r
261       PIDColour_actionPerformed();\r
262     }\r
263     else if (source == BLOSUM62Colour)\r
264     {\r
265       BLOSUM62Colour_actionPerformed();\r
266     }\r
267     else if (source == noColourmenuItem)\r
268     {\r
269       noColourmenuItem_actionPerformed();\r
270     }\r
271     else if (source == conservationMenuItem)\r
272     {\r
273       conservationMenuItem_itemStateChanged();\r
274     }\r
275     else if (source == unGroupMenuItem)\r
276     {\r
277       unGroupMenuItem_actionPerformed();\r
278     }\r
279 \r
280     else if (source == sequenceName)\r
281     {\r
282       editName();\r
283     }\r
284     else if (source == pdb)\r
285     {\r
286       addPDB();\r
287     }\r
288     else if (source == hideSeqs)\r
289     {\r
290       hideSequences(false);\r
291     }\r
292     else if (source == repGroup)\r
293     {\r
294       hideSequences(true);\r
295     }\r
296     else if (source == revealAll)\r
297     {\r
298       ap.av.showAllHiddenSeqs();\r
299     }\r
300 \r
301     else if (source == editGroupName)\r
302     {\r
303       EditNameDialog dialog = new EditNameDialog(\r
304           getGroup().getName(),\r
305           getGroup().getDescription(),\r
306           "       Group Name",\r
307           "Group Description",\r
308           ap.alignFrame,\r
309           "Edit Group Name / Description",\r
310           500,100, true);\r
311 \r
312       if (dialog.accept)\r
313       {\r
314         getGroup().setName(dialog.getName().replace(' ', '_'));\r
315         getGroup().setDescription(dialog.getDescription());\r
316       }\r
317 \r
318     }\r
319     else if (source == copy)\r
320     {\r
321       ap.alignFrame.copy_actionPerformed();\r
322     }\r
323     else if (source == cut)\r
324     {\r
325       ap.alignFrame.cut_actionPerformed();\r
326     }\r
327     else if(source == editSequence)\r
328     {\r
329       SequenceGroup sg = ap.av.getSelectionGroup();\r
330 \r
331       if(sg!=null)\r
332       {\r
333         if (seq == null)\r
334           seq = (Sequence) sg.getSequenceAt(0);\r
335 \r
336         EditNameDialog dialog = new EditNameDialog(seq.getSequenceAsString(\r
337             sg.getStartRes(),\r
338             sg.getEndRes() + 1),\r
339                                                    null,\r
340                                                    "Edit Sequence ",\r
341                                                    null,\r
342 \r
343                                                    ap.alignFrame,\r
344                                                    "Edit Sequence",\r
345                                                    500, 100, true);\r
346 \r
347         if (dialog.accept)\r
348         {\r
349           EditCommand editCommand = new EditCommand(\r
350               "Edit Sequences", EditCommand.REPLACE,\r
351               dialog.getName().replace(' ', ap.av.getGapCharacter()),\r
352               sg.getSequencesAsArray(ap.av.hiddenRepSequences),\r
353               sg.getStartRes(), sg.getEndRes()+1, ap.av.alignment\r
354               );\r
355 \r
356           ap.alignFrame.addHistoryItem(editCommand);\r
357 \r
358           ap.av.firePropertyChange("alignment", null,\r
359                                  ap.av.getAlignment().getSequences());\r
360         }\r
361       }\r
362     }\r
363     else if (source == toUpper || source == toLower || source == toggleCase)\r
364     {\r
365       SequenceGroup sg = ap.av.getSelectionGroup();\r
366       Vector regions = new Vector();\r
367       if (sg != null)\r
368       {\r
369         int start = sg.getStartRes();\r
370         int end = sg.getEndRes() + 1;\r
371 \r
372         do\r
373         {\r
374           if (ap.av.hasHiddenColumns)\r
375           {\r
376             if (start == 0)\r
377             {\r
378               start = ap.av.colSel.adjustForHiddenColumns(start);\r
379             }\r
380 \r
381             end = ap.av.colSel.getHiddenBoundaryRight(start);\r
382             if (start == end)\r
383             {\r
384               end = sg.getEndRes() + 1;\r
385             }\r
386             if (end > sg.getEndRes())\r
387             {\r
388               end = sg.getEndRes() + 1;\r
389             }\r
390           }\r
391 \r
392           regions.addElement(new int[]\r
393                              {start, end});\r
394 \r
395           if (ap.av.hasHiddenColumns)\r
396           {\r
397             start = ap.av.colSel.adjustForHiddenColumns(end);\r
398             start = ap.av.colSel.getHiddenBoundaryLeft(start) + 1;\r
399           }\r
400         }\r
401         while (end < sg.getEndRes());\r
402 \r
403         int[][] startEnd = new int[regions.size()][2];\r
404         for (int i = 0; i < regions.size(); i++)\r
405         {\r
406           startEnd[i] = (int[]) regions.elementAt(i);\r
407         }\r
408 \r
409         String description;\r
410         int caseChange;\r
411 \r
412         if (source == toggleCase)\r
413         {\r
414           description = "Toggle Case";\r
415           caseChange = ChangeCaseCommand.TOGGLE_CASE;\r
416         }\r
417         else if (source == toUpper)\r
418         {\r
419           description = "To Upper Case";\r
420           caseChange = ChangeCaseCommand.TO_UPPER;\r
421         }\r
422         else\r
423         {\r
424           description = "To Lower Case";\r
425           caseChange = ChangeCaseCommand.TO_LOWER;\r
426         }\r
427 \r
428         ChangeCaseCommand caseCommand = new ChangeCaseCommand(\r
429             description, sg.getSequencesAsArray(ap.av.hiddenRepSequences),\r
430             startEnd, caseChange\r
431             );\r
432 \r
433         ap.alignFrame.addHistoryItem(caseCommand);\r
434 \r
435         ap.av.firePropertyChange("alignment", null,\r
436                                  ap.av.getAlignment().getSequences());\r
437 \r
438       }\r
439     }\r
440     else if(source == sequenceFeature)\r
441     {\r
442       SequenceGroup sg = ap.av.getSelectionGroup();\r
443       if (sg == null)\r
444       {\r
445         return;\r
446       }\r
447 \r
448       int gSize = sg.getSize();\r
449       SequenceI[] seqs = new SequenceI[gSize];\r
450       SequenceFeature[] features = new SequenceFeature[gSize];\r
451 \r
452       for (int i = 0; i < gSize; i++)\r
453       {\r
454         seqs[i] = sg.getSequenceAt(i);\r
455         int start = sg.getSequenceAt(i).findPosition(sg.getStartRes());\r
456         int end = sg.findEndRes(sg.getSequenceAt(i));\r
457         features[i] = new SequenceFeature(null, null, null, start, end,\r
458                                           "Jalview");\r
459       }\r
460 \r
461       if (ap.seqPanel.seqCanvas.getFeatureRenderer()\r
462           .amendFeatures(seqs, features, true, ap))\r
463       {\r
464         ap.alignFrame.sequenceFeatures.setState(true);\r
465         ap.av.showSequenceFeatures(true);\r
466         ap.highlightSearchResults(null);\r
467       }\r
468     }\r
469     else\r
470     {\r
471       outputText(evt);\r
472     }\r
473 \r
474   }\r
475 \r
476   void outputText(ActionEvent e)\r
477   {\r
478     CutAndPasteTransfer cap = new CutAndPasteTransfer(true, ap.alignFrame);\r
479 \r
480     Frame frame = new Frame();\r
481     frame.add(cap);\r
482     jalview.bin.JalviewLite.addFrame(frame,\r
483                                      "Selection output - " + e.getActionCommand(),\r
484                                      600, 500);\r
485 \r
486     cap.setText(new jalview.io.AppletFormatAdapter().formatSequences(\r
487         e.getActionCommand(),\r
488         new Alignment(ap.av.getSelectionAsNewSequence()),\r
489         ap.av.showJVSuffix));\r
490 \r
491   }\r
492 \r
493   void editName()\r
494   {\r
495     EditNameDialog dialog = new EditNameDialog(\r
496         seq.getName(),\r
497         seq.getDescription(),\r
498         "       Sequence Name",\r
499         "Sequence Description",\r
500         ap.alignFrame,\r
501         "Edit Sequence Name / Description",\r
502         500,100, true);\r
503 \r
504     if (dialog.accept)\r
505     {\r
506       seq.setName(dialog.getName());\r
507       seq.setDescription(dialog.getDescription());\r
508       ap.paintAlignment(false);\r
509     }\r
510   }\r
511 \r
512   void addPDB()\r
513   {\r
514     if(seq.getPDBId()!=null)\r
515     {\r
516       PDBEntry entry = (PDBEntry)seq.getPDBId().firstElement();\r
517 \r
518       if ( ap.av.applet.jmolAvailable )\r
519        new jalview.appletgui.AppletJmol(entry,\r
520                                         new Sequence[]{seq},\r
521                                         null,\r
522                                         ap,\r
523                                         AppletFormatAdapter.URL);\r
524      else\r
525        new MCview.AppletPDBViewer(entry,\r
526                                   new Sequence[]{seq},\r
527                                   null,\r
528                                   ap,\r
529                                   AppletFormatAdapter.URL);\r
530 \r
531     }\r
532     else\r
533     {\r
534       CutAndPasteTransfer cap = new CutAndPasteTransfer(true, ap.alignFrame);\r
535       cap.setText("Paste your PDB file here.");\r
536       cap.setPDBImport(seq);\r
537       Frame frame = new Frame();\r
538       frame.add(cap);\r
539       jalview.bin.JalviewLite.addFrame(frame, "Paste PDB file ", 400, 300);\r
540     }\r
541   }\r
542 \r
543   private void jbInit()\r
544       throws Exception\r
545   {\r
546     groupMenu.setLabel("Group");\r
547     groupMenu.setLabel("Selection");\r
548     sequenceFeature.addActionListener(this);\r
549 \r
550     editGroupName.addActionListener(this);\r
551     unGroupMenuItem.setLabel("Remove Group");\r
552     unGroupMenuItem.addActionListener(this);\r
553 \r
554     nucleotideMenuItem.setLabel("Nucleotide");\r
555     nucleotideMenuItem.addActionListener(this);\r
556     conservationMenuItem.addItemListener(this);\r
557     abovePIDColour.addItemListener(this);\r
558     colourMenu.setLabel("Group Colour");\r
559     showBoxes.setLabel("Boxes");\r
560     showBoxes.setState(true);\r
561     showBoxes.addItemListener(this);\r
562     sequenceName.addActionListener(this);\r
563 \r
564     showText.setLabel("Text");\r
565     showText.addItemListener(this);\r
566     showColourText.setLabel("Colour Text");\r
567     showColourText.addItemListener(this);\r
568     outputmenu.setLabel("Output to Textbox...");\r
569     seqMenu.setLabel("Sequence");\r
570     pdb.setLabel("View PDB Structure");\r
571     hideSeqs.setLabel("Hide Sequences");\r
572     repGroup.setLabel("Represent Group with");\r
573     revealAll.setLabel("Reveal All");\r
574     menu1.setLabel("Group");\r
575     add(groupMenu);\r
576     this.add(seqMenu);\r
577     this.add(hideSeqs);\r
578     this.add(revealAll);\r
579     groupMenu.add(editGroupName);\r
580     groupMenu.add(editMenu);\r
581     groupMenu.add(outputmenu);\r
582     groupMenu.add(sequenceFeature);\r
583     groupMenu.add(menu1);\r
584 \r
585     colourMenu.add(noColourmenuItem);\r
586     colourMenu.add(clustalColour);\r
587     colourMenu.add(BLOSUM62Colour);\r
588     colourMenu.add(PIDColour);\r
589     colourMenu.add(zappoColour);\r
590     colourMenu.add(taylorColour);\r
591     colourMenu.add(hydrophobicityColour);\r
592     colourMenu.add(helixColour);\r
593     colourMenu.add(strandColour);\r
594     colourMenu.add(turnColour);\r
595     colourMenu.add(buriedColour);\r
596     colourMenu.add(nucleotideMenuItem);\r
597     colourMenu.add(userDefinedColour);\r
598     colourMenu.addSeparator();\r
599     colourMenu.add(abovePIDColour);\r
600     colourMenu.add(conservationMenuItem);\r
601 \r
602     noColourmenuItem.setLabel("None");\r
603     noColourmenuItem.addActionListener(this);\r
604 \r
605     clustalColour.setLabel("Clustalx colours");\r
606     clustalColour.addActionListener(this);\r
607     zappoColour.setLabel("Zappo");\r
608     zappoColour.addActionListener(this);\r
609     taylorColour.setLabel("Taylor");\r
610     taylorColour.addActionListener(this);\r
611     hydrophobicityColour.setLabel("Hydrophobicity");\r
612     hydrophobicityColour.addActionListener(this);\r
613     helixColour.setLabel("Helix propensity");\r
614     helixColour.addActionListener(this);\r
615     strandColour.setLabel("Strand propensity");\r
616     strandColour.addActionListener(this);\r
617     turnColour.setLabel("Turn propensity");\r
618     turnColour.addActionListener(this);\r
619     buriedColour.setLabel("Buried Index");\r
620     buriedColour.addActionListener(this);\r
621     abovePIDColour.setLabel("Above % Identity");\r
622 \r
623     userDefinedColour.setLabel("User Defined");\r
624     userDefinedColour.addActionListener(this);\r
625     PIDColour.setLabel("Percentage Identity");\r
626     PIDColour.addActionListener(this);\r
627     BLOSUM62Colour.setLabel("BLOSUM62");\r
628     BLOSUM62Colour.addActionListener(this);\r
629     conservationMenuItem.setLabel("Conservation");\r
630 \r
631     editMenu.add(copy);\r
632     copy.addActionListener(this);\r
633     editMenu.add(cut);\r
634     cut.addActionListener(this);\r
635 \r
636     editMenu.add(editSequence);\r
637     editSequence.addActionListener(this);\r
638 \r
639     editMenu.add(toUpper);\r
640     toUpper.addActionListener(this);\r
641     editMenu.add(toLower);\r
642     toLower.addActionListener(this);\r
643     editMenu.add(toggleCase);\r
644     seqMenu.add(sequenceName);\r
645     seqMenu.add(pdb);\r
646     seqMenu.add(repGroup);\r
647     menu1.add(unGroupMenuItem);\r
648     menu1.add(colourMenu);\r
649     menu1.add(showBoxes);\r
650     menu1.add(showText);\r
651     menu1.add(showColourText);\r
652     toggleCase.addActionListener(this);\r
653     pdb.addActionListener(this);\r
654     hideSeqs.addActionListener(this);\r
655     repGroup.addActionListener(this);\r
656     revealAll.addActionListener(this);\r
657   }\r
658 \r
659   void refresh()\r
660   {\r
661     ap.paintAlignment(true);\r
662   }\r
663 \r
664   protected void clustalColour_actionPerformed()\r
665   {\r
666     SequenceGroup sg = getGroup();\r
667     sg.cs = new ClustalxColourScheme(sg.getSequences(ap.av.hiddenRepSequences),\r
668                                      ap.av.alignment.getWidth());\r
669     refresh();\r
670   }\r
671 \r
672   protected void zappoColour_actionPerformed()\r
673   {\r
674     getGroup().cs = new ZappoColourScheme();\r
675     refresh();\r
676   }\r
677 \r
678   protected void taylorColour_actionPerformed()\r
679   {\r
680     getGroup().cs = new TaylorColourScheme();\r
681     refresh();\r
682   }\r
683 \r
684   protected void hydrophobicityColour_actionPerformed()\r
685   {\r
686     getGroup().cs = new HydrophobicColourScheme();\r
687     refresh();\r
688   }\r
689 \r
690   protected void helixColour_actionPerformed()\r
691   {\r
692     getGroup().cs = new HelixColourScheme();\r
693     refresh();\r
694   }\r
695 \r
696   protected void strandColour_actionPerformed()\r
697   {\r
698     getGroup().cs = new StrandColourScheme();\r
699     refresh();\r
700   }\r
701 \r
702   protected void turnColour_actionPerformed()\r
703   {\r
704     getGroup().cs = new TurnColourScheme();\r
705     refresh();\r
706   }\r
707 \r
708   protected void buriedColour_actionPerformed()\r
709   {\r
710     getGroup().cs = new BuriedColourScheme();\r
711     refresh();\r
712   }\r
713 \r
714   public void nucleotideMenuItem_actionPerformed()\r
715   {\r
716     getGroup().cs = new NucleotideColourScheme();\r
717     refresh();\r
718   }\r
719 \r
720   protected void abovePIDColour_itemStateChanged()\r
721   {\r
722     SequenceGroup sg = getGroup();\r
723     if (sg.cs == null)\r
724     {\r
725       return;\r
726     }\r
727 \r
728     if (abovePIDColour.getState())\r
729     {\r
730       sg.cs.setConsensus(AAFrequency.calculate(sg.getSequences(ap.av.\r
731           hiddenRepSequences), 0,\r
732                                                ap.av.alignment.getWidth()));\r
733       int threshold = SliderPanel.setPIDSliderSource(ap, sg.cs,\r
734           getGroup().getName());\r
735 \r
736       sg.cs.setThreshold(threshold, ap.av.getIgnoreGapsConsensus());\r
737 \r
738       SliderPanel.showPIDSlider();\r
739 \r
740     }\r
741     else // remove PIDColouring\r
742     {\r
743       sg.cs.setThreshold(0, ap.av.getIgnoreGapsConsensus());\r
744     }\r
745 \r
746     refresh();\r
747 \r
748   }\r
749 \r
750   protected void userDefinedColour_actionPerformed()\r
751   {\r
752     new UserDefinedColours(ap, getGroup());\r
753   }\r
754 \r
755   protected void PIDColour_actionPerformed()\r
756   {\r
757     SequenceGroup sg = getGroup();\r
758     sg.cs = new PIDColourScheme();\r
759     sg.cs.setConsensus(AAFrequency.calculate(sg.getSequences(ap.av.\r
760         hiddenRepSequences), 0,\r
761                                              ap.av.alignment.getWidth()));\r
762     refresh();\r
763   }\r
764 \r
765   protected void BLOSUM62Colour_actionPerformed()\r
766   {\r
767     SequenceGroup sg = getGroup();\r
768 \r
769     sg.cs = new Blosum62ColourScheme();\r
770 \r
771     sg.cs.setConsensus(AAFrequency.calculate(sg.getSequences(ap.av.\r
772         hiddenRepSequences), 0,\r
773                                              ap.av.alignment.getWidth()));\r
774 \r
775     refresh();\r
776   }\r
777 \r
778   protected void noColourmenuItem_actionPerformed()\r
779   {\r
780     getGroup().cs = null;\r
781     refresh();\r
782   }\r
783 \r
784   protected void conservationMenuItem_itemStateChanged()\r
785   {\r
786     SequenceGroup sg = getGroup();\r
787     if (sg.cs == null)\r
788     {\r
789       return;\r
790     }\r
791 \r
792     if (conservationMenuItem.getState())\r
793     {\r
794 \r
795       Conservation c = new Conservation("Group",\r
796                                         ResidueProperties.propHash, 3,\r
797                                         sg.getSequences(ap.av.\r
798           hiddenRepSequences), 0,\r
799                                         ap.av.alignment.getWidth());\r
800 \r
801       c.calculate();\r
802       c.verdict(false, ap.av.ConsPercGaps);\r
803 \r
804       sg.cs.setConservation(c);\r
805 \r
806       SliderPanel.setConservationSlider(ap, sg.cs, sg.getName());\r
807       SliderPanel.showConservationSlider();\r
808     }\r
809     else // remove ConservationColouring\r
810     {\r
811       sg.cs.setConservation(null);\r
812     }\r
813 \r
814     refresh();\r
815   }\r
816 \r
817   SequenceGroup getGroup()\r
818   {\r
819     SequenceGroup sg = ap.av.getSelectionGroup();\r
820 \r
821     // this method won't add a new group if it already exists\r
822     if (sg != null)\r
823     {\r
824       ap.av.alignment.addGroup(sg);\r
825     }\r
826 \r
827     return sg;\r
828   }\r
829 \r
830   void unGroupMenuItem_actionPerformed()\r
831   {\r
832     SequenceGroup sg = ap.av.getSelectionGroup();\r
833     ap.av.alignment.deleteGroup(sg);\r
834     ap.av.setSelectionGroup(null);\r
835     ap.paintAlignment(true);\r
836   }\r
837 \r
838   public void showColourText_itemStateChanged()\r
839   {\r
840     getGroup().setColourText(showColourText.getState());\r
841     refresh();\r
842   }\r
843 \r
844   public void showText_itemStateChanged()\r
845   {\r
846     getGroup().setDisplayText(showText.getState());\r
847     refresh();\r
848   }\r
849 \r
850   public void showBoxes_itemStateChanged()\r
851   {\r
852     getGroup().setDisplayBoxes(showBoxes.getState());\r
853     refresh();\r
854   }\r
855 \r
856   void hideSequences(boolean representGroup)\r
857   {\r
858     SequenceGroup sg = ap.av.getSelectionGroup();\r
859     if (sg == null || sg.getSize() < 1)\r
860     {\r
861       ap.av.hideSequence(new SequenceI[]\r
862                          {seq});\r
863       return;\r
864     }\r
865 \r
866     ap.av.setSelectionGroup(null);\r
867 \r
868     if (representGroup)\r
869     {\r
870       ap.av.hideRepSequences(seq, sg);\r
871 \r
872       return;\r
873     }\r
874 \r
875     int gsize = sg.getSize();\r
876     SequenceI[] hseqs;\r
877 \r
878     hseqs = new SequenceI[gsize];\r
879 \r
880     int index = 0;\r
881     for (int i = 0; i < gsize; i++)\r
882     {\r
883       hseqs[index++] = sg.getSequenceAt(i);\r
884     }\r
885 \r
886     ap.av.hideSequence(hseqs);\r
887   }\r
888 \r
889 }\r