sc/inc/column.hxx | 8 ++- sc/source/core/data/column.cxx | 84 +++++++++++++++++++++------------------- sc/source/core/data/column2.cxx | 10 ++++ sc/source/core/data/column3.cxx | 28 ++++++++++--- 4 files changed, 82 insertions(+), 48 deletions(-)
New commits: commit a120309902981d9afa5f2068ed0979d1fccb0949 Author: Kohei Yoshida <kohei.yosh...@gmail.com> Date: Tue Mar 12 21:12:22 2013 -0400 Turns out I can't really use ScColumnImpl. Because the column source files are split; not all source files had access to the impl class definition. Change-Id: Ic8cff0eeec3504660304be9f020c40bcd98cee85 diff --git a/sc/inc/column.hxx b/sc/inc/column.hxx index 39f9753..0fbd743 100644 --- a/sc/inc/column.hxx +++ b/sc/inc/column.hxx @@ -28,6 +28,9 @@ #include <set> #include <vector> +#include <mdds/multi_type_vector.hpp> +#include <mdds/multi_type_vector_trait.hpp> + namespace editeng { class SvxBorderLine; } class Fraction; @@ -79,8 +82,9 @@ struct ColEntry class ScColumn { -private: - ScColumnImpl* mpImpl; + typedef mdds::multi_type_vector<mdds::mtv::element_block_func> TextWidthType; + + TextWidthType maTextWidths; SCCOL nCol; SCTAB nTab; diff --git a/sc/source/core/data/column.cxx b/sc/source/core/data/column.cxx index 1226f9b..e81456d 100644 --- a/sc/source/core/data/column.cxx +++ b/sc/source/core/data/column.cxx @@ -36,8 +36,6 @@ #include <cstring> #include <map> -#include <mdds/multi_type_vector.hpp> -#include <mdds/multi_type_vector_trait.hpp> using ::editeng::SvxBorderLine; using namespace formula; @@ -55,22 +53,13 @@ inline bool IsAmbiguousScriptNonZero( sal_uInt8 nScript ) } -struct ScColumnImpl -{ - typedef mdds::multi_type_vector<mdds::mtv::element_block_func> TextWidthType; - - TextWidthType maTextWidths; - - ScColumnImpl() : maTextWidths(MAXROWCOUNT) {} -}; - ScNeededSizeOptions::ScNeededSizeOptions() : pPattern(NULL), bFormula(false), bSkipMerged(true), bGetFont(true), bTotalSize(false) { } ScColumn::ScColumn() : - mpImpl(new ScColumnImpl), + maTextWidths(MAXROWCOUNT), nCol( 0 ), pAttrArray( NULL ), pDocument( NULL ) @@ -862,15 +851,23 @@ void ScColumn::SwapRow(SCROW nRow1, SCROW nRow2) be performed (but keep broadcasters and notes at old position). */ maItems[nIndex1].pCell = pCell2; maItems[nIndex2].pCell = pCell1; + CellStorageModified(); SvtBroadcaster* pBC2 = pCell2->ReleaseBroadcaster(); pCell1->TakeBroadcaster( pBC2 ); pCell2->TakeBroadcaster( pBC1 ); - CellStorageModified(); + // Swap text width values. + unsigned short nVal1 = maTextWidths.get<unsigned short>(nRow1); + unsigned short nVal2 = maTextWidths.get<unsigned short>(nRow2); + maTextWidths.set<unsigned short>(nRow1, nVal2); + maTextWidths.set<unsigned short>(nRow2, nVal1); } else { + // Only cell 1 exists; cell 2 is empty. Move cell 1 from to row + // 2. + ScNoteCell* pDummyCell = pBC1 ? new ScNoteCell( pBC1 ) : 0; if ( pDummyCell ) { @@ -885,7 +882,12 @@ void ScColumn::SwapRow(SCROW nRow1, SCROW nRow2) CellStorageModified(); } - // insert ColEntry at new position + // Empty text width at the cell 1 position. For now, we don't + // transfer the old value to the cell 2 position since Insert() is + // quite complicated. + maTextWidths.set_empty(nRow1, nRow1); + + // insert ColEntry at new position. Insert( nRow2, pCell1 ); } @@ -988,11 +990,10 @@ void ScColumn::SwapCell( SCROW nRow, ScColumn& rCol) if ( pCell2 ) { - // swap + // Both cell 1 and cell 2 exist. Swap them. + maItems[nIndex1].pCell = pCell2; - CellStorageModified(); rCol.maItems[nIndex2].pCell = pCell1; - rCol.CellStorageModified(); // update references SCsCOL dx = rCol.nCol - nCol; @@ -1010,12 +1011,20 @@ void ScColumn::SwapCell( SCROW nRow, ScColumn& rCol) pFmlaCell2->aPos.SetCol( nCol ); pFmlaCell2->UpdateReference(URM_MOVE, aRange, -dx, 0, 0); } + + CellStorageModified(); + rCol.CellStorageModified(); + + // Swap the text widths. + unsigned short nVal1 = maTextWidths.get<unsigned short>(nRow); + unsigned short nVal2 = rCol.maTextWidths.get<unsigned short>(nRow); + maTextWidths.set<unsigned short>(nRow, nVal2); + rCol.maTextWidths.set<unsigned short>(nRow, nVal1); } else { - // remove + // Cell 1 exists but cell 2 isn't. maItems.erase(maItems.begin() + nIndex1); - CellStorageModified(); // update references SCsCOL dx = rCol.nCol - nCol; @@ -1026,6 +1035,12 @@ void ScColumn::SwapCell( SCROW nRow, ScColumn& rCol) pFmlaCell1->aPos.SetCol( rCol.nCol ); pFmlaCell1->UpdateReference(URM_MOVE, aRange, dx, 0, 0); } + + CellStorageModified(); + maTextWidths.set_empty(nRow, nRow); + // We don't transfer the text width to the destination column because + // of Insert()'s complexity. + // insert rCol.Insert(nRow, pCell1); } @@ -1174,6 +1189,7 @@ void ScColumn::InsertRow( SCROW nStartRow, SCSIZE nSize ) pDocument->SetAutoCalc( bOldAutoCalc ); CellStorageModified(); + maTextWidths.insert_empty(nStartRow, nSize); } @@ -1571,6 +1587,8 @@ void ScColumn::MarkScenarioIn( ScMarkData& rDestMark ) const void ScColumn::SwapCol(ScColumn& rCol) { maItems.swap(rCol.maItems); + maTextWidths.swap(rCol.maTextWidths); + CellStorageModified(); rCol.CellStorageModified(); @@ -1651,6 +1669,7 @@ void ScColumn::MoveTo(SCROW nStartRow, SCROW nEndRow, ScColumn& rCol) ScNoteCell* pNoteCell = new ScNoteCell; // Dummy like in DeleteRange // must iterate backwards, because indexes of following cells become invalid + bool bErased = false; for (EntryPosPairs::reverse_iterator it( aEntries.rbegin()); it != aEntries.rend(); ++it) { @@ -1665,11 +1684,16 @@ void ScColumn::MoveTo(SCROW nStartRow, SCROW nEndRow, ScColumn& rCol) } // Erase the slots containing pointers to the dummy cell instance. maItems.erase(maItems.begin() + nStartPos, maItems.begin() + nStopPos); - CellStorageModified(); + bErased = true; } pNoteCell->Delete(); // Delete the dummy cell instance. - } + if (bErased) + { + CellStorageModified(); + maTextWidths.set_empty(nStartRow, nEndRow); + } + } } bool ScColumn::UpdateReference( UpdateRefMode eUpdateRefMode, SCCOL nCol1, SCROW nRow1, SCTAB nTab1, @@ -2294,22 +2318,4 @@ bool ScColumn::SearchStyleRange( return pAttrArray->SearchStyleRange( rRow, rEndRow, pSearchStyle, bUp, NULL ); } -sal_uInt16 ScColumn::GetTextWidth(SCROW nRow) const -{ - switch (mpImpl->maTextWidths.get_type(nRow)) - { - case mdds::mtv::element_type_ushort: - return mpImpl->maTextWidths.get<unsigned short>(nRow); - default: - ; - } - return TEXTWIDTH_DIRTY; -} - -void ScColumn::SetTextWidth(SCROW nRow, sal_uInt16 nWidth) -{ - // We only use unsigned short type in this container. - mpImpl->maTextWidths.set(nRow, static_cast<unsigned short>(nWidth)); -} - /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/core/data/column2.cxx b/sc/source/core/data/column2.cxx index 91ddbb1..c586b34 100644 --- a/sc/source/core/data/column2.cxx +++ b/sc/source/core/data/column2.cxx @@ -1386,6 +1386,16 @@ void ScColumn::CellStorageModified() { } +unsigned short ScColumn::GetTextWidth(SCROW nRow) const +{ + return maTextWidths.get<unsigned short>(nRow); +} + +void ScColumn::SetTextWidth(SCROW nRow, unsigned short nWidth) +{ + maTextWidths.set(nRow, nWidth); +} + void ScColumn::FindDataAreaPos(SCROW& rRow, bool bDown) const { // check if we are in a data area diff --git a/sc/source/core/data/column3.cxx b/sc/source/core/data/column3.cxx index c43320a..5054a81 100644 --- a/sc/source/core/data/column3.cxx +++ b/sc/source/core/data/column3.cxx @@ -58,13 +58,13 @@ using namespace formula; void ScColumn::Insert( SCROW nRow, ScBaseCell* pNewCell ) { - sal_Bool bIsAppended = false; + bool bIsAppended = false; if ( !maItems.empty() ) { if (maItems.back().nRow < nRow) { - Append(nRow, pNewCell ); - bIsAppended = sal_True; + Append(nRow, pNewCell); + bIsAppended = true; } } if ( !bIsAppended ) @@ -81,7 +81,7 @@ void ScColumn::Insert( SCROW nRow, ScBaseCell* pNewCell ) if ( pOldCell->GetCellType() == CELLTYPE_FORMULA && !pDocument->IsClipOrUndo() ) { pOldCell->EndListeningTo( pDocument ); - // If in EndListening NoteCell is destroied in same Col + // If in EndListening NoteCell is destroyed in same Col if ( nIndex >= maItems.size() || maItems[nIndex].nRow != nRow ) Search(nRow, nIndex); } @@ -96,6 +96,8 @@ void ScColumn::Insert( SCROW nRow, ScBaseCell* pNewCell ) maItems[nIndex].nRow = nRow; CellStorageModified(); } + + maTextWidths.set<unsigned short>(nRow, TEXTWIDTH_DIRTY); } // When we insert from the Clipboard we still have wrong (old) References! // First they are rewired in CopyBlockFromClip via UpdateReference and the @@ -140,6 +142,7 @@ void ScColumn::Append( SCROW nRow, ScBaseCell* pCell ) maItems.back().nRow = nRow; CellStorageModified(); + maTextWidths.set<unsigned short>(nRow, TEXTWIDTH_DIRTY); } @@ -152,6 +155,7 @@ void ScColumn::Delete( SCROW nRow ) ScBaseCell* pCell = maItems[nIndex].pCell; ScNoteCell* pNoteCell = new ScNoteCell; maItems[nIndex].pCell = pNoteCell; // Dummy for Interpret + CellStorageModified(); pDocument->Broadcast( ScHint( SC_HINT_DYING, ScAddress( nCol, nRow, nTab ), pCell ) ); if ( SvtBroadcaster* pBC = pCell->ReleaseBroadcaster() ) @@ -162,12 +166,13 @@ void ScColumn::Delete( SCROW nRow ) { pNoteCell->Delete(); maItems.erase( maItems.begin() + nIndex); + CellStorageModified(); // Should we free memory here (delta)? It'll be slower! } pCell->EndListeningTo( pDocument ); pCell->Delete(); - CellStorageModified(); + maTextWidths.set_empty(nRow, nRow); } } @@ -175,16 +180,18 @@ void ScColumn::Delete( SCROW nRow ) void ScColumn::DeleteAtIndex( SCSIZE nIndex ) { ScBaseCell* pCell = maItems[nIndex].pCell; + SCROW nRow = maItems[nIndex].nRow; ScNoteCell* pNoteCell = new ScNoteCell; maItems[nIndex].pCell = pNoteCell; // Dummy for Interpret - pDocument->Broadcast( ScHint( SC_HINT_DYING, - ScAddress( nCol, maItems[nIndex].nRow, nTab ), pCell ) ); + pDocument->Broadcast( + ScHint(SC_HINT_DYING, ScAddress(nCol, nRow, nTab), pCell)); pNoteCell->Delete(); maItems.erase(maItems.begin() + nIndex); pCell->EndListeningTo( pDocument ); pCell->Delete(); CellStorageModified(); + maTextWidths.set_empty(nRow, nRow); } @@ -195,6 +202,7 @@ void ScColumn::FreeAll() maItems.clear(); CellStorageModified(); + maTextWidths.clear(); } @@ -306,6 +314,9 @@ void ScColumn::DeleteRange( SCSIZE nStartIndex, SCSIZE nEndIndex, sal_uInt16 nDe ScHint aHint( SC_HINT_DYING, ScAddress( nCol, 0, nTab ), 0 ); + SCROW nStartRow = maItems[nStartIndex].nRow; + SCROW nEndRow = maItems[nEndIndex].nRow; + // cache all formula cells, they will be deleted at end of this function typedef ::std::vector< ScFormulaCell* > FormulaCellVector; FormulaCellVector aDelCells; @@ -491,6 +502,7 @@ void ScColumn::DeleteRange( SCSIZE nStartIndex, SCSIZE nEndIndex, sal_uInt16 nDe nShift += maItems.size() - nStartSegment; maItems.erase(maItems.end() - nShift, maItems.end()); CellStorageModified(); + maTextWidths.set_empty(nStartRow, nEndRow); } // *** delete all formula cells *** @@ -1418,6 +1430,7 @@ bool ScColumn::SetString( SCROW nRow, SCTAB nTabP, const String& rString, pOldCell->Delete(); maItems[i].pCell = pNewCell; // Replace CellStorageModified(); + SetTextWidth(nRow, TEXTWIDTH_DIRTY); if ( pNewCell->GetCellType() == CELLTYPE_FORMULA ) { @@ -1642,6 +1655,7 @@ void ScColumn::RemoveProtected( SCROW nStartRow, SCROW nEndRow ) delete pFormula; CellStorageModified(); + SetTextWidth(maItems[nIndex].nRow, TEXTWIDTH_DIRTY); } ++nIndex; } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits