GPL license added
[jalview.git] / src / jalview / gui / PopupMenu.java
1 /*\r
2 * Jalview - A Sequence Alignment Editor and Viewer\r
3 * Copyright (C) 2005 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.gui;\r
21 \r
22 import jalview.datamodel.*;\r
23 import jalview.analysis.*;\r
24 import jalview.schemes.*;\r
25 import java.awt.*;\r
26 import javax.swing.*;\r
27 import java.awt.event.*;\r
28 import jalview.io.*;\r
29 import MCview.*;\r
30 \r
31 public class PopupMenu extends JPopupMenu\r
32 {\r
33   JMenu groupMenu = new JMenu();\r
34   JMenuItem groupName = new JMenuItem();\r
35   protected JRadioButtonMenuItem clustalColour = new JRadioButtonMenuItem();\r
36   protected JRadioButtonMenuItem zappoColour = new JRadioButtonMenuItem();\r
37   protected JRadioButtonMenuItem taylorColour = new JRadioButtonMenuItem();\r
38   protected JRadioButtonMenuItem hydrophobicityColour = new JRadioButtonMenuItem();\r
39   protected JRadioButtonMenuItem helixColour = new JRadioButtonMenuItem();\r
40   protected JRadioButtonMenuItem strandColour = new JRadioButtonMenuItem();\r
41   protected JRadioButtonMenuItem turnColour = new JRadioButtonMenuItem();\r
42   protected JRadioButtonMenuItem buriedColour = new JRadioButtonMenuItem();\r
43   protected JCheckBoxMenuItem abovePIDColour = new JCheckBoxMenuItem();\r
44   protected JRadioButtonMenuItem userDefinedColour = new JRadioButtonMenuItem();\r
45   protected JRadioButtonMenuItem PIDColour = new JRadioButtonMenuItem();\r
46   protected JRadioButtonMenuItem BLOSUM62Colour = new JRadioButtonMenuItem();\r
47   JRadioButtonMenuItem noColourmenuItem = new JRadioButtonMenuItem();\r
48   protected JCheckBoxMenuItem conservationMenuItem = new JCheckBoxMenuItem();\r
49 \r
50 \r
51   AlignmentPanel ap;\r
52   JMenu sequenceMenu = new JMenu();\r
53   JMenuItem sequenceName = new JMenuItem();\r
54   Sequence sequence;\r
55   JMenuItem unGroupMenuItem = new JMenuItem();\r
56   JMenuItem pdbMenuItem = new JMenuItem();\r
57   JMenuItem outline = new JMenuItem();\r
58   JRadioButtonMenuItem nucleotideMenuItem = new JRadioButtonMenuItem();\r
59   JMenu colourMenu = new JMenu();\r
60   JCheckBoxMenuItem showBoxes = new JCheckBoxMenuItem();\r
61   JCheckBoxMenuItem showText = new JCheckBoxMenuItem();\r
62   JCheckBoxMenuItem showColourText = new JCheckBoxMenuItem();\r
63 \r
64   public PopupMenu(AlignmentPanel ap, Sequence seq)\r
65   {\r
66     ///////////////////////////////////////////////////////////\r
67     // If this is activated from the sequence panel, the user may want to\r
68     // edit or annotate a particular residue. Therefore display the residue menu\r
69     //\r
70     // If from the IDPanel, we must display the sequence menu\r
71     //////////////////////////////////////////////////////////\r
72 \r
73     this.ap = ap;\r
74     sequence = seq;\r
75 \r
76     ButtonGroup colours = new ButtonGroup();\r
77     colours.add(noColourmenuItem);\r
78     colours.add(clustalColour);\r
79     colours.add(zappoColour);\r
80     colours.add(taylorColour);\r
81     colours.add(hydrophobicityColour);\r
82     colours.add(helixColour);\r
83     colours.add(strandColour);\r
84     colours.add(turnColour);\r
85     colours.add(buriedColour);\r
86     colours.add(abovePIDColour);\r
87     colours.add(userDefinedColour);\r
88     colours.add(PIDColour);\r
89     colours.add(BLOSUM62Colour);\r
90 \r
91     try\r
92     {     jbInit();   }\r
93     catch(Exception e)\r
94     {    e.printStackTrace();    }\r
95 \r
96     SequenceGroup sg = ap.av.getSelectionGroup();\r
97     if(sg!=null)\r
98     {\r
99       groupName.setText(sg.getName());\r
100       if(sg.cs instanceof ZappoColourScheme)\r
101         zappoColour.setSelected(true);\r
102       else if(sg.cs instanceof TaylorColourScheme)\r
103         taylorColour.setSelected(true);\r
104       else if (sg.cs instanceof PIDColourScheme)\r
105         PIDColour.setSelected(true);\r
106       else if (sg.cs instanceof Blosum62ColourScheme)\r
107         BLOSUM62Colour.setSelected(true);\r
108       else if (sg.cs instanceof UserColourScheme)\r
109         userDefinedColour.setSelected(true);\r
110       else if (sg.cs instanceof HydrophobicColourScheme)\r
111         hydrophobicityColour.setSelected(true);\r
112       else if (sg.cs instanceof HelixColourScheme)\r
113         helixColour.setSelected(true);\r
114       else if (sg.cs instanceof StrandColourScheme)\r
115         strandColour.setSelected(true);\r
116       else if (sg.cs instanceof TurnColourScheme)\r
117         turnColour.setSelected(true);\r
118       else if (sg.cs instanceof BuriedColourScheme)\r
119         buriedColour.setSelected(true);\r
120       else if (sg.cs instanceof ClustalxColourScheme)\r
121         clustalColour.setSelected(true);\r
122       else\r
123         noColourmenuItem.setSelected(true);\r
124 \r
125       if (sg.cs instanceof ConservationColourScheme)\r
126         conservationMenuItem.setSelected(true);\r
127 \r
128       showText.setSelected(sg.getDisplayText());\r
129       showColourText.setSelected(sg.getColourText());\r
130       showBoxes.setSelected(sg.getDisplayBoxes());\r
131     }\r
132 \r
133     if( !ap.av.alignment.getGroups().contains(sg))\r
134       unGroupMenuItem.setVisible(false);\r
135     else\r
136       groupMenu.insertSeparator(3);\r
137 \r
138     if(seq==null)\r
139        sequenceMenu.setVisible(false);\r
140 \r
141   }\r
142   private void jbInit() throws Exception\r
143   {\r
144     groupMenu.setText("Group");\r
145     groupMenu.setText("Define");\r
146     groupName.setText("Name");\r
147     groupName.addActionListener(new java.awt.event.ActionListener()\r
148     {\r
149       public void actionPerformed(ActionEvent e)\r
150       {\r
151         groupName_actionPerformed(e);\r
152       }\r
153     });\r
154     sequenceMenu.setText("Sequence");\r
155     sequenceName.setText("Edit name");\r
156     sequenceName.addActionListener(new java.awt.event.ActionListener()\r
157     {\r
158       public void actionPerformed(ActionEvent e)\r
159       {\r
160         sequenceName_actionPerformed(e);\r
161       }\r
162     });\r
163     PIDColour.setFocusPainted(false);\r
164     unGroupMenuItem.setText("Remove Group");\r
165     unGroupMenuItem.addActionListener(new java.awt.event.ActionListener()\r
166     {\r
167       public void actionPerformed(ActionEvent e)\r
168       {\r
169         unGroupMenuItem_actionPerformed(e);\r
170       }\r
171     });\r
172     pdbMenuItem.setText("View PDB structure");\r
173     pdbMenuItem.addActionListener(new java.awt.event.ActionListener()\r
174     {\r
175       public void actionPerformed(ActionEvent e)\r
176       {\r
177         pdbMenuItem_actionPerformed(e);\r
178       }\r
179     });\r
180     outline.setText("Border colour");\r
181     outline.addActionListener(new java.awt.event.ActionListener()\r
182     {\r
183       public void actionPerformed(ActionEvent e)\r
184       {\r
185         outline_actionPerformed(e);\r
186       }\r
187     });\r
188     nucleotideMenuItem.setText("Nucleotide");\r
189     nucleotideMenuItem.addActionListener(new ActionListener()\r
190     {\r
191       public void actionPerformed(ActionEvent e)\r
192       {\r
193         nucleotideMenuItem_actionPerformed(e);\r
194       }\r
195     });\r
196     colourMenu.setText("Group Colour");\r
197     showBoxes.setText("Boxes");\r
198     showBoxes.setState(true);\r
199     showBoxes.addActionListener(new ActionListener()\r
200     {\r
201       public void actionPerformed(ActionEvent e)\r
202       {\r
203         showBoxes_actionPerformed(e);\r
204       }\r
205     });\r
206     showText.setText("Text");\r
207     showText.setState(true);\r
208     showText.addActionListener(new ActionListener()\r
209     {\r
210       public void actionPerformed(ActionEvent e)\r
211       {\r
212         showText_actionPerformed(e);\r
213       }\r
214     });\r
215     showColourText.setText("Colour Text");\r
216     showColourText.addActionListener(new ActionListener()\r
217     {\r
218       public void actionPerformed(ActionEvent e)\r
219       {\r
220         showColourText_actionPerformed(e);\r
221       }\r
222     });\r
223     add(groupMenu);\r
224     add(sequenceMenu);\r
225     groupMenu.add(groupName);\r
226     groupMenu.addSeparator();\r
227     groupMenu.add(unGroupMenuItem);\r
228     groupMenu.add(colourMenu);\r
229     groupMenu.addSeparator();\r
230     groupMenu.add(showBoxes);\r
231     groupMenu.add(showText);\r
232     groupMenu.add(showColourText);\r
233     groupMenu.addSeparator();\r
234     groupMenu.add(outline);\r
235     sequenceMenu.add(sequenceName);\r
236     sequenceMenu.add(pdbMenuItem);\r
237     colourMenu.add(noColourmenuItem);\r
238     colourMenu.add(clustalColour);\r
239     colourMenu.add(BLOSUM62Colour);\r
240     colourMenu.add(PIDColour);\r
241     colourMenu.add(zappoColour);\r
242     colourMenu.add(taylorColour);\r
243     colourMenu.add(hydrophobicityColour);\r
244     colourMenu.add(helixColour);\r
245     colourMenu.add(strandColour);\r
246     colourMenu.add(turnColour);\r
247     colourMenu.add(buriedColour);\r
248     colourMenu.add(nucleotideMenuItem);\r
249     colourMenu.add(userDefinedColour);\r
250     colourMenu.addSeparator();\r
251     colourMenu.add(abovePIDColour);\r
252     colourMenu.add(conservationMenuItem);\r
253     noColourmenuItem.setText("None");\r
254     noColourmenuItem.addActionListener(new java.awt.event.ActionListener()\r
255     {\r
256       public void actionPerformed(ActionEvent e)\r
257       {\r
258         noColourmenuItem_actionPerformed(e);\r
259       }\r
260     });\r
261 \r
262     clustalColour.setText("Clustalx colours");\r
263     clustalColour.addActionListener(new java.awt.event.ActionListener()\r
264     {\r
265       public void actionPerformed(ActionEvent e)\r
266       {\r
267         clustalColour_actionPerformed(e);\r
268       }\r
269     });\r
270     zappoColour.setText("Zappo");\r
271     zappoColour.addActionListener(new java.awt.event.ActionListener()\r
272     {\r
273       public void actionPerformed(ActionEvent e)\r
274       {\r
275         zappoColour_actionPerformed(e);\r
276       }\r
277     });\r
278     taylorColour.setText("Taylor");\r
279     taylorColour.addActionListener(new java.awt.event.ActionListener()\r
280     {\r
281       public void actionPerformed(ActionEvent e)\r
282       {\r
283         taylorColour_actionPerformed(e);\r
284       }\r
285     });\r
286     hydrophobicityColour.setText("Hydrophobicity");\r
287     hydrophobicityColour.addActionListener(new java.awt.event.ActionListener()\r
288     {\r
289       public void actionPerformed(ActionEvent e)\r
290       {\r
291         hydrophobicityColour_actionPerformed(e);\r
292       }\r
293     });\r
294     helixColour.setText("Helix propensity");\r
295     helixColour.addActionListener(new java.awt.event.ActionListener()\r
296     {\r
297       public void actionPerformed(ActionEvent e)\r
298       {\r
299         helixColour_actionPerformed(e);\r
300       }\r
301     });\r
302     strandColour.setText("Strand propensity");\r
303     strandColour.addActionListener(new java.awt.event.ActionListener()\r
304     {\r
305       public void actionPerformed(ActionEvent e)\r
306       {\r
307         strandColour_actionPerformed(e);\r
308       }\r
309     });\r
310     turnColour.setText("Turn propensity");\r
311     turnColour.addActionListener(new java.awt.event.ActionListener()\r
312     {\r
313       public void actionPerformed(ActionEvent e)\r
314       {\r
315         turnColour_actionPerformed(e);\r
316       }\r
317     });\r
318     buriedColour.setText("Buried Index");\r
319     buriedColour.addActionListener(new java.awt.event.ActionListener()\r
320     {\r
321       public void actionPerformed(ActionEvent e)\r
322       {\r
323         buriedColour_actionPerformed(e);\r
324       }\r
325     });\r
326     abovePIDColour.setText("Above % Identity");\r
327     abovePIDColour.addActionListener(new java.awt.event.ActionListener()\r
328     {\r
329       public void actionPerformed(ActionEvent e)\r
330       {\r
331         abovePIDColour_actionPerformed(e);\r
332       }\r
333     });\r
334     userDefinedColour.setText("User Defined");\r
335     userDefinedColour.addActionListener(new java.awt.event.ActionListener()\r
336     {\r
337       public void actionPerformed(ActionEvent e)\r
338       {\r
339         userDefinedColour_actionPerformed(e);\r
340       }\r
341     });\r
342     PIDColour.setText("Percentage Identity");\r
343     PIDColour.addActionListener(new java.awt.event.ActionListener()\r
344     {\r
345       public void actionPerformed(ActionEvent e)\r
346       {\r
347         PIDColour_actionPerformed(e);\r
348       }\r
349     });\r
350     BLOSUM62Colour.setText("BLOSUM62");\r
351     BLOSUM62Colour.addActionListener(new java.awt.event.ActionListener()\r
352     {\r
353       public void actionPerformed(ActionEvent e)\r
354       {\r
355         BLOSUM62Colour_actionPerformed(e);\r
356       }\r
357     });\r
358     conservationMenuItem.setText("Conservation");\r
359    conservationMenuItem.addActionListener(new java.awt.event.ActionListener()\r
360    {\r
361      public void actionPerformed(ActionEvent e)\r
362      {\r
363        conservationMenuItem_actionPerformed(e);\r
364      }\r
365    });\r
366 \r
367 \r
368 \r
369   }\r
370 \r
371   void refresh()\r
372   {\r
373     SequenceGroup sg = getGroup();\r
374     SuperGroup superG = ap.av.alignment.getSuperGroup( sg );\r
375     if( superG !=null)\r
376       superG.setSuperGroupProperties( sg );\r
377 \r
378     ap.seqPanel.repaint();\r
379   }\r
380 \r
381   protected void clustalColour_actionPerformed(ActionEvent e)\r
382   {\r
383     SequenceGroup sg = getGroup();\r
384     sg.cs = new ClustalxColourScheme(sg.sequences, ap.av.alignment.getWidth());\r
385     refresh();\r
386   }\r
387 \r
388   protected void zappoColour_actionPerformed(ActionEvent e)\r
389   {\r
390     getGroup().cs = new ZappoColourScheme();\r
391     refresh();\r
392   }\r
393 \r
394   protected void taylorColour_actionPerformed(ActionEvent e)\r
395   {\r
396     getGroup().cs = new TaylorColourScheme();\r
397     refresh();\r
398   }\r
399 \r
400 \r
401   protected void hydrophobicityColour_actionPerformed(ActionEvent e)\r
402   {\r
403     getGroup().cs = new HydrophobicColourScheme();\r
404     refresh();\r
405   }\r
406 \r
407   protected void helixColour_actionPerformed(ActionEvent e)\r
408   {\r
409     getGroup().cs = new HelixColourScheme();\r
410     refresh();\r
411   }\r
412 \r
413   protected void strandColour_actionPerformed(ActionEvent e)\r
414   {\r
415     getGroup().cs = new StrandColourScheme();\r
416     refresh();\r
417   }\r
418 \r
419   protected void turnColour_actionPerformed(ActionEvent e)\r
420   {\r
421     getGroup().cs = new TurnColourScheme();\r
422     refresh();\r
423   }\r
424 \r
425   protected void buriedColour_actionPerformed(ActionEvent e)\r
426   {\r
427     getGroup().cs = new BuriedColourScheme();\r
428     refresh();\r
429   }\r
430 \r
431   public void nucleotideMenuItem_actionPerformed(ActionEvent e)\r
432   {\r
433     getGroup().cs = new NucleotideColourScheme();\r
434     refresh();\r
435   }\r
436 \r
437 \r
438 \r
439   protected void abovePIDColour_actionPerformed(ActionEvent e)\r
440   {\r
441     SequenceGroup sg = getGroup();\r
442     if (abovePIDColour.isSelected())\r
443     {\r
444       sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0,\r
445                                                ap.av.alignment.getWidth()));\r
446       int threshold = SliderPanel.setPIDSliderSource(ap, sg.cs, getGroup().getName());\r
447       if (sg.cs instanceof ResidueColourScheme)\r
448         ( (ResidueColourScheme)sg. cs).setThreshold(threshold);\r
449       else if (sg.cs instanceof ScoreColourScheme)\r
450         ( (ScoreColourScheme) sg.cs).setThreshold(threshold);\r
451 \r
452       SliderPanel.showPIDSlider();\r
453 \r
454 \r
455     }\r
456     else // remove PIDColouring\r
457     {\r
458       ResidueColourScheme rcs = (ResidueColourScheme) sg.cs;\r
459       rcs.setThreshold(0);\r
460       sg.cs = rcs;\r
461     }\r
462 \r
463     refresh();\r
464 \r
465   }\r
466 \r
467 \r
468   protected void userDefinedColour_actionPerformed(ActionEvent e)\r
469   {\r
470     new UserDefinedColours( ap, getGroup());\r
471   }\r
472 \r
473   protected void PIDColour_actionPerformed(ActionEvent e)\r
474   {\r
475     SequenceGroup sg = getGroup();\r
476     sg.cs = new PIDColourScheme();\r
477     sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0,\r
478                                                ap.av.alignment.getWidth()));\r
479     refresh();\r
480   }\r
481 \r
482   protected void BLOSUM62Colour_actionPerformed(ActionEvent e)\r
483   {\r
484     SequenceGroup sg = getGroup();\r
485 \r
486     sg.cs = new Blosum62ColourScheme();\r
487 \r
488     sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0,\r
489                                                ap.av.alignment.getWidth()));\r
490 \r
491     refresh();\r
492   }\r
493 \r
494 \r
495   protected void noColourmenuItem_actionPerformed(ActionEvent e)\r
496   {\r
497     getGroup().cs = null;\r
498     refresh();\r
499   }\r
500 \r
501   protected  void conservationMenuItem_actionPerformed(ActionEvent e)\r
502   {\r
503     SequenceGroup sg = getGroup();\r
504 \r
505     if(conservationMenuItem.isSelected())\r
506     {\r
507 \r
508         Conservation c = new Conservation("Group",\r
509                                           ResidueProperties.propHash, 3,\r
510                                           sg.sequences, 0,\r
511                                           ap.av.alignment.getWidth());\r
512 \r
513         c.calculate();\r
514         c.verdict(false, ap.av.ConsPercGaps);\r
515         ConservationColourScheme ccs = new ConservationColourScheme(c, sg.cs);\r
516 \r
517 \r
518       sg.cs = ccs;\r
519 \r
520       SliderPanel.setConservationSlider(ap, ccs, sg.getName());\r
521       SliderPanel.showConservationSlider();\r
522     }\r
523     else // remove ConservationColouring\r
524     {\r
525         ConservationColourScheme ccs = (ConservationColourScheme)sg.cs;\r
526         sg.cs = ccs.cs;\r
527     }\r
528 \r
529      refresh();\r
530   }\r
531 \r
532 \r
533   protected void groupName_actionPerformed(ActionEvent e)\r
534   {\r
535     SequenceGroup sg = getGroup();\r
536     String reply = JOptionPane.showInternalInputDialog(Desktop.desktop, "Enter new group name", "Edit group name", JOptionPane.QUESTION_MESSAGE);\r
537     if(reply==null)\r
538       return;\r
539 \r
540     sg.setName(reply);\r
541     groupName.setText(reply);\r
542   }\r
543 \r
544 \r
545   protected void analyze_actionPerformed(ActionEvent e)\r
546   {\r
547      CutAndPasteTransfer cap = new CutAndPasteTransfer();\r
548      JInternalFrame frame = new JInternalFrame();\r
549      frame.setContentPane(cap);\r
550      Desktop.addInternalFrame(frame, "Analyze this - ", 400, 300);\r
551      SequenceGroup sg = getGroup();\r
552      StringBuffer sb = new StringBuffer();\r
553 \r
554      for(int i=0; i<sg.sequences.size(); i++)\r
555      {\r
556        Sequence tmp = (Sequence)sg.sequences.get(i);\r
557        sb.append(  tmp.getSequence(sg.getStartRes(), sg.getEndRes()+1));\r
558        sb.append("\n");\r
559      }\r
560 \r
561      sb.append("Something amazing will happen soon");\r
562      cap.setText( sb.toString() );\r
563 \r
564   }\r
565 \r
566   SequenceGroup getGroup()\r
567   {\r
568     SequenceGroup sg = ap.av.getSelectionGroup();\r
569 \r
570     // this method won't add a new group if it already exists\r
571     ap.av.alignment.addGroup(sg);\r
572 \r
573     return sg;\r
574   }\r
575 \r
576   void sequenceName_actionPerformed(ActionEvent e)\r
577   {\r
578     String id = sequence.getName();\r
579     String s = (String)JOptionPane.showInternalInputDialog(\r
580                 ap,\r
581                 "Edit sequence name",\r
582                 "Edit sequence name ("+sequence.getName()+")",\r
583                 JOptionPane.PLAIN_MESSAGE,\r
584                 null,\r
585                 null,\r
586                 id);\r
587 \r
588     if(s!=null)\r
589     {\r
590       sequence.setName(s);\r
591       ap.repaint();\r
592     }\r
593 \r
594   }\r
595 \r
596   void unGroupMenuItem_actionPerformed(ActionEvent e)\r
597   {\r
598      SequenceGroup sg = ap.av.getSelectionGroup();\r
599      ap.av.alignment.deleteGroup(sg);\r
600      ap.av.setSelectionGroup(null);\r
601      ap.repaint();\r
602   }\r
603 \r
604   void pdbMenuItem_actionPerformed(ActionEvent e)\r
605   {\r
606     if(sequence.getPDBId()==null)\r
607       return;\r
608 \r
609     try\r
610     {\r
611       EBIFetchClient ebi = new EBIFetchClient();\r
612       String[] result = ebi.fetchData("pdb:" + sequence.getPDBId(), null, null);\r
613 \r
614       PDBfile pdb = new PDBfile(result);\r
615 \r
616       rotCanvas rc = new rotCanvas(pdb, sequence, ap.av);\r
617       JInternalFrame frame = new JInternalFrame();\r
618       frame.setContentPane(rc);\r
619       Desktop.addInternalFrame(frame,sequence.getName()+" "+ sequence.getPDBId(), 400, 400);\r
620     }\r
621     catch (Exception ex)\r
622     {\r
623       ex.printStackTrace();\r
624     }\r
625   }\r
626 \r
627   protected void outline_actionPerformed(ActionEvent e)\r
628   {\r
629     SequenceGroup sg = getGroup();\r
630     Color col = JColorChooser.showDialog(this, "Select Outline Colour", Color.BLUE);\r
631     if(col!=null)\r
632       sg.setOutlineColour(col);\r
633     ap.repaint();\r
634   }\r
635 \r
636   public void showBoxes_actionPerformed(ActionEvent e)\r
637   {\r
638     getGroup().setDisplayBoxes(showBoxes.isSelected());\r
639     refresh();\r
640   }\r
641 \r
642   public void showText_actionPerformed(ActionEvent e)\r
643   {\r
644     getGroup().setDisplayText(showText.isSelected());\r
645     refresh();\r
646   }\r
647 \r
648   public void showColourText_actionPerformed(ActionEvent e)\r
649   {\r
650     getGroup().setColourText(showColourText.isSelected());\r
651     refresh();\r
652   }\r
653 \r
654 }\r