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