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