public void startSection(final ReportElement element, final int sectionSize) {
    final StyleSheet resolverStyleSheet = element.getComputedStyle();
    final String layoutMode;
    final boolean legacyMode =
        metaData.isFeatureSupported(OutputProcessorFeature.STRICT_COMPATIBILITY);
    if (legacyMode) {
      layoutMode = BandStyleKeys.LAYOUT_BLOCK;
    } else {
      String layout =
          (String)
              resolverStyleSheet.getStyleProperty(BandStyleKeys.LAYOUT, BandStyleKeys.LAYOUT_AUTO);
      if (BandStyleKeys.LAYOUT_INLINE.equals(layout)
          && !this.context.getRenderBox().isAcceptInlineBoxes()) {
        layoutMode = BandStyleKeys.LAYOUT_BLOCK;
      } else {
        layoutMode = layout;
      }
    }

    final GroupSection groupSection =
        new GroupSection(
            renderNodeFactory.produceRenderBox(element, resolverStyleSheet, layoutMode, null),
            renderNodeFactory.createAutoGeneratedSectionStyleSheet(resolverStyleSheet),
            sectionSize,
            legacyMode);
    this.context = new SectionLayoutModelBuilderContext(this.context, groupSection, legacyMode);
    this.context.setEmpty(true);

    if (element instanceof GroupBody || element instanceof Group) {
      // PRD-3154 - do we need to set placeholder to true?
      // todo: PRD-3154: This is black magic, placeholder box true is evil.
      // Need to evaluate side-effects of this beast. Is it safe for keep-together boxes?
      this.context
          .getRenderBox()
          .getStaticBoxLayoutProperties()
          .setPlaceholderBox(StaticBoxLayoutProperties.PlaceholderType.SECTION);
    }
    this.textProducer.startText();
  }
  private InstanceID startBox(
      final ReportElement element,
      final StyleSheet styleSheet,
      final String layout,
      final boolean auto) {
    closeAutoGeneratedPostfixBoxes();

    if (BandStyleKeys.LAYOUT_AUTO.equals(layout)) {
      this.context =
          new DefaultLayoutModelBuilderContext(
              this.context,
              renderNodeFactory.produceRenderBox(element, styleSheet, layout, stateKey));
    } else if (BandStyleKeys.LAYOUT_INLINE.equals(layout)) {
      if (this.context.getRenderBox().isAcceptInlineBoxes() == false) {
        // parent context is not a inline-inside context.
        // So we need to create a auto-paragraph wrapper to open a inline-context
        this.context =
            new DefaultLayoutModelBuilderContext(
                this.context, renderNodeFactory.createAutoParagraph(element, styleSheet, stateKey));

        // PRD-3750 - A empty inline-band that creates a auto-paragraph reserves space on the
        // vertical axis.
        if (metaData.isFeatureSupported(OutputProcessorFeature.STRICT_COMPATIBILITY)
            || metaData.isFeatureSupported(OutputProcessorFeature.PRD_3750)) {
          this.context.setAutoGeneratedWrapperBox(true);

          this.context =
              new DefaultLayoutModelBuilderContext(
                  this.context,
                  renderNodeFactory.produceRenderBox(
                      element,
                      styleSheet,
                      DefaultRenderNodeFactory.LAYOUT_PARAGRAPH_LINEBOX,
                      stateKey));
        }
      } else {
        this.context =
            new DefaultLayoutModelBuilderContext(
                this.context,
                renderNodeFactory.produceRenderBox(element, styleSheet, layout, stateKey));
      }
    } else if (this.context.getRenderBox().isAcceptInlineBoxes()) {
      // inline elements only accept inline element childs
      this.context =
          new DefaultLayoutModelBuilderContext(
              this.context,
              renderNodeFactory.produceRenderBox(
                  element, styleSheet, BandStyleKeys.LAYOUT_INLINE, stateKey));
    } else if (BandStyleKeys.LAYOUT_TABLE_CELL.equals(layout)) {
      // a table body always needs a table parent ..
      if (LayoutNodeTypes.TYPE_BOX_TABLE_ROW != this.context.getRenderBox().getLayoutNodeType()) {
        startBox(
            element,
            renderNodeFactory.createAutoGeneratedSectionStyleSheet(styleSheet),
            BandStyleKeys.LAYOUT_TABLE_ROW,
            true);
      }
      this.context =
          new DefaultLayoutModelBuilderContext(
              this.context,
              renderNodeFactory.produceRenderBox(element, styleSheet, layout, stateKey));
    } else if (BandStyleKeys.LAYOUT_TABLE_ROW.equals(layout)) {
      // a table body always needs a table parent ..
      if (LayoutNodeTypes.TYPE_BOX_TABLE_SECTION
          != this.context.getRenderBox().getLayoutNodeType()) {
        startBox(
            element,
            renderNodeFactory.createAutoGeneratedSectionStyleSheet(styleSheet),
            BandStyleKeys.LAYOUT_TABLE_BODY,
            true);
      }
      this.context =
          new DefaultLayoutModelBuilderContext(
              this.context,
              renderNodeFactory.produceRenderBox(element, styleSheet, layout, stateKey));
    } else if (BandStyleKeys.LAYOUT_TABLE_BODY.equals(layout)
        || BandStyleKeys.LAYOUT_TABLE_FOOTER.equals(layout)
        || BandStyleKeys.LAYOUT_TABLE_HEADER.equals(layout)) {
      // a table body always needs a table parent ..
      if (LayoutNodeTypes.TYPE_BOX_TABLE != this.context.getRenderBox().getLayoutNodeType()) {
        startBox(
            element,
            renderNodeFactory.createAutoGeneratedSectionStyleSheet(styleSheet),
            BandStyleKeys.LAYOUT_TABLE,
            true);
      }
      this.context =
          new DefaultLayoutModelBuilderContext(
              this.context,
              renderNodeFactory.produceRenderBox(element, styleSheet, layout, stateKey));
    } else {
      // handle ordinary elements, block, canvas, row ..
      this.context =
          new DefaultLayoutModelBuilderContext(
              this.context,
              renderNodeFactory.produceRenderBox(element, styleSheet, layout, stateKey));
    }

    this.context.setAutoGeneratedWrapperBox(auto);
    this.context.setEmpty(isEmptyElement(element, styleSheet, metaData));
    if (!auto) {
      if (isControlBand(styleSheet)) {
        this.context
            .getRenderBox()
            .getStaticBoxLayoutProperties()
            .setPlaceholderBox(StaticBoxLayoutProperties.PlaceholderType.SECTION);
      } else {
        this.context
            .getRenderBox()
            .getStaticBoxLayoutProperties()
            .setPlaceholderBox(StaticBoxLayoutProperties.PlaceholderType.NONE);
      }
    }
    this.textProducer.startText();
    return this.context.getRenderBox().getInstanceId();
  }