[Libreoffice-commits] core.git: Branch 'feature/formula-core-rework' - sc/inc sc/source
Kohei Yoshida
kohei.yoshida at gmail.com
Tue Mar 19 16:26:12 PDT 2013
sc/inc/column.hxx | 2 +
sc/inc/document.hxx | 14 ++++++++++++
sc/inc/table.hxx | 4 +++
sc/source/core/data/column3.cxx | 12 ++++++++++
sc/source/core/data/documen2.cxx | 33 +++++++++++++++++-------------
sc/source/core/data/document.cxx | 22 ++++++++++++++++++++
sc/source/core/data/table2.cxx | 18 ++++++++++++++++
sc/source/filter/dif/difimp.cxx | 6 -----
sc/source/filter/oox/worksheethelper.cxx | 15 ++++---------
sc/source/filter/orcus/interface.cxx | 16 ++++----------
sc/source/filter/qpro/qpro.cxx | 3 +-
sc/source/filter/xml/xmlcelli.cxx | 34 ++++++++++++++++++++-----------
sc/source/ui/docshell/impex.cxx | 12 ++++++----
13 files changed, 133 insertions(+), 58 deletions(-)
New commits:
commit dc9f7ce86f9e964c95a0b7ea996b4a036da75c62
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date: Tue Mar 19 19:25:45 2013 -0400
More on removing direct use of cell classes...
Change-Id: Id09a5b681bfa4b64406148bce1a88c132b01d4dd
diff --git a/sc/inc/column.hxx b/sc/inc/column.hxx
index 1a1c9a4..8ef72d9 100644
--- a/sc/inc/column.hxx
+++ b/sc/inc/column.hxx
@@ -262,6 +262,8 @@ public:
ScSetStringParam* pParam = NULL );
void SetEditText( SCROW nRow, EditTextObject* pEditText );
+ void SetFormula( SCROW nRow, const ScTokenArray& rArray, formula::FormulaGrammar::Grammar eGram );
+ void SetFormula( SCROW nRow, const OUString& rFormula, formula::FormulaGrammar::Grammar eGram );
void SetValue( SCROW nRow, const double& rVal);
void SetError( SCROW nRow, const sal_uInt16 nError);
diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx
index 54c18ea..efecd06 100644
--- a/sc/inc/document.hxx
+++ b/sc/inc/document.hxx
@@ -767,12 +767,26 @@ public:
SC_DLLPUBLIC void SetEditText( const ScAddress& rPos, const OUString& rStr );
+ /**
+ * Call this if you are not sure whether to put this as an edit text or a
+ * simple text.
+ */
+ SC_DLLPUBLIC void SetTextCell( 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 SetFormula(
+ const ScAddress& rPos, const ScTokenArray& rArray,
+ formula::FormulaGrammar::Grammar eGram = formula::FormulaGrammar::GRAM_DEFAULT );
+
+ SC_DLLPUBLIC void SetFormula(
+ const ScAddress& rPos, const OUString& rFormula,
+ formula::FormulaGrammar::Grammar eGram = formula::FormulaGrammar::GRAM_DEFAULT );
+
SC_DLLPUBLIC void InsertMatrixFormula(SCCOL nCol1, SCROW nRow1,
SCCOL nCol2, SCROW nRow2,
const ScMarkData& rMark,
diff --git a/sc/inc/table.hxx b/sc/inc/table.hxx
index 98ca220..b87ecfe 100644
--- a/sc/inc/table.hxx
+++ b/sc/inc/table.hxx
@@ -306,6 +306,10 @@ public:
void SetEditText( SCCOL nCol, SCROW nRow, EditTextObject* pEditText );
void SetEmptyCell( SCCOL nCol, SCROW nRow );
+ void SetFormula(
+ SCCOL nCol, SCROW nRow, const ScTokenArray& rArray, formula::FormulaGrammar::Grammar eGram );
+ void SetFormula(
+ SCCOL nCol, SCROW nRow, const OUString& rFormula, formula::FormulaGrammar::Grammar eGram );
void SetValue( SCCOL nCol, SCROW nRow, const double& rVal );
void SetError( SCCOL nCol, SCROW nRow, sal_uInt16 nError);
diff --git a/sc/source/core/data/column3.cxx b/sc/source/core/data/column3.cxx
index 36689bf..469c818 100644
--- a/sc/source/core/data/column3.cxx
+++ b/sc/source/core/data/column3.cxx
@@ -1488,6 +1488,18 @@ void ScColumn::SetEditText( SCROW nRow, EditTextObject* pEditText )
Insert(nRow, new ScEditCell(pEditText, pDocument));
}
+void ScColumn::SetFormula( SCROW nRow, const ScTokenArray& rArray, formula::FormulaGrammar::Grammar eGram )
+{
+ ScAddress aPos(nCol, nRow, nTab);
+ Insert(nRow, new ScFormulaCell(pDocument, aPos, &rArray, eGram));
+}
+
+void ScColumn::SetFormula( SCROW nRow, const OUString& rFormula, formula::FormulaGrammar::Grammar eGram )
+{
+ ScAddress aPos(nCol, nRow, nTab);
+ Insert(nRow, new ScFormulaCell(pDocument, aPos, rFormula, eGram));
+}
+
void ScColumn::GetFilterEntries(SCROW nStartRow, SCROW nEndRow, std::vector<ScTypedStrData>& rStrings, bool& rHasDates)
{
bool bHasDates = false;
diff --git a/sc/source/core/data/documen2.cxx b/sc/source/core/data/documen2.cxx
index bc681ba..3151053 100644
--- a/sc/source/core/data/documen2.cxx
+++ b/sc/source/core/data/documen2.cxx
@@ -589,17 +589,8 @@ void ScDocument::PutCell( SCCOL nCol, SCROW nRow, SCTAB nTab,
{
if (ValidTab(nTab))
{
- if ( bForceTab && ( nTab >= static_cast<SCTAB>(maTabs.size()) || !maTabs[nTab] ) )
- {
- bool bExtras = !bIsUndo; // Spaltenbreiten, Zeilenhoehen, Flags
- if ( nTab >= static_cast<SCTAB>(maTabs.size()) )
- {
- maTabs.resize( nTab + 1, NULL );
- }
- maTabs.at(nTab) = new ScTable(this, nTab,
- OUString("temp"),
- bExtras, bExtras);
- }
+ if (bForceTab)
+ EnsureTable(nTab);
if ( nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] )
maTabs[nTab]->PutCell( nCol, nRow, nFormatIndex, pCell );
@@ -1040,8 +1031,6 @@ sal_uLong ScDocument::TransferTab( ScDocument* pSrcDoc, SCTAB nSrcPos,
return nRetVal;
}
-// ----------------------------------------------------------------------------
-
void ScDocument::SetError( SCCOL nCol, SCROW nRow, SCTAB nTab, const sal_uInt16 nError)
{
if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()))
@@ -1049,7 +1038,23 @@ void ScDocument::SetError( SCCOL nCol, SCROW nRow, SCTAB nTab, const sal_uInt16
maTabs[nTab]->SetError( nCol, nRow, nError );
}
-// ----------------------------------------------------------------------------
+void ScDocument::SetFormula(
+ const ScAddress& rPos, const ScTokenArray& rArray, formula::FormulaGrammar::Grammar eGram )
+{
+ if (!TableExists(rPos.Tab()))
+ return;
+
+ maTabs[rPos.Tab()]->SetFormula(rPos.Col(), rPos.Row(), rArray, eGram);
+}
+
+void ScDocument::SetFormula(
+ const ScAddress& rPos, const OUString& rFormula, formula::FormulaGrammar::Grammar eGram )
+{
+ if (!TableExists(rPos.Tab()))
+ return;
+
+ maTabs[rPos.Tab()]->SetFormula(rPos.Col(), rPos.Row(), rFormula, eGram);
+}
void ScDocument::SetConsolidateDlgData( const ScConsolidateParam* pData )
{
diff --git a/sc/source/core/data/document.cxx b/sc/source/core/data/document.cxx
index 455178a..4515b2c 100644
--- a/sc/source/core/data/document.cxx
+++ b/sc/source/core/data/document.cxx
@@ -87,6 +87,7 @@
#include "stlalgorithm.hxx"
#include "defaultsoptions.hxx"
#include "editutil.hxx"
+#include "stringutil.hxx"
#include <map>
#include <limits>
@@ -2990,6 +2991,27 @@ void ScDocument::SetEditText( const ScAddress& rPos, const OUString& rStr )
maTabs[rPos.Tab()]->SetEditText(rPos.Col(), rPos.Row(), rEngine.CreateTextObject());
}
+void ScDocument::SetTextCell( const ScAddress& rPos, const OUString& rStr )
+{
+ if (!TableExists(rPos.Tab()))
+ return;
+
+ if (ScStringUtil::isMultiline(rStr))
+ {
+ ScFieldEditEngine& rEngine = GetEditEngine();
+ rEngine.SetText(rStr);
+ maTabs[rPos.Tab()]->SetEditText(rPos.Col(), rPos.Row(), rEngine.CreateTextObject());
+ }
+ else
+ {
+ ScSetStringParam aParam;
+ aParam.mbDetectNumberFormat = false;
+ aParam.mbHandleApostrophe = false;
+ aParam.meSetTextNumFormat = ScSetStringParam::Always;
+ maTabs[rPos.Tab()]->SetString(rPos.Col(), rPos.Row(), rPos.Tab(), rStr, &aParam);
+ }
+}
+
void ScDocument::SetEmptyCell( const ScAddress& rPos )
{
if (!TableExists(rPos.Tab()))
diff --git a/sc/source/core/data/table2.cxx b/sc/source/core/data/table2.cxx
index 80cc8cb..e73a8e9 100644
--- a/sc/source/core/data/table2.cxx
+++ b/sc/source/core/data/table2.cxx
@@ -1342,6 +1342,24 @@ void ScTable::SetEmptyCell( SCCOL nCol, SCROW nRow )
aCol[nCol].Delete(nRow);
}
+void ScTable::SetFormula(
+ SCCOL nCol, SCROW nRow, const ScTokenArray& rArray, formula::FormulaGrammar::Grammar eGram )
+{
+ if (!ValidColRow(nCol, nRow))
+ return;
+
+ aCol[nCol].SetFormula(nRow, rArray, eGram);
+}
+
+void ScTable::SetFormula(
+ SCCOL nCol, SCROW nRow, const OUString& rFormula, formula::FormulaGrammar::Grammar eGram )
+{
+ if (!ValidColRow(nCol, nRow))
+ return;
+
+ aCol[nCol].SetFormula(nRow, rFormula, eGram);
+}
+
void ScTable::SetValue( SCCOL nCol, SCROW nRow, const double& rVal )
{
if (ValidColRow(nCol, nRow))
diff --git a/sc/source/filter/dif/difimp.cxx b/sc/source/filter/dif/difimp.cxx
index 63987e7..4b20016 100644
--- a/sc/source/filter/dif/difimp.cxx
+++ b/sc/source/filter/dif/difimp.cxx
@@ -204,11 +204,7 @@ FltError ScFormatFilterPluginImpl::ScImportDif( SvStream& rIn, ScDocument* pDoc,
if (!aData.isEmpty())
{
pDoc->EnsureTable(nBaseTab);
-
- if (ScStringUtil::isMultiline(aData))
- pDoc->SetEditText(aPos, aData);
- else
- pDoc->SetString(aPos, aData, &aStrParam);
+ pDoc->SetTextCell(aPos, aData);
}
}
else
diff --git a/sc/source/filter/oox/worksheethelper.cxx b/sc/source/filter/oox/worksheethelper.cxx
index c83e3c0..dfb1653 100644
--- a/sc/source/filter/oox/worksheethelper.cxx
+++ b/sc/source/filter/oox/worksheethelper.cxx
@@ -46,7 +46,6 @@
#include "oox/helper/propertyset.hxx"
#include "addressconverter.hxx"
#include "autofilterbuffer.hxx"
-#include "cell.hxx"
#include "commentsbuffer.hxx"
#include "condformatbuffer.hxx"
#include "convuno.hxx"
@@ -67,8 +66,10 @@
#include "worksheetsettings.hxx"
#include "formulabuffer.hxx"
#include "scitems.hxx"
-#include <svl/stritem.hxx>
#include "editutil.hxx"
+#include "tokenarray.hxx"
+
+#include <svl/stritem.hxx>
#include <editeng/editobj.hxx>
namespace oox {
@@ -1556,14 +1557,9 @@ void WorksheetHelper::putString( const CellAddress& rAddress, const OUString& rT
{
ScAddress aAddress;
ScUnoConversion::FillScAddress( aAddress, rAddress );
- ScBaseCell* pNewCell = NULL;
ScDocument& rDoc = getScDocument();
if ( !rText.isEmpty() )
- pNewCell = ScBaseCell::CreateTextCell( rText, &rDoc );
- if ( pNewCell )
- rDoc.PutCell( aAddress, pNewCell );
- else
- rDoc.SetString( aAddress.Col(), aAddress.Row(), aAddress.Tab(), rText );
+ rDoc.SetTextCell(aAddress, rText);
}
void WorksheetHelper::putRichString( const CellAddress& rAddress, const RichString& rString, const Font* pFirstPortionFont ) const
@@ -1584,8 +1580,7 @@ void WorksheetHelper::putFormulaTokens( const CellAddress& rAddress, const ApiTo
ScAddress aCellPos;
ScUnoConversion::FillScAddress( aCellPos, rAddress );
ScTokenConversion::ConvertToTokenArray( rDoc, aTokenArray, rTokens );
- ScBaseCell* pNewCell = new ScFormulaCell( &rDoc, aCellPos, &aTokenArray );
- rDoc.PutCell( aCellPos, pNewCell, sal_True );
+ rDoc.SetFormula(aCellPos, aTokenArray);
}
void WorksheetHelper::initializeWorksheetImport()
diff --git a/sc/source/filter/orcus/interface.cxx b/sc/source/filter/orcus/interface.cxx
index b21e7e5..6e5464f 100644
--- a/sc/source/filter/orcus/interface.cxx
+++ b/sc/source/filter/orcus/interface.cxx
@@ -118,9 +118,7 @@ void ScOrcusSheet::set_formula(
{
OUString aFormula(p, n, RTL_TEXTENCODING_UTF8);
formula::FormulaGrammar::Grammar eGrammar = getCalcGrammarFromOrcus( grammar );
-
- ScFormulaCell* pCell = new ScFormulaCell(&mrDoc, ScAddress(col, row, mnTab), aFormula, eGrammar);
- mrDoc.PutCell(col, row, mnTab, pCell);
+ mrDoc.SetFormula(ScAddress(col,row,mnTab), aFormula, eGrammar);
}
void ScOrcusSheet::set_formula_result(row_t row, col_t col, const char* p, size_t n)
@@ -153,8 +151,7 @@ void ScOrcusSheet::set_shared_formula(
maSharedFormulas.insert( std::pair<size_t, ScRangeData*>(sindex, pSharedFormula) );
ScTokenArray aArr;
aArr.AddToken( formula::FormulaIndexToken( ocName, pSharedFormula->GetIndex() ) );
- ScFormulaCell* pCell = new ScFormulaCell( &mrDoc, ScAddress( row, col, mnTab ), &aArr );
- mrDoc.PutCell( col, row, mnTab, pCell );
+ mrDoc.SetFormula(ScAddress(col,row,mnTab), aArr);
}
}
@@ -174,8 +171,7 @@ void ScOrcusSheet::set_shared_formula(
maSharedFormulas.insert( std::pair<size_t, ScRangeData*>(sindex, pSharedFormula) );
ScTokenArray aArr;
aArr.AddToken( formula::FormulaIndexToken( ocName, pSharedFormula->GetIndex() ) );
- ScFormulaCell* pCell = new ScFormulaCell( &mrDoc, ScAddress( row, col, mnTab ), &aArr );
- mrDoc.PutCell( col, row, mnTab, pCell );
+ mrDoc.SetFormula(ScAddress(col,row,mnTab), aArr);
}
}
@@ -187,8 +183,7 @@ void ScOrcusSheet::set_shared_formula(row_t row, col_t col, size_t sindex)
ScRangeData* pSharedFormula = maSharedFormulas.find(sindex)->second;
ScTokenArray aArr;
aArr.AddToken( formula::FormulaIndexToken( ocName, pSharedFormula->GetIndex() ) );
- ScFormulaCell* pCell = new ScFormulaCell( &mrDoc, ScAddress( row, col, mnTab ), &aArr );
- mrDoc.PutCell( col, row, mnTab, pCell );
+ mrDoc.SetFormula(ScAddress(col,row,mnTab), aArr);
}
void ScOrcusSheet::set_string(row_t row, col_t col, size_t sindex)
@@ -199,8 +194,7 @@ void ScOrcusSheet::set_string(row_t row, col_t col, size_t sindex)
// normal string
const OUString& rSharedString = mrSharedStrings.getByIndex(sindex);
- ScBaseCell* pCell = ScBaseCell::CreateTextCell( rSharedString, &mrDoc );
- mrDoc.PutCell(col, row, mnTab, pCell);
+ mrDoc.SetTextCell(ScAddress(col,row,mnTab), rSharedString);
}
void ScOrcusSheet::set_value(row_t row, col_t col, double value)
diff --git a/sc/source/filter/qpro/qpro.cxx b/sc/source/filter/qpro/qpro.cxx
index 2ae1f61..e292871 100644
--- a/sc/source/filter/qpro/qpro.cxx
+++ b/sc/source/filter/qpro/qpro.cxx
@@ -61,7 +61,8 @@ FltError ScQProReader::readSheet( SCTAB nTab, ScDocument* pDoc, ScQProStyle *pSt
readString( aLabel, nLen - 7 );
nStyle = nStyle >> 3;
pStyle->SetFormat( pDoc, nCol, nRow, nTab, nStyle );
- pDoc->PutCell( nCol, nRow, nTab, ScBaseCell::CreateTextCell( aLabel, pDoc ), true );
+ pDoc->EnsureTable(nTab);
+ pDoc->SetTextCell(ScAddress(nCol,nRow,nTab), aLabel);
}
else
eRet = eERR_FORMAT;
diff --git a/sc/source/filter/xml/xmlcelli.cxx b/sc/source/filter/xml/xmlcelli.cxx
index 19b9041..6d376a7 100644
--- a/sc/source/filter/xml/xmlcelli.cxx
+++ b/sc/source/filter/xml/xmlcelli.cxx
@@ -48,6 +48,7 @@
#include "editutil.hxx"
#include "cell.hxx"
#include "editattributemap.hxx"
+#include "stringutil.hxx"
#include <xmloff/xmltkmap.hxx>
#include <xmloff/xmltoken.hxx>
@@ -1024,16 +1025,22 @@ void ScXMLTableRowCellContext::PutTextCell( const ScAddress& rCurrentPos,
}
else //regular text cells
{
- ScBaseCell* pNewCell = NULL;
ScDocument* pDoc = rXMLImport.GetDocument();
if (maStringValue)
- pNewCell = ScBaseCell::CreateTextCell( *maStringValue, pDoc );
+ {
+ pDoc->SetTextCell(rCurrentPos, *maStringValue);
+ bDoIncrement = true;
+ }
else if (mbEditEngineHasText)
{
if (maFields.empty() && maFormats.empty() && mpEditEngine->GetParagraphCount() == 1)
{
// This is a normal text without format runs.
- pNewCell = new ScStringCell(mpEditEngine->GetText());
+ ScSetStringParam aParam;
+ aParam.mbDetectNumberFormat = false;
+ aParam.mbHandleApostrophe = false;
+ aParam.meSetTextNumFormat = ScSetStringParam::Always;
+ pDoc->SetString(rCurrentPos, mpEditEngine->GetText(), &aParam);
}
else
{
@@ -1055,14 +1062,17 @@ void ScXMLTableRowCellContext::PutTextCell( const ScAddress& rCurrentPos,
// is a prerequisite for using this constructor of ScEditCell.
pDoc->SetEditText(rCurrentPos, mpEditEngine->CreateTextObject());
}
+ bDoIncrement = true;
}
else if ( nCurrentCol > 0 && pOUText && !pOUText->isEmpty() )
- pNewCell = ScBaseCell::CreateTextCell( *pOUText, pDoc );
-
- bDoIncrement = pNewCell != NULL;
- if (bDoIncrement && pNewCell)
- pDoc->PutCell( rCurrentPos, pNewCell );
+ {
+ pDoc->SetTextCell(rCurrentPos, *pOUText);
+ bDoIncrement = true;
+ }
+ else
+ bDoIncrement = false;
}
+
// #i56027# This is about setting simple text, not edit cells,
// so ProgressBarIncrement must be called with bEditCell = FALSE.
// Formatted text that is put into the cell by the child context
@@ -1316,12 +1326,13 @@ void ScXMLTableRowCellContext::PutFormulaCell( const ScAddress& rCellPos )
ScFormulaCell* pFCell = static_cast<ScFormulaCell*>(pNewCell);
SetFormulaCell(pFCell);
+ pDoc->PutCell( rCellPos, pNewCell );
}
else if ( aText[0] == '\'' && aText.getLength() > 1 )
{
// for bEnglish, "'" at the beginning is always interpreted as text
// marker and stripped
- pNewCell = ScBaseCell::CreateTextCell( aText.copy( 1 ), pDoc );
+ pDoc->SetTextCell(rCellPos, aText.copy(1));
}
else
{
@@ -1329,13 +1340,12 @@ void ScXMLTableRowCellContext::PutFormulaCell( const ScAddress& rCellPos )
sal_uInt32 nEnglish = pFormatter->GetStandardIndex(LANGUAGE_ENGLISH_US);
double fVal;
if ( pFormatter->IsNumberFormat( aText, nEnglish, fVal ) )
- pNewCell = new ScValueCell( fVal );
+ pDoc->SetValue(rCellPos, fVal);
//the (english) number format will not be set
//search matching local format and apply it
else
- pNewCell = ScBaseCell::CreateTextCell( aText, pDoc );
+ pDoc->SetTextCell(rCellPos, aText);
}
- pDoc->PutCell( rCellPos, pNewCell );
}
}
diff --git a/sc/source/ui/docshell/impex.cxx b/sc/source/ui/docshell/impex.cxx
index b94146c..edc4b8f 100644
--- a/sc/source/ui/docshell/impex.cxx
+++ b/sc/source/ui/docshell/impex.cxx
@@ -981,7 +981,7 @@ static bool lcl_PutString(
pDoc->ApplyPattern(nCol, nRow, nTab, aNewAttrs);
}
- pDoc->PutCell( nCol, nRow, nTab, ScBaseCell::CreateTextCell( rStr, pDoc ) );
+ pDoc->SetTextCell(ScAddress(nCol,nRow,nTab), rStr);
return bMultiLine;
}
@@ -1183,7 +1183,9 @@ static bool lcl_PutString(
if (nFound > 5)
nFormat = pDocFormatter->GetStandardFormat( fDays, nFormat, nType, eDocLang);
- pDoc->PutCell( nCol, nRow, nTab, new ScValueCell(fDays), nFormat, false );
+ ScAddress aPos(nCol,nRow,nTab);
+ pDoc->SetValue(aPos, fDays);
+ pDoc->SetNumberFormat(aPos, nFormat);
return bMultiLine; // success
}
@@ -1780,9 +1782,9 @@ bool ScImportExport::Sylk2Doc( SvStream& rStrm )
{ // don't ignore value
if( bText )
{
- pDoc->PutCell( nCol, nRow, aRange.aStart.Tab(),
- ScBaseCell::CreateTextCell( aText, pDoc),
- true);
+ pDoc->EnsureTable(aRange.aStart.Tab());
+ pDoc->SetTextCell(
+ ScAddress(nCol, nRow, aRange.aStart.Tab()), aText);
}
else
{
More information about the Libreoffice-commits
mailing list