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