1
#include "TestBasicLayout.h"
2
#include "TestDocumentLayout.h"
4
#include "../KWPageManager.h"
6
#include "../KWPageStyle.h"
7
#include "../frames/KWFrameLayout.h"
8
#include "../frames/KWTextFrameSet.h"
9
#include "../frames/KWTextFrame.h"
10
#include "../KWDocument.h"
13
#include <KoTextDocumentLayout.h>
14
#include <QTextCursor>
16
#include <kcomponentdata.h>
22
pageManager = new KWPageManager();
23
KWPage page = pageManager->appendPage();
24
KoPageLayout pageLayout = page.pageStyle().pageLayout();
25
pageLayout.width = 200;
26
pageLayout.height = 200;
27
page.pageStyle().setPageLayout(pageLayout);
28
pageStyle = page.pageStyle();
34
KWPageManager *pageManager;
35
KWPageStyle pageStyle;
38
TestBasicLayout::TestBasicLayout()
40
new KComponentData("TestBasicLayout");
43
void TestBasicLayout::testGetOrCreateFrameSet()
47
KWPage page = helper.pageManager->page(1);
48
KWFrameLayout bfl(helper.pageManager, m_frames);
49
connect(&bfl, SIGNAL(newFrameSet(KWFrameSet*)), this, SLOT(addFS(KWFrameSet*)));
51
KWTextFrameSet *fs = bfl.getOrCreate(KWord::OddPagesHeaderTextFrameSet, page);
53
QCOMPARE(fs->textFrameSetType(), KWord::OddPagesHeaderTextFrameSet);
55
KWTextFrameSet *fs2 = bfl.getOrCreate(KWord::OddPagesHeaderTextFrameSet, page);
58
QVERIFY(m_frames.contains(fs2));
60
KWTextFrameSet *main = new KWTextFrameSet(0, KWord::MainTextFrameSet);
61
m_frames.append(main);
63
KWTextFrameSet *main2 = bfl.getOrCreate(KWord::MainTextFrameSet, page);
65
QCOMPARE(main, main2);
66
QCOMPARE(main->textFrameSetType(), KWord::MainTextFrameSet);
69
void TestBasicLayout::testCreateNewFramesForPage()
73
QVERIFY(m_frames.count() == 0);
74
KWFrameLayout bfl(helper.pageManager, m_frames);
75
KWPage page = helper.pageManager->page(1);
76
connect(&bfl, SIGNAL(newFrameSet(KWFrameSet*)), this, SLOT(addFS(KWFrameSet*)));
78
KWTextFrameSet *main = bfl.getOrCreate(KWord::MainTextFrameSet, page);
80
QCOMPARE(bfl.hasFrameOn(main, 1), false);
82
KoShape *shape = new MockTextShape();
83
new KWTextFrame(shape, main);
84
QCOMPARE(main->frameCount(), 1);
86
QCOMPARE(bfl.hasFrameOn(main, 1), true);
88
bfl.createNewFramesForPage(1);
89
QCOMPARE(main->frameCount(), 1);
92
void TestBasicLayout::testShouldHaveHeaderOrFooter()
96
KWFrameLayout bfl(helper.pageManager, m_frames);
97
connect(&bfl, SIGNAL(newFrameSet(KWFrameSet*)), this, SLOT(addFS(KWFrameSet*)));
99
// test the first page
100
helper.pageStyle.setHeaderPolicy(KWord::HFTypeNone);
101
helper.pageStyle.setFooterPolicy(KWord::HFTypeNone);
102
KWord::TextFrameSetType origin;
103
QCOMPARE(bfl.shouldHaveHeaderOrFooter(1, true, &origin), false); // header
104
QCOMPARE(bfl.shouldHaveHeaderOrFooter(1, false, &origin), false); // footer
106
helper.pageStyle.setHeaderPolicy(KWord::HFTypeEvenOdd);
107
helper.pageStyle.setFooterPolicy(KWord::HFTypeUniform);
108
QCOMPARE(bfl.shouldHaveHeaderOrFooter(1, true, &origin), true);
109
QCOMPARE(origin, KWord::OddPagesHeaderTextFrameSet);
110
QCOMPARE(bfl.shouldHaveHeaderOrFooter(1, false, &origin), true);
111
QCOMPARE(origin, KWord::OddPagesFooterTextFrameSet);
113
helper.pageStyle.setHeaderPolicy(KWord::HFTypeUniform);
114
helper.pageStyle.setFooterPolicy(KWord::HFTypeEvenOdd);
115
QCOMPARE(bfl.shouldHaveHeaderOrFooter(1, true, &origin), true);
116
QCOMPARE(origin, KWord::OddPagesHeaderTextFrameSet);
117
QCOMPARE(bfl.shouldHaveHeaderOrFooter(1, false, &origin), true);
118
QCOMPARE(origin, KWord::OddPagesFooterTextFrameSet);
120
// append the second page, same pageStyle like the first
121
helper.pageManager->appendPage();
122
QVERIFY(helper.pageManager->page(1).pageStyle() == helper.pageManager->page(2).pageStyle());
124
// append the theird page with another pagesettings
125
KWPageStyle pagesettings3("Page3PageStyle");
126
helper.pageManager->addPageStyle(pagesettings3);
127
helper.pageManager->appendPage(pagesettings3);
128
QVERIFY(helper.pageManager->page(3).pageStyle() == pagesettings3);
130
// test the second page
131
helper.pageStyle.setHeaderPolicy(KWord::HFTypeNone);
132
helper.pageStyle.setFooterPolicy(KWord::HFTypeNone);
133
QCOMPARE(bfl.shouldHaveHeaderOrFooter(2, true, &origin), false);
134
QCOMPARE(bfl.shouldHaveHeaderOrFooter(2, false, &origin), false);
136
helper.pageStyle.setHeaderPolicy(KWord::HFTypeEvenOdd);
137
helper.pageStyle.setFooterPolicy(KWord::HFTypeUniform);
138
QCOMPARE(bfl.shouldHaveHeaderOrFooter(2, true, &origin), true);
139
QCOMPARE(origin, KWord::EvenPagesHeaderTextFrameSet);
140
QCOMPARE(bfl.shouldHaveHeaderOrFooter(2, false, &origin), true);
141
QCOMPARE(origin, KWord::OddPagesFooterTextFrameSet);
144
pagesettings3.setHeaderPolicy(KWord::HFTypeEvenOdd);
145
pagesettings3.setFooterPolicy(KWord::HFTypeUniform);
146
QCOMPARE(bfl.shouldHaveHeaderOrFooter(3, true, &origin), true);
147
QCOMPARE(origin, KWord::OddPagesHeaderTextFrameSet);
148
QCOMPARE(bfl.shouldHaveHeaderOrFooter(3, false, &origin), true);
149
QCOMPARE(origin, KWord::OddPagesFooterTextFrameSet);
151
pagesettings3.setHeaderPolicy(KWord::HFTypeNone);
152
pagesettings3.setFooterPolicy(KWord::HFTypeNone);
153
QCOMPARE(bfl.shouldHaveHeaderOrFooter(3, true, &origin), false);
154
QCOMPARE(bfl.shouldHaveHeaderOrFooter(3, false, &origin), false);
156
// test the first and the second pages again to be sure they still have there prev values
157
QCOMPARE(bfl.shouldHaveHeaderOrFooter(1, true, &origin), true);
158
QCOMPARE(bfl.shouldHaveHeaderOrFooter(2, true, &origin), true);
161
void TestBasicLayout::headerPerPage()
165
KWPage page = helper.pageManager->begin();
166
KWFrameLayout bfl(helper.pageManager, m_frames);
167
connect(&bfl, SIGNAL(newFrameSet(KWFrameSet*)), this, SLOT(addFS(KWFrameSet*)));
169
KWPageStyle myStyle("myStyle");
170
myStyle.setHeaderPolicy(KWord::HFTypeUniform);
171
helper.pageManager->addPageStyle(myStyle);
172
KWPage page2 = helper.pageManager->appendPage(myStyle);
173
QVERIFY(page.pageStyle() != page2.pageStyle());
174
QCOMPARE(bfl.m_pageStyles.count(), 0);
176
KWTextFrameSet *fs = bfl.getOrCreate(KWord::OddPagesHeaderTextFrameSet, page);
178
QCOMPARE(fs->textFrameSetType(), KWord::OddPagesHeaderTextFrameSet);
180
QCOMPARE(bfl.m_pageStyles.count(), 1);
181
QVERIFY(bfl.m_pageStyles.contains(page.pageStyle()));
182
KWFrameLayout::FrameSets fsets = bfl.m_pageStyles[page.pageStyle()];
183
QCOMPARE(fsets.oddHeaders, fs);
184
QCOMPARE(fsets.evenHeaders, (void*) 0);
185
QCOMPARE(fsets.oddFooters, (void*) 0);
186
QCOMPARE(fsets.evenFooters, (void*) 0);
188
KWTextFrameSet *fs2 = bfl.getOrCreate(KWord::OddPagesHeaderTextFrameSet, page2);
190
QCOMPARE(fs2->textFrameSetType(), KWord::OddPagesHeaderTextFrameSet);
193
QCOMPARE(bfl.getOrCreate(KWord::OddPagesHeaderTextFrameSet, page2), fs2);
194
QCOMPARE(bfl.getOrCreate(KWord::OddPagesHeaderTextFrameSet, page), fs);
196
QCOMPARE(bfl.m_pageStyles.count(), 2);
197
QVERIFY(bfl.m_pageStyles.contains(page.pageStyle()));
198
QVERIFY(bfl.m_pageStyles.contains(page2.pageStyle()));
199
fsets = bfl.m_pageStyles[page.pageStyle()];
200
QCOMPARE(fsets.oddHeaders, fs);
201
QCOMPARE(fsets.evenHeaders, (void*) 0);
202
QCOMPARE(fsets.oddFooters, (void*) 0);
203
QCOMPARE(fsets.evenFooters, (void*) 0);
204
KWFrameLayout::FrameSets fsets2 = bfl.m_pageStyles[page2.pageStyle()];
205
QCOMPARE(fsets2.oddHeaders, fs2);
206
QCOMPARE(fsets2.evenHeaders, (void*) 0);
207
QCOMPARE(fsets2.oddFooters, (void*) 0);
208
QCOMPARE(fsets2.evenFooters, (void*) 0);
211
void TestBasicLayout::testFrameCreation()
215
KWFrameLayout bfl(helper.pageManager, m_frames);
216
connect(&bfl, SIGNAL(newFrameSet(KWFrameSet*)), this, SLOT(addFS(KWFrameSet*)));
218
KWPageStyle style = helper.pageManager->defaultPageStyle();
219
style.setHeaderPolicy(KWord::HFTypeUniform);
220
style.setHasMainTextFrame(true);
222
bfl.createNewFramesForPage(1);
223
QVERIFY(bfl.m_maintext != 0);
224
QCOMPARE(bfl.m_maintext->frameCount(), 1);
226
KWFrameLayout::FrameSets frameSets = bfl.m_pageStyles.value(style);
227
QVERIFY(frameSets.oddHeaders != 0);
228
QCOMPARE(frameSets.oddHeaders->frameCount(), 1);
229
QVERIFY(frameSets.evenHeaders == 0);
230
QVERIFY(frameSets.oddFooters == 0);
231
QVERIFY(frameSets.evenFooters == 0);
233
KoColumns columns = style.columns();
235
style.setColumns(columns);
238
bfl.createNewFramesForPage(1);
239
QCOMPARE(bfl.m_maintext->frameCount(), 2);
241
frameSets = bfl.m_pageStyles.value(style);
242
QVERIFY(frameSets.oddHeaders != 0);
243
QCOMPARE(frameSets.oddHeaders->frameCount(), 1);
244
QVERIFY(frameSets.evenHeaders == 0);
245
QVERIFY(frameSets.oddFooters == 0);
246
QVERIFY(frameSets.evenFooters == 0);
249
void TestBasicLayout::testCreateNewFrameForPage_data()
251
// tests void KWFrameLayout::createNewFrameForPage(KWTextFrameSet *fs, int pageNumber)
252
QTest::addColumn<QStringList>("pages");
253
QTest::addColumn<int>("frameSetType");
254
QTest::addColumn<int>("pageNumber");
255
QTest::addColumn<int>("expectedFrameCount");
257
QTest::newRow("noFooter1") << (QStringList() << QString("style1") << QString("style2")) <<
258
(int) KWord::OddPagesFooterTextFrameSet << 1 << 0;
259
QTest::newRow("noFooter2") << (QStringList() << QString("style1") << QString("style2")) <<
260
(int) KWord::EvenPagesFooterTextFrameSet << 1 << 0;
261
QTest::newRow("noFooter3") << (QStringList() << QString("style1") << QString("style2")) <<
262
(int) KWord::EvenPagesFooterTextFrameSet << 2 << 0;
264
QTest::newRow("noHeader1") << (QStringList() << QString("style1") << QString("style2")) <<
265
(int) KWord::OddPagesHeaderTextFrameSet << 1 << 0;
266
QTest::newRow("noHeader2") << (QStringList() << QString("style1") << QString("style2")) <<
267
(int) KWord::OddPagesHeaderTextFrameSet << 2 << 0;
268
QTest::newRow("noHeader3") << (QStringList() << QString("style1") << QString("style2")) <<
269
(int) KWord::EvenPagesHeaderTextFrameSet << 1 << 0;
271
QTest::newRow("oddHeader1") << (QStringList() << QString("style2") << QString("style2")) <<
272
(int) KWord::OddPagesHeaderTextFrameSet << 1 << 1;
273
QTest::newRow("oddHeader2") << (QStringList() << QString("style2") << QString("style2")) <<
274
(int) KWord::OddPagesHeaderTextFrameSet << 2 << 0;
275
QTest::newRow("evenHeader1") << (QStringList() << QString("style2") << QString("style2")) <<
276
(int) KWord::EvenPagesHeaderTextFrameSet << 1 << 0;
277
QTest::newRow("evenHeader2") << (QStringList() << QString("style2") << QString("style2")) <<
278
(int) KWord::EvenPagesHeaderTextFrameSet << 2 << 1;
280
QTest::newRow("main1") << (QStringList() << QString("style1") << QString("style3") << QString("style4")) <<
281
(int) KWord::MainTextFrameSet << 1 << 1;
282
QTest::newRow("main2") << (QStringList() << QString("style1") << QString("style3") << QString("style4")) <<
283
(int) KWord::MainTextFrameSet << 2 << 0;
284
QTest::newRow("main3") << (QStringList() << QString("style1") << QString("style3") << QString("style4")) <<
285
(int) KWord::MainTextFrameSet << 3 << 2;
286
QTest::newRow("main4") << (QStringList() << QString("style5")) <<
287
(int) KWord::MainTextFrameSet << 1 << 0;
289
QTest::newRow("footer1") << (QStringList() << QString("style3") << QString("style5") << QString("style2")) <<
290
(int) KWord::EvenPagesFooterTextFrameSet << 1 << 0; // uniform goes to the odd
291
QTest::newRow("footer2") << (QStringList() << QString("style3") << QString("style5") << QString("style2")) <<
292
(int) KWord::EvenPagesFooterTextFrameSet << 2 << 0;
293
QTest::newRow("footer3") << (QStringList() << QString("style3") << QString("style5") << QString("style2")) <<
294
(int) KWord::EvenPagesFooterTextFrameSet << 3 << 0; // uniform goes to the odd
296
QTest::newRow("footer4") << (QStringList() << QString("style3") << QString("style5") << QString("style2")) <<
297
(int) KWord::OddPagesFooterTextFrameSet << 1 << 1;
298
QTest::newRow("footer5") << (QStringList() << QString("style3") << QString("style5") << QString("style2")) <<
299
(int) KWord::OddPagesFooterTextFrameSet << 2 << 0;
300
QTest::newRow("footer6") << (QStringList() << QString("style3") << QString("style5") << QString("style2")) <<
301
(int) KWord::OddPagesFooterTextFrameSet << 3 << 1;
304
void TestBasicLayout::testCreateNewFrameForPage()
306
QFETCH(QStringList, pages);
307
QFETCH(int, frameSetType);
308
QFETCH(int, pageNumber);
309
QFETCH(int, expectedFrameCount);
311
QHash<QString, KWPageStyle> styles;
312
KWPageStyle style1("style1");
313
style1.setHeaderPolicy(KWord::HFTypeNone);
314
style1.setHasMainTextFrame(true);
315
style1.setFooterPolicy(KWord::HFTypeNone);
316
styles.insert(style1.name(), style1);
318
KWPageStyle style2("style2");
319
style2.setHeaderPolicy(KWord::HFTypeEvenOdd);
320
style2.setHasMainTextFrame(true);
321
style2.setFooterPolicy(KWord::HFTypeUniform);
322
styles.insert(style2.name(), style2);
324
KWPageStyle style3("style3"); // weird
325
style3.setHeaderPolicy(KWord::HFTypeEvenOdd);
326
style3.setHasMainTextFrame(false);
327
style3.setFooterPolicy(KWord::HFTypeUniform);
328
styles.insert(style3.name(), style3);
330
KWPageStyle style4("style4");
331
style4.setHeaderPolicy(KWord::HFTypeUniform);
332
style4.setHasMainTextFrame(true);
333
style4.setFooterPolicy(KWord::HFTypeEvenOdd);
336
columns.columnSpacing = 4;
337
style4.setColumns(columns);
338
styles.insert(style4.name(), style4);
340
KWPageStyle style5("style5"); // blank
341
style5.setHeaderPolicy(KWord::HFTypeNone);
342
style5.setHasMainTextFrame(false);
343
style5.setFooterPolicy(KWord::HFTypeNone);
344
style5.setColumns(columns);
345
styles.insert(style5.name(), style5);
347
KWPageManager manager;
348
foreach (const QString &styleName, pages) {
349
QVERIFY(styles.contains(styleName));
350
manager.appendPage(styles[styleName]);
354
KWTextFrameSet tfs(0, (KWord::TextFrameSetType) frameSetType);
356
KWFrameLayout frameLayout(&manager, m_frames);
357
connect(&frameLayout, SIGNAL(newFrameSet(KWFrameSet*)), this, SLOT(addFS(KWFrameSet*)));
359
KWPage page = manager.page(pageNumber);
360
QVERIFY(page.isValid());
361
tfs.setPageStyle(page.pageStyle());
363
frameLayout.createNewFramesForPage(pageNumber);
364
QCOMPARE(tfs.frameCount(), expectedFrameCount);
365
foreach(KWFrame *frame, tfs.frames()) {
366
QVERIFY (page.rect().contains(frame->shape()->position()));
370
void TestBasicLayout::testLargeHeaders()
372
// create a header with waaaaaaay to much text and do one page layout.
373
// Check if the header has been trunkated and no new page has been requested.
376
KWPage page = helper.pageManager->begin();
377
helper.pageStyle.setHeaderPolicy(KWord::HFTypeUniform);
379
KWFrameLayout bfl(helper.pageManager, m_frames);
380
connect(&bfl, SIGNAL(newFrameSet(KWFrameSet*)), this, SLOT(addFS(KWFrameSet*)));
382
KWTextFrameSet *fs = bfl.getOrCreate(KWord::OddPagesHeaderTextFrameSet, page);
384
QCOMPARE(fs->frameCount(), 0);
385
bfl.createNewFramesForPage(page.pageNumber());
386
QCOMPARE(fs->frameCount(), 1);
388
// now we have to make sure the header looks pretty full
389
KWTextFrame *tf = dynamic_cast<KWTextFrame*>(fs->frames().at(0));
391
tf->setMinimumFrameHeight(300);
392
bfl.layoutFramesOnPage(page.pageNumber());
393
QCOMPARE(fs->frameCount(), 1);
395
KoShape *shape = fs->frames()[0]->shape();
396
QVERIFY(shape->size().width() <= 200);
397
// the header can never be bigger than a page.
398
QVERIFY(shape->size().height() < 180);
400
// the header can never force the main text fs to get too small
401
KWTextFrameSet *mfs = bfl.getOrCreate(KWord::MainTextFrameSet, page);
403
QCOMPARE(mfs->frameCount(), 1);
404
shape = mfs->frames()[0]->shape();
405
QVERIFY(shape->size().height() >= 10);
408
// helper method (slot)
409
void TestBasicLayout::addFS(KWFrameSet*fs)
414
void TestBasicLayout::removeAllFrames()
416
foreach (KWFrameSet *fs, m_frames) {
417
foreach (KWFrame *frame, fs->frames()) {
418
fs->removeFrame(frame);
419
delete frame->shape();
424
QTEST_KDEMAIN(TestBasicLayout, GUI)
426
#include <TestBasicLayout.moc>