sc/inc/dbdata.hxx              |   16 +++++++++
 sc/source/core/tool/dbdata.cxx |   68 +++++++++++++++++++++++++++++++++++++++++
 2 files changed, 83 insertions(+), 1 deletion(-)

New commits:
commit 044f79078ae2776b786f904e5f24a745f8635a18
Author: Eike Rathke <er...@redhat.com>
Date:   Thu Jun 25 11:52:45 2015 +0200

    TableRef: add ScDBData::GetColumnNameOffset()
    
    Change-Id: Id80b9e8d1f54a8b795d0f4209bdf2f980f9a5344

diff --git a/sc/inc/dbdata.hxx b/sc/inc/dbdata.hxx
index b77e218..4965e94 100644
--- a/sc/inc/dbdata.hxx
+++ b/sc/inc/dbdata.hxx
@@ -112,6 +112,16 @@ public:
     void        SetStripData(bool bSet)         { bStripData = bSet; }
     void        SetTableColumnNames( const ::std::vector< OUString >& rNames ) 
{ maTableColumnNames = rNames; }
 
+    /** Finds the column named rName and returns the corresponding offset
+        within the table.
+        @returns -1 if not found.
+
+        XXX NOTE: there is no refresh of names or anything implemented yet, use
+        this only during document load time.
+     */
+    sal_Int32   GetColumnNameOffset( const OUString& rName ) const;
+
+
     OUString GetSourceString() const;
     OUString GetOperations() const;
 
diff --git a/sc/source/core/tool/dbdata.cxx b/sc/source/core/tool/dbdata.cxx
index c99f893..ef39e8b 100644
--- a/sc/source/core/tool/dbdata.cxx
+++ b/sc/source/core/tool/dbdata.cxx
@@ -603,6 +603,16 @@ void ScDBData::AdjustTableColumnNames( UpdateRefMode 
eUpdateRefMode, SCCOL nDx,
     aNewNames.swap( maTableColumnNames);
 }
 
+sal_Int32 ScDBData::GetColumnNameOffset( const OUString& rName ) const
+{
+    ::std::vector<OUString>::const_iterator it(
+            ::std::find( maTableColumnNames.begin(), maTableColumnNames.end(), 
rName));
+    if (it != maTableColumnNames.end())
+        return it - maTableColumnNames.begin();
+
+    return -1;
+}
+
 namespace {
 
 class FindByTable : public unary_function<ScDBData, bool>
commit 98ba33677c288ff80c6f2812e85039175b7fcff8
Author: Eike Rathke <er...@redhat.com>
Date:   Thu Jun 25 11:44:46 2015 +0200

    TableRef: invalidate table column names on most sheet operations
    
    Kept only on insertions and deletions, but even that may not be useful
    as the names aren't updated at any time so even a mere cell change will
    bring this out of sync. But serves as a starting point for further
    implementation.
    
    Change-Id: Idfede4b03b9f554cd35f984502fce625c725853c

diff --git a/sc/inc/dbdata.hxx b/sc/inc/dbdata.hxx
index c1d41f9..b77e218 100644
--- a/sc/inc/dbdata.hxx
+++ b/sc/inc/dbdata.hxx
@@ -110,7 +110,6 @@ public:
     void        SetKeepFmt(bool bSet)           { bKeepFmt = bSet; }
     bool        IsStripData() const             { return bStripData; }
     void        SetStripData(bool bSet)         { bStripData = bSet; }
-    const ::std::vector< OUString >& GetTableColumnNames() { return 
maTableColumnNames; }
     void        SetTableColumnNames( const ::std::vector< OUString >& rNames ) 
{ maTableColumnNames = rNames; }
 
     OUString GetSourceString() const;
@@ -154,6 +153,11 @@ public:
                         SCsCOL nDx, SCsROW nDy, SCsTAB nDz);
 
     void ExtendDataArea(ScDocument* pDoc);
+
+private:
+
+    void AdjustTableColumnNames( UpdateRefMode eUpdateRefMode, SCCOL nDx, 
SCCOL nCol1,
+            SCCOL nOldCol1, SCCOL nOldCol2, SCCOL nNewCol1, SCCOL nNewCol2 );
 };
 
 class SC_DLLPUBLIC ScDBCollection
diff --git a/sc/source/core/tool/dbdata.cxx b/sc/source/core/tool/dbdata.cxx
index 34c2f69..c99f893 100644
--- a/sc/source/core/tool/dbdata.cxx
+++ b/sc/source/core/tool/dbdata.cxx
@@ -276,6 +276,8 @@ void ScDBData::GetArea(ScRange& rRange) const
 
 void ScDBData::SetArea(SCTAB nTab, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, 
SCROW nRow2)
 {
+    ::std::vector<OUString>().swap( maTableColumnNames);    // invalidate 
column names/offsets
+
     nTable  = nTab;
     nStartCol = nCol1;
     nStartRow = nRow1;
@@ -488,8 +490,13 @@ void ScDBData::UpdateMoveTab(SCTAB nOldPos, SCTAB nNewPos)
 
         bool bChanged = ( nTab != aRange.aStart.Tab() );
         if (bChanged)
+        {
+            // Save and restore column names, as SetArea() invalidates them.
+            ::std::vector<OUString> aNames( maTableColumnNames);
             SetArea( nTab, aRange.aStart.Col(), aRange.aStart.Row(),
                                     aRange.aEnd.Col(),aRange.aEnd .Row() );
+            maTableColumnNames = aNames;
+        }
 
         //  MoveTo ist nicht noetig, wenn nur die Tabelle geaendert ist
 
@@ -510,12 +517,20 @@ void ScDBData::UpdateReference(ScDocument* pDoc, 
UpdateRefMode eUpdateRefMode,
     SCTAB theTab2;
     GetArea( theTab1, theCol1, theRow1, theCol2, theRow2 );
     theTab2 = theTab1;
+    SCCOL nOldCol1 = theCol1, nOldCol2 = theCol2;
 
     bool bDoUpdate = ScRefUpdate::Update( pDoc, eUpdateRefMode,
                                             nCol1,nRow1,nTab1, 
nCol2,nRow2,nTab2, nDx,nDy,nDz,
                                             theCol1,theRow1,theTab1, 
theCol2,theRow2,theTab2 ) != UR_NOTHING;
     if (bDoUpdate)
+    {
+        // MoveTo() invalidates column names via SetArea(); adjust, remember
+        // and set new column offsets for names.
+        AdjustTableColumnNames( eUpdateRefMode, nDx, nCol1, nOldCol1, 
nOldCol2, theCol1, theCol2);
+        ::std::vector<OUString> aNames( maTableColumnNames);
         MoveTo( theTab1, theCol1, theRow1, theCol2, theRow2 );
+        maTableColumnNames = aNames;
+    }
 
     ScRange aRangeAdvSource;
     if ( GetAdvancedQuerySource(aRangeAdvSource) )
@@ -542,7 +557,50 @@ void ScDBData::ExtendDataArea(ScDocument* pDoc)
 {
     // Extend the DB area to include data rows immediately below.
     // or shrink it if all cells are empty
+    SCCOL nOldCol1 = nStartCol, nOldCol2 = nEndCol;
     pDoc->GetDataArea(nTable, nStartCol, nStartRow, nEndCol, nEndRow, false, 
true);
+    if (nStartCol != nOldCol1 || nEndCol != nOldCol2)
+        ::std::vector<OUString>().swap( maTableColumnNames);    // invalidate 
column names/offsets
+}
+
+void ScDBData::AdjustTableColumnNames( UpdateRefMode eUpdateRefMode, SCCOL 
nDx, SCCOL nCol1,
+        SCCOL nOldCol1, SCCOL nOldCol2, SCCOL nNewCol1, SCCOL nNewCol2 )
+{
+    if (maTableColumnNames.empty())
+        return;
+
+    SCCOL nDiff1 = nNewCol1 - nOldCol1;
+    SCCOL nDiff2 = nNewCol2 - nOldCol2;
+    if (nDiff1 == nDiff2)
+        return;     // not moved or entirely moved, nothing to do
+
+    ::std::vector<OUString> aNewNames;
+    if (eUpdateRefMode == URM_INSDEL)
+    {
+        // nCol1 is the first column of the block that gets shifted, determine
+        // the head and tail elements that are to be copied for deletion or
+        // insertion.
+        size_t nHead = static_cast<size_t>(::std::max( nCol1 + (nDx < 0 ? nDx 
: 0) - nOldCol1, 0));
+        size_t nTail = static_cast<size_t>(::std::max( nOldCol2 - nCol1 + 1, 
0));
+        size_t n = nHead + nTail;
+        if (0 < n && n <= maTableColumnNames.size())
+        {
+            if (nDx > 0)
+                n += nDx;
+            aNewNames.resize(n);
+            // Copy head.
+            for (size_t i = 0; i < nHead; ++i)
+            {
+                aNewNames[i] = maTableColumnNames[i];
+            }
+            // Copy tail, inserted middle range, if any, stays empty.
+            for (size_t i = n - nTail, j = maTableColumnNames.size() - nTail; 
i < n; ++i, ++j)
+            {
+                aNewNames[i] = maTableColumnNames[j];
+            }
+        }
+    } // else   empty aNewNames invalidates names/offsets
+    aNewNames.swap( maTableColumnNames);
 }
 
 namespace {
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to