[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: koffice/kword/part
From: Thomas Zander <zander () kde ! org>
Date: 2010-08-29 21:02:46
Message-ID: 20100829210246.E268AAC88F () svn ! kde ! org
[Download RAW message or body]
SVN commit 1169684 by zander:
Add tests and fixes for frame layout
Add various tests for using more than one page style and managing
the frames and framesets for cases like when a page changes style.
M +1 -0 KWord.cpp
M +40 -21 frames/KWFrameLayout.cpp
M +11 -2 frames/KWFrameLayout.h
M +134 -2 tests/TestFrameLayout.cpp
M +2 -0 tests/TestFrameLayout.h
--- trunk/koffice/kword/part/KWord.cpp #1169683:1169684
@@ -24,6 +24,7 @@
{
bool isAutoGenerated(KWFrameSet *fs)
{
+ Q_ASSERT(fs);
if (fs->type() == BackgroundFrameSet)
return true;
if (fs->type() == TextFrameSet) {
--- trunk/koffice/kword/part/frames/KWFrameLayout.cpp #1169683:1169684
@@ -69,35 +69,49 @@
if (shouldHaveHeaderOrFooter(pageNumber, true, &origin)) {
allHFTypes.removeAll(origin);
KWTextFrameSet *fs = getOrCreate(origin, page);
- if (!hasFrameOn(fs, pageNumber))
+ if (!frameOn(fs, pageNumber))
createCopyFrame(fs, page);
}
if (shouldHaveHeaderOrFooter(pageNumber, false, &origin)) {
allHFTypes.removeAll(origin);
KWTextFrameSet *fs = getOrCreate(origin, page);
- if (!hasFrameOn(fs, pageNumber))
+ if (!frameOn(fs, pageNumber))
createCopyFrame(fs, page);
}
+ if (page.pageStyle().background()) {
// create page background
if (!m_backgroundFrameSet) {
m_backgroundFrameSet = new KWFrameSet(KWord::BackgroundFrameSet);
m_backgroundFrameSet->setName("backgroundFrames");
+ emit newFrameSet(m_backgroundFrameSet);
+ Q_ASSERT(m_frameSets.contains(m_backgroundFrameSet)); // the emit should \
have made that so :) }
- if (!hasFrameOn(m_backgroundFrameSet, pageNumber)) {
+ KWFrame *background = frameOn(m_backgroundFrameSet, pageNumber);
+ if (background == 0) {
KoShape *shape = new KWPageBackground();
shape->setPosition(QPointF(0, page.offsetInDocument()));
- KWFrame *f = new KWFrame(shape, m_backgroundFrameSet);
- f->setTextRunAround(KWord::RunThrough);
+ background = new KWFrame(shape, m_backgroundFrameSet);
+ background->setTextRunAround(KWord::RunThrough);
// TODO pagespread
}
+ background->shape()->setBackground(page.pageStyle().background());
+ } else {
+ // check if there is a frame, if so, delete it, we don't need it.
+ KWFrame *background = frameOn(m_backgroundFrameSet, pageNumber);
+ if (background)
+ delete background->shape();
+ }
// delete headers/footer frames that are not needed on this page
foreach (KWFrame *frame, framesInPage(page.rect())) {
- KWTextFrameSet *tfs = dynamic_cast<KWTextFrameSet*>(frame->frameSet());
- if (tfs && allHFTypes.contains(tfs->textFrameSetType())) {
+ if (frame->frameSet()->type() != KWord::TextFrameSet)
+ continue;
+ KWTextFrameSet *tfs = static_cast<KWTextFrameSet*>(frame->frameSet());
+ if (tfs && (allHFTypes.contains(tfs->textFrameSetType())
+ || (tfs->pageStyle() != page.pageStyle() && \
KWord::isHeaderFooter(tfs)))) { tfs->removeFrame(frame);
- delete frame;
+ delete frame->shape();
}
}
@@ -114,7 +128,7 @@
columns--;
if (columns < 0) {
fs->removeFrame(frame);
- delete frame;
+ delete frame->shape();
}
}
}
@@ -146,12 +160,12 @@
PageSpreadShapeFactory factory(this);
if (shouldHaveHeaderOrFooter(pageNumber + 1, true, &origin)) {
KWTextFrameSet *fs = getOrCreate(origin, m_pageManager->page(pageNumber \
+ 1));
- if (!hasFrameOn(fs, pageNumber + 1))
+ if (!frameOn(fs, pageNumber + 1))
factory.create(page, fs);
}
if (shouldHaveHeaderOrFooter(pageNumber + 1, false, &origin)) {
KWTextFrameSet *fs = getOrCreate(origin, m_pageManager->page(pageNumber \
+ 1));
- if (!hasFrameOn(fs, pageNumber + 1))
+ if (!frameOn(fs, pageNumber + 1))
factory.create(page, fs);
}
if (page.pageStyle().hasMainTextFrame()) {
@@ -444,7 +458,7 @@
return true;
}
-QList<KWFrame *> KWFrameLayout::framesInPage(const QRectF &page)
+QList<KWFrame *> KWFrameLayout::framesInPage(const QRectF &page) const
{
// hopefully replaced with a tree
QList<KWFrame*> answer;
@@ -480,9 +494,7 @@
answer = &m_maintext;
break;
default:
- KWTextFrameSet *newFS = new KWTextFrameSet(m_document);
- emit newFrameSet(newFS);
- return newFS;
+ Q_ASSERT(false); // we should never get asked for 'other'
}
Q_ASSERT(answer);
if (*answer == 0) { // it wasn't created yet, lets do so now.
@@ -503,6 +515,7 @@
if (m_setup)
return;
+ KWTextFrameSet *oldMainText = m_maintext;
m_maintext = 0;
m_backgroundFrameSet = 0;
m_pageStyles.clear();
@@ -526,9 +539,15 @@
frameSets.evenFooters = tfs;
break;
case KWord::MainTextFrameSet:
+ Q_ASSERT(m_maintext == 0); // there can be only one!
+ if (tfs != oldMainText) {
+ oldMainText = 0;
+ disconnect(tfs, SIGNAL(frameRemoved(KWFrame*)),
+ this, SLOT(mainframeRemoved(KWFrame*)));
+ connect(tfs, SIGNAL(frameRemoved(KWFrame*)),
+ this, SLOT(mainframeRemoved(KWFrame*)));
+ }
m_maintext = tfs;
- disconnect(tfs, SIGNAL(frameRemoved(KWFrame*)), this, \
SLOT(mainframeRemoved(KWFrame*)));
- connect(tfs, SIGNAL(frameRemoved(KWFrame*)), this, \
SLOT(mainframeRemoved(KWFrame*))); default: ;// ignore
}
if (tfs->pageStyle().isValid())
@@ -551,15 +570,15 @@
return shape;
}
-bool KWFrameLayout::hasFrameOn(KWFrameSet *fs, int pageNumber)
+KWFrame *KWFrameLayout::frameOn(KWFrameSet *fs, int pageNumber) const
{
KWPage page = m_pageManager->page(pageNumber);
Q_ASSERT(page.isValid());
foreach (KWFrame *frame, framesInPage(page.rect())) {
if (frame->frameSet() == fs)
- return true;
+ return frame;
}
- return false;
+ return 0;
}
void KWFrameLayout::cleanupHeadersFooters()
@@ -734,7 +753,7 @@
QList<KWFrame*> framesToDelete;
foreach (KWFrameSet *fs, m_frameSets) {
KWTextFrameSet *tfs = dynamic_cast<KWTextFrameSet*> (fs);
- if (!KWord::isAutoGenerated(tfs))
+ if (!tfs || !KWord::isAutoGenerated(tfs))
continue;
const bool isMainFs = fs == m_maintext;
foreach (KWFrame *f, fs->frames()) {
--- trunk/koffice/kword/part/frames/KWFrameLayout.h #1169683:1169684
@@ -122,11 +122,20 @@
};
KoShape *createTextShape(const KWPage &page);
+ /**
+ * Get or create a text frameset of the specified \a type on the specified \a \
page. + * A page follows a KWPageStyle and we have individual framesets for each \
style. + * This means that in a document there can be many framesets of type \
odd-header, at + * most one for each page style. The same for all other text \
framesets. + * This method figures out which frameset fits with the page and \
returns it, or + * if it did not exist yet it creates it.
+ * \note the main text frameset is consistent across all pages and page styles.
+ */
KWTextFrameSet *getOrCreate(KWord::TextFrameSetType type, const KWPage &page);
- QList<KWFrame *> framesInPage(const QRectF &page);
+ QList<KWFrame *> framesInPage(const QRectF &page) const;
void setup();
bool shouldHaveHeaderOrFooter(int pageNumber, bool header, \
KWord::TextFrameSetType *origin);
- bool hasFrameOn(KWFrameSet *fs, int pageNumber);
+ KWFrame *frameOn(KWFrameSet *fs, int pageNumber) const;
void cleanFrameSet(KWTextFrameSet *fs);
KWFrame* createCopyFrame(KWFrameSet *fs, const KWPage &page);
--- trunk/koffice/kword/part/tests/TestFrameLayout.cpp #1169683:1169684
@@ -11,6 +11,7 @@
#include "../KWord.h"
#include <KoTextDocumentLayout.h>
+#include <KoColorBackground.h>
#include <QTextCursor>
#include <kcomponentdata.h>
@@ -77,13 +78,13 @@
KWTextFrameSet *main = bfl.getOrCreate(KWord::MainTextFrameSet, page);
QVERIFY(main);
- QCOMPARE(bfl.hasFrameOn(main, 1), false);
+ QVERIFY(bfl.frameOn(main, 1) == 0);
KoShape *shape = new MockTextShape();
new KWTextFrame(shape, main);
QCOMPARE(main->frameCount(), 1);
- QCOMPARE(bfl.hasFrameOn(main, 1), true);
+ QVERIFY(bfl.frameOn(main, 1));
bfl.createNewFramesForPage(1);
QCOMPARE(main->frameCount(), 1);
@@ -437,6 +438,137 @@
QCOMPARE(fs->frames()[1]->shape()->size(), QSizeF(155, 157));
}
+void TestFrameLayout::testPageStyle()
+{
+ // on different page styles i want different framesets.
+ // changing a page (in a sequence) to get a different style should
+ // thus delete all auto-generated frames on that page and force
+ // new ones to be created.
+
+ Helper helper;
+ m_frames.clear();
+ KWFrameLayout bfl(helper.pageManager, m_frames);
+ connect(&bfl, SIGNAL(newFrameSet(KWFrameSet*)), this, SLOT(addFS(KWFrameSet*)));
+
+ KWPage page1 = helper.pageManager->page(1);
+ page1.pageStyle().setHeaderPolicy(KWord::HFTypeUniform);
+
+ KWPageStyle style2 = page1.pageStyle();
+ style2.detach("Style2"); // make it a copy of first style, but with new name
+ helper.pageManager->addPageStyle(style2);
+ KWPage page2 = helper.pageManager->appendPage();
+ QCOMPARE(page1.pageStyle(), page2.pageStyle());
+ KWPage page3 = helper.pageManager->appendPage(style2);
+ QCOMPARE(page3.pageStyle(), style2);
+ KWPage page4 = helper.pageManager->appendPage();
+ QCOMPARE(page1.pageStyle(), page2.pageStyle());
+ QCOMPARE(page3.pageStyle(), style2);
+ QCOMPARE(page4.pageStyle(), style2);
+
+ bfl.createNewFramesForPage(1);
+ // mainFs is special; there is only one across all page styles
+ QVERIFY(bfl.m_maintext);
+ KWTextFrameSet *mainFs = bfl.getOrCreate(KWord::MainTextFrameSet, page1);
+ QCOMPARE(bfl.m_maintext, mainFs);
+ bfl.createNewFramesForPage(2);
+ QCOMPARE(bfl.getOrCreate(KWord::MainTextFrameSet, page2), mainFs);
+ QVERIFY(!bfl.m_pageStyles.contains(style2));
+ bfl.createNewFramesForPage(3);
+ QVERIFY(bfl.m_pageStyles.contains(style2));
+ QCOMPARE(bfl.getOrCreate(KWord::MainTextFrameSet, page3), mainFs);
+ bfl.createNewFramesForPage(4);
+ QCOMPARE(bfl.getOrCreate(KWord::MainTextFrameSet, page1), mainFs);
+ QCOMPARE(bfl.getOrCreate(KWord::MainTextFrameSet, page2), mainFs);
+ QCOMPARE(bfl.getOrCreate(KWord::MainTextFrameSet, page3), mainFs);
+ QCOMPARE(bfl.getOrCreate(KWord::MainTextFrameSet, page4), mainFs);
+
+ KWFrameLayout::FrameSets fsets1 = bfl.m_pageStyles.value(page1.pageStyle());
+ KWFrameLayout::FrameSets fsets2 = bfl.m_pageStyles.value(style2);
+ QVERIFY(fsets1.oddHeaders);
+ QVERIFY(fsets2.oddHeaders);
+ QVERIFY(fsets1.oddHeaders != fsets2.oddHeaders);
+ QCOMPARE(bfl.getOrCreate(KWord::OddPagesHeaderTextFrameSet, page1), \
fsets1.oddHeaders); + QCOMPARE(bfl.getOrCreate(KWord::OddPagesHeaderTextFrameSet, \
page2), fsets1.oddHeaders); + \
QCOMPARE(bfl.getOrCreate(KWord::OddPagesHeaderTextFrameSet, page3), \
fsets2.oddHeaders); + QCOMPARE(bfl.getOrCreate(KWord::OddPagesHeaderTextFrameSet, \
page4), fsets2.oddHeaders); + QCOMPARE(fsets1.oddHeaders->frameCount(), 2);
+ QCOMPARE(fsets2.oddHeaders->frameCount(), 2);
+
+ QVERIFY(bfl.frameOn(fsets1.oddHeaders, 1));
+ QVERIFY(bfl.frameOn(fsets1.oddHeaders, 2));
+ QVERIFY(bfl.frameOn(fsets1.oddHeaders, 3) == 0);
+ QVERIFY(bfl.frameOn(fsets1.oddHeaders, 4) == 0);
+
+ QVERIFY(bfl.frameOn(fsets2.oddHeaders, 1) == 0);
+ QVERIFY(bfl.frameOn(fsets2.oddHeaders, 2) == 0);
+ QVERIFY(bfl.frameOn(fsets2.oddHeaders, 3));
+ QVERIFY(bfl.frameOn(fsets2.oddHeaders, 4));
+
+ // now we change one and check if the frame moved
+ page2.setPageStyle(style2);
+ bfl.createNewFramesForPage(2);
+
+ fsets1 = bfl.m_pageStyles.value(page1.pageStyle());
+ fsets2 = bfl.m_pageStyles.value(style2);
+ QVERIFY(fsets1.oddHeaders);
+ QVERIFY(fsets2.oddHeaders);
+ QVERIFY(fsets1.oddHeaders != fsets2.oddHeaders);
+ QVERIFY(bfl.frameOn(fsets1.oddHeaders, 1));
+ QVERIFY(bfl.frameOn(fsets1.oddHeaders, 2) == 0);
+ QVERIFY(bfl.frameOn(fsets1.oddHeaders, 3) == 0);
+ QVERIFY(bfl.frameOn(fsets1.oddHeaders, 4) == 0);
+
+ QVERIFY(bfl.frameOn(fsets2.oddHeaders, 1) == 0);
+ QVERIFY(bfl.frameOn(fsets2.oddHeaders, 2));
+ QVERIFY(bfl.frameOn(fsets2.oddHeaders, 3));
+ QVERIFY(bfl.frameOn(fsets2.oddHeaders, 4));
+ QCOMPARE(bfl.getOrCreate(KWord::OddPagesHeaderTextFrameSet, page1), \
fsets1.oddHeaders); + QCOMPARE(bfl.getOrCreate(KWord::OddPagesHeaderTextFrameSet, \
page2), fsets2.oddHeaders); + \
QCOMPARE(bfl.getOrCreate(KWord::OddPagesHeaderTextFrameSet, page3), \
fsets2.oddHeaders); + QCOMPARE(bfl.getOrCreate(KWord::OddPagesHeaderTextFrameSet, \
page4), fsets2.oddHeaders); + QCOMPARE(fsets1.oddHeaders->frameCount(), 1);
+ QCOMPARE(fsets2.oddHeaders->frameCount(), 3);
+}
+
+void TestFrameLayout::testPageBackground()
+{
+ // creating a page with a pagestyle that has a background set should
+ // trigger the creation of a shape that draws the page-background.
+ // If there is no background or its removed (in a command) that should
+ // remove the frame.
+ Helper helper;
+ m_frames.clear();
+ KWFrameLayout bfl(helper.pageManager, m_frames);
+ connect(&bfl, SIGNAL(newFrameSet(KWFrameSet*)), this, SLOT(addFS(KWFrameSet*)));
+
+ KWPage page1 = helper.pageManager->page(1);
+ KoColorBackground background1(Qt::red);
+ page1.pageStyle().setBackground(&background1);
+
+ KWPageStyle style2("No Background");
+ helper.pageManager->addPageStyle(style2);
+ KWPage page2 = helper.pageManager->appendPage();
+ KWPage page3 = helper.pageManager->appendPage(style2);
+ KWPage page4 = helper.pageManager->appendPage();
+
+ QVERIFY(bfl.m_backgroundFrameSet == 0);
+ bfl.createNewFramesForPage(1);
+ QVERIFY(bfl.m_backgroundFrameSet);
+ QCOMPARE(bfl.m_backgroundFrameSet->frameCount(), 1);
+ bfl.createNewFramesForPage(2);
+ QCOMPARE(bfl.m_backgroundFrameSet->frameCount(), 2);
+ bfl.createNewFramesForPage(3);
+ QVERIFY(bfl.m_backgroundFrameSet);
+ QCOMPARE(bfl.m_backgroundFrameSet->frameCount(), 2);
+ bfl.createNewFramesForPage(4);
+ QCOMPARE(bfl.m_backgroundFrameSet->frameCount(), 2);
+
+ foreach (KWFrame *frame, bfl.m_backgroundFrameSet->frames()) {
+ QCOMPARE(frame->shape()->background(), page1.pageStyle().background());
+ }
+}
+
+
// helper method (slot)
void TestFrameLayout::addFS(KWFrameSet*fs)
{
--- trunk/koffice/kword/part/tests/TestFrameLayout.h #1169683:1169684
@@ -25,6 +25,8 @@
void testCreateNewFrameForPage();
void testLargeHeaders();
void testLayoutPageSpread();
+ void testPageStyle();
+ void testPageBackground();
// helper
void addFS(KWFrameSet*);
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic