diff options
Diffstat (limited to 'reportbuilder/java/com/sun/star/report/pentaho/output/text/TextRawReportTarget.java')
-rw-r--r-- | reportbuilder/java/com/sun/star/report/pentaho/output/text/TextRawReportTarget.java | 1444 |
1 files changed, 0 insertions, 1444 deletions
diff --git a/reportbuilder/java/com/sun/star/report/pentaho/output/text/TextRawReportTarget.java b/reportbuilder/java/com/sun/star/report/pentaho/output/text/TextRawReportTarget.java deleted file mode 100644 index 865ae47ac24e..000000000000 --- a/reportbuilder/java/com/sun/star/report/pentaho/output/text/TextRawReportTarget.java +++ /dev/null @@ -1,1444 +0,0 @@ -/* - * This file is part of the LibreOffice project. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * This file incorporates work covered by the following license notice: - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed - * with this work for additional information regarding copyright - * ownership. The ASF licenses this file to you under the Apache - * License, Version 2.0 (the "License"); you may not use this file - * except in compliance with the License. You may obtain a copy of - * the License at http://www.apache.org/licenses/LICENSE-2.0 . - */ -package com.sun.star.report.pentaho.output.text; - - -import com.sun.star.report.DataSourceFactory; -import com.sun.star.report.ImageService; -import com.sun.star.report.InputRepository; -import com.sun.star.report.OfficeToken; -import com.sun.star.report.OutputRepository; -import com.sun.star.report.pentaho.OfficeNamespaces; -import com.sun.star.report.pentaho.PentahoReportEngineMetaData; -import com.sun.star.report.pentaho.layoutprocessor.FormatValueUtility; -import com.sun.star.report.pentaho.model.OfficeMasterPage; -import com.sun.star.report.pentaho.model.OfficeMasterStyles; -import com.sun.star.report.pentaho.model.OfficeStyle; -import com.sun.star.report.pentaho.model.OfficeStyles; -import com.sun.star.report.pentaho.model.OfficeStylesCollection; -import com.sun.star.report.pentaho.model.PageSection; -import com.sun.star.report.pentaho.output.OfficeDocumentReportTarget; -import com.sun.star.report.pentaho.output.StyleUtilities; -import com.sun.star.report.pentaho.styles.LengthCalculator; - -import java.io.IOException; - -import java.io.OutputStream; -import java.io.OutputStreamWriter; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.Map; - - -import org.jfree.layouting.input.style.values.CSSNumericValue; -import org.jfree.layouting.util.AttributeMap; -import org.jfree.report.DataSourceException; -import org.jfree.report.JFreeReportInfo; -import org.jfree.report.ReportProcessingException; -import org.jfree.report.flow.ReportJob; -import org.jfree.report.flow.ReportStructureRoot; -import org.jfree.report.flow.ReportTargetUtil; -import org.jfree.report.structure.Element; -import org.jfree.report.structure.Section; -import org.jfree.report.util.AttributeNameGenerator; -import org.jfree.report.util.IntegerCache; - -import org.pentaho.reporting.libraries.base.util.FastStack; -import org.pentaho.reporting.libraries.base.util.ObjectUtilities; -import org.pentaho.reporting.libraries.resourceloader.ResourceKey; -import org.pentaho.reporting.libraries.resourceloader.ResourceManager; -import org.pentaho.reporting.libraries.xmlns.common.AttributeList; -import org.pentaho.reporting.libraries.xmlns.writer.XmlWriter; -import org.pentaho.reporting.libraries.xmlns.writer.XmlWriterSupport; - - -/** - * Creation-Date: 03.07.2006, 16:28:00 - * - */ -public class TextRawReportTarget extends OfficeDocumentReportTarget -{ - - private static final String ALWAYS = "always"; - private static final String KEEP_TOGETHER = "keep-together"; - private static final String KEEP_WITH_NEXT = "keep-with-next"; - private static final String MAY_BREAK_BETWEEN_ROWS = "may-break-between-rows"; - private static final String NAME = "name"; - private static final String NONE = "none"; - private static final String NORMAL = "normal"; - private static final String PARAGRAPH_PROPERTIES = "paragraph-properties"; - private static final String STANDARD = "Standard"; - private static final String TABLE_PROPERTIES = "table-properties"; - private static final String VARIABLES_HIDDEN_STYLE_WITH_KEEPWNEXT = "variables_paragraph_with_next"; - private static final String VARIABLES_HIDDEN_STYLE_WITHOUT_KEEPWNEXT = "variables_paragraph_without_next"; - private static final int TABLE_LAYOUT_VARIABLES_PARAGRAPH = 0; - private static final int TABLE_LAYOUT_SINGLE_DETAIL_TABLE = 2; - private static final int CP_SETUP = 0; - private static final int CP_FIRST_TABLE = 1; - private static final int CP_NEXT_TABLE = 2; - // This is the initial state of the detail-band processing. It states, that we are now waiting for a - // detail-band to be printed. - private static final int DETAIL_SECTION_WAIT = 0; - // The first detail section has started. - private static final int DETAIL_SECTION_FIRST_STARTED = 1; - // The first detail section has been printed. - private static final int DETAIL_SECTION_FIRST_PRINTED = 2; - // An other detail section has started - private static final int DETAIL_SECTION_OTHER_STARTED = 3; - // The other detail section has been printed. - private static final int DETAIL_SECTION_OTHER_PRINTED = 4; - private boolean pageFooterOnReportFooter; - private boolean pageFooterOnReportHeader; - private boolean pageHeaderOnReportFooter; - private boolean pageHeaderOnReportHeader; - private int contentProcessingState; - private OfficeMasterPage currentMasterPage; - private final FastStack activePageContext; - private MasterPageFactory masterPageFactory; - private LengthCalculator sectionHeight; - private String variables; - private PageBreakDefinition pageBreakDefinition; - private VariablesDeclarations variablesDeclarations; - private boolean columnBreakPending; - private boolean sectionKeepTogether; - private final AttributeNameGenerator sectionNames; - private int detailBandProcessingState; - private final int tableLayoutConfig; - private int expectedTableRowCount; - private boolean firstCellSeen; - - public TextRawReportTarget(final ReportJob reportJob, - final ResourceManager resourceManager, - final ResourceKey baseResource, - final InputRepository inputRepository, - final OutputRepository outputRepository, - final String target, - final ImageService imageService, - final DataSourceFactory datasourcefactory) - throws ReportProcessingException - { - super(reportJob, resourceManager, baseResource, inputRepository, outputRepository, target, imageService, datasourcefactory); - activePageContext = new FastStack(); - this.sectionNames = new AttributeNameGenerator(); - - this.tableLayoutConfig = TABLE_LAYOUT_SINGLE_DETAIL_TABLE; - } - - protected String getTargetMimeType() - { - return "application/vnd.oasis.opendocument.text"; - } - - /** - * Checks, whether a manual page break should be inserted at the next possible location. - * - * @return true, if a pagebreak is pending, false otherwise. - */ - private boolean isPagebreakPending() - { - return pageBreakDefinition != null; - } - - private boolean isResetPageNumber() - { - return pageBreakDefinition != null && pageBreakDefinition.isResetPageNumber(); - } - - /** - * Defines, whether a manual pagebreak should be inserted at the next possible location. - * - * @param pageBreakDefinition the new flag value. - */ - private void setPagebreakDefinition(final PageBreakDefinition pageBreakDefinition) - { - this.pageBreakDefinition = pageBreakDefinition; - } - - private PageBreakDefinition getPagebreakDefinition() - { - return pageBreakDefinition; - } - - // todo - private boolean isKeepTableWithNext() - { - final int keepTogetherState = getCurrentContext().getKeepTogether(); - if (keepTogetherState == PageContext.KEEP_TOGETHER_GROUP) - { - return true; - } - - final boolean keepWithNext; - keepWithNext = keepTogetherState == PageContext.KEEP_TOGETHER_FIRST_DETAIL && (detailBandProcessingState == DETAIL_SECTION_WAIT); - return keepWithNext; - } - - private boolean isSectionPagebreakAfter(final AttributeMap attrs) - { - final Object forceNewPage = - attrs.getAttribute(OfficeNamespaces.OOREPORT_NS, "force-new-page"); - return "after-section".equals(forceNewPage) || "before-after-section".equals(forceNewPage); - } - - private boolean isSectionPagebreakBefore(final AttributeMap attrs) - { - final Object forceNewPage = - attrs.getAttribute(OfficeNamespaces.OOREPORT_NS, "force-new-page"); - return "before-section".equals(forceNewPage) || "before-after-section".equals(forceNewPage); - } - - private PageContext getCurrentContext() - { - return (PageContext) activePageContext.peek(); - } - - private String createMasterPage(final boolean printHeader, - final boolean printFooter) - throws ReportProcessingException - { - // create the master page for the report-header. - // If there is a page-header or footer in the report that gets - // surpressed on the report-header, we have to insert a pagebreak - // afterwards. - - final String activePageFooter; - // Check, whether the report header can have a page-header - final PageContext context = getCurrentContext(); - if (printFooter) - { - activePageFooter = context.getPageFooterContent(); - } - else - { - activePageFooter = null; - } - final String activePageHeader; - if (printHeader) - { - // we have to insert a manual pagebreak after the report header. - activePageHeader = context.getPageHeaderContent(); - } - else - { - activePageHeader = null; - } - - final String masterPageName; - if (currentMasterPage == null || !masterPageFactory.containsMasterPage(STANDARD, activePageHeader, activePageFooter)) - { - - final CSSNumericValue headerSize = context.getAllHeaderSize(); - final CSSNumericValue footerSize = context.getAllFooterSize(); - - - currentMasterPage = masterPageFactory.createMasterPage(STANDARD, activePageHeader, activePageFooter); - -// LOGGER.debug("Created a new master-page: " + currentMasterPage.getStyleName()); - - // todo: Store the page-layouts as well. - // The page layouts are derived from a common template, but as the - // header-heights differ, we have to derive these beasts instead - // of copying them - - final OfficeStylesCollection officeStylesCollection = getGlobalStylesCollection(); - final OfficeMasterStyles officeMasterStyles = officeStylesCollection.getMasterStyles(); - final String pageLayoutTemplate = currentMasterPage.getPageLayout(); - if (pageLayoutTemplate == null) - { - // there is no pagelayout. Create one .. - final String derivedLayout = masterPageFactory.createPageStyle(getGlobalStylesCollection().getAutomaticStyles(), headerSize, footerSize); - currentMasterPage.setPageLayout(derivedLayout); - } - else - { - final String derivedLayout = masterPageFactory.derivePageStyle(pageLayoutTemplate, - getPredefinedStylesCollection().getAutomaticStyles(), - getGlobalStylesCollection().getAutomaticStyles(), headerSize, footerSize); - currentMasterPage.setPageLayout(derivedLayout); - } - officeMasterStyles.addMasterPage(currentMasterPage); - masterPageName = currentMasterPage.getStyleName(); - } - else - { - // retrieve the master-page. - final OfficeMasterPage masterPage = masterPageFactory.getMasterPage(STANDARD, activePageHeader, activePageFooter); - if (ObjectUtilities.equal(masterPage.getStyleName(), currentMasterPage.getStyleName())) - { - // They are the same, - masterPageName = null; - } - else - { - // reuse the existing one .. - currentMasterPage = masterPage; - masterPageName = currentMasterPage.getStyleName(); - } - } - - // if either the pageheader or footer are *not* printed with the - // report header, then this implies that we have to insert a manual - // pagebreak at the end of the section. - - if ((!printHeader && context.getHeader() != null) || (!printFooter && context.getFooter() != null)) - { - setPagebreakDefinition(new PageBreakDefinition(isResetPageNumber())); - } - - return masterPageName; - } - - private boolean isColumnBreakPending() - { - return columnBreakPending; - } - - private void setColumnBreakPending(final boolean columnBreakPending) - { - this.columnBreakPending = columnBreakPending; - } - - private Integer parseInt(final Object value) - { - if (value instanceof Number) - { - final Number n = (Number) value; - return IntegerCache.getInteger(n.intValue()); - } - if (value instanceof String) - { - try - { - return IntegerCache.getInteger(Integer.parseInt((String) value)); - } - catch (NumberFormatException nfe) - { - //return null; // ignore - } - } - return null; - } - - private BufferState applyColumnsToPageBand(final BufferState contents, - final int numberOfColumns) - throws IOException, ReportProcessingException - { - if (numberOfColumns <= 1) - { - return contents; - } - startBuffering(getGlobalStylesCollection(), true); - // derive section style .. - - // This is a rather cheap solution to the problem. In a sane world, we would have to feed the - // footer multiple times. Right now, we simply rely on the balacing, which should make sure that - // the column's content are evenly distributed. - final XmlWriter writer = getXmlWriter(); - final AttributeList attrs = new AttributeList(); - attrs.setAttribute(OfficeNamespaces.TEXT_NS, OfficeToken.STYLE_NAME, generateSectionStyle(numberOfColumns)); - attrs.setAttribute(OfficeNamespaces.TEXT_NS, NAME, sectionNames.generateName("Section")); - writer.writeTag(OfficeNamespaces.TEXT_NS, "section", attrs, XmlWriterSupport.OPEN); - for (int i = 0; i < numberOfColumns; i++) - { - writer.writeStream(contents.getXmlAsReader()); - } - - writer.writeCloseTag(); - return finishBuffering(); - } - - private String generateSectionStyle(final int columnCount) - { - final OfficeStyles automaticStyles = getStylesCollection().getAutomaticStyles(); - final String styleName = getAutoStyleNameGenerator().generateName("auto_section_style"); - - final Section sectionProperties = new Section(); - sectionProperties.setNamespace(OfficeNamespaces.STYLE_NS); - sectionProperties.setType("section-properties"); - sectionProperties.setAttribute(OfficeNamespaces.FO_NS, OfficeToken.BACKGROUND_COLOR, "transparent"); - sectionProperties.setAttribute(OfficeNamespaces.TEXT_NS, "dont-balance-text-columns", OfficeToken.FALSE); - sectionProperties.setAttribute(OfficeNamespaces.STYLE_NS, "editable", OfficeToken.FALSE); - - if (columnCount > 1) - { - final Section columns = new Section(); - columns.setNamespace(OfficeNamespaces.STYLE_NS); - columns.setType("columns"); - columns.setAttribute(OfficeNamespaces.FO_NS, "column-count", String.valueOf(columnCount)); - columns.setAttribute(OfficeNamespaces.STYLE_NS, "column-gap", "0cm"); - sectionProperties.addNode(columns); - -// final Section columnSep = new Section(); -// columnSep.setNamespace(OfficeNamespaces.STYLE_NS); -// columnSep.setType("column-sep"); -// columnSep.setAttribute(OfficeNamespaces.STYLE_NS, "width", "0.035cm"); -// columnSep.setAttribute(OfficeNamespaces.STYLE_NS, "color", "#000000"); -// columnSep.setAttribute(OfficeNamespaces.STYLE_NS, "height", "100%"); -// columns.addNode(columnSep); - - for (int i = 0; i < columnCount; i++) - { - final Section column = new Section(); - column.setNamespace(OfficeNamespaces.STYLE_NS); - column.setType("column"); - column.setAttribute(OfficeNamespaces.STYLE_NS, "rel-width", "1*"); - column.setAttribute(OfficeNamespaces.FO_NS, "start-indent", "0cm"); - column.setAttribute(OfficeNamespaces.FO_NS, "end-indent", "0cm"); - columns.addNode(column); - } - } - - final OfficeStyle style = new OfficeStyle(); - style.setNamespace(OfficeNamespaces.STYLE_NS); - style.setType("style"); - style.setAttribute(OfficeNamespaces.STYLE_NS, NAME, styleName); - style.setAttribute(OfficeNamespaces.STYLE_NS, "family", "section"); - style.addNode(sectionProperties); - - automaticStyles.addStyle(style); - return styleName; - } - - /** - * Starts the output of a new office document. This method writes the generic 'office:document-content' tag along with - * all known namespace declarations. - * - * @param report the report object. - * @throws org.jfree.report.DataSourceException - * if there was an error accessing the datasource - * @throws org.jfree.report.ReportProcessingException - * if some other error occured. - */ - public void startReport(final ReportStructureRoot report) - throws DataSourceException, ReportProcessingException - { - super.startReport(report); - variablesDeclarations = new VariablesDeclarations(); - detailBandProcessingState = DETAIL_SECTION_WAIT; - sectionNames.reset(); - - pageFooterOnReportFooter = false; - pageFooterOnReportHeader = false; - pageHeaderOnReportFooter = false; - pageHeaderOnReportHeader = false; - contentProcessingState = TextRawReportTarget.CP_SETUP; - - activePageContext.clear(); - activePageContext.push(new PageContext()); - - final OfficeStylesCollection predefStyles = getPredefinedStylesCollection(); - masterPageFactory = new MasterPageFactory(predefStyles.getMasterStyles()); - - predefStyles.getAutomaticStyles().addStyle(createVariablesStyle(true)); - predefStyles.getAutomaticStyles().addStyle(createVariablesStyle(false)); - } - - private OfficeStyle createVariablesStyle(final boolean keepWithNext) - { - final OfficeStyle variablesSectionStyle = new OfficeStyle(); - variablesSectionStyle.setStyleFamily(OfficeToken.PARAGRAPH); - if (keepWithNext) - { - variablesSectionStyle.setStyleName(TextRawReportTarget.VARIABLES_HIDDEN_STYLE_WITH_KEEPWNEXT); - } - else - { - variablesSectionStyle.setStyleName(TextRawReportTarget.VARIABLES_HIDDEN_STYLE_WITHOUT_KEEPWNEXT); - } - - final Section paragraphProps = new Section(); - paragraphProps.setNamespace(OfficeNamespaces.STYLE_NS); - paragraphProps.setType(PARAGRAPH_PROPERTIES); - paragraphProps.setAttribute(OfficeNamespaces.FO_NS, OfficeToken.BACKGROUND_COLOR, "transparent"); - paragraphProps.setAttribute(OfficeNamespaces.FO_NS, "text-align", "start"); - paragraphProps.setAttribute(OfficeNamespaces.FO_NS, KEEP_WITH_NEXT, ALWAYS); - paragraphProps.setAttribute(OfficeNamespaces.FO_NS, KEEP_TOGETHER, ALWAYS); - paragraphProps.setAttribute(OfficeNamespaces.STYLE_NS, "vertical-align", "top"); - variablesSectionStyle.addNode(paragraphProps); - - final Section textProps = new Section(); - textProps.setNamespace(OfficeNamespaces.STYLE_NS); - textProps.setType("text-properties"); - textProps.setAttribute(OfficeNamespaces.FO_NS, "font-variant", NORMAL); - textProps.setAttribute(OfficeNamespaces.FO_NS, "text-transform", NONE); - textProps.setAttribute(OfficeNamespaces.FO_NS, "color", "#ffffff"); - textProps.setAttribute(OfficeNamespaces.STYLE_NS, "text-outline", OfficeToken.FALSE); - textProps.setAttribute(OfficeNamespaces.STYLE_NS, "text-blinking", OfficeToken.FALSE); - textProps.setAttribute(OfficeNamespaces.STYLE_NS, "text-line-through-style", NONE); - textProps.setAttribute(OfficeNamespaces.STYLE_NS, "text-line-through-mode", "continuous"); - textProps.setAttribute(OfficeNamespaces.STYLE_NS, "text-position", "0% 100%"); - textProps.setAttribute(OfficeNamespaces.STYLE_NS, "font-name", "Tahoma"); - textProps.setAttribute(OfficeNamespaces.FO_NS, "font-size", "1pt"); - textProps.setAttribute(OfficeNamespaces.FO_NS, "letter-spacing", NORMAL); - textProps.setAttribute(OfficeNamespaces.STYLE_NS, "letter-kerning", OfficeToken.FALSE); - textProps.setAttribute(OfficeNamespaces.FO_NS, "font-style", NORMAL); - textProps.setAttribute(OfficeNamespaces.FO_NS, "text-shadow", NONE); - textProps.setAttribute(OfficeNamespaces.STYLE_NS, "text-underline-style", NONE); - textProps.setAttribute(OfficeNamespaces.STYLE_NS, "text-underline-mode", "continuous"); - textProps.setAttribute(OfficeNamespaces.FO_NS, "font-weight", NORMAL); - textProps.setAttribute(OfficeNamespaces.STYLE_NS, "text-rotation-angle", "0"); - textProps.setAttribute(OfficeNamespaces.STYLE_NS, "text-emphasize", NONE); - textProps.setAttribute(OfficeNamespaces.STYLE_NS, "text-combine", NONE); - textProps.setAttribute(OfficeNamespaces.STYLE_NS, "text-combine-start-char", ""); - textProps.setAttribute(OfficeNamespaces.STYLE_NS, "text-combine-end-char", ""); - textProps.setAttribute(OfficeNamespaces.STYLE_NS, "text-blinking", OfficeToken.FALSE); - textProps.setAttribute(OfficeNamespaces.STYLE_NS, "text-scale", "100%"); - textProps.setAttribute(OfficeNamespaces.STYLE_NS, "font-relief", NONE); - textProps.setAttribute(OfficeNamespaces.STYLE_NS, "text-display", NONE); - variablesSectionStyle.addNode(textProps); - return variablesSectionStyle; - } - - protected void startContent(final AttributeMap attrs) - throws IOException, DataSourceException, ReportProcessingException - { - final XmlWriter xmlWriter = getXmlWriter(); - xmlWriter.writeTag(OfficeNamespaces.OFFICE_NS, "text", null, XmlWriterSupport.OPEN); - - writeNullDate(); - - // now start the buffering. We have to insert the variables declaration - // later .. - startBuffering(getStylesCollection(), true); - - final Object columnCountRaw = attrs.getAttribute(OfficeNamespaces.FO_NS, "column-count"); - final Integer colCount = parseInt(columnCountRaw); - if (colCount != null) - { - final PageContext pageContext = getCurrentContext(); - pageContext.setColumnCount(colCount); - } - - } - - protected void startOther(final AttributeMap attrs) - throws IOException, DataSourceException, ReportProcessingException - { - final String namespace = ReportTargetUtil.getNamespaceFromAttribute(attrs); - final String elementType = ReportTargetUtil.getElemenTypeFromAttribute(attrs); - - if (ObjectUtilities.equal(JFreeReportInfo.REPORT_NAMESPACE, namespace)) - { - if (ObjectUtilities.equal(OfficeToken.IMAGE, elementType)) - { - startImageProcessing(attrs); - } - else if (ObjectUtilities.equal(OfficeToken.OBJECT_OLE, elementType) && getCurrentRole() != ROLE_TEMPLATE) - { - startChartProcessing(attrs); - } - return; - } - else if (isFilteredNamespace(namespace)) - { - throw new IllegalStateException("This element should be hidden: " + namespace + ", " + elementType); - } - - if (isTableMergeActive() && detailBandProcessingState == DETAIL_SECTION_OTHER_PRINTED && ObjectUtilities.equal(OfficeNamespaces.TABLE_NS, namespace) && ObjectUtilities.equal(OfficeToken.TABLE_COLUMNS, elementType)) - { - // Skip the columns section if the tables get merged.. - startBuffering(getStylesCollection(), true); - } - else - { - openSection(); - - final boolean isTableNS = ObjectUtilities.equal(OfficeNamespaces.TABLE_NS, namespace); - if (isTableNS) - { - if (ObjectUtilities.equal(OfficeToken.TABLE, elementType)) - { - startTable(attrs); - return; - } - - if (ObjectUtilities.equal(OfficeToken.TABLE_ROW, elementType)) - { - startRow(attrs); - return; - } - } - - - if (ObjectUtilities.equal(OfficeNamespaces.TEXT_NS, namespace)) - { - if (ObjectUtilities.equal("variable-set", elementType)) - { - // update the variables-declaration thingie .. - final String varName = (String) attrs.getAttribute(OfficeNamespaces.TEXT_NS, NAME); - final String varType = (String) attrs.getAttribute(OfficeNamespaces.OFFICE_NS, FormatValueUtility.VALUE_TYPE); - final String newVarName = variablesDeclarations.produceVariable(varName, varType); - attrs.setAttribute(OfficeNamespaces.TEXT_NS, NAME, newVarName); - } - else if (ObjectUtilities.equal("variable-get", elementType)) - { - final String varName = (String) attrs.getAttribute(OfficeNamespaces.TEXT_NS, NAME); - final String varType = (String) attrs.getAttribute(OfficeNamespaces.OFFICE_NS, FormatValueUtility.VALUE_TYPE); - final String newVarName = variablesDeclarations.produceVariable(varName, varType); - attrs.setAttribute(OfficeNamespaces.TEXT_NS, NAME, newVarName); - // this one must not be written, as the DTD does not declare it. - // attrs.setAttribute(OfficeNamespaces.OFFICE_NS, FormatValueUtility.VALUE_TYPE, null); - } - } - - if (tableLayoutConfig == TABLE_LAYOUT_VARIABLES_PARAGRAPH && variables != null) - { - // This cannot happen as long as the report sections only contain tables. But at some point in the - // future they will be made of paragraphs, and then we are prepared .. - // LOGGER.debug("Variables-Section in own paragraph " + variables); - - StyleUtilities.copyStyle(OfficeToken.PARAGRAPH, - TextRawReportTarget.VARIABLES_HIDDEN_STYLE_WITH_KEEPWNEXT, getStylesCollection(), - getGlobalStylesCollection(), getPredefinedStylesCollection()); - final XmlWriter xmlWriter = getXmlWriter(); - xmlWriter.writeTag(OfficeNamespaces.TEXT_NS, OfficeToken.P, OfficeToken.STYLE_NAME, - TextRawReportTarget.VARIABLES_HIDDEN_STYLE_WITH_KEEPWNEXT, XmlWriterSupport.OPEN); - xmlWriter.writeText(variables); - xmlWriter.writeCloseTag(); - variables = null; - } - - final boolean keepTogetherOnParagraph = true; - - if (keepTogetherOnParagraph) - { - if (ReportTargetUtil.isElementOfType(OfficeNamespaces.TEXT_NS, OfficeToken.P, attrs)) - { - final int keepTogetherState = getCurrentContext().getKeepTogether(); - if (!firstCellSeen && (sectionKeepTogether || keepTogetherState == PageContext.KEEP_TOGETHER_GROUP)) - { - OfficeStyle style = null; - final String styleName = (String) attrs.getAttribute(OfficeNamespaces.TEXT_NS, OfficeToken.STYLE_NAME); - if (styleName == null) - { - final boolean keep = (keepTogetherState == PageContext.KEEP_TOGETHER_GROUP || expectedTableRowCount > 0) && isParentKeepTogether(); - final ArrayList<String> propertyNameSpaces = new ArrayList<String>(); - final ArrayList<String> propertyNames = new ArrayList<String>(); - final ArrayList<String> propertyValues = new ArrayList<String>(); - - propertyNameSpaces.add(OfficeNamespaces.FO_NS); - propertyNameSpaces.add(OfficeNamespaces.FO_NS); - propertyNames.add(KEEP_TOGETHER); - propertyValues.add(ALWAYS); - if (keep) - { - propertyNames.add(KEEP_WITH_NEXT); - propertyValues.add(ALWAYS); - } - else - { - propertyNames.add(KEEP_WITH_NEXT); - propertyValues.add(null); - } - style = StyleUtilities.queryStyleByProperties(getStylesCollection(), OfficeToken.PARAGRAPH, PARAGRAPH_PROPERTIES, propertyNameSpaces, propertyNames, propertyValues); - } - if (style == null) - { - style = deriveStyle(OfficeToken.PARAGRAPH, styleName); - // Lets set the 'keep-together' flag.. - - Element paragraphProps = style.getParagraphProperties(); - if (paragraphProps == null) - { - paragraphProps = new Section(); - paragraphProps.setNamespace(OfficeNamespaces.STYLE_NS); - paragraphProps.setType(PARAGRAPH_PROPERTIES); - style.addNode(paragraphProps); - } - paragraphProps.setAttribute(OfficeNamespaces.FO_NS, KEEP_TOGETHER, ALWAYS); - - // We prevent pagebreaks within the two adjacent rows (this one and the next one) if - // either a group-wide keep-together is defined or if we haven't reached the end of the - // current section yet. - if ((keepTogetherState == PageContext.KEEP_TOGETHER_GROUP || expectedTableRowCount > 0) && isParentKeepTogether()) - { - paragraphProps.setAttribute(OfficeNamespaces.FO_NS, KEEP_WITH_NEXT, ALWAYS); - } - } - - attrs.setAttribute(OfficeNamespaces.TEXT_NS, OfficeToken.STYLE_NAME, style.getStyleName()); - } - } - } - - if (ObjectUtilities.equal(OfficeNamespaces.DRAWING_NS, namespace) && ObjectUtilities.equal(OfficeToken.FRAME, elementType)) - { - final String styleName = (String) attrs.getAttribute(OfficeNamespaces.DRAWING_NS, OfficeToken.STYLE_NAME); - final OfficeStyle predefAutoStyle = getPredefinedStylesCollection().getAutomaticStyles().getStyle(OfficeToken.GRAPHIC, styleName); - if (predefAutoStyle != null) - { - // special ole handling - final Element graphicProperties = predefAutoStyle.getGraphicProperties(); - graphicProperties.setAttribute(OfficeNamespaces.STYLE_NS, VERTICAL_POS, "from-top"); - graphicProperties.setAttribute(OfficeNamespaces.STYLE_NS, HORIZONTAL_POS, "from-left"); - graphicProperties.setAttribute(OfficeNamespaces.STYLE_NS, "vertical-rel", "paragraph-content"); - graphicProperties.setAttribute(OfficeNamespaces.STYLE_NS, "horizontal-rel", "paragraph"); - graphicProperties.setAttribute(OfficeNamespaces.STYLE_NS, "flow-with-text", "false"); - graphicProperties.setAttribute(OfficeNamespaces.DRAWING_NS, "ole-draw-aspect", "1"); - - // attrs.setAttribute(OfficeNamespaces.DRAWING_NS, OfficeToken.STYLE_NAME, predefAutoStyle.getStyleName()); - } - } - - // process the styles as usual - performStyleProcessing(attrs); - final XmlWriter xmlWriter = getXmlWriter(); - final AttributeList attrList = buildAttributeList(attrs); - xmlWriter.writeTag(namespace, elementType, attrList, XmlWriterSupport.OPEN); - - if (tableLayoutConfig != TABLE_LAYOUT_VARIABLES_PARAGRAPH - && variables != null - && !isRepeatingSection() - && ReportTargetUtil.isElementOfType(OfficeNamespaces.TEXT_NS, OfficeToken.P, attrs)) - { - //LOGGER.debug("Variables-Section in existing cell " + variables); - xmlWriter.writeText(variables); - variables = null; - } - } - } - - private void startRow(final AttributeMap attrs) - throws IOException, ReportProcessingException - { - firstCellSeen = false; - expectedTableRowCount -= 1; - final String rowStyle = (String) attrs.getAttribute(OfficeNamespaces.TABLE_NS, OfficeToken.STYLE_NAME); - final CSSNumericValue rowHeight = computeRowHeight(rowStyle); - // LOGGER.debug("Adding row-Style: " + rowStyle + " " + rowHeight); - sectionHeight.add(rowHeight); - -// if (expectedTableRowCount > 0) -// { -// // Some other row. Create a keep-together -// -// } -// else -// { -// // This is the last row before the section will end. -// // or (in some weird cases) There is no information when the row will end. -// // Anyway, if we are here, we do not create a keep-together style on the table-row .. -// } - // process the styles as usual - performStyleProcessing(attrs); - - final AttributeList attrList = buildAttributeList(attrs); - getXmlWriter().writeTag(OfficeNamespaces.TABLE_NS, OfficeToken.TABLE_ROW, attrList, XmlWriterSupport.OPEN); - } - - private void startTable(final AttributeMap attrs) - throws ReportProcessingException, IOException - { - final Integer trc = (Integer) attrs.getAttribute(JFreeReportInfo.REPORT_NAMESPACE, "table-row-count"); - if (trc == null) - { - expectedTableRowCount = -1; - } - else - { - expectedTableRowCount = trc; - } - - if (isSectionPagebreakBefore(attrs)) - { - // force a pagebreak .. - setPagebreakDefinition(new PageBreakDefinition(isResetPageNumber())); - } - - // its a table. This means, it is a root-level element - final PageBreakDefinition breakDefinition; - String masterPageName = null; - final int currentRole = getCurrentRole(); - if (contentProcessingState == TextRawReportTarget.CP_FIRST_TABLE) - { - contentProcessingState = TextRawReportTarget.CP_NEXT_TABLE; - - // Processing the report header now. - if (currentRole == OfficeDocumentReportTarget.ROLE_REPORT_HEADER) - { - breakDefinition = new PageBreakDefinition(isResetPageNumber()); - masterPageName = createMasterPage(pageHeaderOnReportHeader, pageFooterOnReportHeader); - if (masterPageName == null) - { - // we should always have a master-page ... - masterPageName = currentMasterPage.getStyleName(); - } - } - else if (currentRole == OfficeDocumentReportTarget.ROLE_REPORT_FOOTER) - { - breakDefinition = new PageBreakDefinition(isResetPageNumber()); - masterPageName = createMasterPage(pageHeaderOnReportFooter, pageFooterOnReportFooter); - if (masterPageName == null && isSectionPagebreakBefore(attrs)) - { - // If we have a manual pagebreak, then activate the current master-page again. - masterPageName = currentMasterPage.getStyleName(); - } - // But we skip this (and therefore the resulting pagebreak) if there is no manual break - // and no other condition that would force an break. - } - else if (currentRole == OfficeDocumentReportTarget.ROLE_REPEATING_GROUP_HEADER || currentRole == OfficeDocumentReportTarget.ROLE_REPEATING_GROUP_FOOTER) - { - breakDefinition = null; - // no pagebreaks .. - } - else if (currentMasterPage == null || isPagebreakPending()) - { - // Must be the first table, as we have no master-page yet. - masterPageName = createMasterPage(true, true); - setPagebreakDefinition(null); - if (masterPageName == null) - { - // we should always have a master-page ... - masterPageName = currentMasterPage.getStyleName(); - } - breakDefinition = new PageBreakDefinition(isResetPageNumber()); - } - else - { - breakDefinition = null; - } - } - else if (isPagebreakPending() && currentRole != OfficeDocumentReportTarget.ROLE_REPEATING_GROUP_HEADER && currentRole != OfficeDocumentReportTarget.ROLE_REPEATING_GROUP_FOOTER) - { - // Derive an automatic style for the pagebreak. -// LOGGER.debug("Manual pagebreak (within the section): " + getCurrentRole()); - breakDefinition = getPagebreakDefinition(); - setPagebreakDefinition(null); - masterPageName = createMasterPage(true, true); - if (masterPageName == null || isSectionPagebreakBefore(attrs)) - { - // If we have a manual pagebreak, then activate the current master-page again. - masterPageName = currentMasterPage.getStyleName(); - } - } - else - { - breakDefinition = null; - } - - final XmlWriter xmlWriter = getXmlWriter(); - if (detailBandProcessingState == DETAIL_SECTION_OTHER_PRINTED && masterPageName != null) - { - // close the last table-tag, we will open a new one - xmlWriter.writeCloseTag(); - // Reset the detail-state to 'started' so that the table's columns get printed now. - detailBandProcessingState = DETAIL_SECTION_OTHER_STARTED; - } - - if (tableLayoutConfig == TABLE_LAYOUT_VARIABLES_PARAGRAPH && variables != null) - { - if (masterPageName != null) - { - // write a paragraph that uses the VARIABLES_HIDDEN_STYLE as - // primary style. Derive that one and add the manual pagebreak. - // The predefined style already has the 'keep-together' flags set. -// LOGGER.debug("Variables-Section with new Master-Page " + variables + " " + masterPageName); - - final OfficeStyle style = deriveStyle(OfficeToken.PARAGRAPH, TextRawReportTarget.VARIABLES_HIDDEN_STYLE_WITH_KEEPWNEXT); - style.setAttribute(OfficeNamespaces.STYLE_NS, "master-page-name", masterPageName); - if (breakDefinition.isResetPageNumber()) - { - final Element paragraphProps = produceFirstChild(style, OfficeNamespaces.STYLE_NS, PARAGRAPH_PROPERTIES); - paragraphProps.setAttribute(OfficeNamespaces.STYLE_NS, "page-number", "1"); - } - if (isColumnBreakPending()) - { - final Element paragraphProps = produceFirstChild(style, OfficeNamespaces.STYLE_NS, PARAGRAPH_PROPERTIES); - paragraphProps.setAttribute(OfficeNamespaces.FO_NS, "break-before", "column"); - setColumnBreakPending(false); - } - xmlWriter.writeTag(OfficeNamespaces.TEXT_NS, OfficeToken.P, OfficeToken.STYLE_NAME, style.getStyleName(), XmlWriterSupport.OPEN); - - masterPageName = null; - //breakDefinition = null; - } - else if (isColumnBreakPending()) - { - setColumnBreakPending(false); - - final OfficeStyle style = deriveStyle(OfficeToken.PARAGRAPH, TextRawReportTarget.VARIABLES_HIDDEN_STYLE_WITH_KEEPWNEXT); - final Element paragraphProps = produceFirstChild(style, OfficeNamespaces.STYLE_NS, PARAGRAPH_PROPERTIES); - paragraphProps.setAttribute(OfficeNamespaces.STYLE_NS, "page-number", "1"); - - xmlWriter.writeTag(OfficeNamespaces.TEXT_NS, OfficeToken.P, OfficeToken.STYLE_NAME, style.getStyleName(), XmlWriterSupport.OPEN); - } - else - { - // Write a paragraph without adding the pagebreak. We can reuse the global style, but we have to make - // sure that the style is part of the current 'auto-style' collection. -// LOGGER.debug("Variables-Section " + variables); - - StyleUtilities.copyStyle(OfficeToken.PARAGRAPH, - TextRawReportTarget.VARIABLES_HIDDEN_STYLE_WITH_KEEPWNEXT, getStylesCollection(), - getGlobalStylesCollection(), getPredefinedStylesCollection()); - xmlWriter.writeTag(OfficeNamespaces.TEXT_NS, OfficeToken.P, OfficeToken.STYLE_NAME, - TextRawReportTarget.VARIABLES_HIDDEN_STYLE_WITH_KEEPWNEXT, XmlWriterSupport.OPEN); - } - xmlWriter.writeText(variables); - xmlWriter.writeCloseTag(); - variables = null; - } - - final boolean keepWithNext = isKeepTableWithNext(); - final boolean localKeepTogether = OfficeToken.TRUE.equals(attrs.getAttribute(OfficeNamespaces.OOREPORT_NS, KEEP_TOGETHER)); - final boolean tableMergeActive = isTableMergeActive(); - this.sectionKeepTogether = tableMergeActive && localKeepTogether; - - // Check, whether we have a reason to derive a style... - if (masterPageName != null || (!tableMergeActive && (localKeepTogether || keepWithNext)) || isColumnBreakPending()) - { - final String styleName = (String) attrs.getAttribute(OfficeNamespaces.TABLE_NS, OfficeToken.STYLE_NAME); - final OfficeStyle style = deriveStyle("table", styleName); - - if (masterPageName != null) - { -// LOGGER.debug("Starting a new MasterPage: " + masterPageName); - // Patch the current styles. - // This usually only happens on Table-Styles or Paragraph-Styles - style.setAttribute(OfficeNamespaces.STYLE_NS, "master-page-name", masterPageName); - if (breakDefinition.isResetPageNumber()) - { - final Element paragraphProps = produceFirstChild(style, OfficeNamespaces.STYLE_NS, PARAGRAPH_PROPERTIES); - paragraphProps.setAttribute(OfficeNamespaces.STYLE_NS, "page-number", "1"); - } - } - if (isColumnBreakPending()) - { - final Element paragraphProps = produceFirstChild(style, OfficeNamespaces.STYLE_NS, PARAGRAPH_PROPERTIES); - paragraphProps.setAttribute(OfficeNamespaces.FO_NS, "break-before", "column"); - setColumnBreakPending(false); - } - - // Inhibit breaks inside the table only if it has been defined and if we do not create one single - // big detail section. In that case, this flag would be invalid and would cause layout-errors. - if (!tableMergeActive) - { - if (localKeepTogether) - { - final Element tableProps = produceFirstChild(style, OfficeNamespaces.STYLE_NS, TABLE_PROPERTIES); - tableProps.setAttribute(OfficeNamespaces.STYLE_NS, MAY_BREAK_BETWEEN_ROWS, OfficeToken.FALSE); - } - } - else - { - if (detailBandProcessingState == DETAIL_SECTION_WAIT) - { - detailBandProcessingState = DETAIL_SECTION_FIRST_STARTED; - } - else if (detailBandProcessingState == DETAIL_SECTION_FIRST_PRINTED) - { - detailBandProcessingState = DETAIL_SECTION_OTHER_STARTED; - } - } - if (keepWithNext) - { - boolean addKeepWithNext = true; - if (currentRole == ROLE_GROUP_FOOTER) - { - addKeepWithNext = isParentKeepTogether(); - } - - final Element tableProps = produceFirstChild(style, OfficeNamespaces.STYLE_NS, TABLE_PROPERTIES); - tableProps.setAttribute(OfficeNamespaces.STYLE_NS, MAY_BREAK_BETWEEN_ROWS, OfficeToken.FALSE); - if (addKeepWithNext) - { - tableProps.setAttribute(OfficeNamespaces.FO_NS, KEEP_WITH_NEXT, ALWAYS); - // A keep-with-next does not work, if the may-break-betweek rows is not set to false .. - } - } - attrs.setAttribute(OfficeNamespaces.TABLE_NS, OfficeToken.STYLE_NAME, style.getStyleName()); - // no need to copy the styles, this was done while deriving the - // style .. - } - else - { - // Check, whether we may be able to skip the table. - if (tableMergeActive) - { - if (detailBandProcessingState == DETAIL_SECTION_OTHER_PRINTED) - { - // Skip the whole thing .. - return; - } - else if (detailBandProcessingState == DETAIL_SECTION_WAIT) - { - if (keepWithNext) - { - final String styleName = (String) attrs.getAttribute(OfficeNamespaces.TABLE_NS, OfficeToken.STYLE_NAME); - - final OfficeStyle style = deriveStyle(OfficeToken.TABLE, styleName); - final Element tableProps = produceFirstChild(style, OfficeNamespaces.STYLE_NS, TABLE_PROPERTIES); - // A keep-with-next does not work, if the may-break-betweek rows is not set to false .. - tableProps.setAttribute(OfficeNamespaces.STYLE_NS, MAY_BREAK_BETWEEN_ROWS, OfficeToken.FALSE); - final String hasGroupFooter = (String) attrs.getAttribute(JFreeReportInfo.REPORT_NAMESPACE, "has-group-footer"); - if (hasGroupFooter != null && hasGroupFooter.equals(OfficeToken.TRUE)) - { - tableProps.setAttribute(OfficeNamespaces.FO_NS, KEEP_WITH_NEXT, ALWAYS); - } - - attrs.setAttribute(OfficeNamespaces.TABLE_NS, OfficeToken.STYLE_NAME, style.getStyleName()); - } - detailBandProcessingState = DETAIL_SECTION_FIRST_STARTED; - } - else if (detailBandProcessingState == DETAIL_SECTION_FIRST_PRINTED) - { - detailBandProcessingState = DETAIL_SECTION_OTHER_STARTED; - } - } - - // process the styles as usual - performStyleProcessing(attrs); - } - - final String namespace = ReportTargetUtil.getNamespaceFromAttribute(attrs); - final String elementType = ReportTargetUtil.getElemenTypeFromAttribute(attrs); - final AttributeList attrList = buildAttributeList(attrs); - xmlWriter.writeTag(namespace, elementType, attrList, XmlWriterSupport.OPEN); - } - - private boolean isParentKeepTogether() - { - PageContext context = getCurrentContext(); - if (context != null) - { - context = context.getParent(); - if (context != null) - { - return context.getKeepTogether() == PageContext.KEEP_TOGETHER_GROUP; - } - } - return false; - } - - private boolean isTableMergeActive() - { - return getCurrentRole() == ROLE_DETAIL && tableLayoutConfig == TABLE_LAYOUT_SINGLE_DETAIL_TABLE; - } - - private void openSection() - throws IOException - { - if (isRepeatingSection()) - { - // repeating sections have other ways of defining columns .. - return; - } - if (getCurrentRole() == ROLE_TEMPLATE || getCurrentRole() == ROLE_SPREADSHEET_PAGE_HEADER || getCurrentRole() == ROLE_SPREADSHEET_PAGE_FOOTER) - { - // the template section would break the multi-column stuff and we dont open up sections there - // anyway .. - return; - } - - final PageContext pageContext = getCurrentContext(); - final Integer columnCount = pageContext.getColumnCount(); - if (columnCount != null && !pageContext.isSectionOpen()) - { - final AttributeList attrs = new AttributeList(); - attrs.setAttribute(OfficeNamespaces.TEXT_NS, OfficeToken.STYLE_NAME, generateSectionStyle(columnCount)); - attrs.setAttribute(OfficeNamespaces.TEXT_NS, NAME, sectionNames.generateName("Section")); - getXmlWriter().writeTag(OfficeNamespaces.TEXT_NS, "section", attrs, XmlWriterSupport.OPEN); - - pageContext.setSectionOpen(true); - } - - } - - protected void startReportSection(final AttributeMap attrs, final int role) - throws IOException, DataSourceException, ReportProcessingException - { - sectionHeight = new LengthCalculator(); - if (role == OfficeDocumentReportTarget.ROLE_TEMPLATE || role == OfficeDocumentReportTarget.ROLE_SPREADSHEET_PAGE_HEADER || role == OfficeDocumentReportTarget.ROLE_SPREADSHEET_PAGE_FOOTER) - { - // Start buffering with an dummy styles-collection, so that the global styles dont get polluted .. - startBuffering(new OfficeStylesCollection(), true); - } - else if (role == OfficeDocumentReportTarget.ROLE_PAGE_HEADER) - { - startBuffering(getGlobalStylesCollection(), true); - pageHeaderOnReportHeader = PageSection.isPrintWithReportHeader(attrs); - pageHeaderOnReportFooter = PageSection.isPrintWithReportFooter(attrs); - } - else if (role == OfficeDocumentReportTarget.ROLE_PAGE_FOOTER) - { - startBuffering(getGlobalStylesCollection(), true); - pageFooterOnReportHeader = PageSection.isPrintWithReportHeader(attrs); - pageFooterOnReportFooter = PageSection.isPrintWithReportFooter(attrs); - } - else if (role == OfficeDocumentReportTarget.ROLE_REPEATING_GROUP_HEADER || role == OfficeDocumentReportTarget.ROLE_REPEATING_GROUP_FOOTER) - { - startBuffering(getGlobalStylesCollection(), true); - } - else if (role == OfficeDocumentReportTarget.ROLE_VARIABLES) - { - startBuffering(getGlobalStylesCollection(), false); - } - else - { - contentProcessingState = TextRawReportTarget.CP_FIRST_TABLE; - if (role == OfficeDocumentReportTarget.ROLE_GROUP_HEADER || role == OfficeDocumentReportTarget.ROLE_GROUP_FOOTER) - { - // if we have a repeating header, then skip the first one .. - // if this is a repeating footer, skip the last one. This means, - // we have to buffer all group footers and wait for the next section.. - startBuffering(getContentStylesCollection(), true); - } - - if (role != OfficeDocumentReportTarget.ROLE_DETAIL) - { - // reset the detail-state. The flag will be updated on startTable and endOther(Table) if the - // current role is ROLE_DETAIL - detailBandProcessingState = DETAIL_SECTION_WAIT; - } - } - } - - protected void startGroup(final AttributeMap attrs) - throws IOException, DataSourceException, ReportProcessingException - { - super.startGroup(attrs); - final PageContext pageContext = new PageContext(getCurrentContext()); - activePageContext.push(pageContext); - - final Object resetPageNumber = attrs.getAttribute(OfficeNamespaces.OOREPORT_NS, "reset-page-number"); - if (OfficeToken.TRUE.equals(resetPageNumber)) - { - setPagebreakDefinition(new PageBreakDefinition(true)); - } - - final Object keepTogether = attrs.getAttribute(OfficeNamespaces.OOREPORT_NS, KEEP_TOGETHER); - if ("whole-group".equals(keepTogether)) - { - pageContext.setKeepTogether(PageContext.KEEP_TOGETHER_GROUP); - } - else if ("with-first-detail".equals(keepTogether) && pageContext.getKeepTogether() != PageContext.KEEP_TOGETHER_GROUP) - { - pageContext.setKeepTogether(PageContext.KEEP_TOGETHER_FIRST_DETAIL); - } - - final Object columnCountRaw = attrs.getAttribute(OfficeNamespaces.FO_NS, "column-count"); - final Integer colCount = parseInt(columnCountRaw); - if (colCount != null) - { - pageContext.setColumnCount(colCount); - } - - final Object newColumn = attrs.getAttribute(OfficeNamespaces.OOREPORT_NS, "start-new-column"); - if (OfficeToken.TRUE.equals(newColumn)) - { - setColumnBreakPending(true); - } - } - - protected void startGroupInstance(final AttributeMap attrs) - throws IOException, DataSourceException, ReportProcessingException - { - if (getGroupContext().isGroupWithRepeatingSection()) - { - setPagebreakDefinition(new PageBreakDefinition(isResetPageNumber())); - } - } - - protected void endGroup(final AttributeMap attrs) - throws IOException, DataSourceException, ReportProcessingException - { - if (getGroupContext().isGroupWithRepeatingSection()) - { - setPagebreakDefinition(new PageBreakDefinition(isResetPageNumber())); - } - - super.endGroup(attrs); - finishSection(); - - activePageContext.pop(); - } - - private void finishSection() - throws ReportProcessingException - { - final PageContext pageContext = getCurrentContext(); - if (pageContext.isSectionOpen()) - { - pageContext.setSectionOpen(false); - try - { - getXmlWriter().writeCloseTag(); - } - catch (IOException e) - { - throw new ReportProcessingException("IOError", e); - } - } - } - - protected void endReportSection(final AttributeMap attrs, final int role) - throws IOException, DataSourceException, ReportProcessingException - { - if (role == ROLE_TEMPLATE || role == OfficeDocumentReportTarget.ROLE_SPREADSHEET_PAGE_HEADER || role == OfficeDocumentReportTarget.ROLE_SPREADSHEET_PAGE_FOOTER) - { - finishBuffering(); - return; - } - - final CSSNumericValue result = sectionHeight.getResult(); - if (role == OfficeDocumentReportTarget.ROLE_PAGE_HEADER) - { - final PageContext pageContext = getCurrentContext(); - pageContext.setHeader(applyColumnsToPageBand(finishBuffering(), pageContext.getActiveColumns()).getXmlBuffer(), result); - } - else if (role == OfficeDocumentReportTarget.ROLE_PAGE_FOOTER) - { - final PageContext pageContext = getCurrentContext(); - pageContext.setFooter(applyColumnsToPageBand(finishBuffering(), pageContext.getActiveColumns()).getXmlBuffer(), result); - } - else if (role == OfficeDocumentReportTarget.ROLE_REPEATING_GROUP_HEADER) - { - final PageContext pageContext = getCurrentContext(); - pageContext.setHeader(applyColumnsToPageBand(finishBuffering(), pageContext.getActiveColumns()).getXmlBuffer(), result); - } - else if (role == OfficeDocumentReportTarget.ROLE_REPEATING_GROUP_FOOTER) - { - final PageContext pageContext = getCurrentContext(); - pageContext.setFooter(applyColumnsToPageBand(finishBuffering(), pageContext.getActiveColumns()).getXmlBuffer(), result); - } - else if (role == OfficeDocumentReportTarget.ROLE_VARIABLES) - { - if (variables == null) - { - variables = finishBuffering().getXmlBuffer(); - } - else - { - variables += finishBuffering().getXmlBuffer(); - } - } - else if (role == OfficeDocumentReportTarget.ROLE_GROUP_HEADER) - { - final String headerText = finishBuffering().getXmlBuffer(); - final int iterationCount = getGroupContext().getParent().getIterationCount(); - final boolean repeat = OfficeToken.TRUE.equals(attrs.getAttribute(OfficeNamespaces.OOREPORT_NS, "repeat-section")); - if (!repeat || iterationCount > 0) - { - getXmlWriter().writeText(headerText); - } - } - else if (role == OfficeDocumentReportTarget.ROLE_GROUP_FOOTER) - { - final String footerText = finishBuffering().getXmlBuffer(); - // how do we detect whether this is the last group footer? - getXmlWriter().writeText(footerText); - } - - } - - public void endReport(final ReportStructureRoot report) - throws DataSourceException, ReportProcessingException - { - super.endReport(report); - variablesDeclarations = null; - - try - { - // Write the settings .. - final AttributeList rootAttributes = new AttributeList(); - rootAttributes.addNamespaceDeclaration("office", OfficeNamespaces.OFFICE_NS); - rootAttributes.addNamespaceDeclaration("config", OfficeNamespaces.CONFIG); - rootAttributes.addNamespaceDeclaration("ooo", OfficeNamespaces.OO2004_NS); - rootAttributes.setAttribute(OfficeNamespaces.OFFICE_NS, "version", - OfficeDocumentReportTarget.ODF_VERSION); - final OutputStream outputStream = getOutputRepository().createOutputStream("settings.xml", "text/xml"); - final XmlWriter xmlWriter = new XmlWriter(new OutputStreamWriter(outputStream, "UTF-8"), createTagDescription()); - xmlWriter.setAlwaysAddNamespace(true); - xmlWriter.writeXmlDeclaration("UTF-8"); - xmlWriter.writeTag(OfficeNamespaces.OFFICE_NS, "document-settings", rootAttributes, XmlWriterSupport.OPEN); - xmlWriter.writeTag(OfficeNamespaces.OFFICE_NS, "settings", XmlWriterSupport.OPEN); - xmlWriter.writeTag(OfficeNamespaces.CONFIG, "config-item-set", NAME, "ooo:configuration-settings", XmlWriterSupport.OPEN); - - final AttributeList configAttributes = new AttributeList(); - configAttributes.setAttribute(OfficeNamespaces.CONFIG, NAME, "TableRowKeep"); - configAttributes.setAttribute(OfficeNamespaces.CONFIG, "type", "boolean"); - xmlWriter.writeTag(OfficeNamespaces.CONFIG, "config-item", configAttributes, XmlWriterSupport.OPEN); - xmlWriter.writeText(OfficeToken.TRUE); - xmlWriter.writeCloseTag(); - - xmlWriter.writeCloseTag(); - xmlWriter.writeCloseTag(); - xmlWriter.writeCloseTag(); - xmlWriter.close(); - - copyMeta(); - } - catch (IOException ioe) - { - throw new ReportProcessingException("Failed to write settings document"); - } - } - - protected void endOther(final AttributeMap attrs) - throws IOException, DataSourceException, ReportProcessingException - { - final String namespace = ReportTargetUtil.getNamespaceFromAttribute(attrs); - final String elementType = ReportTargetUtil.getElemenTypeFromAttribute(attrs); - - final boolean isInternalNS = ObjectUtilities.equal(JFreeReportInfo.REPORT_NAMESPACE, namespace); - final boolean isTableNs = ObjectUtilities.equal(OfficeNamespaces.TABLE_NS, namespace); - if (isTableMergeActive() && detailBandProcessingState == DETAIL_SECTION_OTHER_PRINTED && isTableNs && ObjectUtilities.equal(OfficeToken.TABLE_COLUMNS, elementType)) - { - finishBuffering(); - return; - } - - if (isInternalNS && (ObjectUtilities.equal(OfficeToken.IMAGE, elementType) || ObjectUtilities.equal(OfficeToken.OBJECT_OLE, elementType))) - { - return; - } - - final XmlWriter xmlWriter = getXmlWriter(); - if (tableLayoutConfig != TABLE_LAYOUT_VARIABLES_PARAGRAPH && isTableNs && ObjectUtilities.equal(OfficeToken.TABLE_CELL, elementType) && !isRepeatingSection()) - { - if (variables != null) - { - // This cannot happen as long as the report sections only contain tables. But at some point in the - // future they will be made of paragraphs, and then we are prepared .. - //LOGGER.debug("Variables-Section " + variables); - final String tag; - if (sectionKeepTogether && expectedTableRowCount > 0) - { - tag = TextRawReportTarget.VARIABLES_HIDDEN_STYLE_WITH_KEEPWNEXT; - } - else - { - tag = TextRawReportTarget.VARIABLES_HIDDEN_STYLE_WITHOUT_KEEPWNEXT; - } - StyleUtilities.copyStyle(OfficeToken.PARAGRAPH, - tag, getStylesCollection(), - getGlobalStylesCollection(), getPredefinedStylesCollection()); - xmlWriter.writeTag(OfficeNamespaces.TEXT_NS, OfficeToken.P, OfficeToken.STYLE_NAME, - tag, XmlWriterSupport.OPEN); - xmlWriter.writeText(variables); - xmlWriter.writeCloseTag(); - variables = null; - } - /** - // Only generate the empty paragraph, if we have to add the keep-together .. - else if (cellEmpty && expectedTableRowCount > 0 && - sectionKeepTogether && !firstCellSeen) - { - // we have no variables .. - StyleUtilities.copyStyle(OfficeToken.PARAGRAPH, - TextRawReportTarget.VARIABLES_HIDDEN_STYLE_WITH_KEEPWNEXT, getStylesCollection(), - getGlobalStylesCollection(), getPredefinedStylesCollection()); - xmlWriter.writeTag(OfficeNamespaces.TEXT_NS, OfficeToken.P, OfficeToken.STYLE_NAME, - TextRawReportTarget.VARIABLES_HIDDEN_STYLE_WITH_KEEPWNEXT, XmlWriterSupport.CLOSE); - } - */ - } - - if (isTableNs && (ObjectUtilities.equal(OfficeToken.TABLE_CELL, elementType) || ObjectUtilities.equal(OfficeToken.COVERED_TABLE_CELL, elementType))) - { - firstCellSeen = true; - } - if (isTableNs && ObjectUtilities.equal(OfficeToken.TABLE, elementType)) - { - if (getCurrentRole() == ROLE_DETAIL) - { - if (!isTableMergeActive()) - { - // We do not merge the detail bands, so an ordinary close will do. - xmlWriter.writeCloseTag(); - } - else if (detailBandProcessingState == DETAIL_SECTION_FIRST_STARTED) - { - final int keepTogetherState = getCurrentContext().getKeepTogether(); - if (keepTogetherState == PageContext.KEEP_TOGETHER_FIRST_DETAIL) - { - xmlWriter.writeCloseTag(); - detailBandProcessingState = DETAIL_SECTION_FIRST_PRINTED; - } - else - { - detailBandProcessingState = DETAIL_SECTION_OTHER_PRINTED; - } - } - else if (detailBandProcessingState == DETAIL_SECTION_OTHER_STARTED) - { - detailBandProcessingState = DETAIL_SECTION_OTHER_PRINTED; - } - } - else - { - xmlWriter.writeCloseTag(); - } - if (isSectionPagebreakAfter(attrs)) - { - setPagebreakDefinition(new PageBreakDefinition(false)); - } - } - else - { - xmlWriter.writeCloseTag(); - } - } - - protected void endGroupBody(final AttributeMap attrs) - throws IOException, DataSourceException, ReportProcessingException - { - if (tableLayoutConfig == TABLE_LAYOUT_SINGLE_DETAIL_TABLE && detailBandProcessingState == DETAIL_SECTION_OTHER_PRINTED) - { - // closes the table .. - final XmlWriter xmlWriter = getXmlWriter(); - xmlWriter.writeCloseTag(); - detailBandProcessingState = DETAIL_SECTION_WAIT; - } - - } - - protected void endContent(final AttributeMap attrs) - throws IOException, DataSourceException, ReportProcessingException - { - finishSection(); - final BufferState bodyText = finishBuffering(); - final XmlWriter writer = getXmlWriter(); - - final Map definedMappings = variablesDeclarations.getDefinedMappings(); - if (!definedMappings.isEmpty()) - { - writer.writeTag(OfficeNamespaces.TEXT_NS, "variable-decls", XmlWriterSupport.OPEN); - final Iterator mappingsIt = definedMappings.entrySet().iterator(); - while (mappingsIt.hasNext()) - { - final Map.Entry entry = (Map.Entry) mappingsIt.next(); - final AttributeList entryList = new AttributeList(); - entryList.setAttribute(OfficeNamespaces.TEXT_NS, NAME, (String) entry.getKey()); - entryList.setAttribute(OfficeNamespaces.OFFICE_NS, FormatValueUtility.VALUE_TYPE, (String) entry.getValue()); - writer.writeTag(OfficeNamespaces.TEXT_NS, "variable-decl", entryList, XmlWriterSupport.CLOSE); - } - writer.writeCloseTag(); - } - - writer.writeStream(bodyText.getXmlAsReader()); - writer.setLineEmpty(true); - writer.writeCloseTag(); - } - - public String getExportDescriptor() - { - return "raw/" + PentahoReportEngineMetaData.OPENDOCUMENT_TEXT; - } -} |