OpenConcerto

Dépôt officiel du code source de l'ERP OpenConcerto
sonarqube

svn://code.openconcerto.org/openconcerto

Rev

Blame | Last modification | View Log | RSS feed

package org.openconcerto.modules.label.graphicspl;

import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public abstract class GPLRenderer {
    public static final int ALIGN_LEFT = 0;
    public static final int ALIGN_RIGHT = 1;
    public static final int ALIGN_CENTER = 2;

    public static final int BARCODE_EAN8 = 0;
    public static final int BARCODE_EAN13 = 1;
    public static final int BARCODE_CODE128 = 2;
    public static final int BARCODE_CODE128_GS1 = 3;
    public static final int BARCODE_DATAMATRIX = 4;
    public static final int BARCODE_QRCODE = 5;
    private final float ratio;

    public GPLRenderer(float ratio) {
        this.ratio = ratio;
    }

    public GPLRenderer() {
        this.ratio = 1.0f;
    }

    public float getRatio() {
        return ratio;
    }

    public void render(GraphicsPL graphicsPL) throws IOException {

        Document doc = graphicsPL.getDocument();
        final int width = Integer.parseInt(doc.getDocumentElement().getAttribute("width"));
        NodeList nodeList = doc.getFirstChild().getChildNodes();
        int size = nodeList.getLength();
        for (int i = 0; i < size; i++) {

            if (nodeList.item(i).getNodeType() == Node.ELEMENT_NODE) {
                 Element element = (Element) nodeList.item(i);
                String name = element.getNodeName();
                if (name.equals("text")) {
                    int x = Math.round(ratio * Integer.parseInt(element.getAttribute("x")));
                    int y = Math.round(ratio * Integer.parseInt(element.getAttribute("y")));
                    String txt = element.getTextContent();
                    Color color = Color.BLACK;
                    if (element.hasAttribute("color")) {
                        color = Color.decode(element.getAttribute("color"));
                    }
                    int fontSize = Math.round(ratio * Integer.parseInt(element.getAttribute("fontsize")));
                    String fontName = element.getAttribute("font");
                    int maxWidth = width - x;
                    boolean wrap = false;
                    int align = ALIGN_LEFT;
                    if (element.hasAttribute("align")) {
                        if (element.getAttribute("align").equals("right")) {
                            align = ALIGN_RIGHT;
                        } else if (element.getAttribute("align").equals("center")) {
                            align = ALIGN_CENTER;
                        }
                    }
                    if (!element.hasAttribute("visible") || element.getAttribute("visible").equals("true")) {
                        drawText(x, y, txt, align, fontName, fontSize, color, maxWidth, wrap);
                    }

                } else if (name.equals("rectangle")) {
                    int x = Math.round(ratio * Integer.parseInt(element.getAttribute("x")));
                    int y = Math.round(ratio * Integer.parseInt(element.getAttribute("y")));
                    int w = Math.round(ratio * Integer.parseInt(element.getAttribute("width")));
                    int h = Math.round(ratio * Integer.parseInt(element.getAttribute("height")));
                    Color color = Color.BLACK;
                    if (element.hasAttribute("color")) {
                        color = Color.decode(element.getAttribute("color"));
                    }

                    if (element.hasAttribute("fill") && element.getAttribute("fill").equals("true")) {
                        fillRectangle(x, y, w, h, color);
                    } else {
                        int lineWidth = Math.round(ratio);
                        if (element.hasAttribute("linewidth")) {
                            lineWidth = Math.round(ratio * Integer.parseInt(element.getAttribute("linewidth")));
                        }
                        drawRectangle(x, y, w, h, color, lineWidth);
                    }

                } else if (name.equals("image")) {
                    String fileName = element.getAttribute("file");
                    int x = Math.round(ratio * Integer.parseInt(element.getAttribute("x")));
                    int y = Math.round(ratio * Integer.parseInt(element.getAttribute("y")));
                    BufferedImage img = ImageIO.read(new File(graphicsPL.getImageDir(), fileName));
                    int w = Math.round(ratio * img.getWidth());
                    int h = Math.round(ratio * img.getHeight());
                    if (element.hasAttribute("width")) {
                        w = Math.round(ratio * Integer.parseInt(element.getAttribute("width")));
                    }
                    if (element.hasAttribute("height")) {
                        h = Math.round(ratio * Integer.parseInt(element.getAttribute("height")));
                    }
                    drawImage(x, y, w, h, img);

                } else if (name.equals("barcode")) {
                    int x = Math.round(ratio * Integer.parseInt(element.getAttribute("x")));
                    int y = Math.round(ratio * Integer.parseInt(element.getAttribute("y")));
                    int h = 0;

                    if (element.hasAttribute("height")) {
                        h = Math.round(ratio * Integer.parseInt(element.getAttribute("height")));
                    }
                    String type = element.getAttribute("type");
                    String code = element.getTextContent();
                    int t;
                    if (type.equals("ean8")) {
                        t = BARCODE_EAN8;
                    } else if (type.equals("ean13")) {
                        t = BARCODE_EAN13;
                    } else if (type.equals("ean128")) {
                        t = BARCODE_CODE128;
                    } else if (type.equals("gs1")) {
                        t = BARCODE_CODE128_GS1;
                    } else if (type.equals("datamatrix")) {
                        t = BARCODE_DATAMATRIX;
                        if (h != 0) {
                            System.err.println("ignoring datamatrix height attribute");
                        }
                    } else if (type.equals("qrcode")) {
                        t = BARCODE_QRCODE;
                    } else {
                        throw new IllegalArgumentException("unsupported barcode type : " + type);
                    }

                    int fontSize = Math.round(ratio * 8);
                    if (element.hasAttribute("fontsize")) {
                        fontSize = Math.round(ratio * Integer.parseInt(element.getAttribute("fontsize")));
                    }
                    int moduleWidth = Math.round(ratio);
                    if (element.hasAttribute("modulewidth")) {
                        moduleWidth = Math.round(ratio * Integer.parseInt(element.getAttribute("modulewidth")));
                    }
                    drawBarcode(x, y, h, t, code, moduleWidth, fontSize);
                } else {
                    throw new IllegalStateException("unsupported primitive : " + name);
                }
            }
        }
    }

    public abstract void drawText(int x, int y, String text, int align, String fontName, int fontSize, Color color, int maxWidth, boolean wrap);

    public abstract void drawImage(int x, int y, int w, int h, BufferedImage img);

    public abstract void fillRectangle(int x, int y, int w, int h, Color color);

    public abstract void drawRectangle(int x, int y, int w, int h, Color color, int lineWidth);

    public abstract void drawBarcode(int x, int y, int h, int type, String code, int moduleWidth, int fontSize);

}