package MCview; import javax.swing.*; import java.awt.event.*; import jalview.datamodel.*; import jalview.gui.*; import jalview.io.EBIFetchClient; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import java.io.FileOutputStream; import org.jibble.epsgraphics.EpsGraphics2D; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; public class PDBViewer extends JInternalFrame implements Runnable { PDBEntry pdb; Sequence sequence; PDBCanvas pdbcanvas; public PDBViewer(PDBEntry entry, Sequence seq, SeqCanvas seqcanvas) { pdb = entry; sequence = seq; try { jbInit(); } catch (Exception ex) { ex.printStackTrace(); } pdbcanvas = new PDBCanvas(seqcanvas, seq); setContentPane(pdbcanvas); Desktop.addInternalFrame(this, sequence.getName() + ":" + pdb.getId() + " Method: " + pdb.getProperty().get("method") + " Chain:" + pdb.getProperty().get("chains"), 400, 400); Thread worker = new Thread(this); worker.start(); } public void run() { try { EBIFetchClient ebi = new EBIFetchClient(); String[] result = ebi.fetchData("pdb:" + pdb.getId(), null, null); PDBfile pdbfile = new PDBfile(result); pdbcanvas.setPDBFile(pdbfile); } catch (Exception ex) { ex.printStackTrace(); } } private void jbInit() throws Exception { this.addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent evt) { pdbcanvas.keyPressed(evt); } }); this.setJMenuBar(jMenuBar1); fileMenu.setText("File"); coloursMenu.setText("Colours"); saveMenu.setActionCommand("Save Image"); saveMenu.setText("Save As"); png.setText("PNG"); png.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { png_actionPerformed(e); } }); eps.setText("EPS"); eps.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { eps_actionPerformed(e); } }); mapping.setText("View Mapping"); mapping.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { mapping_actionPerformed(e); } }); wire.setText("Wireframe"); wire.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { wire_actionPerformed(e); } }); depth.setSelected(true); depth.setText("Depthcue"); depth.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { depth_actionPerformed(e); } }); zbuffer.setSelected(true); zbuffer.setText("Z Buffering"); zbuffer.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { zbuffer_actionPerformed(e); } }); charge.setText("Charge & Cysteine"); charge.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { charge_actionPerformed(e); } }); hydro.setText("Hydrophobicity"); hydro.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { hydro_actionPerformed(e); } }); chain.setText("By Chain"); chain.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { chain_actionPerformed(e); } }); seqButton.setSelected(true); seqButton.setText("By Sequence"); seqButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { seqButton_actionPerformed(e); } }); molecule.setText("By Molecule"); molecule.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { molecule_actionPerformed(e); } }); jMenuBar1.add(fileMenu); jMenuBar1.add(coloursMenu); fileMenu.add(saveMenu); fileMenu.add(mapping); saveMenu.add(png); saveMenu.add(eps); coloursMenu.add(seqButton); coloursMenu.add(chain); coloursMenu.add(hydro); coloursMenu.add(charge); coloursMenu.addSeparator(); coloursMenu.add(wire); coloursMenu.add(depth); coloursMenu.add(zbuffer); coloursMenu.add(molecule); ButtonGroup bg = new ButtonGroup(); bg.add(seqButton); bg.add(chain); bg.add(hydro); bg.add(charge); } JMenuBar jMenuBar1 = new JMenuBar(); JMenu fileMenu = new JMenu(); JMenu coloursMenu = new JMenu(); JMenu saveMenu = new JMenu(); JMenuItem png = new JMenuItem(); JMenuItem eps = new JMenuItem(); JMenuItem mapping = new JMenuItem(); JCheckBoxMenuItem wire = new JCheckBoxMenuItem(); JCheckBoxMenuItem depth = new JCheckBoxMenuItem(); JCheckBoxMenuItem zbuffer = new JCheckBoxMenuItem(); JRadioButtonMenuItem charge = new JRadioButtonMenuItem(); JRadioButtonMenuItem hydro = new JRadioButtonMenuItem(); JRadioButtonMenuItem chain = new JRadioButtonMenuItem(); JRadioButtonMenuItem seqButton = new JRadioButtonMenuItem(); JCheckBoxMenuItem molecule = new JCheckBoxMenuItem(); public void png_actionPerformed(ActionEvent e) { int width = pdbcanvas.getWidth(); int height = pdbcanvas.getHeight(); try { jalview.io.JalviewFileChooser chooser = new jalview.io.JalviewFileChooser(jalview.bin.Cache.getProperty( "LAST_DIRECTORY"), new String[] { "png" }, new String[] { "Portable network graphics" }, "Portable network graphics"); chooser.setFileView(new jalview.io.JalviewFileView()); chooser.setDialogTitle("Create PNG Image of Molecule"); chooser.setToolTipText("Save"); int value = chooser.showSaveDialog(this); if (value != jalview.io.JalviewFileChooser.APPROVE_OPTION) { return; } jalview.bin.Cache.setProperty("LAST_DIRECTORY", chooser.getSelectedFile().getParent()); FileOutputStream out = new FileOutputStream(chooser.getSelectedFile()); BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics png = bi.getGraphics(); Graphics2D ig2 = (Graphics2D) png; ig2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); pdbcanvas.drawAll(png, width, height); ImageIO.write(bi, "png", out); out.close(); } catch (Exception ex) { ex.printStackTrace(); } } public void eps_actionPerformed(ActionEvent e) { boolean accurateText = true; String renderStyle = jalview.bin.Cache.getDefault("EPS_RENDERING", "Prompt each time"); // If we need to prompt, and if the GUI is visible then // Prompt for EPS rendering style if (renderStyle.equalsIgnoreCase("Prompt each time") && ! (System.getProperty("java.awt.headless") != null && System.getProperty("java.awt.headless").equals("true"))) { EPSOptions eps = new EPSOptions(); renderStyle = eps.getValue(); if (renderStyle==null || eps.cancelled) return; } if (renderStyle.equalsIgnoreCase("text")) { accurateText = false; } int width = getWidth(); int height = getHeight(); try { jalview.io.JalviewFileChooser chooser = new jalview.io.JalviewFileChooser(jalview.bin.Cache.getProperty( "LAST_DIRECTORY"), new String[] { "eps" }, new String[] { "Encapsulated Postscript" }, "Encapsulated Postscript"); chooser.setFileView(new jalview.io.JalviewFileView()); chooser.setDialogTitle("Create EPS file from tree"); chooser.setToolTipText("Save"); int value = chooser.showSaveDialog(this); if (value != jalview.io.JalviewFileChooser.APPROVE_OPTION) { return; } jalview.bin.Cache.setProperty("LAST_DIRECTORY", chooser.getSelectedFile().getParent()); FileOutputStream out = new FileOutputStream(chooser.getSelectedFile()); EpsGraphics2D pg = new EpsGraphics2D("Tree", out, 0, 0, width, height); Graphics2D ig2 = (Graphics2D) pg; ig2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); pg.setAccurateTextMode(accurateText); pdbcanvas.drawAll(pg, width, height); pg.flush(); pg.close(); } catch (Exception ex) { ex.printStackTrace(); } } public void charge_actionPerformed(ActionEvent e) { clearButtonGroup(); pdbcanvas.pdb.setChargeColours(); pdbcanvas.redrawneeded=true; pdbcanvas.repaint(); } public void hydro_actionPerformed(ActionEvent e) { clearButtonGroup(); pdbcanvas.pdb.setHydrophobicityColours(); pdbcanvas.redrawneeded=true; pdbcanvas.repaint(); } public void chain_actionPerformed(ActionEvent e) { clearButtonGroup(); pdbcanvas.pdb.setChainColours(); pdbcanvas.redrawneeded=true; pdbcanvas.repaint(); } public void zbuffer_actionPerformed(ActionEvent e) { pdbcanvas.zbuffer = ! pdbcanvas.zbuffer; pdbcanvas.redrawneeded=true; pdbcanvas.repaint(); } public void molecule_actionPerformed(ActionEvent e) { pdbcanvas.bymolecule = ! pdbcanvas.bymolecule; pdbcanvas.redrawneeded=true; pdbcanvas.repaint(); } public void depth_actionPerformed(ActionEvent e) { pdbcanvas.depthcue = ! pdbcanvas.depthcue; pdbcanvas.redrawneeded=true; pdbcanvas.repaint(); } public void wire_actionPerformed(ActionEvent e) { pdbcanvas.wire = ! pdbcanvas.wire; pdbcanvas.redrawneeded=true; pdbcanvas.repaint(); } public void seqButton_actionPerformed(ActionEvent e) { clearButtonGroup(); pdbcanvas.bysequence = seqButton.isSelected(); pdbcanvas.updateSeqColours(); } void clearButtonGroup() { pdbcanvas.bysequence = false; pdbcanvas.bymolecule = false; } public void mapping_actionPerformed(ActionEvent e) { jalview.gui.CutAndPasteTransfer cap = new jalview.gui.CutAndPasteTransfer(); Desktop.addInternalFrame(cap, "PDB - Sequence Mapping", 500, 600); cap.setText(pdbcanvas.mappingDetails.toString()); } }