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