uk.co.spudsoft.birt.emitters.excel.handlers.TopLevelTableHandler.java Source code

Java tutorial

Introduction

Here is the source code for uk.co.spudsoft.birt.emitters.excel.handlers.TopLevelTableHandler.java

Source

/*************************************************************************************
 * Copyright (c) 2011, 2012, 2013 James Talbut.
 *  jim-emitters@spudsoft.co.uk
 *  
 * All rights reserved. This program and the accompanying materials 
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *     James Talbut - Initial implementation.
 ************************************************************************************/

package uk.co.spudsoft.birt.emitters.excel.handlers;

import java.util.Stack;

import org.apache.poi.ss.util.CellRangeAddress;
import org.eclipse.birt.core.exception.BirtException;
import org.eclipse.birt.report.engine.content.IRowContent;
import org.eclipse.birt.report.engine.content.ITableContent;
import org.eclipse.birt.report.engine.content.ITableGroupContent;
import org.eclipse.birt.report.engine.ir.TableGroupDesign;
import org.eclipse.birt.report.model.api.elements.DesignChoiceConstants;

import uk.co.spudsoft.birt.emitters.excel.EmitterServices;
import uk.co.spudsoft.birt.emitters.excel.ExcelEmitter;
import uk.co.spudsoft.birt.emitters.excel.HandlerState;
import uk.co.spudsoft.birt.emitters.excel.framework.Logger;

public class TopLevelTableHandler extends AbstractRealTableHandler {

    private Stack<Integer> groupStarts;

    public TopLevelTableHandler(Logger log, IHandler parent, ITableContent table) {
        super(log, parent, table);
    }

    @Override
    public void startTable(HandlerState state, ITableContent table) throws BirtException {
        state.colNum = 0;
        super.startTable(state, table);
        String name = table.getName();
        if ((name != null) && !name.isEmpty()) {
            state.sheetName = name;
        }

        String password = EmitterServices.stringOption(state.getRenderOptions(), table, ExcelEmitter.SHEET_PASSWORD,
                null);
        if ((password != null) && !password.isEmpty()) {
            state.sheetPassword = password;
        }
        if (EmitterServices.booleanOption(state.getRenderOptions(), table, ExcelEmitter.GROUP_SUMMARY_HEADER,
                false)) {
            state.currentSheet.setRowSumsBelow(false);
        }
    }

    @Override
    public void endTable(HandlerState state, ITableContent table) throws BirtException {
        super.endTable(state, table);

        boolean autoFilter = EmitterServices.booleanOption(state.getRenderOptions(), table,
                ExcelEmitter.AUTO_FILTER, false);
        if (autoFilter) {
            log.debug("Applying auto filter to [", this.startRow, ",", this.startCol, "] - [", this.endDetailsRow,
                    ",", state.colNum - 1, "]");
            CellRangeAddress wholeTable = new CellRangeAddress(startRow, endDetailsRow, startCol, state.colNum - 1);
            state.currentSheet.setAutoFilter(wholeTable);
        }

        boolean blankRowAfterTopLevelTable = EmitterServices.booleanOption(state.getRenderOptions(), table,
                ExcelEmitter.BLANK_ROW_AFTER_TOP_LEVEL_TABLE, false);
        if (blankRowAfterTopLevelTable) {
            ++state.rowNum;
        }

        state.setHandler(parent);
    }

    @Override
    public void startRow(HandlerState state, IRowContent row) throws BirtException {
        state.setHandler(new TopLevelTableRowHandler(log, this, row));
        state.getHandler().startRow(state, row);
    }

    @Override
    public void startTableGroup(HandlerState state, ITableGroupContent group) throws BirtException {
        log.debug("startTableGroup @" + state.rowNum + " called " + group.getBookmark());
        if (groupStarts == null) {
            groupStarts = new Stack<Integer>();
        }
        groupStarts.push(state.rowNum);

        Object groupDesignObject = group.getGenerateBy();
        if (groupDesignObject instanceof TableGroupDesign) {
            TableGroupDesign groupDesign = (TableGroupDesign) groupDesignObject;
            if (DesignChoiceConstants.PAGE_BREAK_BEFORE_ALWAYS.equals(groupDesign.getPageBreakBefore())
                    || DesignChoiceConstants.PAGE_BREAK_BEFORE_ALWAYS_EXCLUDING_FIRST
                            .equals(groupDesign.getPageBreakBefore())
                    || DesignChoiceConstants.PAGE_BREAK_AFTER_ALWAYS.equals(groupDesign.getPageBreakAfter())
                    || DesignChoiceConstants.PAGE_BREAK_AFTER_ALWAYS_EXCLUDING_LAST
                            .equals(groupDesign.getPageBreakAfter())) {
                if (group.getTOC() != null) {
                    state.sheetName = group.getTOC().toString();
                }
            }
        }

    }

    @Override
    public void endTableGroup(HandlerState state, ITableGroupContent group) throws BirtException {
        log.debug("endTableGroup @" + state.rowNum + " called " + group.getBookmark());
        int start = groupStarts.pop();
        if (start < state.rowNum - 1) {

            boolean disableGrouping = false;

            // Report user props and context first
            if (EmitterServices.booleanOption(state.getRenderOptions(), group, ExcelEmitter.DISABLE_GROUPING,
                    false)) {
                disableGrouping = true;
            }

            if (!disableGrouping) {
                if (state.currentSheet.getRowSumsBelow()) {
                    log.debug("TableGroup of rows below ", start, " - ", state.rowNum - 2);
                    state.currentSheet.groupRow(start, state.rowNum - 2);
                } else {
                    log.debug("TableGroup of rows above ", start + 1, " - ", state.rowNum - 1);
                    state.currentSheet.groupRow(start + 1, state.rowNum - 1);
                }
            }
        }
    }

}