/** * Copyright (C) 2011-2015 The XDocReport Team <xdocreport@googlegroups.com> * * All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ package fr.opensagres.xdocreport.itext.extension; import com.itextpdf.text.BaseColor; import com.itextpdf.text.Element; import com.itextpdf.text.Paragraph; import com.itextpdf.text.Rectangle; import com.itextpdf.text.pdf.PdfPCell; import com.itextpdf.text.pdf.PdfPTable; public class ExtendedParagraph extends Paragraph implements IITextContainer { private static final long serialVersionUID = 664309269352903329L; public static final BaseColor TRANSPARENT_COLOR = BaseColor.WHITE; private IITextContainer container; protected PdfPCell wrapperCell; protected PdfPTable wrapperTable; public ExtendedParagraph() { } public ExtendedParagraph( Paragraph paragraph ) { super( paragraph ); } public void addElement( Element element ) { // in function add(Element element) chunks are cloned // it is not correct for chunks with dynamic content (ie page number) // use function add(int index, Element element) because in this function chunks are added without cloning super.add( size(), element ); } public IITextContainer getITextContainer() { return container; } public void setITextContainer( IITextContainer container ) { this.container = container; } private PdfPCell createCell() { PdfPCell cell = new PdfPCell(); cell.setBorder( Rectangle.NO_BORDER ); cell.setPadding( 0.0f ); cell.setUseBorderPadding( true ); cell.getColumn().setAdjustFirstLine( false ); return cell; } private PdfPTable createTable( PdfPCell cell ) { PdfPTable table = new PdfPTable( 1 ); table.setWidthPercentage( 100.0f ); table.setSplitLate( false ); table.addCell( cell ); return table; } protected PdfPCell getWrapperCell() { if ( wrapperCell == null ) { wrapperCell = createCell(); } return wrapperCell; } protected PdfPTable createWrapperTable( PdfPCell wrapperCell, boolean addParagraph ) { PdfPTable wrapperTable = null; // wrap this paragraph into a table if necessary if ( wrapperCell != null ) { // background color or borders were set if ( addParagraph ) { wrapperCell.addElement( this ); } wrapperTable = createTable( wrapperCell ); if ( getSpacingBefore() > 0.0f || getSpacingAfter() > 0.0f ) { // top or bottom margin was set, promote it to enclosing table wrapperTable.setSpacingBefore( getSpacingBefore() ); setSpacingBefore( 0.0f ); wrapperTable.setSpacingAfter( getSpacingAfter() ); setSpacingAfter( 0.0f ); } if ( getIndentationLeft() > 0.0f || getIndentationRight() > 0.0f ) { // left or right margin was set, have to wrap the cell again PdfPCell outerCell = createCell(); outerCell.setPaddingLeft( getIndentationLeft() ); setIndentationLeft( 0.0f ); outerCell.setPaddingRight( getIndentationRight() ); setIndentationRight( 0.0f ); outerCell.addElement( wrapperTable ); wrapperTable = createTable( outerCell ); } } return wrapperTable; } public Element getElement() { if ( wrapperCell != null ) { if ( wrapperTable == null ) { wrapperTable = createWrapperTable( wrapperCell, true ); } } return wrapperTable != null ? wrapperTable : this; } public boolean hasBorders() { return wrapperCell != null && wrapperCell.hasBorders(); } public boolean hasBackgroundColor() { return wrapperCell != null && wrapperCell.getBackgroundColor() != null && !TRANSPARENT_COLOR.equals( wrapperCell.getBackgroundColor() ); } public void setSpacingBefore( Paragraph paragraph ) { setSpacingBefore( paragraph.getSpacingBefore() ); } public void setSpacingAfter( Paragraph paragraph ) { setSpacingAfter( paragraph.getSpacingAfter() ); } public void setIndentation( Paragraph paragraph ) { setIndentationLeft( paragraph.getIndentationLeft() ); setIndentationRight( paragraph.getIndentationRight() ); } public void setBackgroundColor( BaseColor backgroundColor ) { getWrapperCell().setBackgroundColor( backgroundColor ); } /** * Sets the width of the Top border. * * @param borderWidthTop a width */ public void setBorderWidthTop( float borderWidthTop ) { getWrapperCell().setBorderWidthTop( borderWidthTop ); } /** * Sets the color of the top border. * * @param borderColorTop a <CODE>Color</CODE> */ public void setBorderColorTop( BaseColor borderColorTop ) { getWrapperCell().setBorderColorTop( borderColorTop ); } /** * Sets the width of the bottom border. * * @param borderWidthBottom a width */ public void setBorderWidthBottom( float borderWidthBottom ) { getWrapperCell().setBorderWidthBottom( borderWidthBottom ); } /** * Sets the color of the Bottom border. * * @param borderColorBottom a <CODE>Color</CODE> */ public void setBorderColorBottom( BaseColor borderColorBottom ) { getWrapperCell().setBorderColorBottom( borderColorBottom ); } /** * Sets the width of the Left border. * * @param borderWidthLeft a width */ public void setBorderWidthLeft( float borderWidthLeft ) { getWrapperCell().setBorderWidthLeft( borderWidthLeft ); } /** * Sets the color of the Left border. * * @param borderColorLeft a <CODE>Color</CODE> */ public void setBorderColorLeft( BaseColor borderColorLeft ) { getWrapperCell().setBorderColorLeft( borderColorLeft ); } /** * Sets the width of the Right border. * * @param borderWidthRight a width */ public void setBorderWidthRight( float borderWidthRight ) { getWrapperCell().setBorderWidthRight( borderWidthRight ); } /** * Sets the color of the Right border. * * @param borderColorRight a <CODE>Color</CODE> */ public void setBorderColorRight( BaseColor borderColorRight ) { getWrapperCell().setBorderColorRight( borderColorRight ); } /** * Sets the padding of the contents in the cell (space between content and border). * * @param padding */ public void setBorderPadding( float padding ) { getWrapperCell().setPadding( padding ); } /** * Setter for property paddingLeft. * * @param paddingLeft New value of property paddingLeft. */ public void setBorderPaddingLeft( float paddingLeft ) { getWrapperCell().setPaddingLeft( paddingLeft ); } /** * Setter for property paddingRight. * * @param paddingRight New value of property paddingRight. */ public void setBorderPaddingRight( float paddingRight ) { getWrapperCell().setPaddingRight( paddingRight ); } /** * Setter for property paddingBottom. * * @param paddingBottom New value of property paddingBottom. */ public void setBorderPaddingBottom( float paddingBottom ) { getWrapperCell().setPaddingBottom( paddingBottom ); } /** * Setter for property paddingTop. * * @param paddingTop New value of property paddingTop. */ public void setBorderPaddingTop( float paddingTop ) { getWrapperCell().setPaddingTop( paddingTop ); } }