Git commit cf2bdda442fa4797cf3cf17e8673c9c77fca618e by Pierre Ducroquet. Committed on 01/08/2011 at 01:55. Pushed by ducroquet into branch 'words-table-cell-borders'. Get rid of most KoTableBorderStyle code, with a few TODO left M +2 -630 libs/kotext/styles/KoTableBorderStyle.cpp M +4 -3 libs/kotext/styles/KoTableCellStyle_p.h M +4 -4 libs/kotext/KoTextEditor.cpp M +286 -46 libs/kotext/styles/KoTableCellStyle.cpp A +140 -0 libs/textlayout/KoTextLayoutCellHelper.h [License: LGPL (v2+)] A +474 -0 libs/textlayout/KoTextLayoutCellHelper.cpp [License: LGPL (v2+)] M +1 -0 libs/textlayout/CMakeLists.txt D +0 -45 libs/kotext/styles/KoTableBorderStyle_p.h M +50 -1 libs/kotext/styles/KoTableCellStyle.h M +18 -13 libs/textlayout/KoTextLayoutTableArea.cpp M +12 -12 libs/kotext/opendocument/tests/TestLoading.cpp M +24 -24 libs/kotext/styles/tests/TestTableCellStyle.cpp M +9 -150 libs/kotext/styles/KoTableBorderStyle.h M +12 -12 libs/kotext/KoTextDebug.cpp http://commits.kde.org/calligra/cf2bdda442fa4797cf3cf17e8673c9c77fca618e diff --git a/libs/kotext/KoTextDebug.cpp b/libs/kotext/KoTextDebug.cpp index 3d65b66..45df678 100644 --- a/libs/kotext/KoTextDebug.cpp +++ b/libs/kotext/KoTextDebug.cpp @@ -860,7 +860,7 @@ QString KoTextDebug::tableCellAttributes(const QTextTableCellFormat &tableCellFo key = "right-padding"; value = QString::number(properties[id].toDouble()); break; - case KoTableCellStyle::TopBorderOuterPen: { + case KoTableBorderStyle::TopBorderOuterPen: { key = "top-border-outer"; QPen pen = qvariant_cast(properties[id]); if (pen.style() == Qt::NoPen) { @@ -894,11 +894,11 @@ QString KoTextDebug::tableCellAttributes(const QTextTableCellFormat &tableCellFo } break; } - case KoTableCellStyle::TopBorderSpacing: + case KoTableBorderStyle::TopBorderSpacing: key = "top-border-spacing"; value = QString::number(properties[id].toDouble()); break; - case KoTableCellStyle::TopBorderInnerPen: { + case KoTableBorderStyle::TopBorderInnerPen: { key = "top-border-inner"; QPen pen = qvariant_cast(properties[id]); if (pen.style() == Qt::NoPen) { @@ -932,7 +932,7 @@ QString KoTextDebug::tableCellAttributes(const QTextTableCellFormat &tableCellFo } break; } - case KoTableCellStyle::LeftBorderOuterPen: { + case KoTableBorderStyle::LeftBorderOuterPen: { key = "left-border-outer"; QPen pen = qvariant_cast(properties[id]); if (pen.style() == Qt::NoPen) { @@ -966,11 +966,11 @@ QString KoTextDebug::tableCellAttributes(const QTextTableCellFormat &tableCellFo } break; } - case KoTableCellStyle::LeftBorderSpacing: + case KoTableBorderStyle::LeftBorderSpacing: key = "left-border-spacing"; value = QString::number(properties[id].toDouble()); break; - case KoTableCellStyle::LeftBorderInnerPen: { + case KoTableBorderStyle::LeftBorderInnerPen: { key = "left-border-inner"; QPen pen = qvariant_cast(properties[id]); if (pen.style() == Qt::NoPen) { @@ -1004,7 +1004,7 @@ QString KoTextDebug::tableCellAttributes(const QTextTableCellFormat &tableCellFo } break; } - case KoTableCellStyle::BottomBorderOuterPen: { + case KoTableBorderStyle::BottomBorderOuterPen: { key = "bottom-border-outer"; QPen pen = qvariant_cast(properties[id]); if (pen.style() == Qt::NoPen) { @@ -1038,11 +1038,11 @@ QString KoTextDebug::tableCellAttributes(const QTextTableCellFormat &tableCellFo } break; } - case KoTableCellStyle::BottomBorderSpacing: + case KoTableBorderStyle::BottomBorderSpacing: key = "bottom-border-spacing"; value = QString::number(properties[id].toDouble()); break; - case KoTableCellStyle::BottomBorderInnerPen: { + case KoTableBorderStyle::BottomBorderInnerPen: { key = "bottom-border-inner"; QPen pen = qvariant_cast(properties[id]); if (pen.style() == Qt::NoPen) { @@ -1076,7 +1076,7 @@ QString KoTextDebug::tableCellAttributes(const QTextTableCellFormat &tableCellFo } break; } - case KoTableCellStyle::RightBorderOuterPen: { + case KoTableBorderStyle::RightBorderOuterPen: { key = "right-border-outer"; QPen pen = qvariant_cast(properties[id]); if (pen.style() == Qt::NoPen) { @@ -1110,11 +1110,11 @@ QString KoTextDebug::tableCellAttributes(const QTextTableCellFormat &tableCellFo } break; } - case KoTableCellStyle::RightBorderSpacing: + case KoTableBorderStyle::RightBorderSpacing: key = "right-border-spacing"; value = QString::number(properties[id].toDouble()); break; - case KoTableCellStyle::RightBorderInnerPen: { + case KoTableBorderStyle::RightBorderInnerPen: { key = "right-border-inner"; QPen pen = qvariant_cast(properties[id]); if (pen.style() == Qt::NoPen) { diff --git a/libs/kotext/KoTextEditor.cpp b/libs/kotext/KoTextEditor.cpp index 4588b12..2fe72f0 100644 --- a/libs/kotext/KoTextEditor.cpp +++ b/libs/kotext/KoTextEditor.cpp @@ -980,10 +980,10 @@ void KoTextEditor::insertTable(int rows, int columns) QTextTableCell cell = table->cellAt(row, col); QTextTableCellFormat format; KoTableCellStyle cellStyle; - cellStyle.setEdge(KoTableCellStyle::Top, KoBorder::BorderSolid, 2, QColor(Qt::black)); - cellStyle.setEdge(KoTableCellStyle::Left, KoBorder::BorderSolid, 2, QColor(Qt::black)); - cellStyle.setEdge(KoTableCellStyle::Bottom, KoBorder::BorderSolid, 2, QColor(Qt::black)); - cellStyle.setEdge(KoTableCellStyle::Right, KoBorder::BorderSolid, 2, QColor(Qt::black)); + cellStyle.setEdge(KoTableBorderStyle::Top, KoBorder::BorderSolid, 2, QColor(Qt::black)); + cellStyle.setEdge(KoTableBorderStyle::Left, KoBorder::BorderSolid, 2, QColor(Qt::black)); + cellStyle.setEdge(KoTableBorderStyle::Bottom, KoBorder::BorderSolid, 2, QColor(Qt::black)); + cellStyle.setEdge(KoTableBorderStyle::Right, KoBorder::BorderSolid, 2, QColor(Qt::black)); cellStyle.setPadding(5); cellStyle.applyStyle(format); diff --git a/libs/kotext/opendocument/tests/TestLoading.cpp b/libs/kotext/opendocument/tests/TestLoading.cpp index c36deda..222fb81 100644 --- a/libs/kotext/opendocument/tests/TestLoading.cpp +++ b/libs/kotext/opendocument/tests/TestLoading.cpp @@ -397,10 +397,10 @@ bool TestLoading::compareTableCellFormats(QTextTableCellFormat &actualFormat, QT QString key, value; switch (id) { // double properties - case KoTableCellStyle::LeftBorderSpacing: - case KoTableCellStyle::RightBorderSpacing: - case KoTableCellStyle::TopBorderSpacing: - case KoTableCellStyle::BottomBorderSpacing: + case KoTableBorderStyle::LeftBorderSpacing: + case KoTableBorderStyle::RightBorderSpacing: + case KoTableBorderStyle::TopBorderSpacing: + case KoTableBorderStyle::BottomBorderSpacing: if (abs(actualProperty[id].toDouble() - expectedProperty[id].toDouble()) > 1e-10) { qDebug() << "Cell Border Spacing Mismatch"; qDebug() << "Expected Spacing: " << expectedProperty[id].toDouble(); @@ -414,14 +414,14 @@ bool TestLoading::compareTableCellFormats(QTextTableCellFormat &actualFormat, QT match = false; break; // pen properties - case KoTableCellStyle::LeftBorderOuterPen: - case KoTableCellStyle::LeftBorderInnerPen: - case KoTableCellStyle::RightBorderOuterPen: - case KoTableCellStyle::RightBorderInnerPen: - case KoTableCellStyle::TopBorderOuterPen: - case KoTableCellStyle::TopBorderInnerPen: - case KoTableCellStyle::BottomBorderOuterPen: - case KoTableCellStyle::BottomBorderInnerPen: { + case KoTableBorderStyle::LeftBorderOuterPen: + case KoTableBorderStyle::LeftBorderInnerPen: + case KoTableBorderStyle::RightBorderOuterPen: + case KoTableBorderStyle::RightBorderInnerPen: + case KoTableBorderStyle::TopBorderOuterPen: + case KoTableBorderStyle::TopBorderInnerPen: + case KoTableBorderStyle::BottomBorderOuterPen: + case KoTableBorderStyle::BottomBorderInnerPen: { QPen actualPen = qvariant_cast(actualProperty[id]); QPen expectedPen = qvariant_cast(expectedProperty[id]); if (actualPen != expectedPen) { diff --git a/libs/kotext/styles/KoTableBorderStyle.cpp b/libs/kotext/styles/KoTableBorderStyle.cpp index 0f6e21f..528a4ab 100644 --- a/libs/kotext/styles/KoTableBorderStyle.cpp +++ b/libs/kotext/styles/KoTableBorderStyle.cpp @@ -21,11 +21,7 @@ * Boston, MA 02110-1301, USA. */ #include "KoTableBorderStyle.h" - -#include "KoTableBorderStyle_p.h" - -#include - +/* KoTableBorderStylePrivate::KoTableBorderStylePrivate() { edges[KoTableBorderStyle::Top].spacing = 0; @@ -116,628 +112,4 @@ KoTableBorderStyle::~KoTableBorderStyle() { delete d_ptr; } - - -bool KoTableBorderStyle::isDrawn(KoBorder::BorderStyle style) const -{ - if (style == KoBorder::BorderWave) - return true; - if (style == KoBorder::BorderDoubleWave) - return true; - if (style == KoBorder::BorderSlash) - return true; - return false; -} - - -void KoTableBorderStyle::drawHorizontalWave(KoBorder::BorderStyle style, QPainter &painter, qreal x, qreal w, qreal t) const -{ - QPen pen = painter.pen(); - const qreal linewidth = pen.width(); - const qreal penwidth = linewidth/6; - pen.setWidth(penwidth); - painter.setPen(pen); - if (style == KoBorder::BorderSlash) { - for (qreal sx=x; sx dashes; - dashes << 6 << 6; - edge.outerPen.setDashPattern(dashes); - break; - } - case KoBorder::BorderTriple: - innerWidth = middleWidth = space = width/6; - width -= (space + innerWidth); - edge.outerPen.setStyle(Qt::SolidLine); - break; - case KoBorder::BorderDashDot: - edge.outerPen.setStyle(Qt::DashDotLine); - break; - case KoBorder::BorderDashDotDot: - edge.outerPen.setStyle(Qt::DashDotDotLine); - break; - case KoBorder::BorderWave: - edge.outerPen.setStyle(Qt::SolidLine); - break; - case KoBorder::BorderSlash: - edge.outerPen.setStyle(Qt::SolidLine); - break; - case KoBorder::BorderDoubleWave: - innerWidth = space = width/4; //some nice default look - width -= (space + innerWidth); - edge.outerPen.setStyle(Qt::SolidLine); - break; - default: - edge.outerPen.setStyle(Qt::SolidLine); - break; - } - edge.outerPen.setColor(color); - edge.outerPen.setJoinStyle(Qt::MiterJoin); - edge.outerPen.setCapStyle(Qt::FlatCap); - edge.outerPen.setWidthF(width); - - edge.spacing = space; - edge.innerPen = edge.outerPen; - edge.innerPen.setWidthF(innerWidth); - QPen middlePen; - middlePen = edge.outerPen; - middlePen.setWidthF(middleWidth); - - d->edges[side] = edge; - d->borderstyle[side] = style; -} - -void KoTableBorderStyle::setEdgeDoubleBorderValues(Side side, qreal innerWidth, qreal space) -{ - Q_D(KoTableBorderStyle); - - qreal totalWidth = d->edges[side].outerPen.widthF() + d->edges[side].spacing + d->edges[side].innerPen.widthF(); - if (d->edges[side].innerPen.widthF() > 0.0) { - d->edges[side].outerPen.setWidthF(totalWidth - innerWidth - space); - d->edges[side].spacing = space; - d->edges[side].innerPen.setWidthF(innerWidth); - } -} - -bool KoTableBorderStyle::hasBorders() const -{ - Q_D(const KoTableBorderStyle); - - for (int i = Top; i <= BottomLeftToTopRight; i++) - if (d->edges[i].outerPen.widthF() > 0.0) - return true; - return false; -} - -void KoTableBorderStyle::paintBorders(QPainter &painter, const QRectF &bounds, QVector *accumulatedBlankBorders) const -{ - Q_D(const KoTableBorderStyle); - - QRectF innerBounds = bounds; - - // outer lines - QPen topOuterPen = d->edges[Top].outerPen; - QPen bottomOuterPen = d->edges[Bottom].outerPen; - QPen leftOuterPen = d->edges[Left].outerPen; - QPen rightOuterPen = d->edges[Right].outerPen; - - if (topOuterPen.widthF() > 0) { - painter.setPen(topOuterPen); - const qreal t = bounds.top() + topOuterPen.widthF() / 2.0; - innerBounds.setTop(bounds.top() + d->edges[Top].spacing + topOuterPen.widthF()); - painter.drawLine(QLineF(bounds.left(), t, bounds.right(), t)); - } else if (accumulatedBlankBorders) { - // No border but we'd like to draw one for user convenience when on screen - accumulatedBlankBorders->append(QLineF(bounds.left() + leftOuterPen.widthF() + d->edges[Left].spacing, - bounds.top() + topOuterPen.widthF() + d->edges[Top].spacing, - bounds.right() - rightOuterPen.widthF() - d->edges[Right].spacing, - bounds.top() + topOuterPen.widthF() + d->edges[Top].spacing)); - } - - if (bottomOuterPen.widthF() > 0) { - painter.setPen(bottomOuterPen); - const qreal b = bounds.bottom() - bottomOuterPen.widthF() / 2.0; - innerBounds.setBottom(bounds.bottom() - d->edges[Bottom].spacing - bottomOuterPen.widthF()); - painter.drawLine(QLineF(bounds.left(), b, bounds.right(), b)); - } else if (accumulatedBlankBorders) { - // No border but we'd like to draw one for user convenience when on screen - accumulatedBlankBorders->append(QLineF(bounds.left() + leftOuterPen.widthF() + d->edges[Left].spacing, - bounds.bottom() - bottomOuterPen.widthF() - d->edges[Bottom].spacing, - bounds.right() - rightOuterPen.widthF() - d->edges[Right].spacing, - bounds.bottom() - bottomOuterPen.widthF() - d->edges[Bottom].spacing)); - } - - if (leftOuterPen.widthF() > 0) { - painter.setPen(leftOuterPen); - const qreal l = bounds.left() + leftOuterPen.widthF() / 2.0; - innerBounds.setLeft(bounds.left() + d->edges[Left].spacing + leftOuterPen.widthF()); - painter.drawLine(QLineF(l, bounds.top() + d->edges[Top].outerPen.widthF(), l, bounds.bottom() - d->edges[Bottom].outerPen.widthF())); - } else if (accumulatedBlankBorders) { - // No border but we'd like to draw one for user convenience when on screen - accumulatedBlankBorders->append(QLineF(bounds.left() + leftOuterPen.widthF() + d->edges[Left].spacing, - bounds.top() + topOuterPen.widthF() + d->edges[Top].spacing, - bounds.left() + leftOuterPen.widthF() + d->edges[Left].spacing, - bounds.bottom() - bottomOuterPen.widthF() - d->edges[Bottom].spacing)); - } - - if (d->edges[Right].outerPen.widthF() > 0) { - painter.setPen(rightOuterPen); - const qreal r = bounds.right() - rightOuterPen.widthF() / 2.0; - innerBounds.setRight(bounds.right() - d->edges[Right].spacing - rightOuterPen.widthF()); - painter.drawLine(QLineF(r, bounds.top() + d->edges[Top].outerPen.widthF(), r, bounds.bottom() - bottomOuterPen.widthF())); - } else if (accumulatedBlankBorders) { - // No border but we'd like to draw one for user convenience when on screen - accumulatedBlankBorders->append(QLineF(bounds.right() - rightOuterPen.widthF() - d->edges[Right].spacing, - bounds.top() + topOuterPen.widthF() + d->edges[Top].spacing, - bounds.right() - rightOuterPen.widthF() - d->edges[Right].spacing, - bounds.bottom() - bottomOuterPen.widthF() - d->edges[Bottom].spacing)); - } - - paintDiagonalBorders(painter, bounds); - - // inner lines - if (d->edges[Top].innerPen.widthF() > 0) { - QPen pen = d->edges[Top].innerPen; - painter.setPen(pen); - const qreal t = innerBounds.top() + pen.widthF() / 2.0; - painter.drawLine(QLineF(innerBounds.left(), t, innerBounds.right(), t)); - } - if (d->edges[Bottom].innerPen.widthF() > 0) { - QPen pen = d->edges[Bottom].innerPen; - painter.setPen(pen); - const qreal b = innerBounds.bottom() - pen.widthF() / 2.0; - painter.drawLine(QLineF(innerBounds.left(), b, innerBounds.right(), b)); - } - if (d->edges[Left].innerPen.widthF() > 0) { - QPen pen = d->edges[Left].innerPen; - painter.setPen(pen); - const qreal l = innerBounds.left() + pen.widthF() / 2.0; - painter.drawLine(QLineF(l, innerBounds.top() + d->edges[Top].innerPen.widthF(), l, innerBounds.bottom() - d->edges[Bottom].innerPen.widthF())); - } - if (d->edges[Right].innerPen.widthF() > 0) { - QPen pen = d->edges[Right].innerPen; - painter.setPen(pen); - const qreal r = innerBounds.right() - pen.widthF() / 2.0; - painter.drawLine(QLineF(r, innerBounds.top() + d->edges[Top].innerPen.widthF(), r, innerBounds.bottom() - d->edges[Bottom].innerPen.widthF())); - } -} - -void KoTableBorderStyle::paintDiagonalBorders(QPainter &painter, const QRectF &bounds) const -{ - Q_D(const KoTableBorderStyle); - - if (d->edges[TopLeftToBottomRight].outerPen.widthF() > 0) { - QPen diagonalPen = d->edges[TopLeftToBottomRight].outerPen; - painter.setPen(diagonalPen); - - QPen topPen = d->edges[Top].outerPen; - const qreal top = bounds.top() + topPen.widthF() / 2.0; - QPen leftPen = d->edges[Left].outerPen; - const qreal left = bounds.left() + leftPen.widthF() / 2.0; - QPen bottomPen = d->edges[Bottom].outerPen; - const qreal bottom = bounds.bottom() - bottomPen.widthF() / 2.0; - QPen rightPen = d->edges[Right].outerPen; - const qreal right = bounds.right() - rightPen.widthF() / 2.0; - - painter.drawLine(QLineF(left, top, right, bottom)); - } - if (d->edges[BottomLeftToTopRight].outerPen.widthF() > 0) { - QPen pen = d->edges[BottomLeftToTopRight].outerPen; - painter.setPen(pen); - - QPen topPen = d->edges[Top].outerPen; - const qreal top = bounds.top() + topPen.widthF() / 2.0; - QPen leftPen = d->edges[Left].outerPen; - const qreal left = bounds.left() + leftPen.widthF() / 2.0; - QPen bottomPen = d->edges[Bottom].outerPen; - const qreal bottom = bounds.bottom() - bottomPen.widthF() / 2.0; - QPen rightPen = d->edges[Right].outerPen; - const qreal right = bounds.right() - rightPen.widthF() / 2.0; - - painter.drawLine(QLineF(left, bottom, right, top)); - } -} - -void KoTableBorderStyle::drawTopHorizontalBorder(QPainter &painter, qreal x, qreal y, qreal w, QVector *accumulatedBlankBorders) const -{ - Q_D(const KoTableBorderStyle); - - qreal t=y; - if (d->edges[Top].outerPen.widthF() > 0) { - QPen pen = d->edges[Top].outerPen; - - painter.setPen(pen); - t += pen.widthF() / 2.0; - if(isDrawn(d->borderstyle[Top])) { - drawHorizontalWave(d->borderstyle[Top], painter,x,w,t); - } else { - painter.drawLine(QLineF(x, t, x+w, t)); - } - t = y + d->edges[Top].spacing + pen.widthF(); - } else if (accumulatedBlankBorders) { - // No border but we'd like to draw one for user convenience when on screen - accumulatedBlankBorders->append(QLineF(x, t, x+w, t)); - } - - // inner line - if (d->edges[Top].innerPen.widthF() > 0) { - QPen pen = d->edges[Top].innerPen; - painter.setPen(pen); - t += pen.widthF() / 2.0; - if(isDrawn(d->borderstyle[Top])) { - drawHorizontalWave(d->borderstyle[Top], painter,x,w,t); - } else { - painter.drawLine(QLineF(x, t, x+w, t)); - } - } -} - -void KoTableBorderStyle::drawSharedHorizontalBorder(QPainter &painter, const KoTableBorderStyle &styleBelow, qreal x, qreal y, qreal w, QVector *accumulatedBlankBorders) const -{ - Q_D(const KoTableBorderStyle); - const KoTableBorderStylePrivate *styleBelowD = static_cast(styleBelow.d_func()); - - bool paintThis = true; - if (d->borderstyle[Bottom] == KoBorder::BorderNone) { - if (styleBelowD->borderstyle[Top] == KoBorder::BorderNone) { - if (accumulatedBlankBorders) { - accumulatedBlankBorders->append(QLineF(x, y, x+w, y)); - } - return; - } - paintThis = false; - } - else { - if (styleBelowD->borderstyle[Top] != KoBorder::BorderNone) { - qreal thisWidth = d->edges[Bottom].outerPen.widthF() + d->edges[Bottom].spacing + d->edges[Bottom].innerPen.widthF(); - qreal thatWidth = styleBelowD->edges[Top].outerPen.widthF() + styleBelowD->edges[Top].spacing - + styleBelowD->edges[Top].innerPen.widthF(); - paintThis = thisWidth >= thatWidth; - } - } - - const KoTableBorderStylePrivate::Edge &edge = paintThis ? d->edges[Bottom]: styleBelowD->edges[Top]; - const KoBorder::BorderStyle borderStyle = paintThis ? d->borderstyle[Bottom]: d->borderstyle[Top]; - qreal t=y; - - if (edge.outerPen.widthF() > 0) { - QPen pen = edge.outerPen; - const qreal linewidth = pen.widthF(); - - painter.setPen(pen); - t += linewidth / 2.0; - if(isDrawn(borderStyle)) { - drawHorizontalWave(borderStyle, painter,x,w,t); - } else { - painter.drawLine(QLineF(x, t, x+w, t)); - } - t = y + edge.spacing + linewidth; - } - // inner line - if (edge.innerPen.widthF() > 0) { - QPen pen = edge.innerPen; - painter.setPen(pen); - t += pen.widthF() / 2.0; - if(isDrawn(borderStyle)) { - drawHorizontalWave(borderStyle, painter,x,w,t); - } else { - painter.drawLine(QLineF(x, t, x+w, t)); - } - } -} - -void KoTableBorderStyle::drawBottomHorizontalBorder(QPainter &painter, qreal x, qreal y, qreal w, QVector *accumulatedBlankBorders) const -{ - Q_D(const KoTableBorderStyle); - - qreal t=y; - if (d->edges[Bottom].outerPen.widthF() > 0) { - QPen pen = d->edges[Bottom].outerPen; - - painter.setPen(pen); - t += pen.widthF() / 2.0; - if(isDrawn(d->borderstyle[Bottom])) { - drawHorizontalWave(d->borderstyle[Bottom], painter,x,w,t); - } else { - painter.drawLine(QLineF(x, t, x+w, t)); - } - t = y - d->edges[Bottom].spacing - pen.widthF(); - } else if (accumulatedBlankBorders) { - // No border but we'd like to draw one for user convenience when on screen - accumulatedBlankBorders->append(QLineF(x, t, x+w, t)); - - } - - // inner line - if (d->edges[Bottom].innerPen.widthF() > 0) { - QPen pen = d->edges[Bottom].innerPen; - painter.setPen(pen); - t -= pen.widthF() / 2.0; - if(isDrawn(d->borderstyle[Bottom])) { - drawHorizontalWave(d->borderstyle[Bottom], painter,x,w,t); - } else { - painter.drawLine(QLineF(x, t, x+w, t)); - } - } -} - -void KoTableBorderStyle::drawLeftmostVerticalBorder(QPainter &painter, qreal x, qreal y, qreal h, QVector *accumulatedBlankBorders) const -{ - Q_D(const KoTableBorderStyle); - - qreal thisWidth = d->edges[Left].outerPen.widthF() + d->edges[Left].spacing + d->edges[Left].innerPen.widthF(); - qreal l = x - thisWidth / 2.0; - - if (d->edges[Left].outerPen.widthF() > 0) { - QPen pen = d->edges[Left].outerPen; - - painter.setPen(pen); - l += pen.widthF() / 2.0; - if(isDrawn(d->borderstyle[Left])) { - drawVerticalWave(d->borderstyle[Left], painter,y,h,l); - } else { - painter.drawLine(QLineF(l, y, l, y+h)); - } - l += d->edges[Left].spacing + pen.widthF() / 2.0; - } else if (accumulatedBlankBorders) { - // No border but we'd like to draw one for user convenience when on screen - accumulatedBlankBorders->append(QLineF(l, y, l, y+h)); - - } - - // inner line - if (d->edges[Left].innerPen.widthF() > 0) { - QPen pen = d->edges[Left].innerPen; - painter.setPen(pen); - l += pen.widthF() / 2.0; - if(isDrawn(d->borderstyle[Left])) { - drawVerticalWave(d->borderstyle[Left], painter,y,h,l); - } else { - painter.drawLine(QLineF(l, y, l, y+h)); - } - } -} - -void KoTableBorderStyle::drawSharedVerticalBorder(QPainter &painter, const KoTableBorderStyle &styleRight, qreal x, qreal y, qreal h, QVector *accumulatedBlankBorders) const -{ - Q_D(const KoTableBorderStyle); - const KoTableBorderStylePrivate *styleRightD = static_cast(styleRight.d_func()); - - // First determine which style "wins" by comparing total width - qreal thisWidth = d->edges[Right].outerPen.widthF() + d->edges[Right].spacing + d->edges[Right].innerPen.widthF(); - qreal thatWidth = styleRightD->edges[Left].outerPen.widthF() + styleRightD->edges[Left].spacing - + styleRightD->edges[Left].innerPen.widthF(); - - qreal l=x; - - if(thisWidth >= thatWidth) { - // left style wins - l -= thisWidth / 2.0; - if (d->edges[Right].outerPen.widthF() > 0) { - QPen pen = d->edges[Right].outerPen; - - painter.setPen(pen); - l += pen.widthF() / 2.0; - if(isDrawn(d->borderstyle[Right])) { - drawVerticalWave(d->borderstyle[Right], painter,y,h,l); - } else { - painter.drawLine(QLineF(l, y, l, y+h)); - } - l += d->edges[Right].spacing + pen.widthF() / 2.0; - } else if (accumulatedBlankBorders) { - // No border but we'd like to draw one for user convenience when on screen - accumulatedBlankBorders->append(QLineF(l, y, l, y+h)); - - } - - // inner line - if (d->edges[Right].innerPen.widthF() > 0) { - QPen pen = d->edges[Right].innerPen; - painter.setPen(pen); - l += pen.widthF() / 2.0; - if(isDrawn(d->borderstyle[Right])) { - drawVerticalWave(d->borderstyle[Right], painter,y,h,l); - } else { - painter.drawLine(QLineF(l, y, l, y+h)); - } - } - } else { - // right style wins - l -= thatWidth/2.0; - if (styleRightD->edges[Left].outerPen.widthF() > 0) { - QPen pen = styleRightD->edges[Left].outerPen; - - painter.setPen(pen); - l += pen.widthF() / 2.0; - if(isDrawn(d->borderstyle[Left])) { - drawVerticalWave(d->borderstyle[Left], painter,y,h,l); - } else { - painter.drawLine(QLineF(l, y, l, y+h)); - } - l += styleRightD->edges[Left].spacing + pen.widthF() / 2.0; - } - // inner line - if (styleRightD->edges[Left].innerPen.widthF() > 0) { - QPen pen = styleRightD->edges[Left].innerPen; - painter.setPen(pen); - l += pen.widthF() / 2.0; - if(isDrawn(d->borderstyle[Left])) { - drawVerticalWave(d->borderstyle[Left], painter,y,h,l); - } else { - painter.drawLine(QLineF(l, y, l, y+h)); - } - } - } -} - -void KoTableBorderStyle::drawRightmostVerticalBorder(QPainter &painter, qreal x, qreal y, qreal h, QVector *accumulatedBlankBorders) const -{ - Q_D(const KoTableBorderStyle); - - qreal thisWidth = d->edges[Right].outerPen.widthF() + d->edges[Right].spacing + d->edges[Right].innerPen.widthF(); - qreal l = x - thisWidth / 2.0; - - if (d->edges[Right].outerPen.widthF() > 0) { - QPen pen = d->edges[Right].outerPen; - - painter.setPen(pen); - l += pen.widthF() / 2.0; - if(isDrawn(d->borderstyle[Right])) { - drawVerticalWave(d->borderstyle[Right], painter,y,h,l); - } else { - painter.drawLine(QLineF(l, y, l, y+h)); - } - l += d->edges[Right].spacing - pen.widthF() / 2.0; - } else if (accumulatedBlankBorders) { - // No border but we'd like to draw one for user convenience when on screen - accumulatedBlankBorders->append(QLineF(l, y, l, y+h)); - - } - - // inner line - if (d->edges[Right].innerPen.widthF() > 0) { - QPen pen = d->edges[Right].innerPen; - painter.setPen(pen); - l += pen.widthF() / 2.0; - if(isDrawn(d->borderstyle[Right])) { - drawVerticalWave(d->borderstyle[Right], painter,y,h,l); - } else { - painter.drawLine(QLineF(l, y, l, y+h)); - } - } -} - -qreal KoTableBorderStyle::leftBorderWidth() const -{ - Q_D(const KoTableBorderStyle); - - const KoTableBorderStylePrivate::Edge &edge = d->edges[Left]; - return edge.spacing + edge.innerPen.widthF() + edge.outerPen.widthF(); -} - -qreal KoTableBorderStyle::rightBorderWidth() const -{ - Q_D(const KoTableBorderStyle); - - const KoTableBorderStylePrivate::Edge &edge = d->edges[Right]; - return edge.spacing + edge.innerPen.widthF() + edge.outerPen.widthF(); -} - -qreal KoTableBorderStyle::topBorderWidth() const -{ - Q_D(const KoTableBorderStyle); - - const KoTableBorderStylePrivate::Edge &edge = d->edges[Top]; - return edge.spacing + edge.innerPen.widthF() + edge.outerPen.widthF(); -} - -qreal KoTableBorderStyle::bottomBorderWidth() const -{ - Q_D(const KoTableBorderStyle); - - const KoTableBorderStylePrivate::Edge &edge = d->edges[Bottom]; - return edge.spacing + edge.innerPen.widthF() + edge.outerPen.widthF(); -} - -qreal KoTableBorderStyle::leftInnerBorderWidth() const -{ - Q_D(const KoTableBorderStyle); - return d->edges[Left].innerPen.widthF(); -} - -qreal KoTableBorderStyle::rightInnerBorderWidth() const -{ - Q_D(const KoTableBorderStyle); - return d->edges[Right].innerPen.widthF(); -} - -qreal KoTableBorderStyle::topInnerBorderWidth() const -{ - Q_D(const KoTableBorderStyle); - return d->edges[Top].innerPen.widthF(); -} - -qreal KoTableBorderStyle::bottomInnerBorderWidth() const -{ - Q_D(const KoTableBorderStyle); - return d->edges[Bottom].innerPen.widthF(); -} - -qreal KoTableBorderStyle::leftOuterBorderWidth() const -{ - Q_D(const KoTableBorderStyle); - return d->edges[Left].outerPen.widthF(); -} - -qreal KoTableBorderStyle::rightOuterBorderWidth() const -{ - Q_D(const KoTableBorderStyle); - return d->edges[Right].outerPen.widthF(); -} - -qreal KoTableBorderStyle::topOuterBorderWidth() const -{ - Q_D(const KoTableBorderStyle); - return d->edges[Top].outerPen.widthF(); -} - -qreal KoTableBorderStyle::bottomOuterBorderWidth() const -{ - Q_D(const KoTableBorderStyle); - return d->edges[Bottom].outerPen.widthF(); -} +*/ \ No newline at end of file diff --git a/libs/kotext/styles/KoTableBorderStyle.h b/libs/kotext/styles/KoTableBorderStyle.h index d9cbe79..b8a6512 100644 --- a/libs/kotext/styles/KoTableBorderStyle.h +++ b/libs/kotext/styles/KoTableBorderStyle.h @@ -68,161 +68,20 @@ public: TopLeftToBottomRight, ///< References the border from top, left corner to bottom, right corner of cell BottomLeftToTopRight ///< References the border from bottom, left corner to top, right corner of cell }; + + struct Edge { + Edge() : innerPen(), outerPen(), spacing(0.0) { } - /// Constructor - KoTableBorderStyle(QObject *parent = 0); - /// Creates a KoTableBorderStyle with the given table cell format, and \a parent - KoTableBorderStyle(const QTextTableCellFormat &tableCellFormat, QObject *parent = 0); - /// Destructor - ~KoTableBorderStyle(); - - /// returns if the borderstyle needs to be specially drawn - bool isDrawn(KoBorder::BorderStyle style) const; - - /// draws a horizontal wave line - void drawHorizontalWave(KoBorder::BorderStyle style, QPainter &painter, qreal x, qreal w, qreal t) const; - - /// draws a vertical wave line - void drawVerticalWave(KoBorder::BorderStyle style, QPainter &painter, qreal y, qreal h, qreal t) const; - - /** - * Set the properties of an edge. - * - * @param side defines which edge this is for. - * @param style the border style for this side. - * @param totalWidth the thickness of the border. Sum of outerwidth, spacing and innerwidth for double borders - * @param color the color of the border line(s). - */ - void setEdge(Side side, KoBorder::BorderStyle style, qreal totalWidth, QColor color); - - /** - * Set the properties of a double border. - * Note: you need to set the edge first or that would overwrite these values. - * - * The values will not be set if the border doesn't have a double style - * - * @param side defines which edge this is for. - * @param space the amount of spacing between the outer border and the inner border in case of style being double - * @param innerWidth the thickness of the inner border line in case of style being double - */ - void setEdgeDoubleBorderValues(Side side, qreal innerWidth, qreal space); - - /** - * Check if the border data has any borders. - * - * @return true if there has been at least one border set. - */ - bool hasBorders() const; - - /** - * Paint the borders. - * - * @painter the painter to draw with. - * @bounds the bounding rectangle to draw. - * @blanks a painterpath where blank borders should be added to. - */ - void paintBorders(QPainter &painter, const QRectF &bounds, QVector *blanks) const; - - /** - * Paint the diagonal borders. - * - * @painter the painter to draw with. - * @bounds the bounding rectangle to draw. - */ - void paintDiagonalBorders(QPainter &painter, const QRectF &bounds) const; - - /** - * Paint the top border. - * - * @painter the painter to draw with. - * @x the x position. - * @y the y position. - * @w the width. - * @blanks a painterpath where blank borders should be added to. - */ - void drawTopHorizontalBorder(QPainter &painter, qreal x, qreal y, qreal w, QVector *blanks = 0) const; - - /** - * Paint the border that is shared. - * It only draws the thickest and it always draws it below the y position. - * - * @painter the painter to draw with. - * @x the x position. - * @y the y position. - * @w the width. - * @blanks a painterpath where blank borders should be added to. - */ - void drawSharedHorizontalBorder(QPainter &painter, const KoTableBorderStyle &styleBelow, qreal x, qreal y, qreal w, QVector *blanks = 0) const; - - /** - * Paint the bottom border. - * - * @painter the painter to draw with. - * @x the x position. - * @y the y position. - * @w the width. - * @blanks a painterpath where blank borders should be added to. - */ - void drawBottomHorizontalBorder(QPainter &painter, qreal x, qreal y, qreal w, QVector *blanks = 0) const; - - /** - * Paint the leftmost border. - * - * @painter the painter to draw with. - * @x the x position. - * @y the y position. - * @h the height. - * @blanks a painterpath where blank borders should be added to. - */ - void drawLeftmostVerticalBorder(QPainter &painter, qreal x, qreal y, qreal h, QVector *blanks = 0) const; - - /** - * Paint the border that is shared. - * It only draws the thickest and it always draws it below the y position. - * - * @painter the painter to draw with. - * @x the x position. - * @y the y position. - * @h the height. - * @blanks a painterpath where blank borders should be added to. - */ - void drawSharedVerticalBorder(QPainter &painter, const KoTableBorderStyle &styleRight, qreal x, qreal y, qreal h, QVector *blanks = 0) const; - - /** - * Paint the rightmost border. - * - * @painter the painter to draw with. - * @x the x position. - * @y the y position. - * @h the height. - * @blanks a painterpath where blank borders should be added to. - */ - void drawRightmostVerticalBorder(QPainter &painter, qreal x, qreal y, qreal h, QVector *blanks = 0) const; - - qreal leftBorderWidth() const; - qreal rightBorderWidth() const; - qreal topBorderWidth() const; - qreal bottomBorderWidth() const; - - qreal leftInnerBorderWidth() const; - qreal rightInnerBorderWidth() const; - qreal topInnerBorderWidth() const; - qreal bottomInnerBorderWidth() const; - - qreal leftOuterBorderWidth() const; - qreal rightOuterBorderWidth() const; - qreal topOuterBorderWidth() const; - qreal bottomOuterBorderWidth() const; + QPen innerPen; + QPen outerPen; + qreal spacing; + }; protected: - KoTableBorderStyle(KoTableBorderStylePrivate &dd, const QTextTableCellFormat &format, QObject *parent); - KoTableBorderStyle(KoTableBorderStylePrivate &dd, QObject *parent); - KoTableBorderStylePrivate *d_ptr; - private: - void init(const QTextTableCellFormat &format); + //void init(const QTextTableCellFormat &format); - Q_DECLARE_PRIVATE(KoTableBorderStyle) + //Q_DECLARE_PRIVATE(KoTableBorderStyle) }; #endif // KOTABLEBORDERSTYLE_H diff --git a/libs/kotext/styles/KoTableBorderStyle_p.h b/libs/kotext/styles/KoTableBorderStyle_p.h deleted file mode 100644 index 31d3961..0000000 --- a/libs/kotext/styles/KoTableBorderStyle_p.h +++ /dev/null @@ -1,45 +0,0 @@ -/* This file is part of the KDE project - * Copyright (C) 2006-2010 Thomas Zander - * Copyright (C) 2008,2010 Thorsten Zachmann - * Copyright (C) 2008 Girish Ramakrishnan - * Copyright (C) 2009 KO GmbH - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public License - * along with this library; see the file COPYING.LIB. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ -#ifndef KOTABLEBORDERSTYLE_P_H -#define KOTABLEBORDERSTYLE_P_H - -#include "KoTableBorderStyle.h" - -class KoTableBorderStylePrivate -{ -public: - struct Edge { - Edge() : innerPen(), outerPen(), spacing(0.0) { } - - QPen innerPen; - QPen outerPen; - qreal spacing; - }; - - KoTableBorderStylePrivate(); - virtual ~KoTableBorderStylePrivate(); - - Edge edges[6]; - KoBorder::BorderStyle borderstyle[6]; -}; - -#endif // KOTABLEBORDERSTYLE_P_H diff --git a/libs/kotext/styles/KoTableCellStyle.cpp b/libs/kotext/styles/KoTableCellStyle.cpp index 938f066..7b9f227 100644 --- a/libs/kotext/styles/KoTableCellStyle.cpp +++ b/libs/kotext/styles/KoTableCellStyle.cpp @@ -85,14 +85,14 @@ void KoTableCellStylePrivate::setProperty(int key, const QVariant &value) } KoTableCellStyle::KoTableCellStyle(QObject *parent) - : KoTableBorderStyle(*new KoTableCellStylePrivate(), parent) + : QObject(parent) { Q_D(KoTableCellStyle); d->charStyle = new KoCharacterStyle(this); } KoTableCellStyle::KoTableCellStyle(const QTextTableCellFormat &format, QObject *parent) - : KoTableBorderStyle(*new KoTableCellStylePrivate(), format, parent) + : QObject(parent) { Q_D(KoTableCellStyle); d->stylesPrivate = format.properties(); @@ -113,10 +113,10 @@ QRectF KoTableCellStyle::contentRect(const QRectF &boundingRect) const { Q_D(const KoTableCellStyle); return boundingRect.adjusted( - d->edges[Left].outerPen.widthF() + d->edges[Left].spacing + d->edges[Left].innerPen.widthF() + propertyDouble(QTextFormat::TableCellLeftPadding), - d->edges[Top].outerPen.widthF() + d->edges[Top].spacing + d->edges[Top].innerPen.widthF() + propertyDouble(QTextFormat::TableCellTopPadding), - - d->edges[Right].outerPen.widthF() - d->edges[Right].spacing - d->edges[Right].innerPen.widthF() - propertyDouble(QTextFormat::TableCellRightPadding), - - d->edges[Bottom].outerPen.widthF() - d->edges[Bottom].spacing - d->edges[Bottom].innerPen.widthF() - propertyDouble(QTextFormat::TableCellBottomPadding) + d->edges[KoTableBorderStyle::Left].outerPen.widthF() + d->edges[KoTableBorderStyle::Left].spacing + d->edges[KoTableBorderStyle::Left].innerPen.widthF() + propertyDouble(QTextFormat::TableCellLeftPadding), + d->edges[KoTableBorderStyle::Top].outerPen.widthF() + d->edges[KoTableBorderStyle::Top].spacing + d->edges[KoTableBorderStyle::Top].innerPen.widthF() + propertyDouble(QTextFormat::TableCellTopPadding), + - d->edges[KoTableBorderStyle::Right].outerPen.widthF() - d->edges[KoTableBorderStyle::Right].spacing - d->edges[KoTableBorderStyle::Right].innerPen.widthF() - propertyDouble(QTextFormat::TableCellRightPadding), + - d->edges[KoTableBorderStyle::Bottom].outerPen.widthF() - d->edges[KoTableBorderStyle::Bottom].spacing - d->edges[KoTableBorderStyle::Bottom].innerPen.widthF() - propertyDouble(QTextFormat::TableCellBottomPadding) ); } @@ -124,10 +124,10 @@ QRectF KoTableCellStyle::boundingRect(const QRectF &contentRect) const { Q_D(const KoTableCellStyle); return contentRect.adjusted( - - d->edges[Left].outerPen.widthF() - d->edges[Left].spacing - d->edges[Left].innerPen.widthF() - propertyDouble(QTextFormat::TableCellLeftPadding), - - d->edges[Top].outerPen.widthF() - d->edges[Top].spacing - d->edges[Top].innerPen.widthF() - propertyDouble(QTextFormat::TableCellTopPadding), - d->edges[Right].outerPen.widthF() + d->edges[Right].spacing + d->edges[Right].innerPen.widthF() + propertyDouble(QTextFormat::TableCellRightPadding), - d->edges[Bottom].outerPen.widthF() + d->edges[Bottom].spacing + d->edges[Bottom].innerPen.widthF() + propertyDouble(QTextFormat::TableCellBottomPadding) + - d->edges[KoTableBorderStyle::Left].outerPen.widthF() - d->edges[KoTableBorderStyle::Left].spacing - d->edges[KoTableBorderStyle::Left].innerPen.widthF() - propertyDouble(QTextFormat::TableCellLeftPadding), + - d->edges[KoTableBorderStyle::Top].outerPen.widthF() - d->edges[KoTableBorderStyle::Top].spacing - d->edges[KoTableBorderStyle::Top].innerPen.widthF() - propertyDouble(QTextFormat::TableCellTopPadding), + d->edges[KoTableBorderStyle::Right].outerPen.widthF() + d->edges[KoTableBorderStyle::Right].spacing + d->edges[KoTableBorderStyle::Right].innerPen.widthF() + propertyDouble(QTextFormat::TableCellRightPadding), + d->edges[KoTableBorderStyle::Bottom].outerPen.widthF() + d->edges[KoTableBorderStyle::Bottom].spacing + d->edges[KoTableBorderStyle::Bottom].innerPen.widthF() + propertyDouble(QTextFormat::TableCellBottomPadding) ); } @@ -255,6 +255,14 @@ qreal KoTableCellStyle::propertyDouble(int key) const return variant.toDouble(); } +QPen KoTableCellStyle::propertyPen(int key) const +{ + const QVariant prop = value(key); + if (prop.userType() != QVariant::Pen) + return QPen(Qt::NoPen); + return qvariant_cast(prop); +} + int KoTableCellStyle::propertyInt(int key) const { QVariant variant = value(key); @@ -295,30 +303,30 @@ void KoTableCellStyle::applyStyle(QTextTableCellFormat &format) const format.setProperty(keys[i], variant); } - format.setProperty(TopBorderOuterPen, d->edges[Top].outerPen); - format.setProperty(TopBorderSpacing, d->edges[Top].spacing); - format.setProperty(TopBorderInnerPen, d->edges[Top].innerPen); - format.setProperty(TopBorderStyle, d->borderstyle[Top]); - format.setProperty(LeftBorderOuterPen, d->edges[Left].outerPen); - format.setProperty(LeftBorderSpacing, d->edges[Left].spacing); - format.setProperty(LeftBorderInnerPen, d->edges[Left].innerPen); - format.setProperty(LeftBorderStyle, d->borderstyle[Left]); - format.setProperty(BottomBorderOuterPen, d->edges[Bottom].outerPen); - format.setProperty(BottomBorderSpacing, d->edges[Bottom].spacing); - format.setProperty(BottomBorderInnerPen, d->edges[Bottom].innerPen); - format.setProperty(BottomBorderStyle, d->borderstyle[Bottom]); - format.setProperty(RightBorderOuterPen, d->edges[Right].outerPen); - format.setProperty(RightBorderSpacing, d->edges[Right].spacing); - format.setProperty(RightBorderInnerPen, d->edges[Right].innerPen); - format.setProperty(RightBorderStyle, d->borderstyle[Right]); - format.setProperty(TopLeftToBottomRightBorderOuterPen, d->edges[TopLeftToBottomRight].outerPen); - format.setProperty(TopLeftToBottomRightBorderSpacing, d->edges[TopLeftToBottomRight].spacing); - format.setProperty(TopLeftToBottomRightBorderInnerPen, d->edges[TopLeftToBottomRight].innerPen); - format.setProperty(TopLeftToBottomRightBorderStyle, d->borderstyle[TopLeftToBottomRight]); - format.setProperty(BottomLeftToTopRightBorderOuterPen, d->edges[BottomLeftToTopRight].outerPen); - format.setProperty(BottomLeftToTopRightBorderSpacing, d->edges[BottomLeftToTopRight].spacing); - format.setProperty(BottomLeftToTopRightBorderInnerPen, d->edges[BottomLeftToTopRight].innerPen); - format.setProperty(BottomLeftToTopRightBorderStyle, d->borderstyle[BottomLeftToTopRight]); + format.setProperty(KoTableBorderStyle::TopBorderOuterPen, d->edges[KoTableBorderStyle::Top].outerPen); + format.setProperty(KoTableBorderStyle::TopBorderSpacing, d->edges[KoTableBorderStyle::Top].spacing); + format.setProperty(KoTableBorderStyle::TopBorderInnerPen, d->edges[KoTableBorderStyle::Top].innerPen); + format.setProperty(KoTableBorderStyle::TopBorderStyle, d->borderstyle[KoTableBorderStyle::Top]); + format.setProperty(KoTableBorderStyle::LeftBorderOuterPen, d->edges[KoTableBorderStyle::Left].outerPen); + format.setProperty(KoTableBorderStyle::LeftBorderSpacing, d->edges[KoTableBorderStyle::Left].spacing); + format.setProperty(KoTableBorderStyle::LeftBorderInnerPen, d->edges[KoTableBorderStyle::Left].innerPen); + format.setProperty(KoTableBorderStyle::LeftBorderStyle, d->borderstyle[KoTableBorderStyle::Left]); + format.setProperty(KoTableBorderStyle::BottomBorderOuterPen, d->edges[KoTableBorderStyle::Bottom].outerPen); + format.setProperty(KoTableBorderStyle::BottomBorderSpacing, d->edges[KoTableBorderStyle::Bottom].spacing); + format.setProperty(KoTableBorderStyle::BottomBorderInnerPen, d->edges[KoTableBorderStyle::Bottom].innerPen); + format.setProperty(KoTableBorderStyle::BottomBorderStyle, d->borderstyle[KoTableBorderStyle::Bottom]); + format.setProperty(KoTableBorderStyle::RightBorderOuterPen, d->edges[KoTableBorderStyle::Right].outerPen); + format.setProperty(KoTableBorderStyle::RightBorderSpacing, d->edges[KoTableBorderStyle::Right].spacing); + format.setProperty(KoTableBorderStyle::RightBorderInnerPen, d->edges[KoTableBorderStyle::Right].innerPen); + format.setProperty(KoTableBorderStyle::RightBorderStyle, d->borderstyle[KoTableBorderStyle::Right]); + format.setProperty(KoTableBorderStyle::TopLeftToBottomRightBorderOuterPen, d->edges[KoTableBorderStyle::TopLeftToBottomRight].outerPen); + format.setProperty(KoTableBorderStyle::TopLeftToBottomRightBorderSpacing, d->edges[KoTableBorderStyle::TopLeftToBottomRight].spacing); + format.setProperty(KoTableBorderStyle::TopLeftToBottomRightBorderInnerPen, d->edges[KoTableBorderStyle::TopLeftToBottomRight].innerPen); + format.setProperty(KoTableBorderStyle::TopLeftToBottomRightBorderStyle, d->borderstyle[KoTableBorderStyle::TopLeftToBottomRight]); + format.setProperty(KoTableBorderStyle::BottomLeftToTopRightBorderOuterPen, d->edges[KoTableBorderStyle::BottomLeftToTopRight].outerPen); + format.setProperty(KoTableBorderStyle::BottomLeftToTopRightBorderSpacing, d->edges[KoTableBorderStyle::BottomLeftToTopRight].spacing); + format.setProperty(KoTableBorderStyle::BottomLeftToTopRightBorderInnerPen, d->edges[KoTableBorderStyle::BottomLeftToTopRight].innerPen); + format.setProperty(KoTableBorderStyle::BottomLeftToTopRightBorderStyle, d->borderstyle[KoTableBorderStyle::BottomLeftToTopRight]); } void KoTableCellStyle::setBackground(const QBrush &brush) @@ -596,7 +604,7 @@ void KoTableCellStyle::loadOdfProperties(KoShapeLoadingContext &context, KoStyle style = styleStack.property(KoXmlNS::calligra, "specialborder", "left"); } if (!border.isEmpty() && border != "none" && border != "hidden") { - setEdge(Left, KoBorder::odfBorderStyle(style), KoUnit::parseValue(border.section(' ', 0, 0), 1.0),QColor(border.section(' ', 2, 2))); + setEdge(KoTableBorderStyle::Left, KoBorder::odfBorderStyle(style), KoUnit::parseValue(border.section(' ', 0, 0), 1.0),QColor(border.section(' ', 2, 2))); } } if (styleStack.hasProperty(KoXmlNS::fo, "border", "top")) { @@ -606,7 +614,7 @@ void KoTableCellStyle::loadOdfProperties(KoShapeLoadingContext &context, KoStyle style = styleStack.property(KoXmlNS::calligra, "specialborder", "top"); } if (!border.isEmpty() && border != "none" && border != "hidden") { - setEdge(Top, KoBorder::odfBorderStyle(style), KoUnit::parseValue(border.section(' ', 0, 0), 1.0),QColor(border.section(' ', 2, 2))); + setEdge(KoTableBorderStyle::Top, KoBorder::odfBorderStyle(style), KoUnit::parseValue(border.section(' ', 0, 0), 1.0),QColor(border.section(' ', 2, 2))); } } @@ -617,7 +625,7 @@ void KoTableCellStyle::loadOdfProperties(KoShapeLoadingContext &context, KoStyle style = styleStack.property(KoXmlNS::calligra, "specialborder", "right"); } if (!border.isEmpty() && border != "none" && border != "hidden") { - setEdge(Right, KoBorder::odfBorderStyle(style), KoUnit::parseValue(border.section(' ', 0, 0), 1.0),QColor(border.section(' ', 2, 2))); + setEdge(KoTableBorderStyle::Right, KoBorder::odfBorderStyle(style), KoUnit::parseValue(border.section(' ', 0, 0), 1.0),QColor(border.section(' ', 2, 2))); } } if (styleStack.hasProperty(KoXmlNS::fo, "border", "bottom")) { @@ -627,7 +635,7 @@ void KoTableCellStyle::loadOdfProperties(KoShapeLoadingContext &context, KoStyle style = styleStack.property(KoXmlNS::calligra, "specialborder", "bottom"); } if (!border.isEmpty() && border != "none" && border != "hidden") { - setEdge(Bottom, KoBorder::odfBorderStyle(style), KoUnit::parseValue(border.section(' ', 0, 0), 1.0),QColor(border.section(' ', 2, 2))); + setEdge(KoTableBorderStyle::Bottom, KoBorder::odfBorderStyle(style), KoUnit::parseValue(border.section(' ', 0, 0), 1.0),QColor(border.section(' ', 2, 2))); } } if (styleStack.hasProperty(KoXmlNS::style, "diagonal-tl-br")) { @@ -636,7 +644,7 @@ void KoTableCellStyle::loadOdfProperties(KoShapeLoadingContext &context, KoStyle if (styleStack.hasProperty(KoXmlNS::calligra, "specialborder", "tl-br")) { style = styleStack.property(KoXmlNS::calligra, "specialborder", "tl-br"); } - setEdge(TopLeftToBottomRight, KoBorder::odfBorderStyle(style), KoUnit::parseValue(border.section(' ', 0, 0), 1.0),QColor(border.section(' ', 2, 2))); + setEdge(KoTableBorderStyle::TopLeftToBottomRight, KoBorder::odfBorderStyle(style), KoUnit::parseValue(border.section(' ', 0, 0), 1.0),QColor(border.section(' ', 2, 2))); } if (styleStack.hasProperty(KoXmlNS::style, "diagonal-bl-tr")) { QString border = styleStack.property(KoXmlNS::style, "diagonal-bl-tr"); @@ -644,49 +652,49 @@ void KoTableCellStyle::loadOdfProperties(KoShapeLoadingContext &context, KoStyle if (styleStack.hasProperty(KoXmlNS::calligra, "specialborder", "bl-tr")) { style = styleStack.property(KoXmlNS::calligra, "specialborder", "bl-tr"); } - setEdge(BottomLeftToTopRight, KoBorder::odfBorderStyle(style), KoUnit::parseValue(border.section(' ', 0, 0), 1.0),QColor(border.section(' ', 2, 2))); + setEdge(KoTableBorderStyle::BottomLeftToTopRight, KoBorder::odfBorderStyle(style), KoUnit::parseValue(border.section(' ', 0, 0), 1.0),QColor(border.section(' ', 2, 2))); } if (styleStack.hasProperty(KoXmlNS::style, "border-line-width", "left")) { QString borderLineWidth = styleStack.property(KoXmlNS::style, "border-line-width", "left"); if (!borderLineWidth.isEmpty() && borderLineWidth != "none" && borderLineWidth != "hidden") { QStringList blw = borderLineWidth.split(' ', QString::SkipEmptyParts); - setEdgeDoubleBorderValues(Left, KoUnit::parseValue(blw[0], 1.0), KoUnit::parseValue(blw[1], 0.1)); + setEdgeDoubleBorderValues(KoTableBorderStyle::Left, KoUnit::parseValue(blw[0], 1.0), KoUnit::parseValue(blw[1], 0.1)); } } if (styleStack.hasProperty(KoXmlNS::style, "border-line-width", "top")) { QString borderLineWidth = styleStack.property(KoXmlNS::style, "border-line-width", "top"); if (!borderLineWidth.isEmpty() && borderLineWidth != "none" && borderLineWidth != "hidden") { QStringList blw = borderLineWidth.split(' ', QString::SkipEmptyParts); - setEdgeDoubleBorderValues(Top, KoUnit::parseValue(blw[0], 1.0), KoUnit::parseValue(blw[1], 0.1)); + setEdgeDoubleBorderValues(KoTableBorderStyle::Top, KoUnit::parseValue(blw[0], 1.0), KoUnit::parseValue(blw[1], 0.1)); } } if (styleStack.hasProperty(KoXmlNS::style, "border-line-width", "right")) { QString borderLineWidth = styleStack.property(KoXmlNS::style, "border-line-width", "right"); if (!borderLineWidth.isEmpty() && borderLineWidth != "none" && borderLineWidth != "hidden") { QStringList blw = borderLineWidth.split(' ', QString::SkipEmptyParts); - setEdgeDoubleBorderValues(Right, KoUnit::parseValue(blw[0], 1.0), KoUnit::parseValue(blw[1], 0.1)); + setEdgeDoubleBorderValues(KoTableBorderStyle::Right, KoUnit::parseValue(blw[0], 1.0), KoUnit::parseValue(blw[1], 0.1)); } } if (styleStack.hasProperty(KoXmlNS::style, "border-line-width", "bottom")) { QString borderLineWidth = styleStack.property(KoXmlNS::style, "border-line-width", "bottom"); if (!borderLineWidth.isEmpty() && borderLineWidth != "none" && borderLineWidth != "hidden") { QStringList blw = borderLineWidth.split(' ', QString::SkipEmptyParts); - setEdgeDoubleBorderValues(Bottom, KoUnit::parseValue(blw[0], 1.0), KoUnit::parseValue(blw[1], 0.1)); + setEdgeDoubleBorderValues(KoTableBorderStyle::Bottom, KoUnit::parseValue(blw[0], 1.0), KoUnit::parseValue(blw[1], 0.1)); } } if (styleStack.hasProperty(KoXmlNS::style, "diagonal-tl-br-widths")) { QString borderLineWidth = styleStack.property(KoXmlNS::style, "diagonal-tl-br-widths"); if (!borderLineWidth.isEmpty() && borderLineWidth != "none" && borderLineWidth != "hidden") { QStringList blw = borderLineWidth.split(' ', QString::SkipEmptyParts); - setEdgeDoubleBorderValues(TopLeftToBottomRight, KoUnit::parseValue(blw[0], 1.0), KoUnit::parseValue(blw[1], 0.1)); + setEdgeDoubleBorderValues(KoTableBorderStyle::TopLeftToBottomRight, KoUnit::parseValue(blw[0], 1.0), KoUnit::parseValue(blw[1], 0.1)); } } if (styleStack.hasProperty(KoXmlNS::style, "diagonal-bl-tr-widths")) { QString borderLineWidth = styleStack.property(KoXmlNS::style, "diagonal-bl-tr-widths"); if (!borderLineWidth.isEmpty() && borderLineWidth != "none" && borderLineWidth != "hidden") { QStringList blw = borderLineWidth.split(' ', QString::SkipEmptyParts); - setEdgeDoubleBorderValues(BottomLeftToTopRight, KoUnit::parseValue(blw[0], 1.0), KoUnit::parseValue(blw[1], 0.1)); + setEdgeDoubleBorderValues(KoTableBorderStyle::BottomLeftToTopRight, KoUnit::parseValue(blw[0], 1.0), KoUnit::parseValue(blw[1], 0.1)); } } @@ -1034,4 +1042,236 @@ void KoTableCellStyle::saveOdf(KoGenStyle &style) */ } +void KoTableCellStyle::setEdge(KoTableBorderStyle::Side side, KoBorder::BorderStyle style, qreal width, QColor color) +{ + Q_D(KoTableCellStyle); + + KoTableBorderStyle::Edge edge; + qreal innerWidth = 0; + qreal middleWidth = 0; + qreal space = 0; + switch (style) { + case KoBorder::BorderNone: + width = 0.0; + break; + case KoBorder::BorderDouble: + innerWidth = space = width/4; //some nice default look + width -= (space + innerWidth); + edge.outerPen.setStyle(Qt::SolidLine); + break; + case KoBorder::BorderDotted: + edge.outerPen.setStyle(Qt::DotLine); + break; + case KoBorder::BorderDashed: + edge.outerPen.setStyle(Qt::DashLine); + break; + case KoBorder::BorderDashedLong: { + QVector dashes; + dashes << 6 << 6; + edge.outerPen.setDashPattern(dashes); + break; + } + case KoBorder::BorderTriple: + innerWidth = middleWidth = space = width/6; + width -= (space + innerWidth); + edge.outerPen.setStyle(Qt::SolidLine); + break; + case KoBorder::BorderDashDot: + edge.outerPen.setStyle(Qt::DashDotLine); + break; + case KoBorder::BorderDashDotDot: + edge.outerPen.setStyle(Qt::DashDotDotLine); + break; + case KoBorder::BorderWave: + edge.outerPen.setStyle(Qt::SolidLine); + break; + case KoBorder::BorderSlash: + edge.outerPen.setStyle(Qt::SolidLine); + break; + case KoBorder::BorderDoubleWave: + innerWidth = space = width/4; //some nice default look + width -= (space + innerWidth); + edge.outerPen.setStyle(Qt::SolidLine); + break; + default: + edge.outerPen.setStyle(Qt::SolidLine); + break; + } + edge.outerPen.setColor(color); + edge.outerPen.setJoinStyle(Qt::MiterJoin); + edge.outerPen.setCapStyle(Qt::FlatCap); + edge.outerPen.setWidthF(width); + + edge.spacing = space; + edge.innerPen = edge.outerPen; + edge.innerPen.setWidthF(innerWidth); + QPen middlePen; + middlePen = edge.outerPen; + middlePen.setWidthF(middleWidth); + + d->edges[side] = edge; + d->borderstyle[side] = style; +} + +void KoTableCellStyle::setEdgeDoubleBorderValues(KoTableBorderStyle::Side side, qreal innerWidth, qreal space) +{ + Q_D(KoTableCellStyle); + + qreal totalWidth = d->edges[side].outerPen.widthF() + d->edges[side].spacing + d->edges[side].innerPen.widthF(); + if (d->edges[side].innerPen.widthF() > 0.0) { + d->edges[side].outerPen.setWidthF(totalWidth - innerWidth - space); + d->edges[side].spacing = space; + d->edges[side].innerPen.setWidthF(innerWidth); + } +} + +bool KoTableCellStyle::hasBorders() const +{ + Q_D(const KoTableCellStyle); + + for (int i = KoTableBorderStyle::Top; i <= KoTableBorderStyle::BottomLeftToTopRight; i++) + if (d->edges[i].outerPen.widthF() > 0.0) + return true; + return false; +} + +qreal KoTableCellStyle::leftBorderWidth() const +{ + Q_D(const KoTableCellStyle); + + const KoTableBorderStyle::Edge &edge = d->edges[KoTableBorderStyle::Left]; + return edge.spacing + edge.innerPen.widthF() + edge.outerPen.widthF(); +} + +qreal KoTableCellStyle::rightBorderWidth() const +{ + Q_D(const KoTableCellStyle); + + const KoTableBorderStyle::Edge &edge = d->edges[KoTableBorderStyle::Right]; + return edge.spacing + edge.innerPen.widthF() + edge.outerPen.widthF(); +} + +qreal KoTableCellStyle::topBorderWidth() const +{ + Q_D(const KoTableCellStyle); + + const KoTableBorderStyle::Edge &edge = d->edges[KoTableBorderStyle::Top]; + return edge.spacing + edge.innerPen.widthF() + edge.outerPen.widthF(); +} + +qreal KoTableCellStyle::bottomBorderWidth() const +{ + Q_D(const KoTableCellStyle); + + const KoTableBorderStyle::Edge &edge = d->edges[KoTableBorderStyle::Bottom]; + return edge.spacing + edge.innerPen.widthF() + edge.outerPen.widthF(); +} + +qreal KoTableCellStyle::leftInnerBorderWidth() const +{ + Q_D(const KoTableCellStyle); + return d->edges[KoTableBorderStyle::Left].innerPen.widthF(); +} + +qreal KoTableCellStyle::rightInnerBorderWidth() const +{ + Q_D(const KoTableCellStyle); + return d->edges[KoTableBorderStyle::Right].innerPen.widthF(); +} + +qreal KoTableCellStyle::topInnerBorderWidth() const +{ + Q_D(const KoTableCellStyle); + return d->edges[KoTableBorderStyle::Top].innerPen.widthF(); +} + +qreal KoTableCellStyle::bottomInnerBorderWidth() const +{ + Q_D(const KoTableCellStyle); + return d->edges[KoTableBorderStyle::Bottom].innerPen.widthF(); +} + +qreal KoTableCellStyle::leftOuterBorderWidth() const +{ + Q_D(const KoTableCellStyle); + return d->edges[KoTableBorderStyle::Left].outerPen.widthF(); +} + +qreal KoTableCellStyle::rightOuterBorderWidth() const +{ + Q_D(const KoTableCellStyle); + return d->edges[KoTableBorderStyle::Right].outerPen.widthF(); +} + +qreal KoTableCellStyle::topOuterBorderWidth() const +{ + Q_D(const KoTableCellStyle); + return d->edges[KoTableBorderStyle::Top].outerPen.widthF(); +} + +qreal KoTableCellStyle::bottomOuterBorderWidth() const +{ + Q_D(const KoTableCellStyle); + return d->edges[KoTableBorderStyle::Bottom].outerPen.widthF(); +} + +KoTableBorderStyle::Edge KoTableCellStyle::getEdge(KoTableBorderStyle::Side side) const +{ + KoTableBorderStyle::Edge result; + switch (side) + { + case KoTableBorderStyle::Top: + result.outerPen = propertyPen(KoTableBorderStyle::TopBorderOuterPen); + result.spacing = propertyDouble(KoTableBorderStyle::TopBorderSpacing); + result.innerPen = propertyPen(KoTableBorderStyle::TopBorderInnerPen); + break; + case KoTableBorderStyle::Left: + result.outerPen = propertyPen(KoTableBorderStyle::LeftBorderOuterPen); + result.spacing = propertyDouble(KoTableBorderStyle::LeftBorderSpacing); + result.innerPen = propertyPen(KoTableBorderStyle::LeftBorderInnerPen); + break; + case KoTableBorderStyle::Bottom: + result.outerPen = propertyPen(KoTableBorderStyle::BottomBorderOuterPen); + result.spacing = propertyDouble(KoTableBorderStyle::BottomBorderSpacing); + result.innerPen = propertyPen(KoTableBorderStyle::BottomBorderInnerPen); + break; + case KoTableBorderStyle::Right: + result.outerPen = propertyPen(KoTableBorderStyle::RightBorderOuterPen); + result.spacing = propertyDouble(KoTableBorderStyle::RightBorderSpacing); + result.innerPen = propertyPen(KoTableBorderStyle::RightBorderInnerPen); + break; + case KoTableBorderStyle::TopLeftToBottomRight: + result.outerPen = propertyPen(KoTableBorderStyle::TopLeftToBottomRightBorderOuterPen); + result.spacing = propertyDouble(KoTableBorderStyle::TopLeftToBottomRightBorderSpacing); + result.innerPen = propertyPen(KoTableBorderStyle::TopLeftToBottomRightBorderInnerPen); + break; + case KoTableBorderStyle::BottomLeftToTopRight: + result.outerPen = propertyPen(KoTableBorderStyle::BottomLeftToTopRightBorderOuterPen); + result.spacing = propertyDouble(KoTableBorderStyle::BottomLeftToTopRightBorderSpacing); + result.innerPen = propertyPen(KoTableBorderStyle::BottomLeftToTopRightBorderInnerPen); + break; + } + return result; +} + +KoBorder::BorderStyle KoTableCellStyle::getBorderStyle(KoTableBorderStyle::Side side) const +{ + switch (side) + { + case KoTableBorderStyle::Top: + return KoBorder::BorderStyle(propertyInt(KoTableBorderStyle::TopBorderStyle)); + case KoTableBorderStyle::Left: + return KoBorder::BorderStyle(propertyInt(KoTableBorderStyle::LeftBorderStyle)); + case KoTableBorderStyle::Bottom: + return KoBorder::BorderStyle(propertyInt(KoTableBorderStyle::BottomBorderStyle)); + case KoTableBorderStyle::Right: + return KoBorder::BorderStyle(propertyInt(KoTableBorderStyle::RightBorderStyle)); + case KoTableBorderStyle::TopLeftToBottomRight: + return KoBorder::BorderStyle(propertyInt(KoTableBorderStyle::TopLeftToBottomRightBorderStyle)); + case KoTableBorderStyle::BottomLeftToTopRight: + return KoBorder::BorderStyle(propertyInt(KoTableBorderStyle::BottomLeftToTopRightBorderStyle)); + } + return KoBorder::BorderNone; +} + #include diff --git a/libs/kotext/styles/KoTableCellStyle.h b/libs/kotext/styles/KoTableCellStyle.h index 29fca26..0836c6a 100644 --- a/libs/kotext/styles/KoTableCellStyle.h +++ b/libs/kotext/styles/KoTableCellStyle.h @@ -53,7 +53,7 @@ class KoShapeLoadingContext; * a specific KoTableCellStyle. * @see KoStyleManager */ -class KOTEXT_EXPORT KoTableCellStyle : public KoTableBorderStyle +class KOTEXT_EXPORT KoTableCellStyle : public QObject { Q_OBJECT public: @@ -279,7 +279,55 @@ public: * @returns a QVariant which holds the property value. */ QVariant value(int key) const; + + + /** + * Set the properties of an edge. + * + * @param side defines which edge this is for. + * @param style the border style for this side. + * @param totalWidth the thickness of the border. Sum of outerwidth, spacing and innerwidth for double borders + * @param color the color of the border line(s). + */ + void setEdge(KoTableBorderStyle::Side side, KoBorder::BorderStyle style, qreal totalWidth, QColor color); + + /** + * Set the properties of a double border. + * Note: you need to set the edge first or that would overwrite these values. + * + * The values will not be set if the border doesn't have a double style + * + * @param side defines which edge this is for. + * @param space the amount of spacing between the outer border and the inner border in case of style being double + * @param innerWidth the thickness of the inner border line in case of style being double + */ + void setEdgeDoubleBorderValues(KoTableBorderStyle::Side side, qreal innerWidth, qreal space); + + /** + * Check if the border data has any borders. + * + * @return true if there has been at least one border set. + */ + bool hasBorders() const; + + qreal leftBorderWidth() const; + qreal rightBorderWidth() const; + qreal topBorderWidth() const; + qreal bottomBorderWidth() const; + + qreal leftInnerBorderWidth() const; + qreal rightInnerBorderWidth() const; + qreal topInnerBorderWidth() const; + qreal bottomInnerBorderWidth() const; + + qreal leftOuterBorderWidth() const; + qreal rightOuterBorderWidth() const; + qreal topOuterBorderWidth() const; + qreal bottomOuterBorderWidth() const; + + KoTableBorderStyle::Edge getEdge(KoTableBorderStyle::Side side) const; + KoBorder::BorderStyle getBorderStyle(KoTableBorderStyle::Side side) const; signals: void nameChanged(const QString &newName); @@ -290,6 +338,7 @@ private: */ void loadOdfProperties(KoShapeLoadingContext &context, KoStyleStack &styleStack); qreal propertyDouble(int key) const; + QPen propertyPen(int key) const; int propertyInt(int key) const; bool propertyBoolean(int key) const; QColor propertyColor(int key) const; diff --git a/libs/kotext/styles/KoTableCellStyle_p.h b/libs/kotext/styles/KoTableCellStyle_p.h index 3935c81..f716846 100644 --- a/libs/kotext/styles/KoTableCellStyle_p.h +++ b/libs/kotext/styles/KoTableCellStyle_p.h @@ -22,9 +22,7 @@ #ifndef KOTABLECELLSTYLE_P_H #define KOTABLECELLSTYLE_P_H -#include "KoTableBorderStyle_p.h" - -class KoTableCellStylePrivate : public KoTableBorderStylePrivate +class KoTableCellStylePrivate { public: KoTableCellStylePrivate(); @@ -37,6 +35,9 @@ public: KoTableCellStyle *parentStyle; int next; StylePrivate stylesPrivate; + + KoTableBorderStyle::Edge edges[6]; + KoBorder::BorderStyle borderstyle[6]; }; #endif // KOTABLECELLSTYLE_P_H diff --git a/libs/kotext/styles/tests/TestTableCellStyle.cpp b/libs/kotext/styles/tests/TestTableCellStyle.cpp index e752e23..9da63aa 100644 --- a/libs/kotext/styles/tests/TestTableCellStyle.cpp +++ b/libs/kotext/styles/tests/TestTableCellStyle.cpp @@ -10,28 +10,28 @@ void TestTableCellStyle::testPen() { // Test basic functionality of the table cell style (roundtripping to format). QTextTableCellFormat format1; - format1.setProperty(KoTableCellStyle::TopBorderOuterPen, QPen(Qt::red, 5.0)); - format1.setProperty(KoTableCellStyle::TopBorderInnerPen, QPen(Qt::red, 7.0)); - format1.setProperty(KoTableCellStyle::LeftBorderOuterPen, QPen(Qt::red, 8.0)); - format1.setProperty(KoTableCellStyle::LeftBorderInnerPen, QPen(Qt::red, 10.0)); - format1.setProperty(KoTableCellStyle::BottomBorderOuterPen, QPen(Qt::red, 11.0)); - format1.setProperty(KoTableCellStyle::BottomBorderInnerPen, QPen(Qt::red, 13.0)); - format1.setProperty(KoTableCellStyle::RightBorderOuterPen, QPen(Qt::red, 14.0)); - format1.setProperty(KoTableCellStyle::RightBorderInnerPen, QPen(Qt::red, 16.0)); + format1.setProperty(KoTableBorderStyle::TopBorderOuterPen, QPen(Qt::red, 5.0)); + format1.setProperty(KoTableBorderStyle::TopBorderInnerPen, QPen(Qt::red, 7.0)); + format1.setProperty(KoTableBorderStyle::LeftBorderOuterPen, QPen(Qt::red, 8.0)); + format1.setProperty(KoTableBorderStyle::LeftBorderInnerPen, QPen(Qt::red, 10.0)); + format1.setProperty(KoTableBorderStyle::BottomBorderOuterPen, QPen(Qt::red, 11.0)); + format1.setProperty(KoTableBorderStyle::BottomBorderInnerPen, QPen(Qt::red, 13.0)); + format1.setProperty(KoTableBorderStyle::RightBorderOuterPen, QPen(Qt::red, 14.0)); + format1.setProperty(KoTableBorderStyle::RightBorderInnerPen, QPen(Qt::red, 16.0)); KoTableCellStyle *style = new KoTableCellStyle(format1); QVERIFY(style); QTextTableCellFormat format2; style->applyStyle(format2); - QCOMPARE(format2.penProperty(KoTableCellStyle::TopBorderOuterPen), QPen(Qt::red, 5.0)); - QCOMPARE(format2.penProperty(KoTableCellStyle::TopBorderInnerPen), QPen(Qt::red, 7.0)); - QCOMPARE(format2.penProperty(KoTableCellStyle::LeftBorderOuterPen), QPen(Qt::red, 8.0)); - QCOMPARE(format2.penProperty(KoTableCellStyle::LeftBorderInnerPen), QPen(Qt::red, 10.0)); - QCOMPARE(format2.penProperty(KoTableCellStyle::BottomBorderOuterPen), QPen(Qt::red, 11.0)); - QCOMPARE(format2.penProperty(KoTableCellStyle::BottomBorderInnerPen), QPen(Qt::red, 13.0)); - QCOMPARE(format2.penProperty(KoTableCellStyle::RightBorderOuterPen), QPen(Qt::red, 14.0)); - QCOMPARE(format2.penProperty(KoTableCellStyle::RightBorderInnerPen), QPen(Qt::red, 16.0)); + QCOMPARE(format2.penProperty(KoTableBorderStyle::TopBorderOuterPen), QPen(Qt::red, 5.0)); + QCOMPARE(format2.penProperty(KoTableBorderStyle::TopBorderInnerPen), QPen(Qt::red, 7.0)); + QCOMPARE(format2.penProperty(KoTableBorderStyle::LeftBorderOuterPen), QPen(Qt::red, 8.0)); + QCOMPARE(format2.penProperty(KoTableBorderStyle::LeftBorderInnerPen), QPen(Qt::red, 10.0)); + QCOMPARE(format2.penProperty(KoTableBorderStyle::BottomBorderOuterPen), QPen(Qt::red, 11.0)); + QCOMPARE(format2.penProperty(KoTableBorderStyle::BottomBorderInnerPen), QPen(Qt::red, 13.0)); + QCOMPARE(format2.penProperty(KoTableBorderStyle::RightBorderOuterPen), QPen(Qt::red, 14.0)); + QCOMPARE(format2.penProperty(KoTableBorderStyle::RightBorderInnerPen), QPen(Qt::red, 16.0)); } void TestTableCellStyle::testPadding() @@ -62,20 +62,20 @@ void TestTableCellStyle::testSpacing() { // Test basic functionality of the table cell style (roundtripping to format). QTextTableCellFormat format1; - format1.setProperty(KoTableCellStyle::LeftBorderSpacing, 9.0); - format1.setProperty(KoTableCellStyle::RightBorderSpacing, 15.0); - format1.setProperty(KoTableCellStyle::TopBorderSpacing, 6.0); - format1.setProperty(KoTableCellStyle::BottomBorderSpacing, 12.0); + format1.setProperty(KoTableBorderStyle::LeftBorderSpacing, 9.0); + format1.setProperty(KoTableBorderStyle::RightBorderSpacing, 15.0); + format1.setProperty(KoTableBorderStyle::TopBorderSpacing, 6.0); + format1.setProperty(KoTableBorderStyle::BottomBorderSpacing, 12.0); KoTableCellStyle *style = new KoTableCellStyle(format1); QVERIFY(style); QTextTableCellFormat format2; style->applyStyle(format2); - QCOMPARE(format2.doubleProperty(KoTableCellStyle::LeftBorderSpacing), 9.0); - QCOMPARE(format2.doubleProperty(KoTableCellStyle::RightBorderSpacing), 15.0); - QCOMPARE(format2.doubleProperty(KoTableCellStyle::TopBorderSpacing), 6.0); - QCOMPARE(format2.doubleProperty(KoTableCellStyle::BottomBorderSpacing), 12.0); + QCOMPARE(format2.doubleProperty(KoTableBorderStyle::LeftBorderSpacing), 9.0); + QCOMPARE(format2.doubleProperty(KoTableBorderStyle::RightBorderSpacing), 15.0); + QCOMPARE(format2.doubleProperty(KoTableBorderStyle::TopBorderSpacing), 6.0); + QCOMPARE(format2.doubleProperty(KoTableBorderStyle::BottomBorderSpacing), 12.0); QRectF rect(0.0, 0.0, 100.0, 100.0); QCOMPARE(style->contentRect(rect), QRectF(9.0, 6.0, 76.0, 82.0)); diff --git a/libs/textlayout/CMakeLists.txt b/libs/textlayout/CMakeLists.txt index a364ac5..012c46e 100644 --- a/libs/textlayout/CMakeLists.txt +++ b/libs/textlayout/CMakeLists.txt @@ -4,6 +4,7 @@ add_subdirectory( tests ) ########### next target ############### set(textlayout_LIB_SRCS + KoTextLayoutCellHelper.cpp KoTextLayoutArea.cpp KoTextLayoutArea_paint.cpp KoTextLayoutEndNotesArea.cpp diff --git a/libs/textlayout/KoTextLayoutCellHelper.cpp b/libs/textlayout/KoTextLayoutCellHelper.cpp new file mode 100644 index 0000000..976ba83 --- /dev/null +++ b/libs/textlayout/KoTextLayoutCellHelper.cpp @@ -0,0 +1,474 @@ +/* This file is part of the KDE project + * Copyright (C) 2006-2010 Thomas Zander + * Copyright (C) 2008 Thorsten Zachmann + * Copyright (C) 2008 Roopesh Chander + * Copyright (C) 2008 Girish Ramakrishnan + * Copyright (C) 2009 KO GmbH + * Copyright (C) 2011 Pierre Ducroquet + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include "KoTextLayoutCellHelper.h" +#include +#include + +KoTextLayoutCellHelper::KoTextLayoutCellHelper(const KoTableCellStyle &cellStyle, QObject *parent) + : QObject(parent), m_cellStyle(cellStyle) +{ + +} + +bool KoTextLayoutCellHelper::isDrawn(KoBorder::BorderStyle style) const +{ + if (style == KoBorder::BorderWave) + return true; + if (style == KoBorder::BorderDoubleWave) + return true; + if (style == KoBorder::BorderSlash) + return true; + return false; +} + +void KoTextLayoutCellHelper::drawHorizontalWave(KoBorder::BorderStyle style, QPainter &painter, qreal x, qreal w, qreal t) const +{ + QPen pen = painter.pen(); + const qreal linewidth = pen.width(); + const qreal penwidth = linewidth/6; + pen.setWidth(penwidth); + painter.setPen(pen); + if (style == KoBorder::BorderSlash) { + for (qreal sx=x; sx *accumulatedBlankBorders) const +{ + QRectF innerBounds = bounds; + + // outer lines + QPen topOuterPen = m_cellStyle.getEdge(KoTableBorderStyle::Top).outerPen; + QPen bottomOuterPen = m_cellStyle.getEdge(KoTableBorderStyle::Bottom).outerPen; + QPen leftOuterPen = m_cellStyle.getEdge(KoTableBorderStyle::Left).outerPen; + QPen rightOuterPen = m_cellStyle.getEdge(KoTableBorderStyle::Right).outerPen; + + if (topOuterPen.widthF() > 0) { + painter.setPen(topOuterPen); + const qreal t = bounds.top() + topOuterPen.widthF() / 2.0; + innerBounds.setTop(bounds.top() + m_cellStyle.getEdge(KoTableBorderStyle::Top).spacing + topOuterPen.widthF()); + painter.drawLine(QLineF(bounds.left(), t, bounds.right(), t)); + } else if (accumulatedBlankBorders) { + // No border but we'd like to draw one for user convenience when on screen + accumulatedBlankBorders->append(QLineF(bounds.left() + leftOuterPen.widthF() + m_cellStyle.getEdge(KoTableBorderStyle::Left).spacing, + bounds.top() + topOuterPen.widthF() + m_cellStyle.getEdge(KoTableBorderStyle::Top).spacing, + bounds.right() - rightOuterPen.widthF() - m_cellStyle.getEdge(KoTableBorderStyle::Right).spacing, + bounds.top() + topOuterPen.widthF() + m_cellStyle.getEdge(KoTableBorderStyle::Top).spacing)); + } + + if (bottomOuterPen.widthF() > 0) { + painter.setPen(bottomOuterPen); + const qreal b = bounds.bottom() - bottomOuterPen.widthF() / 2.0; + innerBounds.setBottom(bounds.bottom() - m_cellStyle.getEdge(KoTableBorderStyle::Bottom).spacing - bottomOuterPen.widthF()); + painter.drawLine(QLineF(bounds.left(), b, bounds.right(), b)); + } else if (accumulatedBlankBorders) { + // No border but we'd like to draw one for user convenience when on screen + accumulatedBlankBorders->append(QLineF(bounds.left() + leftOuterPen.widthF() + m_cellStyle.getEdge(KoTableBorderStyle::Left).spacing, + bounds.bottom() - bottomOuterPen.widthF() - m_cellStyle.getEdge(KoTableBorderStyle::Bottom).spacing, + bounds.right() - rightOuterPen.widthF() - m_cellStyle.getEdge(KoTableBorderStyle::Right).spacing, + bounds.bottom() - bottomOuterPen.widthF() - m_cellStyle.getEdge(KoTableBorderStyle::Bottom).spacing)); + } + + if (leftOuterPen.widthF() > 0) { + painter.setPen(leftOuterPen); + const qreal l = bounds.left() + leftOuterPen.widthF() / 2.0; + innerBounds.setLeft(bounds.left() + m_cellStyle.getEdge(KoTableBorderStyle::Left).spacing + leftOuterPen.widthF()); + painter.drawLine(QLineF(l, bounds.top() + m_cellStyle.getEdge(KoTableBorderStyle::Top).outerPen.widthF(), l, bounds.bottom() - m_cellStyle.getEdge(KoTableBorderStyle::Bottom).outerPen.widthF())); + } else if (accumulatedBlankBorders) { + // No border but we'd like to draw one for user convenience when on screen + accumulatedBlankBorders->append(QLineF(bounds.left() + leftOuterPen.widthF() + m_cellStyle.getEdge(KoTableBorderStyle::Left).spacing, + bounds.top() + topOuterPen.widthF() + m_cellStyle.getEdge(KoTableBorderStyle::Top).spacing, + bounds.left() + leftOuterPen.widthF() + m_cellStyle.getEdge(KoTableBorderStyle::Left).spacing, + bounds.bottom() - bottomOuterPen.widthF() - m_cellStyle.getEdge(KoTableBorderStyle::Bottom).spacing)); + } + + if (m_cellStyle.getEdge(KoTableBorderStyle::Right).outerPen.widthF() > 0) { + painter.setPen(rightOuterPen); + const qreal r = bounds.right() - rightOuterPen.widthF() / 2.0; + innerBounds.setRight(bounds.right() - m_cellStyle.getEdge(KoTableBorderStyle::Right).spacing - rightOuterPen.widthF()); + painter.drawLine(QLineF(r, bounds.top() + m_cellStyle.getEdge(KoTableBorderStyle::Top).outerPen.widthF(), r, bounds.bottom() - bottomOuterPen.widthF())); + } else if (accumulatedBlankBorders) { + // No border but we'd like to draw one for user convenience when on screen + accumulatedBlankBorders->append(QLineF(bounds.right() - rightOuterPen.widthF() - m_cellStyle.getEdge(KoTableBorderStyle::Right).spacing, + bounds.top() + topOuterPen.widthF() + m_cellStyle.getEdge(KoTableBorderStyle::Top).spacing, + bounds.right() - rightOuterPen.widthF() - m_cellStyle.getEdge(KoTableBorderStyle::Right).spacing, + bounds.bottom() - bottomOuterPen.widthF() - m_cellStyle.getEdge(KoTableBorderStyle::Bottom).spacing)); + } + + paintDiagonalBorders(painter, bounds); + + // inner lines + if (m_cellStyle.getEdge(KoTableBorderStyle::Top).innerPen.widthF() > 0) { + QPen pen = m_cellStyle.getEdge(KoTableBorderStyle::Top).innerPen; + painter.setPen(pen); + const qreal t = innerBounds.top() + pen.widthF() / 2.0; + painter.drawLine(QLineF(innerBounds.left(), t, innerBounds.right(), t)); + } + if (m_cellStyle.getEdge(KoTableBorderStyle::Bottom).innerPen.widthF() > 0) { + QPen pen = m_cellStyle.getEdge(KoTableBorderStyle::Bottom).innerPen; + painter.setPen(pen); + const qreal b = innerBounds.bottom() - pen.widthF() / 2.0; + painter.drawLine(QLineF(innerBounds.left(), b, innerBounds.right(), b)); + } + if (m_cellStyle.getEdge(KoTableBorderStyle::Left).innerPen.widthF() > 0) { + QPen pen = m_cellStyle.getEdge(KoTableBorderStyle::Left).innerPen; + painter.setPen(pen); + const qreal l = innerBounds.left() + pen.widthF() / 2.0; + painter.drawLine(QLineF(l, innerBounds.top() + m_cellStyle.getEdge(KoTableBorderStyle::Top).innerPen.widthF(), l, innerBounds.bottom() - m_cellStyle.getEdge(KoTableBorderStyle::Bottom).innerPen.widthF())); + } + if (m_cellStyle.getEdge(KoTableBorderStyle::Right).innerPen.widthF() > 0) { + QPen pen = m_cellStyle.getEdge(KoTableBorderStyle::Right).innerPen; + painter.setPen(pen); + const qreal r = innerBounds.right() - pen.widthF() / 2.0; + painter.drawLine(QLineF(r, innerBounds.top() + m_cellStyle.getEdge(KoTableBorderStyle::Top).innerPen.widthF(), r, innerBounds.bottom() - m_cellStyle.getEdge(KoTableBorderStyle::Bottom).innerPen.widthF())); + } +} + +void KoTextLayoutCellHelper::paintDiagonalBorders(QPainter &painter, const QRectF &bounds) const +{ + if (m_cellStyle.getEdge(KoTableBorderStyle::TopLeftToBottomRight).outerPen.widthF() > 0) { + QPen diagonalPen = m_cellStyle.getEdge(KoTableBorderStyle::TopLeftToBottomRight).outerPen; + painter.setPen(diagonalPen); + + QPen topPen = m_cellStyle.getEdge(KoTableBorderStyle::Top).outerPen; + const qreal top = bounds.top() + topPen.widthF() / 2.0; + QPen leftPen = m_cellStyle.getEdge(KoTableBorderStyle::Left).outerPen; + const qreal left = bounds.left() + leftPen.widthF() / 2.0; + QPen bottomPen = m_cellStyle.getEdge(KoTableBorderStyle::Bottom).outerPen; + const qreal bottom = bounds.bottom() - bottomPen.widthF() / 2.0; + QPen rightPen = m_cellStyle.getEdge(KoTableBorderStyle::Right).outerPen; + const qreal right = bounds.right() - rightPen.widthF() / 2.0; + + painter.drawLine(QLineF(left, top, right, bottom)); + } + if (m_cellStyle.getEdge(KoTableBorderStyle::BottomLeftToTopRight).outerPen.widthF() > 0) { + QPen pen = m_cellStyle.getEdge(KoTableBorderStyle::BottomLeftToTopRight).outerPen; + painter.setPen(pen); + + QPen topPen = m_cellStyle.getEdge(KoTableBorderStyle::Top).outerPen; + const qreal top = bounds.top() + topPen.widthF() / 2.0; + QPen leftPen = m_cellStyle.getEdge(KoTableBorderStyle::Left).outerPen; + const qreal left = bounds.left() + leftPen.widthF() / 2.0; + QPen bottomPen = m_cellStyle.getEdge(KoTableBorderStyle::Bottom).outerPen; + const qreal bottom = bounds.bottom() - bottomPen.widthF() / 2.0; + QPen rightPen = m_cellStyle.getEdge(KoTableBorderStyle::Right).outerPen; + const qreal right = bounds.right() - rightPen.widthF() / 2.0; + + painter.drawLine(QLineF(left, bottom, right, top)); + } +} + +void KoTextLayoutCellHelper::drawTopHorizontalBorder(QPainter &painter, qreal x, qreal y, qreal w, QVector *accumulatedBlankBorders) const +{ + qreal t=y; + if (m_cellStyle.getEdge(KoTableBorderStyle::Top).outerPen.widthF() > 0) { + QPen pen = m_cellStyle.getEdge(KoTableBorderStyle::Top).outerPen; + + painter.setPen(pen); + t += pen.widthF() / 2.0; + if(isDrawn(m_cellStyle.getBorderStyle(KoTableBorderStyle::Top))) { + drawHorizontalWave(m_cellStyle.getBorderStyle(KoTableBorderStyle::Top), painter,x,w,t); + } else { + painter.drawLine(QLineF(x, t, x+w, t)); + } + t = y + m_cellStyle.getEdge(KoTableBorderStyle::Top).spacing + pen.widthF(); + } else if (accumulatedBlankBorders) { + // No border but we'd like to draw one for user convenience when on screen + accumulatedBlankBorders->append(QLineF(x, t, x+w, t)); + } + + // inner line + if (m_cellStyle.getEdge(KoTableBorderStyle::Top).innerPen.widthF() > 0) { + QPen pen = m_cellStyle.getEdge(KoTableBorderStyle::Top).innerPen; + painter.setPen(pen); + t += pen.widthF() / 2.0; + if(isDrawn(m_cellStyle.getBorderStyle(KoTableBorderStyle::Top))) { + drawHorizontalWave(m_cellStyle.getBorderStyle(KoTableBorderStyle::Top), painter,x,w,t); + } else { + painter.drawLine(QLineF(x, t, x+w, t)); + } + } +} + +void KoTextLayoutCellHelper::drawSharedHorizontalBorder(QPainter &painter, const KoTableCellStyle &styleBelow, qreal x, qreal y, qreal w, QVector *accumulatedBlankBorders) const +{ + Q_ASSERT(false); +#if 0 + const KoTableBorderStylePrivate *styleBelowD = static_cast(styleBelow.d_func()); + + bool paintThis = true; + if (m_cellStyle.getBorderStyle(KoTableBorderStyle::Bottom) == KoBorder::BorderNone) { + if (styleBelowD->borderstyle[KoTableBorderStyle::Top] == KoBorder::BorderNone) { + if (accumulatedBlankBorders) { + accumulatedBlankBorders->append(QLineF(x, y, x+w, y)); + } + return; + } + paintThis = false; + } + else { + if (styleBelowD->borderstyle[KoTableBorderStyle::Top] != KoBorder::BorderNone) { + qreal thisWidth = m_cellStyle.getEdge(KoTableBorderStyle::Bottom).outerPen.widthF() + m_cellStyle.getEdge(KoTableBorderStyle::Bottom).spacing + m_cellStyle.getEdge(KoTableBorderStyle::Bottom).innerPen.widthF(); + qreal thatWidth = styleBelowD->edges[KoTableBorderStyle::Top].outerPen.widthF() + styleBelowD->edges[KoTableBorderStyle::Top].spacing + + styleBelowD->edges[KoTableBorderStyle::Top].innerPen.widthF(); + paintThis = thisWidth >= thatWidth; + } + } + + const KoTableBorderStyle::Edge &edge = paintThis ? m_cellStyle.getEdge(KoTableBorderStyle::Bottom): styleBelowD->edges[KoTableBorderStyle::Top]; + const KoBorder::BorderStyle borderStyle = paintThis ? m_cellStyle.getBorderStyle(KoTableBorderStyle::Bottom): m_cellStyle.getBorderStyle(KoTableBorderStyle::Top); + qreal t=y; + + if (edge.outerPen.widthF() > 0) { + QPen pen = edge.outerPen; + const qreal linewidth = pen.widthF(); + + painter.setPen(pen); + t += linewidth / 2.0; + if(isDrawn(borderStyle)) { + drawHorizontalWave(borderStyle, painter,x,w,t); + } else { + painter.drawLine(QLineF(x, t, x+w, t)); + } + t = y + edge.spacing + linewidth; + } + // inner line + if (edge.innerPen.widthF() > 0) { + QPen pen = edge.innerPen; + painter.setPen(pen); + t += pen.widthF() / 2.0; + if(isDrawn(borderStyle)) { + drawHorizontalWave(borderStyle, painter,x,w,t); + } else { + painter.drawLine(QLineF(x, t, x+w, t)); + } + } +#endif +} + +void KoTextLayoutCellHelper::drawBottomHorizontalBorder(QPainter &painter, qreal x, qreal y, qreal w, QVector *accumulatedBlankBorders) const +{ + qreal t=y; + if (m_cellStyle.getEdge(KoTableBorderStyle::Bottom).outerPen.widthF() > 0) { + QPen pen = m_cellStyle.getEdge(KoTableBorderStyle::Bottom).outerPen; + + painter.setPen(pen); + t += pen.widthF() / 2.0; + if(isDrawn(m_cellStyle.getBorderStyle(KoTableBorderStyle::Bottom))) { + drawHorizontalWave(m_cellStyle.getBorderStyle(KoTableBorderStyle::Bottom), painter,x,w,t); + } else { + painter.drawLine(QLineF(x, t, x+w, t)); + } + t = y - m_cellStyle.getEdge(KoTableBorderStyle::Bottom).spacing - pen.widthF(); + } else if (accumulatedBlankBorders) { + // No border but we'd like to draw one for user convenience when on screen + accumulatedBlankBorders->append(QLineF(x, t, x+w, t)); + + } + + // inner line + if (m_cellStyle.getEdge(KoTableBorderStyle::Bottom).innerPen.widthF() > 0) { + QPen pen = m_cellStyle.getEdge(KoTableBorderStyle::Bottom).innerPen; + painter.setPen(pen); + t -= pen.widthF() / 2.0; + if(isDrawn(m_cellStyle.getBorderStyle(KoTableBorderStyle::Bottom))) { + drawHorizontalWave(m_cellStyle.getBorderStyle(KoTableBorderStyle::Bottom), painter,x,w,t); + } else { + painter.drawLine(QLineF(x, t, x+w, t)); + } + } +} + +void KoTextLayoutCellHelper::drawLeftmostVerticalBorder(QPainter &painter, qreal x, qreal y, qreal h, QVector *accumulatedBlankBorders) const +{ + qreal thisWidth = m_cellStyle.getEdge(KoTableBorderStyle::Left).outerPen.widthF() + m_cellStyle.getEdge(KoTableBorderStyle::Left).spacing + m_cellStyle.getEdge(KoTableBorderStyle::Left).innerPen.widthF(); + qreal l = x - thisWidth / 2.0; + + if (m_cellStyle.getEdge(KoTableBorderStyle::Left).outerPen.widthF() > 0) { + QPen pen = m_cellStyle.getEdge(KoTableBorderStyle::Left).outerPen; + + painter.setPen(pen); + l += pen.widthF() / 2.0; + if(isDrawn(m_cellStyle.getBorderStyle(KoTableBorderStyle::Left))) { + drawVerticalWave(m_cellStyle.getBorderStyle(KoTableBorderStyle::Left), painter,y,h,l); + } else { + painter.drawLine(QLineF(l, y, l, y+h)); + } + l += m_cellStyle.getEdge(KoTableBorderStyle::Left).spacing + pen.widthF() / 2.0; + } else if (accumulatedBlankBorders) { + // No border but we'd like to draw one for user convenience when on screen + accumulatedBlankBorders->append(QLineF(l, y, l, y+h)); + + } + + // inner line + if (m_cellStyle.getEdge(KoTableBorderStyle::Left).innerPen.widthF() > 0) { + QPen pen = m_cellStyle.getEdge(KoTableBorderStyle::Left).innerPen; + painter.setPen(pen); + l += pen.widthF() / 2.0; + if(isDrawn(m_cellStyle.getBorderStyle(KoTableBorderStyle::Left))) { + drawVerticalWave(m_cellStyle.getBorderStyle(KoTableBorderStyle::Left), painter,y,h,l); + } else { + painter.drawLine(QLineF(l, y, l, y+h)); + } + } +} + +void KoTextLayoutCellHelper::drawSharedVerticalBorder(QPainter &painter, const KoTableCellStyle &styleRight, qreal x, qreal y, qreal h, QVector *accumulatedBlankBorders) const +{ + Q_ASSERT(false); +#if 0 + const KoTableBorderStylePrivate *styleRightD = static_cast(styleRight.d_func()); + + // First determine which style "wins" by comparing total width + qreal thisWidth = m_cellStyle.getEdge(KoTableBorderStyle::Right).outerPen.widthF() + m_cellStyle.getEdge(KoTableBorderStyle::Right).spacing + m_cellStyle.getEdge(KoTableBorderStyle::Right).innerPen.widthF(); + qreal thatWidth = styleRightD->edges[KoTableBorderStyle::Left].outerPen.widthF() + styleRightD->edges[KoTableBorderStyle::Left].spacing + + styleRightD->edges[KoTableBorderStyle::Left].innerPen.widthF(); + + qreal l=x; + + if(thisWidth >= thatWidth) { + // left style wins + l -= thisWidth / 2.0; + if (m_cellStyle.getEdge(KoTableBorderStyle::Right).outerPen.widthF() > 0) { + QPen pen = m_cellStyle.getEdge(KoTableBorderStyle::Right).outerPen; + + painter.setPen(pen); + l += pen.widthF() / 2.0; + if(isDrawn(m_cellStyle.getBorderStyle(KoTableBorderStyle::Right))) { + drawVerticalWave(m_cellStyle.getBorderStyle(KoTableBorderStyle::Right), painter,y,h,l); + } else { + painter.drawLine(QLineF(l, y, l, y+h)); + } + l += m_cellStyle.getEdge(KoTableBorderStyle::Right).spacing + pen.widthF() / 2.0; + } else if (accumulatedBlankBorders) { + // No border but we'd like to draw one for user convenience when on screen + accumulatedBlankBorders->append(QLineF(l, y, l, y+h)); + + } + + // inner line + if (m_cellStyle.getEdge(KoTableBorderStyle::Right).innerPen.widthF() > 0) { + QPen pen = m_cellStyle.getEdge(KoTableBorderStyle::Right).innerPen; + painter.setPen(pen); + l += pen.widthF() / 2.0; + if(isDrawn(m_cellStyle.getBorderStyle(KoTableBorderStyle::Right))) { + drawVerticalWave(m_cellStyle.getBorderStyle(KoTableBorderStyle::Right), painter,y,h,l); + } else { + painter.drawLine(QLineF(l, y, l, y+h)); + } + } + } else { + // right style wins + l -= thatWidth/2.0; + if (styleRightD->edges[KoTableBorderStyle::Left].outerPen.widthF() > 0) { + QPen pen = styleRightD->edges[KoTableBorderStyle::Left].outerPen; + + painter.setPen(pen); + l += pen.widthF() / 2.0; + if(isDrawn(m_cellStyle.getBorderStyle(KoTableBorderStyle::Left))) { + drawVerticalWave(m_cellStyle.getBorderStyle(KoTableBorderStyle::Left), painter,y,h,l); + } else { + painter.drawLine(QLineF(l, y, l, y+h)); + } + l += styleRightD->edges[KoTableBorderStyle::Left].spacing + pen.widthF() / 2.0; + } + // inner line + if (styleRightD->edges[KoTableBorderStyle::Left].innerPen.widthF() > 0) { + QPen pen = styleRightD->edges[KoTableBorderStyle::Left].innerPen; + painter.setPen(pen); + l += pen.widthF() / 2.0; + if(isDrawn(m_cellStyle.getBorderStyle(KoTableBorderStyle::Left))) { + drawVerticalWave(m_cellStyle.getBorderStyle(KoTableBorderStyle::Left), painter,y,h,l); + } else { + painter.drawLine(QLineF(l, y, l, y+h)); + } + } + } +#endif +} + +void KoTextLayoutCellHelper::drawRightmostVerticalBorder(QPainter &painter, qreal x, qreal y, qreal h, QVector *accumulatedBlankBorders) const +{ + qreal thisWidth = m_cellStyle.getEdge(KoTableBorderStyle::Right).outerPen.widthF() + m_cellStyle.getEdge(KoTableBorderStyle::Right).spacing + m_cellStyle.getEdge(KoTableBorderStyle::Right).innerPen.widthF(); + qreal l = x - thisWidth / 2.0; + + if (m_cellStyle.getEdge(KoTableBorderStyle::Right).outerPen.widthF() > 0) { + QPen pen = m_cellStyle.getEdge(KoTableBorderStyle::Right).outerPen; + + painter.setPen(pen); + l += pen.widthF() / 2.0; + if(isDrawn(m_cellStyle.getBorderStyle(KoTableBorderStyle::Right))) { + drawVerticalWave(m_cellStyle.getBorderStyle(KoTableBorderStyle::Right), painter,y,h,l); + } else { + painter.drawLine(QLineF(l, y, l, y+h)); + } + l += m_cellStyle.getEdge(KoTableBorderStyle::Right).spacing - pen.widthF() / 2.0; + } else if (accumulatedBlankBorders) { + // No border but we'd like to draw one for user convenience when on screen + accumulatedBlankBorders->append(QLineF(l, y, l, y+h)); + } + + // inner line + if (m_cellStyle.getEdge(KoTableBorderStyle::Right).innerPen.widthF() > 0) { + QPen pen = m_cellStyle.getEdge(KoTableBorderStyle::Right).innerPen; + painter.setPen(pen); + l += pen.widthF() / 2.0; + if(isDrawn(m_cellStyle.getBorderStyle(KoTableBorderStyle::Right))) { + drawVerticalWave(m_cellStyle.getBorderStyle(KoTableBorderStyle::Right), painter,y,h,l); + } else { + painter.drawLine(QLineF(l, y, l, y+h)); + } + } +} diff --git a/libs/textlayout/KoTextLayoutCellHelper.h b/libs/textlayout/KoTextLayoutCellHelper.h new file mode 100644 index 0000000..d66bbbc --- /dev/null +++ b/libs/textlayout/KoTextLayoutCellHelper.h @@ -0,0 +1,140 @@ +/* This file is part of the KDE project + * Copyright (C) 2006-2010 Thomas Zander + * Copyright (C) 2008 Thorsten Zachmann + * Copyright (C) 2008 Roopesh Chander + * Copyright (C) 2008 Girish Ramakrishnan + * Copyright (C) 2009 KO GmbH + * Copyright (C) 2011 Pierre Ducroquet + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef KOTEXTLAYOUTCELLHELPER_H +#define KOTEXTLAYOUTCELLHELPER_H + +#include +#include +#include + +class KoTableBorderStyle; +class QPainter; + +class KoTextLayoutCellHelper : public QObject +{ + Q_OBJECT +public: + KoTextLayoutCellHelper(const KoTableCellStyle &cellStyle, QObject *parent = 0); + + + /// returns if the borderstyle needs to be specially drawn + bool isDrawn(KoBorder::BorderStyle style) const; + + /// draws a horizontal wave line + void drawHorizontalWave(KoBorder::BorderStyle style, QPainter &painter, qreal x, qreal w, qreal t) const; + + /// draws a vertical wave line + void drawVerticalWave(KoBorder::BorderStyle style, QPainter &painter, qreal y, qreal h, qreal t) const; + + /** + * Paint the borders. + * + * @painter the painter to draw with. + * @bounds the bounding rectangle to draw. + * @blanks a painterpath where blank borders should be added to. + */ + void paintBorders(QPainter &painter, const QRectF &bounds, QVector *blanks) const; + + /** + * Paint the diagonal borders. + * + * @painter the painter to draw with. + * @bounds the bounding rectangle to draw. + */ + void paintDiagonalBorders(QPainter &painter, const QRectF &bounds) const; + + /** + * Paint the top border. + * + * @painter the painter to draw with. + * @x the x position. + * @y the y position. + * @w the width. + * @blanks a painterpath where blank borders should be added to. + */ + void drawTopHorizontalBorder(QPainter &painter, qreal x, qreal y, qreal w, QVector *blanks = 0) const; + + /** + * Paint the border that is shared. + * It only draws the thickest and it always draws it below the y position. + * + * @painter the painter to draw with. + * @x the x position. + * @y the y position. + * @w the width. + * @blanks a painterpath where blank borders should be added to. + */ + void drawSharedHorizontalBorder(QPainter &painter, const KoTableCellStyle &styleBelow, qreal x, qreal y, qreal w, QVector *blanks = 0) const; + + /** + * Paint the bottom border. + * + * @painter the painter to draw with. + * @x the x position. + * @y the y position. + * @w the width. + * @blanks a painterpath where blank borders should be added to. + */ + void drawBottomHorizontalBorder(QPainter &painter, qreal x, qreal y, qreal w, QVector *blanks = 0) const; + + /** + * Paint the leftmost border. + * + * @painter the painter to draw with. + * @x the x position. + * @y the y position. + * @h the height. + * @blanks a painterpath where blank borders should be added to. + */ + void drawLeftmostVerticalBorder(QPainter &painter, qreal x, qreal y, qreal h, QVector *blanks = 0) const; + + /** + * Paint the border that is shared. + * It only draws the thickest and it always draws it below the y position. + * + * @painter the painter to draw with. + * @x the x position. + * @y the y position. + * @h the height. + * @blanks a painterpath where blank borders should be added to. + */ + void drawSharedVerticalBorder(QPainter &painter, const KoTableCellStyle &styleRight, qreal x, qreal y, qreal h, QVector *blanks = 0) const; + + /** + * Paint the rightmost border. + * + * @painter the painter to draw with. + * @x the x position. + * @y the y position. + * @h the height. + * @blanks a painterpath where blank borders should be added to. + */ + void drawRightmostVerticalBorder(QPainter &painter, qreal x, qreal y, qreal h, QVector *blanks = 0) const; + +private: + const KoTableCellStyle &m_cellStyle; +}; + +#endif // KOTEXTLAYOUTCELLHELPER_H diff --git a/libs/textlayout/KoTextLayoutTableArea.cpp b/libs/textlayout/KoTextLayoutTableArea.cpp index d0c8e4b..6bdd79b 100644 --- a/libs/textlayout/KoTextLayoutTableArea.cpp +++ b/libs/textlayout/KoTextLayoutTableArea.cpp @@ -20,6 +20,7 @@ #include "KoTextLayoutTableArea.h" +#include "KoTextLayoutCellHelper.h" #include "TableIterator.h" #include "KoTextLayoutArea.h" #include "KoPointedAt.h" @@ -798,14 +799,15 @@ void KoTextLayoutTableArea::paintCellBorders(QPainter *painter, const KoTextDocu // This is an actual cell we want to draw, and not a covered one. QTextTableCellFormat tfm(tableCell.format().toTableCellFormat()); - KoTableBorderStyle cellStyle(tfm); + KoTableCellStyle cellStyle(tfm); + KoTextLayoutCellHelper cellStyleHelper(cellStyle); QRectF bRect = cellBoundingRect(tableCell); if (d->collapsing) { // First the horizontal borders if (row == 0) { - cellStyle.drawTopHorizontalBorder(*painter, bRect.x(), bRect.y(), bRect.width(), accuBlankBorders); + cellStyleHelper.drawTopHorizontalBorder(*painter, bRect.x(), bRect.y(), bRect.width(), accuBlankBorders); } if (topRow) { // in collapsing mode we need to also paint the top border of the area @@ -816,14 +818,15 @@ void KoTextLayoutTableArea::paintCellBorders(QPainter *painter, const KoTextDocu QRectF aboveBRect = cellBoundingRect(tableCellAbove); qreal x = qMax(bRect.x(), aboveBRect.x()); qreal x2 = qMin(bRect.right(), aboveBRect.right()); - KoTableBorderStyle cellAboveStyle(aboveTfm); - cellAboveStyle.drawSharedHorizontalBorder(*painter, cellStyle, x, bRect.y(), x2 - x, accuBlankBorders); + KoTableCellStyle cellAboveStyle(aboveTfm); + KoTextLayoutCellHelper cellAboveStyleHelper(cellAboveStyle); + cellAboveStyleHelper.drawSharedHorizontalBorder(*painter, cellStyle, x, bRect.y(), x2 - x, accuBlankBorders); c = tableCellAbove.column() + tableCellAbove.columnSpan(); } } if (row + tableCell.rowSpan() == d->table->rows()) { // we hit the bottom of the table so just draw the bottom border - cellStyle.drawBottomHorizontalBorder(*painter, bRect.x(), bRect.bottom(), bRect.width(), accuBlankBorders); + cellStyleHelper.drawBottomHorizontalBorder(*painter, bRect.x(), bRect.bottom(), bRect.width(), accuBlankBorders); } else { int c = column; while (c < column + tableCell.columnSpan()) { @@ -833,38 +836,40 @@ void KoTextLayoutTableArea::paintCellBorders(QPainter *painter, const KoTextDocu QRectF belowBRect = cellBoundingRect(tableCellBelow); qreal x = qMax(bRect.x(), belowBRect.x()); qreal x2 = qMin(bRect.right(), belowBRect.right()); - KoTableBorderStyle cellBelowStyle(belowTfm); - cellStyle.drawSharedHorizontalBorder(*painter, cellBelowStyle, x, bRect.bottom(), x2 - x, accuBlankBorders); + KoTableCellStyle cellBelowStyle(belowTfm); + KoTextLayoutCellHelper cellBelowStyleHelper(cellBelowStyle); + cellStyleHelper.drawSharedHorizontalBorder(*painter, cellBelowStyle, x, bRect.bottom(), x2 - x, accuBlankBorders); c = tableCellBelow.column() + tableCellBelow.columnSpan(); } } // And then the same treatment for vertical borders if (column == 0) { - cellStyle.drawLeftmostVerticalBorder(*painter, bRect.x(), bRect.y(), bRect.height() + cellStyle.bottomOuterBorderWidth(), accuBlankBorders); + cellStyleHelper.drawLeftmostVerticalBorder(*painter, bRect.x(), bRect.y(), bRect.height() + cellStyle.bottomOuterBorderWidth(), accuBlankBorders); } if (column + tableCell.columnSpan() == d->table->columns()) { // we hit the rightmost edge of the table so draw the rightmost border - cellStyle.drawRightmostVerticalBorder(*painter, bRect.right(), bRect.y(), bRect.height() + cellStyle.bottomOuterBorderWidth(), accuBlankBorders); + cellStyleHelper.drawRightmostVerticalBorder(*painter, bRect.right(), bRect.y(), bRect.height() + cellStyle.bottomOuterBorderWidth(), accuBlankBorders); } else { // we have cells to the right so draw sharedborders int r = row; while (r < row + tableCell.rowSpan()) { QTextTableCell tableCellRight = d->table->cellAt(r, column + tableCell.columnSpan()); QTextTableCellFormat rightTfm(tableCellRight.format().toTableCellFormat()); - KoTableBorderStyle cellBelowRight(rightTfm); + KoTableCellStyle cellBelowRight(rightTfm); + KoTextLayoutCellHelper cellBelowRightHelper(cellBelowRight); QRectF rightBRect = cellBoundingRect(tableCellRight); qreal y = qMax(bRect.y(), rightBRect.y()); qreal y2 = qMin(bRect.bottom() + cellStyle.bottomOuterBorderWidth(), rightBRect.bottom() + cellBelowRight.bottomOuterBorderWidth()); - cellStyle.drawSharedVerticalBorder(*painter, cellBelowRight, bRect.right(), y, y2-y, accuBlankBorders); + cellBelowRightHelper.drawSharedVerticalBorder(*painter, cellBelowRight, bRect.right(), y, y2-y, accuBlankBorders); r = tableCellRight.row() + rightTfm.tableCellRowSpan(); } } // Paint diagonal borders for current cell - cellStyle.paintDiagonalBorders(*painter, bRect); + cellStyleHelper.paintDiagonalBorders(*painter, bRect); } else { // separating border model - cellStyle.paintBorders(*painter, bRect, accuBlankBorders); + cellStyleHelper.paintBorders(*painter, bRect, accuBlankBorders); } }