Use paintAlignment
[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.paintAlignment(false);\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.paintAlignment(true);\r
565   }\r
566 \r
567   protected void clustalColour_actionPerformed()\r
568   {\r
569     SequenceGroup sg = getGroup();\r
570     sg.cs = new ClustalxColourScheme(sg.getSequences(ap.av.hiddenRepSequences),\r
571                                      ap.av.alignment.getWidth());\r
572     refresh();\r
573   }\r
574 \r
575   protected void zappoColour_actionPerformed()\r
576   {\r
577     getGroup().cs = new ZappoColourScheme();\r
578     refresh();\r
579   }\r
580 \r
581   protected void taylorColour_actionPerformed()\r
582   {\r
583     getGroup().cs = new TaylorColourScheme();\r
584     refresh();\r
585   }\r
586 \r
587   protected void hydrophobicityColour_actionPerformed()\r
588   {\r
589     getGroup().cs = new HydrophobicColourScheme();\r
590     refresh();\r
591   }\r
592 \r
593   protected void helixColour_actionPerformed()\r
594   {\r
595     getGroup().cs = new HelixColourScheme();\r
596     refresh();\r
597   }\r
598 \r
599   protected void strandColour_actionPerformed()\r
600   {\r
601     getGroup().cs = new StrandColourScheme();\r
602     refresh();\r
603   }\r
604 \r
605   protected void turnColour_actionPerformed()\r
606   {\r
607     getGroup().cs = new TurnColourScheme();\r
608     refresh();\r
609   }\r
610 \r
611   protected void buriedColour_actionPerformed()\r
612   {\r
613     getGroup().cs = new BuriedColourScheme();\r
614     refresh();\r
615   }\r
616 \r
617   public void nucleotideMenuItem_actionPerformed()\r
618   {\r
619     getGroup().cs = new NucleotideColourScheme();\r
620     refresh();\r
621   }\r
622 \r
623   protected void abovePIDColour_itemStateChanged()\r
624   {\r
625     SequenceGroup sg = getGroup();\r
626     if (sg.cs == null)\r
627     {\r
628       return;\r
629     }\r
630 \r
631     if (abovePIDColour.getState())\r
632     {\r
633       sg.cs.setConsensus(AAFrequency.calculate(sg.getSequences(ap.av.\r
634           hiddenRepSequences), 0,\r
635                                                ap.av.alignment.getWidth()));\r
636       int threshold = SliderPanel.setPIDSliderSource(ap, sg.cs,\r
637           getGroup().getName());\r
638 \r
639       sg.cs.setThreshold(threshold, ap.av.getIgnoreGapsConsensus());\r
640 \r
641       SliderPanel.showPIDSlider();\r
642 \r
643     }\r
644     else // remove PIDColouring\r
645     {\r
646       sg.cs.setThreshold(0, ap.av.getIgnoreGapsConsensus());\r
647     }\r
648 \r
649     refresh();\r
650 \r
651   }\r
652 \r
653   protected void userDefinedColour_actionPerformed()\r
654   {\r
655     new UserDefinedColours(ap, getGroup());\r
656   }\r
657 \r
658   protected void PIDColour_actionPerformed()\r
659   {\r
660     SequenceGroup sg = getGroup();\r
661     sg.cs = new PIDColourScheme();\r
662     sg.cs.setConsensus(AAFrequency.calculate(sg.getSequences(ap.av.\r
663         hiddenRepSequences), 0,\r
664                                              ap.av.alignment.getWidth()));\r
665     refresh();\r
666   }\r
667 \r
668   protected void BLOSUM62Colour_actionPerformed()\r
669   {\r
670     SequenceGroup sg = getGroup();\r
671 \r
672     sg.cs = new Blosum62ColourScheme();\r
673 \r
674     sg.cs.setConsensus(AAFrequency.calculate(sg.getSequences(ap.av.\r
675         hiddenRepSequences), 0,\r
676                                              ap.av.alignment.getWidth()));\r
677 \r
678     refresh();\r
679   }\r
680 \r
681   protected void noColourmenuItem_actionPerformed()\r
682   {\r
683     getGroup().cs = null;\r
684     refresh();\r
685   }\r
686 \r
687   protected void conservationMenuItem_itemStateChanged()\r
688   {\r
689     SequenceGroup sg = getGroup();\r
690     if (sg.cs == null)\r
691     {\r
692       return;\r
693     }\r
694 \r
695     if (conservationMenuItem.getState())\r
696     {\r
697 \r
698       Conservation c = new Conservation("Group",\r
699                                         ResidueProperties.propHash, 3,\r
700                                         sg.getSequences(ap.av.\r
701           hiddenRepSequences), 0,\r
702                                         ap.av.alignment.getWidth());\r
703 \r
704       c.calculate();\r
705       c.verdict(false, ap.av.ConsPercGaps);\r
706 \r
707       sg.cs.setConservation(c);\r
708 \r
709       SliderPanel.setConservationSlider(ap, sg.cs, sg.getName());\r
710       SliderPanel.showConservationSlider();\r
711     }\r
712     else // remove ConservationColouring\r
713     {\r
714       sg.cs.setConservation(null);\r
715     }\r
716 \r
717     refresh();\r
718   }\r
719 \r
720   SequenceGroup getGroup()\r
721   {\r
722     SequenceGroup sg = ap.av.getSelectionGroup();\r
723 \r
724     // this method won't add a new group if it already exists\r
725     if (sg != null)\r
726     {\r
727       ap.av.alignment.addGroup(sg);\r
728     }\r
729 \r
730     return sg;\r
731   }\r
732 \r
733   void unGroupMenuItem_actionPerformed()\r
734   {\r
735     SequenceGroup sg = ap.av.getSelectionGroup();\r
736     ap.av.alignment.deleteGroup(sg);\r
737     ap.av.setSelectionGroup(null);\r
738     ap.paintAlignment(true);\r
739   }\r
740 \r
741   public void showColourText_itemStateChanged()\r
742   {\r
743     getGroup().setColourText(showColourText.getState());\r
744     refresh();\r
745   }\r
746 \r
747   public void showText_itemStateChanged()\r
748   {\r
749     getGroup().setDisplayText(showText.getState());\r
750     refresh();\r
751   }\r
752 \r
753   public void showBoxes_itemStateChanged()\r
754   {\r
755     getGroup().setDisplayBoxes(showBoxes.getState());\r
756     refresh();\r
757   }\r
758 \r
759   void hideSequences(boolean representGroup)\r
760   {\r
761     SequenceGroup sg = ap.av.getSelectionGroup();\r
762     if (sg == null || sg.getSize() < 1)\r
763     {\r
764       ap.av.hideSequence(new SequenceI[]\r
765                          {seq});\r
766       return;\r
767     }\r
768 \r
769     ap.av.setSelectionGroup(null);\r
770 \r
771     if (representGroup)\r
772     {\r
773       ap.av.hideRepSequences(seq, sg);\r
774 \r
775       return;\r
776     }\r
777 \r
778     int gsize = sg.getSize();\r
779     SequenceI[] hseqs;\r
780 \r
781     hseqs = new SequenceI[gsize];\r
782 \r
783     int index = 0;\r
784     for (int i = 0; i < gsize; i++)\r
785     {\r
786       hseqs[index++] = sg.getSequenceAt(i);\r
787     }\r
788 \r
789     ap.av.hideSequence(hseqs);\r
790   }\r
791 \r
792 }\r