/*
* 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.fast.xls;
import java.awt.Color;
import java.util.ArrayList;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.poi.ss.usermodel.CreationHelper;
import org.pentaho.reporting.engine.classic.core.ReportElement;
import org.pentaho.reporting.engine.classic.core.function.ExpressionRuntime;
import org.pentaho.reporting.engine.classic.core.layout.output.ContentProcessingException;
import org.pentaho.reporting.engine.classic.core.layout.style.SimpleStyleSheet;
import org.pentaho.reporting.engine.classic.core.modules.output.fast.template.FastTextExtractor;
import org.pentaho.reporting.engine.classic.core.modules.output.table.xls.helper.ExcelColorProducer;
import org.pentaho.reporting.engine.classic.core.modules.output.table.xls.helper.ExcelFontFactory;
import org.pentaho.reporting.engine.classic.core.modules.output.table.xls.helper.ExcelTextExtractor;
import org.pentaho.reporting.engine.classic.core.modules.output.table.xls.helper.HSSFFontWrapper;
import org.pentaho.reporting.engine.classic.core.modules.output.table.xls.helper.RichTextFormat;
import org.pentaho.reporting.engine.classic.core.style.ElementStyleKeys;
import org.pentaho.reporting.libraries.base.util.FastStack;
public class FastExcelTextExtractor extends FastTextExtractor {
private static final Log logger = LogFactory.getLog( FastExcelTextExtractor.class );
private final ExcelFontFactory fontFactory;
private final CreationHelper creationHelper;
private final ArrayList<RichTextFormat> formatBuffer;
private final ExcelColorProducer colorProducer;
private final FastStack<RichTextFormat> formatBufferStack;
public FastExcelTextExtractor( final ExcelColorProducer colorProducer, final ExcelFontFactory fontFactory,
final CreationHelper creationHelper ) {
this.colorProducer = colorProducer;
this.formatBuffer = new ArrayList<RichTextFormat>();
this.fontFactory = fontFactory;
this.creationHelper = creationHelper;
this.formatBufferStack = new FastStack<RichTextFormat>();
}
public Object compute( final ReportElement content, final ExpressionRuntime runtime )
throws ContentProcessingException {
this.formatBuffer.clear();
super.compute( content, runtime );
if ( formatBuffer.size() <= 1 ) {
// A simple result. So there's no need to create a rich-text string.
final Object rawResult = getRawResult();
if ( rawResult != null && rawResult instanceof String == false ) {
return rawResult;
}
final String text = getText();
if ( text.length() > 32767 ) {
logger.warn( "Excel-Cells cannot contain text larger than 32.737 characters. Text will be clipped." );
return text.substring( 0, 32767 );
} else if ( text.length() > 0 ) {
return text;
}
return null;
}
final String text = getText();
return ExcelTextExtractor.computeRichText( fontFactory, creationHelper, text, formatBuffer );
}
protected boolean inspectStartSection( final ReportElement box, final boolean inlineSection ) {
SimpleStyleSheet styleSheet = box.getComputedStyle();
if ( styleSheet.getBooleanStyleProperty( ElementStyleKeys.VISIBLE ) == false ) {
return false;
}
final Color textColor = (Color) styleSheet.getStyleProperty( ElementStyleKeys.PAINT );
final HSSFFontWrapper wrapper = new HSSFFontWrapper( styleSheet, colorProducer.getNearestColor( textColor ) );
final RichTextFormat rtf = new RichTextFormat( getTextLength(), wrapper );
// Check the style.
if ( formatBuffer.isEmpty() ) {
formatBuffer.add( rtf );
} else {
int lastIndex = formatBuffer.size() - 1;
final RichTextFormat lastRtf = formatBuffer.get( lastIndex );
if ( lastRtf.getPosition() == rtf.getPosition() ) {
formatBuffer.set( lastIndex, rtf );
} else if ( lastRtf.getFont().equals( rtf.getFont() ) == false ) {
formatBuffer.add( rtf );
}
}
formatBufferStack.push( rtf );
return true;
}
@Override
protected void handleValueContent( final ReportElement element, final Object value, final boolean inlineSection )
throws ContentProcessingException {
super.handleValueContent( element, value, inlineSection );
}
protected void inspectEndSection( final ReportElement box, final boolean inlineSection ) {
formatBufferStack.pop();
if ( formatBufferStack.isEmpty() ) {
return;
}
RichTextFormat rtf = formatBufferStack.peek();
final RichTextFormat lastRtf = formatBuffer.get( formatBuffer.size() - 1 );
if ( lastRtf.getFont().equals( rtf.getFont() ) == false ) {
formatBuffer.add( new RichTextFormat( getTextLength(), rtf.getFont() ) );
}
}
}