sc/inc/column.hxx | 2 + sc/inc/document.hxx | 8 ++++++ sc/inc/stringutil.hxx | 2 + sc/inc/table.hxx | 16 ++++++------- sc/source/core/data/column2.cxx | 10 ++++++++ sc/source/core/data/column3.cxx | 9 ------- sc/source/core/data/dbdocutl.cxx | 41 +++++++++++++++++++-------------- sc/source/core/data/documen2.cxx | 10 ++++++++ sc/source/core/data/document.cxx | 34 +++++++++++++++++++++++++++ sc/source/core/data/table2.cxx | 23 ++++++++++++++++++ sc/source/core/tool/stringutil.cxx | 15 +++++++++--- sc/source/filter/dif/difimp.cxx | 45 +++++++++++++++++++++++-------------- 12 files changed, 161 insertions(+), 54 deletions(-)
New commits: commit 4e8488d801f111b2c6484d040d7085ade1183515 Author: Kohei Yoshida <kohei.yosh...@gmail.com> Date: Tue Mar 19 17:28:52 2013 -0400 More on removal of direct use of cell classes outside ScDocument. Change-Id: Ie888b3494334613b5e4bcf97019b6dfbbd1a5da1 diff --git a/sc/inc/column.hxx b/sc/inc/column.hxx index d8e4a38..1a1c9a4 100644 --- a/sc/inc/column.hxx +++ b/sc/inc/column.hxx @@ -428,6 +428,8 @@ public: ScFormulaVectorState GetFormulaVectorState( SCROW nRow ) const; + void SetNumberFormat( SCROW nRow, sal_uInt32 nNumberFormat ); + private: const ScFormulaCell* FetchFormulaCell( SCROW nRow ) const; diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx index 91e003e..54c18ea 100644 --- a/sc/inc/document.hxx +++ b/sc/inc/document.hxx @@ -741,6 +741,8 @@ public: bool TestRemoveSubTotals( SCTAB nTab, const ScSubTotalParam& rParam ); bool HasSubTotalCells( const ScRange& rRange ); + SC_DLLPUBLIC void EnsureTable( SCTAB nTab ); + SC_DLLPUBLIC void PutCell( const ScAddress&, ScBaseCell* pCell, bool bForceTab = false ); SC_DLLPUBLIC void PutCell( SCCOL nCol, SCROW nRow, SCTAB nTab, ScBaseCell* pCell, bool bForceTab = false ); @@ -763,7 +765,12 @@ public: */ SC_DLLPUBLIC void SetEditText( const ScAddress& rPos, EditTextObject* pEditText ); + SC_DLLPUBLIC void SetEditText( const ScAddress& rPos, const OUString& rStr ); + + void SetEmptyCell( const ScAddress& rPos ); + SC_DLLPUBLIC void SetValue( SCCOL nCol, SCROW nRow, SCTAB nTab, const double& rVal ); + SC_DLLPUBLIC void SetValue( const ScAddress& rPos, double fVal ); void SetError( SCCOL nCol, SCROW nRow, SCTAB nTab, const sal_uInt16 nError); SC_DLLPUBLIC void InsertMatrixFormula(SCCOL nCol1, SCROW nRow1, @@ -790,6 +797,7 @@ public: sal_uInt32& rFormat ) const; sal_uInt32 GetNumberFormat( const ScRange& rRange ) const; SC_DLLPUBLIC sal_uInt32 GetNumberFormat( const ScAddress& ) const; + void SetNumberFormat( const ScAddress& rPos, sal_uInt32 nNumberFormat ); /** If no number format attribute is set and the cell pointer passed is of type formula cell, the calculated number format of the formula cell is returned. pCell diff --git a/sc/inc/stringutil.hxx b/sc/inc/stringutil.hxx index 988dea2..a210d5b 100644 --- a/sc/inc/stringutil.hxx +++ b/sc/inc/stringutil.hxx @@ -109,6 +109,8 @@ public: static sal_Int32 SC_DLLPUBLIC GetQuotedTokenCount(const OUString &rIn, const OUString& rQuotedPairs, sal_Unicode cTok = ';' ); static OUString SC_DLLPUBLIC GetQuotedToken(const OUString &rIn, sal_Int32 nToken, const OUString& rQuotedPairs, sal_Unicode cTok, sal_Int32& rIndex ); + + static bool SC_DLLPUBLIC isMultiline( const OUString& rStr ); }; diff --git a/sc/inc/table.hxx b/sc/inc/table.hxx index 990b0fc..98ca220 100644 --- a/sc/inc/table.hxx +++ b/sc/inc/table.hxx @@ -305,6 +305,8 @@ public: void SetEditText( SCCOL nCol, SCROW nRow, EditTextObject* pEditText ); + void SetEmptyCell( SCCOL nCol, SCROW nRow ); + void SetValue( SCCOL nCol, SCROW nRow, const double& rVal ); void SetError( SCCOL nCol, SCROW nRow, sal_uInt16 nError); @@ -509,14 +511,12 @@ public: const ScPatternAttr* GetPattern( SCCOL nCol, SCROW nRow ) const; const ScPatternAttr* GetMostUsedPattern( SCCOL nCol, SCROW nStartRow, SCROW nEndRow ) const; - sal_uLong GetNumberFormat( const ScAddress& rPos ) const - { - return ValidColRow(rPos.Col(),rPos.Row()) ? - aCol[rPos.Col()].GetNumberFormat( rPos.Row() ) : - 0; - } - sal_uLong GetNumberFormat( SCCOL nCol, SCROW nRow ) const; - sal_uInt32 GetNumberFormat( SCCOL nCol, SCROW nStartRow, SCROW nEndRow ) const; + sal_uInt32 GetNumberFormat( const ScAddress& rPos ) const; + sal_uInt32 GetNumberFormat( SCCOL nCol, SCROW nRow ) const; + sal_uInt32 GetNumberFormat( SCCOL nCol, SCROW nStartRow, SCROW nEndRow ) const; + + void SetNumberFormat( SCCOL nCol, SCROW nRow, sal_uInt32 nNumberFormat ); + void MergeSelectionPattern( ScMergePatternState& rState, const ScMarkData& rMark, bool bDeep ) const; void MergePatternArea( ScMergePatternState& rState, SCCOL nCol1, SCROW nRow1, diff --git a/sc/source/core/data/column2.cxx b/sc/source/core/data/column2.cxx index 17d951d..e2792de 100644 --- a/sc/source/core/data/column2.cxx +++ b/sc/source/core/data/column2.cxx @@ -1537,6 +1537,16 @@ ScFormulaVectorState ScColumn::GetFormulaVectorState( SCROW nRow ) const return pCell ? pCell->GetVectorState() : FormulaVectorUnknown; } +void ScColumn::SetNumberFormat( SCROW nRow, sal_uInt32 nNumberFormat ) +{ + short eOldType = pDocument->GetFormatTable()->GetType( + (sal_uLong)((SfxUInt32Item*)GetAttr(nRow, ATTR_VALUE_FORMAT))->GetValue()); + + short eNewType = pDocument->GetFormatTable()->GetType(nNumberFormat); + if (!pDocument->GetFormatTable()->IsCompatible(eOldType, eNewType)) + ApplyAttr(nRow, SfxUInt32Item(ATTR_VALUE_FORMAT, nNumberFormat)); +} + const ScFormulaCell* ScColumn::FetchFormulaCell( SCROW nRow ) const { if (!ValidRow(nRow)) diff --git a/sc/source/core/data/column3.cxx b/sc/source/core/data/column3.cxx index c4c4ec6..36689bf 100644 --- a/sc/source/core/data/column3.cxx +++ b/sc/source/core/data/column3.cxx @@ -129,14 +129,7 @@ void ScColumn::Insert( SCROW nRow, ScBaseCell* pNewCell ) void ScColumn::Insert( SCROW nRow, sal_uInt32 nNumberFormat, ScBaseCell* pCell ) { Insert(nRow, pCell); - short eOldType = pDocument->GetFormatTable()-> - GetType( (sal_uLong) - ((SfxUInt32Item*)GetAttr( nRow, ATTR_VALUE_FORMAT ))-> - GetValue() ); - short eNewType = pDocument->GetFormatTable()->GetType(nNumberFormat); - if (!pDocument->GetFormatTable()->IsCompatible(eOldType, eNewType)) - ApplyAttr( nRow, SfxUInt32Item( ATTR_VALUE_FORMAT, (sal_uInt32) nNumberFormat) ); - + SetNumberFormat(nRow, nNumberFormat); bDirtyGroups = true; } diff --git a/sc/source/core/data/dbdocutl.cxx b/sc/source/core/data/dbdocutl.cxx index 1516996..167290b 100644 --- a/sc/source/core/data/dbdocutl.cxx +++ b/sc/source/core/data/dbdocutl.cxx @@ -24,8 +24,8 @@ #include "dbdocutl.hxx" #include "document.hxx" -#include "cell.hxx" #include "formula/errorcodes.hxx" +#include "stringutil.hxx" using namespace ::com::sun::star; @@ -153,38 +153,45 @@ void ScDatabaseDocUtil::PutData( ScDocument* pDoc, SCCOL nCol, SCROW nRow, SCTAB nFormatIndex = pDoc->GetFormatTable()->GetStandardFormat( NUMBERFORMAT_CURRENCY, ScGlobal::eLnge ); - ScBaseCell* pCell; + ScAddress aPos(nCol, nRow, nTab); if (bEmptyFlag) - { - pCell = NULL; - pDoc->PutCell( nCol, nRow, nTab, pCell ); - } + pDoc->SetEmptyCell(aPos); else if (bError) { pDoc->SetError( nCol, nRow, nTab, NOTAVAILABLE ); } else if (bValue) { - pCell = new ScValueCell( nVal ); - if (nFormatIndex == 0) - pDoc->PutCell( nCol, nRow, nTab, pCell ); - else - pDoc->PutCell( nCol, nRow, nTab, pCell, nFormatIndex ); + pDoc->SetValue(aPos, nVal); + if (nFormatIndex) + pDoc->SetNumberFormat(aPos, nFormatIndex); } else { if (aString.Len()) { - pCell = ScBaseCell::CreateTextCell( aString, pDoc ); - if (pStrData) + if (ScStringUtil::isMultiline(aString)) { - pStrData->mbSimpleText = pCell->GetCellType() != CELLTYPE_EDIT; - pStrData->mnStrLength = aString.Len(); + pDoc->SetEditText(aPos, aString); + if (pStrData) + pStrData->mbSimpleText = false; } + else + { + ScSetStringParam aParam; + aParam.mbDetectNumberFormat = false; + aParam.mbHandleApostrophe = false; + aParam.meSetTextNumFormat = ScSetStringParam::Always; + pDoc->SetString(aPos, aString, &aParam); + if (pStrData) + pStrData->mbSimpleText = true; + } + + if (pStrData) + pStrData->mnStrLength = aString.Len(); } else - pCell = NULL; - pDoc->PutCell( nCol, nRow, nTab, pCell ); + pDoc->SetEmptyCell(aPos); } } diff --git a/sc/source/core/data/documen2.cxx b/sc/source/core/data/documen2.cxx index 64eb25a..bc681ba 100644 --- a/sc/source/core/data/documen2.cxx +++ b/sc/source/core/data/documen2.cxx @@ -574,6 +574,16 @@ void ScDocument::ResetClip( ScDocument* pSourceDoc, SCTAB nTab ) } } +void ScDocument::EnsureTable( SCTAB nTab ) +{ + bool bExtras = !bIsUndo; // Spaltenbreiten, Zeilenhoehen, Flags + if (static_cast<size_t>(nTab) >= maTabs.size()) + maTabs.resize(nTab+1, NULL); + + if (!maTabs[nTab]) + maTabs[nTab] = new ScTable(this, nTab, "temp", bExtras, bExtras); +} + void ScDocument::PutCell( SCCOL nCol, SCROW nRow, SCTAB nTab, ScBaseCell* pCell, sal_uLong nFormatIndex, bool bForceTab ) { diff --git a/sc/source/core/data/document.cxx b/sc/source/core/data/document.cxx index 71f4a1f..455178a 100644 --- a/sc/source/core/data/document.cxx +++ b/sc/source/core/data/document.cxx @@ -86,6 +86,7 @@ #include "clipparam.hxx" #include "stlalgorithm.hxx" #include "defaultsoptions.hxx" +#include "editutil.hxx" #include <map> #include <limits> @@ -2979,6 +2980,24 @@ void ScDocument::SetEditText( const ScAddress& rPos, EditTextObject* pEditText ) maTabs[rPos.Tab()]->SetEditText(rPos.Col(), rPos.Row(), pEditText); } +void ScDocument::SetEditText( const ScAddress& rPos, const OUString& rStr ) +{ + if (!TableExists(rPos.Tab())) + return; + + ScFieldEditEngine& rEngine = GetEditEngine(); + rEngine.SetText(rStr); + maTabs[rPos.Tab()]->SetEditText(rPos.Col(), rPos.Row(), rEngine.CreateTextObject()); +} + +void ScDocument::SetEmptyCell( const ScAddress& rPos ) +{ + if (!TableExists(rPos.Tab())) + return; + + maTabs[rPos.Tab()]->SetEmptyCell(rPos.Col(), rPos.Row()); +} + void ScDocument::SetValue( SCCOL nCol, SCROW nRow, SCTAB nTab, const double& rVal ) { if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size())) @@ -2986,6 +3005,14 @@ void ScDocument::SetValue( SCCOL nCol, SCROW nRow, SCTAB nTab, const double& rVa maTabs[nTab]->SetValue( nCol, nRow, rVal ); } +void ScDocument::SetValue( const ScAddress& rPos, double fVal ) +{ + if (!TableExists(rPos.Tab())) + return; + + maTabs[rPos.Tab()]->SetValue(rPos.Col(), rPos.Row(), fVal); +} + OUString ScDocument::GetString( SCCOL nCol, SCROW nRow, SCTAB nTab ) { if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab]) @@ -3140,6 +3167,13 @@ sal_uInt32 ScDocument::GetNumberFormat( const ScAddress& rPos ) const return 0; } +void ScDocument::SetNumberFormat( const ScAddress& rPos, sal_uInt32 nNumberFormat ) +{ + if (!TableExists(rPos.Tab())) + return; + + maTabs[rPos.Tab()]->SetNumberFormat(rPos.Col(), rPos.Row(), nNumberFormat); +} void ScDocument::GetNumberFormatInfo( short& nType, sal_uLong& nIndex, const ScAddress& rPos, const ScBaseCell* pCell ) const diff --git a/sc/source/core/data/table2.cxx b/sc/source/core/data/table2.cxx index 015fa67..80cc8cb 100644 --- a/sc/source/core/data/table2.cxx +++ b/sc/source/core/data/table2.cxx @@ -1334,6 +1334,14 @@ void ScTable::SetEditText( SCCOL nCol, SCROW nRow, EditTextObject* pEditText ) aCol[nCol].SetEditText(nRow, pEditText); } +void ScTable::SetEmptyCell( SCCOL nCol, SCROW nRow ) +{ + if (!ValidColRow(nCol, nRow)) + return; + + aCol[nCol].Delete(nRow); +} + void ScTable::SetValue( SCCOL nCol, SCROW nRow, const double& rVal ) { if (ValidColRow(nCol, nRow)) @@ -1615,8 +1623,14 @@ const SfxPoolItem* ScTable::GetAttr( SCCOL nCol, SCROW nRow, sal_uInt16 nWhich ) return NULL; } +sal_uInt32 ScTable::GetNumberFormat( const ScAddress& rPos ) const +{ + return ValidColRow(rPos.Col(),rPos.Row()) ? + aCol[rPos.Col()].GetNumberFormat( rPos.Row() ) : + 0; +} -sal_uLong ScTable::GetNumberFormat( SCCOL nCol, SCROW nRow ) const +sal_uInt32 ScTable::GetNumberFormat( SCCOL nCol, SCROW nRow ) const { if (ValidColRow(nCol,nRow)) return aCol[nCol].GetNumberFormat( nRow ); @@ -1632,6 +1646,13 @@ sal_uInt32 ScTable::GetNumberFormat( SCCOL nCol, SCROW nStartRow, SCROW nEndRow return aCol[nCol].GetNumberFormat(nStartRow, nEndRow); } +void ScTable::SetNumberFormat( SCCOL nCol, SCROW nRow, sal_uInt32 nNumberFormat ) +{ + if (!ValidColRow(nCol, nRow)) + return; + + aCol[nCol].SetNumberFormat(nRow, nNumberFormat); +} const ScPatternAttr* ScTable::GetPattern( SCCOL nCol, SCROW nRow ) const { diff --git a/sc/source/core/tool/stringutil.cxx b/sc/source/core/tool/stringutil.cxx index 14ea674..8924eca 100644 --- a/sc/source/core/tool/stringutil.cxx +++ b/sc/source/core/tool/stringutil.cxx @@ -20,9 +20,7 @@ #include "stringutil.hxx" #include "rtl/ustrbuf.hxx" #include "rtl/math.hxx" - -using ::rtl::OUString; -using ::rtl::OUStringBuffer; +#include "global.hxx" ScSetStringParam::ScSetStringParam() : mpNumFormatter(NULL), @@ -310,4 +308,15 @@ OUString ScStringUtil::GetQuotedToken(const OUString &rIn, sal_Int32 nToken, con } } +bool ScStringUtil::isMultiline( const OUString& rStr ) +{ + if (rStr.indexOf('\n') != -1) + return true; + + if (rStr.indexOf(CHAR_CR) != -1) + return true; + + return false; +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/filter/dif/difimp.cxx b/sc/source/filter/dif/difimp.cxx index a6864c7..63987e7 100644 --- a/sc/source/filter/dif/difimp.cxx +++ b/sc/source/filter/dif/difimp.cxx @@ -23,7 +23,6 @@ #include <svl/zforlist.hxx> #include "attrib.hxx" -#include "cell.hxx" #include "dif.hxx" #include "docpool.hxx" #include "document.hxx" @@ -33,6 +32,7 @@ #include "patattr.hxx" #include "scerrors.hxx" #include "scitems.hxx" +#include "stringutil.hxx" const sal_Unicode pKeyTABLE[] = { 'T', 'A', 'B', 'L', 'E', 0 }; const sal_Unicode pKeyVECTORS[] = { 'V', 'E', 'C', 'T', 'O', 'R', 'S', 0 }; @@ -53,16 +53,16 @@ FltError ScFormatFilterPluginImpl::ScImportDif( SvStream& rIn, ScDocument* pDoc, { DifParser aDifParser( rIn, nDifOption, *pDoc, eVon ); - const sal_Bool bPlain = aDifParser.IsPlain(); + const bool bPlain = aDifParser.IsPlain(); SCTAB nBaseTab = rInsPos.Tab(); TOPIC eTopic = T_UNKNOWN; - sal_Bool bSyntErrWarn = false; - sal_Bool bOverflowWarn = false; + bool bSyntErrWarn = false; + bool bOverflowWarn = false; rtl::OUString aData = aDifParser.aData; - sal_Bool bData = false; + bool bData = false; rIn.Seek( 0 ); @@ -133,14 +133,20 @@ FltError ScFormatFilterPluginImpl::ScImportDif( SvStream& rIn, ScDocument* pDoc, DATASET eAkt = D_UNKNOWN; + ScSetStringParam aStrParam; // used to set string value without number detection. + aStrParam.mbDetectNumberFormat = false; + aStrParam.mbHandleApostrophe = false; + aStrParam.meSetTextNumFormat = ScSetStringParam::Always; + while( eAkt != D_EOD ) - { + { eAkt = aDifParser.GetNextDataset(); aPrgrsBar.Progress(); + ScAddress aPos(nColCnt, nRowCnt, nBaseTab); switch( eAkt ) - { + { case D_BOT: if( nColCnt < SCCOL_MAX ) nRowCnt++; @@ -154,17 +160,18 @@ FltError ScFormatFilterPluginImpl::ScImportDif( SvStream& rIn, ScDocument* pDoc, if( ValidCol(nColCnt) && ValidRow(nRowCnt) ) { - ScBaseCell* pCell; + pDoc->EnsureTable(nBaseTab); + if( DifParser::IsV( aData.getStr() ) ) { - pCell = new ScValueCell( aDifParser.fVal ); + pDoc->SetValue(aPos, aDifParser.fVal); if( !bPlain ) aAttrCache.SetNumFormat( nColCnt, nRowCnt, aDifParser.nNumFormat ); } else if( aData == pKeyTRUE || aData == pKeyFALSE ) { - pCell = new ScValueCell( aDifParser.fVal ); + pDoc->SetValue(aPos, aDifParser.fVal); if( bPlain ) aAttrCache.SetLogical( nColCnt, nRowCnt ); else @@ -172,19 +179,19 @@ FltError ScFormatFilterPluginImpl::ScImportDif( SvStream& rIn, ScDocument* pDoc, aDifParser.nNumFormat ); } else if( aData == pKeyNA || aData == pKeyERROR ) - pCell = new ScStringCell( aData ); + { + pDoc->SetString(aPos, aData, &aStrParam); + } else { String aTmp( RTL_CONSTASCII_USTRINGPARAM( "#IND: " )); aTmp += aData; aTmp += sal_Unicode('?'); - pCell = new ScStringCell( aTmp ); + pDoc->SetString(aPos, aTmp, &aStrParam); } - - pDoc->PutCell( nColCnt, nRowCnt, nBaseTab, pCell, true ); } else - bOverflowWarn = sal_True; + bOverflowWarn = true; nColCnt++; break; @@ -196,8 +203,12 @@ FltError ScFormatFilterPluginImpl::ScImportDif( SvStream& rIn, ScDocument* pDoc, { if (!aData.isEmpty()) { - pDoc->PutCell( nColCnt, nRowCnt, nBaseTab, - ScBaseCell::CreateTextCell( aData, pDoc ), true ); + pDoc->EnsureTable(nBaseTab); + + if (ScStringUtil::isMultiline(aData)) + pDoc->SetEditText(aPos, aData); + else + pDoc->SetString(aPos, aData, &aStrParam); } } else _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits