[Libreoffice-commits] .: basctl/source

Fridrich Strba fridrich at kemper.freedesktop.org
Wed Mar 21 22:42:12 PDT 2012


 basctl/source/basicide/basides1.cxx        |   54 +++++++------
 basctl/source/basicide/basides2.cxx        |   20 ++--
 basctl/source/basicide/basides3.cxx        |   27 ++++--
 basctl/source/basicide/basidesh.cxx        |  117 +++++++++++++++--------------
 basctl/source/basicide/basobj2.cxx         |    2 
 basctl/source/basicide/basobj3.cxx         |    7 -
 basctl/source/basicide/bastypes.cxx        |    8 -
 basctl/source/basicide/localizationmgr.cxx |    5 -
 basctl/source/inc/basidesh.hxx             |    7 -
 9 files changed, 137 insertions(+), 110 deletions(-)

New commits:
commit 000bb6af72e934d7f0fd2291cea919437cfd5e2f
Author: Noel Grandin <noel at peralex.com>
Date:   Tue Mar 20 10:03:56 2012 +0200

    Convert tools/table.hxx usage to std::map in Basic IDE module

diff --git a/basctl/source/basicide/basides1.cxx b/basctl/source/basicide/basides1.cxx
index d78f43a..d0c9fba 100644
--- a/basctl/source/basicide/basides1.cxx
+++ b/basctl/source/basicide/basides1.cxx
@@ -146,6 +146,7 @@ void BasicIDEShell::ExecuteCurrent( SfxRequest& rReq )
                 DBG_ASSERT( nWhich, "Wich fuer SearchItem ?" );
                 const SfxPoolItem& rItem = pArgs->Get( nWhich );
                 DBG_ASSERT( rItem.ISA( SvxSearchItem ), "Kein Searchitem!" );
+                IDEWindowTable::const_iterator it;
                 if ( rItem.ISA( SvxSearchItem ) )
                 {
                     // memorize item because of the adjustments...
@@ -155,22 +156,20 @@ void BasicIDEShell::ExecuteCurrent( SfxRequest& rReq )
                     if ( ((const SvxSearchItem&)rItem).GetCommand() == SVX_SEARCHCMD_REPLACE_ALL )
                     {
                         sal_uInt16 nActModWindows = 0;
-                        IDEBaseWindow* pWin = aIDEWindowTable.First();
-                        while ( pWin )
+                        for( it = aIDEWindowTable.begin(); it != aIDEWindowTable.end(); ++it )
                         {
+                            IDEBaseWindow* pWin = it->second;
                             if ( !pWin->IsSuspended() && pWin->IsA( TYPE( ModulWindow ) ) )
                                 nActModWindows++;
-                            pWin = aIDEWindowTable.Next();
                         }
 
                         if ( ( nActModWindows <= 1 ) || ( !((const SvxSearchItem&)rItem).GetSelection() && QueryBox( pCurWin, WB_YES_NO|WB_DEF_YES, String( IDEResId( RID_STR_SEARCHALLMODULES ) ) ).Execute() == RET_YES ) )
                         {
-                            pWin = aIDEWindowTable.First();
-                            while ( pWin )
+                            for( it = aIDEWindowTable.begin(); it != aIDEWindowTable.end(); ++it )
                             {
+                                IDEBaseWindow* pWin = it->second;
                                 if ( !pWin->IsSuspended() && pWin->IsA( TYPE( ModulWindow ) ) )
                                     nFound = nFound + ((ModulWindow*)pWin)->StartSearchAndReplace( (const SvxSearchItem&)rItem );
-                                pWin = aIDEWindowTable.Next();
                             }
                         }
                         else
@@ -187,8 +186,15 @@ void BasicIDEShell::ExecuteCurrent( SfxRequest& rReq )
                         {
                             // search other modules...
                             sal_Bool bChangeCurWindow = sal_False;
-                            aIDEWindowTable.Seek( pCurWin );
-                            IDEBaseWindow* pWin = aIDEWindowTable.Next();
+                            for( it = aIDEWindowTable.begin(); it != aIDEWindowTable.end(); ++it )
+                                if ( it->second == pCurWin)
+                                    break;
+                            if ( it != aIDEWindowTable.end() )
+                                ++it;
+                            IDEBaseWindow* pWin = NULL;
+                            if ( it != aIDEWindowTable.end() )
+                                pWin = it->second;
+
                             sal_Bool bSearchedFromStart = sal_False;
                             while ( !nFound && !bCanceled && ( pWin || !bSearchedFromStart ) )
                             {
@@ -200,7 +206,9 @@ void BasicIDEShell::ExecuteCurrent( SfxRequest& rReq )
                                     QueryBox aQuery(pParent, WB_YES_NO|WB_DEF_YES, ResId::toString(IDEResId(RID_STR_SEARCHFROMSTART)));
                                     if ( aQuery.Execute() == RET_YES )
                                     {
-                                        pWin = aIDEWindowTable.First();
+                                        it = aIDEWindowTable.begin();
+                                        if ( it != aIDEWindowTable.end() )
+                                            pWin = it->second;
                                         bSearchedFromStart = sal_True;
                                     }
                                     else
@@ -222,7 +230,11 @@ void BasicIDEShell::ExecuteCurrent( SfxRequest& rReq )
                                     }
                                 }
                                 if ( pWin && ( pWin != pCurWin ) )
-                                    pWin = aIDEWindowTable.Next();
+                                {
+                                    ++it;
+                                    if ( it != aIDEWindowTable.end() )
+                                        pWin = it->second;
+                                }
                                 else
                                     pWin = 0;
                             }
@@ -453,10 +465,10 @@ void BasicIDEShell::ExecuteGlobal( SfxRequest& rReq )
             DBG_ASSERT( rReq.GetArgs(), "arguments expected" );
             const SfxUInt16Item &rTabId = (const SfxUInt16Item&)rReq.GetArgs()->Get(SID_BASICIDE_ARG_TABID );
             const SfxStringItem &rModName = (const SfxStringItem&)rReq.GetArgs()->Get(SID_BASICIDE_ARG_MODULENAME );
-            IDEBaseWindow* pWin = aIDEWindowTable.Get( rTabId.GetValue() );
             DBG_ASSERT( pWin, "Window nicht im Liste, aber in TabBar ?" );
-            if ( pWin )
+            if ( aIDEWindowTable.find( rTabId.GetValue() ) !=  aIDEWindowTable.end() )
             {
+                IDEBaseWindow* pWin = aIDEWindowTable[ rTabId.GetValue() ];
                 ::rtl::OUString aNewName( rModName.GetValue() );
                 ::rtl::OUString aOldName( pWin->GetName() );
                 if ( aNewName != aOldName )
@@ -490,7 +502,7 @@ void BasicIDEShell::ExecuteGlobal( SfxRequest& rReq )
                     else
                     {
                         // set old name in TabWriter
-                        sal_uInt16 nId = (sal_uInt16)aIDEWindowTable.GetKey( pWin );
+                        sal_uInt16 nId = GetIDEWindowId( pWin );
                         DBG_ASSERT( nId, "No entry in Tabbar!" );
                         if ( nId )
                             pTabBar->SetPageText( nId, aOldName );
@@ -523,9 +535,9 @@ void BasicIDEShell::ExecuteGlobal( SfxRequest& rReq )
         case SID_BASICIDE_STOREALLMODULESOURCES:
         case SID_BASICIDE_UPDATEALLMODULESOURCES:
         {
-            IDEBaseWindow* pWin = aIDEWindowTable.First();
-            while ( pWin )
+            for( IDEWindowTable::const_iterator it = aIDEWindowTable.begin(); it != aIDEWindowTable.end(); ++it )
             {
+                IDEBaseWindow* pWin = it->second;
                 if ( !pWin->IsSuspended() && pWin->IsA( TYPE( ModulWindow ) ) )
                 {
                     if ( rReq.GetSlot() == SID_BASICIDE_STOREALLMODULESOURCES )
@@ -533,7 +545,6 @@ void BasicIDEShell::ExecuteGlobal( SfxRequest& rReq )
                     else
                         pWin->UpdateData();
                 }
-                pWin = aIDEWindowTable.Next();
             }
         }
         break;
@@ -1192,7 +1203,7 @@ void BasicIDEShell::SetCurWindow( IDEBaseWindow* pNewWin, sal_Bool bUpdateTabBar
         }
         if ( bUpdateTabBar )
         {
-            sal_uLong nKey = aIDEWindowTable.GetKey( pCurWin );
+            sal_uLong nKey = GetIDEWindowId( pCurWin );
             if ( pCurWin && ( pTabBar->GetPagePos( (sal_uInt16)nKey ) == TAB_PAGE_NOTFOUND ) )
                 pTabBar->InsertPage( (sal_uInt16)nKey, pCurWin->GetTitle() );   // has just been faded in
             pTabBar->SetCurPageId( (sal_uInt16)nKey );
@@ -1275,9 +1286,9 @@ IDEBaseWindow* BasicIDEShell::FindApplicationWindow()
 
 IDEBaseWindow* BasicIDEShell::FindWindow( const ScriptDocument& rDocument, const ::rtl::OUString& rLibName, const ::rtl::OUString& rName, BasicIDEType nType, sal_Bool bFindSuspended )
 {
-    IDEBaseWindow* pWin = aIDEWindowTable.First();
-    while ( pWin )
+    for( IDEWindowTable::const_iterator it = aIDEWindowTable.begin(); it != aIDEWindowTable.end(); ++it )
     {
+        IDEBaseWindow* pWin = it->second;
         if ( !pWin->IsSuspended() || bFindSuspended )
         {
             if ( rLibName.isEmpty() || rName.isEmpty() || nType == BASICIDE_TYPE_UNKNOWN )
@@ -1292,7 +1303,6 @@ IDEBaseWindow* BasicIDEShell::FindWindow( const ScriptDocument& rDocument, const
                 return pWin;
             }
         }
-        pWin = aIDEWindowTable.Next();
     }
     return 0;
 }
@@ -1451,9 +1461,9 @@ void BasicIDEShell::Deactivate( sal_Bool bMDI )
 
         // test CanClose to also test during deactivating the BasicIDE whether
         // the sourcecode is too large in one of the modules...
-        for ( sal_uLong nWin = 0; nWin < aIDEWindowTable.Count(); nWin++ )
+        for( IDEWindowTable::const_iterator it = aIDEWindowTable.begin(); it != aIDEWindowTable.end(); ++it )
         {
-            IDEBaseWindow* pWin = aIDEWindowTable.GetObject( nWin );
+            IDEBaseWindow* pWin = it->second;
             if ( /* !pWin->IsSuspended() && */ !pWin->CanClose() )
             {
                 if ( !m_aCurLibName.isEmpty() && ( pWin->IsDocument( m_aCurDocument ) || pWin->GetLibName() != m_aCurLibName ) )
diff --git a/basctl/source/basicide/basides2.cxx b/basctl/source/basicide/basides2.cxx
index f4a0d0e..0e83a8e 100644
--- a/basctl/source/basicide/basides2.cxx
+++ b/basctl/source/basicide/basides2.cxx
@@ -231,13 +231,7 @@ ModulWindow* BasicIDEShell::CreateBasWin( const ScriptDocument& rDocument, const
     else
     {
         pWin->SetStatus( pWin->GetStatus() & ~BASWIN_SUSPENDED );
-        IDEBaseWindow* pTmp = aIDEWindowTable.First();
-        while ( pTmp && !nKey )
-        {
-            if ( pTmp == pWin )
-                nKey = aIDEWindowTable.GetCurKey();
-            pTmp = aIDEWindowTable.Next();
-        }
+        nKey = GetIDEWindowId( pWin );
         DBG_ASSERT( nKey, "CreateBasWin: Kein Key- Fenster nicht gefunden!" );
     }
     if( nKey && xLib.is() && rDocument.isInVBAMode() )
@@ -269,17 +263,23 @@ ModulWindow* BasicIDEShell::CreateBasWin( const ScriptDocument& rDocument, const
 ModulWindow* BasicIDEShell::FindBasWin( const ScriptDocument& rDocument, const ::rtl::OUString& rLibName, const ::rtl::OUString& rModName, sal_Bool bCreateIfNotExist, sal_Bool bFindSuspended )
 {
     ModulWindow* pModWin = 0;
-    IDEBaseWindow* pWin = aIDEWindowTable.First();
-    while ( pWin && !pModWin )
+    for( IDEWindowTable::const_iterator it = aIDEWindowTable.begin();
+         it != aIDEWindowTable.end(); ++it )
     {
+        IDEBaseWindow* pWin = it->second;
         if ( ( !pWin->IsSuspended() || bFindSuspended ) && pWin->IsA( TYPE( ModulWindow ) ) )
         {
             if ( rLibName.isEmpty() )
+            {
                 pModWin = (ModulWindow*)pWin;
+                break;
+            }
             else if ( pWin->IsDocument( rDocument ) && pWin->GetLibName() == rLibName && pWin->GetName() == rModName )
+            {
                 pModWin = (ModulWindow*)pWin;
+                break;
+            }
         }
-        pWin = aIDEWindowTable.Next();
     }
     if ( !pModWin && bCreateIfNotExist )
         pModWin = CreateBasWin( rDocument, rLibName, rModName );
diff --git a/basctl/source/basicide/basides3.cxx b/basctl/source/basicide/basides3.cxx
index b00d8e6..ea0d288 100644
--- a/basctl/source/basicide/basides3.cxx
+++ b/basctl/source/basicide/basides3.cxx
@@ -110,13 +110,7 @@ DialogWindow* BasicIDEShell::CreateDlgWin( const ScriptDocument& rDocument, cons
     else
     {
         pWin->SetStatus( pWin->GetStatus() & ~BASWIN_SUSPENDED );
-        IDEBaseWindow* pTmp = aIDEWindowTable.First();
-        while ( pTmp && !nKey )
-        {
-            if ( pTmp == pWin )
-                nKey = aIDEWindowTable.GetCurKey();
-            pTmp = aIDEWindowTable.Next();
-        }
+        nKey = GetIDEWindowId( pWin );
         DBG_ASSERT( nKey, "CreateDlgWin: Kein Key - Fenster nicht gefunden!" );
     }
 
@@ -136,17 +130,22 @@ DialogWindow* BasicIDEShell::CreateDlgWin( const ScriptDocument& rDocument, cons
 DialogWindow* BasicIDEShell::FindDlgWin( const ScriptDocument& rDocument, const ::rtl::OUString& rLibName, const ::rtl::OUString& rDlgName, sal_Bool bCreateIfNotExist, sal_Bool bFindSuspended )
 {
     DialogWindow* pDlgWin = 0;
-    IDEBaseWindow* pWin = aIDEWindowTable.First();
-    while ( pWin && !pDlgWin )
+    for( IDEWindowTable::const_iterator it = aIDEWindowTable.begin(); it != aIDEWindowTable.end(); ++it )
     {
+        IDEBaseWindow* pWin = it->second;
         if ( ( !pWin->IsSuspended() || bFindSuspended ) && pWin->IsA( TYPE( DialogWindow ) ) )
         {
             if ( rLibName.isEmpty() )
+            {
                 pDlgWin = (DialogWindow*)pWin;
+                break;
+            }
             else if ( pWin->IsDocument( rDocument ) && pWin->GetLibName() == rLibName && pWin->GetName() == rDlgName )
+            {
                 pDlgWin = (DialogWindow*)pWin;
+                break;
+            }
         }
-        pWin = aIDEWindowTable.Next();
     }
     if ( !pDlgWin && bCreateIfNotExist )
         pDlgWin = CreateDlgWin( rDocument, rLibName, rDlgName );
@@ -154,6 +153,14 @@ DialogWindow* BasicIDEShell::FindDlgWin( const ScriptDocument& rDocument, const
     return pDlgWin;
 }
 
+sal_uInt16 BasicIDEShell::GetIDEWindowId(const IDEBaseWindow* pWin) const
+{
+    for( IDEWindowTable::const_iterator it = aIDEWindowTable.begin(); it != aIDEWindowTable.end(); ++it )
+        if ( it->second == pWin )
+            return it->first;
+    return 0;
+}
+
 SdrView* BasicIDEShell::GetCurDlgView() const
 {
     if ( !pCurWin || !pCurWin->IsA( TYPE( DialogWindow ) ) )
diff --git a/basctl/source/basicide/basidesh.cxx b/basctl/source/basicide/basidesh.cxx
index 5aaf09c..e4dcd98 100644
--- a/basctl/source/basicide/basidesh.cxx
+++ b/basctl/source/basicide/basidesh.cxx
@@ -245,15 +245,13 @@ BasicIDEShell::~BasicIDEShell()
     SetWindow( 0 );
     SetCurWindow( 0 );
 
-    IDEBaseWindow* pWin = aIDEWindowTable.First();
-    while ( pWin )
+    for( IDEWindowTable::const_iterator it = aIDEWindowTable.begin(); it != aIDEWindowTable.end(); ++it )
     {
         // no store; does already happen when the BasicManagers are destroyed
-        delete pWin;
-        pWin = aIDEWindowTable.Next();
+        delete it->second;
     }
 
-    aIDEWindowTable.Clear();
+    aIDEWindowTable.clear();
     delete pTabBar;
     delete pObjectCatalog;
     DestroyModulWindowLayout();
@@ -316,11 +314,12 @@ void BasicIDEShell::onDocumentClosed( const ScriptDocument& _rDocument )
 
     bool bSetCurWindow = false;
     bool bSetCurLib = ( _rDocument == m_aCurDocument );
+    std::vector<IDEBaseWindow*> aDeleteVec;
 
     // remove all windows which belong to this document
-    for ( sal_uLong nWin = aIDEWindowTable.Count(); nWin; )
+    for( IDEWindowTable::const_iterator it = aIDEWindowTable.begin(); it != aIDEWindowTable.end(); ++it )
     {
-        IDEBaseWindow* pWin = aIDEWindowTable.GetObject( --nWin );
+        IDEBaseWindow* pWin = it->second;
         if ( pWin->IsDocument( _rDocument ) )
         {
             if ( pWin->GetStatus() & (BASWIN_RUNNINGBASIC|BASWIN_INRESCHEDULE) )
@@ -332,14 +331,18 @@ void BasicIDEShell::onDocumentClosed( const ScriptDocument& _rDocument )
                 pWin->BasicStopped();
             }
             else
-            {
-                pWin->StoreData();
-                if ( pWin == pCurWin )
-                    bSetCurWindow = true;
-                RemoveWindow( pWin, sal_True, sal_False );
-            }
+                aDeleteVec.push_back( pWin );
         }
     }
+    // delete windows outside main loop so we don't invalidate the original iterator
+    for( std::vector<IDEBaseWindow*>::const_iterator it = aDeleteVec.begin(); it != aDeleteVec.end(); ++it )
+    {
+        IDEBaseWindow* pWin = *it;
+        pWin->StoreData();
+        if ( pWin == pCurWin )
+            bSetCurWindow = true;
+        RemoveWindow( pWin, sal_True, sal_False );
+    }
 
     // remove lib info
     BasicIDEData* pData = BasicIDEGlobals::GetExtraData();
@@ -362,9 +365,9 @@ void BasicIDEShell::onDocumentTitleChanged( const ScriptDocument& /*_rDocument*/
 
 void BasicIDEShell::onDocumentModeChanged( const ScriptDocument& _rDocument )
 {
-    for ( sal_uLong nWin = aIDEWindowTable.Count(); nWin; )
+    for( IDEWindowTable::const_iterator it = aIDEWindowTable.begin(); it != aIDEWindowTable.end(); ++it )
     {
-        IDEBaseWindow* pWin = aIDEWindowTable.GetObject( --nWin );
+        IDEBaseWindow* pWin = it->second;
         if ( pWin->IsDocument( _rDocument ) && _rDocument.isDocument() )
             pWin->SetReadOnly( _rDocument.isReadOnly() );
     }
@@ -372,9 +375,9 @@ void BasicIDEShell::onDocumentModeChanged( const ScriptDocument& _rDocument )
 
 void BasicIDEShell::StoreAllWindowData( sal_Bool bPersistent )
 {
-    for ( sal_uLong nWin = 0; nWin < aIDEWindowTable.Count(); nWin++ )
+    for( IDEWindowTable::const_iterator it = aIDEWindowTable.begin(); it != aIDEWindowTable.end(); ++it )
     {
-        IDEBaseWindow* pWin = aIDEWindowTable.GetObject( nWin );
+        IDEBaseWindow* pWin = it->second;
         DBG_ASSERT( pWin, "PrepareClose: NULL-Pointer in Table?" );
         if ( !pWin->IsSuspended() )
             pWin->StoreData();
@@ -414,9 +417,9 @@ sal_uInt16 BasicIDEShell::PrepareClose( sal_Bool bUI, sal_Bool bForBrowsing )
     else
     {
         sal_Bool bCanClose = sal_True;
-        for ( sal_uLong nWin = 0; bCanClose && ( nWin < aIDEWindowTable.Count() ); nWin++ )
+        for ( sal_uLong nWin = 0; bCanClose && ( nWin < aIDEWindowTable.size() ); nWin++ )
         {
-            IDEBaseWindow* pWin = aIDEWindowTable.GetObject( nWin );
+            IDEBaseWindow* pWin = aIDEWindowTable[ nWin ];
             if ( !pWin->CanClose() )
             {
                 if ( !m_aCurLibName.isEmpty() && ( pWin->IsDocument( m_aCurDocument ) || pWin->GetLibName() != m_aCurLibName ) )
@@ -484,7 +487,7 @@ IMPL_LINK_INLINE_END( BasicIDEShell, TabBarSplitHdl, TabBar *, pTBar )
 IMPL_LINK( BasicIDEShell, TabBarHdl, TabBar *, pCurTabBar )
 {
     sal_uInt16 nCurId = pCurTabBar->GetCurPageId();
-    IDEBaseWindow* pWin = aIDEWindowTable.Get( nCurId );
+    IDEBaseWindow* pWin = aIDEWindowTable[ nCurId ];
     DBG_ASSERT( pWin, "Eintrag in TabBar passt zu keinem Fenster!" );
     SetCurWindow( pWin );
 
@@ -505,7 +508,7 @@ sal_Bool BasicIDEShell::NextPage( sal_Bool bPrev )
 
     if ( nPos < pTabBar->GetPageCount() )
     {
-        IDEBaseWindow* pWin = aIDEWindowTable.Get( pTabBar->GetPageId( nPos ) );
+        IDEBaseWindow* pWin = aIDEWindowTable[ pTabBar->GetPageId( nPos ) ];
         SetCurWindow( pWin, sal_True );
         bRet = sal_True;
     }
@@ -652,14 +655,14 @@ void BasicIDEShell::SFX_NOTIFY( SfxBroadcaster& rBC, const TypeId&,
                         m_pCurLocalizationMgr->handleBasicStarted();
                     }
 
-                    IDEBaseWindow* pWin = aIDEWindowTable.First();
-                    while ( pWin )
+                    for( IDEWindowTable::const_iterator it = aIDEWindowTable.begin();
+                         it != aIDEWindowTable.end(); ++it )
                     {
+                        IDEBaseWindow* pWin = it->second;
                         if ( nHintId == SBX_HINT_BASICSTART )
                             pWin->BasicStarted();
                         else
                             pWin->BasicStopped();
-                        pWin = aIDEWindowTable.Next();
                     }
                 }
             }
@@ -672,17 +675,20 @@ void BasicIDEShell::SFX_NOTIFY( SfxBroadcaster& rBC, const TypeId&,
 void BasicIDEShell::CheckWindows()
 {
     sal_Bool bSetCurWindow = sal_False;
-    for ( sal_uLong nWin = 0; nWin < aIDEWindowTable.Count(); nWin++ )
+    std::vector<IDEBaseWindow*> aDeleteVec;
+    for( IDEWindowTable::const_iterator it = aIDEWindowTable.begin(); it != aIDEWindowTable.end(); ++it )
     {
-        IDEBaseWindow* pWin = aIDEWindowTable.GetObject( nWin );
+        IDEBaseWindow* pWin = it->second;
         if ( pWin->GetStatus() & BASWIN_TOBEKILLED )
-        {
-            pWin->StoreData();
-            if ( pWin == pCurWin )
-                bSetCurWindow = sal_True;
-            RemoveWindow( pWin, sal_True, sal_False );
-            nWin--;
-        }
+            aDeleteVec.push_back( pWin );
+    }
+    for ( std::vector<IDEBaseWindow*>::const_iterator it = aDeleteVec.begin(); it != aDeleteVec.end(); ++it )
+    {
+        IDEBaseWindow* pWin = *it;
+        pWin->StoreData();
+        if ( pWin == pCurWin )
+            bSetCurWindow = sal_True;
+        RemoveWindow( pWin, sal_True, sal_False );
     }
     if ( bSetCurWindow )
         SetCurWindow( FindApplicationWindow(), sal_True );
@@ -693,17 +699,20 @@ void BasicIDEShell::CheckWindows()
 void BasicIDEShell::RemoveWindows( const ScriptDocument& rDocument, const ::rtl::OUString& rLibName, sal_Bool bDestroy )
 {
     sal_Bool bChangeCurWindow = pCurWin ? sal_False : sal_True;
-    for ( sal_uLong nWin = 0; nWin < aIDEWindowTable.Count(); nWin++ )
+    std::vector<IDEBaseWindow*> aDeleteVec;
+    for( IDEWindowTable::const_iterator it = aIDEWindowTable.begin(); it != aIDEWindowTable.end(); ++it )
     {
-        IDEBaseWindow* pWin = aIDEWindowTable.GetObject( nWin );
+        IDEBaseWindow* pWin = it->second;
         if ( pWin->IsDocument( rDocument ) && pWin->GetLibName() == rLibName )
-        {
-            if ( pWin == pCurWin )
-                bChangeCurWindow = sal_True;
-            pWin->StoreData();
-            RemoveWindow( pWin, bDestroy, sal_False );
-            nWin--;
-        }
+            aDeleteVec.push_back( pWin );
+    }
+    for ( std::vector<IDEBaseWindow*>::const_iterator it = aDeleteVec.begin(); it != aDeleteVec.end(); ++it )
+    {
+        IDEBaseWindow* pWin = *it;
+        if ( pWin == pCurWin )
+            bChangeCurWindow = sal_True;
+        pWin->StoreData();
+        RemoveWindow( pWin, bDestroy, sal_False );
     }
     if ( bChangeCurWindow )
         SetCurWindow( FindApplicationWindow(), sal_True );
@@ -717,9 +726,10 @@ void BasicIDEShell::UpdateWindows()
     sal_Bool bChangeCurWindow = pCurWin ? sal_False : sal_True;
     if ( !m_aCurLibName.isEmpty() )
     {
-        for ( sal_uLong nWin = 0; nWin < aIDEWindowTable.Count(); nWin++ )
+        std::vector<IDEBaseWindow*> aDeleteVec;
+        for( IDEWindowTable::const_iterator it = aIDEWindowTable.begin(); it != aIDEWindowTable.end(); ++it )
         {
-            IDEBaseWindow* pWin = aIDEWindowTable.GetObject( nWin );
+            IDEBaseWindow* pWin = it->second;
             if ( !pWin->IsDocument( m_aCurDocument ) || pWin->GetLibName() != m_aCurLibName )
             {
                 if ( pWin == pCurWin )
@@ -729,12 +739,13 @@ void BasicIDEShell::UpdateWindows()
                 // Window is frozen at first, later the windows should be changed
                 // anyway to be marked as hidden instead of being deleted.
                 if ( !(pWin->GetStatus() & ( BASWIN_TOBEKILLED | BASWIN_RUNNINGBASIC | BASWIN_SUSPENDED ) ) )
-                {
-                    RemoveWindow( pWin, sal_False, sal_False );
-                    nWin--;
-                }
+                    aDeleteVec.push_back( pWin );
             }
         }
+        for ( std::vector<IDEBaseWindow*>::const_iterator it = aDeleteVec.begin(); it != aDeleteVec.end(); ++it )
+        {
+            RemoveWindow( *it, sal_False, sal_False );
+        }
     }
 
     if ( bCreatingWindow )
@@ -859,9 +870,9 @@ void BasicIDEShell::UpdateWindows()
 void BasicIDEShell::RemoveWindow( IDEBaseWindow* pWindow_, sal_Bool bDestroy, sal_Bool bAllowChangeCurWindow )
 {
     DBG_ASSERT( pWindow_, "Kann keinen NULL-Pointer loeschen!" );
-    sal_uLong nKey = aIDEWindowTable.GetKey( pWindow_ );
+    sal_uLong nKey = GetIDEWindowId( pWindow_ );
     pTabBar->RemovePage( (sal_uInt16)nKey );
-    aIDEWindowTable.Remove( nKey );
+    aIDEWindowTable.erase( nKey );
     if ( pWindow_ == pCurWin )
     {
         if ( bAllowChangeCurWindow )
@@ -895,7 +906,7 @@ void BasicIDEShell::RemoveWindow( IDEBaseWindow* pWindow_, sal_Bool bDestroy, sa
                 // there will be no notify...
                 pWindow_->BasicStopped();
             }
-            aIDEWindowTable.Insert( nKey, pWindow_ );   // jump in again
+            aIDEWindowTable[ nKey ] = pWindow_;   // jump in again
         }
     }
     else
@@ -903,7 +914,7 @@ void BasicIDEShell::RemoveWindow( IDEBaseWindow* pWindow_, sal_Bool bDestroy, sa
         pWindow_->Hide();
         pWindow_->AddStatus( BASWIN_SUSPENDED );
         pWindow_->Deactivating();
-        aIDEWindowTable.Insert( nKey, pWindow_ );   // jump in again
+        aIDEWindowTable[ nKey ] = pWindow_;   // jump in again
     }
 
 }
@@ -913,7 +924,7 @@ void BasicIDEShell::RemoveWindow( IDEBaseWindow* pWindow_, sal_Bool bDestroy, sa
 sal_uInt16 BasicIDEShell::InsertWindowInTable( IDEBaseWindow* pNewWin )
 {
     nCurKey++;
-    aIDEWindowTable.Insert( nCurKey, pNewWin );
+    aIDEWindowTable[ nCurKey ] = pNewWin;
     return nCurKey;
 }
 
diff --git a/basctl/source/basicide/basobj2.cxx b/basctl/source/basicide/basobj2.cxx
index 36ee590..ddbc3a4 100644
--- a/basctl/source/basicide/basobj2.cxx
+++ b/basctl/source/basicide/basobj2.cxx
@@ -208,7 +208,7 @@ bool RenameModule( Window* pErrorParent, const ScriptDocument& rDocument, const
             pModWin->SetSbModule( (SbModule*)pModWin->GetBasic()->FindModule( rNewName ) );
 
             // update tabwriter
-            sal_uInt16 nId = (sal_uInt16)(pIDEShell->GetIDEWindowTable()).GetKey( pWin );
+            sal_uInt16 nId = pIDEShell->GetIDEWindowId( pWin );
             DBG_ASSERT( nId, "No entry in Tabbar!" );
             if ( nId )
             {
diff --git a/basctl/source/basicide/basobj3.cxx b/basctl/source/basicide/basobj3.cxx
index 77e3c8e..338e5e0 100644
--- a/basctl/source/basicide/basobj3.cxx
+++ b/basctl/source/basicide/basobj3.cxx
@@ -217,7 +217,7 @@ bool RenameDialog( Window* pErrorParent, const ScriptDocument& rDocument, const
         ((DialogWindow*)pWin)->UpdateBrowser();
 
         // update tabwriter
-        sal_uInt16 nId = (sal_uInt16)(pIDEShell->GetIDEWindowTable()).GetKey( pWin );
+        sal_uInt16 nId = pIDEShell->GetIDEWindowId( pWin );
         DBG_ASSERT( nId, "No entry in Tabbar!" );
         if ( nId )
         {
@@ -338,13 +338,12 @@ void StopBasic()
     if ( pShell )
     {
         IDEWindowTable& rWindows = pShell->GetIDEWindowTable();
-        IDEBaseWindow* pWin = rWindows.First();
-        while ( pWin )
+        for( IDEWindowTable::const_iterator it = rWindows.begin(); it != rWindows.end(); ++it )
         {
+            IDEBaseWindow* pWin = it->second;
             // call BasicStopped manually because the Stop-Notify
             // might not get through otherwise
             pWin->BasicStopped();
-            pWin = rWindows.Next();
         }
     }
     BasicIDE::BasicStopped();
diff --git a/basctl/source/basicide/bastypes.cxx b/basctl/source/basicide/bastypes.cxx
index 3ea2668..389dd78 100644
--- a/basctl/source/basicide/bastypes.cxx
+++ b/basctl/source/basicide/bastypes.cxx
@@ -462,10 +462,10 @@ void BasicIDETabBar::Command( const CommandEvent& rCEvt )
                     if( pBasic )
                     {
                         IDEWindowTable& aIDEWindowTable = pIDEShell->GetIDEWindowTable();
-                        IDEBaseWindow* pWin = aIDEWindowTable.Get( GetCurPageId() );
-                        if( pWin && pWin->ISA( ModulWindow ) )
+                        IDEWindowTable::const_iterator it = aIDEWindowTable.find( GetCurPageId() );
+                        if( it != aIDEWindowTable.end() && it->second->ISA( ModulWindow ) )
                         {
-                            SbModule* pActiveModule = (SbModule*)pBasic->FindModule( pWin->GetName() );
+                            SbModule* pActiveModule = (SbModule*)pBasic->FindModule( it->second->GetName() );
                             if( pActiveModule && ( pActiveModule->GetModuleType() == script::ModuleType::DOCUMENT ) )
                             {
                                 aPopup.EnableItem( SID_BASICIDE_DELETECURRENT, sal_False );
@@ -532,7 +532,7 @@ void BasicIDETabBar::Sort()
             sal_uInt16 nId = GetPageId( i );
             aTabBarSortHelper.nPageId = nId;
             aTabBarSortHelper.aPageText = GetPageText( nId );
-            IDEBaseWindow* pWin = aIDEWindowTable.Get( nId );
+            IDEBaseWindow* pWin = aIDEWindowTable[ nId ];
 
             if ( pWin->IsA( TYPE( ModulWindow ) ) )
             {
diff --git a/basctl/source/basicide/localizationmgr.cxx b/basctl/source/basicide/localizationmgr.cxx
index 59f2316..289e0cc 100644
--- a/basctl/source/basicide/localizationmgr.cxx
+++ b/basctl/source/basicide/localizationmgr.cxx
@@ -823,10 +823,10 @@ DialogWindow* FindDialogWindowForEditor( DlgEditor* pEditor )
 {
     BasicIDEShell* pIDEShell = BasicIDEGlobals::GetShell();
     IDEWindowTable& aIDEWindowTable = pIDEShell->GetIDEWindowTable();
-    IDEBaseWindow* pWin = aIDEWindowTable.First();
     DialogWindow* pFoundDlgWin = NULL;
-    while( pWin )
+    for( IDEWindowTable::const_iterator it = aIDEWindowTable.begin(); it != aIDEWindowTable.end(); ++it )
     {
+        IDEBaseWindow* pWin = it->second;
         if ( !pWin->IsSuspended() && pWin->IsA( TYPE( DialogWindow ) ) )
         {
             DialogWindow* pDlgWin = (DialogWindow*)pWin;
@@ -837,7 +837,6 @@ DialogWindow* FindDialogWindowForEditor( DlgEditor* pEditor )
                 break;
             }
         }
-        pWin = aIDEWindowTable.Next();
     }
     return pFoundDlgWin;
 }
diff --git a/basctl/source/inc/basidesh.hxx b/basctl/source/inc/basidesh.hxx
index 2162b7a..6b56b43 100644
--- a/basctl/source/inc/basidesh.hxx
+++ b/basctl/source/inc/basidesh.hxx
@@ -34,8 +34,8 @@
 #include <com/sun/star/container/XContainerListener.hpp>
 #include <sfx2/viewsh.hxx>
 #include <svx/ifaceids.hxx>
-#include <tools/table.hxx>
 #include <vcl/scrbar.hxx>
+#include <map>
 
 class SfxViewFactory;
 
@@ -60,9 +60,9 @@ class LocalizationMgr;
 struct BasicIDEShell_Impl;
 
 #if _SOLAR__PRIVATE
-DECLARE_TABLE( IDEWindowTable, IDEBaseWindow* )
+typedef std::map<sal_uInt16, IDEBaseWindow*> IDEWindowTable;
 #else
-typedef Table IDEWindowTable;
+typedef std::map<sal_uInt16, void*> IDEWindowTable;
 #endif
 
 namespace BasicIDE
@@ -186,6 +186,7 @@ public:
     ScrollBarBox&       GetScrollBarBox()       { return aScrollBarBox; }
     TabBar*             GetTabBar()             { return (TabBar*)pTabBar; }
     IDEWindowTable&     GetIDEWindowTable()     { return aIDEWindowTable; }
+    sal_uInt16          GetIDEWindowId(const IDEBaseWindow* pWin) const;
 
     SdrView*            GetCurDlgView() const;
 


More information about the Libreoffice-commits mailing list