diff --git a/engine/org.eclipse.birt.report.engine/src/org/eclipse/birt/report/engine/nLayout/area/impl/AreaFactory.java b/engine/org.eclipse.birt.report.engine/src/org/eclipse/birt/report/engine/nLayout/area/impl/AreaFactory.java index 2e72927138..422aabfa72 100644 --- a/engine/org.eclipse.birt.report.engine/src/org/eclipse/birt/report/engine/nLayout/area/impl/AreaFactory.java +++ b/engine/org.eclipse.birt.report.engine/src/org/eclipse/birt/report/engine/nLayout/area/impl/AreaFactory.java @@ -151,9 +151,6 @@ protected AbstractArea createNewArea(ContainerArea parent, LayoutContext context } else { area = new BlockContainerArea(parent, context, content); } - if (context.isFixedLayout()) { - area.setPageBreakInside(IStyle.AVOID_VALUE); - } return area; case IContent.IMAGE_CONTENT: diff --git a/engine/org.eclipse.birt.report.engine/src/org/eclipse/birt/report/engine/nLayout/area/impl/BlockContainerArea.java b/engine/org.eclipse.birt.report.engine/src/org/eclipse/birt/report/engine/nLayout/area/impl/BlockContainerArea.java index 4246a2a7b1..e872fe8716 100644 --- a/engine/org.eclipse.birt.report.engine/src/org/eclipse/birt/report/engine/nLayout/area/impl/BlockContainerArea.java +++ b/engine/org.eclipse.birt.report.engine/src/org/eclipse/birt/report/engine/nLayout/area/impl/BlockContainerArea.java @@ -290,45 +290,45 @@ protected SplitResult _split(int height, boolean force) throws BirtException { result.add(current); continue; } - contentHeight -= ah; - int childSplitHeight = cheight - contentHeight; - SplitResult splitResult = current.split(childSplitHeight, force && !isValidResult(result)); - if (splitResult.status == SplitResult.SPLIT_SUCCEED_WITH_PART) { - ContainerArea splitChildArea = splitResult.getResult(); - result.add(splitChildArea); - status = SplitResult.SPLIT_SUCCEED_WITH_PART; - contentHeight += splitChildArea.getAllocatedHeight(); - break; - } else if (splitResult.status == SplitResult.SPLIT_BEFORE_AVOID_WITH_NULL) { - if (force) { - if (result.size() > 0) { - status = SplitResult.SPLIT_SUCCEED_WITH_PART; - } + contentHeight -= ah; + int childSplitHeight = cheight - contentHeight; + SplitResult splitResult = current.split(childSplitHeight, force && !isValidResult(result)); + if (splitResult.status == SplitResult.SPLIT_SUCCEED_WITH_PART) { + ContainerArea splitChildArea = splitResult.getResult(); + result.add(splitChildArea); + status = SplitResult.SPLIT_SUCCEED_WITH_PART; + contentHeight += splitChildArea.getAllocatedHeight(); + break; + } else if (splitResult.status == SplitResult.SPLIT_BEFORE_AVOID_WITH_NULL) { + if (force) { + if (result.size() > 0) { + status = SplitResult.SPLIT_SUCCEED_WITH_PART; } - break; - } else if (splitResult.status == SplitResult.SPLIT_SUCCEED_WITH_NULL) { - if (isValidResult(result)) { - if (force) { - status = SplitResult.SPLIT_SUCCEED_WITH_PART; - break; - } - if (previous.isPageBreakAfterAvoid()) { - status = SplitResult.SPLIT_BEFORE_AVOID_WITH_NULL; - break; - } + } + break; + } else if (splitResult.status == SplitResult.SPLIT_SUCCEED_WITH_NULL) { + if (isValidResult(result)) { + if (force) { status = SplitResult.SPLIT_SUCCEED_WITH_PART; break; - } else if (force) { - // error status - status = SplitResult.SPLIT_SUCCEED_WITH_PART; + } + if (previous.isPageBreakAfterAvoid()) { + status = SplitResult.SPLIT_BEFORE_AVOID_WITH_NULL; break; - } else { - if (isPageBreakBeforeAvoid()) { - return SplitResult.BEFORE_AVOID_WITH_NULL; - } - return SplitResult.SUCCEED_WITH_NULL; } + status = SplitResult.SPLIT_SUCCEED_WITH_PART; + break; + } else if (force) { + // error status + status = SplitResult.SPLIT_SUCCEED_WITH_PART; + break; + } else { + if (isPageBreakBeforeAvoid()) { + return SplitResult.BEFORE_AVOID_WITH_NULL; + } + return SplitResult.SUCCEED_WITH_NULL; } + } } // split height is larger than content height.(cell) if (result.size() == children.size()) { diff --git a/engine/org.eclipse.birt.report.engine/src/org/eclipse/birt/report/engine/nLayout/area/impl/ContainerArea.java b/engine/org.eclipse.birt.report.engine/src/org/eclipse/birt/report/engine/nLayout/area/impl/ContainerArea.java index 10c1d61779..86a2bfcd45 100644 --- a/engine/org.eclipse.birt.report.engine/src/org/eclipse/birt/report/engine/nLayout/area/impl/ContainerArea.java +++ b/engine/org.eclipse.birt.report.engine/src/org/eclipse/birt/report/engine/nLayout/area/impl/ContainerArea.java @@ -617,7 +617,9 @@ public void setAllocatedHeight(int aHeight) { } /** - * Get content height + * Get content height, that is the height available for the content. + * + * This is computed as allocatedHeight minus bottom/top margin/border/padding. * * * @param allocatedHeight * @return Return the content height diff --git a/engine/org.eclipse.birt.report.engine/src/org/eclipse/birt/report/engine/nLayout/area/impl/LineArea.java b/engine/org.eclipse.birt.report.engine/src/org/eclipse/birt/report/engine/nLayout/area/impl/LineArea.java index 79873553a2..d5ed8e783a 100644 --- a/engine/org.eclipse.birt.report.engine/src/org/eclipse/birt/report/engine/nLayout/area/impl/LineArea.java +++ b/engine/org.eclipse.birt.report.engine/src/org/eclipse/birt/report/engine/nLayout/area/impl/LineArea.java @@ -552,6 +552,13 @@ public SplitResult split(int height, boolean force) throws BirtException { result.addChild(splitChildArea); splitChildArea.setParent(result); } else { + // reset the line height due to negative height caused by page break. + // Otherwise the first line could be rendered too far down. + // See (old) BIRT bug 562873 and + // https://github.com/eclipse-birt/birt/issues/1443. + if (height < 0) { + height = 0; + } child.setY(Math.max(0, child.getY() - height)); } }