[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    =?utf-8?q?=5Bcalligra=5D_words/part=3A_Implement_page-numbers_de?=
From:       Sebastian Sauer <sebastian.sauer () kdab ! com>
Date:       2011-06-03 19:23:02
Message-ID: 20110603192302.F03ACA60A4 () git ! kde ! org
[Download RAW message or body]

Git commit 442fd18cd34d6eb828d7426c69d17e3e02f04e2b by Sebastian Sauer.
Committed on 03/06/2011 at 21:20.
Pushed by sebsauer into branch 'master'.

Implement page-numbers defined via KoParagraphStyle::PageNumber.
This fixes the pager-numbers on the last 2 pages at the document attached to bug \
260219.

M  +31   -14   words/part/KWPage.cpp     
M  +8    -4    words/part/KWPage.h     
M  +9    -2    words/part/KWPageManager.cpp     
M  +3    -6    words/part/KWPageManager_p.h     
M  +10   -2    words/part/KWRootAreaProvider.cpp     

http://commits.kde.org/calligra/442fd18cd34d6eb828d7426c69d17e3e02f04e2b

diff --git a/words/part/KWPage.cpp b/words/part/KWPage.cpp
index cf3f145..61e4f4d 100644
--- a/words/part/KWPage.cpp
+++ b/words/part/KWPage.cpp
@@ -28,12 +28,10 @@
 
 #include <KDebug>
 
-void KWPage::setPageNumber(int pageNumber)
+void KWPage::setVisiblePageNumber(int pageNumber)
 {
-    Q_ASSERT_X(false, __FUNCTION__, "Changing the page-number afterwards needs to \
invalidate lots of stuff including whatever is done in the KWRootAreaProvider. The \
                better way would be to make this dynamic.");
-
     if (isValid())
-        priv->setPageNumberForId(n, pageNumber);
+        priv->setVisiblePageNumber(n, pageNumber);
 }
 
 bool KWPage::isValid() const
@@ -81,12 +79,10 @@ void KWPage::setPageSide(PageSide ps)
     if (page.pageSide == ps)
         return;
 
-    const bool needsRenumbering = (page.pageSide == PageSpread && ps != PageSpread) \
|| ps == PageSpread; +    //const bool needsRenumbering = (page.pageSide == \
PageSpread && ps != PageSpread) || ps == PageSpread;  page.pageSide = ps;
     priv->pages.insert(n, page);
-
-    if (needsRenumbering)
-        priv->setPageNumberForId(n, page.pageNumber);
+    //if (needsRenumbering) priv->setVisiblePageNumber(n, page.pageNumber);
 }
 
 KWPage::PageSide KWPage::pageSide() const
@@ -344,15 +340,36 @@ int KWPage::visiblePageNumber(PageSelection select, int \
adjustment) const  if (! page.isValid())
         return -1;
 
+    int pageNumber = 0;
+    if (select != KoTextPage::CurrentPage) {
+        pageNumber = page.visiblePageNumber();
+    } else {
+        int n = page.pageNumber();
+        if (priv->visiblePageNumbers.contains(n))
+            pageNumber = priv->visiblePageNumbers[n];
+    }
+
+    if (pageNumber == 0) {
+        if (page.pageNumber() == 1) {
+            pageNumber = 1;
+        } else {
+            pageNumber = -1;
+            page = page.previous();
+            if (page.isValid()) {
+                int n = page.visiblePageNumber();
+                if (n >= 1)
+                    pageNumber = n + 1;
+            }
+        }
+    }
+
     if (adjustment != 0) {
-        const int wantedPageNumber = page.pageNumber() + adjustment;
-        Q_ASSERT(page.priv); // it would have been invalid above otherwise
-        if (! page.priv->pageNumbers.contains(wantedPageNumber))
-            return -1; // doesn't exist.
-        return wantedPageNumber;
+        pageNumber += adjustment;
+        if (!page.priv->pageNumbers.contains(pageNumber))
+            pageNumber = -1; // doesn't exist.
     }
 
-    return page.pageNumber();
+    return pageNumber;
 }
 
 QString KWPage::masterPageName() const
diff --git a/words/part/KWPage.h b/words/part/KWPage.h
index 8a15e4d..194cc46 100644
--- a/words/part/KWPage.h
+++ b/words/part/KWPage.h
@@ -113,11 +113,15 @@ public:
     virtual int pageNumber() const;
 
     /**
-     * Adjusts the page number of this page and all pages following.
-     * Page numbers that are set like this are never saved, this is runtime data \
                only.
-     * Instead you should insert a pagraph in the main-text flow with the new page \
number. +     * Adjusts the visible page number of this page.
+     *
+     * This implements hard-coded page numbers like those defined via @a \
KoParagraphStyle::PageNumber . If +     * the page number equals zero then the page \
has an auto page number. That means previous page number +     * plus one.
+     *
+     * @param pageNumber The visible page-number for this page.
      */
-    void setPageNumber(int pageNumber);
+    void setVisiblePageNumber(int pageNumber);
 
     /// reimplemented from KoTextPage
     virtual QString masterPageName() const;
diff --git a/words/part/KWPageManager.cpp b/words/part/KWPageManager.cpp
index 87a7b14..8f622a7 100644
--- a/words/part/KWPageManager.cpp
+++ b/words/part/KWPageManager.cpp
@@ -72,11 +72,11 @@ void KWPageManagerPrivate::setPageOffset(int pageNum, qreal \
offset)  pageOffsets[pageNum] = offset;
 }
 
-void KWPageManagerPrivate::setPageNumberForId(int pageId, int newPageNumber)
+void KWPageManagerPrivate::setVisiblePageNumber(int pageId, int newPageNumber)
 {
+#if 0
     if (pageNumbers.isEmpty() || ! pages.contains(pageId))
         return;
-
     const int oldPageNumber = pages[pageId].pageNumber;
     int diff = newPageNumber - oldPageNumber;
     int from = oldPageNumber;
@@ -119,6 +119,12 @@ void KWPageManagerPrivate::setPageNumberForId(int pageId, int \
newPageNumber)  }
 
     Q_ASSERT(pages.count() == oldPages.count()); // don't loose anything :)
+#else
+    if (newPageNumber >= 0)
+        visiblePageNumbers[pageId] = newPageNumber;
+    else
+        visiblePageNumbers.remove(pageId);
+#endif
 }
 
 void KWPageManagerPrivate::insertPage(const Page &newPage)
@@ -348,6 +354,7 @@ void KWPageManager::removePage(const KWPage &page)
     const int removedPageNumber = page.pageNumber();
     const int offset = page.pageSide() == KWPage::PageSpread ? 2 : 1;
     d->pages.remove(d->pageNumbers[removedPageNumber]);
+    d->visiblePageNumbers.remove(removedPageNumber);
 
     // decrease the pagenumbers of pages following the pageNumber
     QMap<int, int> pageNumbers = d->pageNumbers;
diff --git a/words/part/KWPageManager_p.h b/words/part/KWPageManager_p.h
index 5cf55dc..103e042 100644
--- a/words/part/KWPageManager_p.h
+++ b/words/part/KWPageManager_p.h
@@ -52,13 +52,8 @@ public:
     void setPageOffset(int pageNum, qreal offset);
     qreal pageOffset(int pageNum) const;
 
-    /**
-     * Update the page number for the page related to the pageId and also update the
-     * page number of all pages following the page.
-     */
-    void setPageNumberForId(int pageId, int newPageNumber);
+    void setVisiblePageNumber(int pageId, int newPageNumber);
 
-    /// helper method for the commands.
     void insertPage(const Page &page);
 
     // use a sorted map to find page the identifier for page objects based on the \
page number. @@ -67,6 +62,8 @@ public:
     // use a fast access hash to store the page objects, sorted by their identifier
     QHash<int, Page> pages; // pageId to page struct
 
+    QMap<int, int> visiblePageNumbers;
+
     int lastId; // pageIds are distributed serially,
 
     bool preferPageSpread;
diff --git a/words/part/KWRootAreaProvider.cpp b/words/part/KWRootAreaProvider.cpp
index c669450..757646d 100755
--- a/words/part/KWRootAreaProvider.cpp
+++ b/words/part/KWRootAreaProvider.cpp
@@ -52,8 +52,9 @@ class KWTextLayoutRootArea : public KoTextLayoutRootArea
             kDebug();
         }
         virtual bool layout(FrameIterator *cursor) {
-            kDebug(32001) << "pageNumber=" << m_pageNumber << "frameSetType=" << \
KWord::frameSetTypeName(m_frameSet->textFrameSetType()) << "isDirty=" << isDirty(); + \
kDebug() << "START pageNumber=" << m_pageNumber << "frameSetType=" << \
KWord::frameSetTypeName(m_frameSet->textFrameSetType()) << "isDirty=" << isDirty();  \
bool ok = KoTextLayoutRootArea::layout(cursor); +            kDebug() << "END \
pageNumber=" << m_pageNumber << "frameSetType=" << \
KWord::frameSetTypeName(m_frameSet->textFrameSetType()) << "isDirty=" << isDirty();  \
return ok;  }
         KWTextFrameSet *m_frameSet;
@@ -161,6 +162,7 @@ KoTextLayoutRootArea \
                *KWRootAreaProvider::provide(KoTextDocumentLayout *document
             // Create missing KWPage's (they will also create a KWFrame and \
TextShape per page)  for(int i = pageManager->pageCount(); i < pageNumber; ++i) {
                 QString masterPageName;
+                int visiblePageNumber = -1;
                 QList<KoTextLayoutRootArea *> rootAreasBefore = m_pages[i - \
1]->rootAreas;  if (!rootAreasBefore.isEmpty()) {
                     //FIXME this assumes that a) endTextFrameIterator() will return \
the starting-it of the @@ -171,10 +173,16 @@ KoTextLayoutRootArea \
*KWRootAreaProvider::provide(KoTextDocumentLayout *document  QTextBlock firstBlock = \
it.currentBlock();  if (firstBlock.isValid()) {
                         masterPageName = \
firstBlock.blockFormat().property(KoParagraphStyle::MasterPageName).toString(); +     \
bool ok; +                        int num = \
firstBlock.blockFormat().property(KoParagraphStyle::PageNumber).toInt(&ok); +         \
if (ok) +                            visiblePageNumber = num;
                     }
                 }
                 KWPage page = kwdoc->appendPage(masterPageName);
                 Q_ASSERT(page.isValid());
+                if (visiblePageNumber >= 0)
+                    page.setVisiblePageNumber(visiblePageNumber);
             }
         } else if (pageNumber > pageManager->pageCount()) {
             if (KWord::isHeaderFooter(m_textFrameSet)) {
@@ -284,7 +292,7 @@ void KWRootAreaProvider::doPostLayout(KoTextLayoutRootArea \
*rootArea, bool isNew  Q_ASSERT(data);
     bool isHeaderFooter = KWord::isHeaderFooter(m_textFrameSet);
 
-    kDebug(32001) << "pageNumber=" << page.pageNumber() << "frameSetType=" << \
KWord::frameSetTypeName(m_textFrameSet->textFrameSetType()) << "isNewRootArea=" << \
isNewRootArea << "rootArea=" << rootArea << "size=" << \
rootArea->associatedShape()->size(); +    kDebug(32001) << "pageNumber=" << \
page.pageNumber() << "frameSetType=" << \
KWord::frameSetTypeName(m_textFrameSet->textFrameSetType()) << "isNewRootArea=" << \
isNewRootArea << "rootArea=" << rootArea << "isDirty=" << rootArea->isDirty();  
     QRectF updateRect = rootArea->associatedShape()->outlineRect();
     //rootArea->associatedShape()->update(updateRect);


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic