diff options
author | Oliver Bolte <obo@openoffice.org> | 2009-03-04 15:27:10 +0000 |
---|---|---|
committer | Oliver Bolte <obo@openoffice.org> | 2009-03-04 15:27:10 +0000 |
commit | 9544c14f4a931d8d8b2e66a6cb87fb53d4505cd4 (patch) | |
tree | 29b05df340e2c19c9e60947d63bf7b425cfb95c2 /reportbuilder/java/com/sun/star/report/pentaho/layoutprocessor/ImageElementLayoutController.java | |
parent | 4f4fe6aa7203aac35a774108f4880553df5b93a4 (diff) |
CWS-TOOLING: integrate CWS rptfix04
2009-02-23 01:59:54 +0100 rene r268341 : #i10000# fix system-jfreereport build
2009-02-13 10:17:16 +0100 oj r267696 : #i98549# integrate zip form pentaho package
2009-02-03 14:48:34 +0100 oj r267330 : set formula locale to doc locale
2009-02-03 14:45:54 +0100 oj r267329 : set formula locale to doc locale
2009-02-03 11:50:03 +0100 oj r267311 : set formula locale to doc locale
2009-02-03 08:55:02 +0100 oj r267297 : unix line ends
2009-01-28 11:21:24 +0100 rene r267043 : #i98549# s/DESIGN/BUILDER/ also for Sun
2009-01-27 17:17:50 +0100 rene r267012 : merge builfix from trunk
2009-01-27 14:16:30 +0100 rene r266991 : #i10000# fix rebase which left out the whole changes in former config_office; sync variable names (s/LIB_//) and some other things
2009-01-27 10:01:09 +0100 oj r266959 : CWS-TOOLING: rebase CWS rptfix04 to trunk@266944 (milestone: DEV300:m40)
2009-01-27 08:00:16 +0100 oj r266951 : conflict in mergeinfo
2009-01-26 12:23:03 +0100 oj r266914 : #i98383# fix grouping
2009-01-23 22:03:03 +0100 rene r266852 : fix --enable-report-builder description
2009-01-23 10:37:27 +0100 oj r266778 : set escape processing when set at query
2009-01-23 09:17:16 +0100 fs r266770 : add CWS name to version
2009-01-21 13:57:35 +0100 oj r266669 : merge for build bots
2009-01-20 09:07:24 +0100 oj r266552 : CWS-TOOLING: rebase CWS rptfix04 to trunk@266428 (milestone: DEV300:m39)
2009-01-20 08:34:16 +0100 oj r266551 : rebase
2009-01-20 08:33:59 +0100 oj r266550 : rebase
2009-01-20 08:32:50 +0100 oj r266549 : rebase
2009-01-20 08:30:13 +0100 oj r266548 : rebase
2009-01-20 08:29:30 +0100 oj r266547 : rebase
2009-01-20 08:22:33 +0100 oj r266546 : merge short cuts from dba31g
2009-01-19 21:04:08 +0100 rene r266525 : #i10000# we need officecfg for component-update.dtd
2009-01-19 21:01:26 +0100 rene r266524 : #i10000# fix import
2009-01-19 20:26:20 +0100 rene r266523 : #i10000# remove svn conflicts markers; fix build
2009-01-19 14:23:56 +0100 rene r266496 : libbase depends on apache-commons..
2009-01-19 14:00:42 +0100 oj r266495 : merge from m39
2009-01-19 12:39:00 +0100 oj r266489 : CWS-TOOLING: rebase CWS rptfix04 to trunk@266428 (milestone: DEV300:m39)
2009-01-16 11:47:04 +0100 oj r266410 : #i97560# add , between expressions
2009-01-09 17:11:38 +0100 rene r266103 : don't show "checking which Apache commons-* libs to use" when we neither build the wiki editor nor the SRB
2009-01-09 16:48:02 +0100 rene r266099 : #i10000# reportbuilder needs apache-commons
2009-01-09 15:43:35 +0100 oj r266093 : use of new nspaces
2009-01-09 15:41:34 +0100 oj r266092 : use of new nspaces
2009-01-09 14:44:15 +0100 rene r266088 : fix typo/description
2009-01-09 12:48:51 +0100 rene r266074 : #i10000# fix install
2009-01-09 11:52:53 +0100 rene r266070 : #i10000# more build fixes
2009-01-09 10:53:13 +0100 rene r266062 : #i10000# ENABLE_REPORTBUILDER also in set_soenv.in, fix typo
2009-01-09 10:40:24 +0100 rene r266060 : #i10000# configure fix for new reportbuilder module, typo fix at libfonts
2009-01-09 10:01:52 +0100 rene r266055 : #i10000# adapt to current configure.in
2009-01-09 09:59:32 +0100 oj r266054 : add new pentaho jars
2009-01-09 09:47:54 +0100 oj r266049 : merge changes from DEV300_m39
2009-01-09 09:14:08 +0100 oj r266048 : merge from DEV300_m39
2009-01-09 08:28:43 +0100 oj r266045 : merge changes from dba31g
2009-01-09 07:58:10 +0100 oj r266044 : replace JCOMMON with LIB
2009-01-08 13:42:24 +0100 oj r266005 : move ext to reportbuilder
2009-01-08 13:41:38 +0100 oj r266004 : add dep for license
2009-01-08 13:27:56 +0100 oj r266001 : new module for Sun report Builder extension
2009-01-07 12:58:13 +0100 oj r265960 : CWS-TOOLING: rebase CWS rptfix04 to trunk@265758 (milestone: DEV300:m38)
2008-12-15 13:47:18 +0100 oj r265481 : new pentaho resources
2008-12-15 10:04:01 +0100 oj r265462 : integrate new pentaho sources
2008-12-15 10:02:54 +0100 oj r265461 : #i96888# fix date time function
2008-12-12 09:23:29 +0100 oj r265389 : #97174# check of res < 0 removed
2008-12-12 09:15:54 +0100 oj r265388 : #i9716# fix for DayFunction
2008-12-11 12:24:24 +0100 oj r265281 : integrate new pentaho sources
2008-12-11 11:49:16 +0100 oj r265273 : integrate new pentaho sources
2008-12-11 09:34:07 +0100 oj r265248 : integrate new pentaho sources
2008-12-10 18:58:06 +0100 oj r265227 : introduce new pentaho sources
2008-12-10 18:56:43 +0100 oj r265226 : introduce new pentaho sources
2008-12-10 18:54:26 +0100 oj r265225 : introduce new pentaho sources
2008-12-10 18:42:59 +0100 oj r265221 : introduce new pentaho sources
2008-12-10 17:24:23 +0100 oj r265212 : introduce new pentaho sources
2008-12-10 17:24:07 +0100 oj r265211 : new pentaho sources
2008-12-10 17:23:00 +0100 oj r265210 : introduce new pentaho sources
Diffstat (limited to 'reportbuilder/java/com/sun/star/report/pentaho/layoutprocessor/ImageElementLayoutController.java')
-rw-r--r-- | reportbuilder/java/com/sun/star/report/pentaho/layoutprocessor/ImageElementLayoutController.java | 332 |
1 files changed, 332 insertions, 0 deletions
diff --git a/reportbuilder/java/com/sun/star/report/pentaho/layoutprocessor/ImageElementLayoutController.java b/reportbuilder/java/com/sun/star/report/pentaho/layoutprocessor/ImageElementLayoutController.java new file mode 100644 index 000000000000..8cd296151005 --- /dev/null +++ b/reportbuilder/java/com/sun/star/report/pentaho/layoutprocessor/ImageElementLayoutController.java @@ -0,0 +1,332 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: ImageElementLayoutController.java,v $ + * $Revision: 1.7 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org 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 version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +package com.sun.star.report.pentaho.layoutprocessor; + +import com.sun.star.report.pentaho.OfficeNamespaces; +import com.sun.star.report.OfficeToken; +import com.sun.star.report.pentaho.model.ImageElement; +import org.pentaho.reporting.libraries.formula.Formula; +import org.pentaho.reporting.libraries.formula.lvalues.LValue; +import org.pentaho.reporting.libraries.formula.parser.ParseException; +import org.jfree.layouting.util.AttributeMap; +import org.jfree.report.DataSourceException; +import org.jfree.report.JFreeReportInfo; +import org.jfree.report.ReportDataFactoryException; +import org.jfree.report.ReportProcessingException; +import org.jfree.report.util.TextUtilities; +import org.jfree.report.data.GlobalMasterRow; +import org.jfree.report.data.ReportDataRow; +import org.jfree.report.expressions.FormulaExpression; +import org.jfree.report.flow.FlowController; +import org.jfree.report.flow.ReportTarget; +import org.jfree.report.flow.layoutprocessor.LayoutController; +import org.jfree.report.flow.layoutprocessor.LayoutControllerUtil; +import org.jfree.report.structure.Element; +import org.jfree.report.structure.Section; +import org.jfree.report.structure.Node; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.pentaho.reporting.libraries.base.util.ObjectUtilities; + +/** + * Produces an image. The image-structures itself (draw:frame and so on) are not generated here. This element produces a + * place-holder element and relies on the output target to compute a sensible position for the element. The report + * definition does not give any hints about the size of the image, so we have to derive this from the surrounding + * context. + * + * @author Thomas Morgner + * @since 05.03.2007 + */ +public class ImageElementLayoutController + extends AbstractReportElementLayoutController +{ + private static final Log LOGGER = LogFactory.getLog(ImageElementLayoutController.class); + private ImageElementContext context; + + public ImageElementLayoutController() + { + } + + protected LayoutController delegateContentGeneration(final ReportTarget target) + throws ReportProcessingException, ReportDataFactoryException, + DataSourceException + { + final ImageElement imageElement = (ImageElement) getNode(); + final FormulaExpression formulaExpression = imageElement.getFormula(); + if (formulaExpression == null) + { + // A static image is easy. At least at this level. Dont ask about the weird things we have to do in the + // output targets ... + final String linkTarget = imageElement.getImageData(); + generateImage(target, linkTarget, imageElement.isScale(), imageElement.isPreserveIRI()); + } + else + { + final Object value = + LayoutControllerUtil.evaluateExpression(getFlowController(), imageElement, formulaExpression); + generateImage(target, value, imageElement.isScale(), imageElement.isPreserveIRI()); + } + return join(getFlowController()); + } + + private void generateImage(final ReportTarget target, + final Object linkTarget, + final boolean scale, + final boolean preserveIri) + throws ReportProcessingException, DataSourceException + { + if (linkTarget == null) + { + return; + } + + final AttributeMap image = new AttributeMap(); + image.setAttribute(JFreeReportInfo.REPORT_NAMESPACE, Element.NAMESPACE_ATTRIBUTE, JFreeReportInfo.REPORT_NAMESPACE); + image.setAttribute(JFreeReportInfo.REPORT_NAMESPACE, Element.TYPE_ATTRIBUTE, OfficeToken.IMAGE); + image.setAttribute(JFreeReportInfo.REPORT_NAMESPACE, OfficeToken.SCALE, String.valueOf(scale)); + image.setAttribute(JFreeReportInfo.REPORT_NAMESPACE, OfficeToken.PRESERVE_IRI, String.valueOf(preserveIri)); + image.setAttribute(JFreeReportInfo.REPORT_NAMESPACE, "image-context", createContext()); + image.setAttribute(JFreeReportInfo.REPORT_NAMESPACE, OfficeToken.IMAGE_DATA, linkTarget); + target.startElement(image); + target.endElement(image); + } + + protected ImageElementContext createContext() + { + if (context == null) + { + + // Step 1: Find the parent cell. + final LayoutController cellController = findParentCell(); + if (cellController == null) + { + LOGGER.warn("Image is not contained in a table. Unable to calculate the image-size."); + return null; + } + final Element tableCell = (Element) cellController.getNode(); + final int rowSpan = TextUtilities.parseInt((String) tableCell.getAttribute(OfficeNamespaces.TABLE_NS, "number-rows-spanned"), 1); + final int colSpan = TextUtilities.parseInt((String) tableCell.getAttribute(OfficeNamespaces.TABLE_NS, "number-columns-spanned"), 1); + if (rowSpan < 1 || colSpan < 1) + { + LOGGER.warn("Rowspan or colspan for image-size calculation was invalid."); + return null; + } + + final LayoutController rowController = cellController.getParent(); + if (rowController == null) + { + LOGGER.warn("Table-Cell has no parent. Unable to calculate the image-size."); + return null; + } + final Section tableRow = (Section) rowController.getNode(); + // we are now making the assumption, that the row is a section, that contains the table-cell. + // This breaks the ability to return nodes or to construct reports on the fly, but the OO-report format + // is weird anyway and wont support such advanced techniques for the next few centuries .. + final int columnPos = findNodeInSection(tableRow, tableCell, OfficeToken.COVERED_TABLE_CELL); + if (columnPos == -1) + { + LOGGER.warn("Table-Cell is not a direct child of the table-row. Unable to calculate the image-size."); + return null; + } + + final LayoutController tableController = rowController.getParent(); + if (tableController == null) + { + LOGGER.warn("Table-Row has no Table. Unable to calculate the image-size."); + return null; + } + + final Section table = (Section) tableController.getNode(); + // ok, we got a table, so as next we have to search for the columns now. + final Section columns = (Section) table.findFirstChild(OfficeNamespaces.TABLE_NS, OfficeToken.TABLE_COLUMNS); + if (columns.getNodeCount() <= columnPos + colSpan) + { + // the colspan is to large. The table definition is therefore invalid. We do not try to fix this. + LOGGER.warn( + "The Table's defined columns do not match the col-span or col-position. Unable to calculate the image-size."); + return null; + } + + final ImageElementContext context = new ImageElementContext(colSpan, rowSpan); + addColumnStyles(context, columns, columnPos, colSpan); + // finally search the styles for the row now. + final int rowPos = findNodeInSection(table, tableRow, null); + if (rowPos == -1) + { + LOGGER.warn("Table-Cell is not a direct child of the table-row. Unable to calculate the image-size."); + return null; + } + + addRowStyles(context, table,rowPos,rowSpan); + this.context = context; + } + return this.context; + } + + private int findNodeInSection(final Section tableRow, + final Element tableCell, + final String secondType) + { + int retval = 0; + final Node[] nodes = tableRow.getNodeArray(); + final String namespace = tableCell.getNamespace(); + final String type = tableCell.getType(); + for (int i = 0; i < nodes.length; i++) + { + final Node node = nodes[i]; + if (!(node instanceof Element)) + { + continue; + } + final Element child = (Element) node; + /* + if (! OfficeToken.COVERED_TABLE_CELL.equals(child.getType()) && + (ObjectUtilities.equal(child.getNamespace(), namespace) == false || + ObjectUtilities.equal(child.getType(), type) == false)) + */ + if (!ObjectUtilities.equal(child.getNamespace(), namespace) || + (!ObjectUtilities.equal(child.getType(), type) && (secondType == null || !ObjectUtilities.equal(child.getType(), secondType)))) + { + continue; + } + + if (node == tableCell) + { + return retval; + } + retval += 1; + } + return -1; + } + + private LayoutController findParentCell() + { + LayoutController parent = getParent(); + while (parent != null) + { + final Object node = parent.getNode(); + if (node instanceof Element) + { + final Element element = (Element) node; + if (OfficeNamespaces.TABLE_NS.equals(element.getNamespace()) && "table-cell".equals(element.getType())) + { + return parent; + } + } + parent = parent.getParent(); + } + return null; + } + + protected boolean isValueChanged() + { + final ImageElement imageElement = (ImageElement) getNode(); + final FormulaExpression formulaExpression = imageElement.getFormula(); + if (formulaExpression == null) + { + final FlowController controller = getFlowController(); + final GlobalMasterRow masterRow = controller.getMasterRow(); + final ReportDataRow reportDataRow = masterRow.getReportDataRow(); + if (reportDataRow.getCursor() == 0) + { + return true; + } + return false; + } + + try + { + final Formula formula = formulaExpression.getCompiledFormula(); + final LValue lValue = formula.getRootReference(); + return isReferenceChanged(lValue); + } + catch (ParseException e) + { + return false; + } + } + + void addColumnStyles(final ImageElementContext context, final Section columns, final int columnPos, final int colSpan) + { + final Node[] columnDefs = columns.getNodeArray(); + int columnCounter = 0; + for (int i = 0; i < columnDefs.length; i++) + { + final Element column = (Element) columnDefs[i]; + + if (!ObjectUtilities.equal(column.getNamespace(), OfficeNamespaces.TABLE_NS) || + !ObjectUtilities.equal(column.getType(), OfficeToken.TABLE_COLUMN)) + { + continue; + } + if (columnCounter >= columnPos) + { + final String colStyle = (String) column.getAttribute(OfficeNamespaces.TABLE_NS, OfficeToken.STYLE_NAME); + context.setColStyle(columnCounter - columnPos, colStyle); + } + + columnCounter += 1; + + if (columnCounter >= (columnPos + colSpan)) + { + break; + } + + } + } + + void addRowStyles(final ImageElementContext context, final Section table, final int rowPos, final int rowSpan) + { + final Node[] rows = table.getNodeArray(); + int rowCounter = 0; + for (int i = 0; i < rows.length; i++) + { + final Element row = (Element) rows[i]; + + if (!ObjectUtilities.equal(row.getNamespace(), OfficeNamespaces.TABLE_NS) || + !ObjectUtilities.equal(row.getType(), OfficeToken.TABLE_ROW)) + { + continue; + } + if (rowCounter >= rowPos) + { + final String rowStyle = (String) row.getAttribute(OfficeNamespaces.TABLE_NS, OfficeToken.STYLE_NAME); + context.setRowStyle(rowCounter - rowPos, rowStyle); + } + + rowCounter += 1; + + if (rowCounter >= (rowPos + rowSpan)) + { + break; + } + } + } +} |