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