/* * JasperReports - Free Java Reporting Library. * Copyright (C) 2001 - 2009 Jaspersoft Corporation. All rights reserved. * http://www.jaspersoft.com * * Unless you have purchased a commercial license agreement from Jaspersoft, * the following license terms apply: * * This program is part of JasperReports. * * JasperReports is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * JasperReports 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. * * You should have received a copy of the GNU Lesser General Public License * along with JasperReports. If not, see <http://www.gnu.org/licenses/>. */ package net.sf.jasperreports.engine.util; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; import net.sf.jasperreports.crosstabs.JRCellContents; import net.sf.jasperreports.crosstabs.JRCrosstab; import net.sf.jasperreports.crosstabs.JRCrosstabCell; import net.sf.jasperreports.crosstabs.JRCrosstabColumnGroup; import net.sf.jasperreports.crosstabs.JRCrosstabRowGroup; import net.sf.jasperreports.crosstabs.design.JRDesignCrosstab; import net.sf.jasperreports.engine.JRBand; import net.sf.jasperreports.engine.JRChild; import net.sf.jasperreports.engine.JRElementGroup; import net.sf.jasperreports.engine.JRFrame; import net.sf.jasperreports.engine.JRGroup; import net.sf.jasperreports.engine.JRReport; import net.sf.jasperreports.engine.JRSection; import net.sf.jasperreports.engine.JRVisitor; /** * Report elements visitor. * * This class can be used to recursively visit all the elements of a report. * * @author Lucian Chirita (lucianc@users.sourceforge.net) * @version $Id: JRElementsVisitor.java 3034 2009-08-27 11:58:04Z teodord $ */ public class JRElementsVisitor extends JRDelegationVisitor { /** * Visits all the elements of a report. * * @param report the report * @param visitor the element visitor */ public static void visitReport(JRReport report, JRVisitor visitor) { JRElementsVisitor reportVisitor = new JRElementsVisitor(visitor); reportVisitor.visitReport(report); } /** * Creates a report visitor. * * @param visitor the elements visitor */ public JRElementsVisitor(JRVisitor visitor) { super(visitor); } /** * Visits all the elements of a report. * * @param report the report */ public void visitReport(JRReport report) { visitBand(report.getBackground()); visitBand(report.getTitle()); visitBand(report.getPageHeader()); visitBand(report.getColumnHeader()); visitSection(report.getDetailSection()); visitBand(report.getColumnFooter()); visitBand(report.getPageFooter()); visitBand(report.getLastPageFooter()); visitBand(report.getSummary()); visitBand(report.getNoData()); JRGroup[] groups = report.getGroups(); if (groups != null) { for(int i = 0; i < groups.length; i++) { JRGroup group = groups[i]; visitSection(group.getGroupHeaderSection()); visitSection(group.getGroupFooterSection()); } } } protected void visitSection(JRSection section) { if (section != null) { JRBand[] bands = section.getBands(); if (bands != null) { for(int i = 0; i < bands.length; i++) { visitBand(bands[i]); } } } } protected void visitBand(JRBand band) { if (band != null) { band.visit(this); } } protected void visitElements(List elements) { if (elements != null) { for (Iterator it = elements.iterator(); it.hasNext();) { JRChild child = (JRChild) it.next(); child.visit(this); } } } /** * Visits the element group and all its children. */ public void visitElementGroup(JRElementGroup elementGroup) { super.visitElementGroup(elementGroup); visitElements(elementGroup.getChildren()); } /** * Visits the frame and all its children. */ public void visitFrame(JRFrame frame) { super.visitFrame(frame); visitElements(frame.getChildren()); } /** * Visits the crosstab and the elements in all its cells. */ public void visitCrosstab(JRCrosstab crosstab) { super.visitCrosstab(crosstab); visitCrosstabCell(crosstab.getWhenNoDataCell()); visitCrosstabCell(crosstab.getHeaderCell()); JRCrosstabRowGroup[] rowGroups = crosstab.getRowGroups(); for (int i = 0; i < rowGroups.length; i++) { JRCrosstabRowGroup rowGroup = rowGroups[i]; visitCrosstabCell(rowGroup.getHeader()); visitCrosstabCell(rowGroup.getTotalHeader()); } JRCrosstabColumnGroup[] columnGroups = crosstab.getColumnGroups(); for (int i = 0; i < columnGroups.length; i++) { JRCrosstabColumnGroup columnGroup = columnGroups[i]; visitCrosstabCell(columnGroup.getHeader()); visitCrosstabCell(columnGroup.getTotalHeader()); } if (crosstab instanceof JRDesignCrosstab) { List cells = ((JRDesignCrosstab) crosstab).getCellsList(); for (Iterator it = cells.iterator(); it.hasNext();) { JRCrosstabCell cell = (JRCrosstabCell) it.next(); visitCrosstabCell(cell.getContents()); } } else { JRCrosstabCell[][] cells = crosstab.getCells(); if (cells != null) { Set cellContents = new HashSet(); for (int i = 0; i < cells.length; i++) { for (int j = 0; j < cells[i].length; j++) { JRCrosstabCell cell = cells[i][j]; if (cell != null && cell.getContents() != null && cellContents.add(cell.getContents())) { visitCrosstabCell(cell.getContents()); } } } } } } protected void visitCrosstabCell(JRCellContents cell) { if (cell != null) { visitElements(cell.getChildren()); } } }