[Libreoffice-commits] core.git: Branch 'feature/calc-group-interpreter' - 44 commits - configure.ac download.lst editeng/source include/editeng mdds/0001-Workaround-for-an-old-gcc-bug.patch mdds/0001-Workaround-for-gcc-bug.patch mdds/mdds_0.7.0_unreachable_warning.patch.1 mdds/UnpackedTarball_mdds.mk sc/CppunitTest_sc_ucalc.mk sc/inc sc/Library_sc.mk sc/Module_sc.mk sc/qa sc/source

Kohei Yoshida kohei.yoshida at gmail.com
Sun Jun 23 10:07:51 PDT 2013


 configure.ac                                  |    4 
 download.lst                                  |    2 
 editeng/source/editeng/editobj.cxx            |    5 
 include/editeng/editobj.hxx                   |    1 
 mdds/0001-Workaround-for-an-old-gcc-bug.patch |   27 
 mdds/0001-Workaround-for-gcc-bug.patch        |   27 
 mdds/UnpackedTarball_mdds.mk                  |    3 
 mdds/mdds_0.7.0_unreachable_warning.patch.1   |   13 
 sc/CppunitTest_sc_ucalc.mk                    |    1 
 sc/Library_sc.mk                              |    5 
 sc/Module_sc.mk                               |    2 
 sc/inc/cell.hxx                               |  250 --
 sc/inc/cellclonehandler.hxx                   |   68 
 sc/inc/cellvalue.hxx                          |   32 
 sc/inc/clipcontext.hxx                        |   10 
 sc/inc/column.hxx                             |  158 -
 sc/inc/columniterator.hxx                     |    4 
 sc/inc/columnspanset.hxx                      |   54 
 sc/inc/dociter.hxx                            |  180 -
 sc/inc/document.hxx                           |   21 
 sc/inc/documentimport.hxx                     |    4 
 sc/inc/editdataarray.hxx                      |   75 
 sc/inc/editutil.hxx                           |    2 
 sc/inc/fillinfo.hxx                           |    8 
 sc/inc/formulacell.hxx                        |    8 
 sc/inc/global.hxx                             |    3 
 sc/inc/listenercontext.hxx                    |    9 
 sc/inc/markdata.hxx                           |    2 
 sc/inc/mtvcellfunc.hxx                        |  166 +
 sc/inc/mtvelements.hxx                        |   58 
 sc/inc/mtvfunctions.hxx                       |  638 +++++
 sc/inc/scmatrix.hxx                           |    6 
 sc/inc/scopetools.hxx                         |   33 
 sc/inc/table.hxx                              |   45 
 sc/inc/types.hxx                              |   16 
 sc/qa/extras/testdocuments/Ranges-3.xls       |binary
 sc/qa/unit/ucalc.cxx                          |  211 +
 sc/source/core/data/attarray.cxx              |    1 
 sc/source/core/data/autonamecache.cxx         |    3 
 sc/source/core/data/cell.cxx                  |  195 -
 sc/source/core/data/cell2.cxx                 |  243 --
 sc/source/core/data/cellclonehandler.cxx      |  116 
 sc/source/core/data/cellvalue.cxx             |  195 +
 sc/source/core/data/clipcontext.cxx           |    5 
 sc/source/core/data/colorscale.cxx            |    4 
 sc/source/core/data/column.cxx                | 2909 +++++++++++++-----------
 sc/source/core/data/column2.cxx               | 2562 +++++++++++----------
 sc/source/core/data/column3.cxx               | 3146 +++++++++++++++-----------
 sc/source/core/data/columniterator.cxx        |   10 
 sc/source/core/data/columnspanset.cxx         |  117 
 sc/source/core/data/dociter.cxx               | 1361 +++++------
 sc/source/core/data/documen2.cxx              |   16 
 sc/source/core/data/documen3.cxx              |    1 
 sc/source/core/data/documen4.cxx              |   34 
 sc/source/core/data/documen6.cxx              |    1 
 sc/source/core/data/documen7.cxx              |    1 
 sc/source/core/data/documen8.cxx              |   12 
 sc/source/core/data/document.cxx              |   36 
 sc/source/core/data/documentimport.cxx        |   48 
 sc/source/core/data/fillinfo.cxx              |  362 +-
 sc/source/core/data/formulacell.cxx           |   46 
 sc/source/core/data/listenercontext.cxx       |   11 
 sc/source/core/data/markdata.cxx              |    7 
 sc/source/core/data/mtvelements.cxx           |   16 
 sc/source/core/data/table1.cxx                |  100 
 sc/source/core/data/table2.cxx                |  388 +--
 sc/source/core/data/table3.cxx                |  297 +-
 sc/source/core/data/table4.cxx                |  195 -
 sc/source/core/data/table5.cxx                |   18 
 sc/source/core/data/table6.cxx                |  305 +-
 sc/source/core/data/validat.cxx               |    2 
 sc/source/core/inc/interpre.hxx               |    1 
 sc/source/core/tool/chgtrack.cxx              |   19 
 sc/source/core/tool/editdataarray.cxx         |   93 
 sc/source/core/tool/editutil.cxx              |   26 
 sc/source/core/tool/interpr1.cxx              |    1 
 sc/source/core/tool/interpr4.cxx              |    6 
 sc/source/core/tool/scmatrix.cxx              |  269 --
 sc/source/core/tool/scopetools.cxx            |   28 
 sc/source/filter/xml/XMLExportIterator.cxx    |    2 
 sc/source/ui/docshell/dbdocimp.cxx            |    3 
 sc/source/ui/docshell/docsh8.cxx              |    3 
 sc/source/ui/docshell/impex.cxx               |    2 
 sc/source/ui/undo/undoblk3.cxx                |    1 
 sc/source/ui/undo/undodat.cxx                 |    1 
 sc/source/ui/unoobj/chart2uno.cxx             |    5 
 86 files changed, 8686 insertions(+), 6688 deletions(-)

New commits:
commit 9b6967406e71c5202c4d2790dc46905a6f144b96
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date:   Sun Jun 23 13:08:56 2013 -0400

    Build fix due to incorrect conflict resolution.
    
    Change-Id: Idf3e351cab15aa15d52baca7bbd602a56afd811e

diff --git a/sc/source/core/data/column2.cxx b/sc/source/core/data/column2.cxx
index b38756f..5c4419b 100644
--- a/sc/source/core/data/column2.cxx
+++ b/sc/source/core/data/column2.cxx
@@ -1917,7 +1917,6 @@ const double* ScColumn::FetchDoubleArray( sc::FormulaGroupContext& /*rCxt*/, SCR
     if (static_cast<SCROW>(nLen) < nRow2 - nRow1 + 1)
         // Array shorter than requested.
         return NULL;
-    }
 
     return &sc::numeric_block::at(*aPos.first->data, aPos.second);
 }
commit aa64ddea752ad8d28e63072918a0a778a73ad358
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date:   Sat Jun 22 21:32:07 2013 -0400

    Adjusted the patch against mdds 0.9.0.
    
    Change-Id: Ia68f49996d4d50142c04d35ef2babb321afc4b3f

diff --git a/mdds/0001-Workaround-for-an-old-gcc-bug.patch b/mdds/0001-Workaround-for-an-old-gcc-bug.patch
new file mode 100644
index 0000000..8529fbf
--- /dev/null
+++ b/mdds/0001-Workaround-for-an-old-gcc-bug.patch
@@ -0,0 +1,27 @@
+From 3e3a5c483217fe05b5bd556bf1b2c6f3ec297cb1 Mon Sep 17 00:00:00 2001
+From: Kohei Yoshida <kohei.yoshida at gmail.com>
+Date: Sat, 22 Jun 2013 21:30:13 -0400
+Subject: [PATCH] Workaround for an old gcc bug.
+
+c.f. http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44963
+---
+ include/mdds/multi_type_vector_types.hpp | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/include/mdds/multi_type_vector_types.hpp b/include/mdds/multi_type_vector_types.hpp
+index c4b2772..44af655 100644
+--- a/include/mdds/multi_type_vector_types.hpp
++++ b/c/d/include/mdds/multi_type_vector_types.hpp
+@@ -278,7 +278,8 @@ public:
+ #ifndef MDDS_MULTI_TYPE_VECTOR_USE_DEQUE
+         d.reserve(d.size() + len);
+ #endif
+-        std::copy(its.first, its.second, std::back_inserter(d));
++        for (; its.first != its.second; ++its.first)
++            d.push_back(*its.first);
+     }
+ 
+     static void assign_values_from_block(
+-- 
+1.8.1.4
+
diff --git a/mdds/0001-Workaround-for-gcc-bug.patch b/mdds/0001-Workaround-for-gcc-bug.patch
deleted file mode 100644
index ef6572c..0000000
--- a/mdds/0001-Workaround-for-gcc-bug.patch
+++ /dev/null
@@ -1,27 +0,0 @@
-From e1c795c8734119985ea09bf4d9f860d11e440b2a Mon Sep 17 00:00:00 2001
-From: Kohei Yoshida <kohei.yoshida at gmail.com>
-Date: Mon, 30 Jul 2012 14:36:24 -0400
-Subject: [PATCH] Workaround for gcc bug.
-
-c.f. http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44963
----
- include/mdds/multi_type_vector_types.hpp |    3 ++-
- 1 files changed, 2 insertions(+), 1 deletions(-)
-
-diff --git a/include/mdds/multi_type_vector_types.hpp b/include/mdds/multi_type_vector_types.hpp
-index 78f18cb..6189139 100644
---- a/include/mdds/multi_type_vector_types.hpp
-+++ misc/build/mdds_0.6.0/include/mdds/multi_type_vector_types.hpp
-@@ -218,7 +218,8 @@ public:
-         typename store_type::const_iterator it_end = it;
-         std::advance(it_end, len);
-         d.reserve(d.size() + len);
--        std::copy(it, it_end, std::back_inserter(d));
-+        for (; it != it_end; ++it)
-+            d.push_back(*it);
-     }
-
-     static void assign_values_from_block(
---
-1.7.7
-
diff --git a/mdds/UnpackedTarball_mdds.mk b/mdds/UnpackedTarball_mdds.mk
index c2a61ce..69fbf18 100644
--- a/mdds/UnpackedTarball_mdds.mk
+++ b/mdds/UnpackedTarball_mdds.mk
@@ -15,7 +15,7 @@ $(eval $(call gb_UnpackedTarball_set_patchlevel,mdds,3))
 
 $(eval $(call gb_UnpackedTarball_add_patches,mdds,\
 	mdds/mdds_0.6.0.patch \
-	mdds/0001-Workaround-for-gcc-bug.patch \
+	mdds/0001-Workaround-for-an-old-gcc-bug.patch \
 ))
 
 # vim: set noet sw=4 ts=4:
commit 318d67428feb989bc745f476d0718db03b1df080
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date:   Sat Jun 22 21:26:00 2013 -0400

    These patches are in the upstream.
    
    Conflicts:
    	mdds/UnpackedTarball_mdds.mk
    
    Change-Id: Ie5dc6b93fbcd65d7763fb9232a984236fb7bd745

diff --git a/mdds/UnpackedTarball_mdds.mk b/mdds/UnpackedTarball_mdds.mk
index b33bc1b..c2a61ce 100644
--- a/mdds/UnpackedTarball_mdds.mk
+++ b/mdds/UnpackedTarball_mdds.mk
@@ -16,7 +16,6 @@ $(eval $(call gb_UnpackedTarball_set_patchlevel,mdds,3))
 $(eval $(call gb_UnpackedTarball_add_patches,mdds,\
 	mdds/mdds_0.6.0.patch \
 	mdds/0001-Workaround-for-gcc-bug.patch \
-	mdds/mdds_0.7.0_unreachable_warning.patch.1 \
 ))
 
 # vim: set noet sw=4 ts=4:
diff --git a/mdds/mdds_0.7.0_unreachable_warning.patch.1 b/mdds/mdds_0.7.0_unreachable_warning.patch.1
deleted file mode 100644
index 35819ae..0000000
--- a/mdds/mdds_0.7.0_unreachable_warning.patch.1
+++ /dev/null
@@ -1,13 +0,0 @@
-diff -ru mdds.old/include/mdds/multi_type_vector_def.inl mdds/include/mdds/multi_type_vector_def.inl
---- mdds.old/include/mdds/multi_type_vector_def.inl	2013-03-12 21:18:16.340506918 +0100
-+++ mdds/include/mdds/multi_type_vector_def.inl	2013-03-14 17:56:07.275475086 +0100
-@@ -652,7 +652,9 @@
-             }
-         }
- 
-+#ifndef _MSC_VER // MSVC is too smart and warns about unreachable code
-         assert(!"this code path should never be reached!");
-+#endif
-     }
- 
-     // This empty block is right below a non-empty block.
commit 7845b810d893480a6258e7eac621f2a301ecd20f
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date:   Sat Jun 22 21:20:36 2013 -0400

    Update internal mdds to 0.9.0.
    
    Conflicts:
    	configure.ac
    
    Change-Id: I2f299dd7244e7418959f82f94a56d8cc1749aaba

diff --git a/configure.ac b/configure.ac
index 821233d..6624842 100644
--- a/configure.ac
+++ b/configure.ac
@@ -8108,9 +8108,9 @@ if test "$with_system_mdds" = "yes"; then
     save_CPPFLAGS="$CPPFLAGS"
     CPPFLAGS="$CPPFLAGS $MDDS_CPPFLAGS"
     AC_CHECK_HEADER(mdds/multi_type_vector.hpp, [],
-        [AC_MSG_ERROR(mdds/multi_type_vector.hpp not found. Install mdds >= 0.8.1)], [])
+        [AC_MSG_ERROR(mdds/multi_type_vector.hpp not found. Install mdds >= 0.9.0)], [])
     AC_CHECK_TYPE(mdds::multi_type_vector<int>::iterator, [],
-        [AC_MSG_ERROR(mdds/multi_type_matrix.hpp does not define multi_type_vector::iterator. Install mdds >= 0.8.1)], [#include <mdds/multi_type_vector.hpp>])
+        [AC_MSG_ERROR(mdds/multi_type_matrix.hpp does not define multi_type_vector::iterator. Install mdds >= 0.9.0)], [#include <mdds/multi_type_vector.hpp>])
     CPPFLAGS="$save_CPPFLAGS"
     AC_LANG_POP([C++])
 else
diff --git a/download.lst b/download.lst
index b0221ae..bdd5f4e 100644
--- a/download.lst
+++ b/download.lst
@@ -63,7 +63,7 @@ export LIBXML_TARBALL := 7740a8ec23878a2f50120e1faa2730f2-libxml2-2.7.6.tar.gz
 export LIBXSLT_TARBALL := e61d0364a30146aaa3001296f853b2b9-libxslt-1.1.26.tar.gz
 export LPSOLVE_TARBALL := 26b3e95ddf3d9c077c480ea45874b3b8-lp_solve_5.5.tar.gz
 export MARIADB_TARBALL := 05f84c95b610c21c5fd510d10debcabf-mariadb-native-client-1.0.0.tar.bz2
-export MDDS_TARBALL := 08c85a6d6d793daee14e10e22eefdc4b-mdds_0.8.1.tar.bz2
+export MDDS_TARBALL := 782735c43c742a27ebe19fb1871fed8f-mdds_0.9.0.tar.bz2
 export MYSQLCPPCONN_TARBALL := 0981bda6548a8c8233ffce2b6e4b2a23-mysql-connector-c++-1.1.0.tar.gz
 export MYTHES_TARBALL := 46e92b68e31e858512b680b3b61dc4c1-mythes-1.2.3.tar.gz
 export NEON_TARBALL := ff369e69ef0f0143beb5626164e87ae2-neon-0.29.5.tar.gz
commit 8f3d8648df2496ce90ca8bd1486f7184afcb7ab6
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date:   Sat Jun 22 01:20:04 2013 -0400

    Use position objects for more efficient element value lookups.
    
    The underlying multi_type_vector didn't have the concept of position objects
    back when the matrix was reworked. It is now available, and there is no reason
    why we shouldn't use it to speed things up.
    
    Change-Id: Iac75a5584779c16e6eff7fcd577fc3d717c3c2e7

diff --git a/sc/source/core/tool/scmatrix.cxx b/sc/source/core/tool/scmatrix.cxx
index 010f8dc..26fe7d3 100644
--- a/sc/source/core/tool/scmatrix.cxx
+++ b/sc/source/core/tool/scmatrix.cxx
@@ -128,12 +128,13 @@ void compareMatrix(MatrixImplType& rMat)
     {
         for (size_t j = 0; j < aDim.column; ++j)
         {
-            mdds::mtm::element_t eType = rMat.get_type(i, j);
+            MatrixImplType::const_position_type aPos = rMat.position(i, j);
+            mdds::mtm::element_t eType = rMat.get_type(aPos);
             if (eType != mdds::mtm::element_numeric && eType != mdds::mtm::element_boolean)
                 // must be of numeric type (boolean can be numeric).
                 continue;
 
-            double fVal = rMat.get_numeric(i, j);
+            double fVal = rMat.get_numeric(aPos);
             if (!::rtl::math::isFinite(fVal))
                 /* FIXME: this silently skips an error instead of propagating it! */
                 continue;
@@ -469,20 +470,17 @@ OUString ScMatrixImpl::GetString(SCSIZE nC, SCSIZE nR) const
     if (ValidColRowOrReplicated( nC, nR ))
     {
         double fErr = 0.0;
-        switch (maMat.get_type(nR, nC))
+        MatrixImplType::const_position_type aPos = maMat.position(nR, nC);
+        switch (maMat.get_type(aPos))
         {
             case mdds::mtm::element_string:
-                return maMat.get<OUString>(nR, nC);
+                return maMat.get_string(aPos);
             case mdds::mtm::element_empty:
                 return EMPTY_OUSTRING;
             case mdds::mtm::element_numeric:
-                OSL_FAIL("ScMatrixImpl::GetString: access error, no string");
-                fErr = maMat.get<double>(nR, nC);
-            break;
             case mdds::mtm::element_boolean:
                 OSL_FAIL("ScMatrixImpl::GetString: access error, no string");
-                fErr = maMat.get<bool>(nR, nC);
-            break;
+                fErr = maMat.get_numeric(aPos);
             default:
                 OSL_FAIL("ScMatrixImpl::GetString: access error, no string");
         }
@@ -511,10 +509,11 @@ OUString ScMatrixImpl::GetString( SvNumberFormatter& rFormatter, SCSIZE nC, SCSI
     }
 
     double fVal = 0.0;
-    switch (maMat.get_type(nR, nC))
+    MatrixImplType::const_position_type aPos = maMat.position(nR, nC);
+    switch (maMat.get_type(aPos))
     {
         case mdds::mtm::element_string:
-            return maMat.get<OUString>(nR, nC);
+            return maMat.get_string(aPos);
         case mdds::mtm::element_empty:
         {
             if (!maMatFlag.get<bool>(nR, nC))
@@ -530,10 +529,8 @@ OUString ScMatrixImpl::GetString( SvNumberFormatter& rFormatter, SCSIZE nC, SCSI
             return aStr;
         }
         case mdds::mtm::element_numeric:
-            fVal = maMat.get<double>(nR, nC);
-        break;
         case mdds::mtm::element_boolean:
-            fVal = maMat.get<bool>(nR, nC);
+            fVal = maMat.get_numeric(aPos);
         break;
         default:
             ;
@@ -558,20 +555,21 @@ ScMatrixValue ScMatrixImpl::Get(SCSIZE nC, SCSIZE nR) const
     ScMatrixValue aVal;
     if (ValidColRowOrReplicated(nC, nR))
     {
-        mdds::mtm::element_t eType = maMat.get_type(nR, nC);
+        MatrixImplType::const_position_type aPos = maMat.position(nR, nC);
+        mdds::mtm::element_t eType = maMat.get_type(aPos);
         switch (eType)
         {
             case mdds::mtm::element_boolean:
                 aVal.nType = SC_MATVAL_BOOLEAN;
-                aVal.fVal = maMat.get_boolean(nR, nC);
+                aVal.fVal = maMat.get_boolean(aPos);
             break;
             case mdds::mtm::element_numeric:
                 aVal.nType = SC_MATVAL_VALUE;
-                aVal.fVal = maMat.get_numeric(nR, nC);
+                aVal.fVal = maMat.get_numeric(aPos);
             break;
             case mdds::mtm::element_string:
                 aVal.nType = SC_MATVAL_STRING;
-                aVal.aStr = maMat.get_string(nR, nC);
+                aVal.aStr = maMat.get_string(aPos);
             break;
             case mdds::mtm::element_empty:
                 // Empty path equals empty plus flag.
@@ -775,12 +773,13 @@ double EvalMatrix(const MatrixImplType& rMat)
     {
         for (size_t j = 0; j < nCols; ++j)
         {
-            mdds::mtm::element_t eType = rMat.get_type(i, j);
+            MatrixImplType::const_position_type aPos = rMat.position(i, j);
+            mdds::mtm::element_t eType = rMat.get_type(aPos);
             if (eType != mdds::mtm::element_numeric && eType != mdds::mtm::element_boolean)
                 // assuming a CompareMat this is an error
                 return CreateDoubleError(errIllegalArgument);
 
-            double fVal = rMat.get_numeric(i, j);
+            double fVal = rMat.get_numeric(aPos);
             if (!::rtl::math::isFinite(fVal))
                 // DoubleError
                 return fVal;
commit 0f58476725c6f270a78ff004cab2470fec15a991
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date:   Fri Jun 21 20:11:27 2013 -0400

    Prevent crash during on-line spell checking.
    
    The new ScHorizontalCellIterator internally uses iterators for each
    column to track positions. This means that, if a cell value in the iteration
    range chnages while the iteration is on-going, those internal iterators
    get invalidated. Allow the client code to rehash the iterators when modifying
    a cell content during iteration.
    
    Having said that, it's best not to modify cells during iteration.
    
    Change-Id: Ida453d4f883e1fbcbab4eb0401e37fea8c0b901d

diff --git a/sc/inc/dociter.hxx b/sc/inc/dociter.hxx
index 2452a60..9458aae 100644
--- a/sc/inc/dociter.hxx
+++ b/sc/inc/dociter.hxx
@@ -441,6 +441,13 @@ public:
     /// Set a(nother) sheet and (re)init.
     void            SetTab( SCTAB nTab );
 
+    /**
+     * When modifying a cell while still in iteration, call this to re-fetch
+     * the column iterators used internally because the old iterators have
+     * been invalidated.
+     */
+    void RehashCol( SCCOL nCol );
+
 private:
     void            Advance();
 };
diff --git a/sc/source/core/data/dociter.cxx b/sc/source/core/data/dociter.cxx
index 9c24aae..1cdc52c 100644
--- a/sc/source/core/data/dociter.cxx
+++ b/sc/source/core/data/dociter.cxx
@@ -1695,7 +1695,7 @@ ScHorizontalCellIterator::ScHorizontalCellIterator(ScDocument* pDocument, SCTAB
     nEndRow( nRow2 ),
     mnCol( nCol1 ),
     mnRow( nRow1 ),
-    bMore( true )
+    bMore(false)
 {
     if (mnTab >= pDoc->GetTableCount())
         OSL_FAIL("try to access index out of bounds, FIX IT");
@@ -1714,24 +1714,42 @@ ScHorizontalCellIterator::~ScHorizontalCellIterator()
 
 void ScHorizontalCellIterator::SetTab( SCTAB nTabP )
 {
+    bMore = false;
     mnTab = nTabP;
     mnRow = nStartRow;
     mnCol = nStartCol;
-    bMore = true;
 
     // Set the start position in each column.
     for (SCCOL i = nStartCol; i <= nEndCol; ++i)
     {
         ScColumn* pCol = &pDoc->maTabs[mnTab]->aCol[i];
-        maColPositions[i-nStartCol].maPos = pCol->maCells.position(nStartRow).first;
-        maColPositions[i-nStartCol].maEnd = pCol->maCells.end();
+        ColParam& rParam = maColPositions[i-nStartCol];
+        rParam.maPos = pCol->maCells.position(nStartRow).first;
+        rParam.maEnd = pCol->maCells.end();
+        if (rParam.maPos != rParam.maEnd)
+            bMore = true;
     }
 
-    if (maColPositions[0].maPos->type == sc::element_type_empty)
+    if (!bMore)
+        return;
+
+    ColParam& rParam = maColPositions[0];
+    if (rParam.maPos == rParam.maEnd || rParam.maPos->type == sc::element_type_empty)
         // Skip to the first non-empty cell.
         Advance();
 }
 
+void ScHorizontalCellIterator::RehashCol( SCCOL nCol )
+{
+    if (nCol < nStartCol || nEndCol < nCol)
+        return;
+
+    ColParam& rParam = maColPositions[nCol-nStartCol];
+    ScColumn& rCol = pDoc->maTabs[mnTab]->aCol[nCol];
+    rParam.maPos = rCol.maCells.position(mnRow).first;
+    rParam.maEnd = rCol.maCells.end();
+}
+
 ScRefCellValue* ScHorizontalCellIterator::GetNext( SCCOL& rCol, SCROW& rRow )
 {
     if (!bMore)
diff --git a/sc/source/core/data/documen8.cxx b/sc/source/core/data/documen8.cxx
index 3d9e263..7fb8a96 100644
--- a/sc/source/core/data/documen8.cxx
+++ b/sc/source/core/data/documen8.cxx
@@ -827,12 +827,14 @@ bool ScDocument::OnlineSpellInRange( const ScRange& rSpellRange, ScAddress& rSpe
                 {
                     // The cell will take ownership of pNewData.
                     SetEditText(ScAddress(nCol,nRow,nTab), pEngine->CreateTextObject());
+                    aIter.RehashCol(nCol);
                 }
                 else
                 {
                     ScSetStringParam aParam;
                     aParam.setTextInput();
                     SetString(ScAddress(nCol,nRow,nTab), pEngine->GetText(), &aParam);
+                    aIter.RehashCol(nCol);
                 }
 
                 //  Paint
commit be9a90c92f8290fca8ea900478e2302e3d659acc
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date:   Fri Jun 21 18:05:46 2013 -0400

    Fix my wrong logic in row info iteration.
    
    Align the array position of RowInfo by comparing its nRowNo value with
    the current row number.
    
    Change-Id: Idd26636cac0ba4ade1b538dd68580b469611da04

diff --git a/sc/source/core/data/fillinfo.cxx b/sc/source/core/data/fillinfo.cxx
index 34c2562..5f9b6ce 100644
--- a/sc/source/core/data/fillinfo.cxx
+++ b/sc/source/core/data/fillinfo.cxx
@@ -145,8 +145,16 @@ class RowInfoFiller
         return mbHiddenRow;
     }
 
-    void setInfo(size_t /*nRow*/, const ScRefCellValue& rCell)
+    void alignArray(size_t nRow)
     {
+        while (mpRowInfo[mrArrY].nRowNo < static_cast<SCROW>(nRow))
+            ++mrArrY;
+    }
+
+    void setInfo(size_t nRow, const ScRefCellValue& rCell)
+    {
+        alignArray(nRow);
+
         RowInfo* pThisRowInfo = &mpRowInfo[mrArrY];
         CellInfo* pInfo = &pThisRowInfo->pCellInfo[mnArrX];
         pInfo->maCell = rCell;
@@ -183,12 +191,6 @@ public:
         if (!isHidden(nRow))
             setInfo(nRow, ScRefCellValue(const_cast<ScFormulaCell*>(p)));
     }
-
-    void operator() (mdds::mtv::element_t, size_t, size_t nDataSize)
-    {
-        // Skip all empty cells.
-        mrArrY += nDataSize;
-    }
 };
 
 }
@@ -430,7 +432,7 @@ void ScDocument::FillInfo(
                 // cells that are not hidden.
                 RowInfoFiller aFunc(*this, nTab, pRowInfo, nArrCol, nArrRow);
                 sc::ParseAllNonEmpty(
-                    pThisCol->maCells.begin(), pThisCol->maCells, nRow1, nRow2, aFunc, aFunc);
+                    pThisCol->maCells.begin(), pThisCol->maCells, nRow1, nRow2, aFunc);
 
                 if (nX+1 >= nCol1)                                // Attribute/Blockmarken ab nX1-1
                 {
commit c6c4a9a20571aff5a7c87ffc15400addf9c406e5
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date:   Fri Jun 21 16:16:24 2013 -0400

    Make them officially non-copyable.
    
    Change-Id: Ie8f8c2227b35ffb81f902458ce1b0a732b430b53

diff --git a/sc/inc/fillinfo.hxx b/sc/inc/fillinfo.hxx
index a55d638..9999a89 100644
--- a/sc/inc/fillinfo.hxx
+++ b/sc/inc/fillinfo.hxx
@@ -25,6 +25,8 @@
 #include "colorscale.hxx"
 #include "cellvalue.hxx"
 
+#include <boost/noncopyable.hpp>
+
 class SfxItemSet;
 class SvxBrushItem;
 class SvxBoxItem;
@@ -90,7 +92,7 @@ struct ScIconSetInfo
     bool mbShowValue;
 };
 
-struct CellInfo
+struct CellInfo : boost::noncopyable
 {
     ScRefCellValue              maCell;
 
@@ -145,7 +147,7 @@ struct CellInfo
 
 const SCCOL SC_ROTMAX_NONE = SCCOL_MAX;
 
-struct RowInfo
+struct RowInfo : boost::noncopyable
 {
     CellInfo*           pCellInfo;
 
@@ -166,7 +168,7 @@ private:
     RowInfo&        operator=( const RowInfo& );
 };
 
-struct ScTableInfo
+struct ScTableInfo : boost::noncopyable
 {
     svx::frame::Array   maArray;
     RowInfo*            mpRowInfo;
diff --git a/sc/source/core/data/fillinfo.cxx b/sc/source/core/data/fillinfo.cxx
index c0c02d6..34c2562 100644
--- a/sc/source/core/data/fillinfo.cxx
+++ b/sc/source/core/data/fillinfo.cxx
@@ -323,7 +323,6 @@ void ScDocument::FillInfo(
         //! Conditionals auch bei HASATTR_ROTATE abfragen ????
 
         OSL_ENSURE( nArrCount>2, "nArrCount too small" );
-//      FindMaxRotCol( nTab, &pRowInfo[1], nArrCount-2, nX1, nX2 );
         FindMaxRotCol( nTab, &pRowInfo[1], nArrCount-1, nCol1, nCol2 );
         //  FindMaxRotCol setzt nRotMaxCol
 
commit 42ba518fa8116b5ed937fdbccb9e6eda50cd5aab
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date:   Fri Jun 21 16:09:22 2013 -0400

    A little more cleanup.
    
    Remove CELLINFO macro, and rename nArrX and nArrY to nArrCol and nArrRow.
    
    Change-Id: Id105cfefc44e454be2df96a4084dee9185435fab

diff --git a/sc/source/core/data/fillinfo.cxx b/sc/source/core/data/fillinfo.cxx
index d34d914..c0c02d6 100644
--- a/sc/source/core/data/fillinfo.cxx
+++ b/sc/source/core/data/fillinfo.cxx
@@ -42,10 +42,6 @@
 #include "cellvalue.hxx"
 #include "mtvcellfunc.hxx"
 
-#include <iostream>
-
-// -----------------------------------------------------------------------
-
 const sal_uInt16 ROWINFO_MAX = 1024;
 
 
@@ -129,8 +125,6 @@ static void lcl_GetMergeRange( SCsCOL nX, SCsROW nY, SCSIZE nArrY,
     rEndY = rStartY + pMerge->GetRowMerge() - 1;
 }
 
-#define CELLINFO(x,y) pRowInfo[nArrY+y].pCellInfo[nArrX+x]
-
 namespace {
 
 class RowInfoFiller
@@ -224,8 +218,8 @@ void ScDocument::FillInfo(
     SCCOL nX;
     SCROW nY;
     SCsROW nSignedY;
-    SCCOL nArrX;
-    SCSIZE nArrY;
+    SCCOL nArrCol;
+    SCSIZE nArrRow;
     SCSIZE nArrCount;
     bool bAnyMerged = false;
     bool bAnyShadow = false;
@@ -259,7 +253,7 @@ void ScDocument::FillInfo(
 
     //  zuerst nur die Eintraege fuer die ganze Spalte
 
-    nArrY=0;
+    nArrRow=0;
     SCROW nYExtra = nRow2+1;
     sal_uInt16 nDocHeight = ScGlobal::nStdRowHeight;
     SCROW nDocHeightEndRow = -1;
@@ -278,9 +272,9 @@ void ScDocument::FillInfo(
                 nDocHeight = ScGlobal::nStdRowHeight;
         }
 
-        if ( nArrY==0 || nDocHeight || nY > MAXROW )
+        if ( nArrRow==0 || nDocHeight || nY > MAXROW )
         {
-            RowInfo* pThisRowInfo = &pRowInfo[nArrY];
+            RowInfo* pThisRowInfo = &pRowInfo[nArrRow];
             pThisRowInfo->pCellInfo = NULL;                 // wird unten belegt
 
             sal_uInt16 nHeight = (sal_uInt16) ( nDocHeight * fRowScale );
@@ -296,8 +290,8 @@ void ScDocument::FillInfo(
             pThisRowInfo->bPivotButton  = false;
             pThisRowInfo->nRotMaxCol    = SC_ROTMAX_NONE;
 
-            ++nArrY;
-            if (nArrY >= ROWINFO_MAX)
+            ++nArrRow;
+            if (nArrRow >= ROWINFO_MAX)
             {
                 OSL_FAIL("FillInfo: Range too big" );
                 nYExtra = nSignedY;                                 // Ende
@@ -308,7 +302,7 @@ void ScDocument::FillInfo(
             if (nSignedY==(SCsROW) nYExtra)                         // zusaetzliche Zeile verdeckt ?
                 ++nYExtra;
     }
-    nArrCount = nArrY;                                      // incl. Dummys
+    nArrCount = nArrRow;                                      // incl. Dummys
 
     //  rotierter Text...
 
@@ -333,28 +327,28 @@ void ScDocument::FillInfo(
         FindMaxRotCol( nTab, &pRowInfo[1], nArrCount-1, nCol1, nCol2 );
         //  FindMaxRotCol setzt nRotMaxCol
 
-        for (nArrY=0; nArrY<nArrCount; nArrY++)
-            if (pRowInfo[nArrY].nRotMaxCol != SC_ROTMAX_NONE && pRowInfo[nArrY].nRotMaxCol > nRotMax)
-                nRotMax = pRowInfo[nArrY].nRotMaxCol;
+        for (nArrRow=0; nArrRow<nArrCount; nArrRow++)
+            if (pRowInfo[nArrRow].nRotMaxCol != SC_ROTMAX_NONE && pRowInfo[nArrRow].nRotMaxCol > nRotMax)
+                nRotMax = pRowInfo[nArrRow].nRotMaxCol;
     }
 
     //  Zell-Infos erst nach dem Test auf gedrehte allozieren
     //  bis nRotMax wegen nRotateDir Flag
 
-    for (nArrY=0; nArrY<nArrCount; nArrY++)
+    for (nArrRow=0; nArrRow<nArrCount; nArrRow++)
     {
-        RowInfo* pThisRowInfo = &pRowInfo[nArrY];
+        RowInfo* pThisRowInfo = &pRowInfo[nArrRow];
         nY = pThisRowInfo->nRowNo;
         pThisRowInfo->pCellInfo = new CellInfo[ nRotMax+1+2 ];  // vom Aufrufer zu loeschen !
 
-        for (nArrX=0; nArrX<=nRotMax+2; nArrX++)                // Zell-Infos vorbelegen
+        for (nArrCol=0; nArrCol<=nRotMax+2; nArrCol++)                // Zell-Infos vorbelegen
         {
-            if (nArrX>0)
-                nX = nArrX-1;
+            if (nArrCol>0)
+                nX = nArrCol-1;
             else
                 nX = MAXCOL+1;      // ungueltig
 
-            CellInfo* pInfo = &pThisRowInfo->pCellInfo[nArrX];
+            CellInfo* pInfo = &pThisRowInfo->pCellInfo[nArrCol];
             pInfo->bEmptyCellText = true;
             pInfo->maCell.clear();
             if (bPaintMarks)
@@ -392,9 +386,9 @@ void ScDocument::FillInfo(
         }
     }
 
-    for (nArrX=nCol2+3; nArrX<=nRotMax+2; nArrX++)            // restliche Breiten eintragen
+    for (nArrCol=nCol2+3; nArrCol<=nRotMax+2; nArrCol++)            // restliche Breiten eintragen
     {
-        nX = nArrX-1;
+        nX = nArrCol-1;
         if ( ValidCol(nX) )
         {
             if (!ColHidden(nX, nTab))
@@ -403,7 +397,7 @@ void ScDocument::FillInfo(
                 if (!nThisWidth)
                     nThisWidth = 1;
 
-                pRowInfo[0].pCellInfo[nArrX].nWidth = nThisWidth;
+                pRowInfo[0].pCellInfo[nArrCol].nWidth = nThisWidth;
             }
         }
     }
@@ -412,9 +406,9 @@ void ScDocument::FillInfo(
     if(pCondFormList)
         pCondFormList->startRendering();
 
-    for (nArrX=0; nArrX<=nCol2+2; nArrX++)                    // links & rechts + 1
+    for (nArrCol=0; nArrCol<=nCol2+2; nArrCol++)                    // links & rechts + 1
     {
-        nX = (nArrX>0) ? nArrX-1 : MAXCOL+1;                    // negativ -> ungueltig
+        nX = (nArrCol>0) ? nArrCol-1 : MAXCOL+1;                    // negativ -> ungueltig
 
         if ( ValidCol(nX) )
         {
@@ -428,14 +422,14 @@ void ScDocument::FillInfo(
                 if (!nThisWidth)
                     nThisWidth = 1;
 
-                pRowInfo[0].pCellInfo[nArrX].nWidth = nThisWidth;           //! dies sollte reichen
+                pRowInfo[0].pCellInfo[nArrCol].nWidth = nThisWidth;           //! dies sollte reichen
 
                 ScColumn* pThisCol = &maTabs[nTab]->aCol[nX];                   // Spalten-Daten
 
-                nArrY = 1;
+                nArrRow = 1;
                 // Iterate between rows nY1 and nY2 and pick up non-empty
                 // cells that are not hidden.
-                RowInfoFiller aFunc(*this, nTab, pRowInfo, nArrX, nArrY);
+                RowInfoFiller aFunc(*this, nTab, pRowInfo, nArrCol, nArrRow);
                 sc::ParseAllNonEmpty(
                     pThisCol->maCells.begin(), pThisCol->maCells, nRow1, nRow2, aFunc, aFunc);
 
@@ -443,13 +437,13 @@ void ScDocument::FillInfo(
                 {
                     ScAttrArray* pThisAttrArr = pThisCol->pAttrArray;       // Attribute
 
-                    nArrY = 0;
+                    nArrRow = 0;
                     const ScPatternAttr* pPattern;
                     SCROW nCurRow=nRow1;                  // einzelne Zeile
                     if (nCurRow>0)
                         --nCurRow;                      // oben 1 mehr
                     else
-                        nArrY = 1;
+                        nArrRow = 1;
                     nThisRow=nCurRow;                   // Ende des Bereichs
                     SCSIZE  nIndex;
                     (void) pThisAttrArr->Search( nCurRow, nIndex );
@@ -508,9 +502,9 @@ void ScDocument::FillInfo(
                         {
                             SCROW nLastHiddenRow = -1;
                             bool bRowHidden = RowHidden(nCurRow, nTab, NULL, &nLastHiddenRow);
-                            if ( nArrY==0 || !bRowHidden )
+                            if ( nArrRow==0 || !bRowHidden )
                             {
-                                RowInfo* pThisRowInfo = &pRowInfo[nArrY];
+                                RowInfo* pThisRowInfo = &pRowInfo[nArrRow];
                                 if (pBackground != pDefBackground)          // Spalten-HG == Standard ?
                                     pThisRowInfo->bEmptyBack = false;
                                 if (bContainsCondFormat)
@@ -520,7 +514,7 @@ void ScDocument::FillInfo(
                                 if (bPivotButton || bPivotPopupButton)
                                     pThisRowInfo->bPivotButton = true;
 
-                                CellInfo* pInfo = &pThisRowInfo->pCellInfo[nArrX];
+                                CellInfo* pInfo = &pThisRowInfo->pCellInfo[nArrCol];
                                 pInfo->pBackground  = pBackground;
                                 pInfo->pPatternAttr = pPattern;
                                 pInfo->bMerged      = bMerged;
@@ -600,7 +594,7 @@ void ScDocument::FillInfo(
                                 if (bHidden || (bFormulaMode && bHideFormula && pInfo->maCell.meType == CELLTYPE_FORMULA))
                                     pInfo->bEmptyCellText = true;
 
-                                ++nArrY;
+                                ++nArrRow;
                             }
                             else if (bRowHidden && nLastHiddenRow >= 0)
                             {
@@ -620,7 +614,7 @@ void ScDocument::FillInfo(
                     {
                         //  Blockmarken
                         const ScMarkArray* pThisMarkArr = pMarkData->GetArray()+nX;
-                        nArrY = 1;
+                        nArrRow = 1;
                         nCurRow = nRow1;                                      // einzelne Zeile
                         nThisRow = nRow1;                                     // Ende des Bereichs
 
@@ -645,12 +639,12 @@ void ScDocument::FillInfo(
                                                         nCurRow <= nBlockEndY;
                                             if (!bSkip)
                                             {
-                                                RowInfo* pThisRowInfo = &pRowInfo[nArrY];
-                                                CellInfo* pInfo = &pThisRowInfo->pCellInfo[nArrX];
+                                                RowInfo* pThisRowInfo = &pRowInfo[nArrRow];
+                                                CellInfo* pInfo = &pThisRowInfo->pCellInfo[nArrCol];
                                                 pInfo->bMarked = true;
                                             }
                                         }
-                                        ++nArrY;
+                                        ++nArrRow;
                                     }
                                     ++nCurRow;
                                 }
@@ -663,10 +657,10 @@ void ScDocument::FillInfo(
                 }
                 else                                    // vordere Spalten
                 {
-                    for (nArrY=1; nArrY+1<nArrCount; nArrY++)
+                    for (nArrRow=1; nArrRow+1<nArrCount; nArrRow++)
                     {
-                        RowInfo* pThisRowInfo = &pRowInfo[nArrY];
-                        CellInfo* pInfo = &pThisRowInfo->pCellInfo[nArrX];
+                        RowInfo* pThisRowInfo = &pRowInfo[nArrRow];
+                        CellInfo* pInfo = &pThisRowInfo->pCellInfo[nArrCol];
 
                         pInfo->nWidth       = nThisWidth;           //! oder nur 0 abfragen ??
                     }
@@ -674,7 +668,7 @@ void ScDocument::FillInfo(
             }
         }
         else
-            pRowInfo[0].pCellInfo[nArrX].nWidth = STD_COL_WIDTH;
+            pRowInfo[0].pCellInfo[nArrCol].nWidth = STD_COL_WIDTH;
         // STD_COL_WIDTH ganz links und rechts wird fuer DrawExtraShadow gebraucht
     }
 
@@ -685,11 +679,11 @@ void ScDocument::FillInfo(
 
     if (bAnyCondition)
     {
-        for (nArrY=0; nArrY<nArrCount; nArrY++)
+        for (nArrRow=0; nArrRow<nArrCount; nArrRow++)
         {
-            for (nArrX=nCol1; nArrX<=nCol2+2; nArrX++)                  // links und rechts einer mehr
+            for (nArrCol=nCol1; nArrCol<=nCol2+2; nArrCol++)                  // links und rechts einer mehr
             {
-                CellInfo* pInfo = &pRowInfo[nArrY].pCellInfo[nArrX];
+                CellInfo* pInfo = &pRowInfo[nArrRow].pCellInfo[nArrCol];
                 const SfxItemSet* pCondSet = pInfo->pConditionSet;
                 if (pCondSet)
                 {
@@ -699,7 +693,7 @@ void ScDocument::FillInfo(
                     if ( pCondSet->GetItemState( ATTR_BACKGROUND, true, &pItem ) == SFX_ITEM_SET )
                     {
                         pInfo->pBackground = (const SvxBrushItem*) pItem;
-                        pRowInfo[nArrY].bEmptyBack = false;
+                        pRowInfo[nArrRow].bEmptyBack = false;
                     }
 
                             //  Umrandung
@@ -720,7 +714,7 @@ void ScDocument::FillInfo(
                 }
                 if(pInfo->pColorScale)
                 {
-                    pRowInfo[nArrY].bEmptyBack = false;
+                    pRowInfo[nArrRow].bEmptyBack = false;
                     pInfo->pBackground = new SvxBrushItem(*pInfo->pColorScale, ATTR_BACKGROUND);
                 }
             }
@@ -736,15 +730,15 @@ void ScDocument::FillInfo(
 
     if (bAnyMerged)
     {
-        for (nArrY=0; nArrY<nArrCount; nArrY++)
+        for (nArrRow=0; nArrRow<nArrCount; nArrRow++)
         {
-            RowInfo* pThisRowInfo = &pRowInfo[nArrY];
-            nSignedY = nArrY ? pThisRowInfo->nRowNo : ((SCsROW)nRow1)-1;
+            RowInfo* pThisRowInfo = &pRowInfo[nArrRow];
+            nSignedY = nArrRow ? pThisRowInfo->nRowNo : ((SCsROW)nRow1)-1;
 
-            for (nArrX=nCol1; nArrX<=nCol2+2; nArrX++)                  // links und rechts einer mehr
+            for (nArrCol=nCol1; nArrCol<=nCol2+2; nArrCol++)                  // links und rechts einer mehr
             {
-                SCsCOL nSignedX = ((SCsCOL) nArrX) - 1;
-                CellInfo* pInfo = &pThisRowInfo->pCellInfo[nArrX];
+                SCsCOL nSignedX = ((SCsCOL) nArrCol) - 1;
+                CellInfo* pInfo = &pThisRowInfo->pCellInfo[nArrCol];
 
                 if (pInfo->bMerged || pInfo->bHOverlapped || pInfo->bVOverlapped)
                 {
@@ -752,7 +746,7 @@ void ScDocument::FillInfo(
                     SCsROW nStartY;
                     SCsCOL nEndX;
                     SCsROW nEndY;
-                    lcl_GetMergeRange( nSignedX,nSignedY, nArrY, this,pRowInfo, nCol1,nRow1,nCol2,nRow2,nTab,
+                    lcl_GetMergeRange( nSignedX,nSignedY, nArrRow, this,pRowInfo, nCol1,nRow1,nCol2,nRow2,nTab,
                                         nStartX,nStartY, nEndX,nEndY );
                     const ScPatternAttr* pStartPattern = GetPattern( nStartX,nStartY,nTab );
                     const SfxItemSet* pStartCond = GetCondResult( nStartX,nStartY,nTab );
@@ -764,7 +758,7 @@ void ScDocument::FillInfo(
                                     GetItemState(ATTR_BACKGROUND,true,&pItem) != SFX_ITEM_SET )
                         pItem = &pStartPattern->GetItem(ATTR_BACKGROUND);
                     pInfo->pBackground = (const SvxBrushItem*) pItem;
-                    pRowInfo[nArrY].bEmptyBack = false;
+                    pRowInfo[nArrRow].bEmptyBack = false;
 
                     // Schatten
 
@@ -799,17 +793,17 @@ void ScDocument::FillInfo(
 
     if (bAnyShadow)                             // Schatten verteilen
     {
-        for (nArrY=0; nArrY<nArrCount; nArrY++)
+        for (nArrRow=0; nArrRow<nArrCount; nArrRow++)
         {
-            bool bTop = ( nArrY == 0 );
-            bool bBottom = ( nArrY+1 == nArrCount );
+            bool bTop = ( nArrRow == 0 );
+            bool bBottom = ( nArrRow+1 == nArrCount );
 
-            for (nArrX=nCol1; nArrX<=nCol2+2; nArrX++)                  // links und rechts einer mehr
+            for (nArrCol=nCol1; nArrCol<=nCol2+2; nArrCol++)                  // links und rechts einer mehr
             {
-                bool bLeft = ( nArrX == nCol1 );
-                bool bRight = ( nArrX == nCol2+2 );
+                bool bLeft = ( nArrCol == nCol1 );
+                bool bRight = ( nArrCol == nCol2+2 );
 
-                CellInfo* pInfo = &pRowInfo[nArrY].pCellInfo[nArrX];
+                CellInfo* pInfo = &pRowInfo[nArrRow].pCellInfo[nArrCol];
                 const SvxShadowItem* pThisAttr = pInfo->pShadowAttr;
                 SvxShadowLocation eLoc = pThisAttr ? pThisAttr->GetLocation() : SVX_SHADOW_NONE;
                 if (eLoc != SVX_SHADOW_NONE)
@@ -819,19 +813,19 @@ void ScDocument::FillInfo(
                     SCsCOL nDxPos = 1;
                     SCsCOL nDxNeg = -1;
 
-                    while ( nArrX+nDxPos < nCol2+2 && pRowInfo[0].pCellInfo[nArrX+nDxPos].nWidth == 0 )
+                    while ( nArrCol+nDxPos < nCol2+2 && pRowInfo[0].pCellInfo[nArrCol+nDxPos].nWidth == 0 )
                         ++nDxPos;
-                    while ( nArrX+nDxNeg > nCol1 && pRowInfo[0].pCellInfo[nArrX+nDxNeg].nWidth == 0 )
+                    while ( nArrCol+nDxNeg > nCol1 && pRowInfo[0].pCellInfo[nArrCol+nDxNeg].nWidth == 0 )
                         --nDxNeg;
 
                     bool bLeftDiff = !bLeft &&
-                            CELLINFO(nDxNeg,0).pShadowAttr->GetLocation() == SVX_SHADOW_NONE;
+                            pRowInfo[nArrRow].pCellInfo[nArrCol+nDxNeg].pShadowAttr->GetLocation() == SVX_SHADOW_NONE;
                     bool bRightDiff = !bRight &&
-                            CELLINFO(nDxPos,0).pShadowAttr->GetLocation() == SVX_SHADOW_NONE;
+                            pRowInfo[nArrRow].pCellInfo[nArrCol+nDxPos].pShadowAttr->GetLocation() == SVX_SHADOW_NONE;
                     bool bTopDiff = !bTop &&
-                            CELLINFO(0,-1).pShadowAttr->GetLocation() == SVX_SHADOW_NONE;
+                            pRowInfo[nArrRow-1].pCellInfo[nArrCol].pShadowAttr->GetLocation() == SVX_SHADOW_NONE;
                     bool bBottomDiff = !bBottom &&
-                            CELLINFO(0,1).pShadowAttr->GetLocation() == SVX_SHADOW_NONE;
+                            pRowInfo[nArrRow+1].pCellInfo[nArrCol].pShadowAttr->GetLocation() == SVX_SHADOW_NONE;
 
                     if ( bLayoutRTL )
                     {
@@ -853,80 +847,80 @@ void ScDocument::FillInfo(
                         case SVX_SHADOW_BOTTOMRIGHT:
                             if (bBottomDiff)
                             {
-                                CELLINFO(0,1).pHShadowOrigin = pThisAttr;
-                                CELLINFO(0,1).eHShadowPart =
+                                pRowInfo[nArrRow+1].pCellInfo[nArrCol].pHShadowOrigin = pThisAttr;
+                                pRowInfo[nArrRow+1].pCellInfo[nArrCol].eHShadowPart =
                                                 bLeftDiff ? SC_SHADOW_HSTART : SC_SHADOW_HORIZ;
                             }
                             if (bRightDiff)
                             {
-                                CELLINFO(1,0).pVShadowOrigin = pThisAttr;
-                                CELLINFO(1,0).eVShadowPart =
+                                pRowInfo[nArrRow].pCellInfo[nArrCol+1].pVShadowOrigin = pThisAttr;
+                                pRowInfo[nArrRow].pCellInfo[nArrCol+1].eVShadowPart =
                                                 bTopDiff ? SC_SHADOW_VSTART : SC_SHADOW_VERT;
                             }
                             if (bBottomDiff && bRightDiff)
                             {
-                                CELLINFO(1,1).pHShadowOrigin = pThisAttr;
-                                CELLINFO(1,1).eHShadowPart = SC_SHADOW_CORNER;
+                                pRowInfo[nArrRow+1].pCellInfo[nArrCol+1].pHShadowOrigin = pThisAttr;
+                                pRowInfo[nArrRow+1].pCellInfo[nArrCol+1].eHShadowPart = SC_SHADOW_CORNER;
                             }
                             break;
 
                         case SVX_SHADOW_BOTTOMLEFT:
                             if (bBottomDiff)
                             {
-                                CELLINFO(0,1).pHShadowOrigin = pThisAttr;
-                                CELLINFO(0,1).eHShadowPart =
+                                pRowInfo[nArrRow+1].pCellInfo[nArrCol].pHShadowOrigin = pThisAttr;
+                                pRowInfo[nArrRow+1].pCellInfo[nArrCol].eHShadowPart =
                                                 bRightDiff ? SC_SHADOW_HSTART : SC_SHADOW_HORIZ;
                             }
                             if (bLeftDiff)
                             {
-                                CELLINFO(-1,0).pVShadowOrigin = pThisAttr;
-                                CELLINFO(-1,0).eVShadowPart =
+                                pRowInfo[nArrRow].pCellInfo[nArrCol-1].pVShadowOrigin = pThisAttr;
+                                pRowInfo[nArrRow].pCellInfo[nArrCol-1].eVShadowPart =
                                                 bTopDiff ? SC_SHADOW_VSTART : SC_SHADOW_VERT;
                             }
                             if (bBottomDiff && bLeftDiff)
                             {
-                                CELLINFO(-1,1).pHShadowOrigin = pThisAttr;
-                                CELLINFO(-1,1).eHShadowPart = SC_SHADOW_CORNER;
+                                pRowInfo[nArrRow+1].pCellInfo[nArrCol-1].pHShadowOrigin = pThisAttr;
+                                pRowInfo[nArrRow+1].pCellInfo[nArrCol-1].eHShadowPart = SC_SHADOW_CORNER;
                             }
                             break;
 
                         case SVX_SHADOW_TOPRIGHT:
                             if (bTopDiff)
                             {
-                                CELLINFO(0,-1).pHShadowOrigin = pThisAttr;
-                                CELLINFO(0,-1).eHShadowPart =
+                                pRowInfo[nArrRow-1].pCellInfo[nArrCol].pHShadowOrigin = pThisAttr;
+                                pRowInfo[nArrRow-1].pCellInfo[nArrCol].eHShadowPart =
                                                 bLeftDiff ? SC_SHADOW_HSTART : SC_SHADOW_HORIZ;
                             }
                             if (bRightDiff)
                             {
-                                CELLINFO(1,0).pVShadowOrigin = pThisAttr;
-                                CELLINFO(1,0).eVShadowPart =
+                                pRowInfo[nArrRow].pCellInfo[nArrCol+1].pVShadowOrigin = pThisAttr;
+                                pRowInfo[nArrRow].pCellInfo[nArrCol+1].eVShadowPart =
                                                 bBottomDiff ? SC_SHADOW_VSTART : SC_SHADOW_VERT;
                             }
                             if (bTopDiff && bRightDiff)
                             {
-                                CELLINFO(1,-1).pHShadowOrigin = pThisAttr;
-                                CELLINFO(1,-1).eHShadowPart = SC_SHADOW_CORNER;
+                                pRowInfo[nArrRow-1].pCellInfo[nArrCol+1].pHShadowOrigin = pThisAttr;
+                                pRowInfo[nArrRow-1].pCellInfo[nArrCol+1].eHShadowPart = SC_SHADOW_CORNER;
                             }
                             break;
 
                         case SVX_SHADOW_TOPLEFT:
                             if (bTopDiff)
                             {
-                                CELLINFO(0,-1).pHShadowOrigin = pThisAttr;
-                                CELLINFO(0,-1).eHShadowPart =
+                                pRowInfo[nArrRow-1].pCellInfo[nArrCol].pHShadowOrigin = pThisAttr;
+                                pRowInfo[nArrRow-1].pCellInfo[nArrCol].eHShadowPart =
                                                 bRightDiff ? SC_SHADOW_HSTART : SC_SHADOW_HORIZ;
                             }
                             if (bLeftDiff)
                             {
-                                CELLINFO(-1,0).pVShadowOrigin = pThisAttr;
-                                CELLINFO(-1,0).eVShadowPart =
+                                pRowInfo[nArrRow].pCellInfo[nArrCol-1].pVShadowOrigin = pThisAttr;
+                                pRowInfo[nArrRow].pCellInfo[nArrCol-1].eVShadowPart =
                                                 bBottomDiff ? SC_SHADOW_VSTART : SC_SHADOW_VERT;
                             }
                             if (bTopDiff && bLeftDiff)
                             {
-                                CELLINFO(-1,-1).pHShadowOrigin = pThisAttr;
-                                CELLINFO(-1,-1).eHShadowPart = SC_SHADOW_CORNER;
+                                pRowInfo[nArrRow-1].pCellInfo[nArrCol-1].pHShadowOrigin = pThisAttr;
+                                pRowInfo[nArrRow-1].pCellInfo[nArrCol-1].eHShadowPart = SC_SHADOW_CORNER;
                             }
                             break;
 
commit c23a065c60f27fe7c4305878dc2b5df6250245a5
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date:   Fri Jun 21 15:39:46 2013 -0400

    Rename parameter names for consistency.
    
    nCol and nRow are better than nX and nY etc.
    
    Change-Id: Ie92d4e2727a1100736610a3876721d61e8279b15

diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx
index 7a64846..489dca2 100644
--- a/sc/inc/document.hxx
+++ b/sc/inc/document.hxx
@@ -1576,10 +1576,10 @@ public:
     void            SetSrcCharSet( CharSet eNew )   { eSrcSet = eNew; }
     void            UpdateFontCharSet();
 
-    void            FillInfo( ScTableInfo& rTabInfo, SCCOL nX1, SCROW nY1, SCCOL nX2, SCROW nY2,
-                        SCTAB nTab, double nScaleX, double nScaleY,
-                        bool bPageMode, bool bFormulaMode,
-                        const ScMarkData* pMarkData = NULL );
+    void FillInfo(
+        ScTableInfo& rTabInfo, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2,
+        SCTAB nTab, double fColScale, double fRowScale, bool bPageMode, bool bFormulaMode,
+        const ScMarkData* pMarkData = NULL );
 
     SC_DLLPUBLIC SvNumberFormatter* GetFormatTable() const;
 
diff --git a/sc/source/core/data/fillinfo.cxx b/sc/source/core/data/fillinfo.cxx
index 7f73391..d34d914 100644
--- a/sc/source/core/data/fillinfo.cxx
+++ b/sc/source/core/data/fillinfo.cxx
@@ -151,7 +151,7 @@ class RowInfoFiller
         return mbHiddenRow;
     }
 
-    void setInfo(const ScRefCellValue& rCell)
+    void setInfo(size_t /*nRow*/, const ScRefCellValue& rCell)
     {
         RowInfo* pThisRowInfo = &mpRowInfo[mrArrY];
         CellInfo* pInfo = &pThisRowInfo->pCellInfo[mnArrX];
@@ -169,25 +169,25 @@ public:
     void operator() (size_t nRow, double fVal)
     {
         if (!isHidden(nRow))
-            setInfo(ScRefCellValue(fVal));
+            setInfo(nRow, ScRefCellValue(fVal));
     }
 
     void operator() (size_t nRow, const OUString& rStr)
     {
         if (!isHidden(nRow))
-            setInfo(ScRefCellValue(&rStr));
+            setInfo(nRow, ScRefCellValue(&rStr));
     }
 
     void operator() (size_t nRow, const EditTextObject* p)
     {
         if (!isHidden(nRow))
-            setInfo(ScRefCellValue(p));
+            setInfo(nRow, ScRefCellValue(p));
     }
 
     void operator() (size_t nRow, const ScFormulaCell* p)
     {
         if (!isHidden(nRow))
-            setInfo(ScRefCellValue(const_cast<ScFormulaCell*>(p)));
+            setInfo(nRow, ScRefCellValue(const_cast<ScFormulaCell*>(p)));
     }
 
     void operator() (mdds::mtv::element_t, size_t, size_t nDataSize)
@@ -199,9 +199,10 @@ public:
 
 }
 
-void ScDocument::FillInfo( ScTableInfo& rTabInfo, SCCOL nX1, SCROW nY1, SCCOL nX2, SCROW nY2,
-                            SCTAB nTab, double nScaleX, double nScaleY,
-                            bool bPageMode, bool bFormulaMode, const ScMarkData* pMarkData )
+void ScDocument::FillInfo(
+    ScTableInfo& rTabInfo, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2,
+    SCTAB nTab, double fColScale, double fRowScale, bool bPageMode, bool bFormulaMode,
+    const ScMarkData* pMarkData )
 {
     OSL_ENSURE( maTabs[nTab], "Table does not exist" );
 
@@ -259,10 +260,10 @@ void ScDocument::FillInfo( ScTableInfo& rTabInfo, SCCOL nX1, SCROW nY1, SCCOL nX
     //  zuerst nur die Eintraege fuer die ganze Spalte
 
     nArrY=0;
-    SCROW nYExtra = nY2+1;
+    SCROW nYExtra = nRow2+1;
     sal_uInt16 nDocHeight = ScGlobal::nStdRowHeight;
     SCROW nDocHeightEndRow = -1;
-    for (nSignedY=((SCsROW)nY1)-1; nSignedY<=(SCsROW)nYExtra; nSignedY++)
+    for (nSignedY=((SCsROW)nRow1)-1; nSignedY<=(SCsROW)nYExtra; nSignedY++)
     {
         if (nSignedY >= 0)
             nY = (SCROW) nSignedY;
@@ -282,7 +283,7 @@ void ScDocument::FillInfo( ScTableInfo& rTabInfo, SCCOL nX1, SCROW nY1, SCCOL nX
             RowInfo* pThisRowInfo = &pRowInfo[nArrY];
             pThisRowInfo->pCellInfo = NULL;                 // wird unten belegt
 
-            sal_uInt16 nHeight = (sal_uInt16) ( nDocHeight * nScaleY );
+            sal_uInt16 nHeight = (sal_uInt16) ( nDocHeight * fRowScale );
             if (!nHeight)
                 nHeight = 1;
 
@@ -300,7 +301,7 @@ void ScDocument::FillInfo( ScTableInfo& rTabInfo, SCCOL nX1, SCROW nY1, SCCOL nX
             {
                 OSL_FAIL("FillInfo: Range too big" );
                 nYExtra = nSignedY;                                 // Ende
-                nY2 = nYExtra - 1;                                  // Bereich anpassen
+                nRow2 = nYExtra - 1;                                  // Bereich anpassen
             }
         }
         else
@@ -321,15 +322,15 @@ void ScDocument::FillInfo( ScTableInfo& rTabInfo, SCCOL nX1, SCROW nY1, SCCOL nX
             break;
         }
 
-    SCCOL nRotMax = nX2;
-    if ( bAnyItem && HasAttrib( 0,nY1,nTab, MAXCOL,nY2+1,nTab,
+    SCCOL nRotMax = nCol2;
+    if ( bAnyItem && HasAttrib( 0,nRow1,nTab, MAXCOL,nRow2+1,nTab,
                                 HASATTR_ROTATE | HASATTR_CONDITIONAL ) )
     {
         //! Conditionals auch bei HASATTR_ROTATE abfragen ????
 
         OSL_ENSURE( nArrCount>2, "nArrCount too small" );
 //      FindMaxRotCol( nTab, &pRowInfo[1], nArrCount-2, nX1, nX2 );
-        FindMaxRotCol( nTab, &pRowInfo[1], nArrCount-1, nX1, nX2 );
+        FindMaxRotCol( nTab, &pRowInfo[1], nArrCount-1, nCol1, nCol2 );
         //  FindMaxRotCol setzt nRotMaxCol
 
         for (nArrY=0; nArrY<nArrCount; nArrY++)
@@ -391,14 +392,14 @@ void ScDocument::FillInfo( ScTableInfo& rTabInfo, SCCOL nX1, SCROW nY1, SCCOL nX
         }
     }
 
-    for (nArrX=nX2+3; nArrX<=nRotMax+2; nArrX++)            // restliche Breiten eintragen
+    for (nArrX=nCol2+3; nArrX<=nRotMax+2; nArrX++)            // restliche Breiten eintragen
     {
         nX = nArrX-1;
         if ( ValidCol(nX) )
         {
             if (!ColHidden(nX, nTab))
             {
-                sal_uInt16 nThisWidth = (sal_uInt16) (GetColWidth( nX, nTab ) * nScaleX);
+                sal_uInt16 nThisWidth = (sal_uInt16) (GetColWidth( nX, nTab ) * fColScale);
                 if (!nThisWidth)
                     nThisWidth = 1;
 
@@ -411,7 +412,7 @@ void ScDocument::FillInfo( ScTableInfo& rTabInfo, SCCOL nX1, SCROW nY1, SCCOL nX
     if(pCondFormList)
         pCondFormList->startRendering();
 
-    for (nArrX=0; nArrX<=nX2+2; nArrX++)                    // links & rechts + 1
+    for (nArrX=0; nArrX<=nCol2+2; nArrX++)                    // links & rechts + 1
     {
         nX = (nArrX>0) ? nArrX-1 : MAXCOL+1;                    // negativ -> ungueltig
 
@@ -423,7 +424,7 @@ void ScDocument::FillInfo( ScTableInfo& rTabInfo, SCCOL nX1, SCROW nY1, SCCOL nX
             // TODO: Optimize this loop.
             if (!ColHidden(nX, nTab))
             {
-                sal_uInt16 nThisWidth = (sal_uInt16) (GetColWidth( nX, nTab ) * nScaleX);
+                sal_uInt16 nThisWidth = (sal_uInt16) (GetColWidth( nX, nTab ) * fColScale);
                 if (!nThisWidth)
                     nThisWidth = 1;
 
@@ -436,15 +437,15 @@ void ScDocument::FillInfo( ScTableInfo& rTabInfo, SCCOL nX1, SCROW nY1, SCCOL nX
                 // cells that are not hidden.
                 RowInfoFiller aFunc(*this, nTab, pRowInfo, nArrX, nArrY);
                 sc::ParseAllNonEmpty(
-                    pThisCol->maCells.begin(), pThisCol->maCells, nY1, nY2, aFunc, aFunc);
+                    pThisCol->maCells.begin(), pThisCol->maCells, nRow1, nRow2, aFunc, aFunc);
 
-                if (nX+1 >= nX1)                                // Attribute/Blockmarken ab nX1-1
+                if (nX+1 >= nCol1)                                // Attribute/Blockmarken ab nX1-1
                 {
                     ScAttrArray* pThisAttrArr = pThisCol->pAttrArray;       // Attribute
 
                     nArrY = 0;
                     const ScPatternAttr* pPattern;
-                    SCROW nCurRow=nY1;                  // einzelne Zeile
+                    SCROW nCurRow=nRow1;                  // einzelne Zeile
                     if (nCurRow>0)
                         --nCurRow;                      // oben 1 mehr
                     else
@@ -620,10 +621,10 @@ void ScDocument::FillInfo( ScTableInfo& rTabInfo, SCCOL nX1, SCROW nY1, SCCOL nX
                         //  Blockmarken
                         const ScMarkArray* pThisMarkArr = pMarkData->GetArray()+nX;
                         nArrY = 1;
-                        nCurRow = nY1;                                      // einzelne Zeile
-                        nThisRow = nY1;                                     // Ende des Bereichs
+                        nCurRow = nRow1;                                      // einzelne Zeile
+                        nThisRow = nRow1;                                     // Ende des Bereichs
 
-                        if ( pThisMarkArr->Search( nY1, nIndex ) )
+                        if ( pThisMarkArr->Search( nRow1, nIndex ) )
                         {
                             bool bThisMarked;
                             do
@@ -653,10 +654,10 @@ void ScDocument::FillInfo( ScTableInfo& rTabInfo, SCCOL nX1, SCROW nY1, SCCOL nX
                                     }
                                     ++nCurRow;
                                 }
-                                while (nCurRow <= nThisRow && nCurRow <= nY2);
+                                while (nCurRow <= nThisRow && nCurRow <= nRow2);
                                 ++nIndex;
                             }
-                            while ( nIndex < pThisMarkArr->nCount && nThisRow < nY2 );
+                            while ( nIndex < pThisMarkArr->nCount && nThisRow < nRow2 );
                         }
                     }
                 }
@@ -686,7 +687,7 @@ void ScDocument::FillInfo( ScTableInfo& rTabInfo, SCCOL nX1, SCROW nY1, SCCOL nX
     {
         for (nArrY=0; nArrY<nArrCount; nArrY++)
         {
-            for (nArrX=nX1; nArrX<=nX2+2; nArrX++)                  // links und rechts einer mehr
+            for (nArrX=nCol1; nArrX<=nCol2+2; nArrX++)                  // links und rechts einer mehr
             {
                 CellInfo* pInfo = &pRowInfo[nArrY].pCellInfo[nArrX];
                 const SfxItemSet* pCondSet = pInfo->pConditionSet;
@@ -738,9 +739,9 @@ void ScDocument::FillInfo( ScTableInfo& rTabInfo, SCCOL nX1, SCROW nY1, SCCOL nX
         for (nArrY=0; nArrY<nArrCount; nArrY++)
         {
             RowInfo* pThisRowInfo = &pRowInfo[nArrY];
-            nSignedY = nArrY ? pThisRowInfo->nRowNo : ((SCsROW)nY1)-1;
+            nSignedY = nArrY ? pThisRowInfo->nRowNo : ((SCsROW)nRow1)-1;
 
-            for (nArrX=nX1; nArrX<=nX2+2; nArrX++)                  // links und rechts einer mehr
+            for (nArrX=nCol1; nArrX<=nCol2+2; nArrX++)                  // links und rechts einer mehr
             {
                 SCsCOL nSignedX = ((SCsCOL) nArrX) - 1;
                 CellInfo* pInfo = &pThisRowInfo->pCellInfo[nArrX];
@@ -751,7 +752,7 @@ void ScDocument::FillInfo( ScTableInfo& rTabInfo, SCCOL nX1, SCROW nY1, SCCOL nX
                     SCsROW nStartY;
                     SCsCOL nEndX;
                     SCsROW nEndY;
-                    lcl_GetMergeRange( nSignedX,nSignedY, nArrY, this,pRowInfo, nX1,nY1,nX2,nY2,nTab,
+                    lcl_GetMergeRange( nSignedX,nSignedY, nArrY, this,pRowInfo, nCol1,nRow1,nCol2,nRow2,nTab,
                                         nStartX,nStartY, nEndX,nEndY );
                     const ScPatternAttr* pStartPattern = GetPattern( nStartX,nStartY,nTab );
                     const SfxItemSet* pStartCond = GetCondResult( nStartX,nStartY,nTab );
@@ -803,10 +804,10 @@ void ScDocument::FillInfo( ScTableInfo& rTabInfo, SCCOL nX1, SCROW nY1, SCCOL nX
             bool bTop = ( nArrY == 0 );
             bool bBottom = ( nArrY+1 == nArrCount );
 
-            for (nArrX=nX1; nArrX<=nX2+2; nArrX++)                  // links und rechts einer mehr
+            for (nArrX=nCol1; nArrX<=nCol2+2; nArrX++)                  // links und rechts einer mehr
             {
-                bool bLeft = ( nArrX == nX1 );
-                bool bRight = ( nArrX == nX2+2 );
+                bool bLeft = ( nArrX == nCol1 );
+                bool bRight = ( nArrX == nCol2+2 );
 
                 CellInfo* pInfo = &pRowInfo[nArrY].pCellInfo[nArrX];
                 const SvxShadowItem* pThisAttr = pInfo->pShadowAttr;
@@ -818,9 +819,9 @@ void ScDocument::FillInfo( ScTableInfo& rTabInfo, SCCOL nX1, SCROW nY1, SCCOL nX
                     SCsCOL nDxPos = 1;
                     SCsCOL nDxNeg = -1;
 
-                    while ( nArrX+nDxPos < nX2+2 && pRowInfo[0].pCellInfo[nArrX+nDxPos].nWidth == 0 )
+                    while ( nArrX+nDxPos < nCol2+2 && pRowInfo[0].pCellInfo[nArrX+nDxPos].nWidth == 0 )
                         ++nDxPos;
-                    while ( nArrX+nDxNeg > nX1 && pRowInfo[0].pCellInfo[nArrX+nDxNeg].nWidth == 0 )
+                    while ( nArrX+nDxNeg > nCol1 && pRowInfo[0].pCellInfo[nArrX+nDxNeg].nWidth == 0 )
                         --nDxNeg;
 
                     bool bLeftDiff = !bLeft &&
@@ -946,7 +947,7 @@ void ScDocument::FillInfo( ScTableInfo& rTabInfo, SCCOL nX1, SCROW nY1, SCCOL nX
     // RowInfo structs are filled in the range [ 0 , nArrCount-1 ]
     // each RowInfo contains CellInfo structs in the range [ nX1-1 , nX2+1 ]
 
-    size_t nColCount = nX2 - nX1 + 3;
+    size_t nColCount = nCol2 - nCol1 + 3;
     size_t nRowCount = nArrCount;
 
     svx::frame::Array& rArray = rTabInfo.maArray;
@@ -960,7 +961,7 @@ void ScDocument::FillInfo( ScTableInfo& rTabInfo, SCCOL nX1, SCROW nY1, SCCOL nX
 
         for( size_t nCol = 0; nCol < nColCount; ++nCol )
         {
-            sal_uInt16 nCellInfoX = static_cast< sal_uInt16 >( nCol + nX1 );
+            sal_uInt16 nCellInfoX = static_cast< sal_uInt16 >( nCol + nCol1 );
             const CellInfo& rInfo = rThisRowInfo.pCellInfo[ nCellInfoX ];
 
             const SvxBoxItem* pBox = rInfo.pLinesAttr;
@@ -986,13 +987,13 @@ void ScDocument::FillInfo( ScTableInfo& rTabInfo, SCCOL nX1, SCROW nY1, SCCOL nX
 
                 // current column and row in document coordinates
                 SCCOL nCurrDocCol = static_cast< SCCOL >( nCellInfoX - 1 );
-                SCROW nCurrDocRow = static_cast< SCROW >( (nCellInfoY > 0) ? rThisRowInfo.nRowNo : (nY1 - 1) );
+                SCROW nCurrDocRow = static_cast< SCROW >( (nCellInfoY > 0) ? rThisRowInfo.nRowNo : (nRow1 - 1) );
 
                 // find entire merged range in document, returns signed document coordinates
                 SCsCOL nFirstRealDocColS, nLastRealDocColS;
                 SCsROW nFirstRealDocRowS, nLastRealDocRowS;
                 lcl_GetMergeRange( static_cast< SCsCOL >( nCurrDocCol ), static_cast< SCsROW >( nCurrDocRow ),
-                    nCellInfoY, this, pRowInfo, nX1,nY1,nX2,nY2,nTab,
+                    nCellInfoY, this, pRowInfo, nCol1,nRow1,nCol2,nRow2,nTab,
                     nFirstRealDocColS, nFirstRealDocRowS, nLastRealDocColS, nLastRealDocRowS );
 
                 // *complete* merged range in document coordinates
@@ -1002,21 +1003,21 @@ void ScDocument::FillInfo( ScTableInfo& rTabInfo, SCCOL nX1, SCROW nY1, SCCOL nX
                 SCROW nLastRealDocRow  = static_cast< SCROW >( nLastRealDocRowS );
 
                 // first visible column (nX1-1 is first processed document column)
-                SCCOL nFirstDocCol = (nX1 > 0) ? ::std::max< SCCOL >( nFirstRealDocCol, nX1 - 1 ) : nFirstRealDocCol;
+                SCCOL nFirstDocCol = (nCol1 > 0) ? ::std::max< SCCOL >( nFirstRealDocCol, nCol1 - 1 ) : nFirstRealDocCol;
                 sal_uInt16 nFirstCellInfoX = static_cast< sal_uInt16 >( nFirstDocCol + 1 );
-                nFirstCol = static_cast< size_t >( nFirstCellInfoX - nX1 );
+                nFirstCol = static_cast< size_t >( nFirstCellInfoX - nCol1 );
 
                 // last visible column (nX2+1 is last processed document column)
-                SCCOL nLastDocCol = (nX2 < MAXCOL) ? ::std::min< SCCOL >( nLastRealDocCol, nX2 + 1 ) : nLastRealDocCol;
+                SCCOL nLastDocCol = (nCol2 < MAXCOL) ? ::std::min< SCCOL >( nLastRealDocCol, nCol2 + 1 ) : nLastRealDocCol;
                 sal_uInt16 nLastCellInfoX = static_cast< sal_uInt16 >( nLastDocCol + 1 );
-                size_t nLastCol = static_cast< size_t >( nLastCellInfoX - nX1 );
+                size_t nLastCol = static_cast< size_t >( nLastCellInfoX - nCol1 );
 
                 // first visible row
                 sal_uInt16 nFirstCellInfoY = nCellInfoY;
                 while( ((nFirstCellInfoY > 1) && (pRowInfo[ nFirstCellInfoY - 1 ].nRowNo >= nFirstRealDocRow)) ||
-                       ((nFirstCellInfoY == 1) && (static_cast< SCROW >( nY1 - 1 ) >= nFirstRealDocRow)) )
+                       ((nFirstCellInfoY == 1) && (static_cast< SCROW >( nRow1 - 1 ) >= nFirstRealDocRow)) )
                     --nFirstCellInfoY;
-                SCROW nFirstDocRow = (nFirstCellInfoY > 0) ? pRowInfo[ nFirstCellInfoY ].nRowNo : static_cast< SCROW >( nY1 - 1 );
+                SCROW nFirstDocRow = (nFirstCellInfoY > 0) ? pRowInfo[ nFirstCellInfoY ].nRowNo : static_cast< SCROW >( nRow1 - 1 );
                 nFirstRow = static_cast< size_t >( nFirstCellInfoY );
 
                 // last visible row
@@ -1024,7 +1025,7 @@ void ScDocument::FillInfo( ScTableInfo& rTabInfo, SCCOL nX1, SCROW nY1, SCCOL nX
                 while( (sal::static_int_cast<SCSIZE>(nLastCellInfoY + 1) < nArrCount) &&
                             (pRowInfo[ nLastCellInfoY + 1 ].nRowNo <= nLastRealDocRow) )
                     ++nLastCellInfoY;
-                SCROW nLastDocRow = (nLastCellInfoY > 0) ? pRowInfo[ nLastCellInfoY ].nRowNo : static_cast< SCROW >( nY1 - 1 );
+                SCROW nLastDocRow = (nLastCellInfoY > 0) ? pRowInfo[ nLastCellInfoY ].nRowNo : static_cast< SCROW >( nRow1 - 1 );
                 size_t nLastRow = static_cast< size_t >( nLastCellInfoY );
 
                 // insert merged range
@@ -1037,7 +1038,7 @@ void ScDocument::FillInfo( ScTableInfo& rTabInfo, SCCOL nX1, SCROW nY1, SCCOL nX
                 {
                     long nSize = 0;
                     for( SCCOL nDocCol = nFirstRealDocCol; nDocCol < nFirstDocCol; ++nDocCol )
-                        nSize += std::max( static_cast< long >( GetColWidth( nDocCol, nTab ) * nScaleX ), 1L );
+                        nSize += std::max( static_cast< long >( GetColWidth( nDocCol, nTab ) * fColScale ), 1L );
                     rArray.SetAddMergedLeftSize( nCol, nRow, nSize );
                 }
                 // additional space after last column
@@ -1045,7 +1046,7 @@ void ScDocument::FillInfo( ScTableInfo& rTabInfo, SCCOL nX1, SCROW nY1, SCCOL nX
                 {
                     long nSize = 0;
                     for( SCCOL nDocCol = nLastDocCol + 1; nDocCol <= nLastRealDocCol; ++nDocCol )
-                        nSize += std::max( static_cast< long >( GetColWidth( nDocCol, nTab ) * nScaleX ), 1L );
+                        nSize += std::max( static_cast< long >( GetColWidth( nDocCol, nTab ) * fColScale ), 1L );
                     rArray.SetAddMergedRightSize( nCol, nRow, nSize );
                 }
                 // additional space above first row
@@ -1053,7 +1054,7 @@ void ScDocument::FillInfo( ScTableInfo& rTabInfo, SCCOL nX1, SCROW nY1, SCCOL nX
                 {
                     long nSize = 0;
                     for( SCROW nDocRow = nFirstRealDocRow; nDocRow < nFirstDocRow; ++nDocRow )
-                        nSize += std::max( static_cast< long >( GetRowHeight( nDocRow, nTab ) * nScaleY ), 1L );
+                        nSize += std::max( static_cast< long >( GetRowHeight( nDocRow, nTab ) * fRowScale ), 1L );
                     rArray.SetAddMergedTopSize( nCol, nRow, nSize );
                 }
                 // additional space beyond last row
@@ -1061,7 +1062,7 @@ void ScDocument::FillInfo( ScTableInfo& rTabInfo, SCCOL nX1, SCROW nY1, SCCOL nX
                 {
                     long nSize = 0;
                     for( SCROW nDocRow = nLastDocRow + 1; nDocRow <= nLastRealDocRow; ++nDocRow )
-                        nSize += std::max( static_cast< long >( GetRowHeight( nDocRow, nTab ) * nScaleY ), 1L );
+                        nSize += std::max( static_cast< long >( GetRowHeight( nDocRow, nTab ) * fRowScale ), 1L );
                     rArray.SetAddMergedBottomSize( nCol, nRow, nSize );
                 }
 
@@ -1088,16 +1089,16 @@ void ScDocument::FillInfo( ScTableInfo& rTabInfo, SCCOL nX1, SCROW nY1, SCCOL nX
 
             if( pBox )
             {
-                rArray.SetCellStyleLeft(   nFirstCol, nFirstRow, svx::frame::Style( pBox->GetLeft(),   nScaleX ) );
-                rArray.SetCellStyleRight(  nFirstCol, nFirstRow, svx::frame::Style( pBox->GetRight(),  nScaleX ) );
-                rArray.SetCellStyleTop(    nFirstCol, nFirstRow, svx::frame::Style( pBox->GetTop(),    nScaleY ) );
-                rArray.SetCellStyleBottom( nFirstCol, nFirstRow, svx::frame::Style( pBox->GetBottom(), nScaleY ) );
+                rArray.SetCellStyleLeft(   nFirstCol, nFirstRow, svx::frame::Style( pBox->GetLeft(),   fColScale ) );
+                rArray.SetCellStyleRight(  nFirstCol, nFirstRow, svx::frame::Style( pBox->GetRight(),  fColScale ) );
+                rArray.SetCellStyleTop(    nFirstCol, nFirstRow, svx::frame::Style( pBox->GetTop(),    fRowScale ) );
+                rArray.SetCellStyleBottom( nFirstCol, nFirstRow, svx::frame::Style( pBox->GetBottom(), fRowScale ) );
             }
 
             if( pTLBR )
-                rArray.SetCellStyleTLBR( nFirstCol, nFirstRow, svx::frame::Style( pTLBR->GetLine(), nScaleY ) );
+                rArray.SetCellStyleTLBR( nFirstCol, nFirstRow, svx::frame::Style( pTLBR->GetLine(), fRowScale ) );
             if( rInfo.mpBLTRLine )
-                rArray.SetCellStyleBLTR( nFirstCol, nFirstRow, svx::frame::Style( pBLTR->GetLine(), nScaleY ) );
+                rArray.SetCellStyleBLTR( nFirstCol, nFirstRow, svx::frame::Style( pBLTR->GetLine(), fRowScale ) );
         }
     }
 
commit 03c8661e8dcf0a0a8ae98fac19efc9c779130e38
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date:   Fri Jun 21 14:23:06 2013 -0400

    Incorrect way to initialize a multi_type_vector.
    
    Change-Id: I5db7923be8444db8a0cb1a6766f967d731776535

diff --git a/sc/source/core/data/column3.cxx b/sc/source/core/data/column3.cxx
index 10717e2..d1d5e38 100644
--- a/sc/source/core/data/column3.cxx
+++ b/sc/source/core/data/column3.cxx
@@ -1034,7 +1034,7 @@ public:
         mrDestColumn(rDestColumn),
         mrDestCells(rDestCells),
         mrDestAttrs(rDestAttrs),
-        maNewCells(0, nRow2 - nRow1 + 1),
+        maNewCells(nRow2 - nRow1 + 1),
         miNewCellsPos(maNewCells.begin()),
         mnRowOffset(nRow1),
         mnFunction(nFunction),
commit 0c7369777890971a690d2fe2be805d9631eb22f6
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date:   Fri Jun 21 13:47:18 2013 -0400

    Don't allow outside code to set text attributes.
    
    Also, use position() to update the value, to avoid performing position
    lookups twice (once for getting the current value, and once for setting
    the updated one).
    
    Change-Id: Iaa1575a4938b996266c01c8b3170e6a65b871961

diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx
index 5949152..7a64846 100644
--- a/sc/inc/document.hxx
+++ b/sc/inc/document.hxx
@@ -1954,7 +1954,6 @@ public:
     void SetSubTotalCellsDirty(const ScRange& rDirtyRange);
 
     sal_uInt16 GetTextWidth( const ScAddress& rPos ) const;
-    void SetTextWidth( const ScAddress& rPos, sal_uInt16 nWidth );
 
     sal_uInt8 GetScriptType( const ScAddress& rPos ) const;
     void SetScriptType( const ScAddress& rPos, sal_uInt8 nType );
diff --git a/sc/inc/table.hxx b/sc/inc/table.hxx
index c5c0286..65cb180 100644
--- a/sc/inc/table.hxx
+++ b/sc/inc/table.hxx
@@ -220,7 +220,6 @@ public:
     sal_uLong       GetCodeCount() const;       // RPN code in formula
 
     sal_uInt16 GetTextWidth(SCCOL nCol, SCROW nRow) const;
-    void SetTextWidth(SCCOL nCol, SCROW nRow, sal_uInt16 nWidth);
 
     bool        SetOutlineTable( const ScOutlineTable* pNewOutline );
     void        StartOutlineTable();
diff --git a/sc/source/core/data/column2.cxx b/sc/source/core/data/column2.cxx
index 019930d..b38756f 100644
--- a/sc/source/core/data/column2.cxx
+++ b/sc/source/core/data/column2.cxx
@@ -1713,9 +1713,12 @@ sal_uInt16 ScColumn::GetTextWidth(SCROW nRow) const
 
 void ScColumn::SetTextWidth(SCROW nRow, sal_uInt16 nWidth)
 {
-    sc::CellTextAttr aVal = maCellTextAttrs.get<sc::CellTextAttr>(nRow);
-    aVal.mnTextWidth = nWidth;
-    maCellTextAttrs.set(nRow, aVal);
+    sc::CellTextAttrStoreType::position_type aPos = maCellTextAttrs.position(nRow);
+    if (aPos.first->type != sc::element_type_celltextattr)
+        return;
+
+    // Set new value only when the slot is not empty.
+    sc::celltextattr_block::at(*aPos.first->data, aPos.second).mnTextWidth = nWidth;
     CellStorageModified();
 }
 
@@ -1802,23 +1805,13 @@ void ScColumn::SetScriptType( SCROW nRow, sal_uInt8 nType )
     if (!ValidRow(nRow))
         return;
 
-    if (!nType)
-    {
-        if (maCellTextAttrs.is_empty(nRow))
-            return;
+    sc::CellTextAttrStoreType::position_type aPos = maCellTextAttrs.position(nRow);
+    if (aPos.first->type != sc::element_type_celltextattr)
+        // Set new value only when the slot is already set.
+        return;
 
-        sc::CellTextAttr aVal = maCellTextAttrs.get<sc::CellTextAttr>(nRow);
-        aVal.mnScriptType = nType;
-        maCellTextAttrs.set(nRow, aVal);
-        CellStorageModified();
-    }
-    else
-    {
-        sc::CellTextAttr aVal = maCellTextAttrs.get<sc::CellTextAttr>(nRow);
-        aVal.mnScriptType = nType;
-        maCellTextAttrs.set(nRow, aVal);
-        CellStorageModified();
-    }
+    sc::celltextattr_block::at(*aPos.first->data, aPos.second).mnScriptType = nType;
+    CellStorageModified();
 }
 
 size_t ScColumn::GetFormulaHash( SCROW nRow ) const
diff --git a/sc/source/core/data/document.cxx b/sc/source/core/data/document.cxx
index 9b24af8..57d95a3 100644
--- a/sc/source/core/data/document.cxx
+++ b/sc/source/core/data/document.cxx
@@ -5915,13 +5915,6 @@ sal_uInt16 ScDocument::GetTextWidth( const ScAddress& rPos ) const
     return 0;
 }
 
-void ScDocument::SetTextWidth( const ScAddress& rPos, sal_uInt16 nWidth )
-{
-    SCTAB nTab = rPos.Tab();
-    if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab])
-        maTabs[nTab]->SetTextWidth(rPos.Col(), rPos.Row(), nWidth);
-}
-
 sal_uInt8 ScDocument::GetScriptType( const ScAddress& rPos ) const
 {
     SCTAB nTab = rPos.Tab();
diff --git a/sc/source/core/data/table2.cxx b/sc/source/core/data/table2.cxx
index 51e8e12..aa315dc 100644
--- a/sc/source/core/data/table2.cxx
+++ b/sc/source/core/data/table2.cxx
@@ -64,11 +64,6 @@ sal_uInt16 ScTable::GetTextWidth(SCCOL nCol, SCROW nRow) const
     return aCol[nCol].GetTextWidth(nRow);
 }
 
-void ScTable::SetTextWidth(SCCOL nCol, SCROW nRow, sal_uInt16 nWidth)
-{
-    aCol[nCol].SetTextWidth(nRow, nWidth);
-}
-
 bool ScTable::SetOutlineTable( const ScOutlineTable* pNewOutline )
 {
     sal_uInt16 nOldSizeX = 0;
commit 3299062ecee39226e0ff3e189fa8d8a29bc56a14
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date:   Fri Jun 21 11:54:18 2013 -0400

    Avoid having formula cell directly update text attributes.
    
    This would cause column cell and text attribute arrays to go out of
    sync, because the formula cells may be stored and interpreted in places
    such as change track and conditional formatting.
    
    We still need to find a good way to mark text attributes "obsolete" when
    formula cells are re-calculated.
    
    Change-Id: Ida612806d3afec23c5ae501f2fc8cc7d52e019a8

diff --git a/sc/source/core/data/formulacell.cxx b/sc/source/core/data/formulacell.cxx
index 845fa33..3ce95d4 100644
--- a/sc/source/core/data/formulacell.cxx
+++ b/sc/source/core/data/formulacell.cxx
@@ -728,11 +728,8 @@ void ScFormulaCell::Compile( const OUString& rFormula, bool bNoListening,
         CompileTokenArray( bNoListening );
     }
     else
-    {
         bChanged = true;
-        pDocument->SetTextWidth(aPos, TEXTWIDTH_DIRTY);
-        pDocument->SetScriptType(aPos, SC_SCRIPTTYPE_UNKNOWN);
-    }
+
     if ( bWasInFormulaTree )
         pDocument->PutInFormulaTree( this );
 }
@@ -822,11 +819,7 @@ void ScFormulaCell::CompileXML( ScProgress& rProgress )
             pDocument->AddSubTotalCell(this);
     }
     else
-    {
         bChanged = true;
-        pDocument->SetTextWidth(aPos, TEXTWIDTH_DIRTY);
-        pDocument->SetScriptType(aPos, SC_SCRIPTTYPE_UNKNOWN);
-    }
 
     //  Same as in Load: after loading, it must be known if ocMacro is in any formula
     //  (for macro warning, CompileXML is called at the end of loading XML file)
@@ -1096,8 +1089,6 @@ void ScFormulaCell::Interpret()
                             pIterCell->bTableOpDirty = false;
                             pIterCell->aResult.SetResultError( errNoConvergence);
                             pIterCell->bChanged = true;
-                            pDocument->SetTextWidth(pIterCell->aPos, TEXTWIDTH_DIRTY);
-                            pDocument->SetScriptType(pIterCell->aPos, SC_SCRIPTTYPE_UNKNOWN);
                         }
                     }
                     // End this iteration and remove entries.
@@ -1389,11 +1380,7 @@ void ScFormulaCell::InterpretTail( ScInterpretTailParameter eTailParam )
             aResult.SetResultError( nErr);
             bChanged = bContentChanged = true;
         }
-        if( bChanged )
-        {
-            pDocument->SetTextWidth(aPos, TEXTWIDTH_DIRTY);
-            pDocument->SetScriptType(aPos, SC_SCRIPTTYPE_UNKNOWN);
-        }
+
         if (bContentChanged && pDocument->IsStreamValid(aPos.Tab()))
         {
             // pass bIgnoreLock=true, because even if called from pending row height update,
commit bf7fb19b3472aaadff7799d4f275e7f6ad72c7c6
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date:   Fri Jun 21 10:57:35 2013 -0400

    Add more calls to CellStorageModified() when it's called for.
    
    Change-Id: Ib7a7abd82060b19f7911f1fef5ccccff5d850055

diff --git a/sc/inc/column.hxx b/sc/inc/column.hxx
index e287a5b..e7c58c1 100644
--- a/sc/inc/column.hxx
+++ b/sc/inc/column.hxx
@@ -464,7 +464,7 @@ private:
     sc::CellStoreType::iterator GetPositionToInsert( const sc::CellStoreType::iterator& it, SCROW nRow );
     void ActivateNewFormulaCell( ScFormulaCell* pCell );
     void BroadcastNewCell( SCROW nRow );
-    void UpdateScriptType( sc::CellTextAttr& rAttr, SCROW nRow );
+    bool UpdateScriptType( sc::CellTextAttr& rAttr, SCROW nRow );
 
     const ScFormulaCell* FetchFormulaCell( SCROW nRow ) const;
 
@@ -476,7 +476,7 @@ private:
      * Called whenever the state of cell array gets modified i.e. new cell
      * insertion, cell removal or relocation, cell value update and so on.
      *
-     * Call this only from those methods where maItems is modified directly.
+     * Call this only from those methods where maCells is modified directly.
      */
     void CellStorageModified();
 
diff --git a/sc/qa/extras/testdocuments/Ranges-3.xls b/sc/qa/extras/testdocuments/Ranges-3.xls
index c23b70a..5151fa7 100644
Binary files a/sc/qa/extras/testdocuments/Ranges-3.xls and b/sc/qa/extras/testdocuments/Ranges-3.xls differ
diff --git a/sc/source/core/data/column.cxx b/sc/source/core/data/column.cxx
index 66166be..bd1eeae 100644
--- a/sc/source/core/data/column.cxx
+++ b/sc/source/core/data/column.cxx
@@ -1369,6 +1369,8 @@ void ScColumn::CopyStaticToDocument(SCROW nRow1, SCROW nRow2, ScColumn& rDestCol
         if (bLastBlock)
             break;
     }
+
+    rDestCol.CellStorageModified();
 }
 
 void ScColumn::CopyCellToDocument( SCROW nSrcRow, SCROW nDestRow, ScColumn& rDestCol )
@@ -1416,6 +1418,8 @@ void ScColumn::CopyCellToDocument( SCROW nSrcRow, SCROW nDestRow, ScColumn& rDes
         rDestCol.maCellTextAttrs.set(nDestRow, maCellTextAttrs.get<sc::CellTextAttr>(nSrcRow));
     else
         rDestCol.maCellTextAttrs.set_empty(nDestRow, nDestRow);
+
+    rDestCol.CellStorageModified();
 }
 
 namespace {
@@ -1918,9 +1922,6 @@ void ScColumn::SwapCol(ScColumn& rCol)
     maCells.swap(rCol.maCells);
     maCellTextAttrs.swap(rCol.maCellTextAttrs);
 
-    CellStorageModified();
-    rCol.CellStorageModified();
-
     ScAttrArray* pTempAttr = rCol.pAttrArray;
     rCol.pAttrArray = pAttrArray;
     pAttrArray = pTempAttr;
@@ -1934,6 +1935,10 @@ void ScColumn::SwapCol(ScColumn& rCol)
     // Reset column positions in formula cells.
     resetColumnPosition(maCells, nCol);
     resetColumnPosition(rCol.maCells, rCol.nCol);
+
+    CellStorageModified();
+    rCol.CellStorageModified();
+
 }
 
 void ScColumn::MoveTo(SCROW nStartRow, SCROW nEndRow, ScColumn& rCol)
@@ -2107,17 +2112,21 @@ class InsertTabUpdater
     SCTAB mnTab;
     SCTAB mnInsPos;
     SCTAB mnNewSheets;
+    bool mbModified;
+
 public:
     InsertTabUpdater(sc::CellTextAttrStoreType& rTextAttrs, SCTAB nTab, SCTAB nInsPos, SCTAB nNewSheets) :
         mrTextAttrs(rTextAttrs),
         miAttrPos(rTextAttrs.begin()),
         mnTab(nTab),
         mnInsPos(nInsPos),
-        mnNewSheets(nNewSheets) {}
+        mnNewSheets(nNewSheets),
+        mbModified(false) {}
 
     void operator() (size_t /*nRow*/, ScFormulaCell* pCell)
     {
         pCell->UpdateInsertTab(mnInsPos, mnNewSheets);
+        mbModified = true;
     }
 
     void operator() (size_t nRow, EditTextObject* pCell)
@@ -2125,7 +2134,10 @@ public:
         editeng::FieldUpdater aUpdater = pCell->GetFieldUpdater();
         aUpdater.updateTableFields(mnTab);
         miAttrPos = mrTextAttrs.set(miAttrPos, nRow, sc::CellTextAttr());
+        mbModified = true;
     }
+
+    bool isModified() const { return mbModified; }
 };
 
 class DeleteTabUpdater
@@ -2136,6 +2148,7 @@ class DeleteTabUpdater
     SCTAB mnSheets;
     SCTAB mnTab;
     bool mbIsMove;
+    bool mbModified;
 public:
     DeleteTabUpdater(sc::CellTextAttrStoreType& rTextAttrs, SCTAB nDelPos, SCTAB nSheets, SCTAB nTab, bool bIsMove) :
         mrTextAttrs(rTextAttrs),
@@ -2143,11 +2156,13 @@ public:
         mnDelPos(nDelPos),
         mnSheets(nSheets),
         mnTab(nTab),
-        mbIsMove(bIsMove) {}
+        mbIsMove(bIsMove),
+        mbModified(false) {}
 
     void operator() (size_t, ScFormulaCell* pCell)
     {
         pCell->UpdateDeleteTab(mnDelPos, mbIsMove, mnSheets);
+        mbModified = true;
     }
 
     void operator() (size_t nRow, EditTextObject* pCell)
@@ -2155,7 +2170,10 @@ public:
         editeng::FieldUpdater aUpdater = pCell->GetFieldUpdater();
         aUpdater.updateTableFields(mnTab);
         miAttrPos = mrTextAttrs.set(miAttrPos, nRow, sc::CellTextAttr());
+        mbModified = true;
     }
+
+    bool isModified() const { return mbModified; }
 };
 
 class InsertAbsTabUpdater
@@ -2164,16 +2182,19 @@ class InsertAbsTabUpdater
     sc::CellTextAttrStoreType::iterator miAttrPos;
     SCTAB mnTab;
     SCTAB mnNewPos;
+    bool mbModified;
 public:
     InsertAbsTabUpdater(sc::CellTextAttrStoreType& rTextAttrs, SCTAB nTab, SCTAB nNewPos) :
         mrTextAttrs(rTextAttrs),
         miAttrPos(rTextAttrs.begin()),
         mnTab(nTab),
-        mnNewPos(nNewPos) {}
+        mnNewPos(nNewPos),
+        mbModified(false) {}
 
     void operator() (size_t /*nRow*/, ScFormulaCell* pCell)
     {
         pCell->UpdateInsertTabAbs(mnNewPos);
+        mbModified = true;
     }
 
     void operator() (size_t nRow, EditTextObject* pCell)
@@ -2181,7 +2202,10 @@ public:
         editeng::FieldUpdater aUpdater = pCell->GetFieldUpdater();
         aUpdater.updateTableFields(mnTab);
         miAttrPos = mrTextAttrs.set(miAttrPos, nRow, sc::CellTextAttr());
+        mbModified = true;
     }
+
+    bool isModified() const { return mbModified; }
 };
 
 class MoveTabUpdater
@@ -2191,17 +2215,20 @@ class MoveTabUpdater
     SCTAB mnTab;
     SCTAB mnOldPos;
     SCTAB mnNewPos;
+    bool mbModified;
 public:
     MoveTabUpdater(sc::CellTextAttrStoreType& rTextAttrs, SCTAB nTab, SCTAB nOldPos, SCTAB nNewPos) :
         mrTextAttrs(rTextAttrs),
         miAttrPos(rTextAttrs.begin()),
         mnTab(nTab),
         mnOldPos(nOldPos),
-        mnNewPos(nNewPos) {}
+        mnNewPos(nNewPos),
+        mbModified(false) {}
 
     void operator() (size_t /*nRow*/, ScFormulaCell* pCell)
     {
         pCell->UpdateMoveTab(mnOldPos, mnNewPos, mnTab);
+        mbModified = true;
     }
 
     void operator() (size_t nRow, EditTextObject* pCell)
@@ -2209,14 +2236,18 @@ public:
         editeng::FieldUpdater aUpdater = pCell->GetFieldUpdater();
         aUpdater.updateTableFields(mnTab);
         miAttrPos = mrTextAttrs.set(miAttrPos, nRow, sc::CellTextAttr());
+        mbModified = true;
     }
+
+    bool isModified() const { return mbModified; }
 };
 
 class UpdateCompileHandler
 {
-    bool mbForceIfNameInUse;
+    bool mbForceIfNameInUse:1;
 public:
-    UpdateCompileHandler(bool bForceIfNameInUse) : mbForceIfNameInUse(bForceIfNameInUse) {}
+    UpdateCompileHandler(bool bForceIfNameInUse) :
+        mbForceIfNameInUse(bForceIfNameInUse) {}
 
     void operator() (size_t /*nRow*/, ScFormulaCell* pCell)
     {
@@ -2541,6 +2572,8 @@ void ScColumn::UpdateInsertTabOnlyCells(SCTAB nInsPos, SCTAB nNewSheets)
 {
     InsertTabUpdater aFunc(maCellTextAttrs, nTab, nInsPos, nNewSheets);
     sc::ProcessFormulaEditText(maCells, aFunc);
+    if (aFunc.isModified())
+        CellStorageModified();
 }
 
 void ScColumn::UpdateDeleteTab(SCTAB nDelPos, bool bIsMove, ScColumn* /*pRefUndo*/, SCTAB nSheets)
@@ -2553,12 +2586,16 @@ void ScColumn::UpdateDeleteTab(SCTAB nDelPos, bool bIsMove, ScColumn* /*pRefUndo
 
     DeleteTabUpdater aFunc(maCellTextAttrs, nDelPos, nSheets, nTab, bIsMove);
     sc::ProcessFormulaEditText(maCells, aFunc);
+    if (aFunc.isModified())
+        CellStorageModified();
 }
 
 void ScColumn::UpdateInsertTabAbs(SCTAB nNewPos)
 {
     InsertAbsTabUpdater aFunc(maCellTextAttrs, nTab, nNewPos);
     sc::ProcessFormulaEditText(maCells, aFunc);
+    if (aFunc.isModified())
+        CellStorageModified();
 }
 
 void ScColumn::UpdateMoveTab( SCTAB nOldPos, SCTAB nNewPos, SCTAB nTabNo )
@@ -2568,6 +2605,8 @@ void ScColumn::UpdateMoveTab( SCTAB nOldPos, SCTAB nNewPos, SCTAB nTabNo )
 
     MoveTabUpdater aFunc(maCellTextAttrs, nTab, nOldPos, nNewPos);
     sc::ProcessFormulaEditText(maCells, aFunc);
+    if (aFunc.isModified())
+        CellStorageModified();
 }
 
 
diff --git a/sc/source/core/data/column2.cxx b/sc/source/core/data/column2.cxx
index 8b296ae..019930d 100644
--- a/sc/source/core/data/column2.cxx
+++ b/sc/source/core/data/column2.cxx
@@ -1624,6 +1624,7 @@ void ScColumn::ResetCellTextAttrs()
     CellTextAttrInitializer aFunc;
     std::for_each(maCells.begin(), maCells.end(), aFunc);
     aFunc.swap(maCellTextAttrs);
+    CellStorageModified();
 }
 
 void ScColumn::SwapCellTextAttrs( SCROW nRow1, SCROW nRow2 )
@@ -1673,6 +1674,8 @@ void ScColumn::SwapCellTextAttrs( SCROW nRow1, SCROW nRow2 )
     sc::CellTextAttr aVal1 = sc::celltextattr_block::at(*it1->data, aPos1.second); // make a copy.
     it1 = maCellTextAttrs.set_empty(it1, nRow1, nRow1);
     maCellTextAttrs.set(it1, nRow2, aVal1);
+
+    CellStorageModified();
 }
 
 SvtBroadcaster* ScColumn::GetBroadcaster(SCROW nRow)
@@ -1713,6 +1716,7 @@ void ScColumn::SetTextWidth(SCROW nRow, sal_uInt16 nWidth)
     sc::CellTextAttr aVal = maCellTextAttrs.get<sc::CellTextAttr>(nRow);
     aVal.mnTextWidth = nWidth;
     maCellTextAttrs.set(nRow, aVal);
+    CellStorageModified();
 }
 
 sal_uInt8 ScColumn::GetScriptType( SCROW nRow ) const
@@ -1736,7 +1740,7 @@ sal_uInt8 ScColumn::GetRangeScriptType(
     itPos = aRet.first; // Track the position of cell text attribute array.
 
     sal_uInt8 nScriptType = 0;
-
+    bool bUpdated = false;
     if (itPos->type == sc::element_type_celltextattr)
     {
         sc::celltextattr_block::iterator it = sc::celltextattr_block::begin(*itPos->data);
@@ -1748,7 +1752,8 @@ sal_uInt8 ScColumn::GetRangeScriptType(
                 return nScriptType;
 
             sc::CellTextAttr& rVal = *it;
-            UpdateScriptType(rVal, nRow);
+            if (UpdateScriptType(rVal, nRow))
+                bUpdated = true;
             nScriptType |= rVal.mnScriptType;
         }
     }
@@ -1779,11 +1784,16 @@ sal_uInt8 ScColumn::GetRangeScriptType(
                 return nScriptType;
 
             sc::CellTextAttr& rVal = *it;
-            UpdateScriptType(rVal, nRow);
+            if (UpdateScriptType(rVal, nRow))
+                bUpdated = true;
+
             nScriptType |= rVal.mnScriptType;
         }
     }
 
+    if (bUpdated)
+        CellStorageModified();
+
     return nScriptType;
 }
 
@@ -1800,12 +1810,14 @@ void ScColumn::SetScriptType( SCROW nRow, sal_uInt8 nType )
         sc::CellTextAttr aVal = maCellTextAttrs.get<sc::CellTextAttr>(nRow);
         aVal.mnScriptType = nType;
         maCellTextAttrs.set(nRow, aVal);
+        CellStorageModified();
     }
     else
     {
         sc::CellTextAttr aVal = maCellTextAttrs.get<sc::CellTextAttr>(nRow);
         aVal.mnScriptType = nType;
         maCellTextAttrs.set(nRow, aVal);
+        CellStorageModified();
     }
 }
 
diff --git a/sc/source/core/data/column3.cxx b/sc/source/core/data/column3.cxx
index d2eacdd..10717e2 100644
--- a/sc/source/core/data/column3.cxx
+++ b/sc/source/core/data/column3.cxx
@@ -455,17 +455,17 @@ void ScColumn::BroadcastNewCell( SCROW nRow )
     pDocument->Broadcast(aHint);
 }
 
-void ScColumn::UpdateScriptType( sc::CellTextAttr& rAttr, SCROW nRow )
+bool ScColumn::UpdateScriptType( sc::CellTextAttr& rAttr, SCROW nRow )
 {
     if (rAttr.mnScriptType != SC_SCRIPTTYPE_UNKNOWN)
         // Already updated. Nothing to do.
-        return;
+        return false;
 
     // Script type not yet determined. Determine the real script
     // type, and store it.
     const ScPatternAttr* pPattern = GetPattern(nRow);
     if (!pPattern)
-        return;
+        return false;
 
     ScRefCellValue aCell;
     ScAddress aPos(nCol, nRow, nTab);
@@ -490,6 +490,7 @@ void ScColumn::UpdateScriptType( sc::CellTextAttr& rAttr, SCROW nRow )
 
     // Store the real script type to the array.
     rAttr.mnScriptType = pDocument->GetStringScriptType(aStr);
+    return true;
 }
 
 namespace {
@@ -1346,6 +1347,7 @@ void ScColumn::MixData(
     sc::ParseAll(rSrcCol.maCells.begin(), rSrcCol.maCells, nRow1, nRow2, aFunc, aFunc);
 
     aFunc.commit(p);
+    CellStorageModified();
 }
 
 
commit b32221fac8ea24e3f7f17c7588f99054cd278643
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date:   Fri Jun 21 09:36:50 2013 -0400

    Remove unused method.
    
    Change-Id: Id49307f8b7050e1f95cd589421f01a85b4e992b2

diff --git a/sc/inc/column.hxx b/sc/inc/column.hxx
index c0b9c35..e287a5b 100644
--- a/sc/inc/column.hxx
+++ b/sc/inc/column.hxx
@@ -489,12 +489,6 @@ private:
     void ResetCellTextAttrs();
 
     void SwapCellTextAttrs( SCROW nRow1, SCROW nRow2 );
-
-    /**
-     * Retrieve the cell value and set that slot empty. The ownership of that
-     * cell value moves to the returned cell value object.
-     */
-    void ReleaseCellValue( sc::CellStoreType::iterator& itPos, SCROW nRow, ScCellValue& rVal );
 };
 
 #endif
diff --git a/sc/source/core/data/column.cxx b/sc/source/core/data/column.cxx
index c7ee06b..66166be 100644
--- a/sc/source/core/data/column.cxx
+++ b/sc/source/core/data/column.cxx
@@ -806,42 +806,6 @@ ScRefCellValue ScColumn::GetCellValue( sc::CellStoreType::const_iterator& itPos,
     return aVal;
 }
 
-void ScColumn::ReleaseCellValue( sc::CellStoreType::iterator& itPos, SCROW nRow, ScCellValue& rVal )
-{
-    std::pair<sc::CellStoreType::iterator,size_t> aPos = maCells.position(itPos, nRow);
-    itPos = aPos.first; // Store it for the next iteration.
-    if (aPos.first == maCells.end())
-        return;
-
-    switch (itPos->type)
-    {
-        case sc::element_type_numeric:
-            // Numeric cell
-            itPos = maCells.release(itPos, nRow, rVal.mfValue);
-            rVal.meType = CELLTYPE_VALUE;
-        break;
-        case sc::element_type_string:
-        {
-            // Make a copy until we implement shared strings...
-            OUString aStr;
-            itPos = maCells.release(itPos, nRow, aStr);
-            rVal.mpString = new OUString(aStr);
-            rVal.meType = CELLTYPE_STRING;
-        }
-        break;
-        case sc::element_type_edittext:
-            itPos = maCells.release(itPos, nRow, rVal.mpEditText);
-            rVal.meType = CELLTYPE_EDIT;
-        break;
-        case sc::element_type_formula:
-            itPos = maCells.release(itPos, nRow, rVal.mpFormula);
-            rVal.meType = CELLTYPE_FORMULA;
-        break;
-        default:
-            ;
-    }
-}
-
 namespace {
 
 ScFormulaCell* cloneFormulaCell(ScDocument* pDoc, const ScAddress& rNewPos, ScFormulaCell& rOldCell)
commit 86cf4b81d3469f57469c43e8140fbdf613532c14
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date:   Thu Jun 20 23:58:46 2013 -0400

    Fix a bug in "find all" search, and a test to catch it in the future.
    
    Change-Id: I296d2dff65da55cc86e10a78eb9c768a924fcddd

diff --git a/sc/CppunitTest_sc_ucalc.mk b/sc/CppunitTest_sc_ucalc.mk
index 7ed41df..e88fd1f 100644
--- a/sc/CppunitTest_sc_ucalc.mk
+++ b/sc/CppunitTest_sc_ucalc.mk
@@ -82,6 +82,7 @@ $(eval $(call gb_CppunitTest_use_components,sc_ucalc,\
     fileaccess/source/fileacc \
     framework/util/fwk \
     i18npool/util/i18npool \
+    i18npool/source/search/i18nsearch \
     sax/source/expatwrap/expwrap \
     sfx2/util/sfx \
     ucb/source/core/ucb1 \
diff --git a/sc/qa/unit/ucalc.cxx b/sc/qa/unit/ucalc.cxx
index a21592f..2934a59 100644
--- a/sc/qa/unit/ucalc.cxx
+++ b/sc/qa/unit/ucalc.cxx
@@ -64,6 +64,7 @@
 #include <svx/svdpage.hxx>
 #include <svx/svdocirc.hxx>
 #include <svx/svdopath.hxx>
+#include "svl/srchitem.hxx"
 
 #include <sfx2/docfile.hxx>
 
@@ -224,6 +225,7 @@ public:
     void testCopyPaste();
     void testMergedCells();
     void testUpdateReference();
+    void testSearchCells();
 
     /**
      * Make sure the sheet streams are invalidated properly.
@@ -329,6 +331,7 @@ public:
     CPPUNIT_TEST(testCopyPaste);
     CPPUNIT_TEST(testMergedCells);
     CPPUNIT_TEST(testUpdateReference);
+    CPPUNIT_TEST(testSearchCells);
     CPPUNIT_TEST(testJumpToPrecedentsDependents);
     CPPUNIT_TEST(testSetBackgroundColor);
     CPPUNIT_TEST(testRenameTable);
@@ -6135,6 +6138,41 @@ void Test::testUpdateReference()
     m_pDoc->DeleteTab(0);
 }
 
+void Test::testSearchCells()
+{
+    m_pDoc->InsertTab(0, "Test");
+
+    m_pDoc->SetString(ScAddress(0,0,0), "A");
+    m_pDoc->SetString(ScAddress(0,1,0), "B");
+    m_pDoc->SetString(ScAddress(0,2,0), "A");
+    // Leave A4 blank.
+    m_pDoc->SetString(ScAddress(0,4,0), "A");
+    m_pDoc->SetString(ScAddress(0,5,0), "B");
+    m_pDoc->SetString(ScAddress(0,6,0), "C");
+
+    SvxSearchItem aItem(SID_SEARCH_ITEM);
+    aItem.SetSearchString(OUString("A"));
+    aItem.SetCommand(SVX_SEARCHCMD_FIND_ALL);
+    ScMarkData aMarkData;
+    aMarkData.SelectOneTable(0);
+    SCCOL nCol = 0;
+    SCROW nRow = 0;
+    SCTAB nTab = 0;
+    ScRangeList aMatchedRanges;
+    OUString aUndoStr;
+    m_pDoc->SearchAndReplace(aItem, nCol, nRow, nTab, aMarkData, aMatchedRanges, aUndoStr);
+
+    CPPUNIT_ASSERT_MESSAGE("There should be exactly 3 matching cells.", aMatchedRanges.size() == 3);
+    ScAddress aHit(0,0,0);
+    CPPUNIT_ASSERT_MESSAGE("A1 should be inside the matched range.", aMatchedRanges.In(aHit));
+    aHit.SetRow(2);
+    CPPUNIT_ASSERT_MESSAGE("A3 should be inside the matched range.", aMatchedRanges.In(aHit));
+    aHit.SetRow(4);
+    CPPUNIT_ASSERT_MESSAGE("A5 should be inside the matched range.", aMatchedRanges.In(aHit));
+
+    m_pDoc->DeleteTab(0);
+}
+
 namespace {
 
 bool hasRange(const std::vector<ScTokenRef>& rRefTokens, const ScRange& rRange)
diff --git a/sc/source/core/data/column2.cxx b/sc/source/core/data/column2.cxx
index 967816c..8b296ae 100644
--- a/sc/source/core/data/column2.cxx
+++ b/sc/source/core/data/column2.cxx
@@ -1349,6 +1349,9 @@ bool ScColumn::GetNextDataPos(SCROW& rRow) const        // greater than rRow
         if (it == maCells.end())
             // No more next block.
             return false;
+
+        // Next block exists, and is non-empty.
+        return true;
     }
 
     if (aPos.second < it->size - 1)
commit f03d0ca9f4d4e75804e4cb8ae7c38943d2060a52
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date:   Thu Jun 20 20:45:21 2013 -0400

    Turns out ScHorizontalIterator was still broken. Fix it for real.
    
    And a unit test to accompany the fix.
    
    Change-Id: I41e9451049d3c6ab7b3fd7904bcef3675979884c

diff --git a/sc/qa/unit/ucalc.cxx b/sc/qa/unit/ucalc.cxx
index fa7c605..a21592f 100644
--- a/sc/qa/unit/ucalc.cxx
+++ b/sc/qa/unit/ucalc.cxx
@@ -53,6 +53,7 @@
 #include "globstr.hrc"
 #include "tokenarray.hxx"
 #include "scopetools.hxx"
+#include "dociter.hxx"
 
 #include "formula/IFunctionDescription.hxx"
 
@@ -121,6 +122,8 @@ public:
     void testSheetsFunc();
     void testVolatileFunc();
 
+    void testHorizontalIterator();
+
     /**
      * Basic test for formula dependency tracking.
      */
@@ -286,6 +289,7 @@ public:
     CPPUNIT_TEST(testCopyToDocument);
     CPPUNIT_TEST(testSheetsFunc);
     CPPUNIT_TEST(testVolatileFunc);
+    CPPUNIT_TEST(testHorizontalIterator);
     CPPUNIT_TEST(testFormulaDepTracking);
     CPPUNIT_TEST(testFormulaDepTracking2);
     CPPUNIT_TEST(testCellBroadcaster);
@@ -1714,6 +1718,53 @@ void Test::testVolatileFunc()
     m_pDoc->DeleteTab(0);
 }
 
+void Test::testHorizontalIterator()
+{
+    m_pDoc->InsertTab(0, "test");
+
+    // Raw data
+    const char* aData[][2] = {
+        { "A", "B" },
+        { "C", "1" },
+        { "D", "2" },
+        { "E", "3" }
+    };
+
+    ScAddress aPos(0,0,0);
+    insertRangeData(m_pDoc, aPos, aData, SAL_N_ELEMENTS(aData));
+    ScHorizontalCellIterator aIter(m_pDoc, 0, 0, 0, 1, SAL_N_ELEMENTS(aData));
+
+    struct {
+        SCCOL nCol;
+        SCROW nRow;
+        const char* pVal;
+    } aChecks[] = {
+        { 0, 0, "A" },
+        { 1, 0, "B" },
+        { 0, 1, "C" },
+        { 1, 1, "1" },
+        { 0, 2, "D" },
+        { 1, 2, "2" },
+        { 0, 3, "E" },
+        { 1, 3, "3" },
+    };
+
+    SCCOL nCol;
+    SCROW nRow;
+    size_t i = 0, n = SAL_N_ELEMENTS(aChecks);
+    for (ScRefCellValue* pCell = aIter.GetNext(nCol, nRow); pCell; pCell = aIter.GetNext(nCol, nRow), ++i)
+    {
+        if (i >= n)
+            CPPUNIT_FAIL("Iterator claims there is more data than there should be.");
+
+        CPPUNIT_ASSERT_EQUAL(aChecks[i].nCol, nCol);
+        CPPUNIT_ASSERT_EQUAL(aChecks[i].nRow, nRow);
+        CPPUNIT_ASSERT_EQUAL(OUString::createFromAscii(aChecks[i].pVal), pCell->getString());
+    }
+
+    m_pDoc->DeleteTab(0);
+}
+
 void Test::testFormulaDepTracking()
 {
     CPPUNIT_ASSERT_MESSAGE ("failed to insert sheet", m_pDoc->InsertTab (0, "foo"));
@@ -6715,13 +6766,9 @@ void Test::testAnchoredRotatedShape()
         ScDrawLayer::SetCellAnchoredFromPosition(*pObj, *m_pDoc, 0);
 
         Rectangle aSnap = pObj->GetSnapRect();
-        printf("expected height %ld actual %ld\n", aRotRect.GetHeight(), aSnap.GetHeight() );
         CPPUNIT_ASSERT_EQUAL( true, testEqualsWithTolerance( aRotRect.GetHeight(), aSnap.GetHeight(), TOLERANCE ) );
-        printf("expected width %ld actual %ld\n", aRotRect.GetWidth(), aSnap.GetWidth() );
         CPPUNIT_ASSERT_EQUAL( true, testEqualsWithTolerance( aRotRect.GetWidth(), aSnap.GetWidth(), TOLERANCE ) );
-        printf("expected left %ld actual %ld\n", aRotRect.Left(), aSnap.Left() );
         CPPUNIT_ASSERT_EQUAL( true, testEqualsWithTolerance( aRotRect.Left(), aSnap.Left(), TOLERANCE ) );
-        printf("expected right %ld actual %ld\n", aRotRect.Top(), aSnap.Top() );
         CPPUNIT_ASSERT_EQUAL( true, testEqualsWithTolerance( aRotRect.Top(), aSnap.Top(), TOLERANCE ) );
 
         ScDrawObjData aAnchor;
@@ -6744,20 +6791,14 @@ void Test::testAnchoredRotatedShape()
 
         aSnap = pObj->GetSnapRect();
 
-        printf("expected new height %ld actual %ld\n", aRotRect.GetHeight(), aSnap.GetHeight() );
         // ensure that width and height have been adjusted accordingly
         CPPUNIT_ASSERT_EQUAL( true, testEqualsWithTolerance( aRotRect.GetHeight(), aSnap.GetHeight(), TOLERANCE ) );
-        printf("expected new width %ld %ld\n", aRotRect.GetWidth(), aSnap.GetWidth() );
         CPPUNIT_ASSERT_EQUAL( true, testEqualsWithTolerance( aRotRect.GetWidth(), aSnap.GetWidth(), TOLERANCE ) );
 
         // ensure that anchor start and end addresses haven't changed
-        printf("expected startrow %ld actual %ld\n", (long)aAnchor.maStart.Row(), (long)pData->maStart.Row()  );
         CPPUNIT_ASSERT_EQUAL( aAnchor.maStart.Row(), pData->maStart.Row() ); // start row 0
-        printf("expected startcol %ld actual %ld\n", (long)aAnchor.maStart.Col(), (long)pData->maStart.Col()  );
         CPPUNIT_ASSERT_EQUAL( aAnchor.maStart.Col(), pData->maStart.Col() ); // start column 5
-        printf("expected endrow %ld actual %ld\n", (long)aAnchor.maEnd.Row(), (long)pData->maEnd.Row()  );
         CPPUNIT_ASSERT_EQUAL( aAnchor.maEnd.Row(), pData->maEnd.Row() ); // end row 3
-        printf("expected endcol %ld actual %ld\n", (long)aAnchor.maEnd.Col(), (long)pData->maEnd.Col()  );
         CPPUNIT_ASSERT_EQUAL( aAnchor.maEnd.Col(), pData->maEnd.Col() ); // end col 7
     }
     m_pDoc->DeleteTab(0);
diff --git a/sc/source/core/data/cellvalue.cxx b/sc/source/core/data/cellvalue.cxx
index 4e00210..84ae8e9 100644
--- a/sc/source/core/data/cellvalue.cxx
+++ b/sc/source/core/data/cellvalue.cxx
@@ -583,6 +583,8 @@ OUString ScRefCellValue::getString()
 {
     switch (meType)
     {
+        case CELLTYPE_VALUE:
+            return OUString::number(mfValue);
         case CELLTYPE_STRING:
             return *mpString;
         case CELLTYPE_EDIT:
diff --git a/sc/source/core/data/dociter.cxx b/sc/source/core/data/dociter.cxx
index e9053d3..9c24aae 100644
--- a/sc/source/core/data/dociter.cxx
+++ b/sc/source/core/data/dociter.cxx
@@ -1756,6 +1756,24 @@ bool ScHorizontalCellIterator::GetPos( SCCOL& rCol, SCROW& rRow )
     return bMore;
 }
 
+namespace {
+

... etc. - the rest is truncated


More information about the Libreoffice-commits mailing list