/* * 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.Font; import java.awt.Graphics2D; import java.util.ArrayList; import java.util.List; import java.util.Vector; import org.jopendocument.model.style.StyleStyle; import org.jopendocument.model.style.StyleTextProperties; import org.jopendocument.model.text.TextP; import org.jopendocument.model.text.TextSpan; public class ODTCellText { private List<ODTCellTextItem> items = new Vector<ODTCellTextItem>(); private TextP textP; private Graphics2D g2; private double resizeFactor; private StyleStyle cellTextStyle; public ODTCellText(Graphics2D g, TextP textp, double resizeFactor, StyleStyle cellStyle) { this.textP = textp; this.g2 = g; this.resizeFactor = resizeFactor; if (cellStyle == null) { throw new IllegalArgumentException("Default style null"); } this.cellTextStyle = cellStyle; computeItems(); } public String getFullText() { String t = ""; List<TextSpan> lt = textP.getTextSpans(); for (TextSpan tp : lt) { if (tp.getValue() != null) { t += tp.getValue(); } } return t; } public boolean isEmpty() { List<TextSpan> lt = textP.getTextSpans(); for (TextSpan tp : lt) { if (tp.getValue() != null && tp.getValue().length() > 0) { return false; } } return true; } public int getHeight() { int maxH = 0; for (ODTCellTextItem item : items) { int height = item.getHeight(); if (height > maxH) { maxH = height; } } return maxH; } public int getWidth() { int w = 0; for (ODTCellTextItem item : items) { int width = item.getWidth(); w += width; } return w; } public void draw(int startX, int y) { int x = startX; for (ODTCellTextItem item : items) { Font f = item.getFont(); g2.setFont(f); g2.setColor(item.getColor()); final String text = item.getText(); if (text != null) { g2.drawString(text, x, y); x += item.getWidth(); } } } private void computeItems() { final List<TextSpan> lt = textP.getTextSpans(); for (TextSpan textpan : lt) { textpan.setTextStyle(mergeStyle(cellTextStyle, textpan.getTextStyle())); ODTCellTextItem item = new ODTCellTextItem(g2, textpan.getValue(), resizeFactor, textpan.getTextStyle()); items.add(item); } } private StyleStyle mergeStyle(StyleStyle cellTextStyle, StyleStyle spanTextStyle) { StyleStyle s = new StyleStyle(); StyleTextProperties cellTextProperties = cellTextStyle.getStyleTextProperties(); StyleTextProperties spanTextProperties = null; if (spanTextStyle != null) { spanTextProperties = spanTextStyle.getStyleTextProperties(); } s.setTextProperties(mergeTextProperties(cellTextProperties, spanTextProperties)); return s; } private StyleTextProperties mergeTextProperties(StyleTextProperties cellTextProperties, StyleTextProperties spanTextProperties) { StyleTextProperties r = new StyleTextProperties(); // Merge font name String fontName = null; if (spanTextProperties != null) { fontName = spanTextProperties.getFontName(); } if (fontName == null && cellTextProperties != null) { fontName = cellTextProperties.getFontName(); } if (fontName == null) { System.err.println("Assuming default font:Arial"); fontName = "Arial"; } // Merge font size String fontSize = null; if (spanTextProperties != null) { fontSize = spanTextProperties.getFontSize(); } if (fontSize == null && cellTextProperties != null) { fontSize = cellTextProperties.getFontSize(); } if (fontSize == null) { fontSize = "11pt"; } // Merge font weight String fontWeight = null; if (spanTextProperties != null) { fontWeight = spanTextProperties.getFontWeight(); } if (fontWeight == null && cellTextProperties != null) { fontWeight = cellTextProperties.getFontWeight(); } if (fontWeight == null) { fontWeight = "normal"; } // Merge font color Color fontColor = null; if (spanTextProperties != null) { fontColor = spanTextProperties.getColor(); } if (fontColor == null && cellTextProperties != null) { fontColor = cellTextProperties.getColor(); } if (fontColor == null) { fontColor = Color.BLACK; } // OK r.setFontName(fontName); r.setFontSize(fontSize); r.setFontWeight(fontWeight); r.setColor(fontColor); return r; } public void drawJustified(int x, int y, String verticalAlign, int padding, int cellWidth) { final int maxLineWidth = cellWidth - 2 * padding; List<ODTCellTextItem> smallitems = new ArrayList<ODTCellTextItem>(); List<TextSpan> lt = textP.getTextSpans(); for (TextSpan textpan : lt) { textpan.setTextStyle(mergeStyle(cellTextStyle, textpan.getTextStyle())); String[] strings = textpan.getCutedValues(); for (int i = 0; i < strings.length; i++) { String s = strings[i].trim(); ODTCellTextItem item = new ODTCellTextItem(g2, s, resizeFactor, textpan.getTextStyle()); smallitems.add(item); } } int w = 0; ODTCellTextLineItem currentLine = new ODTCellTextLineItem(); ArrayList<ODTCellTextLineItem> lines = new ArrayList<ODTCellTextLineItem>(); lines.add(currentLine); int maxHeight = 0; for (ODTCellTextItem item : smallitems) { final int widthWithSpace = item.getWidthWithSpace(); w += widthWithSpace; if (w > maxLineWidth) { currentLine = new ODTCellTextLineItem(); maxHeight = 0; w = widthWithSpace; lines.add(currentLine); } final int height = item.getHeight(); if (height > maxHeight) { maxHeight = height; } currentLine.addItem(item); } int cx = x + padding; int cy = y; for (int i = 0; i < lines.size(); i++) { ODTCellTextLineItem line = lines.get(i); int addSpace = 0; int totalSpace = maxLineWidth - line.getTotalWidthWithoutSpace(); if (line.getSize() > 1 && totalSpace > 0 && i < lines.size() - 1) { addSpace = totalSpace / (line.getSize() - 1); } cy += line.getHeight(); cy += (4 * 360) / resizeFactor;// FIXME: interligne for (ODTCellTextItem item : line.getItems()) { Font f = item.getFont(); g2.setFont(f); g2.setColor(item.getColor()); String text = item.getText(); if (addSpace == 0) { text += " "; item.setText(text); } if (text != null) { g2.drawString(text, cx, cy); cx += item.getWidth() + addSpace; } } cx = x + padding; } } }