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