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