package net.sf.jtikz;

import java.text.*;
import java.awt.*;
import java.awt.image.*;
import java.awt.image.renderable.*;
import java.awt.font.*;
import java.awt.geom.*;
import java.io.*;
import java.util.*;

public abstract class AbstractGraphicsInterface extends Graphics2D implements Closeable, Flushable {
    LinkedList children;
    AbstractGraphicsInterface parent;
    AffineTransform transform;
    boolean closed;
    String preamble;
    Shape currentClip;
    Color color;
    Font font;
    Thread shutdownHook;
    Color background;
    BasicStroke stroke;
    LinkedList commands;
    
    public boolean verbose = false;

    protected PrintStream out;

    protected static enum Action { DRAW, FILL, CLIP };

    protected void addCommand(Object command) {
        if(parent != null)
            parent.addCommand(command);
        else {
            if (verbose) System.err.println("Command: " + command); // change by av
            GraphicsCommand grcmd = new GraphicsCommand(command, this); // change by av
            grcmd.verbose = verbose; // change by av
            commands.addLast(grcmd); // change by av
        }
    }

    protected LinkedList getCommands() {
        return commands;
    }

    protected abstract AbstractGraphicsInterface newInstance();

    public final AbstractGraphicsInterface create() {
        if (verbose) System.err.println("create()"); // change by av
        AbstractGraphicsInterface g = newInstance();
        children.add(g);
        g.parent = this;
        g.setClip(getClip());
        g.transform = new AffineTransform(transform);
        if (verbose) System.err.println("Transform: " + g.transform); // change by av
        return g;
    }
    public final AbstractGraphicsInterface create(int x, int y, int width, int height) {
        if (verbose) System.err.println("create(" + x + ", " + y + ", " + width + ", " + height + ", " + currentClip + ")"); // change by av
        AbstractGraphicsInterface g = create();
        g.setClip(x, y, width, height);
        g.translate(x, y);
        return g;
    }

    protected AbstractGraphicsInterface getParent() {
        return parent;
    }

    public AbstractGraphicsInterface() {
        this(System.out);
    }
    public AbstractGraphicsInterface(OutputStream os) {
        if(os == null)
            os = System.out;
        if(os instanceof PrintStream)
            out = (PrintStream)os;
        else
            out = new PrintStream(os);
        parent = null;
        transform = new AffineTransform();
        closed = false;
        preamble = "";
        shutdownHook = new Thread() {
                public void run() {
                    flush();
                }
            };
        Runtime.getRuntime().addShutdownHook(shutdownHook);
        flush();
    }

    public void setColor(Color c) {
        this.color = c;
    }
    public Color getColor() {
        return color;
    }

    public void draw(Shape shape) {
        handlePath(shape.getPathIterator(transform), Action.DRAW);
    }

    public void fill(Shape shape) {
        handlePath(shape.getPathIterator(transform), Action.FILL);
    }

    public void drawPolygon(Polygon p) {
        handlePath(p.getPathIterator(transform), Action.DRAW);
    }
    public void fillPolygon(Polygon p) {
        handlePath(p.getPathIterator(transform), Action.FILL);
    }
    public void fillPolygon(int[] xPoints, int[] yPoints, int nPoints) {
        fillPolygon(new Polygon(xPoints, yPoints, nPoints));
    }
    public void drawPolygon(int[] xPoints, int[] yPoints, int nPoints) {
        drawPolygon(new Polygon(xPoints, yPoints, nPoints));
    }
    public void drawPolyline(int[] xPoints, int[] yPoints, int nPoints) {
        if(nPoints < 2)
            return;
        else if(xPoints[0] == xPoints[nPoints - 1] && yPoints[0] == yPoints[nPoints - 1])
            drawPolygon(xPoints, yPoints, nPoints);
        else {
            double newx[] = new double[xPoints.length];
            double newy[] = new double[yPoints.length];
            Point2D.Double p1 = new Point2D.Double();
            Point2D.Double p2 = new Point2D.Double();
            for(int i=0; i();
        font = new Font("Arial", Font.PLAIN, 12);
        stroke = new BasicStroke();
        color = Color.BLACK;
        background = Color.WHITE;
        preamble = "";
        commands = new LinkedList();
    }

    protected abstract void flushInternal();

    public Font getFont() {
        return font;
    }

    public void setFont(Font font) {
        this.font = font;
    }

    public FontMetrics getFontMetrics() {
        //return new FontMetrics(font);
        return null; /* TODO: fix this later! */
    }

    public FontMetrics getFontMetrics(Font font) {
        //return new FontMetrics(font);
        return null; /* TODO: fix this later! */
    }

    public void setXORMode(Color c1) {
        /* TODO: implement this later! */
    }

    public void setPaintMode() {
        /* TODO: implement this later! */
    }

    public void dispose() {
        close();
    }

    public void close() {
        if(!closed) {
            for(AbstractGraphicsInterface child : children)
                child.close();
            flush();
            closed = true;
            Runtime.getRuntime().removeShutdownHook(shutdownHook);
            shutdownHook = null;
        }
    }

    public FontRenderContext getFontRenderContext() {
        return new FontRenderContext(transform, true, true);
    }

    public AffineTransform getTransform() {
        return new AffineTransform(transform);
    }

    public void transform(AffineTransform transform) {
        this.transform.concatenate(transform);
    }

    public void setTransform(AffineTransform transform) {
        this.transform.setTransform(transform);
    }

    public void setClip(Shape clip) {
        /* close off existing clips */
        this.currentClip = clip;
    }

    public void setClip(int x, int y, int width, int height) {
        setClip(new Rectangle2D.Double(x, y, width, height));
    }

    public void clip(Shape clip) {
        /* TODO: fix this such that it actually intersects the clips! */
        setClip(clip);
    }

    public void clipRect(int x, int y, int width, int height) {
        clip(new Rectangle2D.Double(x, y, width, height));
    }

    public Shape getClip() {
        return currentClip;
    }

    public Rectangle getClipBounds() {
        return currentClip == null ? null : currentClip.getBounds();
    }

    public void drawString(String s, int x, int y) {
        drawString(s, (float)x, (float)y);
    }
    public void drawString(String s, float x, float y) {
        Point2D p1 = transform.transform(new Point2D.Double(x, y), null);
        handleDrawString(s, p1.getX(), p1.getY());
    }
    public void drawString(AttributedCharacterIterator iterator, float x, float y) {
        StringBuffer s = new StringBuffer("");
        for(char c = iterator.first(); c != CharacterIterator.DONE; c = iterator.next())
            s.append(c);
        drawString(s.toString(), x, y);
    }
    public void drawString(AttributedCharacterIterator iterator, int x, int y) {
        drawString(iterator, (float)x, (float)y);
    }
    protected abstract void handleDrawString(String s, double x, double y);

    private static class Repainter implements Runnable {
        Component component;
        Graphics g;
        public Repainter(Component component, Graphics g) {
            this.component = component;
            this.g = g;
        }
        public void run() {
            //component.repaint();
            component.paint(g);
        }
    }

    public void paintComponent(Component component) {
        javax.swing.RepaintManager old = javax.swing.RepaintManager.currentManager(component);
        javax.swing.RepaintManager.setCurrentManager(new GraphicsInterfaceRepaintManager(this));
        //component.paint(this);
        try {
            javax.swing.SwingUtilities.invokeAndWait(new Repainter(component, this));
        } catch(Exception e) { }
        javax.swing.RepaintManager.setCurrentManager(old);
    }

    public void drawRenderedImage(RenderedImage image, AffineTransform xform) {
        ColorModel c = image.getColorModel();
        Raster r = image.getData();
        for(int x=0; x hints) {
        /* TODO: implement this later ! */
    }

    public void addRenderingHint(RenderingHints.Key hintKey, Object hintValue) {
        /* TODO: implement this later ! */
    }

    public void setRenderingHints(Map hints) {
        /* TODO: implement this later ! */
    }

    public void setRenderingHint(RenderingHints.Key hintKey, Object hintValue) {
        /* TODO: implement this later ! */
    }

    public GraphicsConfiguration getDeviceConfiguration() {
        return null; /* TODO: implement this later! */
    }

    public boolean hit(Rectangle rect, Shape s, boolean onStroke) {
        return true; /* TODO: implement this more intelligently later! */
    }

    public void drawGlyphVector(GlyphVector g, float x, float y) {
        /* TODO: implement this later! */
    }

    public boolean drawImage(Image img, int x, int y, int width, int height, Color bgcolor, ImageObserver observer) { return true; }
    public boolean drawImage(Image img, int x, int y, Color bgcolor, ImageObserver observer) { return true; }
    public boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, Color bgcolor, ImageObserver observer) { return true; }
    public boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, ImageObserver observer) { return true; }
    public boolean drawImage(Image img, int x, int y, int width, int height, ImageObserver observer) { return true; }
    public boolean drawImage(Image img, int x, int y, ImageObserver observer) { return true; }
}
 

Ads help maintain this website.