[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: =?utf-8?q?=5Bcalligra=5D_/=3A_Invalidate_the_root-areas_if_a_KWF?=
From: Sebastian Sauer <sebastian.sauer () kdab ! com>
Date: 2011-04-30 20:12:45
Message-ID: 20110430201245.5E933A60A4 () git ! kde ! org
[Download RAW message or body]
Git commit 800591e0f80f05aa7043e16874e1380f54f1189f by Sebastian Sauer.
Committed on 30/04/2011 at 22:10.
Pushed by sebsauer into branch 'master'.
Invalidate the root-areas if a KWFrame goes out of scope.
M +7 -0 libs/textlayout/KoTextDocumentLayout.cpp
M +6 -0 libs/textlayout/KoTextDocumentLayout.h
M +1 -1 words/part/KWDocument.cpp
M +6 -2 words/part/KWRootAreaProvider.cpp
M +29 -2 words/part/frames/KWFrame.cpp
M +2 -0 words/part/frames/KWFrame.h
M +4 -3 words/part/frames/KWFrameLayout.cpp
http://commits.kde.org/calligra/800591e0f80f05aa7043e16874e1380f54f1189f
diff --git a/libs/textlayout/KoTextDocumentLayout.cpp \
b/libs/textlayout/KoTextDocumentLayout.cpp index 4d3bb8e..65a8ac6 100644
--- a/libs/textlayout/KoTextDocumentLayout.cpp
+++ b/libs/textlayout/KoTextDocumentLayout.cpp
@@ -588,6 +588,13 @@ QList<KoTextLayoutRootArea *> KoTextDocumentLayout::rootAreas() \
const return d->rootAreaList;
}
+void KoTextDocumentLayout::removeRootArea(KoTextLayoutRootArea *rootArea)
+{
+ int indexOf = rootArea ? qMax(0, d->rootAreaList.indexOf(rootArea)) : 0;
+ for(int i = d->rootAreaList.count() - 1; i >= indexOf; --i)
+ d->rootAreaList.removeAt(i);
+}
+
QList<KoShape*> KoTextDocumentLayout::shapes() const
{
QList<KoShape*> listOfShapes;
diff --git a/libs/textlayout/KoTextDocumentLayout.h \
b/libs/textlayout/KoTextDocumentLayout.h index 146dd10..1b923c7 100644
--- a/libs/textlayout/KoTextDocumentLayout.h
+++ b/libs/textlayout/KoTextDocumentLayout.h
@@ -153,6 +153,12 @@ public:
*/
KoTextLayoutRootArea *rootAreaForPosition(int position) const;
+ /**
+ * Remove the root-areas \p rootArea from the list of \a rootAreas() .
+ * \param rootArea root-area to remove. If NULL then all root-areas are removed.
+ */
+ void removeRootArea(KoTextLayoutRootArea *rootArea = 0);
+
/// reimplemented from QAbstractTextDocumentLayout
virtual void documentChanged(int position, int charsRemoved, int charsAdded);
diff --git a/words/part/KWDocument.cpp b/words/part/KWDocument.cpp
index 44c9cd3..94af1a3 100644
--- a/words/part/KWDocument.cpp
+++ b/words/part/KWDocument.cpp
@@ -399,7 +399,7 @@ void KWDocument::relayout()
KoToolManager::instance()->switchToolRequested(KoInteractionTool_ID);
// remove header/footer frames that are not visible.
- m_frameLayout.cleanupHeadersFooters();
+ //m_frameLayout.cleanupHeadersFooters();
// re-layout the pages
foreach (const KWPage &page, m_pageManager.pages()) {
diff --git a/words/part/KWRootAreaProvider.cpp b/words/part/KWRootAreaProvider.cpp
index 56e13b2..b80373c 100755
--- a/words/part/KWRootAreaProvider.cpp
+++ b/words/part/KWRootAreaProvider.cpp
@@ -45,8 +45,12 @@
class KWTextLayoutRootArea : public KoTextLayoutRootArea
{
public:
- KWTextLayoutRootArea(KoTextDocumentLayout *documentLayout, KWTextFrameSet \
*frameSet, const KWPage &page) : KoTextLayoutRootArea(documentLayout), \
m_frameSet(frameSet), m_page(page) {}
- virtual ~KWTextLayoutRootArea() {}
+ KWTextLayoutRootArea(KoTextDocumentLayout *documentLayout, KWTextFrameSet \
*frameSet, const KWPage &page) : KoTextLayoutRootArea(documentLayout), \
m_frameSet(frameSet), m_page(page) { + kDebug();
+ }
+ virtual ~KWTextLayoutRootArea() {
+ kDebug();
+ }
virtual bool layout(FrameIterator *cursor) {
kDebug(32001) << "pageNumber=" << m_page.pageNumber() << "frameSetType=" \
<< KWord::frameSetTypeName(m_frameSet->textFrameSetType()) << "isDirty=" << \
isDirty(); return KoTextLayoutRootArea::layout(cursor);
diff --git a/words/part/frames/KWFrame.cpp b/words/part/frames/KWFrame.cpp
index d2a201e..327a6b4 100644
--- a/words/part/frames/KWFrame.cpp
+++ b/words/part/frames/KWFrame.cpp
@@ -27,7 +27,10 @@
#include "KWOutlineShape.h"
#include "KoTextAnchor.h"
#include "KWPage.h"
+#include "KWRootAreaProvider.h"
#include <KoTextShapeData.h>
+#include <KoTextDocumentLayout.h>
+#include <KoTextLayoutRootArea.h>
#include <KoXmlWriter.h>
#include <kdebug.h>
@@ -66,11 +69,13 @@ KWFrame::~KWFrame()
KoShape *ourShape = m_shape;
m_shape = 0; // no delete is needed as the shape deletes us.
+
if (m_frameSet) {
bool justMe = m_frameSet->frameCount() == 1;
m_frameSet->removeFrame(this, ourShape); // first remove me so we won't get \
double
// deleted. ourShape is needed to \
mark any // copyShapes as retired
+ cleanupShape(ourShape);
if (justMe) {
kDebug(32001) << "Last KWFrame removed from frameSet=" << m_frameSet;
delete m_frameSet;
@@ -88,14 +93,36 @@ void KWFrame::setMinimumFrameHeight(qreal minimumFrameHeight)
{
m_minimumFrameHeight = minimumFrameHeight;
}
-
+
+void KWFrame::cleanupShape(KoShape* shape)
+{
+ KWTextFrameSet *tfs = dynamic_cast<KWTextFrameSet*>(m_frameSet);
+ if (tfs) {
+ KWRootAreaProvider *rootAreaProvider = tfs->rootAreaProvider();
+ KoTextDocumentLayout *lay = \
dynamic_cast<KoTextDocumentLayout*>(tfs->document()->documentLayout()); + \
Q_ASSERT(lay); + QList<KoTextLayoutRootArea *> layoutRootAreas = \
lay->rootAreas(); + for(int i = 0; i < layoutRootAreas.count(); ++i) {
+ KoTextLayoutRootArea *rootArea = layoutRootAreas[i];
+ if (rootArea->associatedShape() == shape) {
+ rootAreaProvider->releaseAllAfter(rootArea);
+ lay->removeRootArea(rootArea);
+ rootArea->setAssociatedShape(0);
+ }
+ }
+ }
+}
+
void KWFrame::setFrameSet(KWFrameSet *fs)
{
if (fs == m_frameSet)
return;
Q_ASSERT_X(!fs || !m_frameSet, __FUNCTION__, "Changing the FrameSet afterwards \
needs to invalidate lots of stuff including whatever is done in the \
KWRootAreaProvider. The better way would be to not allow this.");
- if (m_frameSet)
+ if (m_frameSet) {
m_frameSet->removeFrame(this);
+ if (m_shape)
+ cleanupShape(m_shape);
+ }
m_frameSet = fs;
if (fs)
fs->addFrame(this);
diff --git a/words/part/frames/KWFrame.h b/words/part/frames/KWFrame.h
index 1e6ba29..8c626b4 100644
--- a/words/part/frames/KWFrame.h
+++ b/words/part/frames/KWFrame.h
@@ -158,6 +158,8 @@ private:
KWFrameSet *m_frameSet;
qreal m_minimumFrameHeight;
+
+ void cleanupShape(KoShape* shape);
};
#endif
diff --git a/words/part/frames/KWFrameLayout.cpp \
b/words/part/frames/KWFrameLayout.cpp index 221118a..019ca1c 100644
--- a/words/part/frames/KWFrameLayout.cpp
+++ b/words/part/frames/KWFrameLayout.cpp
@@ -112,7 +112,6 @@ else kDebug(32001) << "Nooooo FooterTextFrame";
delete background->shape();
}
-#if 1
// delete headers/footer frames that are not needed on this page
foreach (KWFrame *frame, framesInPage(page.rect())) {
if (frame->frameSet()->type() != KWord::TextFrameSet)
@@ -126,10 +125,8 @@ else kDebug(32001) << "Nooooo FooterTextFrame";
kDebug(32001)<<"Delete disabled header/footer frame=" << frame << \
"pageRect=" << page.rect() << "pageNumber=" << p.pageNumber(); \
tfs->removeFrame(frame); delete frame->shape();
-Q_ASSERT(false);
}
}
-#endif
// create main text frame. All columns of them.
if (page.pageStyle().hasMainTextFrame()) {
@@ -676,6 +673,7 @@ KWFrame *KWFrameLayout::frameOn(KWFrameSet *fs, int pageNumber) \
const void KWFrameLayout::cleanupHeadersFooters()
{
kDebug(32001);
+#if 0
QHash<KWPageStyle, FrameSets> pageStyles;
foreach (KWFrameSet *fs, m_frameSets) {
KWTextFrameSet *tfs = dynamic_cast<KWTextFrameSet*>(fs);
@@ -746,6 +744,9 @@ kDebug()<<"remove evenFooters frameSets";
break;
}
}
+#else
+ Q_ASSERT(false);
+#endif
m_setup = false;
}
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic