001: /**
002: * ===========================================
003: * JFreeReport : a free Java reporting library
004: * ===========================================
005: *
006: * Project Info: http://reporting.pentaho.org/
007: *
008: * (C) Copyright 2001-2007, by Object Refinery Ltd, Pentaho Corporation and Contributors.
009: *
010: * This library is free software; you can redistribute it and/or modify it under the terms
011: * of the GNU Lesser General Public License as published by the Free Software Foundation;
012: * either version 2.1 of the License, or (at your option) any later version.
013: *
014: * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
015: * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
016: * See the GNU Lesser General Public License for more details.
017: *
018: * You should have received a copy of the GNU Lesser General Public License along with this
019: * library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
020: * Boston, MA 02111-1307, USA.
021: *
022: * [Java is a trademark or registered trademark of Sun Microsystems, Inc.
023: * in the United States and other countries.]
024: *
025: * ------------
026: * ProcessUtility.java
027: * ------------
028: * (C) Copyright 2001-2007, by Object Refinery Ltd, Pentaho Corporation and Contributors.
029: */package org.jfree.report.layout.process;
030:
031: import java.awt.BasicStroke;
032: import java.awt.Color;
033: import java.awt.Shape;
034: import java.awt.Stroke;
035: import java.awt.geom.Ellipse2D;
036: import java.awt.geom.Line2D;
037: import java.awt.geom.Rectangle2D;
038: import java.awt.geom.RoundRectangle2D;
039:
040: import org.jfree.report.layout.model.BorderEdge;
041: import org.jfree.report.layout.model.CanvasRenderBox;
042: import org.jfree.report.layout.model.InlineRenderBox;
043: import org.jfree.report.layout.model.RenderBox;
044: import org.jfree.report.layout.model.RenderNode;
045: import org.jfree.report.layout.model.RenderableReplacedContent;
046: import org.jfree.report.layout.model.RenderableText;
047: import org.jfree.report.style.BorderStyle;
048: import org.jfree.report.style.ElementStyleKeys;
049: import org.jfree.report.style.StyleSheet;
050: import org.jfree.report.util.StrokeUtility;
051: import org.jfree.report.util.geom.StrictGeomUtility;
052:
053: /**
054: * Creation-Date: 16.07.2007, 13:42:43
055: *
056: * @author Thomas Morgner
057: */
058: public class ProcessUtility {
059: private ProcessUtility() {
060: }
061:
062: // public static boolean isContent(final RenderBox element,
063: // final boolean recursive)
064: // {
065: // return isContent(element, recursive, false, false);
066: // }
067:
068: public static boolean isContent(final RenderBox element,
069: final boolean recursive, final boolean ellipseAsBackground,
070: final boolean shapesAsContent) {
071:
072: // For legacy reasons: A single ReplacedContent in a paragraph means, we may have a old-style border and
073: // background definition.
074: final RenderNode firstChild = element.getFirstChild();
075: if (element instanceof CanvasRenderBox
076: && firstChild == element.getLastChild()
077: && firstChild instanceof RenderableReplacedContent) {
078:
079: final RenderableReplacedContent rpc = (RenderableReplacedContent) firstChild;
080: final Object rawObject = rpc.getRawObject();
081: final StyleSheet styleSheet = element.getStyleSheet();
082: if (shapesAsContent == false) {
083: if (rawObject instanceof Shape) {
084: return false;
085: }
086: }
087: if (rawObject instanceof Line2D) {
088: if (hasBorderEdge(styleSheet)) {
089: final Line2D line = (Line2D) rawObject;
090: if (line.getY1() == line.getY2()) {
091: return false;
092: } else if (line.getX1() == line.getX2()) {
093: return false;
094: }
095: }
096: } else if (rawObject instanceof Rectangle2D) {
097: return false;
098: } else if (ellipseAsBackground
099: && rawObject instanceof Ellipse2D) {
100: return false;
101: } else if (rawObject instanceof RoundRectangle2D) {
102: return false;
103: }
104: }
105:
106: RenderNode child = element.getFirstChild();
107: while (child != null) {
108: if (child instanceof InlineRenderBox) {
109: return true;
110: } else if (child instanceof RenderableText) {
111: return true;
112: } else if (child instanceof RenderableReplacedContent) {
113: return true;
114: } else if (recursive && child instanceof RenderBox) {
115: if (isContent((RenderBox) child, true,
116: ellipseAsBackground, shapesAsContent)) {
117: return true;
118: }
119: }
120: child = child.getNext();
121: }
122: return false;
123: }
124:
125: public static boolean hasBorderEdge(final StyleSheet style) {
126: final Stroke s = (Stroke) style
127: .getStyleProperty(ElementStyleKeys.STROKE);
128: if (s instanceof BasicStroke == false) {
129: return false;
130: }
131: final BasicStroke bs = (BasicStroke) s;
132: final BorderStyle borderStyle = translateStrokeStyle(s);
133: if (BorderStyle.NONE.equals(borderStyle)) {
134: return false;
135: }
136: return true;
137: }
138:
139: public static BorderEdge produceBorderEdge(final StyleSheet style) {
140: final Stroke s = (Stroke) style
141: .getStyleProperty(ElementStyleKeys.STROKE);
142: if (s instanceof BasicStroke == false) {
143: return null;
144: }
145: final BasicStroke bs = (BasicStroke) s;
146: final BorderStyle borderStyle = translateStrokeStyle(s);
147: if (BorderStyle.NONE.equals(borderStyle)) {
148: return null;
149: }
150:
151: final Color c = (Color) style
152: .getStyleProperty(ElementStyleKeys.PAINT);
153: return new BorderEdge(borderStyle, c, StrictGeomUtility
154: .toInternalValue(bs.getLineWidth()));
155: }
156:
157: public static BorderStyle translateStrokeStyle(final Stroke s) {
158: final int style = StrokeUtility.getStrokeType(s);
159: switch (style) {
160: case StrokeUtility.STROKE_NONE:
161: return BorderStyle.NONE;
162: case StrokeUtility.STROKE_DASHED:
163: return BorderStyle.DASHED;
164: case StrokeUtility.STROKE_DOTTED:
165: return BorderStyle.DOTTED;
166: case StrokeUtility.STROKE_DOT_DASH:
167: return BorderStyle.DOT_DASH;
168: case StrokeUtility.STROKE_DOT_DOT_DASH:
169: return BorderStyle.DOT_DOT_DASH;
170: default:
171: return BorderStyle.SOLID;
172: }
173: }
174: }
|