License added to new files
[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.gui.*;\r
25 import jalview.io.EBIFetchClient;\r
26 import java.awt.event.ActionListener;\r
27 import java.awt.event.ActionEvent;\r
28 \r
29 public class PDBViewer extends JInternalFrame implements Runnable\r
30 {\r
31   PDBEntry pdb;\r
32   Sequence sequence;\r
33   PDBCanvas pdbcanvas;\r
34 \r
35 \r
36   public PDBViewer(PDBEntry entry,\r
37                    Sequence seq,\r
38                    SeqCanvas seqcanvas)\r
39   {\r
40 \r
41     pdb = entry;\r
42     sequence = seq;\r
43 \r
44     Thread worker = new Thread(this);\r
45     worker.start();\r
46 \r
47     try\r
48     {\r
49       jbInit();\r
50     }\r
51     catch (Exception ex)\r
52     {\r
53       ex.printStackTrace();\r
54     }\r
55 \r
56     pdbcanvas = new PDBCanvas(seqcanvas, seq);\r
57 \r
58     setContentPane(pdbcanvas);\r
59     StringBuffer title = new StringBuffer(sequence.getName() + ":" + pdb.getId());\r
60     if(pdb.getProperty()!=null)\r
61     {\r
62       title.append( " Method: " );\r
63       title.append(pdb.getProperty().get("method"));\r
64       title.append( " Chain:" );\r
65       title.append( pdb.getProperty().get("chains"));\r
66     }\r
67 \r
68      Desktop.addInternalFrame(this,title.toString(),400, 400);\r
69   }\r
70 \r
71   public void run()\r
72   {\r
73     try\r
74     {\r
75       EBIFetchClient ebi = new EBIFetchClient();\r
76       String[] result = ebi.fetchData("pdb:" + pdb.getId(), "default","raw");\r
77 \r
78       PDBfile pdbfile = new PDBfile(result);\r
79 \r
80       pdbcanvas.setPDBFile(pdbfile);\r
81 \r
82     }\r
83     catch (Exception ex)\r
84     {\r
85       ex.printStackTrace();\r
86     }\r
87   }\r
88 \r
89   private void jbInit()\r
90       throws Exception\r
91   {\r
92     this.addKeyListener(new KeyAdapter()\r
93         {\r
94             public void keyPressed(KeyEvent evt)\r
95             {\r
96               pdbcanvas.keyPressed(evt);\r
97             }\r
98         });\r
99 \r
100     this.setJMenuBar(jMenuBar1);\r
101     fileMenu.setText("File");\r
102     coloursMenu.setText("Colours");\r
103     saveMenu.setActionCommand("Save Image");\r
104     saveMenu.setText("Save As");\r
105     png.setText("PNG");\r
106     png.addActionListener(new ActionListener()\r
107     {\r
108       public void actionPerformed(ActionEvent e)\r
109       {\r
110         png_actionPerformed(e);\r
111       }\r
112     });\r
113     eps.setText("EPS");\r
114     eps.addActionListener(new ActionListener()\r
115     {\r
116       public void actionPerformed(ActionEvent e)\r
117       {\r
118         eps_actionPerformed(e);\r
119       }\r
120     });\r
121     mapping.setText("View Mapping");\r
122     mapping.addActionListener(new ActionListener()\r
123     {\r
124       public void actionPerformed(ActionEvent e)\r
125       {\r
126         mapping_actionPerformed(e);\r
127       }\r
128     });\r
129     wire.setText("Wireframe");\r
130     wire.addActionListener(new ActionListener()\r
131     {\r
132       public void actionPerformed(ActionEvent e)\r
133       {\r
134         wire_actionPerformed(e);\r
135       }\r
136     });\r
137     depth.setSelected(true);\r
138     depth.setText("Depthcue");\r
139     depth.addActionListener(new ActionListener()\r
140     {\r
141       public void actionPerformed(ActionEvent e)\r
142       {\r
143         depth_actionPerformed(e);\r
144       }\r
145     });\r
146     zbuffer.setSelected(true);\r
147     zbuffer.setText("Z Buffering");\r
148     zbuffer.addActionListener(new ActionListener()\r
149     {\r
150       public void actionPerformed(ActionEvent e)\r
151       {\r
152         zbuffer_actionPerformed(e);\r
153       }\r
154     });\r
155     charge.setText("Charge & Cysteine");\r
156     charge.addActionListener(new ActionListener()\r
157     {\r
158       public void actionPerformed(ActionEvent e)\r
159       {\r
160         charge_actionPerformed(e);\r
161       }\r
162     });\r
163     hydro.setText("Hydrophobicity");\r
164     hydro.addActionListener(new ActionListener()\r
165     {\r
166       public void actionPerformed(ActionEvent e)\r
167       {\r
168         hydro_actionPerformed(e);\r
169       }\r
170     });\r
171     chain.setText("By Chain");\r
172     chain.addActionListener(new ActionListener()\r
173     {\r
174       public void actionPerformed(ActionEvent e)\r
175       {\r
176         chain_actionPerformed(e);\r
177       }\r
178     });\r
179     seqButton.setSelected(true);\r
180     seqButton.setText("By Sequence");\r
181     seqButton.addActionListener(new ActionListener()\r
182     {\r
183       public void actionPerformed(ActionEvent e)\r
184       {\r
185         seqButton_actionPerformed(e);\r
186       }\r
187     });\r
188     molecule.setText("By Molecule");\r
189     molecule.addActionListener(new ActionListener()\r
190     {\r
191       public void actionPerformed(ActionEvent e)\r
192       {\r
193         molecule_actionPerformed(e);\r
194       }\r
195     });\r
196     allchains.setSelected(true);\r
197     allchains.setText("Show All Chains");\r
198     allchains.addItemListener(new ItemListener()\r
199     {\r
200       public void itemStateChanged(ItemEvent e)\r
201       {\r
202         allchains_itemStateChanged(e);\r
203       }\r
204     });\r
205     jMenuBar1.add(fileMenu);\r
206     jMenuBar1.add(coloursMenu);\r
207     fileMenu.add(saveMenu);\r
208     fileMenu.add(mapping);\r
209     saveMenu.add(png);\r
210     saveMenu.add(eps);\r
211     coloursMenu.add(seqButton);\r
212     coloursMenu.add(chain);\r
213     coloursMenu.add(hydro);\r
214     coloursMenu.add(charge);\r
215     coloursMenu.addSeparator();\r
216     coloursMenu.add(wire);\r
217     coloursMenu.add(depth);\r
218     coloursMenu.add(zbuffer);\r
219     coloursMenu.add(molecule);\r
220     coloursMenu.add(allchains);\r
221     ButtonGroup bg = new ButtonGroup();\r
222     bg.add(seqButton);\r
223     bg.add(chain);\r
224     bg.add(hydro);\r
225     bg.add(charge);\r
226   }\r
227 \r
228   JMenuBar jMenuBar1 = new JMenuBar();\r
229   JMenu fileMenu = new JMenu();\r
230   JMenu coloursMenu = new JMenu();\r
231   JMenu saveMenu = new JMenu();\r
232   JMenuItem png = new JMenuItem();\r
233   JMenuItem eps = new JMenuItem();\r
234   JMenuItem mapping = new JMenuItem();\r
235   JCheckBoxMenuItem wire = new JCheckBoxMenuItem();\r
236   JCheckBoxMenuItem depth = new JCheckBoxMenuItem();\r
237   JCheckBoxMenuItem zbuffer = new JCheckBoxMenuItem();\r
238   JRadioButtonMenuItem charge = new JRadioButtonMenuItem();\r
239   JRadioButtonMenuItem hydro = new JRadioButtonMenuItem();\r
240   JRadioButtonMenuItem chain = new JRadioButtonMenuItem();\r
241   JRadioButtonMenuItem seqButton = new JRadioButtonMenuItem();\r
242   JCheckBoxMenuItem molecule = new JCheckBoxMenuItem();\r
243   JCheckBoxMenuItem allchains = new JCheckBoxMenuItem();\r
244 \r
245   /**\r
246    * DOCUMENT ME!\r
247    *\r
248    * @param e DOCUMENT ME!\r
249    */\r
250   public void eps_actionPerformed(ActionEvent e)\r
251   {\r
252     makePDBImage(jalview.util.ImageMaker.EPS);\r
253   }\r
254 \r
255   /**\r
256    * DOCUMENT ME!\r
257    *\r
258    * @param e DOCUMENT ME!\r
259    */\r
260   public void png_actionPerformed(ActionEvent e)\r
261   {\r
262      makePDBImage(jalview.util.ImageMaker.PNG);\r
263   }\r
264 \r
265   void makePDBImage(int type)\r
266   {\r
267     int width = pdbcanvas.getWidth();\r
268     int height = pdbcanvas.getHeight();\r
269 \r
270     jalview.util.ImageMaker im;\r
271 \r
272     if (type == jalview.util.ImageMaker.PNG)\r
273       im = new jalview.util.ImageMaker(this,\r
274                                        jalview.util.ImageMaker.PNG,\r
275                                        "Make PNG image from view",\r
276                                        width, height,\r
277                                        null, null);\r
278     else\r
279       im = new jalview.util.ImageMaker(this,\r
280                                        jalview.util.ImageMaker.EPS,\r
281                                        "Make EPS file from view",\r
282                                        width, height,\r
283                                        null, this.getTitle());\r
284 \r
285     if (im.getGraphics() != null)\r
286     {\r
287       pdbcanvas.drawAll(im.getGraphics(), width, height);\r
288       im.writeImage();\r
289     }\r
290   }\r
291   public void charge_actionPerformed(ActionEvent e)\r
292   {\r
293     clearButtonGroup();\r
294     pdbcanvas.pdb.setChargeColours();\r
295     pdbcanvas.redrawneeded=true;\r
296     pdbcanvas.repaint();\r
297   }\r
298 \r
299   public void hydro_actionPerformed(ActionEvent e)\r
300   {\r
301     clearButtonGroup();\r
302     pdbcanvas.pdb.setHydrophobicityColours();\r
303     pdbcanvas.redrawneeded=true;\r
304     pdbcanvas.repaint();\r
305   }\r
306 \r
307   public void chain_actionPerformed(ActionEvent e)\r
308   {\r
309     clearButtonGroup();\r
310     pdbcanvas.pdb.setChainColours();\r
311     pdbcanvas.redrawneeded=true;\r
312     pdbcanvas.repaint();\r
313   }\r
314 \r
315   public void zbuffer_actionPerformed(ActionEvent e)\r
316   {\r
317     pdbcanvas.zbuffer = ! pdbcanvas.zbuffer;\r
318     pdbcanvas.redrawneeded=true;\r
319     pdbcanvas.repaint();\r
320   }\r
321 \r
322   public void molecule_actionPerformed(ActionEvent e)\r
323   {\r
324     pdbcanvas.bymolecule = ! pdbcanvas.bymolecule;\r
325     pdbcanvas.redrawneeded=true;\r
326     pdbcanvas.repaint();\r
327   }\r
328 \r
329   public void depth_actionPerformed(ActionEvent e)\r
330   {\r
331   pdbcanvas.depthcue = ! pdbcanvas.depthcue;\r
332   pdbcanvas.redrawneeded=true;\r
333     pdbcanvas.repaint();\r
334   }\r
335 \r
336   public void wire_actionPerformed(ActionEvent e)\r
337   {\r
338     pdbcanvas.wire = ! pdbcanvas.wire;\r
339     pdbcanvas.redrawneeded=true;\r
340     pdbcanvas.repaint();\r
341   }\r
342 \r
343   public void seqButton_actionPerformed(ActionEvent e)\r
344   {\r
345     clearButtonGroup();\r
346     pdbcanvas.bysequence = seqButton.isSelected();\r
347     pdbcanvas.updateSeqColours();\r
348   }\r
349 \r
350   void clearButtonGroup()\r
351   {\r
352    pdbcanvas.bysequence = false;\r
353    pdbcanvas.bymolecule = false;\r
354   }\r
355 \r
356   public void mapping_actionPerformed(ActionEvent e)\r
357   {\r
358     jalview.gui.CutAndPasteTransfer cap = new jalview.gui.CutAndPasteTransfer();\r
359     Desktop.addInternalFrame(cap, "PDB - Sequence Mapping", 550, 600);\r
360     cap.setText(pdbcanvas.mappingDetails.toString());\r
361   }\r
362 \r
363   public void allchains_itemStateChanged(ItemEvent e)\r
364   {\r
365     pdbcanvas.setAllchainsVisible(allchains.getState());\r
366   }\r
367 }\r