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