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