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