sc/qa/unit/subsequent_filters-test.cxx | 6 +-- sd/inc/drawdoc.hxx | 1 sd/inc/shapelist.hxx | 21 +++++-------- sd/source/core/drawdoc.cxx | 11 +++--- sd/source/core/drawdoc4.cxx | 10 ++++-- sd/source/core/sdpage.cxx | 39 +++++++++++++++--------- sd/source/core/sdpage2.cxx | 6 +-- sd/source/core/shapelist.cxx | 49 ++++++------------------------- sd/source/ui/view/drviews1.cxx | 7 ++-- sd/source/ui/view/sdview5.cxx | 5 +-- sd/source/ui/view/viewoverlaymanager.cxx | 5 +-- 11 files changed, 73 insertions(+), 87 deletions(-)
New commits: commit ee51444ed1f7003dafc93c8181b5f8c1b0fd165b Author: Noel Power <noel.po...@suse.com> Date: Mon Jun 24 21:40:32 2013 +0100 fix borders unit test ( test values have changed ) Change-Id: I1205eddf83781bef655abe4a1293c691bc5f1c41 diff --git a/sc/qa/unit/subsequent_filters-test.cxx b/sc/qa/unit/subsequent_filters-test.cxx index 17bfc32..f4aa9ec 100644 --- a/sc/qa/unit/subsequent_filters-test.cxx +++ b/sc/qa/unit/subsequent_filters-test.cxx @@ -766,19 +766,19 @@ void ScFiltersTest::testBorderXLS() CPPUNIT_ASSERT(pRight); CPPUNIT_ASSERT_EQUAL(pRight->GetBorderLineStyle(), table::BorderLineStyle::SOLID); - CPPUNIT_ASSERT_EQUAL(pRight->GetWidth(),4L); + CPPUNIT_ASSERT_EQUAL(pRight->GetWidth(),1L); pDoc->GetBorderLines( 3, 5, 0, &pLeft, &pTop, &pRight, &pBottom ); CPPUNIT_ASSERT(pRight); CPPUNIT_ASSERT_EQUAL(pRight->GetBorderLineStyle(), table::BorderLineStyle::SOLID); - CPPUNIT_ASSERT_EQUAL(pRight->GetWidth(),12L); + CPPUNIT_ASSERT_EQUAL(pRight->GetWidth(),20L); pDoc->GetBorderLines( 5, 7, 0, &pLeft, &pTop, &pRight, &pBottom ); CPPUNIT_ASSERT(pRight); CPPUNIT_ASSERT_EQUAL(pRight->GetBorderLineStyle(), table::BorderLineStyle::SOLID); - CPPUNIT_ASSERT_EQUAL(pRight->GetWidth(),16L); + CPPUNIT_ASSERT_EQUAL(pRight->GetWidth(),30L); } struct Border { diff --git a/sd/inc/drawdoc.hxx b/sd/inc/drawdoc.hxx index 77ac6b6..1d05eb3 100644 --- a/sd/inc/drawdoc.hxx +++ b/sd/inc/drawdoc.hxx @@ -145,6 +145,7 @@ private: Timer* mpWorkStartupTimer; Timer* mpOnlineSpellingTimer; sd::ShapeList* mpOnlineSpellingList; + sd::ShapeList::const_iterator maShapeListIterator; SvxSearchItem* mpOnlineSearchItem; std::vector<sd::FrameView*> maFrameViewList; SdCustomShowList* mpCustomShowList; diff --git a/sd/inc/shapelist.hxx b/sd/inc/shapelist.hxx index f828ebc6..2d759a2 100644 --- a/sd/inc/shapelist.hxx +++ b/sd/inc/shapelist.hxx @@ -29,6 +29,10 @@ namespace sd class ShapeList : public sdr::ObjectUser { public: + /** const_iterator guarantee only that the list itself is not + altered. The objects referenced by the list are still mutable. */ + typedef std::list< SdrObject* >::const_iterator const_iterator; + ShapeList(); virtual ~ShapeList(); @@ -48,26 +52,17 @@ namespace sd /** @return true if given shape is part of this list */ bool hasShape( SdrObject& rObject ) const; - /** returns the shape the internal iterator points to, or 0 if - * the list end is reached. moves the internal iterator to the - * next shape. */ - SdrObject* getNextShape(); - - /** Sets the internal iterator to the shape at given index. */ - void seekShape( sal_uInt32 nIndex ); - - /** - */ - bool hasMore() const; + /** @return const_iterator pointing to the first element */ + const_iterator cbegin() const; - const std::list< SdrObject* >& getList() const { return maShapeList; } + /** @return const_iterator pointing to the list termination element */ + const_iterator cend() const; private: virtual void ObjectInDestruction(const SdrObject& rObject); typedef std::list< SdrObject* > ListImpl; ListImpl maShapeList; - ListImpl::iterator maIter; }; } diff --git a/sd/source/core/drawdoc.cxx b/sd/source/core/drawdoc.cxx index aca4996..ed8d1fc 100644 --- a/sd/source/core/drawdoc.cxx +++ b/sd/source/core/drawdoc.cxx @@ -144,6 +144,7 @@ SdDrawDocument::SdDrawDocument(DocumentType eType, SfxObjectShell* pDrDocSh) , mpWorkStartupTimer(NULL) , mpOnlineSpellingTimer(NULL) , mpOnlineSpellingList(NULL) +, maShapeListIterator() , mpOnlineSearchItem(NULL) , mpCustomShowList(NULL) , mpDocSh(static_cast< ::sd::DrawDocShell*>(pDrDocSh)) @@ -694,7 +695,7 @@ void SdDrawDocument::UpdateAllLinks() */ void SdDrawDocument::NewOrLoadCompleted( SdPage* pPage, SdStyleSheetPool* pSPool ) { - sd::ShapeList& rPresentationShapes( pPage->GetPresentationShapeList() ); + const sd::ShapeList& rPresentationShapes( pPage->GetPresentationShapeList() ); if(!rPresentationShapes.isEmpty()) { // Create lists of title and outline styles @@ -706,13 +707,13 @@ void SdDrawDocument::NewOrLoadCompleted( SdPage* pPage, SdStyleSheetPool* pSPool SfxStyleSheet* pTitleSheet = (SfxStyleSheet*)pSPool->GetTitleSheet(aName); - SdrObject* pObj = 0; - rPresentationShapes.seekShape(0); - // Now look for title and outline text objects, then make those objects // listeners. - while( (pObj = rPresentationShapes.getNextShape()) ) + for( ShapeList::const_iterator aIter (rPresentationShapes.cbegin() ); + aIter != rPresentationShapes.cend(); ++aIter ) { + SdrObject* pObj = *aIter; + if (pObj->GetObjInventor() == SdrInventor) { OutlinerParaObject* pOPO = pObj->GetOutlinerParaObject(); diff --git a/sd/source/core/drawdoc4.cxx b/sd/source/core/drawdoc4.cxx index 6954913..6c90cac 100644 --- a/sd/source/core/drawdoc4.cxx +++ b/sd/source/core/drawdoc4.cxx @@ -755,6 +755,7 @@ void SdDrawDocument::StartOnlineSpelling(sal_Bool bForceSpelling) pOutl->SetDefaultLanguage( meLanguage ); mpOnlineSpellingList = new ShapeList; + maShapeListIterator = mpOnlineSpellingList->cend(); sal_uInt16 nPage; for ( nPage = 0; nPage < GetPageCount(); nPage++ ) @@ -769,7 +770,7 @@ void SdDrawDocument::StartOnlineSpelling(sal_Bool bForceSpelling) FillOnlineSpellingList((SdPage*) GetMasterPage(nPage)); } - mpOnlineSpellingList->seekShape(0); + maShapeListIterator = mpOnlineSpellingList->cbegin(); mpOnlineSpellingTimer = new Timer(); mpOnlineSpellingTimer->SetTimeoutHdl( LINK(this, SdDrawDocument, OnlineSpellingHdl) ); mpOnlineSpellingTimer->SetTimeout(250); @@ -823,11 +824,14 @@ void SdDrawDocument::FillOnlineSpellingList(SdPage* pPage) // OnlineSpelling in the background IMPL_LINK_NOARG(SdDrawDocument, OnlineSpellingHdl) { + bool bHasMore = maShapeListIterator != mpOnlineSpellingList->cend(); + if (mpOnlineSpellingList!=NULL - && ( !mbOnlineSpell || mpOnlineSpellingList->hasMore())) + && ( !mbOnlineSpell || bHasMore)) { // Spell next object - SdrObject* pObj = mpOnlineSpellingList->getNextShape(); + SdrObject* pObj = *maShapeListIterator; + ++maShapeListIterator; if (pObj) { diff --git a/sd/source/core/sdpage.cxx b/sd/source/core/sdpage.cxx index 5f70417..ed7e022 100644 --- a/sd/source/core/sdpage.cxx +++ b/sd/source/core/sdpage.cxx @@ -155,11 +155,11 @@ SdrObject* SdPage::GetPresObj(PresObjKind eObjKind, int nIndex, bool bFuzzySearc // first sort all matching shapes with z-order std::vector< SdrObject* > aMatches; - SdrObject* pObj = 0; - maPresentationShapeList.seekShape(0); - - while( (pObj = maPresentationShapeList.getNextShape()) ) + for( ShapeList::const_iterator aIter( maPresentationShapeList.cbegin() ); + aIter != maPresentationShapeList.cend(); ++aIter ) { + SdrObject* pObj = *aIter; + SdAnimationInfo* pInfo = SdDrawDocument::GetShapeUserData(*pObj); if( pInfo ) { @@ -1576,27 +1576,38 @@ void SdPage::SetAutoLayout(AutoLayout eLayout, sal_Bool bInit, sal_Bool bCreate // now delete all empty presentation objects that are no longer used by the new layout if( bInit ) { - SdrObject* pObj = 0; - maPresentationShapeList.seekShape(0); + std::list< SdrObject* > aRemoveList; - while( (pObj = maPresentationShapeList.getNextShape()) ) + for( ShapeList::const_iterator aIter = maPresentationShapeList.cbegin(); + aIter != maPresentationShapeList.cend(); ++aIter ) { + SdrObject* pObj = *aIter; + if( aUsedPresentationObjects.count(pObj) == 0 ) { if( pObj->IsEmptyPresObj() ) { - if( bUndo ) - pUndoManager->AddUndoAction(pModel->GetSdrUndoFactory().CreateUndoDeleteObject(*pObj)); - - RemoveObject( pObj->GetOrdNum() ); - - if( !bUndo ) - SdrObject::Free( pObj ); + // remove the object now would invalidate the iterator and lead to a seg fault + aRemoveList.push_back(pObj); } /* #i108541# keep non empty pres obj as pres obj even if they are not part of the current layout */ } } + + for( std::list<SdrObject*>::iterator aIter = aRemoveList.begin(); + aIter != aRemoveList.end(); ++aIter ) + { + SdrObject* pObj = *aIter; + + if( bUndo ) + pUndoManager->AddUndoAction(pModel->GetSdrUndoFactory().CreateUndoDeleteObject(*pObj)); + + RemoveObject( pObj->GetOrdNum() ); + + if( !bUndo ) + SdrObject::Free( pObj ); + } } } diff --git a/sd/source/core/sdpage2.cxx b/sd/source/core/sdpage2.cxx index 1b4f9ab..ff88f06 100644 --- a/sd/source/core/sdpage2.cxx +++ b/sd/source/core/sdpage2.cxx @@ -379,10 +379,8 @@ SdPage::SdPage(const SdPage& rSrcPage) mePageKind = rSrcPage.mePageKind; meAutoLayout = rSrcPage.meAutoLayout; - // use shape list directly to preserve constness of rSrcPage - const std::list< SdrObject* >& rShapeList = rSrcPage.maPresentationShapeList.getList(); - for( std::list< SdrObject* >::const_iterator aIter = rShapeList.begin(); - aIter != rShapeList.end(); ++aIter ) + for( ShapeList::const_iterator aIter( rSrcPage.maPresentationShapeList.cbegin() ); + aIter != rSrcPage.maPresentationShapeList.cend(); ++aIter ) { SdrObject* pObj = *aIter; InsertPresObj(GetObj(pObj->GetOrdNum()), rSrcPage.GetPresObjKind(pObj)); diff --git a/sd/source/core/shapelist.cxx b/sd/source/core/shapelist.cxx index a265e9c..c3aedde 100644 --- a/sd/source/core/shapelist.cxx +++ b/sd/source/core/shapelist.cxx @@ -26,7 +26,6 @@ using namespace sd; ShapeList::ShapeList() { - maIter = maShapeList.end(); } ShapeList::~ShapeList() @@ -55,14 +54,9 @@ SdrObject* ShapeList::removeShape( SdrObject& rObject ) ListImpl::iterator aIter( std::find( maShapeList.begin(), maShapeList.end(), &rObject ) ); if( aIter != maShapeList.end() ) { - bool bIterErased = aIter == maIter; - (*aIter)->RemoveObjectUser(*this); aIter = maShapeList.erase( aIter ); - if( bIterErased ) - maIter = aIter; - if( aIter != maShapeList.end() ) return (*aIter); } @@ -83,8 +77,6 @@ void ShapeList::clear() ListImpl::iterator aIter( aShapeList.begin() ); while( aIter != aShapeList.end() ) (*aIter++)->RemoveObjectUser(*this); - - maIter = aShapeList.end(); } /** returns true if this list is empty */ @@ -99,46 +91,27 @@ bool ShapeList::hasShape( SdrObject& rObject ) const return std::find( maShapeList.begin(), maShapeList.end(), &rObject ) != maShapeList.end(); } -void ShapeList::ObjectInDestruction(const SdrObject& rObject) +ShapeList::const_iterator ShapeList::cbegin() const { - ListImpl::iterator aIter( std::find( maShapeList.begin(), maShapeList.end(), &rObject ) ); - if( aIter != maShapeList.end() ) - { - bool bIterErased = aIter == maIter; - - aIter = maShapeList.erase( aIter ); + return maShapeList.begin(); +} - if( bIterErased ) - maIter = aIter; - } - else - { - OSL_FAIL("sd::ShapeList::ObjectInDestruction(), got a call from an unknown friend!"); - } +ShapeList::const_iterator ShapeList::cend() const +{ + return maShapeList.end(); } -SdrObject* ShapeList::getNextShape() +void ShapeList::ObjectInDestruction(const SdrObject& rObject) { - if( maIter != maShapeList.end() ) + ListImpl::iterator aIter( std::find( maShapeList.begin(), maShapeList.end(), &rObject ) ); + if( aIter != maShapeList.end() ) { - return (*maIter++); + maShapeList.erase( aIter ); } else { - return 0; + OSL_FAIL("sd::ShapeList::ObjectInDestruction(), got a call from an unknown friend!"); } } -void ShapeList::seekShape( sal_uInt32 nIndex ) -{ - maIter = maShapeList.begin(); - while( nIndex-- && (maIter != maShapeList.end()) ) - maIter++; -} - -bool ShapeList::hasMore() const -{ - return maIter != maShapeList.end(); -} - /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/drviews1.cxx b/sd/source/ui/view/drviews1.cxx index fe0f1dd..8ad0ce3 100644 --- a/sd/source/ui/view/drviews1.cxx +++ b/sd/source/ui/view/drviews1.cxx @@ -1059,11 +1059,12 @@ sal_Bool DrawViewShell::SwitchPage(sal_uInt16 nSelectedPage) { // set pages for all available handout presentation objects sd::ShapeList& rShapeList = pMaster->GetPresentationShapeList(); - SdrObject* pObj = 0; - rShapeList.seekShape(0); - while( (pObj = rShapeList.getNextShape()) ) + for( ShapeList::const_iterator aIter( rShapeList.cbegin() ); + aIter != rShapeList.cend(); ++aIter ) { + SdrObject* pObj = *aIter; + if( pMaster->GetPresObjKind(pObj) == PRESOBJ_HANDOUT ) { // #i105146# We want no content to be displayed for PK_HANDOUT, diff --git a/sd/source/ui/view/sdview5.cxx b/sd/source/ui/view/sdview5.cxx index 9023d02..3cb0829 100644 --- a/sd/source/ui/view/sdview5.cxx +++ b/sd/source/ui/view/sdview5.cxx @@ -101,9 +101,10 @@ SdrObject* View::GetEmptyPresentationObject( PresObjKind eKind ) // last try to find empty pres obj of multiple type if( !pEmptyObj ) { - const std::list< SdrObject* >& rShapes = pPage->GetPresentationShapeList().getList(); + ShapeList& rShapeList = pPage->GetPresentationShapeList(); - for( std::list< SdrObject* >::const_iterator iter( rShapes.begin() ); iter != rShapes.end(); ++iter ) + for( ShapeList::const_iterator iter( rShapeList.cbegin() ); + iter != rShapeList.cend(); ++iter ) { if( (*iter)->IsEmptyPresObj() && implIsMultiPresObj(pPage->GetPresObjKind(*iter)) ) { diff --git a/sd/source/ui/view/viewoverlaymanager.cxx b/sd/source/ui/view/viewoverlaymanager.cxx index e834999..f5c6bc6 100644 --- a/sd/source/ui/view/viewoverlaymanager.cxx +++ b/sd/source/ui/view/viewoverlaymanager.cxx @@ -546,9 +546,10 @@ bool ViewOverlayManager::CreateTags() if( pPage && !pPage->IsMasterPage() && (pPage->GetPageKind() == PK_STANDARD) ) { - const std::list< SdrObject* >& rShapes = pPage->GetPresentationShapeList().getList(); + ShapeList& rShapeList = pPage->GetPresentationShapeList(); - for( std::list< SdrObject* >::const_iterator iter( rShapes.begin() ); iter != rShapes.end(); ++iter ) + for( ShapeList::const_iterator iter( rShapeList.cbegin() ); + iter != rShapeList.cend(); ++iter ) { if( (*iter)->IsEmptyPresObj() && ((*iter)->GetObjIdentifier() == OBJ_OUTLINETEXT) && (mrBase.GetDrawView()->GetTextEditObject() != (*iter)) ) { _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits