[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