/*
* 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 - 2009 Pentaho Corporation.. All rights reserved.
*/
package org.pentaho.reporting.engine.classic.core.bugs;
import org.apache.poi.ss.usermodel.ClientAnchor;
import org.apache.poi.xssf.usermodel.XSSFShape;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.pentaho.reporting.engine.classic.core.ClassicEngineBoot;
import org.pentaho.reporting.engine.classic.core.MasterReport;
import org.pentaho.reporting.engine.classic.core.modules.output.fast.xls.FastExcelPrinter;
import org.pentaho.reporting.engine.classic.core.modules.output.table.base.SheetLayout;
import org.pentaho.reporting.engine.classic.core.modules.output.table.base.SlimSheetLayout;
import org.pentaho.reporting.engine.classic.core.modules.output.table.base.TableRectangle;
import org.pentaho.reporting.engine.classic.core.modules.output.table.xls.helper.ExcelImageHandler;
import org.pentaho.reporting.engine.classic.core.modules.output.table.xls.helper.ExcelOutputProcessorMetaData;
import org.pentaho.reporting.engine.classic.core.modules.output.table.xls.helper.ExcelPrinterBase;
import org.pentaho.reporting.engine.classic.core.util.geom.StrictBounds;
import org.pentaho.reporting.engine.classic.core.util.geom.StrictGeomUtility;
import org.pentaho.reporting.libraries.resourceloader.ResourceManager;
public class Prd3278IT {
private static class TestSheetLayout extends SheetLayout {
private TestSheetLayout( final boolean strict, final boolean ellipseAsRectangle ) {
super( strict, ellipseAsRectangle );
}
public void ensureXMapping( final long coordinate, final Boolean aux ) {
super.ensureXMapping( coordinate, aux );
}
public void ensureYMapping( final long coordinate, final Boolean aux ) {
super.ensureYMapping( coordinate, aux );
}
}
private TestSheetLayout sheetLayout;
private TestExcelImageHandler imageHandler;
private TestExcelImageHandler xlsxImageHandler;
private FastExcelPrinter excelPrinter;
private FastExcelPrinter xlsxPrinter;
@Before
public void setUp() {
ClassicEngineBoot.getInstance().start();
sheetLayout = new TestSheetLayout( true, false );
sheetLayout.ensureXMapping( StrictGeomUtility.toInternalValue( 0 ), Boolean.FALSE );
sheetLayout.ensureXMapping( StrictGeomUtility.toInternalValue( 100 ), Boolean.FALSE );
sheetLayout.ensureXMapping( StrictGeomUtility.toInternalValue( 500 ), Boolean.FALSE );
sheetLayout.ensureXMapping( StrictGeomUtility.toInternalValue( 600 ), Boolean.FALSE );
sheetLayout.ensureYMapping( StrictGeomUtility.toInternalValue( 0 ), Boolean.FALSE );
sheetLayout.ensureYMapping( StrictGeomUtility.toInternalValue( 100 ), Boolean.FALSE );
sheetLayout.ensureYMapping( StrictGeomUtility.toInternalValue( 500 ), Boolean.FALSE );
sheetLayout.ensureYMapping( StrictGeomUtility.toInternalValue( 600 ), Boolean.FALSE );
ExcelOutputProcessorMetaData metaData =
new ExcelOutputProcessorMetaData( ExcelOutputProcessorMetaData.PAGINATION_MANUAL );
metaData.initialize( ClassicEngineBoot.getInstance().getGlobalConfig() );
ResourceManager resourceManager = new ResourceManager();
excelPrinter = new FastExcelPrinter( sheetLayout );
excelPrinter.setUseXlsxFormat( false );
excelPrinter.init( metaData, resourceManager, new MasterReport() );
imageHandler = new TestExcelImageHandler( resourceManager, excelPrinter );
xlsxPrinter = new FastExcelPrinter( sheetLayout );
xlsxPrinter.setUseXlsxFormat( true );
xlsxPrinter.init( metaData, resourceManager, new MasterReport() );
xlsxImageHandler = new TestExcelImageHandler( resourceManager, xlsxPrinter );
}
private class TestExcelImageHandler extends ExcelImageHandler {
private TestExcelImageHandler( final ResourceManager resourceManager, final ExcelPrinterBase printerBase ) {
super( resourceManager, printerBase );
}
public ClientAnchor computeClientAnchor( final SlimSheetLayout currentLayout, final TableRectangle rectangle,
final StrictBounds cb ) {
return super.computeClientAnchor( currentLayout, rectangle, cb );
}
}
@Test
public void testImageAligningToCells() {
TableRectangle rect = new TableRectangle();
rect.setRect( 1, 1, 2, 2 );
StrictBounds b =
new StrictBounds( StrictGeomUtility.toInternalValue( 100 ), StrictGeomUtility.toInternalValue( 100 ),
StrictGeomUtility.toInternalValue( 400 ), StrictGeomUtility.toInternalValue( 400 ) );
ClientAnchor clientAnchor = imageHandler.computeClientAnchor( sheetLayout, rect, b );
Assert.assertEquals( 1, clientAnchor.getCol1() );
Assert.assertEquals( 1, clientAnchor.getCol2() );
Assert.assertEquals( 1, clientAnchor.getRow1() );
Assert.assertEquals( 1, clientAnchor.getRow2() );
Assert.assertEquals( 0, clientAnchor.getDx1() );
Assert.assertEquals( 1023, clientAnchor.getDx2() );
Assert.assertEquals( 0, clientAnchor.getDy1() );
Assert.assertEquals( 255, clientAnchor.getDy2() );
}
@Test
public void testImageAligningLeftAndTop() {
TableRectangle rect = new TableRectangle();
rect.setRect( 1, 1, 2, 2 );
StrictBounds b =
new StrictBounds( StrictGeomUtility.toInternalValue( 100 ), StrictGeomUtility.toInternalValue( 100 ),
StrictGeomUtility.toInternalValue( 300 ), StrictGeomUtility.toInternalValue( 300 ) );
ClientAnchor clientAnchor = imageHandler.computeClientAnchor( sheetLayout, rect, b );
Assert.assertEquals( 1, clientAnchor.getCol1() );
Assert.assertEquals( 1, clientAnchor.getCol2() );
Assert.assertEquals( 1, clientAnchor.getRow1() );
Assert.assertEquals( 1, clientAnchor.getRow2() );
Assert.assertEquals( 0, clientAnchor.getDx1() );
Assert.assertEquals( 1023 * 3 / 4, clientAnchor.getDx2() );
Assert.assertEquals( 0, clientAnchor.getDy1() );
Assert.assertEquals( 255 * 3 / 4, clientAnchor.getDy2() );
}
@Test
public void testImageAligningMiddle() {
TableRectangle rect = new TableRectangle();
rect.setRect( 1, 1, 2, 2 );
StrictBounds b =
new StrictBounds( StrictGeomUtility.toInternalValue( 200 ), StrictGeomUtility.toInternalValue( 200 ),
StrictGeomUtility.toInternalValue( 200 ), StrictGeomUtility.toInternalValue( 200 ) );
ClientAnchor clientAnchor = imageHandler.computeClientAnchor( sheetLayout, rect, b );
Assert.assertEquals( 1, clientAnchor.getCol1() );
Assert.assertEquals( 1, clientAnchor.getCol2() );
Assert.assertEquals( 1, clientAnchor.getRow1() );
Assert.assertEquals( 1, clientAnchor.getRow2() );
Assert.assertEquals( 255, clientAnchor.getDx1() );
Assert.assertEquals( 1023 * 3 / 4, clientAnchor.getDx2() );
Assert.assertEquals( 63, clientAnchor.getDy1() );
Assert.assertEquals( 255 * 3 / 4, clientAnchor.getDy2() );
}
@Test
public void testImageAligningToCellsXLSX() {
TableRectangle rect = new TableRectangle();
rect.setRect( 1, 1, 2, 2 );
StrictBounds b =
new StrictBounds( StrictGeomUtility.toInternalValue( 100 ), StrictGeomUtility.toInternalValue( 100 ),
StrictGeomUtility.toInternalValue( 400 ), StrictGeomUtility.toInternalValue( 400 ) );
ClientAnchor clientAnchor = xlsxImageHandler.computeClientAnchor( sheetLayout, rect, b );
Assert.assertEquals( 1, clientAnchor.getCol1() );
Assert.assertEquals( 1, clientAnchor.getCol2() );
Assert.assertEquals( 1, clientAnchor.getRow1() );
Assert.assertEquals( 1, clientAnchor.getRow2() );
Assert.assertEquals( 0, clientAnchor.getDx1() );
Assert.assertEquals( 400 * XSSFShape.EMU_PER_POINT, clientAnchor.getDx2() );
Assert.assertEquals( 0, clientAnchor.getDy1() );
Assert.assertEquals( 400 * XSSFShape.EMU_PER_POINT, clientAnchor.getDy2() );
}
@Test
public void testImageAligningLeftAndTopXLSX() {
TableRectangle rect = new TableRectangle();
rect.setRect( 1, 1, 2, 2 );
StrictBounds b =
new StrictBounds( StrictGeomUtility.toInternalValue( 100 ), StrictGeomUtility.toInternalValue( 100 ),
StrictGeomUtility.toInternalValue( 300 ), StrictGeomUtility.toInternalValue( 300 ) );
ClientAnchor clientAnchor = xlsxImageHandler.computeClientAnchor( sheetLayout, rect, b );
Assert.assertEquals( 1, clientAnchor.getCol1() );
Assert.assertEquals( 1, clientAnchor.getCol2() );
Assert.assertEquals( 1, clientAnchor.getRow1() );
Assert.assertEquals( 1, clientAnchor.getRow2() );
Assert.assertEquals( 0, clientAnchor.getDx1() );
Assert.assertEquals( 300 * XSSFShape.EMU_PER_POINT, clientAnchor.getDx2() );
Assert.assertEquals( 0, clientAnchor.getDy1() );
Assert.assertEquals( 300 * XSSFShape.EMU_PER_POINT, clientAnchor.getDy2() );
}
@Test
public void testImageAligningMiddleXLSX() {
TableRectangle rect = new TableRectangle();
rect.setRect( 1, 1, 2, 2 );
StrictBounds b =
new StrictBounds( StrictGeomUtility.toInternalValue( 200 ), StrictGeomUtility.toInternalValue( 200 ),
StrictGeomUtility.toInternalValue( 200 ), StrictGeomUtility.toInternalValue( 200 ) );
ClientAnchor clientAnchor = xlsxImageHandler.computeClientAnchor( sheetLayout, rect, b );
Assert.assertEquals( 1, clientAnchor.getCol1() );
Assert.assertEquals( 1, clientAnchor.getCol2() );
Assert.assertEquals( 1, clientAnchor.getRow1() );
Assert.assertEquals( 1, clientAnchor.getRow2() );
Assert.assertEquals( 100 * XSSFShape.EMU_PER_POINT, clientAnchor.getDx1() );
Assert.assertEquals( 300 * XSSFShape.EMU_PER_POINT, clientAnchor.getDx2() );
Assert.assertEquals( 100 * XSSFShape.EMU_PER_POINT, clientAnchor.getDy1() );
Assert.assertEquals( 300 * XSSFShape.EMU_PER_POINT, clientAnchor.getDy2() );
}
}