From 339e866d09717b4919dafaad96ebf772d30ec9cb Mon Sep 17 00:00:00 2001 From: Noel Grandin Date: Mon, 14 Jan 2019 09:17:36 +0200 Subject: use unique_ptr in SwPostItMgr Change-Id: Icc946b986f62d986e979e6a3f3ba0d2c28cb9adf Reviewed-on: https://gerrit.libreoffice.org/66312 Tested-by: Jenkins Reviewed-by: Noel Grandin --- sw/inc/PostItMgr.hxx | 4 ++-- sw/qa/extras/uiwriter/uiwriter.cxx | 2 +- sw/source/uibase/docvw/PostItMgr.cxx | 45 ++++++++++++++++++------------------ 3 files changed, 25 insertions(+), 26 deletions(-) diff --git a/sw/inc/PostItMgr.hxx b/sw/inc/PostItMgr.hxx index 9650996c50f3..b6f8242864f0 100644 --- a/sw/inc/PostItMgr.hxx +++ b/sw/inc/PostItMgr.hxx @@ -130,7 +130,7 @@ class SwPostItMgr: public SfxListener SwView* mpView; SwWrtShell* mpWrtShell; VclPtr mpEditWin; - std::vector mvPostItFields; + std::vector> mvPostItFields; std::vector> mPages; ImplSVEvent * mnEventId; bool mbWaitingForCalcRects; @@ -178,7 +178,7 @@ class SwPostItMgr: public SfxListener SwPostItMgr(SwView* aDoc); virtual ~SwPostItMgr() override; - typedef std::vector< SwSidebarItem* >::const_iterator const_iterator; + typedef std::vector< std::unique_ptr >::const_iterator const_iterator; const_iterator begin() const { return mvPostItFields.begin(); } const_iterator end() const { return mvPostItFields.end(); } diff --git a/sw/qa/extras/uiwriter/uiwriter.cxx b/sw/qa/extras/uiwriter/uiwriter.cxx index bc05aeaa0445..5e9d9c639f75 100644 --- a/sw/qa/extras/uiwriter/uiwriter.cxx +++ b/sw/qa/extras/uiwriter/uiwriter.cxx @@ -4153,7 +4153,7 @@ void SwUiWriterTest::testTdf89720() SwDoc* pDoc = createDoc("tdf89720.odt"); SwView* pView = pDoc->GetDocShell()->GetView(); SwPostItMgr* pPostItMgr = pView->GetPostItMgr(); - for (SwSidebarItem* pItem : *pPostItMgr) + for (std::unique_ptr const & pItem : *pPostItMgr) { if (pItem->pPostIt->IsFollow()) // This was non-0: reply comments had a text range overlay, diff --git a/sw/source/uibase/docvw/PostItMgr.cxx b/sw/source/uibase/docvw/PostItMgr.cxx index 657d2d3b7c1d..73dba00005a4 100644 --- a/sw/source/uibase/docvw/PostItMgr.cxx +++ b/sw/source/uibase/docvw/PostItMgr.cxx @@ -105,7 +105,7 @@ namespace { enum class CommentNotificationType { Add, Remove, Modify }; - bool comp_pos(const SwSidebarItem* a, const SwSidebarItem* b) + bool comp_pos(const std::unique_ptr& a, const std::unique_ptr& b) { // sort by anchor position SwPosition aPosAnchorA = a->GetAnchorPosition(); @@ -243,21 +243,21 @@ void SwPostItMgr::CheckForRemovedPostIts() { IDocumentRedlineAccess const& rIDRA(mpWrtShell->getIDocumentRedlineAccess()); bool bRemoved = false; - auto currentIt = mvPostItFields.begin(); - while(currentIt != mvPostItFields.end()) + auto it = mvPostItFields.begin(); + while(it != mvPostItFields.end()) { - auto it = currentIt++; if (!(*it)->UseElement(*mpWrtShell->GetLayout(), rIDRA)) { EndListening(const_cast(*(*it)->GetBroadCaster())); - SwSidebarItem* p = *it; - currentIt = mvPostItFields.erase(std::remove(mvPostItFields.begin(), mvPostItFields.end(), *it), mvPostItFields.end()); + std::unique_ptr p = std::move(*it); + it = mvPostItFields.erase(it); if (GetActiveSidebarWin() == p->pPostIt) SetActiveSidebarWin(nullptr); p->pPostIt.disposeAndClear(); - delete p; bRemoved = true; } + else + ++it; } if ( bRemoved ) @@ -278,21 +278,21 @@ void SwPostItMgr::CheckForRemovedPostIts() SwSidebarItem* SwPostItMgr::InsertItem(SfxBroadcaster* pItem, bool bCheckExistence, bool bFocus) { - SwSidebarItem* pAnnotationItem = nullptr; if (bCheckExistence) { for (auto const& postItField : mvPostItFields) { if ( postItField->GetBroadCaster() == pItem ) - return pAnnotationItem; + return nullptr; } } mbLayout = bFocus; + SwSidebarItem* pAnnotationItem = nullptr; if (dynamic_cast< const SwFormatField *>( pItem ) != nullptr) { - pAnnotationItem = new SwAnnotationItem(static_cast(*pItem), bFocus); - mvPostItFields.push_back(pAnnotationItem); + mvPostItFields.push_back(std::make_unique(static_cast(*pItem), bFocus)); + pAnnotationItem = mvPostItFields.back().get(); } OSL_ENSURE(dynamic_cast< const SwFormatField *>( pItem ) != nullptr,"Mgr::InsertItem: seems like new stuff was added"); StartListening(*pItem); @@ -303,10 +303,10 @@ void SwPostItMgr::RemoveItem( SfxBroadcaster* pBroadcast ) { EndListening(*pBroadcast); auto i = std::find_if(mvPostItFields.begin(), mvPostItFields.end(), - [&pBroadcast](const SwSidebarItem* pField) { return pField->GetBroadCaster() == pBroadcast; }); + [&pBroadcast](const std::unique_ptr& pField) { return pField->GetBroadCaster() == pBroadcast; }); if (i != mvPostItFields.end()) { - SwSidebarItem* p = *i; + std::unique_ptr p = std::move(*i); if (GetActiveSidebarWin() == p->pPostIt) SetActiveSidebarWin(nullptr); // tdf#120487 remove from list before dispose, so comment window @@ -314,7 +314,6 @@ void SwPostItMgr::RemoveItem( SfxBroadcaster* pBroadcast ) // transferring from the pPostIt triggers relayout of postits mvPostItFields.erase(i); p->pPostIt.disposeAndClear(); - delete p; } mbLayout = true; PrepareView(); @@ -406,7 +405,7 @@ void SwPostItMgr::Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) // If LOK has disabled tiled annotations, emit annotation callbacks if (comphelper::LibreOfficeKit::isActive() && !comphelper::LibreOfficeKit::isTiledAnnotations()) { - lcl_CommentNotification(mpView, CommentNotificationType::Modify, postItField, 0); + lcl_CommentNotification(mpView, CommentNotificationType::Modify, postItField.get(), 0); } break; } @@ -607,7 +606,7 @@ bool SwPostItMgr::CalcRects() for (unsigned long j=0; jmvSidebarItems.push_back(pItem); + mPages[aPageNum-1]->mvSidebarItems.push_back(pItem.get()); mPages[aPageNum-1]->mPageRect = pItem->maLayoutInfo.mPageFrame; mPages[aPageNum-1]->eSidebarPosition = pItem->maLayoutInfo.meSidebarPosition; } @@ -968,7 +967,7 @@ void SwPostItMgr::DrawNotesForPage(OutputDevice *pOutDev, sal_uInt32 nPage) void SwPostItMgr::PaintTile(OutputDevice& rRenderContext) { - for (SwSidebarItem* pItem : mvPostItFields) + for (std::unique_ptr& pItem : mvPostItFields) { SwAnnotationWin* pPostIt = pItem->pPostIt; if (!pPostIt) @@ -1321,11 +1320,11 @@ void SwPostItMgr::AddPostIts(bool bCheckExistence, bool bFocus) void SwPostItMgr::RemoveSidebarWin() { - for (auto const& postItField : mvPostItFields) + for (auto& postItField : mvPostItFields) { EndListening( *const_cast(postItField->GetBroadCaster()) ); postItField->pPostIt.disposeAndClear(); - delete postItField; + postItField.reset(); } mvPostItFields.clear(); @@ -1413,7 +1412,7 @@ public: //Fields more than once. class FieldDocWatchingStack : public SfxListener { - std::vector& sidebarItemVector; + std::vector>& sidebarItemVector; std::vector v; SwDocShell& m_rDocShell; FilterFunctor& m_rFilter; @@ -1453,7 +1452,7 @@ class FieldDocWatchingStack : public SfxListener } public: - FieldDocWatchingStack(std::vector& in, SwDocShell &rDocShell, FilterFunctor& rFilter) + FieldDocWatchingStack(std::vector>& in, SwDocShell &rDocShell, FilterFunctor& rFilter) : sidebarItemVector(in) , m_rDocShell(rDocShell) , m_rFilter(rFilter) @@ -1724,7 +1723,7 @@ SwAnnotationWin* SwPostItMgr::GetNextPostIt( sal_uInt16 aDirection, if (mvPostItFields.size()>1) { auto i = std::find_if(mvPostItFields.begin(), mvPostItFields.end(), - [&aPostIt](const SwSidebarItem* pField) { return pField->pPostIt == aPostIt; }); + [&aPostIt](const std::unique_ptr& pField) { return pField->pPostIt == aPostIt; }); if (i == mvPostItFields.end()) return nullptr; @@ -1898,7 +1897,7 @@ vcl::Window* SwPostItMgr::IsHitSidebarWindow(const Point& rPointLogic) if (bEnableMapMode) mpEditWin->EnableMapMode(); - for (SwSidebarItem* pItem : mvPostItFields) + for (std::unique_ptr& pItem : mvPostItFields) { SwAnnotationWin* pPostIt = pItem->pPostIt; if (!pPostIt) -- cgit v1.2.3