summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKohei Yoshida <kohei.yoshida@gmail.com>2013-05-16 13:52:33 -0400
committerKohei Yoshida <kohei.yoshida@gmail.com>2013-05-20 20:13:08 -0400
commit4da9bf8086c90f0b0b4394cd6578da1405ca3e8d (patch)
tree85adb4c32012f1e65de7b5be258c2784a9ec7fae
parentc232a8c4723e1a948fbeef2f7ea9486658191eeb (diff)
Cleaned up a bit to remove the need to initialize the block positions.
Change-Id: Iad2e69e4eb61167ad85581a83b19e3798c5edfd0
-rw-r--r--sc/inc/clipcontext.hxx10
-rw-r--r--sc/source/core/data/clipcontext.cxx65
-rw-r--r--sc/source/core/data/document.cxx19
3 files changed, 32 insertions, 62 deletions
diff --git a/sc/inc/clipcontext.hxx b/sc/inc/clipcontext.hxx
index 8b1f26194316..53f2110e9c58 100644
--- a/sc/inc/clipcontext.hxx
+++ b/sc/inc/clipcontext.hxx
@@ -27,6 +27,8 @@ class CopyFromClipContext
TablesType maTables;
+ ScDocument& mrDoc;
+
ScDocument* mpRefUndoDoc;
ScDocument* mpClipDoc;
sal_uInt16 mnInsertFlag;
@@ -36,16 +38,16 @@ class CopyFromClipContext
bool mbSkipAttrForEmptyCells:1;
CopyFromClipContext(); // disabled
+
public:
- CopyFromClipContext(
+ CopyFromClipContext(ScDocument& rDoc,
ScDocument* pRefUndoDoc, ScDocument* pClipDoc, sal_uInt16 nInsertFlag,
bool bAsLink, bool bSkipAttrForEmptyCells);
- bool initBlockPositions(ScDocument& rDoc, SCCOL nCol1, SCCOL nCol2);
- void setTabRange(SCTAB nStart, SCTAB nEnd);
-
~CopyFromClipContext();
+ void setTabRange(SCTAB nStart, SCTAB nEnd);
+
ColumnBlockPosition* getBlockPosition(SCTAB nTab, SCCOL nCol);
ScDocument* getUndoDoc();
diff --git a/sc/source/core/data/clipcontext.cxx b/sc/source/core/data/clipcontext.cxx
index e3e66a212910..1d19dd1258d1 100644
--- a/sc/source/core/data/clipcontext.cxx
+++ b/sc/source/core/data/clipcontext.cxx
@@ -12,9 +12,10 @@
namespace sc {
-CopyFromClipContext::CopyFromClipContext(
+CopyFromClipContext::CopyFromClipContext(ScDocument& rDoc,
ScDocument* pRefUndoDoc, ScDocument* pClipDoc, sal_uInt16 nInsertFlag,
bool bAsLink, bool bSkipAttrForEmptyCells) :
+ mrDoc(rDoc),
mpRefUndoDoc(pRefUndoDoc), mpClipDoc(pClipDoc), mnInsertFlag(nInsertFlag),
mnTabStart(-1), mnTabEnd(-1),
mbAsLink(bAsLink), mbSkipAttrForEmptyCells(bSkipAttrForEmptyCells) {}
@@ -23,44 +24,6 @@ CopyFromClipContext::~CopyFromClipContext()
{
}
-bool CopyFromClipContext::initBlockPositions(ScDocument& rDoc, SCCOL nCol1, SCCOL nCol2)
-{
- if (mnTabStart < 0 || mnTabEnd < 0 || mnTabStart > mnTabEnd)
- return false;
-
- size_t nSize = mnTabEnd - mnTabStart + 1;
- if (maTables.size() < nSize)
- maTables.resize(nSize);
-
- for (size_t i = 0; i < nSize; ++i)
- {
- SCTAB nTab = i + mnTabStart;
- ColumnsType& rCols = maTables[i];
- for (SCCOL nCol = nCol1; nCol <= nCol2; ++nCol)
- {
- ColumnsType::iterator it = rCols.find(nCol);
- if (it != rCols.end())
- // This column has already been initialized. Skip it.
- continue;
-
- std::pair<ColumnsType::iterator,bool> r =
- rCols.insert(
- ColumnsType::value_type(nCol, ColumnBlockPosition()));
-
- if (!r.second)
- // insertion failed.
- return false;
-
- it = r.first;
-
- if (!rDoc.InitColumnBlockPosition(it->second, nTab, nCol))
- return false;
- }
- }
-
- return true;
-}
-
void CopyFromClipContext::setTabRange(SCTAB nStart, SCTAB nEnd)
{
mnTabStart = nStart;
@@ -69,14 +32,34 @@ void CopyFromClipContext::setTabRange(SCTAB nStart, SCTAB nEnd)
ColumnBlockPosition* CopyFromClipContext::getBlockPosition(SCTAB nTab, SCCOL nCol)
{
+ if (mnTabStart < 0 || mnTabEnd < 0 || mnTabStart > mnTabEnd)
+ return NULL;
+
size_t nTabIndex = nTab - mnTabStart;
if (nTabIndex >= maTables.size())
- return NULL;
+ maTables.resize(nTabIndex+1);
ColumnsType& rCols = maTables[nTabIndex];
+
ColumnsType::iterator it = rCols.find(nCol);
+ if (it != rCols.end())
+ // Block position for this column has already been fetched.
+ return &it->second;
+
+ std::pair<ColumnsType::iterator,bool> r =
+ rCols.insert(
+ ColumnsType::value_type(nCol, ColumnBlockPosition()));
+
+ if (!r.second)
+ // insertion failed.
+ return NULL;
+
+ it = r.first;
+
+ if (!mrDoc.InitColumnBlockPosition(it->second, nTab, nCol))
+ return NULL;
- return it == rCols.end() ? NULL : &it->second;
+ return &it->second;
}
ScDocument* CopyFromClipContext::getUndoDoc()
diff --git a/sc/source/core/data/document.cxx b/sc/source/core/data/document.cxx
index ad0afc3751de..8727e748ca45 100644
--- a/sc/source/core/data/document.cxx
+++ b/sc/source/core/data/document.cxx
@@ -2519,7 +2519,7 @@ void ScDocument::CopyFromClip( const ScRange& rDestRange, const ScMarkData& rMar
if ( ( nInsFlag & IDF_ATTRIB ) && !bSkipAttrForEmpty )
nDelFlag |= IDF_ATTRIB;
- sc::CopyFromClipContext aCxt(pRefUndoDoc, pClipDoc, nInsFlag, bAsLink, bSkipAttrForEmpty);
+ sc::CopyFromClipContext aCxt(*this, pRefUndoDoc, pClipDoc, nInsFlag, bAsLink, bSkipAttrForEmpty);
std::pair<SCTAB,SCTAB> aTabRanges = getMarkedTableRange(maTabs, rMark);
aCxt.setTabRange(aTabRanges.first, aTabRanges.second);
@@ -2530,18 +2530,6 @@ void ScDocument::CopyFromClip( const ScRange& rDestRange, const ScMarkData& rMar
pDestRanges = &aLocalRangeList;
}
- // Initialize column block positions first.
- for (size_t nRange = 0; nRange < pDestRanges->size(); ++nRange)
- {
- const ScRange* pRange = (*pDestRanges)[nRange];
- SCCOL nCol1 = pRange->aStart.Col();
- SCCOL nCol2 = pRange->aEnd.Col();
-
- if (!aCxt.initBlockPositions(*this, nCol1, nCol2))
- // Initialization failed!
- return;
- }
-
bInsertingFromOtherDoc = true; // kein Broadcast/Listener aufbauen bei Insert
SCCOL nClipStartCol = aClipRange.aStart.Col();
@@ -2650,7 +2638,7 @@ void ScDocument::CopyMultiRangeFromClip(
SCROW nRow1 = rDestPos.Row();
ScClipParam& rClipParam = pClipDoc->GetClipParam();
- sc::CopyFromClipContext aCxt(NULL, pClipDoc, nInsFlag, bAsLink, bSkipAttrForEmpty);
+ sc::CopyFromClipContext aCxt(*this, NULL, pClipDoc, nInsFlag, bAsLink, bSkipAttrForEmpty);
std::pair<SCTAB,SCTAB> aTabRanges = getMarkedTableRange(maTabs, rMark);
aCxt.setTabRange(aTabRanges.first, aTabRanges.second);
@@ -2675,9 +2663,6 @@ void ScDocument::CopyMultiRangeFromClip(
SCsROW nDy = static_cast<SCsROW>(nBegRow - p->aStart.Row());
SCCOL nCol2 = nCol1 + p->aEnd.Col() - p->aStart.Col();
- if (!aCxt.initBlockPositions(*this, nCol1, nCol2))
- return;
-
SCROW nEndRow = lcl_getLastNonFilteredRow(rFlags, nBegRow, nLastMarkedRow, nRowCount);
if (!bSkipAttrForEmpty)