/*
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 * 
 * Copyright 2008 jOpenDocument, by ILM Informatique. All rights reserved.
 * 
 * The contents of this file are subject to the terms of the GNU
 * General Public License Version 3 only ("GPL").  
 * You may not use this file except in compliance with the License. 
 * You can obtain a copy of the License at http://www.gnu.org/licenses/gpl-3.0.html
 * See the License for the specific language governing permissions and limitations under the License.
 * 
 * When distributing the software, include this License Header Notice in each file.
 * 
 */

package org.jopendocument.renderer;

import java.awt.Color;
import java.awt.Graphics2D;

import org.jopendocument.model.style.StyleParagraphProperties;
import org.jopendocument.model.style.StyleStyle;
import org.jopendocument.model.style.StyleTableCellProperties;
import org.jopendocument.model.table.TableTableCell;
import org.jopendocument.model.text.TextP;
import org.jopendocument.util.ValueHelper;

public class ODTCellTextRenderer implements ODTCellRenderer {

    public void draw(Graphics2D g, int x, int y, int cellWidth, int cellHeight, double resizeFactor, TableTableCell cell, StyleTableCellProperties cellProps) {
        final TextP textp = cell.getTextP();

        if (textp != null) {
            if (textp.isEmpty()) {
                return;
            }
            final StyleStyle cellStyle = cell.getStyle();
            if (cellStyle == null) {
                g.setColor(Color.RED);
                g.drawRect(x, y, cellWidth, cellHeight);
                return;
            }
            final ODTCellText text = new ODTCellText(g, textp, resizeFactor, cellStyle);

            if (!text.isEmpty()) {
                if (cellProps == null) {
                    cellProps = new StyleTableCellProperties();
                }
                if (cellProps.getVerticalAlign() == null) {
                    cellProps.setVerticalAlign("Standard");
                }
                if (cellProps.getPadding() == null) {
                    cellProps.setPadding("0.035cm");
                }
                if (cellStyle != null) {

                    int offsetX = 0;
                    int offsetY = 0;
                    int padding = 0;

                    String verticalAlign = cellProps.getVerticalAlign();
                    String padValue = cellProps.getPadding();
                    padding = 1 + (int) Math.round((ValueHelper.getLength(padValue) / resizeFactor));

                    if (verticalAlign.equals("middle")) {
                        offsetY = (cellHeight + text.getHeight()) / 2;
                    } else if (verticalAlign.equals("top")) {
                        offsetY = text.getHeight();
                        offsetY += padding;
                    } else {
                        offsetY = cellHeight;
                        offsetY -= padding;
                    }
                    boolean justify = false;
                    StyleParagraphProperties paragraphProps = cell.getStyle().getParagraphProperties();
                    if (paragraphProps != null) {
                        String textAlign = paragraphProps.getTextAlign();
                        if (textAlign != null) {
                            if (textAlign.equals("center")) {
                                int strWidth = text.getWidth();
                                offsetX = (cellWidth - strWidth) / 2;
                            } else if (textAlign.equals("end")) {
                                int strWidth = text.getWidth();
                                offsetX = cellWidth - strWidth - padding;
                            } else if (textAlign.equals("justify")) {
                                justify = true;
                                offsetX += padding;
                            } else {
                                // Left
                                offsetX += padding;
                            }
                        } else {
                            final String tableValueType = cell.getTableValueType();
                            if (tableValueType != null && tableValueType.equals("float")) {
                                int strWidth = text.getWidth();
                                offsetX = cellWidth - strWidth - padding;
                            } else {
                                // Left
                                offsetX += padding;
                            }
                        }
                    } else {
                        final String tableValueType = cell.getTableValueType();

                        if (tableValueType != null && tableValueType.equals("float")) {
                            int strWidth = text.getWidth();
                            offsetX = cellWidth - strWidth - padding;
                        } else {
                            // Left
                            offsetX += padding;
                        }
                    }

                    if (!justify) {
                        text.draw(x + offsetX, y + offsetY);
                    } else {
                        text.drawJustified(x, y, verticalAlign, padding, cellWidth);
                    }
                }
            }
        }

    }

}
