[Libreoffice-commits] .: Branch 'feature/unlimited-number-of-sheets' - sc/source

Markus Mohrhard mmohrhard at kemper.freedesktop.org
Tue May 17 17:51:53 PDT 2011


 sc/source/ui/inc/viewdata.hxx  |    2 
 sc/source/ui/view/viewdata.cxx |   94 ++++++++++++++---------------------------
 2 files changed, 35 insertions(+), 61 deletions(-)

New commits:
commit 9b0ccb46afe6fd7b83e5678b3ab8e695480ab346
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Wed May 18 02:42:28 2011 +0200

    rework ScViewData to work with unlimited number of sheets

diff --git a/sc/source/ui/inc/viewdata.hxx b/sc/source/ui/inc/viewdata.hxx
index c1e25c2..c1a5448 100644
--- a/sc/source/ui/inc/viewdata.hxx
+++ b/sc/source/ui/inc/viewdata.hxx
@@ -170,7 +170,7 @@ class SC_DLLPUBLIC ScViewData
 private:
     double				nPPTX, nPPTY;				// Scaling-Faktoren
 
-    ScViewDataTable*	pTabData[MAXTABCOUNT];
+    ::std::vector<ScViewDataTable*> pTabData;
     ScViewDataTable*	pThisTab;					// Daten der angezeigten Tabelle
     ScDocShell*			pDocShell;
     ScDocument*			pDoc;
diff --git a/sc/source/ui/view/viewdata.cxx b/sc/source/ui/view/viewdata.cxx
index c3e4d0c..c95bd68 100644
--- a/sc/source/ui/view/viewdata.cxx
+++ b/sc/source/ui/view/viewdata.cxx
@@ -296,7 +296,8 @@ void ScViewDataTable::ReadUserDataSequence(const uno::Sequence <beans::PropertyV
 }
 
 ScViewData::ScViewData( ScDocShell* pDocSh, ScTabViewShell* pViewSh )
-    :	pDocShell	( pDocSh ),
+    :	pTabData(),
+        pDocShell	( pDocSh ),
         pDoc		( NULL ),
         pView		( pViewSh ),
         pViewShell	( pViewSh ),
@@ -331,9 +332,8 @@ ScViewData::ScViewData( ScDocShell* pDocSh, ScTabViewShell* pViewSh )
 
     aScrSize = Size( (long) ( STD_COL_WIDTH 		  * PIXEL_PER_TWIPS * OLE_STD_CELLS_X ),
                      (long) ( ScGlobal::nStdRowHeight * PIXEL_PER_TWIPS * OLE_STD_CELLS_Y ) );
-    pTabData[0] = new ScViewDataTable;
+    pTabData.push_back( new ScViewDataTable() );
     for ( SCTAB i = 1; i <= MAXTAB; i++ )
-        pTabData[i] = NULL;
     pThisTab = pTabData[nTabNo];
     for (sal_uInt16 j=0; j<4; j++)
     {
@@ -355,9 +355,11 @@ ScViewData::ScViewData( ScDocShell* pDocSh, ScTabViewShell* pViewSh )
     if (pDoc && !pDoc->IsVisible(nTabNo))
     {
         while ( !pDoc->IsVisible(nTabNo) && pDoc->HasTable(nTabNo+1) )
+        {
             ++nTabNo;
-
-        pTabData[nTabNo] = new ScViewDataTable;
+            pTabData.push_back(NULL);
+        }
+        pTabData[nTabNo] = new ScViewDataTable() ;
         pThisTab = pTabData[nTabNo];
     }
 
@@ -365,7 +367,8 @@ ScViewData::ScViewData( ScDocShell* pDocSh, ScTabViewShell* pViewSh )
 }
 
 ScViewData::ScViewData( const ScViewData& rViewData )
-    :	pDocShell	( rViewData.pDocShell ),
+    :	pTabData( rViewData.pTabData ),
+        pDocShell	( rViewData.pDocShell ),
         pDoc		( rViewData.pDoc ),
         pView		( rViewData.pView ),
         pViewShell	( rViewData.pViewShell ),
@@ -398,11 +401,7 @@ ScViewData::ScViewData( const ScViewData& rViewData )
     SetOutlineMode	( rViewData.IsOutlineMode() );
 
     aScrSize = rViewData.aScrSize;
-    for ( SCTAB i = 0; i <= MAXTAB; i++ )
-        if (rViewData.pTabData[i])
-            pTabData[i] = new ScViewDataTable( *rViewData.pTabData[i] );
-        else
-            pTabData[i] = NULL;
+
     pThisTab = pTabData[nTabNo];
     for (sal_uInt16 j=0; j<4; j++)
     {
@@ -436,10 +435,6 @@ ScDocument* ScViewData::GetDocument() const
 
 ScViewData::~ScViewData()
 {
-    for (SCTAB i=0; i<=MAXTAB; i++)
-        if (pTabData[i])
-            delete pTabData[i];
-
     KillEditView();
     delete pOptions;
 }
@@ -454,7 +449,9 @@ void ScViewData::UpdateThis()
             if (nTabNo>0)
                 --nTabNo;
             else
-                pThisTab = pTabData[0] = new ScViewDataTable;
+            {
+                pThisTab = pTabData[0] = new ScViewDataTable();
+            }
 
                 // hier keine Assertion, weil sonst Paints kommen, bevor alles initialisiert ist!
         }
@@ -464,12 +461,7 @@ void ScViewData::UpdateThis()
 
 void ScViewData::InsertTab( SCTAB nTab )
 {
-    delete pTabData[MAXTAB];
-
-    for (SCTAB i=MAXTAB; i>nTab; i--)
-        pTabData[i] = pTabData[i-1];
-
-    pTabData[nTab] = NULL;      // force creating new
+    pTabData.insert( pTabData.begin() + nTab, NULL );
     CreateTabData( nTab );
 
     UpdateThis();
@@ -480,11 +472,7 @@ void ScViewData::DeleteTab( SCTAB nTab )
 {
     delete pTabData[nTab];
 
-    for (SCTAB i=nTab; i<MAXTAB; i++)
-        pTabData[i] = pTabData[i+1];
-
-    pTabData[MAXTAB] = NULL;
-
+    pTabData.erase(pTabData.begin() + nTab);
     UpdateThis();
     aMarkData.DeleteTab( nTab );
 }
@@ -500,15 +488,10 @@ void ScViewData::CopyTab( SCTAB nSrcTab, SCTAB nDestTab )
         return;
     }
 
-    delete pTabData[MAXTAB];
-
-    for (SCTAB i=MAXTAB; i>nDestTab; i--)
-        pTabData[i] = pTabData[i-1];
-
     if ( pTabData[nSrcTab] )
-        pTabData[nDestTab] = new ScViewDataTable( *pTabData[nSrcTab] );
+        pTabData.insert(pTabData.begin() + nDestTab, new ScViewDataTable( *pTabData[nSrcTab] ));
     else
-        pTabData[nDestTab] = NULL;
+        pTabData.insert(pTabData.begin() + nDestTab, NULL);
 
     UpdateThis();
     aMarkData.InsertTab( nDestTab );
@@ -519,25 +502,13 @@ void ScViewData::MoveTab( SCTAB nSrcTab, SCTAB nDestTab )
     if (nDestTab==SC_TAB_APPEND)
         nDestTab = pDoc->GetTableCount() - 1;
 
-    SCTAB i;
     ScViewDataTable* pTab = pTabData[nSrcTab];
-
-    SCTAB nInsTab = nDestTab;
-    if ( nSrcTab < nDestTab )
-    {
-        --nInsTab;
-        for (i=nSrcTab; i<nDestTab; i++)
-            pTabData[i] = pTabData[i+1];
-    }
-    else
-        for (i=nSrcTab; i>nDestTab; i--)
-            pTabData[i] = pTabData[i-1];
-
-    pTabData[nDestTab] = pTab;
+    pTabData.erase( pTabData.begin() + nSrcTab );
+    pTabData.insert( pTabData.begin() + nDestTab, pTab );
 
     UpdateThis();
     aMarkData.DeleteTab( nSrcTab );
-    aMarkData.InsertTab( nInsTab );			// ggf. angepasst
+    aMarkData.InsertTab( nDestTab );			// ggf. angepasst
 }
 
 void ScViewData::CreateTabData( std::vector< SCTAB >& rvTabs )
@@ -557,7 +528,7 @@ void ScViewData::SetZoomType( SvxZoomType eNew, std::vector< SCTAB >& tabs )
 
     if ( bAll )
     {
-        for ( SCTAB i = 0; i <= MAXTAB; ++i )
+        for ( SCTAB i = 0; i < static_cast<SCTAB>(pTabData.size()); ++i )
         {
             if ( pTabData[i] )
                 pTabData[i]->eZoomType = eNew;
@@ -571,7 +542,7 @@ void ScViewData::SetZoomType( SvxZoomType eNew, std::vector< SCTAB >& tabs )
         for ( ; it != it_end; ++it )
         {
             SCTAB i = *it;
-            if ( pTabData[i] )
+            if ( *it < static_cast<SCTAB>(pTabData.size()) && pTabData[i] )
                 pTabData[i]->eZoomType = eNew;
         }
     }
@@ -614,7 +585,7 @@ void ScViewData::SetZoom( const Fraction& rNewX, const Fraction& rNewY, std::vec
 
     if ( bAll )
     {
-        for ( SCTAB i = 0; i <= MAXTAB; ++i )
+        for ( SCTAB i = 0; i < static_cast<SCTAB>(pTabData.size()); ++i )
         {
             if ( pTabData[i] )
             {
@@ -648,7 +619,7 @@ void ScViewData::SetZoom( const Fraction& rNewX, const Fraction& rNewY, std::vec
         for ( ; it != it_end; ++it )
         {
             SCTAB i = *it;
-            if ( pTabData[i] )
+            if ( i < static_cast<SCTAB>(pTabData.size()) && pTabData[i] )
             {
                 if ( bPagebreak )
                 {
@@ -1423,7 +1394,7 @@ void ScViewData::CreateTabData( SCTAB nNewTab )
 
 void ScViewData::CreateSelectedTabData()
 {
-    SCTAB nTabCount = pDoc->GetTableCount();
+    SCTAB nTabCount = aMarkData.GetLastSelected();
     for (SCTAB i=0; i<nTabCount; i++)
         if ( aMarkData.GetTableSelect(i) && !pTabData[i] )
             CreateTabData( i );
@@ -2181,7 +2152,7 @@ void ScViewData::WriteUserData(String& rData)
     for (SCTAB i=0; i<nTabCount; i++)
     {
         rData += ';';					// Numerierung darf auf keinen Fall durcheinanderkommen
-        if (pTabData[i])
+        if (i < static_cast<SCTAB>(pTabData.size()) && pTabData[i])
         {
             sal_Unicode cTabSep = SC_OLD_TABSEP;				// wie 3.1
             if ( pTabData[i]->nCurY > MAXROW_30 ||
@@ -2280,6 +2251,10 @@ void ScViewData::ReadUserData(const String& rData)
     while ( nCount > nPos+nTabStart )
     {
         aTabOpt = rData.GetToken(static_cast<xub_StrLen>(nPos+nTabStart));
+        while(nPos >= static_cast<SCTAB>(pTabData.size()))
+        {
+            pTabData.push_back(NULL);
+        }
         if (!pTabData[nPos])
             pTabData[nPos] = new ScViewDataTable;
 
@@ -2356,7 +2331,7 @@ void ScViewData::WriteExtOptions( ScExtDocOptions& rDocOpt ) const
         rDocSett.mfTabBarWidth = pView->GetRelTabBarWidth();
 
     // sheet settings
-    for( SCTAB nTab = 0, nTabCount = pDoc->GetTableCount(); nTab < nTabCount; ++nTab )
+    for( SCTAB nTab = 0; nTab < static_cast<SCTAB>(pTabData.size()); ++nTab )
     {
         if( const ScViewDataTable* pViewTab = pTabData[ nTab ] )
         {
@@ -2458,7 +2433,7 @@ void ScViewData::ReadExtOptions( const ScExtDocOptions& rDocOpt )
     pView->SetPendingRelTabBarWidth( rDocSett.mfTabBarWidth );
 
     // sheet settings
-    for( SCTAB nTab = 0, nTabCount = pDoc->GetTableCount(); nTab < nTabCount; ++nTab )
+    for( SCTAB nTab = 0; nTab < static_cast<SCTAB>(pTabData.size()); ++nTab )
     {
         if( const ScExtTabSettings* pTabSett = rDocOpt.GetTabSettings( nTab ) )
         {
@@ -2605,7 +2580,6 @@ void ScViewData::WriteUserDataSequence(uno::Sequence <beans::PropertyValue>& rSe
         SvXMLUnitConverter::convertNumber(sBuffer, static_cast<sal_Int32>(nViewID));
         pSettings[SC_VIEW_ID].Value <<= sBuffer.makeStringAndClear();
 
-        SCTAB nTabCount (pDoc->GetTableCount());
         uno::Reference<lang::XMultiServiceFactory> xServiceFactory =
                                         comphelper::getProcessServiceFactory();
         DBG_ASSERT( xServiceFactory.is(), "got no service manager" );
@@ -2615,7 +2589,7 @@ void ScViewData::WriteUserDataSequence(uno::Sequence <beans::PropertyValue>& rSe
             uno::Reference<container::XNameContainer> xNameContainer = uno::Reference<container::XNameContainer>(xServiceFactory->createInstance(sName), uno::UNO_QUERY);
             if (xNameContainer.is())
             {
-                for (SCTAB nTab=0; nTab<nTabCount; nTab++)
+                for (SCTAB nTab=0; nTab<static_cast<SCTAB>(pTabData.size()); nTab++)
                 {
                     if (pTabData[nTab])
                     {
@@ -2855,7 +2829,7 @@ void ScViewData::ReadUserDataSequence(const uno::Sequence <beans::PropertyValue>
     }
 
     // copy default zoom to sheets where a different one wasn't specified
-    for (SCTAB nZoomTab=0; nZoomTab<=MAXTAB; ++nZoomTab)
+    for (SCTAB nZoomTab=0; nZoomTab< static_cast<SCTAB>(pTabData.size()); ++nZoomTab)
         if (pTabData[nZoomTab] && ( nZoomTab >= static_cast<SCTAB>(aHasZoomVect.size()) || !aHasZoomVect[nZoomTab] ))
         {
             pTabData[nZoomTab]->eZoomType  = eDefZoomType;


More information about the Libreoffice-commits mailing list