/*!
* 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) 2002-2013 Pentaho Corporation.. All rights reserved.
*/
package org.pentaho.reporting.engine.classic.core.layout.output;
import java.io.Serializable;
import java.util.BitSet;
import org.pentaho.reporting.engine.classic.core.DetailsFooter;
import org.pentaho.reporting.engine.classic.core.Group;
import org.pentaho.reporting.engine.classic.core.GroupFooter;
import org.pentaho.reporting.engine.classic.core.RelationalGroup;
import org.pentaho.reporting.engine.classic.core.ReportDefinition;
import org.pentaho.reporting.engine.classic.core.event.ReportEvent;
import org.pentaho.reporting.engine.classic.core.states.ReportState;
public class RepeatingFooterValidator implements Cloneable, Serializable
{
private BitSet lastPrintedRepeatFooterSignature;
private BitSet computingSignature;
public RepeatingFooterValidator()
{
this.lastPrintedRepeatFooterSignature = new BitSet();
this.computingSignature = new BitSet();
}
public boolean isRepeatFooterValid (final ReportEvent event, final LayouterLevel[] levels)
{
final BitSet bitSet = computeRepeatingFooterValidity(event, levels);
if (bitSet.equals(lastPrintedRepeatFooterSignature))
{
return true;
}
else
{
this.lastPrintedRepeatFooterSignature.clear();
this.lastPrintedRepeatFooterSignature.or(bitSet);
return false;
}
}
private BitSet computeRepeatingFooterValidity(final ReportEvent event, final LayouterLevel[] levels)
{
final BitSet bits = computingSignature;
bits.clear();
int count = 0;
final ReportDefinition report = event.getReport();
final ReportState state = event.getState();
final int groupsPrinted = state.getPresentationGroupIndex();
final int levelCount = levels.length;
for (int i = 0; i < levelCount; i++)
{
final LayouterLevel level = levels[i];
final ReportDefinition def = level.getReportDefinition();
for (int gidx = level.getGroupIndex(); gidx >= 0; gidx -= 1)
{
final Group g = def.getGroup(gidx);
if (g instanceof RelationalGroup)
{
final RelationalGroup rg = (RelationalGroup) g;
final GroupFooter footer = rg.getFooter();
bits.set(count, DefaultOutputFunction.isGroupSectionPrintable(footer, true, true));
count += 1;
}
}
if (level.isInItemGroup())
{
final DetailsFooter detailsFooter = def.getDetailsFooter();
if (detailsFooter != null)
{
bits.set(count, DefaultOutputFunction.isGroupSectionPrintable(detailsFooter, true, true));
count += 1;
}
}
}
/**
* Repeating group header are only printed while ItemElements are
* processed.
*/
for (int gidx = groupsPrinted; gidx >= 0; gidx -= 1)
{
final Group g = report.getGroup(gidx);
if (g instanceof RelationalGroup)
{
final RelationalGroup rg = (RelationalGroup) g;
final GroupFooter footer = rg.getFooter();
bits.set(count, DefaultOutputFunction.isGroupSectionPrintable(footer, false, true));
count += 1;
}
}
if (state.isInItemGroup())
{
final DetailsFooter footer = report.getDetailsFooter();
bits.set(count, DefaultOutputFunction.isGroupSectionPrintable(footer, false, true));
count += 1;
}
return bits;
}
public RepeatingFooterValidator clone()
{
try
{
final RepeatingFooterValidator copy = (RepeatingFooterValidator) super.clone();
copy.lastPrintedRepeatFooterSignature = (BitSet) lastPrintedRepeatFooterSignature.clone();
copy.computingSignature = (BitSet) computingSignature.clone();
return copy;
}
catch (CloneNotSupportedException cne)
{
throw new IllegalStateException(cne);
}
}
}