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