| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 1997 Martin Jones (mjones@kde.org) | 2 * Copyright (C) 1997 Martin Jones (mjones@kde.org) |
| 3 * (C) 1997 Torben Weis (weis@kde.org) | 3 * (C) 1997 Torben Weis (weis@kde.org) |
| 4 * (C) 1998 Waldo Bastian (bastian@kde.org) | 4 * (C) 1998 Waldo Bastian (bastian@kde.org) |
| 5 * (C) 1999 Lars Knoll (knoll@kde.org) | 5 * (C) 1999 Lars Knoll (knoll@kde.org) |
| 6 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 6 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
| 7 * Copyright (C) 2003, 2004, 2005, 2006, 2008, 2009, 2010, 2013 Apple Inc. | 7 * Copyright (C) 2003, 2004, 2005, 2006, 2008, 2009, 2010, 2013 Apple Inc. |
| 8 * All rights reserved. | 8 * All rights reserved. |
| 9 * Copyright (C) 2006 Alexey Proskuryakov (ap@nypop.com) | 9 * Copyright (C) 2006 Alexey Proskuryakov (ap@nypop.com) |
| 10 * | 10 * |
| (...skipping 1228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1239 LayoutUnit pageLogicalHeight = pageLogicalHeightForOffset(logicalOffset); | 1239 LayoutUnit pageLogicalHeight = pageLogicalHeightForOffset(logicalOffset); |
| 1240 if (!pageLogicalHeight) | 1240 if (!pageLogicalHeight) |
| 1241 return 0; | 1241 return 0; |
| 1242 // If the row is too tall for the page don't insert a strut. | 1242 // If the row is too tall for the page don't insert a strut. |
| 1243 LayoutUnit rowLogicalHeight = row->logicalHeight(); | 1243 LayoutUnit rowLogicalHeight = row->logicalHeight(); |
| 1244 if (rowLogicalHeight > pageLogicalHeight) | 1244 if (rowLogicalHeight > pageLogicalHeight) |
| 1245 return 0; | 1245 return 0; |
| 1246 | 1246 |
| 1247 LayoutUnit remainingLogicalHeight = pageRemainingLogicalHeightForOffset( | 1247 LayoutUnit remainingLogicalHeight = pageRemainingLogicalHeightForOffset( |
| 1248 logicalOffset, LayoutBlock::AssociateWithLatterPage); | 1248 logicalOffset, LayoutBlock::AssociateWithLatterPage); |
| 1249 LayoutUnit offsetForBorderSpacing = | |
| 1250 pageLogicalHeight - (remainingLogicalHeight + table()->vBorderSpacing()); | |
| 1251 // Border spacing from the previous row has pushed this row just past the top | |
| 1252 // of the page, so we must reposition it to the top of the page and avoid any | |
| 1253 // repeating header. | |
| 1254 if (offsetForBorderSpacing < 0) | |
| 1255 return offsetForBorderSpacing.toInt(); | |
| 1256 | |
| 1257 if (remainingLogicalHeight >= rowLogicalHeight) | 1249 if (remainingLogicalHeight >= rowLogicalHeight) |
| 1258 return 0; // It fits fine where it is. No need to break. | 1250 return 0; // It fits fine where it is. No need to break. |
| 1259 LayoutUnit paginationStrut = calculatePaginationStrutToFitContent( | 1251 LayoutUnit paginationStrut = calculatePaginationStrutToFitContent( |
| 1260 logicalOffset, remainingLogicalHeight, rowLogicalHeight); | 1252 logicalOffset, remainingLogicalHeight, rowLogicalHeight); |
| 1261 if (paginationStrut == remainingLogicalHeight && | 1253 if (paginationStrut == remainingLogicalHeight && |
| 1262 remainingLogicalHeight == pageLogicalHeight) { | 1254 remainingLogicalHeight == pageLogicalHeight) { |
| 1263 // Don't break if we were at the top of a page, and we failed to fit the | 1255 // Don't break if we were at the top of a page, and we failed to fit the |
| 1264 // content completely. No point in leaving a page completely blank. | 1256 // content completely. No point in leaving a page completely blank. |
| 1265 return 0; | 1257 return 0; |
| 1266 } | 1258 } |
| (...skipping 724 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1991 return logicalHeight; | 1983 return logicalHeight; |
| 1992 } | 1984 } |
| 1993 | 1985 |
| 1994 void LayoutTableSection::adjustRowForPagination(LayoutTableRow& rowObject, | 1986 void LayoutTableSection::adjustRowForPagination(LayoutTableRow& rowObject, |
| 1995 SubtreeLayoutScope& layouter) { | 1987 SubtreeLayoutScope& layouter) { |
| 1996 LayoutState& state = *view()->layoutState(); | 1988 LayoutState& state = *view()->layoutState(); |
| 1997 rowObject.setPaginationStrut(LayoutUnit()); | 1989 rowObject.setPaginationStrut(LayoutUnit()); |
| 1998 rowObject.setLogicalHeight(LayoutUnit(logicalHeightForRow(rowObject))); | 1990 rowObject.setLogicalHeight(LayoutUnit(logicalHeightForRow(rowObject))); |
| 1999 int paginationStrut = | 1991 int paginationStrut = |
| 2000 paginationStrutForRow(&rowObject, rowObject.logicalTop()); | 1992 paginationStrutForRow(&rowObject, rowObject.logicalTop()); |
| 1993 bool rowIsAtTopOfColumn = false; |
| 1994 LayoutUnit offsetFromTopOfPage; |
| 2001 if (!paginationStrut) { | 1995 if (!paginationStrut) { |
| 2002 bool rowIsAtTopOfColumn = | 1996 if (state.heightOffsetForTableHeaders()) { |
| 2003 state.heightOffsetForTableHeaders() && | 1997 offsetFromTopOfPage = |
| 2004 pageLogicalHeightForOffset(rowObject.logicalTop()) == | 1998 pageLogicalHeightForOffset(rowObject.logicalTop()) - |
| 2005 pageRemainingLogicalHeightForOffset(rowObject.logicalTop(), | 1999 pageRemainingLogicalHeightForOffset(rowObject.logicalTop(), |
| 2006 AssociateWithLatterPage); | 2000 AssociateWithLatterPage); |
| 2001 rowIsAtTopOfColumn = !offsetFromTopOfPage || |
| 2002 offsetFromTopOfPage <= table()->vBorderSpacing(); |
| 2003 } |
| 2004 |
| 2007 if (!rowIsAtTopOfColumn) | 2005 if (!rowIsAtTopOfColumn) |
| 2008 return; | 2006 return; |
| 2009 } | 2007 } |
| 2010 // We need to push this row to the next fragmentainer. If there are repeated | 2008 // We need to push this row to the next fragmentainer. If there are repeated |
| 2011 // table headers, we need to make room for those at the top of the next | 2009 // table headers, we need to make room for those at the top of the next |
| 2012 // fragmentainer, above this row. Otherwise, this row will just go at the top | 2010 // fragmentainer, above this row. Otherwise, this row will just go at the top |
| 2013 // of the next fragmentainer. | 2011 // of the next fragmentainer. |
| 2014 | 2012 |
| 2015 // If there isn't room for at least one content row on a page with a | 2013 // If there isn't room for at least one content row on a page with a |
| 2016 // header group, then we won't repeat the header on each page. | 2014 // header group, then we won't repeat the header on each page. |
| 2017 LayoutTableSection* header = table()->header(); | 2015 LayoutTableSection* header = table()->header(); |
| 2018 if (!rowObject.rowIndex() && header && | 2016 if (!rowObject.rowIndex() && header && |
| 2019 table()->sectionAbove(this) == header && | 2017 table()->sectionAbove(this) == header && |
| 2020 header->getPaginationBreakability() != AllowAnyBreaks) { | 2018 header->getPaginationBreakability() != AllowAnyBreaks) { |
| 2021 state.setHeightOffsetForTableHeaders(state.heightOffsetForTableHeaders() - | 2019 state.setHeightOffsetForTableHeaders(state.heightOffsetForTableHeaders() - |
| 2022 header->logicalHeight()); | 2020 header->logicalHeight()); |
| 2023 } | 2021 } |
| 2022 // Border spacing from the previous row has pushed this row just past the top |
| 2023 // of the page, so we must reposition it to the top of the page and avoid any |
| 2024 // repeating header. |
| 2025 if (rowIsAtTopOfColumn && offsetFromTopOfPage) |
| 2026 paginationStrut -= offsetFromTopOfPage.toInt(); |
| 2027 |
| 2024 // If we have a header group we will paint it at the top of each page, | 2028 // If we have a header group we will paint it at the top of each page, |
| 2025 // move the rows down to accomodate it. | 2029 // move the rows down to accomodate it. |
| 2026 paginationStrut += state.heightOffsetForTableHeaders().toInt(); | 2030 paginationStrut += state.heightOffsetForTableHeaders().toInt(); |
| 2027 rowObject.setPaginationStrut(LayoutUnit(paginationStrut)); | 2031 rowObject.setPaginationStrut(LayoutUnit(paginationStrut)); |
| 2028 | 2032 |
| 2029 // We have inserted a pagination strut before the row. Adjust the logical top | 2033 // We have inserted a pagination strut before the row. Adjust the logical top |
| 2030 // and re-lay out. We no longer want to break inside the row, but rather | 2034 // and re-lay out. We no longer want to break inside the row, but rather |
| 2031 // *before* it. From the previous layout pass, there are most likely | 2035 // *before* it. From the previous layout pass, there are most likely |
| 2032 // pagination struts inside some cell in this row that we need to get rid of. | 2036 // pagination struts inside some cell in this row that we need to get rid of. |
| 2033 rowObject.setLogicalTop(rowObject.logicalTop() + paginationStrut); | 2037 rowObject.setLogicalTop(rowObject.logicalTop() + paginationStrut); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2075 // the header in all columns. | 2079 // the header in all columns. |
| 2076 // Note that this is in flow thread coordinates, not visual coordinates. The | 2080 // Note that this is in flow thread coordinates, not visual coordinates. The |
| 2077 // enclosing LayoutFlowThread will convert to visual coordinates. | 2081 // enclosing LayoutFlowThread will convert to visual coordinates. |
| 2078 if (table()->header() == this && isRepeatingHeaderGroup()) | 2082 if (table()->header() == this && isRepeatingHeaderGroup()) |
| 2079 rect.setHeight(table()->logicalHeight()); | 2083 rect.setHeight(table()->logicalHeight()); |
| 2080 return LayoutTableBoxComponent::mapToVisualRectInAncestorSpace(ancestor, rect, | 2084 return LayoutTableBoxComponent::mapToVisualRectInAncestorSpace(ancestor, rect, |
| 2081 flags); | 2085 flags); |
| 2082 } | 2086 } |
| 2083 | 2087 |
| 2084 } // namespace blink | 2088 } // namespace blink |
| OLD | NEW |