[Libreoffice-commits] core.git: 2 commits - sc/source

Eike Rathke erack at redhat.com
Tue Sep 1 09:11:30 PDT 2015


 sc/source/core/tool/dbdata.cxx |  119 +++++++++++++++++++++++++----------------
 1 file changed, 73 insertions(+), 46 deletions(-)

New commits:
commit 8a7be690ced76c5bd790858226a2ff0747354676
Author: Eike Rathke <erack at redhat.com>
Date:   Tue Sep 1 18:07:04 2015 +0200

    TableRef: ensure every column has a name after RefreshTableColumnNames()
    
    Change-Id: Ib080b5292e48ea0709217cd4e3e697ae1fa5d4cd

diff --git a/sc/source/core/tool/dbdata.cxx b/sc/source/core/tool/dbdata.cxx
index adc401a..9c607ba 100644
--- a/sc/source/core/tool/dbdata.cxx
+++ b/sc/source/core/tool/dbdata.cxx
@@ -643,45 +643,80 @@ private:
 
 void ScDBData::RefreshTableColumnNames( ScDocument* pDoc )
 {
-    if (!HasHeader())
-        return;     // sorry, but..
-
     ::std::vector<OUString> aNewNames;
     aNewNames.resize( nEndCol - nStartCol + 1);
-    ScHorizontalCellIterator aIter( pDoc, nTable, nStartCol, nStartRow, nEndCol, nStartRow);  // header row only
-    ScRefCellValue* pCell;
-    SCCOL nCol, nLastColFilled = nStartCol - 1;
-    SCROW nRow;
     bool bHaveEmpty = false;
-    for (size_t i=0; (pCell = aIter.GetNext( nCol, nRow)) != nullptr; ++i)
+    if (!HasHeader())
+        bHaveEmpty = true;  // Assume we have empty ones and fill below.
+    else
     {
-        if (pCell->hasString())
+        ScHorizontalCellIterator aIter( pDoc, nTable, nStartCol, nStartRow, nEndCol, nStartRow);  // header row only
+        ScRefCellValue* pCell;
+        SCCOL nCol, nLastColFilled = nStartCol - 1;
+        SCROW nRow;
+        for (size_t i=0; (pCell = aIter.GetNext( nCol, nRow)) != nullptr; ++i)
         {
-            const OUString& rStr = pCell->getString( pDoc);
-            aNewNames[nCol-nStartCol] = rStr;
-            if (rStr.isEmpty())
-                bHaveEmpty = true;
-            else if (nLastColFilled < nCol-1)
+            if (pCell->hasString())
+            {
+                const OUString& rStr = pCell->getString( pDoc);
+                aNewNames[nCol-nStartCol] = rStr;
+                if (rStr.isEmpty())
+                    bHaveEmpty = true;
+                else if (nLastColFilled < nCol-1)
+                    bHaveEmpty = true;
+                nLastColFilled = nCol;
+            }
+            else
                 bHaveEmpty = true;
-            nLastColFilled = nCol;
         }
-        else
-            bHaveEmpty = true;
     }
 
-    // Try to not have empty names and remember previous name that might had
-    // been used to compile formulas, but only if same number of columns and no
-    // duplicates.
+    // Never leave us with empty names, try to remember previous name that
+    // might had been used to compile formulas, but only if same number of
+    // columns and no duplicates.
     if (bHaveEmpty && aNewNames.size() == maTableColumnNames.size())
     {
+        bHaveEmpty = false;
         for (size_t i=0, n=aNewNames.size(); i < n; ++i)
         {
             if (aNewNames[i].isEmpty())
             {
                 const OUString& rStr = maTableColumnNames[i];
-                auto it( ::std::find_if( aNewNames.begin(), aNewNames.end(), TableColumnNameSearch( rStr)));
-                if (it == aNewNames.end())
-                    aNewNames[i] = rStr;
+                if (rStr.isEmpty())
+                    bHaveEmpty = true;
+                else
+                {
+                    auto it( ::std::find_if( aNewNames.begin(), aNewNames.end(), TableColumnNameSearch( rStr)));
+                    if (it == aNewNames.end())
+                        aNewNames[i] = rStr;
+                    else
+                        bHaveEmpty = true;
+                }
+            }
+        }
+    }
+
+    // If we still have empty ones then fill those with "Column#" with #
+    // starting at the column offset number. Still no duplicates of course.
+    if (bHaveEmpty)
+    {
+        OUString aColumn( ScGlobal::GetRscString(STR_COLUMN));
+        for (size_t i=0, n=aNewNames.size(); i < n; ++i)
+        {
+            if (aNewNames[i].isEmpty())
+            {
+                size_t nCount = i+1;
+                do
+                {
+                    OUString aStr( aColumn + OUString::number( nCount));
+                    auto it( ::std::find_if( aNewNames.begin(), aNewNames.end(), TableColumnNameSearch( aStr)));
+                    if (it == aNewNames.end())
+                    {
+                        aNewNames[i] = aStr;
+                        break;  // do while
+                    }
+                    ++nCount;
+                } while(1);
             }
         }
     }
commit b0d6a8ea09148fce6f6c806086835a86eb8ff03d
Author: Eike Rathke <erack at redhat.com>
Date:   Tue Sep 1 17:05:13 2015 +0200

    TableRef: reuse TableColumnNameSearch in RefreshTableColumnNames()
    
    Change-Id: I354698d6959aeb9ce022ecc420f2e10b0155c184

diff --git a/sc/source/core/tool/dbdata.cxx b/sc/source/core/tool/dbdata.cxx
index 46b9b2f..adc401a 100644
--- a/sc/source/core/tool/dbdata.cxx
+++ b/sc/source/core/tool/dbdata.cxx
@@ -622,6 +622,25 @@ void ScDBData::AdjustTableColumnNames( UpdateRefMode eUpdateRefMode, SCCOL nDx,
     aNewNames.swap( maTableColumnNames);
 }
 
+namespace {
+class TableColumnNameSearch : public unary_function<ScDBData, bool>
+{
+public:
+    explicit TableColumnNameSearch( const OUString& rSearchName ) :
+        maSearchName( rSearchName )
+    {
+    }
+
+    bool operator()( const OUString& rName ) const
+    {
+        return ScGlobal::GetpTransliteration()->isEqual( maSearchName, rName);
+    }
+
+private:
+    OUString maSearchName;
+};
+}
+
 void ScDBData::RefreshTableColumnNames( ScDocument* pDoc )
 {
     if (!HasHeader())
@@ -659,17 +678,9 @@ void ScDBData::RefreshTableColumnNames( ScDocument* pDoc )
         {
             if (aNewNames[i].isEmpty())
             {
-                bool bCopy = true;
                 const OUString& rStr = maTableColumnNames[i];
-                for (size_t j=0; j < n; ++j)
-                {
-                    if (ScGlobal::GetpTransliteration()->isEqual( aNewNames[j], rStr))
-                    {
-                        bCopy = false;
-                        break;  // for
-                    }
-                }
-                if (bCopy)
+                auto it( ::std::find_if( aNewNames.begin(), aNewNames.end(), TableColumnNameSearch( rStr)));
+                if (it == aNewNames.end())
                     aNewNames[i] = rStr;
             }
         }
@@ -678,25 +689,6 @@ void ScDBData::RefreshTableColumnNames( ScDocument* pDoc )
     aNewNames.swap( maTableColumnNames);
 }
 
-namespace {
-class TableColumnNameSearch : public unary_function<ScDBData, bool>
-{
-public:
-    explicit TableColumnNameSearch( const OUString& rSearchName ) :
-        maSearchName( rSearchName )
-    {
-    }
-
-    bool operator()( const OUString& rName ) const
-    {
-        return ScGlobal::GetpTransliteration()->isEqual( maSearchName, rName);
-    }
-
-private:
-    OUString maSearchName;
-};
-}
-
 sal_Int32 ScDBData::GetColumnNameOffset( const OUString& rName ) const
 {
     if (maTableColumnNames.empty())


More information about the Libreoffice-commits mailing list