summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKohei Yoshida <kohei.yoshida@gmail.com>2013-05-16 23:59:42 -0400
committerKohei Yoshida <kohei.yoshida@gmail.com>2013-05-20 20:13:09 -0400
commit11a164f0ac81f4cff4b2698e1fc114ce7e4737df (patch)
tree93d747bd93c6c900e24dc11ae1420decd976d0cc
parentGet the script type in an efficient manner. (diff)
downloadcore-11a164f0ac81f4cff4b2698e1fc114ce7e4737df.tar.gz
core-11a164f0ac81f4cff4b2698e1fc114ce7e4737df.zip
Do the same optimization for CopyToClip.
The basic idea is the same as the one I did for CopyFromClip. This prevents the O(n^2) algorithm from being invoked during undo object creation. Change-Id: Iac46663b0c25db2f00ffa3ab95a4dcf2857252ce
-rw-r--r--sc/inc/clipcontext.hxx37
-rw-r--r--sc/inc/column.hxx3
-rw-r--r--sc/inc/table.hxx9
-rw-r--r--sc/source/core/data/clipcontext.cxx51
-rw-r--r--sc/source/core/data/column.cxx10
-rw-r--r--sc/source/core/data/document.cxx8
-rw-r--r--sc/source/core/data/table2.cxx14
7 files changed, 84 insertions, 48 deletions
diff --git a/sc/inc/clipcontext.hxx b/sc/inc/clipcontext.hxx
index 53f2110e9c58..e28d265df47d 100644
--- a/sc/inc/clipcontext.hxx
+++ b/sc/inc/clipcontext.hxx
@@ -20,20 +20,34 @@ class ScDocument;
namespace sc {
-class CopyFromClipContext
+class ClipContextBase
{
typedef boost::unordered_map<SCCOL, ColumnBlockPosition> ColumnsType;
typedef std::vector<ColumnsType> TablesType;
+ ScDocument& mrDoc;
TablesType maTables;
+ SCTAB mnTabStart;
+ SCTAB mnTabEnd;
- ScDocument& mrDoc;
+public:
+ ClipContextBase(ScDocument& rDoc);
+ virtual ~ClipContextBase();
+
+ void setTabRange(SCTAB nStart, SCTAB nEnd);
+
+ SCTAB getTabStart() const;
+ SCTAB getTabEnd() const;
+
+ ColumnBlockPosition* getBlockPosition(SCTAB nTab, SCCOL nCol);
+};
+
+class CopyFromClipContext : public ClipContextBase
+{
ScDocument* mpRefUndoDoc;
ScDocument* mpClipDoc;
sal_uInt16 mnInsertFlag;
- SCTAB mnTabStart;
- SCTAB mnTabEnd;
bool mbAsLink:1;
bool mbSkipAttrForEmptyCells:1;
@@ -44,21 +58,22 @@ public:
ScDocument* pRefUndoDoc, ScDocument* pClipDoc, sal_uInt16 nInsertFlag,
bool bAsLink, bool bSkipAttrForEmptyCells);
- ~CopyFromClipContext();
-
- void setTabRange(SCTAB nStart, SCTAB nEnd);
-
- ColumnBlockPosition* getBlockPosition(SCTAB nTab, SCCOL nCol);
+ virtual ~CopyFromClipContext();
ScDocument* getUndoDoc();
ScDocument* getClipDoc();
sal_uInt16 getInsertFlag() const;
- SCTAB getTabStart() const;
- SCTAB getTabEnd() const;
bool isAsLink() const;
bool isSkipAttrForEmptyCells() const;
};
+class CopyToClipContext : public ClipContextBase
+{
+public:
+ CopyToClipContext(ScDocument& rDoc);
+ virtual ~CopyToClipContext();
+};
+
}
#endif
diff --git a/sc/inc/column.hxx b/sc/inc/column.hxx
index f1584b11f837..0eab575d6cb5 100644
--- a/sc/inc/column.hxx
+++ b/sc/inc/column.hxx
@@ -39,6 +39,7 @@ namespace sc {
struct FormulaGroupContext;
class EndListeningContext;
class CopyFromClipContext;
+ class CopyToClipContext;
struct ColumnBlockPosition;
}
@@ -215,7 +216,7 @@ public:
void InsertRow( SCROW nStartRow, SCSIZE nSize );
void DeleteRow( SCROW nStartRow, SCSIZE nSize );
void DeleteArea(SCROW nStartRow, SCROW nEndRow, sal_uInt16 nDelFlag );
- void CopyToClip(SCROW nRow1, SCROW nRow2, ScColumn& rColumn, bool bKeepScenarioFlags) const;
+ void CopyToClip( sc::CopyToClipContext& rCxt, SCROW nRow1, SCROW nRow2, ScColumn& rColumn, bool bKeepScenarioFlags ) const;
void CopyStaticToDocument(SCROW nRow1, SCROW nRow2, ScColumn& rDestCol);
void CopyCellToDocument( SCROW nSrcRow, SCROW nDestRow, ScColumn& rDestCol );
bool InitBlockPosition( sc::ColumnBlockPosition& rBlockPos );
diff --git a/sc/inc/table.hxx b/sc/inc/table.hxx
index 333eb9ae7e87..2538a0b5822d 100644
--- a/sc/inc/table.hxx
+++ b/sc/inc/table.hxx
@@ -51,6 +51,7 @@ namespace sc {
struct FormulaGroupContext;
class EndListeningContext;
class CopyFromClipContext;
+ class CopyToClipContext;
struct ColumnBlockPosition;
}
@@ -379,10 +380,10 @@ public:
bool* pUndoOutline = NULL );
void DeleteArea(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, sal_uInt16 nDelFlag);
- void CopyToClip(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, ScTable* pTable,
- bool bKeepScenarioFlags, bool bCloneNoteCaptions);
- void CopyToClip(const ScRangeList& rRanges, ScTable* pTable,
- bool bKeepScenarioFlags, bool bCloneNoteCaptions);
+ void CopyToClip( sc::CopyToClipContext& rCxt, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, ScTable* pTable,
+ bool bKeepScenarioFlags, bool bCloneNoteCaptions );
+ void CopyToClip( sc::CopyToClipContext& rCxt, const ScRangeList& rRanges, ScTable* pTable,
+ bool bKeepScenarioFlags, bool bCloneNoteCaptions );
void CopyStaticToDocument(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, ScTable* pDestTab);
void CopyCellToDocument( SCCOL nSrcCol, SCROW nSrcRow, SCCOL nDestCol, SCROW nDestRow, ScTable& rDestTab );
diff --git a/sc/source/core/data/clipcontext.cxx b/sc/source/core/data/clipcontext.cxx
index 1d19dd1258d1..e3db67d58797 100644
--- a/sc/source/core/data/clipcontext.cxx
+++ b/sc/source/core/data/clipcontext.cxx
@@ -12,25 +12,28 @@
namespace sc {
-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) {}
+ClipContextBase::ClipContextBase(ScDocument& rDoc) :
+ mrDoc(rDoc), mnTabStart(-1), mnTabEnd(-1) {}
-CopyFromClipContext::~CopyFromClipContext()
-{
-}
+ClipContextBase::~ClipContextBase() {}
-void CopyFromClipContext::setTabRange(SCTAB nStart, SCTAB nEnd)
+void ClipContextBase::setTabRange(SCTAB nStart, SCTAB nEnd)
{
mnTabStart = nStart;
mnTabEnd = nEnd;
}
-ColumnBlockPosition* CopyFromClipContext::getBlockPosition(SCTAB nTab, SCCOL nCol)
+SCTAB ClipContextBase::getTabStart() const
+{
+ return mnTabStart;
+}
+
+SCTAB ClipContextBase::getTabEnd() const
+{
+ return mnTabEnd;
+}
+
+ColumnBlockPosition* ClipContextBase::getBlockPosition(SCTAB nTab, SCCOL nCol)
{
if (mnTabStart < 0 || mnTabEnd < 0 || mnTabStart > mnTabEnd)
return NULL;
@@ -62,6 +65,17 @@ ColumnBlockPosition* CopyFromClipContext::getBlockPosition(SCTAB nTab, SCCOL nCo
return &it->second;
}
+CopyFromClipContext::CopyFromClipContext(ScDocument& rDoc,
+ ScDocument* pRefUndoDoc, ScDocument* pClipDoc, sal_uInt16 nInsertFlag,
+ bool bAsLink, bool bSkipAttrForEmptyCells) :
+ ClipContextBase(rDoc),
+ mpRefUndoDoc(pRefUndoDoc), mpClipDoc(pClipDoc), mnInsertFlag(nInsertFlag),
+ mbAsLink(bAsLink), mbSkipAttrForEmptyCells(bSkipAttrForEmptyCells) {}
+
+CopyFromClipContext::~CopyFromClipContext()
+{
+}
+
ScDocument* CopyFromClipContext::getUndoDoc()
{
return mpRefUndoDoc;
@@ -77,16 +91,6 @@ sal_uInt16 CopyFromClipContext::getInsertFlag() const
return mnInsertFlag;
}
-SCTAB CopyFromClipContext::getTabStart() const
-{
- return mnTabStart;
-}
-
-SCTAB CopyFromClipContext::getTabEnd() const
-{
- return mnTabEnd;
-}
-
bool CopyFromClipContext::isAsLink() const
{
return mbAsLink;
@@ -97,6 +101,9 @@ bool CopyFromClipContext::isSkipAttrForEmptyCells() const
return mbSkipAttrForEmptyCells;
}
+CopyToClipContext::CopyToClipContext(ScDocument& rDoc) : ClipContextBase(rDoc) {}
+CopyToClipContext::~CopyToClipContext() {}
+
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/core/data/column.cxx b/sc/source/core/data/column.cxx
index 77bf89a87bfb..655918b58e08 100644
--- a/sc/source/core/data/column.cxx
+++ b/sc/source/core/data/column.cxx
@@ -34,6 +34,7 @@
#include "cellvalue.hxx"
#include "tokenarray.hxx"
#include "cellform.hxx"
+#include "clipcontext.hxx"
#include <svl/poolcach.hxx>
#include <svl/zforlist.hxx>
@@ -1183,7 +1184,8 @@ void ScColumn::InsertRow( SCROW nStartRow, SCSIZE nSize )
}
-void ScColumn::CopyToClip(SCROW nRow1, SCROW nRow2, ScColumn& rColumn, bool bKeepScenarioFlags) const
+void ScColumn::CopyToClip(
+ sc::CopyToClipContext& rCxt, SCROW nRow1, SCROW nRow2, ScColumn& rColumn, bool bKeepScenarioFlags) const
{
pAttrArray->CopyArea( nRow1, nRow2, 0, *rColumn.pAttrArray,
bKeepScenarioFlags ? (SC_MF_ALL & ~SC_MF_SCENARIO) : SC_MF_ALL );
@@ -1219,7 +1221,11 @@ void ScColumn::CopyToClip(SCROW nRow1, SCROW nRow2, ScColumn& rColumn, bool bKee
aOwnPos.SetRow( maItems[i].nRow );
aDestPos.SetRow( maItems[i].nRow );
ScBaseCell* pNewCell = maItems[i].pCell->Clone( *rColumn.pDocument, aDestPos, SC_CLONECELL_DEFAULT );
- rColumn.Append( aDestPos.Row(), pNewCell );
+ sc::ColumnBlockPosition* p = rCxt.getBlockPosition(rColumn.nTab, rColumn.nCol);
+ if (p)
+ rColumn.Append(*p, aDestPos.Row(), pNewCell);
+ else
+ rColumn.Append(aDestPos.Row(), pNewCell);
}
}
}
diff --git a/sc/source/core/data/document.cxx b/sc/source/core/data/document.cxx
index 8727e748ca45..4ba787fdda36 100644
--- a/sc/source/core/data/document.cxx
+++ b/sc/source/core/data/document.cxx
@@ -1995,6 +1995,8 @@ void ScDocument::CopyToClip(const ScClipParam& rClipParam,
else
pClipDoc->ResetClip(this, pMarks);
+ sc::CopyToClipContext aCxt(*pClipDoc);
+ aCxt.setTabRange(i, nEndTab-1);
CopyRangeNamesToClip(pClipDoc, aClipRange, pMarks, bAllTabs);
for ( ; i < nEndTab; ++i)
@@ -2005,7 +2007,7 @@ void ScDocument::CopyToClip(const ScClipParam& rClipParam,
if ( !bUseRangeForVBA && ( pMarks && !pMarks->GetTableSelect(i) ) )
continue;
- maTabs[i]->CopyToClip(rClipParam.maRanges, pClipDoc->maTabs[i], bKeepScenarioFlags, bCloneNoteCaptions);
+ maTabs[i]->CopyToClip(aCxt, rClipParam.maRanges, pClipDoc->maTabs[i], bKeepScenarioFlags, bCloneNoteCaptions);
if (pDrawLayer && bIncludeObjects)
{
@@ -2091,9 +2093,11 @@ void ScDocument::CopyTabToClip(SCCOL nCol1, SCROW nRow1,
rClipParam.maRanges.Append(ScRange(nCol1, nRow1, 0, nCol2, nRow2, 0));
pClipDoc->ResetClip( this, nTab );
+ sc::CopyToClipContext aCxt(*pClipDoc);
+ aCxt.setTabRange(nTab, nTab);
if (nTab < static_cast<SCTAB>(maTabs.size()) && nTab < static_cast<SCTAB>(pClipDoc->maTabs.size()))
if (maTabs[nTab] && pClipDoc->maTabs[nTab])
- maTabs[nTab]->CopyToClip(nCol1, nRow1, nCol2, nRow2, pClipDoc->maTabs[nTab], false, true);
+ maTabs[nTab]->CopyToClip(aCxt, nCol1, nRow1, nCol2, nRow2, pClipDoc->maTabs[nTab], false, true);
pClipDoc->GetClipParam().mbCutMode = false;
}
diff --git a/sc/source/core/data/table2.cxx b/sc/source/core/data/table2.cxx
index 7f620dd206ce..e8d510f91e99 100644
--- a/sc/source/core/data/table2.cxx
+++ b/sc/source/core/data/table2.cxx
@@ -604,8 +604,9 @@ void ScTable::DeleteSelection( sal_uInt16 nDelFlag, const ScMarkData& rMark )
// pTable = Clipboard
-void ScTable::CopyToClip(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2,
- ScTable* pTable, bool bKeepScenarioFlags, bool bCloneNoteCaptions)
+void ScTable::CopyToClip(
+ sc::CopyToClipContext& rCxt, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2,
+ ScTable* pTable, bool bKeepScenarioFlags, bool bCloneNoteCaptions )
{
if (ValidColRow(nCol1, nRow1) && ValidColRow(nCol2, nRow2))
{
@@ -620,7 +621,7 @@ void ScTable::CopyToClip(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2,
SCCOL i;
for ( i = nCol1; i <= nCol2; i++)
- aCol[i].CopyToClip(nRow1, nRow2, pTable->aCol[i], bKeepScenarioFlags);
+ aCol[i].CopyToClip(rCxt, nRow1, nRow2, pTable->aCol[i], bKeepScenarioFlags);
// copy widths/heights, and only "hidden", "filtered" and "manual" flags
// also for all preceding columns/rows, to have valid positions for drawing objects
@@ -654,14 +655,15 @@ void ScTable::CopyToClip(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2,
}
}
-void ScTable::CopyToClip(const ScRangeList& rRanges, ScTable* pTable,
- bool bKeepScenarioFlags, bool bCloneNoteCaptions)
+void ScTable::CopyToClip(
+ sc::CopyToClipContext& rCxt, const ScRangeList& rRanges, ScTable* pTable,
+ bool bKeepScenarioFlags, bool bCloneNoteCaptions )
{
ScRangeList aRanges(rRanges);
for ( size_t i = 0, nListSize = aRanges.size(); i < nListSize; ++i )
{
ScRange* p = aRanges[ i ];
- CopyToClip(p->aStart.Col(), p->aStart.Row(), p->aEnd.Col(), p->aEnd.Row(),
+ CopyToClip(rCxt, p->aStart.Col(), p->aStart.Row(), p->aEnd.Col(), p->aEnd.Row(),
pTable, bKeepScenarioFlags, bCloneNoteCaptions);
}
}