package chalky;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Paint;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Stroke;
import java.awt.TexturePaint;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.vecmath.Point2d;
import org.openscience.cdk.DefaultChemObjectBuilder;
import org.openscience.cdk.interfaces.IAtomContainer;
import org.openscience.cdk.interfaces.IMolecule;
import org.openscience.cdk.layout.StructureDiagramGenerator;
import org.openscience.cdk.renderer.Renderer2DModel;
import org.openscience.cdk.renderer.elements.ElementGroup;
import org.openscience.cdk.renderer.elements.IRenderingElement;
import org.openscience.cdk.renderer.elements.LineElement;
import org.openscience.cdk.renderer.elements.OvalElement;
import org.openscience.cdk.renderer.elements.TextElement;
import org.openscience.cdk.renderer.elements.WedgeLineElement;
import org.openscience.cdk.renderer.generators.BasicGenerator;
import org.openscience.cdk.renderer.visitor.AbstractAWTRenderingVisitor;
import org.openscience.cdk.smiles.SmilesParser;
@SuppressWarnings("serial")
public class Main extends JPanel {
// these are all related, so must be changed together
public static final int STROKE_WIDTH = 5;
public static final int WIDTH = 500;
public static final int HEIGHT = 500;
public static final int FONT_SIZE = 25;
public static final double SCALE = 50.0;
public class BlackboardMonitor extends AbstractAWTRenderingVisitor {
private final Random r = new Random();
private final Graphics2D g;
public BlackboardMonitor(Graphics2D g, double s, Point2d c) {
super(s, c.x, c.y);
this.g = g;
Stroke stroke = new BasicStroke(STROKE_WIDTH);
this.g.setStroke(stroke);
this.g.setPaint(this.createPaint());
this.g.setFont(new Font("ARIAL", Font.PLAIN, FONT_SIZE));
}
private Paint createPaint() {
int w = STROKE_WIDTH;
int h = 50;
BufferedImage bi = this.makeImage(w, h);
return new TexturePaint(bi, new Rectangle(0, 0, w, h));
}
private BufferedImage makeImage(int w, int h) {
BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_BYTE_GRAY);
Graphics2D g = bi.createGraphics();
for (int i = 0; i < w; i++) {
for (int j = 0; j < h; j++) {
boolean a = r.nextBoolean();
boolean b = r.nextBoolean();
if (a && b) {
g.setColor(Color.WHITE);
} else if (a) {
g.setColor(Color.LIGHT_GRAY);
} else if (b) {
g.setColor(Color.GRAY);
} else {
g.setColor(Color.BLACK);
}
g.fillRect(i, j, 1, 1);
}
}
return bi;
}
public void visitElementGroup(ElementGroup group) {
group.visitChildren(this);
}
public void visitLine(LineElement line) {
g.drawLine(tX(line.x1), tY(line.y1), tX(line.x2), tY(line.y2));
}
public void visitOval(OvalElement arg0) {
// TODO Auto-generated method stub
}
public void visitText(TextElement text) {
Point p = this.getTextBasePoint(text, g);
Rectangle2D textBounds = this.getTextBounds(text, g);
Paint paint = g.getPaint();
this.g.setColor(Color.BLACK);
this.g.fill(textBounds);
this.g.setPaint(paint);
this.g.drawString(text.text, p.x, p.y);
}
public void visitWedge(WedgeLineElement arg0) {
// TODO Auto-generated method stub
}
}
public String smiles = "C1(C2C=CC=C2)C(C)=C(F)C(C2C=CC=C2)=C(C)C1(F)";
private BasicGenerator generator;
private IAtomContainer ac;
public Main() {
this.setPreferredSize(new Dimension(WIDTH, HEIGHT));
this.setBackground(Color.BLACK);
Renderer2DModel model = new Renderer2DModel();
generator = new BasicGenerator(model);
try {
SmilesParser parser = new SmilesParser(DefaultChemObjectBuilder.getInstance());
ac = parser.parseSmiles(smiles);
StructureDiagramGenerator sdg = new StructureDiagramGenerator();
sdg.setMolecule((IMolecule)ac);
sdg.generateCoordinates();
ac = (IAtomContainer)sdg.getMolecule();
} catch (Exception e) {
e.printStackTrace();
ac = null;
}
}
public void paint(Graphics g) {
super.paint(g);
if (ac != null) {
IRenderingElement diagram = generator.generate(ac);
Point2d d = new Point2d((double)WIDTH/2, (double)HEIGHT/2);
diagram.accept(new BlackboardMonitor((Graphics2D) g, SCALE, d));
}
}
public static void main(String[] args) {
JFrame f = new JFrame();
Main m = new Main();
f.add(m);
f.pack();
f.setVisible(true);
}
}