[Libreoffice-commits] core.git: sd/inc sd/source

Noel Power noel.power at suse.com
Tue Jun 25 03:03:41 PDT 2013


 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 +--
 10 files changed, 84 insertions(+), 70 deletions(-)

New commits:
commit 90ffe25cdda7f7922ea7def4a5bf99ff1671b0d3
Author: Noel Power <noel.power at suse.com>
Date:   Tue Jun 25 11:01:52 2013 +0100

    remove unwanted files added with ee51444ed1f7003dafc93c8181b5f8c1b0fd165b
    
    <sigh> added some files that were part of a patch that I was testing
    were not intended as part of commit
    
    Change-Id: I34ed7f55de28fa09739c0dd8d5084824de676477

diff --git a/sd/inc/drawdoc.hxx b/sd/inc/drawdoc.hxx
index 1d05eb3..77ac6b6 100644
--- a/sd/inc/drawdoc.hxx
+++ b/sd/inc/drawdoc.hxx
@@ -145,7 +145,6 @@ 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 2d759a2..f828ebc6 100644
--- a/sd/inc/shapelist.hxx
+++ b/sd/inc/shapelist.hxx
@@ -29,10 +29,6 @@ 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();
 
@@ -52,17 +48,26 @@ namespace sd
         /** @return true if given shape is part of this list */
         bool hasShape( SdrObject& rObject ) const;
 
-        /** @return const_iterator pointing to the first element */
-        const_iterator cbegin() 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 list termination element */
-        const_iterator cend() const;
+        const std::list< SdrObject* >& getList() const { return maShapeList; }
 
     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 ed8d1fc..aca4996 100644
--- a/sd/source/core/drawdoc.cxx
+++ b/sd/source/core/drawdoc.cxx
@@ -144,7 +144,6 @@ SdDrawDocument::SdDrawDocument(DocumentType eType, SfxObjectShell* pDrDocSh)
 , mpWorkStartupTimer(NULL)
 , mpOnlineSpellingTimer(NULL)
 , mpOnlineSpellingList(NULL)
-, maShapeListIterator()
 , mpOnlineSearchItem(NULL)
 , mpCustomShowList(NULL)
 , mpDocSh(static_cast< ::sd::DrawDocShell*>(pDrDocSh))
@@ -695,7 +694,7 @@ void SdDrawDocument::UpdateAllLinks()
 */
 void SdDrawDocument::NewOrLoadCompleted( SdPage* pPage, SdStyleSheetPool* pSPool )
 {
-    const sd::ShapeList& rPresentationShapes( pPage->GetPresentationShapeList() );
+    sd::ShapeList& rPresentationShapes( pPage->GetPresentationShapeList() );
     if(!rPresentationShapes.isEmpty())
     {
         // Create lists of title and outline styles
@@ -707,13 +706,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.
-        for( ShapeList::const_iterator aIter (rPresentationShapes.cbegin() );
-             aIter != rPresentationShapes.cend(); ++aIter )
+        while( (pObj = rPresentationShapes.getNextShape()) )
         {
-            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 6c90cac..6954913 100644
--- a/sd/source/core/drawdoc4.cxx
+++ b/sd/source/core/drawdoc4.cxx
@@ -755,7 +755,6 @@ void SdDrawDocument::StartOnlineSpelling(sal_Bool bForceSpelling)
         pOutl->SetDefaultLanguage( meLanguage );
 
         mpOnlineSpellingList = new ShapeList;
-        maShapeListIterator = mpOnlineSpellingList->cend();
         sal_uInt16 nPage;
 
         for ( nPage = 0; nPage < GetPageCount(); nPage++ )
@@ -770,7 +769,7 @@ void SdDrawDocument::StartOnlineSpelling(sal_Bool bForceSpelling)
             FillOnlineSpellingList((SdPage*) GetMasterPage(nPage));
         }
 
-        maShapeListIterator = mpOnlineSpellingList->cbegin();
+        mpOnlineSpellingList->seekShape(0);
         mpOnlineSpellingTimer = new Timer();
         mpOnlineSpellingTimer->SetTimeoutHdl( LINK(this, SdDrawDocument, OnlineSpellingHdl) );
         mpOnlineSpellingTimer->SetTimeout(250);
@@ -824,14 +823,11 @@ void SdDrawDocument::FillOnlineSpellingList(SdPage* pPage)
 // OnlineSpelling in the background
 IMPL_LINK_NOARG(SdDrawDocument, OnlineSpellingHdl)
 {
-    bool bHasMore = maShapeListIterator != mpOnlineSpellingList->cend();
-
     if (mpOnlineSpellingList!=NULL
-        && ( !mbOnlineSpell || bHasMore))
+        && ( !mbOnlineSpell || mpOnlineSpellingList->hasMore()))
     {
         // Spell next object
-        SdrObject* pObj = *maShapeListIterator;
-        ++maShapeListIterator;
+        SdrObject* pObj = mpOnlineSpellingList->getNextShape();
 
         if (pObj)
         {
diff --git a/sd/source/core/sdpage.cxx b/sd/source/core/sdpage.cxx
index ed7e022..5f70417 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;
 
-    for( ShapeList::const_iterator aIter( maPresentationShapeList.cbegin() );
-        aIter != maPresentationShapeList.cend(); ++aIter )
-    {
-        SdrObject* pObj = *aIter;
+    SdrObject* pObj = 0;
+    maPresentationShapeList.seekShape(0);
 
+    while( (pObj = maPresentationShapeList.getNextShape()) )
+    {
         SdAnimationInfo* pInfo = SdDrawDocument::GetShapeUserData(*pObj);
         if( pInfo )
         {
@@ -1576,38 +1576,27 @@ 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 )
     {
-        std::list< SdrObject* > aRemoveList;
+        SdrObject* pObj = 0;
+        maPresentationShapeList.seekShape(0);
 
-        for( ShapeList::const_iterator aIter = maPresentationShapeList.cbegin();
-             aIter != maPresentationShapeList.cend(); ++aIter )
+        while( (pObj = maPresentationShapeList.getNextShape()) )
         {
-            SdrObject* pObj = *aIter;
-
             if( aUsedPresentationObjects.count(pObj) == 0 )
             {
 
                 if( pObj->IsEmptyPresObj() )
                 {
-                    // remove the object now would invalidate the iterator and lead to a seg fault
-                    aRemoveList.push_back(pObj);
+                    if( bUndo )
+                        pUndoManager->AddUndoAction(pModel->GetSdrUndoFactory().CreateUndoDeleteObject(*pObj));
+
+                    RemoveObject( pObj->GetOrdNum() );
+
+                    if( !bUndo )
+                        SdrObject::Free( 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 ff88f06..1b4f9ab 100644
--- a/sd/source/core/sdpage2.cxx
+++ b/sd/source/core/sdpage2.cxx
@@ -379,8 +379,10 @@ SdPage::SdPage(const SdPage& rSrcPage)
     mePageKind           = rSrcPage.mePageKind;
     meAutoLayout         = rSrcPage.meAutoLayout;
 
-    for( ShapeList::const_iterator aIter( rSrcPage.maPresentationShapeList.cbegin() );
-         aIter != rSrcPage.maPresentationShapeList.cend(); ++aIter )
+    // 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 )
     {
         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 c3aedde..a265e9c 100644
--- a/sd/source/core/shapelist.cxx
+++ b/sd/source/core/shapelist.cxx
@@ -26,6 +26,7 @@ using namespace sd;
 
 ShapeList::ShapeList()
 {
+    maIter = maShapeList.end();
 }
 
 ShapeList::~ShapeList()
@@ -54,9 +55,14 @@ 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);
     }
@@ -77,6 +83,8 @@ 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 */
@@ -91,22 +99,17 @@ bool ShapeList::hasShape( SdrObject& rObject ) const
     return std::find( maShapeList.begin(), maShapeList.end(), &rObject )  != maShapeList.end();
 }
 
-ShapeList::const_iterator ShapeList::cbegin() const
-{
-    return maShapeList.begin();
-}
-
-ShapeList::const_iterator ShapeList::cend() const
-{
-    return maShapeList.end();
-}
-
 void ShapeList::ObjectInDestruction(const SdrObject& rObject)
 {
     ListImpl::iterator aIter( std::find( maShapeList.begin(), maShapeList.end(), &rObject ) );
     if( aIter != maShapeList.end() )
     {
-        maShapeList.erase( aIter );
+        bool bIterErased = aIter == maIter;
+
+        aIter = maShapeList.erase( aIter );
+
+        if( bIterErased )
+            maIter = aIter;
     }
     else
     {
@@ -114,4 +117,28 @@ void ShapeList::ObjectInDestruction(const SdrObject& rObject)
     }
 }
 
+SdrObject* ShapeList::getNextShape()
+{
+    if( maIter != maShapeList.end() )
+    {
+        return (*maIter++);
+    }
+    else
+    {
+        return 0;
+    }
+}
+
+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 8ad0ce3..fe0f1dd 100644
--- a/sd/source/ui/view/drviews1.cxx
+++ b/sd/source/ui/view/drviews1.cxx
@@ -1059,12 +1059,11 @@ 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);
 
-                for( ShapeList::const_iterator aIter( rShapeList.cbegin() );
-                    aIter != rShapeList.cend(); ++aIter )
+                while( (pObj = rShapeList.getNextShape()) )
                 {
-                    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 3cb0829..9023d02 100644
--- a/sd/source/ui/view/sdview5.cxx
+++ b/sd/source/ui/view/sdview5.cxx
@@ -101,10 +101,9 @@ SdrObject* View::GetEmptyPresentationObject( PresObjKind eKind )
         // last try to find empty pres obj of multiple type
         if( !pEmptyObj )
         {
-            ShapeList& rShapeList = pPage->GetPresentationShapeList();
+            const std::list< SdrObject* >& rShapes = pPage->GetPresentationShapeList().getList();
 
-            for( ShapeList::const_iterator iter( rShapeList.cbegin() );
-                 iter != rShapeList.cend(); ++iter )
+            for( std::list< SdrObject* >::const_iterator iter( rShapes.begin() ); iter != rShapes.end(); ++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 f5c6bc6..e834999 100644
--- a/sd/source/ui/view/viewoverlaymanager.cxx
+++ b/sd/source/ui/view/viewoverlaymanager.cxx
@@ -546,10 +546,9 @@ bool ViewOverlayManager::CreateTags()
 
     if( pPage && !pPage->IsMasterPage() && (pPage->GetPageKind() == PK_STANDARD) )
     {
-        ShapeList& rShapeList =  pPage->GetPresentationShapeList();
+        const std::list< SdrObject* >& rShapes = pPage->GetPresentationShapeList().getList();
 
-        for( ShapeList::const_iterator iter( rShapeList.cbegin() );
-             iter != rShapeList.cend(); ++iter )
+        for( std::list< SdrObject* >::const_iterator iter( rShapes.begin() ); iter != rShapes.end(); ++iter )
         {
             if( (*iter)->IsEmptyPresObj() && ((*iter)->GetObjIdentifier() == OBJ_OUTLINETEXT) && (mrBase.GetDrawView()->GetTextEditObject() != (*iter)) )
             {


More information about the Libreoffice-commits mailing list