All colours added to Structure viewer
[jalview.git] / src / MCview / PDBViewer.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 package MCview;\r
20 \r
21 import javax.swing.*;\r
22 import java.awt.event.*;\r
23 import jalview.datamodel.*;\r
24 import jalview.schemes.*;\r
25 import jalview.gui.*;\r
26 import jalview.io.EBIFetchClient;\r
27 import java.awt.event.ActionListener;\r
28 import java.awt.event.ActionEvent;\r
29 \r
30 public class PDBViewer extends JInternalFrame implements Runnable\r
31 {\r
32   PDBEntry pdb;\r
33   Sequence sequence;\r
34   PDBCanvas pdbcanvas;\r
35 \r
36 \r
37   public PDBViewer(PDBEntry entry,\r
38                    Sequence seq,\r
39                    SeqCanvas seqcanvas)\r
40   {\r
41     /*Uncomment this to modify in Jbuilder\r
42     try\r
43     {\r
44       jbInit();\r
45     }\r
46     catch (Exception ex)\r
47     {\r
48       ex.printStackTrace();\r
49     }*/\r
50 \r
51 \r
52     pdb = entry;\r
53     sequence = seq;\r
54 \r
55     Thread worker = new Thread(this);\r
56     worker.start();\r
57 \r
58     pdbcanvas = new PDBCanvas(seqcanvas, seq);\r
59 \r
60     setContentPane(pdbcanvas);\r
61     StringBuffer title = new StringBuffer(sequence.getName() + ":" + pdb.getId());\r
62     if(pdb.getProperty()!=null)\r
63     {\r
64       title.append( " Method: " );\r
65       title.append(pdb.getProperty().get("method"));\r
66       title.append( " Chain:" );\r
67       title.append( pdb.getProperty().get("chains"));\r
68     }\r
69 \r
70      Desktop.addInternalFrame(this,title.toString(),400, 400);\r
71   }\r
72 \r
73   public void run()\r
74   {\r
75     try\r
76     {\r
77       EBIFetchClient ebi = new EBIFetchClient();\r
78       String[] result = ebi.fetchData("pdb:" + pdb.getId(), "default","raw");\r
79 \r
80       PDBfile pdbfile = new PDBfile(result);\r
81 \r
82       pdbcanvas.setPDBFile(pdbfile);\r
83 \r
84       try\r
85       {\r
86         jbInit();\r
87       }\r
88       catch (Exception ex)\r
89       {\r
90         ex.printStackTrace();\r
91       }\r
92     }\r
93     catch (Exception ex)\r
94     {\r
95       ex.printStackTrace();\r
96     }\r
97   }\r
98 \r
99   private void jbInit()\r
100       throws Exception\r
101   {\r
102     this.addKeyListener(new KeyAdapter()\r
103         {\r
104             public void keyPressed(KeyEvent evt)\r
105             {\r
106               pdbcanvas.keyPressed(evt);\r
107             }\r
108         });\r
109 \r
110     this.setJMenuBar(jMenuBar1);\r
111     fileMenu.setText("File");\r
112     coloursMenu.setText("Colours");\r
113     saveMenu.setActionCommand("Save Image");\r
114     saveMenu.setText("Save As");\r
115     png.setText("PNG");\r
116     png.addActionListener(new ActionListener()\r
117     {\r
118       public void actionPerformed(ActionEvent e)\r
119       {\r
120         png_actionPerformed(e);\r
121       }\r
122     });\r
123     eps.setText("EPS");\r
124     eps.addActionListener(new ActionListener()\r
125     {\r
126       public void actionPerformed(ActionEvent e)\r
127       {\r
128         eps_actionPerformed(e);\r
129       }\r
130     });\r
131     mapping.setText("View Mapping");\r
132     mapping.addActionListener(new ActionListener()\r
133     {\r
134       public void actionPerformed(ActionEvent e)\r
135       {\r
136         mapping_actionPerformed(e);\r
137       }\r
138     });\r
139     wire.setText("Wireframe");\r
140     wire.addActionListener(new ActionListener()\r
141     {\r
142       public void actionPerformed(ActionEvent e)\r
143       {\r
144         wire_actionPerformed(e);\r
145       }\r
146     });\r
147     depth.setSelected(true);\r
148     depth.setText("Depthcue");\r
149     depth.addActionListener(new ActionListener()\r
150     {\r
151       public void actionPerformed(ActionEvent e)\r
152       {\r
153         depth_actionPerformed(e);\r
154       }\r
155     });\r
156     zbuffer.setSelected(true);\r
157     zbuffer.setText("Z Buffering");\r
158     zbuffer.addActionListener(new ActionListener()\r
159     {\r
160       public void actionPerformed(ActionEvent e)\r
161       {\r
162         zbuffer_actionPerformed(e);\r
163       }\r
164     });\r
165     charge.setText("Charge & Cysteine");\r
166     charge.addActionListener(new ActionListener()\r
167     {\r
168       public void actionPerformed(ActionEvent e)\r
169       {\r
170         charge_actionPerformed(e);\r
171       }\r
172     });\r
173     chain.setText("By Chain");\r
174     chain.addActionListener(new ActionListener()\r
175     {\r
176       public void actionPerformed(ActionEvent e)\r
177       {\r
178         chain_actionPerformed(e);\r
179       }\r
180     });\r
181     seqButton.setSelected(true);\r
182     seqButton.setText("By Sequence");\r
183     seqButton.addActionListener(new ActionListener()\r
184     {\r
185       public void actionPerformed(ActionEvent e)\r
186       {\r
187         seqButton_actionPerformed(e);\r
188       }\r
189     });\r
190     allchains.setSelected(true);\r
191     allchains.setText("Show All Chains");\r
192     allchains.addItemListener(new ItemListener()\r
193     {\r
194       public void itemStateChanged(ItemEvent e)\r
195       {\r
196         allchains_itemStateChanged(e);\r
197       }\r
198     });\r
199     zappo.setText("Zappo");\r
200     zappo.addActionListener(new ActionListener()\r
201     {\r
202       public void actionPerformed(ActionEvent e)\r
203       {\r
204         zappo_actionPerformed(e);\r
205       }\r
206     });\r
207     taylor.setText("Taylor");\r
208     taylor.addActionListener(new ActionListener()\r
209     {\r
210       public void actionPerformed(ActionEvent e)\r
211       {\r
212         taylor_actionPerformed(e);\r
213       }\r
214     });\r
215     hydro.setText("Hydro");\r
216     hydro.addActionListener(new ActionListener()\r
217     {\r
218       public void actionPerformed(ActionEvent e)\r
219       {\r
220         hydro_actionPerformed(e);\r
221       }\r
222     });\r
223     helix.setText("Helix");\r
224     helix.addActionListener(new ActionListener()\r
225     {\r
226       public void actionPerformed(ActionEvent e)\r
227       {\r
228         helix_actionPerformed(e);\r
229       }\r
230     });\r
231     strand.setText("Strand");\r
232     strand.addActionListener(new ActionListener()\r
233     {\r
234       public void actionPerformed(ActionEvent e)\r
235       {\r
236         strand_actionPerformed(e);\r
237       }\r
238     });\r
239     turn.setText("Turn");\r
240     turn.addActionListener(new ActionListener()\r
241     {\r
242       public void actionPerformed(ActionEvent e)\r
243       {\r
244         turn_actionPerformed(e);\r
245       }\r
246     });\r
247     buried.setText("Buried");\r
248     buried.addActionListener(new ActionListener()\r
249     {\r
250       public void actionPerformed(ActionEvent e)\r
251       {\r
252         buried_actionPerformed(e);\r
253       }\r
254     });\r
255     user.setText("User Defined...");\r
256     user.addActionListener(new ActionListener()\r
257     {\r
258       public void actionPerformed(ActionEvent e)\r
259       {\r
260         user_actionPerformed(e);\r
261       }\r
262     });\r
263     viewMenu.setText("View");\r
264     jMenuBar1.add(fileMenu);\r
265     jMenuBar1.add(coloursMenu);\r
266     jMenuBar1.add(viewMenu);\r
267     fileMenu.add(saveMenu);\r
268     fileMenu.add(mapping);\r
269     saveMenu.add(png);\r
270     saveMenu.add(eps);\r
271     coloursMenu.add(seqButton);\r
272     coloursMenu.add(chain);\r
273     coloursMenu.add(charge);\r
274     coloursMenu.add(zappo);\r
275     coloursMenu.add(taylor);\r
276     coloursMenu.add(hydro);\r
277     coloursMenu.add(helix);\r
278     coloursMenu.add(strand);\r
279     coloursMenu.add(turn);\r
280     coloursMenu.add(buried);\r
281     coloursMenu.add(user);\r
282     ButtonGroup bg = new ButtonGroup();\r
283     bg.add(seqButton);\r
284     bg.add(chain);\r
285     bg.add(charge);\r
286     bg.add(zappo);\r
287     bg.add(taylor);\r
288     bg.add(hydro);\r
289     bg.add(helix);\r
290     bg.add(strand);\r
291     bg.add(turn);\r
292     bg.add(buried);\r
293     bg.add(user);\r
294 \r
295 \r
296     if(jalview.gui.UserDefinedColours.getUserColourSchemes()!=null)\r
297     {\r
298       java.util.Enumeration userColours = jalview.gui.UserDefinedColours.\r
299           getUserColourSchemes().keys();\r
300 \r
301       while (userColours.hasMoreElements())\r
302       {\r
303         final JRadioButtonMenuItem radioItem = new JRadioButtonMenuItem(userColours.\r
304             nextElement().toString());\r
305         radioItem.setName("USER_DEFINED");\r
306         radioItem.addMouseListener(new MouseAdapter()\r
307             {\r
308               public void mousePressed(MouseEvent evt)\r
309               {\r
310                 if(evt.isControlDown() || SwingUtilities.isRightMouseButton(evt))\r
311                 {\r
312                   radioItem.removeActionListener(radioItem.getActionListeners()[0]);\r
313 \r
314                   int option = JOptionPane.showInternalConfirmDialog(jalview.gui.Desktop.desktop,\r
315                       "Remove from default list?",\r
316                       "Remove user defined colour",\r
317                       JOptionPane.YES_NO_OPTION);\r
318                   if(option == JOptionPane.YES_OPTION)\r
319                   {\r
320                     jalview.gui.UserDefinedColours.removeColourFromDefaults(radioItem.getText());\r
321                     coloursMenu.remove(radioItem);\r
322                   }\r
323                   else\r
324                     radioItem.addActionListener(new ActionListener()\r
325                     {\r
326                       public void actionPerformed(ActionEvent evt)\r
327                       {\r
328                         user_actionPerformed(evt);\r
329                       }\r
330                     });\r
331                 }\r
332               }\r
333             });\r
334         radioItem.addActionListener(new ActionListener()\r
335         {\r
336           public void actionPerformed(ActionEvent evt)\r
337           {\r
338             user_actionPerformed(evt);\r
339           }\r
340         });\r
341         coloursMenu.add(radioItem);\r
342         bg.add(radioItem);\r
343       }\r
344     }\r
345 \r
346     viewMenu.add(wire);\r
347     viewMenu.add(depth);\r
348     viewMenu.add(zbuffer);\r
349     viewMenu.add(allchains);\r
350   }\r
351 \r
352   JMenuBar jMenuBar1 = new JMenuBar();\r
353   JMenu fileMenu = new JMenu();\r
354   JMenu coloursMenu = new JMenu();\r
355   JMenu saveMenu = new JMenu();\r
356   JMenuItem png = new JMenuItem();\r
357   JMenuItem eps = new JMenuItem();\r
358   JMenuItem mapping = new JMenuItem();\r
359   JCheckBoxMenuItem wire = new JCheckBoxMenuItem();\r
360   JCheckBoxMenuItem depth = new JCheckBoxMenuItem();\r
361   JCheckBoxMenuItem zbuffer = new JCheckBoxMenuItem();\r
362   JCheckBoxMenuItem allchains = new JCheckBoxMenuItem();\r
363 \r
364   JRadioButtonMenuItem charge = new JRadioButtonMenuItem();\r
365   JRadioButtonMenuItem chain = new JRadioButtonMenuItem();\r
366   JRadioButtonMenuItem seqButton = new JRadioButtonMenuItem();\r
367   JRadioButtonMenuItem hydro = new JRadioButtonMenuItem();\r
368   JRadioButtonMenuItem taylor = new JRadioButtonMenuItem();\r
369   JRadioButtonMenuItem zappo = new  JRadioButtonMenuItem();\r
370   JRadioButtonMenuItem user = new JRadioButtonMenuItem();\r
371   JRadioButtonMenuItem buried = new JRadioButtonMenuItem();\r
372   JRadioButtonMenuItem turn = new JRadioButtonMenuItem();\r
373   JRadioButtonMenuItem strand = new JRadioButtonMenuItem();\r
374   JRadioButtonMenuItem helix = new JRadioButtonMenuItem();\r
375   JMenu viewMenu = new JMenu();\r
376 \r
377   /**\r
378    * DOCUMENT ME!\r
379    *\r
380    * @param e DOCUMENT ME!\r
381    */\r
382   public void eps_actionPerformed(ActionEvent e)\r
383   {\r
384     makePDBImage(jalview.util.ImageMaker.EPS);\r
385   }\r
386 \r
387   /**\r
388    * DOCUMENT ME!\r
389    *\r
390    * @param e DOCUMENT ME!\r
391    */\r
392   public void png_actionPerformed(ActionEvent e)\r
393   {\r
394      makePDBImage(jalview.util.ImageMaker.PNG);\r
395   }\r
396 \r
397   void makePDBImage(int type)\r
398   {\r
399     int width = pdbcanvas.getWidth();\r
400     int height = pdbcanvas.getHeight();\r
401 \r
402     jalview.util.ImageMaker im;\r
403 \r
404     if (type == jalview.util.ImageMaker.PNG)\r
405       im = new jalview.util.ImageMaker(this,\r
406                                        jalview.util.ImageMaker.PNG,\r
407                                        "Make PNG image from view",\r
408                                        width, height,\r
409                                        null, null);\r
410     else\r
411       im = new jalview.util.ImageMaker(this,\r
412                                        jalview.util.ImageMaker.EPS,\r
413                                        "Make EPS file from view",\r
414                                        width, height,\r
415                                        null, this.getTitle());\r
416 \r
417     if (im.getGraphics() != null)\r
418     {\r
419       pdbcanvas.drawAll(im.getGraphics(), width, height);\r
420       im.writeImage();\r
421     }\r
422   }\r
423   public void charge_actionPerformed(ActionEvent e)\r
424   {\r
425     pdbcanvas.bysequence = false;\r
426     pdbcanvas.pdb.setChargeColours();\r
427     pdbcanvas.redrawneeded=true;\r
428     pdbcanvas.repaint();\r
429   }\r
430 \r
431   public void hydro_actionPerformed(ActionEvent e)\r
432   {\r
433     pdbcanvas.bysequence = false;\r
434     pdbcanvas.pdb.setColours(new HydrophobicColourScheme());\r
435     pdbcanvas.redrawneeded=true;\r
436     pdbcanvas.repaint();\r
437   }\r
438 \r
439   public void chain_actionPerformed(ActionEvent e)\r
440   {\r
441     pdbcanvas.bysequence = false;\r
442     pdbcanvas.pdb.setChainColours();\r
443     pdbcanvas.redrawneeded=true;\r
444     pdbcanvas.repaint();\r
445   }\r
446 \r
447   public void zbuffer_actionPerformed(ActionEvent e)\r
448   {\r
449     pdbcanvas.zbuffer = ! pdbcanvas.zbuffer;\r
450     pdbcanvas.redrawneeded=true;\r
451     pdbcanvas.repaint();\r
452   }\r
453 \r
454   public void molecule_actionPerformed(ActionEvent e)\r
455   {\r
456     pdbcanvas.bymolecule = ! pdbcanvas.bymolecule;\r
457     pdbcanvas.redrawneeded=true;\r
458     pdbcanvas.repaint();\r
459   }\r
460 \r
461   public void depth_actionPerformed(ActionEvent e)\r
462   {\r
463   pdbcanvas.depthcue = ! pdbcanvas.depthcue;\r
464   pdbcanvas.redrawneeded=true;\r
465     pdbcanvas.repaint();\r
466   }\r
467 \r
468   public void wire_actionPerformed(ActionEvent e)\r
469   {\r
470     pdbcanvas.wire = ! pdbcanvas.wire;\r
471     pdbcanvas.redrawneeded=true;\r
472     pdbcanvas.repaint();\r
473   }\r
474 \r
475   public void seqButton_actionPerformed(ActionEvent e)\r
476   {\r
477     pdbcanvas.bysequence = true;\r
478     pdbcanvas.updateSeqColours();\r
479   }\r
480 \r
481 \r
482   public void mapping_actionPerformed(ActionEvent e)\r
483   {\r
484     jalview.gui.CutAndPasteTransfer cap = new jalview.gui.CutAndPasteTransfer();\r
485     Desktop.addInternalFrame(cap, "PDB - Sequence Mapping", 550, 600);\r
486     cap.setText(pdbcanvas.mappingDetails.toString());\r
487   }\r
488 \r
489   public void allchains_itemStateChanged(ItemEvent e)\r
490   {\r
491     pdbcanvas.setAllchainsVisible(allchains.getState());\r
492   }\r
493 \r
494   public void zappo_actionPerformed(ActionEvent e)\r
495   {\r
496     pdbcanvas.bysequence = false;\r
497     pdbcanvas.pdb.setColours(new ZappoColourScheme());\r
498     pdbcanvas.redrawneeded=true;\r
499     pdbcanvas.repaint();\r
500   }\r
501 \r
502   public void taylor_actionPerformed(ActionEvent e)\r
503   {\r
504     pdbcanvas.bysequence = false;\r
505     pdbcanvas.pdb.setColours(new TaylorColourScheme());\r
506     pdbcanvas.redrawneeded=true;\r
507     pdbcanvas.repaint();\r
508   }\r
509 \r
510   public void helix_actionPerformed(ActionEvent e)\r
511   {\r
512     pdbcanvas.bysequence = false;\r
513     pdbcanvas.pdb.setColours(new HelixColourScheme());\r
514     pdbcanvas.redrawneeded=true;\r
515     pdbcanvas.repaint();\r
516   }\r
517 \r
518   public void strand_actionPerformed(ActionEvent e)\r
519   {\r
520     pdbcanvas.bysequence = false;\r
521     pdbcanvas.pdb.setColours(new StrandColourScheme());\r
522     pdbcanvas.redrawneeded=true;\r
523     pdbcanvas.repaint();\r
524   }\r
525 \r
526   public void turn_actionPerformed(ActionEvent e)\r
527   {\r
528     pdbcanvas.bysequence = false;\r
529     pdbcanvas.pdb.setColours(new TurnColourScheme());\r
530     pdbcanvas.redrawneeded=true;\r
531     pdbcanvas.repaint();\r
532   }\r
533 \r
534   public void buried_actionPerformed(ActionEvent e)\r
535   {\r
536     pdbcanvas.bysequence = false;\r
537     pdbcanvas.pdb.setColours(new BuriedColourScheme());\r
538     pdbcanvas.redrawneeded=true;\r
539     pdbcanvas.repaint();\r
540   }\r
541 \r
542   public void user_actionPerformed(ActionEvent e)\r
543   {\r
544     if (e.getActionCommand().equals("User Defined..."))\r
545     {\r
546       new UserDefinedColours(pdbcanvas, null);\r
547     }\r
548     else\r
549     {\r
550       UserColourScheme udc = (UserColourScheme) UserDefinedColours.\r
551           getUserColourSchemes().get(e.getActionCommand());\r
552 \r
553       pdbcanvas.pdb.setColours(udc);\r
554       pdbcanvas.redrawneeded=true;\r
555       pdbcanvas.repaint();\r
556     }\r
557   }\r
558 }\r