/*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Lesser General Public License for more details.
*
* Copyright (c) 2006 - 2013 Pentaho Corporation.. All rights reserved.
*/
package org.pentaho.reporting.engine.classic.core.modules.output.table.rtf.itext;
import java.awt.Color;
import java.io.IOException;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import com.lowagie.text.Rectangle;
import com.lowagie.text.rtf.RtfElement;
import com.lowagie.text.rtf.document.RtfDocument;
/**
* The PatchRtfBorderGroup represents a collection of RtfBorders to use in a PatchRtfCell or PatchRtfTable.
*
* @author Mark Hall (Mark.Hall@mail.room3b.eu)
* @author Thomas Bickel (tmb99@inode.at)
* @version $Id: PatchRtfBorderGroup.java 3427 2008-05-24 18:32:31Z xlv $
*/
public class PatchRtfBorderGroup extends RtfElement {
/**
* The type of borders this PatchRtfBorderGroup contains. PatchRtfBorder.ROW_BORDER or PatchRtfBorder.CELL_BORDER
*/
private int borderType = PatchRtfBorder.ROW_BORDER;
/**
* The borders in this PatchRtfBorderGroup
*/
private HashMap<Integer, PatchRtfBorder> borders = null;
/**
* Constructs an empty PatchRtfBorderGroup.
*/
public PatchRtfBorderGroup() {
super( null );
this.borders = new HashMap<Integer, PatchRtfBorder>();
}
/**
* Constructs a PatchRtfBorderGroup with on border style for multiple borders.
*
* @param bordersToAdd
* The borders to add (Rectangle.LEFT, Rectangle.RIGHT, Rectangle.TOP, Rectangle.BOTTOM, Rectangle.BOX)
* @param borderStyle
* The style of border to add (from PatchRtfBorder)
* @param borderWidth
* The border width to use
* @param borderColor
* The border color to use
*/
public PatchRtfBorderGroup( int bordersToAdd, int borderStyle, float borderWidth, Color borderColor ) {
super( null );
this.borders = new HashMap<Integer, PatchRtfBorder>();
addBorder( bordersToAdd, borderStyle, borderWidth, borderColor );
}
/**
* Constructs a PatchRtfBorderGroup based on another PatchRtfBorderGroup.
*
* @param doc
* The RtfDocument this PatchRtfBorderGroup belongs to
* @param borderType
* The type of borders this PatchRtfBorderGroup contains
* @param borderGroup
* The PatchRtfBorderGroup to use as a base
*/
protected PatchRtfBorderGroup( RtfDocument doc, int borderType, PatchRtfBorderGroup borderGroup ) {
super( doc );
this.borders = new HashMap<Integer, PatchRtfBorder>();
this.borderType = borderType;
if ( borderGroup != null ) {
for ( Map.Entry<Integer, PatchRtfBorder> entry : borderGroup.getBorders().entrySet() ) {
this.borders.put( entry.getKey(), new PatchRtfBorder( this.document, this.borderType, entry.getValue() ) );
}
}
}
/**
* Constructs a PatchRtfBorderGroup with certain borders
*
* @param doc
* The RtfDocument this PatchRtfBorderGroup belongs to
* @param borderType
* The type of borders this PatchRtfBorderGroup contains
* @param bordersToUse
* The borders to add (Rectangle.LEFT, Rectangle.RIGHT, Rectangle.TOP, Rectangle.BOTTOM, Rectangle.BOX)
* @param borderWidth
* The border width to use
* @param borderColor
* The border color to use
*/
protected PatchRtfBorderGroup( RtfDocument doc, int borderType, int bordersToUse, float borderWidth, Color borderColor ) {
super( doc );
this.borderType = borderType;
this.borders = new HashMap<Integer, PatchRtfBorder>();
addBorder( bordersToUse, PatchRtfBorder.BORDER_SINGLE, borderWidth, borderColor );
}
/**
* Sets a border in the Hashtable of borders
*
* @param borderPosition
* The position of this PatchRtfBorder
* @param borderStyle
* The type of borders this PatchRtfBorderGroup contains
* @param borderWidth
* The border width to use
* @param borderColor
* The border color to use
*/
private void setBorder( int borderPosition, int borderStyle, float borderWidth, Color borderColor ) {
PatchRtfBorder border =
new PatchRtfBorder( this.document, this.borderType, borderPosition, borderStyle, borderWidth, borderColor );
this.borders.put( borderPosition, border );
}
/**
* Adds borders to the PatchRtfBorderGroup
*
* @param bordersToAdd
* The borders to add (Rectangle.LEFT, Rectangle.RIGHT, Rectangle.TOP, Rectangle.BOTTOM, Rectangle.BOX)
* @param borderStyle
* The style of border to add (from PatchRtfBorder)
* @param borderWidth
* The border width to use
* @param borderColor
* The border color to use
*/
public void addBorder( int bordersToAdd, int borderStyle, float borderWidth, Color borderColor ) {
if ( ( bordersToAdd & Rectangle.LEFT ) == Rectangle.LEFT ) {
setBorder( PatchRtfBorder.LEFT_BORDER, borderStyle, borderWidth, borderColor );
}
if ( ( bordersToAdd & Rectangle.TOP ) == Rectangle.TOP ) {
setBorder( PatchRtfBorder.TOP_BORDER, borderStyle, borderWidth, borderColor );
}
if ( ( bordersToAdd & Rectangle.RIGHT ) == Rectangle.RIGHT ) {
setBorder( PatchRtfBorder.RIGHT_BORDER, borderStyle, borderWidth, borderColor );
}
if ( ( bordersToAdd & Rectangle.BOTTOM ) == Rectangle.BOTTOM ) {
setBorder( PatchRtfBorder.BOTTOM_BORDER, borderStyle, borderWidth, borderColor );
}
if ( ( bordersToAdd & Rectangle.BOX ) == Rectangle.BOX && this.borderType == PatchRtfBorder.ROW_BORDER ) {
setBorder( PatchRtfBorder.VERTICAL_BORDER, borderStyle, borderWidth, borderColor );
setBorder( PatchRtfBorder.HORIZONTAL_BORDER, borderStyle, borderWidth, borderColor );
}
}
/**
* Removes borders from the list of borders
*
* @param bordersToRemove
* The borders to remove (from Rectangle)
*/
public void removeBorder( int bordersToRemove ) {
if ( ( bordersToRemove & Rectangle.LEFT ) == Rectangle.LEFT ) {
this.borders.remove( new Integer( PatchRtfBorder.LEFT_BORDER ) );
}
if ( ( bordersToRemove & Rectangle.TOP ) == Rectangle.TOP ) {
this.borders.remove( new Integer( PatchRtfBorder.TOP_BORDER ) );
}
if ( ( bordersToRemove & Rectangle.RIGHT ) == Rectangle.RIGHT ) {
this.borders.remove( new Integer( PatchRtfBorder.RIGHT_BORDER ) );
}
if ( ( bordersToRemove & Rectangle.BOTTOM ) == Rectangle.BOTTOM ) {
this.borders.remove( new Integer( PatchRtfBorder.BOTTOM_BORDER ) );
}
if ( ( bordersToRemove & Rectangle.BOX ) == Rectangle.BOX && this.borderType == PatchRtfBorder.ROW_BORDER ) {
this.borders.remove( new Integer( PatchRtfBorder.VERTICAL_BORDER ) );
this.borders.remove( new Integer( PatchRtfBorder.HORIZONTAL_BORDER ) );
}
}
/**
* Writes the borders of this PatchRtfBorderGroup
*/
public void writeContent( final OutputStream result ) throws IOException {
Iterator<PatchRtfBorder> it = this.borders.values().iterator();
while ( it.hasNext() ) {
it.next().writeContent( result );
}
}
/**
* Gets the RtfBorders of this PatchRtfBorderGroup
*
* @return The RtfBorders of this PatchRtfBorderGroup
*/
protected HashMap<Integer, PatchRtfBorder> getBorders() {
return this.borders;
}
}