summaryrefslogtreecommitdiff
path: root/reportbuilder/java/com/sun/star/report/pentaho/output/spreadsheet/SpreadsheetRawReportTarget.java
diff options
context:
space:
mode:
Diffstat (limited to 'reportbuilder/java/com/sun/star/report/pentaho/output/spreadsheet/SpreadsheetRawReportTarget.java')
-rw-r--r--reportbuilder/java/com/sun/star/report/pentaho/output/spreadsheet/SpreadsheetRawReportTarget.java959
1 files changed, 0 insertions, 959 deletions
diff --git a/reportbuilder/java/com/sun/star/report/pentaho/output/spreadsheet/SpreadsheetRawReportTarget.java b/reportbuilder/java/com/sun/star/report/pentaho/output/spreadsheet/SpreadsheetRawReportTarget.java
deleted file mode 100644
index 7418445007a3..000000000000
--- a/reportbuilder/java/com/sun/star/report/pentaho/output/spreadsheet/SpreadsheetRawReportTarget.java
+++ /dev/null
@@ -1,959 +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.spreadsheet;
-
-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.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.output.text.MasterPageFactory;
-import com.sun.star.report.pentaho.styles.LengthCalculator;
-
-import java.io.IOException;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import org.jfree.layouting.input.style.values.CSSNumericType;
-import org.jfree.layouting.input.style.values.CSSNumericValue;
-import org.jfree.layouting.util.AttributeMap;
-import org.jfree.report.DataFlags;
-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.IntegerCache;
-
-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.11.2007
- *
- */
-public class SpreadsheetRawReportTarget extends OfficeDocumentReportTarget
-{
-
- private static final String[] FOPROPS = new String[]
- {
- "letter-spacing", "font-variant", "text-transform"
- };
- private static final String NUMBERCOLUMNSSPANNED = "number-columns-spanned";
- private static final String[] STYLEPROPS = new String[]
- {
- "text-combine", "font-pitch-complex", "text-rotation-angle", "font-name", "text-blinking", "letter-kerning", "text-combine-start-char", "text-combine-end-char", "text-position", "text-scale"
- };
- private static final int CELL_WIDTH_FACTOR = 10000;
- private static final String TRANSPARENT = "transparent";
- private boolean paragraphFound = false;
- private boolean paragraphHandled = false;
-
- /**
- * This class represents a column boundary, not in width, but it's actual boundary location. One of the motivations
- * for creating this class was to be able to record the boundaries for each incoming table while consuming as few
- * objects/memory as possible.
- */
- private static class ColumnBoundary implements Comparable<ColumnBoundary>
- {
-
- private final Set<Integer> tableIndices;
- private final long boundary;
-
- private ColumnBoundary(final long boundary)
- {
- this.tableIndices = new HashSet<Integer>();
- this.boundary = boundary;
- }
-
- public void addTableIndex(final int table)
- {
- tableIndices.add(IntegerCache.getInteger(table));
- }
-
- public float getBoundary()
- {
- return boundary;
- }
-
- public boolean isContainedByTable(final int table)
- {
- final Integer index = IntegerCache.getInteger(table);
- return tableIndices.contains(index);
- }
-
- public int compareTo(final ColumnBoundary arg0)
- {
- if (arg0.equals(this))
- {
- return 0;
- }
- if (arg0 instanceof ColumnBoundary)
- {
- if (boundary > arg0.boundary)
- {
- return 1;
- }
- else
- {
- return -1;
- }
- }
- return 1;
- }
-
- public boolean equals(final Object obj)
- {
- return obj instanceof ColumnBoundary && ((ColumnBoundary) obj).boundary == boundary;
- }
-
- public int hashCode()
- {
- assert false : "hashCode not designed";
- return 42; // any arbitrary constant will do
- }
- }
- private String tableBackgroundColor; // null means transparent ...
- private static final ColumnBoundary[] EMPTY_COLBOUNDS = new ColumnBoundary[0];
- private boolean elementBoundaryCollectionPass;
- private boolean oleHandled;
- private final List<ColumnBoundary> columnBoundaryList;
- private long currentRowBoundaryMarker;
- private ColumnBoundary[] sortedBoundaryArray;
- private ColumnBoundary[] boundariesForTableArray;
- private int tableCounter;
- private int columnCounter;
- private int columnSpanCounter;
- private int currentSpan = 0;
- private String unitsOfMeasure;
- final private List<AttributeMap> shapes;
- final private List<AttributeMap> ole;
- final private List<CSSNumericValue> rowHeights;
-
- public SpreadsheetRawReportTarget(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);
- columnBoundaryList = new ArrayList<ColumnBoundary>();
- elementBoundaryCollectionPass = true;
- rowHeights = new ArrayList<CSSNumericValue>();
- shapes = new ArrayList<AttributeMap>();
- ole = new ArrayList<AttributeMap>();
- oleHandled = false;
- }
-
- public void startOther(final AttributeMap attrs) throws DataSourceException, ReportProcessingException
- {
- if (ReportTargetUtil.isElementOfType(JFreeReportInfo.REPORT_NAMESPACE, OfficeToken.OBJECT_OLE, attrs))
- {
- if (isElementBoundaryCollectionPass() && getCurrentRole() != ROLE_TEMPLATE)
- {
- ole.add(attrs);
- }
- oleHandled = true;
- return;
- }
- final String namespace = ReportTargetUtil.getNamespaceFromAttribute(attrs);
- if (isRepeatingSection() || isFilteredNamespace(namespace))
- {
- return;
- }
-
- final String elementType = ReportTargetUtil.getElemenTypeFromAttribute(attrs);
- if (OfficeNamespaces.TEXT_NS.equals(namespace) && OfficeToken.P.equals(elementType) && !paragraphHandled)
- {
- paragraphFound = true;
- return;
- }
-
- if (OfficeNamespaces.DRAWING_NS.equals(namespace) && OfficeToken.FRAME.equals(elementType))
- {
- if (isElementBoundaryCollectionPass() && getCurrentRole() != ROLE_TEMPLATE)
- {
- final LengthCalculator len = new LengthCalculator();
- for (int i = 0; i < rowHeights.size(); i++)
- {
- len.add(rowHeights.get(i));
- // val += (rowHeights.get(i)).getValue();
- }
-
- rowHeights.clear();
- final CSSNumericValue currentRowHeight = len.getResult();
- rowHeights.add(currentRowHeight);
- attrs.setAttribute(OfficeNamespaces.DRAWING_NS, "z-index", String.valueOf(shapes.size()));
- final String y = (String) attrs.getAttribute(OfficeNamespaces.SVG_NS, "y");
- if (y != null)
- {
- len.add(parseLength(y));
- final CSSNumericValue currentY = len.getResult();
- attrs.setAttribute(OfficeNamespaces.SVG_NS, "y", currentY.getValue() + currentY.getType().getType());
- }
- shapes.add(attrs);
- }
- return;
- }
- if (oleHandled)
- {
- if (isElementBoundaryCollectionPass() && getCurrentRole() != ROLE_TEMPLATE)
- {
- ole.add(attrs);
- }
- return;
- }
-
- // if this is the report namespace, write out a table definition ..
- if (OfficeNamespaces.TABLE_NS.equals(namespace) && OfficeToken.TABLE.equals(elementType))
- {
- // whenever we see a new table, we increment our tableCounter
- // this is used to keep tracked of the boundary conditions per table
- tableCounter++;
- }
-
- if (isElementBoundaryCollectionPass())
- {
- collectBoundaryForElement(attrs);
- }
- else
- // if (!isElementBoundaryCollectionPass())
- {
- try
- {
- processElement(attrs, namespace, elementType);
- }
- catch (IOException e)
- {
- throw new ReportProcessingException(OfficeDocumentReportTarget.FAILED, e);
- }
- }
- }
-
- protected void startReportSection(final AttributeMap attrs, final int role) throws IOException, DataSourceException, ReportProcessingException
- {
- if ((role == OfficeDocumentReportTarget.ROLE_SPREADSHEET_PAGE_HEADER || role == OfficeDocumentReportTarget.ROLE_SPREADSHEET_PAGE_FOOTER) && (!PageSection.isPrintWithReportHeader(attrs) || !PageSection.isPrintWithReportFooter(attrs)))
- {
- startBuffering(new OfficeStylesCollection(), true);
- }
- else
- {
- super.startReportSection(attrs, role);
- }
- }
-
- protected void endReportSection(final AttributeMap attrs, final int role) throws IOException, DataSourceException, ReportProcessingException
- {
- if ((role == OfficeDocumentReportTarget.ROLE_SPREADSHEET_PAGE_HEADER || role == OfficeDocumentReportTarget.ROLE_SPREADSHEET_PAGE_FOOTER) && (!PageSection.isPrintWithReportHeader(attrs) || !PageSection.isPrintWithReportFooter(attrs)))
- {
- finishBuffering();
- }
- else
- {
- super.endReportSection(attrs, role);
- }
- }
-
- private void handleParagraph()
- {
- if (paragraphFound)
- {
- try
- {
- final XmlWriter xmlWriter = getXmlWriter();
- xmlWriter.writeTag(OfficeNamespaces.TEXT_NS, OfficeToken.P, null, XmlWriterSupport.OPEN);
- paragraphHandled = true;
- paragraphFound = false;
- }
- catch (IOException ex)
- {
- LOGGER.error("ReportProcessing failed", ex);
- }
- }
- }
-
- private void processElement(final AttributeMap attrs, final String namespace, final String elementType)
- throws IOException, ReportProcessingException
- {
- final XmlWriter xmlWriter = getXmlWriter();
-
- if (ReportTargetUtil.isElementOfType(OfficeNamespaces.TABLE_NS, OfficeToken.TABLE, attrs))
- {
- // a new table means we must clear our "calculated" table boundary array cache
- boundariesForTableArray = null;
-
- final String tableStyle = (String) attrs.getAttribute(OfficeNamespaces.TABLE_NS, OfficeToken.STYLE_NAME);
- if (tableStyle == null)
- {
- tableBackgroundColor = null;
- }
- else
- {
- final Object raw = StyleUtilities.queryStyle(getPredefinedStylesCollection(), OfficeToken.TABLE, tableStyle,
- "table-properties", OfficeNamespaces.FO_NS, OfficeToken.BACKGROUND_COLOR);
- if (raw == null || TRANSPARENT.equals(raw))
- {
- tableBackgroundColor = null;
- }
- else
- {
- tableBackgroundColor = String.valueOf(raw);
- }
- }
- return;
- }
-
- if (ReportTargetUtil.isElementOfType(OfficeNamespaces.TABLE_NS, OfficeToken.TABLE_COLUMN, attrs) || ReportTargetUtil.isElementOfType(OfficeNamespaces.TABLE_NS, OfficeToken.TABLE_COLUMNS, attrs))
- {
- return;
- }
-
- // covered-table-cell elements may appear in the input from row or column spans. In the event that we hit a
- // column-span we simply ignore these elements because we are going to adjust the span to fit the uniform table.
- if (ReportTargetUtil.isElementOfType(OfficeNamespaces.TABLE_NS, OfficeToken.COVERED_TABLE_CELL, attrs))
- {
- if (columnSpanCounter > 0)
- {
- columnSpanCounter--;
- }
-
- if (columnSpanCounter == 0)
- {
- // if we weren't expecting a covered-table-cell, let's use it, it's probably from a row-span
- columnCounter++;
- final int span = getColumnSpanForCell(tableCounter, columnCounter, 1);
- // use the calculated span for the column in the uniform table to create any additional covered-table-cell
- // elements
- for (int i = 0; i < span; i++)
- {
- xmlWriter.writeTag(namespace, OfficeToken.COVERED_TABLE_CELL, null, XmlWriter.CLOSE);
- }
- }
- return;
- }
-
- if (ReportTargetUtil.isElementOfType(OfficeNamespaces.TABLE_NS, OfficeToken.TABLE_ROW, attrs))
- {
- // a new row means our column counter gets reset
- columnCounter = 0;
- // Lets make sure the color of the table is ok ..
- if (tableBackgroundColor != null)
- {
- final String styleName = (String) attrs.getAttribute(OfficeNamespaces.TABLE_NS, OfficeToken.STYLE_NAME);
- final OfficeStyle style = deriveStyle(OfficeToken.TABLE_ROW, styleName);
- Element tableRowProperties = style.getTableRowProperties();
- if (tableRowProperties == null)
- {
- tableRowProperties = new Section();
- tableRowProperties.setNamespace(OfficeNamespaces.STYLE_NS);
- tableRowProperties.setType("table-row-properties");
- tableRowProperties.setAttribute(OfficeNamespaces.FO_NS, OfficeToken.BACKGROUND_COLOR, tableBackgroundColor);
- style.addNode(tableRowProperties);
- }
- else
- {
- final Object oldValue = tableRowProperties.getAttribute(OfficeNamespaces.FO_NS, OfficeToken.BACKGROUND_COLOR);
- if (oldValue == null || TRANSPARENT.equals(oldValue))
- {
- tableRowProperties.setAttribute(OfficeNamespaces.FO_NS, OfficeToken.BACKGROUND_COLOR, tableBackgroundColor);
- }
- }
- attrs.setAttribute(OfficeNamespaces.TABLE_NS, OfficeToken.STYLE_NAME, style.getStyleName());
- }
- }
- else if (ReportTargetUtil.isElementOfType(OfficeNamespaces.TABLE_NS, OfficeToken.TABLE_CELL, attrs))
- {
- columnCounter++;
- final String styleName = (String) attrs.getAttribute(OfficeNamespaces.TABLE_NS, OfficeToken.STYLE_NAME);
- if (styleName != null)
- {
- final OfficeStyle cellStyle = getPredefinedStylesCollection().getStyle(OfficeToken.TABLE_CELL, styleName);
- if (cellStyle != null)
- {
- final Section textProperties = (Section) cellStyle.getTextProperties();
- if (textProperties != null)
- {
- for (String i : FOPROPS)
- {
- textProperties.setAttribute(OfficeNamespaces.FO_NS, i, null);
- }
- textProperties.setAttribute(OfficeNamespaces.TEXT_NS, "display", null);
- for (String i : STYLEPROPS)
- {
- textProperties.setAttribute(OfficeNamespaces.STYLE_NS, i, null);
- }
- }
- final Section props = (Section) cellStyle.getTableCellProperties();
- if (props != null)
- {
- final Object raw = props.getAttribute(OfficeNamespaces.FO_NS, OfficeToken.BACKGROUND_COLOR);
- if (TRANSPARENT.equals(raw))
- {
- props.setAttribute(OfficeNamespaces.FO_NS, OfficeToken.BACKGROUND_COLOR, null);
- // cellStyle.removeNode(props);
- }
- }
- }
- attrs.setAttribute(OfficeNamespaces.TABLE_NS, OfficeToken.STYLE_NAME, styleName);
- }
-
- final String numColSpanStr = (String) attrs.getAttribute(namespace, NUMBERCOLUMNSSPANNED);
- int initialColumnSpan = columnSpanCounter = 1;
- if (numColSpanStr != null)
- {
- initialColumnSpan = Integer.parseInt(numColSpanStr);
- columnSpanCounter = initialColumnSpan;
- }
- final int span = getColumnSpanForCell(tableCounter, columnCounter, initialColumnSpan);
- if (initialColumnSpan > 1)
- {
- // add the initial column span to our column counter index (subtract 1, since it is counted by default)
- columnCounter += initialColumnSpan - 1;
- }
-
- // if (span < initialColumnSpan)
- // {
- // // ColumnBoundary cbs[] = getBoundariesForTable(tableCounter);
- // // for (int i = 0; i < cbs.length; i++)
- // // {
- // // System.out.print(cbs[i].getBoundary() + " ");
- // // }
- // // System.out.println();
- //
- // LOGGER.error("A cell cannot span less than the declared columns: Declared=" + initialColumnSpan + " Computed="
- // + span);
- // }
-
- // there's no point to create number-columns-spanned attributes if we only span 1 column
- if (span > 1)
- {
- attrs.setAttribute(namespace, NUMBERCOLUMNSSPANNED, "" + span);
- currentSpan = span;
- }
- // we must also generate "covered-table-cell" elements for each column spanned
- // but we'll do this in the endElement, after we close this OfficeToken.TABLE_CELL
- }
-
- // All styles have to be processed or you will loose the paragraph-styles and inline text-styles.
- // ..
- performStyleProcessing(attrs);
-
- final AttributeList attrList = buildAttributeList(attrs);
- xmlWriter.writeTag(namespace, elementType, attrList, XmlWriter.OPEN);
- // System.out.println("elementType = " + elementType);
- }
-
- private void collectBoundaryForElement(final AttributeMap attrs)
- {
- if (ReportTargetUtil.isElementOfType(OfficeNamespaces.TABLE_NS, OfficeToken.TABLE_COLUMNS, attrs))
- {
- // A table row resets the column counter.
- resetCurrentRowBoundaryMarker();
- }
- else if (ReportTargetUtil.isElementOfType(OfficeNamespaces.TABLE_NS, OfficeToken.TABLE_COLUMN, attrs))
- {
- final String styleName = (String) attrs.getAttribute(OfficeNamespaces.TABLE_NS, OfficeToken.STYLE_NAME);
- if (styleName == null)
- {
- // This should not happen, but if it does, we will ignore that cell.
- return;
- }
-
- final OfficeStyle style = getPredefinedStylesCollection().getStyle(OfficeToken.TABLE_COLUMN, styleName);
- if (style == null)
- {
- // Now this is very bad. It means that there is no style defined with the given name.
- return;
- }
-
- final Element tableColumnProperties = style.getTableColumnProperties();
- String widthStr = (String) tableColumnProperties.getAttribute("column-width");
- widthStr = widthStr.substring(0, widthStr.indexOf(getUnitsOfMeasure(widthStr)));
- final float val = Float.parseFloat(widthStr) * CELL_WIDTH_FACTOR;
- addColumnWidthToRowBoundaryMarker((long) val);
- ColumnBoundary currentRowBoundary = new ColumnBoundary(getCurrentRowBoundaryMarker());
- final List<ColumnBoundary> columnBoundaryList_ = getColumnBoundaryList();
- final int idx = columnBoundaryList_.indexOf(currentRowBoundary);
- if (idx == -1)
- {
- columnBoundaryList_.add(currentRowBoundary);
- }
- else
- {
- currentRowBoundary = columnBoundaryList_.get(idx);
- }
- currentRowBoundary.addTableIndex(tableCounter);
- }
- }
-
- private String getUnitsOfMeasure(final String str)
- {
- if (unitsOfMeasure == null || "".equals(unitsOfMeasure))
- {
- if (str == null || "".equals(str))
- {
- unitsOfMeasure = "cm";
- return unitsOfMeasure;
- }
-
- // build units of measure, set it
- int i = str.length() - 1;
- for (; i >= 0; i--)
- {
- final char c = str.charAt(i);
- if (Character.isDigit(c) || c == '.' || c == ',')
- {
- break;
- }
- }
- unitsOfMeasure = str.substring(i + 1);
- }
- return unitsOfMeasure;
- }
-
- private void createTableShapes() throws ReportProcessingException
- {
- if (!shapes.isEmpty())
- {
- try
- {
- final XmlWriter xmlWriter = getXmlWriter();
- // at this point we need to generate the table-columns section based on our boundary table
- // <table:shapes>
- // <draw:frame />
- // ..
- // </table:shapes>
- xmlWriter.writeTag(OfficeNamespaces.TABLE_NS, OfficeToken.SHAPES, null, XmlWriterSupport.OPEN);
-
-
- for (int i = 0; i < shapes.size(); i++)
- {
- final AttributeMap attrs = shapes.get(i);
- final AttributeList attrList = buildAttributeList(attrs);
- attrList.removeAttribute(OfficeNamespaces.DRAWING_NS, OfficeToken.STYLE_NAME);
- xmlWriter.writeTag(OfficeNamespaces.DRAWING_NS, OfficeToken.FRAME, attrList, XmlWriterSupport.OPEN);
- startChartProcessing(ole.get(i));
-
- xmlWriter.writeCloseTag();
- }
- xmlWriter.writeCloseTag();
- }
- catch (IOException e)
- {
- throw new ReportProcessingException(OfficeDocumentReportTarget.FAILED, e);
- }
- }
- }
-
- private void createTableColumns() throws ReportProcessingException
- {
- try
- {
- final XmlWriter xmlWriter = getXmlWriter();
- // at this point we need to generate the table-columns section based on our boundary table
- // <table-columns>
- // <table-column style-name="coX"/>
- // ..
- // </table-columns>
- // the first boundary is '0' which is a placeholder so we will ignore it
- xmlWriter.writeTag(OfficeNamespaces.TABLE_NS, OfficeToken.TABLE_COLUMNS, null, XmlWriterSupport.OPEN);
-
- // blow away current column styles
- // start processing at i=1 because we added a boundary for "0" which is virtual
- final ColumnBoundary[] cba = getSortedColumnBoundaryArray();
- for (int i = 1; i < cba.length; i++)
- {
- final ColumnBoundary cb = cba[i];
- float columnWidth = cb.getBoundary();
- if (i > 1)
- {
- columnWidth -= cba[i - 1].getBoundary();
- }
- columnWidth = columnWidth / CELL_WIDTH_FACTOR;
- final OfficeStyle style = deriveStyle(OfficeToken.TABLE_COLUMN, ("co" + i + "_"));
- final Section tableColumnProperties = new Section();
- tableColumnProperties.setType("table-column-properties");
- tableColumnProperties.setNamespace(style.getNamespace());
- final String width = String.format("%f", columnWidth);
- tableColumnProperties.setAttribute(style.getNamespace(),
- "column-width", width + getUnitsOfMeasure(null));
- style.addNode(tableColumnProperties);
-
- final AttributeList myAttrList = new AttributeList();
- myAttrList.setAttribute(OfficeNamespaces.TABLE_NS, OfficeToken.STYLE_NAME, style.getStyleName());
- xmlWriter.writeTag(OfficeNamespaces.TABLE_NS, OfficeToken.TABLE_COLUMN, myAttrList, XmlWriterSupport.CLOSE);
- }
- xmlWriter.writeCloseTag();
- }
- catch (IOException e)
- {
- throw new ReportProcessingException(OfficeDocumentReportTarget.FAILED, e);
- }
- }
-
- protected void endOther(final AttributeMap attrs) throws DataSourceException, ReportProcessingException
- {
- if (ReportTargetUtil.isElementOfType(JFreeReportInfo.REPORT_NAMESPACE, OfficeToken.OBJECT_OLE, attrs) || oleHandled)
- {
- oleHandled = false;
- return;
- }
-
- if (ReportTargetUtil.isElementOfType(OfficeNamespaces.TABLE_NS, OfficeToken.TABLE_ROW, attrs) && isElementBoundaryCollectionPass() && getCurrentRole() != ROLE_TEMPLATE)
- {
- final String styleName = (String) attrs.getAttribute(OfficeNamespaces.TABLE_NS, OfficeToken.STYLE_NAME);
- rowHeights.add(computeRowHeight(styleName));
- }
-
- if (isRepeatingSection() || isElementBoundaryCollectionPass())
- {
- return;
- }
-
- final String namespace = ReportTargetUtil.getNamespaceFromAttribute(attrs);
- if (isFilteredNamespace(namespace))
- {
- return;
- }
- final String elementType = ReportTargetUtil.getElemenTypeFromAttribute(attrs);
- if (OfficeNamespaces.DRAWING_NS.equals(namespace) && OfficeToken.FRAME.equals(elementType))
- {
- return;
- }
-
- // if this is the report namespace, write out a table definition ..
- if (OfficeNamespaces.TABLE_NS.equals(namespace) && (OfficeToken.TABLE.equals(elementType) || OfficeToken.COVERED_TABLE_CELL.equals(elementType) || OfficeToken.TABLE_COLUMN.equals(elementType) || OfficeToken.TABLE_COLUMNS.equals(elementType)))
- {
- return;
- }
-
- if (!paragraphHandled && OfficeNamespaces.TEXT_NS.equals(namespace) && OfficeToken.P.equals(elementType))
- {
- if (!paragraphHandled)
- {
- return;
- }
-
- paragraphHandled = false;
- }
- try
- {
- final XmlWriter xmlWriter = getXmlWriter();
- xmlWriter.writeCloseTag();
- // table-cell elements may have a number-columns-spanned attribute which indicates how many
- // 'covered-table-cell' elements we need to generate
- generateCoveredTableCells(attrs);
- }
- catch (IOException e)
- {
- throw new ReportProcessingException(OfficeDocumentReportTarget.FAILED, e);
- }
- }
-
- private void generateCoveredTableCells(final AttributeMap attrs) throws IOException
- {
- if (!ReportTargetUtil.isElementOfType(OfficeNamespaces.TABLE_NS, OfficeToken.TABLE_CELL, attrs))
- {
- return;
- }
-
- // do this after we close the tag
- final XmlWriter xmlWriter = getXmlWriter();
- // final Object attribute = attrs.getAttribute(OfficeNamespaces.TABLE_NS,NUMBERCOLUMNSSPANNED);
- // final int span = TextUtilities.parseInt((String) attribute, 0);
- final int span = currentSpan;
- currentSpan = 0;
- for (int i = 1; i < span; i++)
- {
- xmlWriter.writeTag(OfficeNamespaces.TABLE_NS, OfficeToken.COVERED_TABLE_CELL, null, XmlWriter.CLOSE);
- }
- }
-
- public String getExportDescriptor()
- {
- return "raw/" + PentahoReportEngineMetaData.OPENDOCUMENT_SPREADSHEET;
- }
-
- // /////////////////////////////////////////////////////////////////////////
- public void processText(final String text) throws DataSourceException, ReportProcessingException
- {
- if (!(isRepeatingSection() || isElementBoundaryCollectionPass()))
- {
- handleParagraph();
- super.processText(text);
- }
- }
-
- public void processContent(final DataFlags value) throws DataSourceException, ReportProcessingException
- {
- if (!(isRepeatingSection() || isElementBoundaryCollectionPass()))
- {
- handleParagraph();
- super.processContent(value);
- }
- }
-
- protected String getStartContent()
- {
- return "spreadsheet";
- }
-
- protected void startContent(final AttributeMap attrs) throws IOException, DataSourceException,
- ReportProcessingException
- {
- if (!isElementBoundaryCollectionPass())
- {
- final XmlWriter xmlWriter = getXmlWriter();
- xmlWriter.writeTag(OfficeNamespaces.OFFICE_NS, getStartContent(), null, XmlWriterSupport.OPEN);
-
- writeNullDate();
-
- final AttributeMap tableAttributes = new AttributeMap();
- tableAttributes.setAttribute(JFreeReportInfo.REPORT_NAMESPACE, Element.NAMESPACE_ATTRIBUTE, OfficeNamespaces.TABLE_NS);
- tableAttributes.setAttribute(JFreeReportInfo.REPORT_NAMESPACE, Element.TYPE_ATTRIBUTE, OfficeToken.TABLE);
- tableAttributes.setAttribute(OfficeNamespaces.TABLE_NS, OfficeToken.STYLE_NAME, generateInitialTableStyle());
- tableAttributes.setAttribute(OfficeNamespaces.TABLE_NS, "name", "Report");
-
- performStyleProcessing(tableAttributes);
-
- xmlWriter.writeTag(OfficeNamespaces.TABLE_NS, OfficeToken.TABLE, buildAttributeList(tableAttributes), XmlWriterSupport.OPEN);
- createTableShapes();
- createTableColumns();
- }
- }
-
- private String generateInitialTableStyle() throws ReportProcessingException
- {
- final OfficeStylesCollection predefStyles = getPredefinedStylesCollection();
- final OfficeStyles commonStyles = predefStyles.getAutomaticStyles();
- if (!commonStyles.containsStyle(OfficeToken.TABLE, "Initial_Table"))
- {
- final String masterPageName = createMasterPage();
-
- final OfficeStyle tableStyle = new OfficeStyle();
- tableStyle.setStyleFamily(OfficeToken.TABLE);
- tableStyle.setStyleName("Initial_Table");
- tableStyle.setAttribute(OfficeNamespaces.STYLE_NS, "master-page-name", masterPageName);
- final Element tableProperties = produceFirstChild(tableStyle, OfficeNamespaces.STYLE_NS, "table-properties");
- tableProperties.setAttribute(OfficeNamespaces.FO_NS, OfficeToken.BACKGROUND_COLOR, TRANSPARENT);
- commonStyles.addStyle(tableStyle);
- }
- return "Initial_Table";
- }
-
- private String createMasterPage() throws ReportProcessingException
- {
- final OfficeStylesCollection predefStyles = getPredefinedStylesCollection();
- final MasterPageFactory masterPageFactory = new MasterPageFactory(predefStyles.getMasterStyles());
- final OfficeMasterPage masterPage;
- if (!masterPageFactory.containsMasterPage("Standard", null, null))
- {
- masterPage = masterPageFactory.createMasterPage("Standard", null, null);
-
- final CSSNumericValue zeroLength = CSSNumericValue.createValue(CSSNumericType.CM, 0);
- final String pageLayoutTemplate = masterPage.getPageLayout();
- if (pageLayoutTemplate == null)
- {
- // there is no pagelayout. Create one ..
- final String derivedLayout = masterPageFactory.createPageStyle(getGlobalStylesCollection().getAutomaticStyles(), zeroLength, zeroLength);
- masterPage.setPageLayout(derivedLayout);
- }
- else
- {
- final String derivedLayout = masterPageFactory.derivePageStyle(pageLayoutTemplate,
- getPredefinedStylesCollection().getAutomaticStyles(),
- getGlobalStylesCollection().getAutomaticStyles(), zeroLength, zeroLength);
- masterPage.setPageLayout(derivedLayout);
- }
-
- final OfficeStylesCollection officeStylesCollection = getGlobalStylesCollection();
- final OfficeMasterStyles officeMasterStyles = officeStylesCollection.getMasterStyles();
- officeMasterStyles.addMasterPage(masterPage);
- }
- else
- {
- masterPage = masterPageFactory.getMasterPage("Standard", null, null);
- }
- return masterPage.getStyleName();
- }
-
- protected void endContent(final AttributeMap attrs) throws IOException, DataSourceException,
- ReportProcessingException
- {
- // todo
- if (!isElementBoundaryCollectionPass())
- {
- final XmlWriter xmlWriter = getXmlWriter();
- xmlWriter.writeCloseTag();
- xmlWriter.writeCloseTag();
- }
- }
-
- public void endReport(final ReportStructureRoot report) throws DataSourceException, ReportProcessingException
- {
- super.endReport(report);
- setElementBoundaryCollectionPass(false);
- resetTableCounter();
- columnCounter = 0;
- copyMeta();
- }
-
- private boolean isElementBoundaryCollectionPass()
- {
- return elementBoundaryCollectionPass;
- }
-
- private void setElementBoundaryCollectionPass(final boolean elementBoundaryCollectionPass)
- {
- this.elementBoundaryCollectionPass = elementBoundaryCollectionPass;
- }
-
- private ColumnBoundary[] getSortedColumnBoundaryArray()
- {
- if (sortedBoundaryArray == null)
- {
- getColumnBoundaryList().add(new ColumnBoundary(0));
- sortedBoundaryArray = getColumnBoundaryList().toArray(new ColumnBoundary[getColumnBoundaryList().size()]);
- Arrays.sort(sortedBoundaryArray);
- }
- return sortedBoundaryArray;
- }
-
- private List<ColumnBoundary> getColumnBoundaryList()
- {
- return columnBoundaryList;
- }
-
- private void addColumnWidthToRowBoundaryMarker(final long width)
- {
- currentRowBoundaryMarker += width;
- }
-
- private long getCurrentRowBoundaryMarker()
- {
- return currentRowBoundaryMarker;
- }
-
- private void resetTableCounter()
- {
- tableCounter = 0;
- }
-
- private void resetCurrentRowBoundaryMarker()
- {
- currentRowBoundaryMarker = 0;
- }
-
- private ColumnBoundary[] getBoundariesForTable(final int table)
- {
- if (boundariesForTableArray == null)
- {
- final List<ColumnBoundary> boundariesForTable = new ArrayList<ColumnBoundary>();
- final List<ColumnBoundary> boundaryList = getColumnBoundaryList();
- for (int i = 0; i < boundaryList.size(); i++)
- {
- final ColumnBoundary b = boundaryList.get(i);
- if (b.isContainedByTable(table))
- {
- boundariesForTable.add(b);
- }
- }
- boundariesForTableArray = boundariesForTable.toArray(new ColumnBoundary[boundariesForTable.size()]);
- Arrays.sort(boundariesForTableArray);
- }
- return boundariesForTableArray;
- }
-
- private int getColumnSpanForCell(final int table, final int col, final int initialColumnSpan)
- {
- final ColumnBoundary[] globalBoundaries = getSortedColumnBoundaryArray();
- final ColumnBoundary[] tableBoundaries = getBoundariesForTable(table);
- // how many column boundaries in the globalBoundaries list fall between the currentRowWidth and the next boundary
- // for the current row
-
- float cellBoundary = tableBoundaries[col - 1].getBoundary();
- float cellWidth = tableBoundaries[col - 1].getBoundary();
-
- if (col > 1)
- {
- cellWidth = cellWidth - tableBoundaries[col - 2].getBoundary();
- }
-
- if (initialColumnSpan > 1)
- {
- // ok we've got some additional spanning specified on the input
- final int index = (col - 1) + (initialColumnSpan - 1);
- cellWidth += tableBoundaries[index].getBoundary() - tableBoundaries[col - 1].getBoundary();
- cellBoundary = tableBoundaries[index].getBoundary();
- }
-
- int beginBoundaryIndex = 0;
- int endBoundaryIndex = globalBoundaries.length - 1;
- for (int i = 0; i < globalBoundaries.length; i++)
- {
- // find beginning boundary
- if (globalBoundaries[i].getBoundary() <= cellBoundary - cellWidth)
- {
- beginBoundaryIndex = i;
- }
- if (globalBoundaries[i].getBoundary() <= cellBoundary)
- {
- endBoundaryIndex = i;
- }
- }
- final int span = endBoundaryIndex - beginBoundaryIndex;
- // span will be zero for the first column, so we adjust it to 1
- if (span == 0)
- {
- return 1;
- }
- // System.out.println("table = " + table + " col = " + col + " rowBoundaries.length = " + tableBoundaries.length + "
- // cellWidth = " + cellWidth + " span = " + span);
- return span;
- }
-
- protected String getTargetMimeType()
- {
- return "application/vnd.oasis.opendocument.spreadsheet";
- }
-}