[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