Add mapping details to stringbuffer
[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   PDBCanvas pdbcanvas;\r
23 \r
24 \r
25   public PDBViewer(PDBEntry entry,\r
26                    Sequence seq,\r
27                    SeqCanvas seqcanvas)\r
28   {\r
29     pdb = entry;\r
30     sequence = seq;\r
31 \r
32     try\r
33     {\r
34       jbInit();\r
35     }\r
36     catch (Exception ex)\r
37     {\r
38       ex.printStackTrace();\r
39     }\r
40 \r
41     pdbcanvas = new PDBCanvas(seqcanvas, seq);\r
42 \r
43     setContentPane(pdbcanvas);\r
44     Desktop.addInternalFrame(this,\r
45                          sequence.getName() + ":" + pdb.getId()\r
46                          + " Method: " + pdb.getProperty().get("method")\r
47                          + " Chain:" + pdb.getProperty().get("chains"),\r
48                          400, 400);\r
49 \r
50      Thread worker = new Thread(this);\r
51      worker.start();\r
52   }\r
53 \r
54   public void run()\r
55   {\r
56     try\r
57     {\r
58       EBIFetchClient ebi = new EBIFetchClient();\r
59       String[] result = ebi.fetchData("pdb:" + pdb.getId(), null,\r
60                                       null);\r
61 \r
62       PDBfile pdbfile = new PDBfile(result);\r
63 \r
64       pdbcanvas.setPDBFile(pdbfile);\r
65 \r
66     }\r
67     catch (Exception ex)\r
68     {\r
69       ex.printStackTrace();\r
70     }\r
71   }\r
72 \r
73   private void jbInit()\r
74       throws Exception\r
75   {\r
76     this.addKeyListener(new KeyAdapter()\r
77         {\r
78             public void keyPressed(KeyEvent evt)\r
79             {\r
80               pdbcanvas.keyPressed(evt);\r
81             }\r
82         });\r
83 \r
84     this.setJMenuBar(jMenuBar1);\r
85     fileMenu.setText("File");\r
86     coloursMenu.setText("Colours");\r
87     saveMenu.setActionCommand("Save Image");\r
88     saveMenu.setText("Save As");\r
89     png.setText("PNG");\r
90     png.addActionListener(new ActionListener()\r
91     {\r
92       public void actionPerformed(ActionEvent e)\r
93       {\r
94         png_actionPerformed(e);\r
95       }\r
96     });\r
97     eps.setText("EPS");\r
98     eps.addActionListener(new ActionListener()\r
99     {\r
100       public void actionPerformed(ActionEvent e)\r
101       {\r
102         eps_actionPerformed(e);\r
103       }\r
104     });\r
105     mapping.setText("View Mapping");\r
106     mapping.addActionListener(new ActionListener()\r
107     {\r
108       public void actionPerformed(ActionEvent e)\r
109       {\r
110         mapping_actionPerformed(e);\r
111       }\r
112     });\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     clearButtonGroup();\r
341     pdbcanvas.pdb.setChargeColours();\r
342     pdbcanvas.redrawneeded=true;\r
343     pdbcanvas.repaint();\r
344   }\r
345 \r
346   public void hydro_actionPerformed(ActionEvent e)\r
347   {\r
348     clearButtonGroup();\r
349     pdbcanvas.pdb.setHydrophobicityColours();\r
350     pdbcanvas.redrawneeded=true;\r
351     pdbcanvas.repaint();\r
352   }\r
353 \r
354   public void chain_actionPerformed(ActionEvent e)\r
355   {\r
356     clearButtonGroup();\r
357     pdbcanvas.pdb.setChainColours();\r
358     pdbcanvas.redrawneeded=true;\r
359     pdbcanvas.repaint();\r
360   }\r
361 \r
362   public void zbuffer_actionPerformed(ActionEvent e)\r
363   {\r
364     pdbcanvas.zbuffer = ! pdbcanvas.zbuffer;\r
365     pdbcanvas.redrawneeded=true;\r
366     pdbcanvas.repaint();\r
367   }\r
368 \r
369   public void molecule_actionPerformed(ActionEvent e)\r
370   {\r
371     pdbcanvas.bymolecule = ! pdbcanvas.bymolecule;\r
372     pdbcanvas.redrawneeded=true;\r
373     pdbcanvas.repaint();\r
374   }\r
375 \r
376   public void depth_actionPerformed(ActionEvent e)\r
377   {\r
378   pdbcanvas.depthcue = ! pdbcanvas.depthcue;\r
379   pdbcanvas.redrawneeded=true;\r
380     pdbcanvas.repaint();\r
381   }\r
382 \r
383   public void wire_actionPerformed(ActionEvent e)\r
384   {\r
385     pdbcanvas.wire = ! pdbcanvas.wire;\r
386     pdbcanvas.redrawneeded=true;\r
387     pdbcanvas.repaint();\r
388   }\r
389 \r
390   public void seqButton_actionPerformed(ActionEvent e)\r
391   {\r
392     clearButtonGroup();\r
393     pdbcanvas.bysequence = seqButton.isSelected();\r
394     pdbcanvas.updateSeqColours();\r
395   }\r
396 \r
397   void clearButtonGroup()\r
398   {\r
399    pdbcanvas.bysequence = false;\r
400    pdbcanvas.bymolecule = false;\r
401   }\r
402 \r
403   public void mapping_actionPerformed(ActionEvent e)\r
404   {\r
405     jalview.gui.CutAndPasteTransfer cap = new jalview.gui.CutAndPasteTransfer();\r
406     Desktop.addInternalFrame(cap, "PDB - Sequence Mapping", 500, 600);\r
407     cap.setText(pdbcanvas.mappingDetails.toString());\r
408   }\r
409 }\r