The code indicates that the last frame should delete its frameset. This never 
happens though, as when the frame removes itself from the frameset, the frames 
framset pointer is reset.
So the question is: is it ok to leave the frameset around?
If yes, the code should be cleaned up,
if no, something like the att patch should be applied.
-- 
Mvh.
Dag Andersen
diff --git a/words/part/frames/KWFrame.cpp b/words/part/frames/KWFrame.cpp
index ed9dde6fd..590c770 100644
--- a/words/part/frames/KWFrame.cpp
+++ b/words/part/frames/KWFrame.cpp
@@ -41,7 +41,8 @@ KWFrame::KWFrame(KoShape *shape, KWFrameSet *parent, int pageNumber)
         m_anchoredPageNumber(pageNumber),
         m_anchoredFrameOffset(0.0),
         m_frameSet(parent),
-        m_minimumFrameHeight(0.0) // no minimum height per default
+        m_minimumFrameHeight(0.0), // no minimum height per default
+        m_deleteFrameSet(true)
 {
     Q_ASSERT(shape);
     shape->setApplicationData(this);
@@ -78,18 +79,23 @@ KWFrame::~KWFrame()
     if (m_frameSet) {
         cleanupShape(ourShape);
 
-        bool justMe = m_frameSet->frameCount() == 1;
+        bool deleteFrameSet = m_deleteFrameSet && m_frameSet->frameCount() == 1;
+        KWFrameSet *fs = m_frameSet; // removeFrame sets m_frameSet = 0
         m_frameSet->removeFrame(this, ourShape); // first remove me so we won't get double
                                                  // deleted. ourShape is needed to mark any
                                                  // copyShapes as retired
-        if (justMe) {
-            kDebug(32001) << "Last KWFrame removed from frameSet=" << m_frameSet;
-            delete m_frameSet;
-            m_frameSet = 0;
+        if (deleteFrameSet) {
+            kDebug(32001) << "Last KWFrame removed from frameSet=" << fs;
+            delete fs;
         }
     }
 }
 
+void KWFrame::dontDeleteFrameSet()
+{
+    m_deleteFrameSet = false;
+}
+
 qreal KWFrame::minimumFrameHeight() const
 {
     return m_minimumFrameHeight;
diff --git a/words/part/frames/KWFrame.h b/words/part/frames/KWFrame.h
index 6a0f7db..63570ed 100644
--- a/words/part/frames/KWFrame.h
+++ b/words/part/frames/KWFrame.h
@@ -166,6 +166,8 @@ public:
      */
     void saveOdf(KoShapeSavingContext &context, const KWPage &page, int pageZIndexOffset = 0) const;
 
+    void dontDeleteFrameSet();
+
 private:
     KoShape *m_shape;
     KWord::FrameBehavior m_frameBehavior;
@@ -180,6 +182,7 @@ private:
     KWFrameSet *m_frameSet;
     qreal m_minimumFrameHeight;
     QList<KWFrame*> m_copyShapes;
+    bool m_deleteFrameSet;
 };
 
 #endif
diff --git a/words/part/frames/KWFrameSet.cpp b/words/part/frames/KWFrameSet.cpp
index 4af6903..f2f11f5 100644
--- a/words/part/frames/KWFrameSet.cpp
+++ b/words/part/frames/KWFrameSet.cpp
@@ -39,6 +39,7 @@ KWFrameSet::~KWFrameSet()
     kDebug(32001) << "type=" << m_type << "frameCount=" << frames().count();
     while (!frames().isEmpty()) { // deleting a shape can result in multiple KWFrame's and shapes being deleted (e.g. copy-shapes)
         KWFrame *f = frames().last();
+        f->dontDeleteFrameSet(); // tell frame to not delete us
         if (f->shape()) {
             delete f->shape(); // deletes also the KWFrame and calls KWFrameSet::removeFrame
             Q_ASSERT(!frames().contains(f));
_______________________________________________
calligra-devel mailing list
[email protected]
https://mail.kde.org/mailman/listinfo/calligra-devel

Reply via email to