From c91da48ff371680bf82bbc936bd8e2edbdf293ab Mon Sep 17 00:00:00 2001 From: "Friedrich W. H. Kossebau" Date: Thu, 7 Nov 2013 10:52:53 +0100 Subject: [PATCH] Properly destruct added KoPageWidgetItems on destruction of KoDocumentInfoDlg Fixes crash when semantic items are inserted after the dialog incl. the rdf page was shown & closed REVIEW: 113664 thanks boud for review --- libs/main/KoDocumentInfoDlg.cpp | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/libs/main/KoDocumentInfoDlg.cpp b/libs/main/KoDocumentInfoDlg.cpp index a8466c12de..2983d62804 100644 --- a/libs/main/KoDocumentInfoDlg.cpp +++ b/libs/main/KoDocumentInfoDlg.cpp @@ -44,6 +44,25 @@ #include #include +class KoPageWidgetItemAdapter : public KPageWidgetItem +{ +public: + KoPageWidgetItemAdapter(KoPageWidgetItem *item) + : KPageWidgetItem(item->widget(), item->name()) + , m_item(item) + { + setHeader(item->name()); + setIcon(KIcon(item->iconName())); + } + ~KoPageWidgetItemAdapter() { delete m_item; } + + bool shouldDialogCloseBeVetoed() { return m_item->shouldDialogCloseBeVetoed(); } + void apply() { m_item->apply(); } + +private: + KoPageWidgetItem * const m_item; +}; + class KoDocumentInfoDlg::KoDocumentInfoDlgPrivate { @@ -141,7 +160,7 @@ void KoDocumentInfoDlg::slotButtonClicked(int button) switch (button) { case Ok: foreach(KPageWidgetItem* item, d->pages) { - KoPageWidgetItem *page = dynamic_cast(item); + KoPageWidgetItemAdapter *page = dynamic_cast(item); if (page) { if (page->shouldDialogCloseBeVetoed()) { return; @@ -252,7 +271,7 @@ void KoDocumentInfoDlg::slotApply() { saveAboutData(); foreach(KPageWidgetItem* item, d->pages) { - KoPageWidgetItem *page = dynamic_cast(item); + KoPageWidgetItemAdapter *page = dynamic_cast(item); if (page) { page->apply(); } @@ -437,9 +456,7 @@ void KoDocumentInfoDlg::setReadOnly(bool ro) void KoDocumentInfoDlg::addPageItem(KoPageWidgetItem *item) { - KPageWidgetItem * page = new KPageWidgetItem(item->widget(), item->name()); - page->setHeader(item->name()); - page->setIcon(KIcon(item->iconName())); + KPageWidgetItem * page = new KoPageWidgetItemAdapter(item); addPage(page); d->pages.append(page); -- GitLab