2610b408653b65c43396596f8ac7d418e8f3344b
[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 import java.io.FileOutputStream;\r
11 import org.jibble.epsgraphics.EpsGraphics2D;\r
12 import javax.imageio.ImageIO;\r
13 import java.awt.image.BufferedImage;\r
14 import java.awt.Graphics;\r
15 import java.awt.Graphics2D;\r
16 import java.awt.RenderingHints;\r
17 \r
18 public class PDBViewer extends JInternalFrame implements Runnable\r
19 {\r
20   PDBEntry pdb;\r
21   Sequence sequence;\r
22   SeqCanvas seqcanvas;\r
23   PDBCanvas pdbcanvas;\r
24 \r
25 \r
26   public PDBViewer(PDBEntry entry,\r
27                    Sequence seq,\r
28                    SeqCanvas seqcanvas)\r
29   {\r
30     pdb = entry;\r
31     sequence = seq;\r
32     this.seqcanvas = seqcanvas;\r
33 \r
34 \r
35     try\r
36     {\r
37       jbInit();\r
38     }\r
39     catch (Exception ex)\r
40     {\r
41       ex.printStackTrace();\r
42     }\r
43 \r
44     pdbcanvas = new PDBCanvas();\r
45     setContentPane(pdbcanvas);\r
46     Desktop.addInternalFrame(this,\r
47                          sequence.getName() + ":" + pdb.getId()\r
48                          + " Method: " + pdb.getProperty().get("method")\r
49                          + " Chain:" + pdb.getProperty().get("chains"),\r
50                          400, 400);\r
51 \r
52      Thread worker = new Thread(this);\r
53      worker.start();\r
54   }\r
55 \r
56   public void run()\r
57   {\r
58     try\r
59     {\r
60       EBIFetchClient ebi = new EBIFetchClient();\r
61       String[] result = ebi.fetchData("pdb:" + pdb.getId(), null,\r
62                                       null);\r
63 \r
64       PDBfile pdbfile = new PDBfile(result);\r
65 \r
66       pdbcanvas.setPDBFile(pdbfile,\r
67                         sequence,\r
68                         seqcanvas.getSequenceRenderer(),\r
69                         seqcanvas.getFeatureRenderer());\r
70 \r
71       seqcanvas.setPDBViewer(pdbcanvas);\r
72     }\r
73     catch (Exception ex)\r
74     {\r
75       ex.printStackTrace();\r
76     }\r
77   }\r
78 \r
79   private void jbInit()\r
80       throws Exception\r
81   {\r
82     this.addKeyListener(new KeyAdapter()\r
83         {\r
84             public void keyPressed(KeyEvent evt)\r
85             {\r
86               System.out.println("key press");\r
87               pdbcanvas.keyPressed(evt);\r
88             }\r
89         });\r
90 \r
91     this.setJMenuBar(jMenuBar1);\r
92     fileMenu.setText("File");\r
93     coloursMenu.setText("Colours");\r
94     saveMenu.setActionCommand("Save Image");\r
95     saveMenu.setText("Save As");\r
96     png.setText("PNG");\r
97     png.addActionListener(new ActionListener()\r
98     {\r
99       public void actionPerformed(ActionEvent e)\r
100       {\r
101         png_actionPerformed(e);\r
102       }\r
103     });\r
104     eps.setText("EPS");\r
105     eps.addActionListener(new ActionListener()\r
106     {\r
107       public void actionPerformed(ActionEvent e)\r
108       {\r
109         eps_actionPerformed(e);\r
110       }\r
111     });\r
112     mapping.setText("View Mapping");\r
113     wire.setText("Wireframe");\r
114     wire.addActionListener(new ActionListener()\r
115     {\r
116       public void actionPerformed(ActionEvent e)\r
117       {\r
118         wire_actionPerformed(e);\r
119       }\r
120     });\r
121     depth.setSelected(true);\r
122     depth.setText("Depthcue");\r
123     depth.addActionListener(new ActionListener()\r
124     {\r
125       public void actionPerformed(ActionEvent e)\r
126       {\r
127         depth_actionPerformed(e);\r
128       }\r
129     });\r
130     zbuffer.setSelected(true);\r
131     zbuffer.setText("Z Buffering");\r
132     zbuffer.addActionListener(new ActionListener()\r
133     {\r
134       public void actionPerformed(ActionEvent e)\r
135       {\r
136         zbuffer_actionPerformed(e);\r
137       }\r
138     });\r
139     charge.setText("Charge & Cysteine");\r
140     charge.addActionListener(new ActionListener()\r
141     {\r
142       public void actionPerformed(ActionEvent e)\r
143       {\r
144         charge_actionPerformed(e);\r
145       }\r
146     });\r
147     hydro.setText("Hydrophobicity");\r
148     hydro.addActionListener(new ActionListener()\r
149     {\r
150       public void actionPerformed(ActionEvent e)\r
151       {\r
152         hydro_actionPerformed(e);\r
153       }\r
154     });\r
155     chain.setText("By Chain");\r
156     chain.addActionListener(new ActionListener()\r
157     {\r
158       public void actionPerformed(ActionEvent e)\r
159       {\r
160         chain_actionPerformed(e);\r
161       }\r
162     });\r
163     seqButton.setSelected(true);\r
164     seqButton.setText("By Sequence");\r
165     seqButton.addActionListener(new ActionListener()\r
166     {\r
167       public void actionPerformed(ActionEvent e)\r
168       {\r
169         seqButton_actionPerformed(e);\r
170       }\r
171     });\r
172     molecule.setText("By Molecule");\r
173     molecule.addActionListener(new ActionListener()\r
174     {\r
175       public void actionPerformed(ActionEvent e)\r
176       {\r
177         molecule_actionPerformed(e);\r
178       }\r
179     });\r
180     jMenuBar1.add(fileMenu);\r
181     jMenuBar1.add(coloursMenu);\r
182     fileMenu.add(saveMenu);\r
183     fileMenu.add(mapping);\r
184     saveMenu.add(png);\r
185     saveMenu.add(eps);\r
186     coloursMenu.add(seqButton);\r
187     coloursMenu.add(chain);\r
188     coloursMenu.add(hydro);\r
189     coloursMenu.add(charge);\r
190     coloursMenu.addSeparator();\r
191     coloursMenu.add(wire);\r
192     coloursMenu.add(depth);\r
193     coloursMenu.add(zbuffer);\r
194     coloursMenu.add(molecule);\r
195     ButtonGroup bg = new ButtonGroup();\r
196     bg.add(seqButton);\r
197     bg.add(chain);\r
198     bg.add(hydro);\r
199     bg.add(charge);\r
200   }\r
201 \r
202   JMenuBar jMenuBar1 = new JMenuBar();\r
203   JMenu fileMenu = new JMenu();\r
204   JMenu coloursMenu = new JMenu();\r
205   JMenu saveMenu = new JMenu();\r
206   JMenuItem png = new JMenuItem();\r
207   JMenuItem eps = new JMenuItem();\r
208   JMenuItem mapping = new JMenuItem();\r
209   JCheckBoxMenuItem wire = new JCheckBoxMenuItem();\r
210   JCheckBoxMenuItem depth = new JCheckBoxMenuItem();\r
211   JCheckBoxMenuItem zbuffer = new JCheckBoxMenuItem();\r
212   JRadioButtonMenuItem charge = new JRadioButtonMenuItem();\r
213   JRadioButtonMenuItem hydro = new JRadioButtonMenuItem();\r
214   JRadioButtonMenuItem chain = new JRadioButtonMenuItem();\r
215   JRadioButtonMenuItem seqButton = new JRadioButtonMenuItem();\r
216   JCheckBoxMenuItem molecule = new JCheckBoxMenuItem();\r
217 \r
218   public void png_actionPerformed(ActionEvent e)\r
219   {\r
220     int width =  pdbcanvas.getWidth();\r
221     int height = pdbcanvas.getHeight();\r
222 \r
223     try\r
224     {\r
225         jalview.io.JalviewFileChooser chooser = new jalview.io.JalviewFileChooser(jalview.bin.Cache.getProperty(\r
226                     "LAST_DIRECTORY"), new String[] { "png" },\r
227                 new String[] { "Portable network graphics" },\r
228                 "Portable network graphics");\r
229 \r
230         chooser.setFileView(new jalview.io.JalviewFileView());\r
231         chooser.setDialogTitle("Create PNG Image of Molecule");\r
232         chooser.setToolTipText("Save");\r
233 \r
234         int value = chooser.showSaveDialog(this);\r
235 \r
236         if (value != jalview.io.JalviewFileChooser.APPROVE_OPTION)\r
237         {\r
238             return;\r
239         }\r
240 \r
241         jalview.bin.Cache.setProperty("LAST_DIRECTORY",\r
242             chooser.getSelectedFile().getParent());\r
243 \r
244         FileOutputStream out = new FileOutputStream(chooser.getSelectedFile());\r
245 \r
246         BufferedImage bi = new BufferedImage(width, height,\r
247                 BufferedImage.TYPE_INT_RGB);\r
248         Graphics png = bi.getGraphics();\r
249         Graphics2D ig2 = (Graphics2D) png;\r
250         ig2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,\r
251                                  RenderingHints.VALUE_ANTIALIAS_ON);\r
252 \r
253 \r
254         pdbcanvas.drawAll(png, width, height);\r
255 \r
256         ImageIO.write(bi, "png", out);\r
257         out.close();\r
258     }\r
259     catch (Exception ex)\r
260     {\r
261         ex.printStackTrace();\r
262     }\r
263   }\r
264 \r
265   public void eps_actionPerformed(ActionEvent e)\r
266   {\r
267     boolean accurateText = true;\r
268 \r
269     String renderStyle = jalview.bin.Cache.getDefault("EPS_RENDERING",\r
270         "Prompt each time");\r
271 \r
272   // If we need to prompt, and if the GUI is visible then\r
273   // Prompt for EPS rendering style\r
274     if (renderStyle.equalsIgnoreCase("Prompt each time")\r
275         && !\r
276         (System.getProperty("java.awt.headless") != null\r
277          && System.getProperty("java.awt.headless").equals("true")))\r
278     {\r
279       EPSOptions eps = new EPSOptions();\r
280       renderStyle = eps.getValue();\r
281 \r
282       if (renderStyle==null || eps.cancelled)\r
283         return;\r
284 \r
285 \r
286     }\r
287 \r
288     if (renderStyle.equalsIgnoreCase("text"))\r
289     {\r
290       accurateText = false;\r
291     }\r
292 \r
293       int width = getWidth();\r
294       int height = getHeight();\r
295 \r
296       try\r
297       {\r
298           jalview.io.JalviewFileChooser chooser = new jalview.io.JalviewFileChooser(jalview.bin.Cache.getProperty(\r
299                       "LAST_DIRECTORY"), new String[] { "eps" },\r
300                   new String[] { "Encapsulated Postscript" },\r
301                   "Encapsulated Postscript");\r
302           chooser.setFileView(new jalview.io.JalviewFileView());\r
303           chooser.setDialogTitle("Create EPS file from tree");\r
304           chooser.setToolTipText("Save");\r
305 \r
306           int value = chooser.showSaveDialog(this);\r
307 \r
308           if (value != jalview.io.JalviewFileChooser.APPROVE_OPTION)\r
309           {\r
310               return;\r
311           }\r
312 \r
313           jalview.bin.Cache.setProperty("LAST_DIRECTORY",\r
314                                         chooser.getSelectedFile().getParent());\r
315 \r
316           FileOutputStream out = new FileOutputStream(chooser.getSelectedFile());\r
317           EpsGraphics2D pg = new EpsGraphics2D("Tree", out, 0, 0, width,\r
318                                                height);\r
319           Graphics2D ig2 = (Graphics2D) pg;\r
320           ig2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,\r
321                          RenderingHints.VALUE_ANTIALIAS_ON);\r
322 \r
323 \r
324           pg.setAccurateTextMode(accurateText);\r
325 \r
326           pdbcanvas.drawAll(pg, width, height);\r
327 \r
328           pg.flush();\r
329           pg.close();\r
330       }\r
331       catch (Exception ex)\r
332       {\r
333           ex.printStackTrace();\r
334         }\r
335 \r
336   }\r
337 \r
338   public void charge_actionPerformed(ActionEvent e)\r
339   {\r
340     pdbcanvas.pdb.setChargeColours();\r
341     pdbcanvas.redrawneeded=true;\r
342     pdbcanvas.repaint();\r
343   }\r
344 \r
345   public void hydro_actionPerformed(ActionEvent e)\r
346   {\r
347     pdbcanvas.pdb.setHydrophobicityColours();\r
348     pdbcanvas.redrawneeded=true;\r
349     pdbcanvas.repaint();\r
350   }\r
351 \r
352   public void chain_actionPerformed(ActionEvent e)\r
353   {\r
354     pdbcanvas.pdb.setChainColours();\r
355     pdbcanvas.redrawneeded=true;\r
356     pdbcanvas.repaint();\r
357   }\r
358 \r
359   public void zbuffer_actionPerformed(ActionEvent e)\r
360   {\r
361     pdbcanvas.zbuffer = ! pdbcanvas.zbuffer;\r
362     pdbcanvas.redrawneeded=true;\r
363     pdbcanvas.repaint();\r
364   }\r
365 \r
366   public void molecule_actionPerformed(ActionEvent e)\r
367   {\r
368     pdbcanvas.bymolecule = ! pdbcanvas.bymolecule;\r
369     pdbcanvas.redrawneeded=true;\r
370     pdbcanvas.repaint();\r
371   }\r
372 \r
373   public void depth_actionPerformed(ActionEvent e)\r
374   {\r
375   pdbcanvas.depthcue = ! pdbcanvas.depthcue;\r
376   pdbcanvas.redrawneeded=true;\r
377     pdbcanvas.repaint();\r
378   }\r
379 \r
380   public void wire_actionPerformed(ActionEvent e)\r
381   {\r
382     pdbcanvas.wire = ! pdbcanvas.wire;\r
383     pdbcanvas.redrawneeded=true;\r
384     pdbcanvas.repaint();\r
385   }\r
386 \r
387   public void seqButton_actionPerformed(ActionEvent e)\r
388   {\r
389     pdbcanvas.bysequence = seqButton.isSelected();\r
390     pdbcanvas.updateSeqColours();\r
391   }\r
392 \r
393   void clearButtonGroup()\r
394   {\r
395    charge.setSelected(false);\r
396    hydro.setSelected(false);\r
397    chain.setSelected(false);\r
398    seqButton.setSelected(false);\r
399   }\r
400 }\r