diff options
author | Kohei Yoshida <kohei.yoshida@gmail.com> | 2013-03-15 16:46:36 -0400 |
---|---|---|
committer | Kohei Yoshida <kohei.yoshida@gmail.com> | 2013-03-15 22:12:41 -0400 |
commit | 86f704a2e984073c217dd549836bec9265afad58 (patch) | |
tree | 1dd84fbcb5242efd684eba0d710a4dcf78aeaf82 /sc | |
parent | a9ec5f51e13adef2cc2d03e8073e9b6013598309 (diff) |
Started handling the cell text script types. Still work in progress.
Change-Id: I6af668894d61d33de6697fe45fce1515520d4bfa
Diffstat (limited to 'sc')
-rw-r--r-- | sc/inc/column.hxx | 2 | ||||
-rw-r--r-- | sc/source/core/data/column.cxx | 20 | ||||
-rw-r--r-- | sc/source/core/data/column2.cxx | 63 |
3 files changed, 85 insertions, 0 deletions
diff --git a/sc/inc/column.hxx b/sc/inc/column.hxx index 2469a6c60a2e..1b017874738a 100644 --- a/sc/inc/column.hxx +++ b/sc/inc/column.hxx @@ -418,6 +418,8 @@ private: * Call this only from those methods where maItems is modified directly. */ void CellStorageModified(); + + void CopyScriptTypesToDocument(SCROW nRow1, SCROW nRow2, ScColumn& rDestCol) const; }; diff --git a/sc/source/core/data/column.cxx b/sc/source/core/data/column.cxx index b472e9e9b023..c73fa947c483 100644 --- a/sc/source/core/data/column.cxx +++ b/sc/source/core/data/column.cxx @@ -863,6 +863,13 @@ void ScColumn::SwapRow(SCROW nRow1, SCROW nRow2) unsigned short nVal2 = maTextWidths.get<unsigned short>(nRow2); maTextWidths.set<unsigned short>(nRow1, nVal2); maTextWidths.set<unsigned short>(nRow2, nVal1); + + // Swap script types. + nVal1 = maScriptTypes.get<unsigned short>(nRow1); + nVal2 = maScriptTypes.get<unsigned short>(nRow2); + maScriptTypes.set(nRow1, nVal2); + maScriptTypes.set(nRow2, nVal1); + CellStorageModified(); } else @@ -881,6 +888,7 @@ void ScColumn::SwapRow(SCROW nRow1, SCROW nRow2) // remove ColEntry at old position maItems.erase( maItems.begin() + nIndex1 ); maTextWidths.set_empty(nRow1, nRow1); + maScriptTypes.set_empty(nRow1, nRow1); } // Empty text width at the cell 1 position. For now, we don't @@ -1019,6 +1027,12 @@ void ScColumn::SwapCell( SCROW nRow, ScColumn& rCol) maTextWidths.set<unsigned short>(nRow, nVal2); rCol.maTextWidths.set<unsigned short>(nRow, nVal1); + // Swap script types. + nVal1 = maScriptTypes.get<unsigned short>(nRow); + nVal2 = rCol.maScriptTypes.get<unsigned short>(nRow); + maScriptTypes.set(nRow, nVal2); + rCol.maScriptTypes.set(nRow, nVal1); + CellStorageModified(); rCol.CellStorageModified(); } @@ -1038,6 +1052,7 @@ void ScColumn::SwapCell( SCROW nRow, ScColumn& rCol) } maTextWidths.set_empty(nRow, nRow); + maScriptTypes.set_empty(nRow, nRow); CellStorageModified(); // We don't transfer the text width to the destination column because @@ -1191,6 +1206,7 @@ void ScColumn::InsertRow( SCROW nStartRow, SCSIZE nSize ) pDocument->SetAutoCalc( bOldAutoCalc ); maTextWidths.insert_empty(nStartRow, nSize); + maScriptTypes.insert_empty(nStartRow, nSize); CellStorageModified(); } @@ -1276,6 +1292,8 @@ void ScColumn::CopyStaticToDocument(SCROW nRow1, SCROW nRow2, ScColumn& rDestCol if (nRow1 > nRow2) return; + CopyScriptTypesToDocument(nRow1, nRow2, rDestCol); + // First, clear the destination column for the row range specified. std::vector<ColEntry>::iterator it, itEnd; @@ -1353,6 +1371,8 @@ void ScColumn::CopyStaticToDocument(SCROW nRow1, SCROW nRow2, ScColumn& rDestCol // destination column shouldn't have any cells within the specified range. it = std::find_if(rDestCol.maItems.begin(), rDestCol.maItems.end(), FindAboveRow(nRow2)); rDestCol.maItems.insert(it, aCopied.begin(), aCopied.end()); + + // Set text width values dirty for all non-empty cell positions. it = aCopied.begin(); itEnd = aCopied.end(); for (; it != itEnd; ++it) diff --git a/sc/source/core/data/column2.cxx b/sc/source/core/data/column2.cxx index 2715fb9d0d1a..92263af973b6 100644 --- a/sc/source/core/data/column2.cxx +++ b/sc/source/core/data/column2.cxx @@ -1433,6 +1433,69 @@ void ScColumn::CellStorageModified() #endif } +void ScColumn::CopyScriptTypesToDocument(SCROW nRow1, SCROW nRow2, ScColumn& rDestCol) const +{ + rDestCol.maScriptTypes.set_empty(nRow1, nRow2); // Empty the destination range first. + + ScriptType::const_iterator itBlk = maScriptTypes.begin(), itBlkEnd = maScriptTypes.end(); + + // Locate the top row position. + size_t nOffsetInBlock = 0; + size_t nBlockStart = 0, nBlockEnd = 0, nRowPos = static_cast<size_t>(nRow1); + for (; itBlk != itBlkEnd; ++itBlk) + { + nBlockEnd = nBlockStart + itBlk->size; + if (nBlockStart <= nRowPos && nRowPos <= nBlockEnd) + { + // Found. + nOffsetInBlock = nRowPos - nBlockStart; + break; + } + } + + if (itBlk == itBlkEnd) + // Specified range not found. Bail out. + return; + + nRowPos = static_cast<size_t>(nRow2); // End row position. + + // Keep copying until we hit the end row position. + mdds::mtv::ushort_element_block::const_iterator itData, itDataEnd; + for (; itBlk != itBlkEnd; ++itBlk, nBlockStart = nBlockEnd, nOffsetInBlock = 0) + { + nBlockEnd = nBlockStart + itBlk->size; + if (!itBlk->data) + { + // Empty block. + if (nBlockStart <= nRowPos && nRowPos <= nBlockEnd) + // This block contains the end row. + rDestCol.maScriptTypes.set_empty(nBlockStart + nOffsetInBlock, nRowPos); + else + rDestCol.maScriptTypes.set_empty(nBlockStart + nOffsetInBlock, nBlockEnd-1); + + continue; + } + + // Non-empty block. + itData = mdds::mtv::ushort_element_block::begin(*itBlk->data); + itDataEnd = mdds::mtv::ushort_element_block::end(*itBlk->data); + std::advance(itData, nOffsetInBlock); + + if (nBlockStart <= nRowPos && nRowPos <= nBlockEnd) + { + // This block contains the end row. Only copy partially. + size_t nOffset = nRowPos - nBlockStart + 1; + itDataEnd = mdds::mtv::ushort_element_block::begin(*itBlk->data); + std::advance(itDataEnd, nOffset); + + rDestCol.maScriptTypes.set(nBlockStart + nOffsetInBlock, itData, itDataEnd); + break; + } + + rDestCol.maScriptTypes.set(nBlockStart + nOffsetInBlock, itData, itDataEnd); + } +} + unsigned short ScColumn::GetTextWidth(SCROW nRow) const { return maTextWidths.get<unsigned short>(nRow); |