
/*
 *  ====================================================================
 *  The Apache Software License, Version 1.1
 *
 *  Copyright (c) 2002 The Apache Software Foundation.  All rights
 *  reserved.
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions
 *  are met:
 *
 *  1. Redistributions of source code must retain the above copyright
 *  notice, this list of conditions and the following disclaimer.
 *
 *  2. Redistributions in binary form must reproduce the above copyright
 *  notice, this list of conditions and the following disclaimer in
 *  the documentation and/or other materials provided with the
 *  distribution.
 *
 *  3. The end-user documentation included with the redistribution,
 *  if any, must include the following acknowledgment:
 *  "This product includes software developed by the
 *  Apache Software Foundation (http://www.apache.org/)."
 *  Alternately, this acknowledgment may appear in the software itself,
 *  if and wherever such third-party acknowledgments normally appear.
 *
 *  4. The names "Apache" and "Apache Software Foundation" and
 *  "Apache POI" must not be used to endorse or promote products
 *  derived from this software without prior written permission. For
 *  written permission, please contact apache@apache.org.
 *
 *  5. Products derived from this software may not be called "Apache",
 *  "Apache POI", nor may "Apache" appear in their name, without
 *  prior written permission of the Apache Software Foundation.
 *
 *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
 *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 *  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 *  DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
 *  ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
 *  USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 *  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 *  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 *  OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 *  SUCH DAMAGE.
 *  ====================================================================
 *
 *  This software consists of voluntary contributions made by many
 *  individuals on behalf of the Apache Software Foundation.  For more
 *  information on the Apache Software Foundation, please see
 *  <http://www.apache.org/>.
 */
package org.apache.poi.hssf.usermodel.contrib;

import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import org.apache.poi.hssf.util.Region;

import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.lang.exception.NestableException;

/**
 *  Various utility functions that make working with a region of cells easier.
 *
 *@author     Eric Pugh epugh@upstate.com
 *@created    July 29, 2002
 */

public class HSSFRegionUtil {

	/**  Constructor for the HSSFRegionUtil object */
	public HSSFRegionUtil() { }

	/**
	 *  Sets the left border for a region of cells by manipulating the cell style
	 *  of the indidual cells on the left
	 *
	 *@param  border                 The new border
	 *@param  region                 The region that should have the border
	 *@param  workbook               The workbook that the region is on.
	 *@param  sheet                  The sheet that the region is on.
	 *@exception  NestableException  Thrown if the CellStyle can't be changed
	 */
	public static void setBorderLeft( short border, Region region, HSSFWorkbook workbook, HSSFSheet sheet )
		throws NestableException {
		int rowStart = region.getRowFrom();
		int rowEnd = region.getRowTo();
		int column = region.getColumnFrom();

		for ( int i = rowStart; i <= rowEnd; i++ ) {
			HSSFRow row = HSSFUtil.getRow( i, sheet );
			HSSFCell cell = HSSFUtil.getCell( row, column );
			HSSFCellStyle style = copyCellStyle( cell.getCellStyle(), workbook );
			style.setBorderLeft( border );
			cell.setCellStyle( style );
		}
	}

	/**
	 *  Sets the leftBorderColor attribute of the HSSFRegionUtil object
	 *
	 *@param  color                  The color of the border
	 *@param  region                 The region that should have the border
	 *@param  workbook               The workbook that the region is on.
	 *@param  sheet                  The sheet that the region is on.
	 *@exception  NestableException  Thrown if the CellStyle can't be changed
	 *      properly.
	 */
	public static void setLeftBorderColor( short color, Region region, HSSFWorkbook workbook, HSSFSheet sheet )
		throws NestableException {
		int rowStart = region.getRowFrom();
		int rowEnd = region.getRowTo();
		int column = region.getColumnFrom();

		for ( int i = rowStart; i <= rowEnd; i++ ) {
			HSSFRow row = HSSFUtil.getRow( i, sheet );
			HSSFCell cell = HSSFUtil.getCell( row, column );
			HSSFCellStyle style = copyCellStyle( cell.getCellStyle(), workbook );
			style.setLeftBorderColor( color );
			cell.setCellStyle( style );
		}
	}

	/**
	 *  Sets the borderRight attribute of the HSSFRegionUtil object
	 *
	 *@param  border                 The new border
	 *@param  region                 The region that should have the border
	 *@param  workbook               The workbook that the region is on.
	 *@param  sheet                  The sheet that the region is on.
	 *@exception  NestableException  Thrown if the CellStyle can't be changed
	 */
	public static void setBorderRight( short border, Region region, HSSFWorkbook workbook, HSSFSheet sheet )
		throws NestableException {
		int rowStart = region.getRowFrom();
		int rowEnd = region.getRowTo();
		int column = region.getColumnTo();

		for ( int i = rowStart; i <= rowEnd; i++ ) {
			HSSFRow row = HSSFUtil.getRow( i, sheet );
			HSSFCell cell = HSSFUtil.getCell( row, column );
			HSSFCellStyle style = copyCellStyle( cell.getCellStyle(), workbook );
			style.setBorderRight( border );
			cell.setCellStyle( style );
		}
	}

	/**
	 *  Sets the rightBorderColor attribute of the HSSFRegionUtil object
	 *
	 *@param  color                  The color of the border
	 *@param  region                 The region that should have the border
	 *@param  workbook               The workbook that the region is on.
	 *@param  sheet                  The sheet that the region is on.
	 *@exception  NestableException  Thrown if the CellStyle can't be changed
	 *      properly.
	 */
	public static void setRightBorderColor( short color, Region region, HSSFWorkbook workbook, HSSFSheet sheet )
		throws NestableException {
		int rowStart = region.getRowFrom();
		int rowEnd = region.getRowTo();
		int column = region.getColumnTo();

		for ( int i = rowStart; i <= rowEnd; i++ ) {
			HSSFRow row = HSSFUtil.getRow( i, sheet );
			HSSFCell cell = HSSFUtil.getCell( row, column );
			HSSFCellStyle style = copyCellStyle( cell.getCellStyle(), workbook );
			style.setRightBorderColor( color );
			cell.setCellStyle( style );
		}
	}

	/**
	 *  Sets the borderBottom attribute of the HSSFRegionUtil object
	 *
	 *@param  border                 The new border
	 *@param  region                 The region that should have the border
	 *@param  workbook               The workbook that the region is on.
	 *@param  sheet                  The sheet that the region is on.
	 *@exception  NestableException  Thrown if the CellStyle can't be changed
	 */
	public static void setBorderBottom( short border, Region region, HSSFWorkbook workbook, HSSFSheet sheet )
		throws NestableException {
		int colStart = region.getColumnFrom();
		int colEnd = region.getColumnTo();
		int rowIndex = region.getRowTo();
		HSSFRow row = HSSFUtil.getRow( rowIndex, sheet );
		for ( int i = colStart; i <= colEnd; i++ ) {

			HSSFCell cell = HSSFUtil.getCell( row, i );
			HSSFCellStyle style = copyCellStyle( cell.getCellStyle(), workbook );
			style.setBorderBottom( border );
			cell.setCellStyle( style );
		}
	}

	/**
	 *  Sets the bottomBorderColor attribute of the HSSFRegionUtil object
	 *
	 *@param  color                  The color of the border
	 *@param  region                 The region that should have the border
	 *@param  workbook               The workbook that the region is on.
	 *@param  sheet                  The sheet that the region is on.
	 *@exception  NestableException  Thrown if the CellStyle can't be changed
	 *      properly.
	 */
	public static void setBottomBorderColor( short color, Region region, HSSFWorkbook workbook, HSSFSheet sheet )
		throws NestableException {
		int colStart = region.getColumnFrom();
		int colEnd = region.getColumnTo();
		int rowIndex = region.getRowTo();
		HSSFRow row = HSSFUtil.getRow( rowIndex, sheet );
		for ( int i = colStart; i <= colEnd; i++ ) {
			HSSFCell cell = HSSFUtil.getCell( row, i );
			HSSFCellStyle style = copyCellStyle( cell.getCellStyle(), workbook );
			style.setBottomBorderColor( color );
			cell.setCellStyle( style );
		}
	}


	/**
	 *  Sets the borderBottom attribute of the HSSFRegionUtil object
	 *
	 *@param  border                 The new border
	 *@param  region                 The region that should have the border
	 *@param  workbook               The workbook that the region is on.
	 *@param  sheet                  The sheet that the region is on.
	 *@exception  NestableException  Thrown if the CellStyle can't be changed
	 */
	public static void setBorderTop( short border, Region region, HSSFWorkbook workbook, HSSFSheet sheet )
		throws NestableException {
		int colStart = region.getColumnFrom();
		int colEnd = region.getColumnTo();
		int rowIndex = region.getRowFrom();
		HSSFRow row = HSSFUtil.getRow( rowIndex, sheet );
		for ( int i = colStart; i <= colEnd; i++ ) {

			HSSFCell cell = HSSFUtil.getCell( row, i );
			HSSFCellStyle style = copyCellStyle( cell.getCellStyle(), workbook );
			style.setBorderTop( border );
			cell.setCellStyle( style );
		}
	}

	/**
	 *  Sets the topBorderColor attribute of the HSSFRegionUtil object
	 *
	 *@param  color                  The color of the border
	 *@param  region                 The region that should have the border
	 *@param  workbook               The workbook that the region is on.
	 *@param  sheet                  The sheet that the region is on.
	 *@exception  NestableException  Thrown if the CellStyle can't be changed
	 *      properly.
	 */
	public static void setTopBorderColor( short color, Region region, HSSFWorkbook workbook, HSSFSheet sheet )
		throws NestableException {
		int colStart = region.getColumnFrom();
		int colEnd = region.getColumnTo();
		int rowIndex = region.getRowFrom();
		HSSFRow row = HSSFUtil.getRow( rowIndex, sheet );
		for ( int i = colStart; i <= colEnd; i++ ) {
			HSSFCell cell = HSSFUtil.getCell( row, i );
			HSSFCellStyle style = copyCellStyle( cell.getCellStyle(), workbook );
			style.setTopBorderColor( color );
			cell.setCellStyle( style );
		}
	}

	/**
	 *  Description of the Method
	 *
	 *@param  workbook               Description of Parameter
	 *@param  style                  Description of Parameter
	 *@return                        Description of the Returned Value
	 *@exception  NestableException  Description of Exception
	 */
	private static HSSFCellStyle copyCellStyle( HSSFCellStyle style, HSSFWorkbook workbook )
		throws NestableException {
		try {
			HSSFCellStyle style2 = workbook.createCellStyle();

			style2.setFont( workbook.getFontAt( style.getFontIndex() ) );

			PropertyUtils.copyProperties( style2, style );
			/*
			 *  style2.setVerticalAlignment( style.getVerticalAlignment() );
			 *  style2.setAlignment( style.getAlignment() );
			 *  style2.setWrapText( style.getWrapText() );
			 */
			return style2;
		}
		catch ( Exception e ) {
			e.printStackTrace();
			throw new NestableException( "Couldn't copyCellStyle.", e );
		}
	}
}


