/*! * 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 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; import java.io.Serializable; import java.util.BitSet; 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 ); } } }