Subversion Repositories Scribus

Rev

Rev 23272 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
16856 craig 1
/*
2
Copyright (C) 2011 Elvis Stansvik <elvstone@gmail.com>
3
 
4
For general Scribus (>=1.3.2) copyright and licensing information please refer
5
to the COPYING file provided with the program. Following this notice may exist
6
a copyright and/or license notice that predates the release of Scribus 1.3.2
7
for which a new license (GPL+exception) is in place.
8
*/
9
 
10
#include <QDebug>
11
#include <QRectF>
12
#include <QString>
13
 
14
#include "commonstrings.h"
15
#include "pageitem_table.h"
16
#include "pageitem_textframe.h"
17
#include "scribusdoc.h"
18
#include "tableutils.h"
19
 
20
#include "tablecell.h"
21
 
22
using namespace TableUtils;
23
 
24
TableCell::TableCell(int row, int column, PageItem_Table *table) : d(new TableCellData)
25
{
26
        Q_ASSERT(table);
27
        d->table = table;
28
 
29
        // The context for the internal style is the document-wide context.
30
        d->style.setContext(&d->table->doc()->cellStyles());
31
 
32
        // Create a text frame for the cell.
23272 craig 33
        d->textFrame = new PageItem_TextFrame(d->table->m_Doc, 0, 0, 0, 0, 0, CommonStrings::None, CommonStrings::None);
18794 jghali 34
        d->textFrame->Parent = table;
22222 jghali 35
        d->textFrame->OwnPage = table->OwnPage;
36
        d->textFrame->OnMasterPage = table->OnMasterPage;
22832 craig 37
        d->textFrame->m_layerID = table->m_layerID;
16856 craig 38
 
39
        setValid(true);
40
        setRow(row);
41
        setColumn(column);
42
        setRowSpan(1);
43
        setColumnSpan(1);
44
}
45
 
46
QRectF TableCell::boundingRect() const
47
{
48
        if (!isValid())
49
                return QRectF();
50
 
51
        const int endRow = row() + rowSpan() - 1;
52
        const int endCol = column() + columnSpan() - 1;
53
 
17302 fschmid 54
        const double x = d->table->columnPosition(column());
55
        const double y = d->table->rowPosition(row());
56
        const double width = d->table->columnPosition(endCol) + d->table->columnWidth(endCol) - x;
57
        const double height = d->table->rowPosition(endRow) + d->table->rowHeight(endRow) - y;
16856 craig 58
 
59
        return QRectF(x, y, width, height);
60
}
61
 
62
QRectF TableCell::contentRect() const
63
{
64
        if (!isValid())
65
                return QRectF();
66
 
17302 fschmid 67
        const double x = d->textFrame->xPos();
68
        const double y = d->textFrame->yPos();
69
        const double width = d->textFrame->width();
70
        const double height = d->textFrame->height();
16856 craig 71
 
72
        return QRectF(x, y, width, height);
73
}
74
 
75
void TableCell::setLeftBorder(const TableBorder& border)
76
{
77
        d->style.setLeftBorder(border);
78
        d->table->updateCells();
79
}
80
 
81
void TableCell::setRightBorder(const TableBorder& border)
82
{
83
        d->style.setRightBorder(border);
84
        d->table->updateCells();
85
}
86
 
87
void TableCell::setTopBorder(const TableBorder& border)
88
{
89
        d->style.setTopBorder(border);
90
        d->table->updateCells();
91
}
92
 
93
void TableCell::setBottomBorder(const TableBorder& border)
94
{
95
        d->style.setBottomBorder(border);
96
        d->table->updateCells();
97
}
98
 
17302 fschmid 99
void TableCell::setLeftPadding(double padding)
16856 craig 100
{
101
        d->style.setLeftPadding(padding);
102
        d->table->updateCells();
103
}
104
 
17302 fschmid 105
void TableCell::setRightPadding(double padding)
16856 craig 106
{
107
        d->style.setRightPadding(padding);
108
        d->table->updateCells();
109
}
110
 
17302 fschmid 111
void TableCell::setTopPadding(double padding)
16856 craig 112
{
113
        d->style.setTopPadding(padding);
114
        d->table->updateCells();
115
}
116
 
17302 fschmid 117
void TableCell::setBottomPadding(double padding)
16856 craig 118
{
119
        d->style.setBottomPadding(padding);
120
        d->table->updateCells();
121
}
122
 
123
void TableCell::setStyle(const QString& style)
124
{
125
        d->style.setParent(style);
126
        d->table->updateCells();
127
}
128
 
17336 fschmid 129
void TableCell::unsetDirectFormatting()
130
{
131
        QString parentStyle = d->style.parent();
132
        d->style.setParent("");
133
        d->style.erase();
134
        d->style.setParent(parentStyle);
135
}
136
 
16856 craig 137
void TableCell::updateContent()
138
{
139
        QRectF contentRect = boundingRect();
140
        contentRect.setLeft(contentRect.left() + leftPadding() + maxLeftBorderWidth()/2);
141
        contentRect.setTop(contentRect.top() + topPadding() + maxTopBorderWidth()/2);
142
        contentRect.setWidth(qMax(contentRect.width() - (rightPadding() + maxRightBorderWidth()/2), 1.0));
143
        contentRect.setHeight(qMax(contentRect.height() - (bottomPadding() + maxBottomBorderWidth()/2), 1.0));
144
 
145
        d->textFrame->setXYPos(contentRect.x(), contentRect.y(), true);
146
        d->textFrame->setWidthHeight(contentRect.width(), contentRect.height(), true);
147
        d->textFrame->updateClip();
17826 craig 148
        d->textFrame->invalidateLayout(false);
16856 craig 149
}
150
 
151
void TableCell::setText(const QString& text)
152
{
153
        if (!isValid())
154
                return;
155
 
156
        d->textFrame->itemText.clear();
157
        d->textFrame->itemText.insertChars(0, text);
158
}
159
 
160
QString TableCell::asString() const
161
{
162
        QString str("cell(");
163
        str += QString("row=%1, column=%2, ").arg(row()).arg(column());
164
        str += QString("rowSpan=%1, columnSpan=%2, ").arg(rowSpan()).arg(columnSpan());
21939 craig 165
        str += QString("leftBorder=%1, rightBorder=%2, ").arg(leftBorder().asString(), rightBorder().asString());
166
        str += QString("topBorder=%1, bottomBorder=%2, ").arg(topBorder().asString(), bottomBorder().asString());
16856 craig 167
        str += QString("leftPadding=%1, rightPadding=%2, ").arg(leftPadding()).arg(rightPadding());
168
        str += QString("topPadding=%1, bottomPadding=%2, ").arg(topPadding()).arg(bottomPadding());
169
        str += QString("style=%1").arg(d->style.asString());
170
        str += QString(")");
171
 
172
        return str;
173
}
174
 
17302 fschmid 175
double TableCell::maxLeftBorderWidth() const
16856 craig 176
{
177
        const int endRow = row() + rowSpan() - 1;
178
 
17302 fschmid 179
        double maxWidth = 0.0;
180
        double currentWidth = 0.0;
16856 craig 181
        for (int currentRow = row(); currentRow <= endRow; ++currentRow)
182
        {
183
                TableCell cellLeft = d->table->cellAt(currentRow, column() - 1);
184
                if (cellLeft.isValid())
185
                        currentWidth = collapseBorders(leftBorder(), cellLeft.rightBorder()).width();
186
                else
187
                        currentWidth = collapseBorders(leftBorder(), d->table->leftBorder()).width();
188
                maxWidth = qMax(maxWidth, currentWidth);
189
        }
190
 
191
        return maxWidth;
192
}
193
 
17302 fschmid 194
double TableCell::maxRightBorderWidth() const
16856 craig 195
{
196
        const int endRow = row() + rowSpan() - 1;
197
        const int endCol = column() + columnSpan() - 1;
198
 
17302 fschmid 199
        double maxWidth = 0.0;
200
        double currentWidth = 0.0;
16856 craig 201
        for (int currentRow = row(); currentRow <= endRow; ++currentRow)
202
        {
203
                TableCell cellRight = d->table->cellAt(currentRow, endCol + 1);
204
                if (cellRight.isValid())
205
                        currentWidth = collapseBorders(cellRight.leftBorder(), rightBorder()).width();
206
                else
207
                        currentWidth = collapseBorders(d->table->rightBorder(), rightBorder()).width();
208
                maxWidth = qMax(maxWidth, currentWidth);
209
        }
210
 
211
        return maxWidth;
212
}
213
 
17302 fschmid 214
double TableCell::maxTopBorderWidth() const
16856 craig 215
{
216
        const int endCol = column() + columnSpan() - 1;
217
 
17302 fschmid 218
        double maxWidth = 0.0;
219
        double currentWidth = 0.0;
16856 craig 220
        for (int currentCol = column(); currentCol <= endCol; ++currentCol)
221
        {
222
                TableCell cellAbove = d->table->cellAt(row() - 1, currentCol);
223
                if (cellAbove.isValid())
224
                        currentWidth = collapseBorders(cellAbove.bottomBorder(), topBorder()).width();
225
                else
226
                        currentWidth = collapseBorders(topBorder(), d->table->topBorder()).width();
227
                maxWidth = qMax(maxWidth, currentWidth);
228
        }
229
 
230
        return maxWidth;
231
}
232
 
17302 fschmid 233
double TableCell::maxBottomBorderWidth() const
16856 craig 234
{
235
        const int endRow = row() + rowSpan() - 1;
236
        const int endCol = column() + columnSpan() - 1;
237
 
17302 fschmid 238
        double maxWidth = 0.0;
239
        double currentWidth = 0.0;
16856 craig 240
        for (int currentCol = column(); currentCol <= endCol; ++currentCol)
241
        {
242
                TableCell cellBelow = d->table->cellAt(endRow + 1, currentCol);
243
                if (cellBelow.isValid())
244
                        currentWidth = collapseBorders(bottomBorder(), cellBelow.topBorder()).width();
245
                else
246
                        currentWidth = collapseBorders(d->table->bottomBorder(), bottomBorder()).width();
247
                maxWidth = qMax(maxWidth, currentWidth);
248
        }
249
 
250
        return maxWidth;
251
}
252
 
253
QDebug operator<<(QDebug debug, const TableCell& cell)
254
{
255
        debug.nospace() << cell.asString();
256
        return debug.space();
257
}