diff options
author | Kohei Yoshida <kohei.yoshida@gmail.com> | 2013-05-17 16:39:15 -0400 |
---|---|---|
committer | Kohei Yoshida <kohei.yoshida@gmail.com> | 2013-05-20 20:18:46 -0400 |
commit | 252a30609357a5b2691b7796cc8f3f4f1319f655 (patch) | |
tree | 0f8c23f89a8d9e3f98951dd3c6718b57fa77cd82 /sc/source/core/data/documentimport.cxx | |
parent | 430d81e1fd44f51a91b81da91504a004ab7373d8 (diff) |
Keep track of column block positions in ScDocumentImport too.
This currently only affects document import via orcus, but it'll be
good to put this in place.
Change-Id: I8cc6d54aba6fab1f2774127f92c2a764f7b690fb
Diffstat (limited to 'sc/source/core/data/documentimport.cxx')
-rw-r--r-- | sc/source/core/data/documentimport.cxx | 55 |
1 files changed, 36 insertions, 19 deletions
diff --git a/sc/source/core/data/documentimport.cxx b/sc/source/core/data/documentimport.cxx index c92688f1ada2..ced09363ccc4 100644 --- a/sc/source/core/data/documentimport.cxx +++ b/sc/source/core/data/documentimport.cxx @@ -15,24 +15,36 @@ #include "formulacell.hxx" #include "docoptio.hxx" #include "globalnames.hxx" +#include "mtvelements.hxx" -ScDocumentImport::ScDocumentImport(ScDocument& rDoc) : mrDoc(rDoc) {} -ScDocumentImport::ScDocumentImport(const ScDocumentImport& r) : mrDoc(r.mrDoc) {} +struct ScDocumentImportImpl +{ + ScDocument& mrDoc; + sc::ColumnBlockPositionSet maBlockPosSet; + + ScDocumentImportImpl(ScDocument& rDoc) : mrDoc(rDoc), maBlockPosSet(rDoc) {} +}; + +ScDocumentImport::ScDocumentImport(ScDocument& rDoc) : mpImpl(new ScDocumentImportImpl(rDoc)) {} +ScDocumentImport::~ScDocumentImport() +{ + delete mpImpl; +} ScDocument& ScDocumentImport::getDoc() { - return mrDoc; + return mpImpl->mrDoc; } const ScDocument& ScDocumentImport::getDoc() const { - return mrDoc; + return mpImpl->mrDoc; } SCTAB ScDocumentImport::getSheetIndex(const OUString& rName) const { SCTAB nTab = -1; - if (!mrDoc.GetTable(rName, nTab)) + if (!mpImpl->mrDoc.GetTable(rName, nTab)) return -1; return nTab; @@ -40,33 +52,34 @@ SCTAB ScDocumentImport::getSheetIndex(const OUString& rName) const SCTAB ScDocumentImport::getSheetCount() const { - return mrDoc.maTabs.size(); + return mpImpl->mrDoc.maTabs.size(); } bool ScDocumentImport::appendSheet(const OUString& rName) { - SCTAB nTabCount = mrDoc.maTabs.size(); + SCTAB nTabCount = mpImpl->mrDoc.maTabs.size(); if (!ValidTab(nTabCount)) return false; - mrDoc.maTabs.push_back(new ScTable(&mrDoc, nTabCount, rName)); + mpImpl->mrDoc.maTabs.push_back(new ScTable(&mpImpl->mrDoc, nTabCount, rName)); return true; } void ScDocumentImport::setOriginDate(sal_uInt16 nYear, sal_uInt16 nMonth, sal_uInt16 nDay) { - if (!mrDoc.pDocOptions) - mrDoc.pDocOptions = new ScDocOptions; + if (!mpImpl->mrDoc.pDocOptions) + mpImpl->mrDoc.pDocOptions = new ScDocOptions; - mrDoc.pDocOptions->SetDate(nDay, nMonth, nYear); + mpImpl->mrDoc.pDocOptions->SetDate(nDay, nMonth, nYear); } void ScDocumentImport::setAutoInput(const ScAddress& rPos, const OUString& rStr) { - if (!mrDoc.TableExists(rPos.Tab())) + if (!mpImpl->mrDoc.TableExists(rPos.Tab())) return; - mrDoc.maTabs[rPos.Tab()]->aCol[rPos.Col()].SetString(rPos.Row(), rPos.Tab(), rStr, mrDoc.GetAddressConvention()); + mpImpl->mrDoc.maTabs[rPos.Tab()]->aCol[rPos.Col()].SetString( + rPos.Row(), rPos.Tab(), rStr, mpImpl->mrDoc.GetAddressConvention()); } void ScDocumentImport::setNumericCell(const ScAddress& rPos, double fVal) @@ -82,18 +95,18 @@ void ScDocumentImport::setStringCell(const ScAddress& rPos, const OUString& rStr void ScDocumentImport::setFormulaCell( const ScAddress& rPos, const OUString& rFormula, formula::FormulaGrammar::Grammar eGrammar) { - insertCell(rPos, new ScFormulaCell(&mrDoc, rPos, rFormula, eGrammar)); + insertCell(rPos, new ScFormulaCell(&mpImpl->mrDoc, rPos, rFormula, eGrammar)); } void ScDocumentImport::setFormulaCell(const ScAddress& rPos, const ScTokenArray& rArray) { - insertCell(rPos, new ScFormulaCell(&mrDoc, rPos, &rArray)); + insertCell(rPos, new ScFormulaCell(&mpImpl->mrDoc, rPos, &rArray)); } void ScDocumentImport::finalize() { // Populate the text width and script type arrays in all columns. - ScDocument::TableContainer::iterator itTab = mrDoc.maTabs.begin(), itTabEnd = mrDoc.maTabs.end(); + ScDocument::TableContainer::iterator itTab = mpImpl->mrDoc.maTabs.begin(), itTabEnd = mpImpl->mrDoc.maTabs.end(); for (; itTab != itTabEnd; ++itTab) { if (!*itTab) @@ -119,14 +132,18 @@ void ScDocumentImport::finalize() void ScDocumentImport::insertCell(const ScAddress& rPos, ScBaseCell* pCell) { - if (!mrDoc.TableExists(rPos.Tab())) + if (!mpImpl->mrDoc.TableExists(rPos.Tab())) { pCell->Delete(); return; } - ScColumn& rCol = mrDoc.maTabs[rPos.Tab()]->aCol[rPos.Col()]; - rCol.SetCell(rPos.Row(), pCell); + ScColumn& rCol = mpImpl->mrDoc.maTabs[rPos.Tab()]->aCol[rPos.Col()]; + sc::ColumnBlockPosition* p = mpImpl->maBlockPosSet.getBlockPosition(rPos.Tab(), rPos.Col()); + if (p) + rCol.SetCell(*p, rPos.Row(), pCell); + else + rCol.SetCell(rPos.Row(), pCell); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |