1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski package com.sun.star.report.pentaho.layoutprocessor; 24*b1cdbd2cSJim Jagielski 25*b1cdbd2cSJim Jagielski import com.sun.star.report.pentaho.model.VariablesDeclarationSection; 26*b1cdbd2cSJim Jagielski 27*b1cdbd2cSJim Jagielski import org.jfree.report.DataSourceException; 28*b1cdbd2cSJim Jagielski import org.jfree.report.ReportData; 29*b1cdbd2cSJim Jagielski import org.jfree.report.ReportDataFactoryException; 30*b1cdbd2cSJim Jagielski import org.jfree.report.ReportProcessingException; 31*b1cdbd2cSJim Jagielski import org.jfree.report.data.GlobalMasterRow; 32*b1cdbd2cSJim Jagielski import org.jfree.report.data.ReportDataRow; 33*b1cdbd2cSJim Jagielski import org.jfree.report.flow.FlowController; 34*b1cdbd2cSJim Jagielski import org.jfree.report.flow.ReportTarget; 35*b1cdbd2cSJim Jagielski import org.jfree.report.flow.layoutprocessor.ElementLayoutController; 36*b1cdbd2cSJim Jagielski import org.jfree.report.flow.layoutprocessor.LayoutController; 37*b1cdbd2cSJim Jagielski import org.jfree.report.flow.layoutprocessor.SectionLayoutController; 38*b1cdbd2cSJim Jagielski 39*b1cdbd2cSJim Jagielski /** 40*b1cdbd2cSJim Jagielski * Creation-Date: 11.04.2007, 11:04:02 41*b1cdbd2cSJim Jagielski * 42*b1cdbd2cSJim Jagielski * @author Thomas Morgner 43*b1cdbd2cSJim Jagielski */ 44*b1cdbd2cSJim Jagielski public class OfficeDetailLayoutController extends SectionLayoutController 45*b1cdbd2cSJim Jagielski { 46*b1cdbd2cSJim Jagielski 47*b1cdbd2cSJim Jagielski public static final int STATE_PROCESS_VARIABLES = 2; 48*b1cdbd2cSJim Jagielski public static final int STATE_PROCESS_NORMAL_FLOW = 3; 49*b1cdbd2cSJim Jagielski private boolean waitForJoin; 50*b1cdbd2cSJim Jagielski private int state; 51*b1cdbd2cSJim Jagielski OfficeDetailLayoutController()52*b1cdbd2cSJim Jagielski public OfficeDetailLayoutController() 53*b1cdbd2cSJim Jagielski { 54*b1cdbd2cSJim Jagielski } 55*b1cdbd2cSJim Jagielski 56*b1cdbd2cSJim Jagielski /** 57*b1cdbd2cSJim Jagielski * Initializes the layout controller. This method is called exactly once. It 58*b1cdbd2cSJim Jagielski * is the creators responsibility to call this method. 59*b1cdbd2cSJim Jagielski * <p/> 60*b1cdbd2cSJim Jagielski * Calling initialize after the first advance must result in a 61*b1cdbd2cSJim Jagielski * IllegalStateException. 62*b1cdbd2cSJim Jagielski * 63*b1cdbd2cSJim Jagielski * @param node the currently processed object or layout node. 64*b1cdbd2cSJim Jagielski * @param flowController the current flow controller. 65*b1cdbd2cSJim Jagielski * @param parent the parent layout controller that was responsible for 66*b1cdbd2cSJim Jagielski * instantiating this controller. 67*b1cdbd2cSJim Jagielski * @throws org.jfree.report.DataSourceException 68*b1cdbd2cSJim Jagielski * if there was a problem reading data from the datasource. 69*b1cdbd2cSJim Jagielski * @throws org.jfree.report.ReportProcessingException 70*b1cdbd2cSJim Jagielski * if there was a general problem during the report processing. 71*b1cdbd2cSJim Jagielski * @throws org.jfree.report.ReportDataFactoryException 72*b1cdbd2cSJim Jagielski * if a query failed. 73*b1cdbd2cSJim Jagielski */ initialize(final Object node, final FlowController flowController, final LayoutController parent)74*b1cdbd2cSJim Jagielski public void initialize(final Object node, 75*b1cdbd2cSJim Jagielski final FlowController flowController, 76*b1cdbd2cSJim Jagielski final LayoutController parent) 77*b1cdbd2cSJim Jagielski throws DataSourceException, ReportDataFactoryException, 78*b1cdbd2cSJim Jagielski ReportProcessingException 79*b1cdbd2cSJim Jagielski { 80*b1cdbd2cSJim Jagielski super.initialize(node, flowController, parent); 81*b1cdbd2cSJim Jagielski state = OfficeDetailLayoutController.STATE_PROCESS_VARIABLES; 82*b1cdbd2cSJim Jagielski } 83*b1cdbd2cSJim Jagielski 84*b1cdbd2cSJim Jagielski /** 85*b1cdbd2cSJim Jagielski * This method is called for each newly instantiated layout controller. The returned layout controller instance should 86*b1cdbd2cSJim Jagielski * have a processing state of either 'OPEN' or 'FINISHING' depending on whether there is any content or any child 87*b1cdbd2cSJim Jagielski * nodes to process. 88*b1cdbd2cSJim Jagielski * 89*b1cdbd2cSJim Jagielski * @param target the report target that receives generated events. 90*b1cdbd2cSJim Jagielski * @return the new layout controller instance representing the new state. 91*b1cdbd2cSJim Jagielski * @throws org.jfree.report.DataSourceException 92*b1cdbd2cSJim Jagielski * if there was a problem reading data from the datasource. 93*b1cdbd2cSJim Jagielski * @throws org.jfree.report.ReportProcessingException 94*b1cdbd2cSJim Jagielski * if there was a general problem during the report processing. 95*b1cdbd2cSJim Jagielski * @throws org.jfree.report.ReportDataFactoryException 96*b1cdbd2cSJim Jagielski * if a query failed. 97*b1cdbd2cSJim Jagielski */ startElement(final ReportTarget target)98*b1cdbd2cSJim Jagielski protected LayoutController startElement(final ReportTarget target) 99*b1cdbd2cSJim Jagielski throws DataSourceException, ReportProcessingException, ReportDataFactoryException 100*b1cdbd2cSJim Jagielski { 101*b1cdbd2cSJim Jagielski final FlowController fc = getFlowController(); 102*b1cdbd2cSJim Jagielski final GlobalMasterRow masterRow = fc.getMasterRow(); 103*b1cdbd2cSJim Jagielski final ReportDataRow reportDataRow = masterRow.getReportDataRow(); 104*b1cdbd2cSJim Jagielski final ReportData reportData = reportDataRow.getReportData(); 105*b1cdbd2cSJim Jagielski if (!reportData.isReadable()) 106*b1cdbd2cSJim Jagielski { 107*b1cdbd2cSJim Jagielski reportData.isReadable(); 108*b1cdbd2cSJim Jagielski // If this report has no data, then do not print the detail section. The detail section 109*b1cdbd2cSJim Jagielski // is the only section that behaves this way, and for now this is only done in the OO-implementation 110*b1cdbd2cSJim Jagielski final SectionLayoutController derived = (SectionLayoutController) clone(); 111*b1cdbd2cSJim Jagielski derived.setProcessingState(ElementLayoutController.FINISHED); 112*b1cdbd2cSJim Jagielski derived.setFlowController(fc); 113*b1cdbd2cSJim Jagielski return derived; 114*b1cdbd2cSJim Jagielski } 115*b1cdbd2cSJim Jagielski 116*b1cdbd2cSJim Jagielski if (state == OfficeDetailLayoutController.STATE_PROCESS_VARIABLES) 117*b1cdbd2cSJim Jagielski { 118*b1cdbd2cSJim Jagielski final VariablesDeclarationSection variables = new VariablesDeclarationSection(); 119*b1cdbd2cSJim Jagielski final OfficeDetailLayoutController controller = (OfficeDetailLayoutController) clone(); 120*b1cdbd2cSJim Jagielski controller.state = OfficeDetailLayoutController.STATE_PROCESS_NORMAL_FLOW; 121*b1cdbd2cSJim Jagielski controller.waitForJoin = true; 122*b1cdbd2cSJim Jagielski return processChild(controller, variables, fc); 123*b1cdbd2cSJim Jagielski } 124*b1cdbd2cSJim Jagielski 125*b1cdbd2cSJim Jagielski return super.startElement(target); 126*b1cdbd2cSJim Jagielski } 127*b1cdbd2cSJim Jagielski resetSectionForRepeat()128*b1cdbd2cSJim Jagielski protected void resetSectionForRepeat() 129*b1cdbd2cSJim Jagielski { 130*b1cdbd2cSJim Jagielski super.resetSectionForRepeat(); 131*b1cdbd2cSJim Jagielski state = STATE_PROCESS_VARIABLES; 132*b1cdbd2cSJim Jagielski } 133*b1cdbd2cSJim Jagielski 134*b1cdbd2cSJim Jagielski /** 135*b1cdbd2cSJim Jagielski * Joins with a delegated process flow. This is generally called from a child 136*b1cdbd2cSJim Jagielski * flow and should *not* (I mean it!) be called from outside. If you do, 137*b1cdbd2cSJim Jagielski * you'll suffer. 138*b1cdbd2cSJim Jagielski * 139*b1cdbd2cSJim Jagielski * @param flowController the flow controller of the parent. 140*b1cdbd2cSJim Jagielski * @return the joined layout controller that incorperates all changes from the 141*b1cdbd2cSJim Jagielski * delegate. 142*b1cdbd2cSJim Jagielski */ join(final FlowController flowController)143*b1cdbd2cSJim Jagielski public LayoutController join(final FlowController flowController) 144*b1cdbd2cSJim Jagielski { 145*b1cdbd2cSJim Jagielski if (waitForJoin) 146*b1cdbd2cSJim Jagielski { 147*b1cdbd2cSJim Jagielski final OfficeDetailLayoutController derived = (OfficeDetailLayoutController) clone(); 148*b1cdbd2cSJim Jagielski derived.setProcessingState(ElementLayoutController.NOT_STARTED); 149*b1cdbd2cSJim Jagielski derived.setFlowController(flowController); 150*b1cdbd2cSJim Jagielski derived.waitForJoin = false; 151*b1cdbd2cSJim Jagielski return derived; 152*b1cdbd2cSJim Jagielski } 153*b1cdbd2cSJim Jagielski return super.join(flowController); 154*b1cdbd2cSJim Jagielski } 155*b1cdbd2cSJim Jagielski } 156