summaryrefslogtreecommitdiff
path: root/svx/source/table
diff options
context:
space:
mode:
authorDavid Tardon <dtardon@redhat.com>2013-03-22 16:49:41 +0100
committerDavid Tardon <dtardon@redhat.com>2013-03-23 08:09:44 +0100
commit91864e19c84ae9834d6e97ee5ddc4db5bf957681 (patch)
tree4cb75ff52dd6d760d68315b03c2ea538f3949b84 /svx/source/table
parente3ad376f601d3abfc1b9e47dc0419d52785bd9b9 (diff)
rhbz#876742 speed up table manipulation in Impress
It turns out this is not actually a performance problem but an oversight in implementation (or a bug, if you want .-) Every manipulation with a table (e.g., move, resize; actually even a selection of the table) leads to creation of a full copy of the table (SdrObject::getFullDragClone()). One of the actions the table copy impl. does is to call sdr::CellProperties::SetStyleSheet() on every cell of the new table. CellProperties is derived from sdr::properties::TextProperties and CellProperties::SetStyleSheet() just passes the call to TextProperties::SetStyleSheet(). This is where the trouble begins :-) The SDR representation of a table, SdrTableObj, is derived from SdrTextObj. Because of that, SdrTextObj needs to be able to contain more than one SdrText (because a table needs one for every cell). This is handled correctly by TextProperties. But, because there is no SDR representation of a single cell, CellProperties uses the SdrTableObj as the SDR object it works on. Therefore TextProperties::SetStyleSheet() processes all SdrText objects of the _whole table_, not just a single cell. And this is repeated for every other cell... Change-Id: Iab2e2d0e1e8038710645c0bd24666e6032b0a003
Diffstat (limited to 'svx/source/table')
-rw-r--r--svx/source/table/cell.cxx52
1 files changed, 52 insertions, 0 deletions
diff --git a/svx/source/table/cell.cxx b/svx/source/table/cell.cxx
index e46b4865fb50..3a33a282b9ec 100644
--- a/svx/source/table/cell.cxx
+++ b/svx/source/table/cell.cxx
@@ -99,6 +99,46 @@ static const SvxItemPropertySet* ImplGetSvxCellPropertySet()
return &aSvxCellPropertySet;
}
+namespace
+{
+
+class CellTextProvider : public svx::ITextProvider
+{
+public:
+ explicit CellTextProvider(const sdr::table::CellRef xCell);
+ virtual ~CellTextProvider();
+
+private:
+ virtual sal_Int32 getTextCount() const;
+ virtual SdrText* getText(sal_Int32 nIndex) const;
+
+private:
+ const sdr::table::CellRef m_xCell;
+};
+
+CellTextProvider::CellTextProvider(const sdr::table::CellRef xCell)
+ : m_xCell(xCell)
+{
+}
+
+CellTextProvider::~CellTextProvider()
+{
+}
+
+sal_Int32 CellTextProvider::getTextCount() const
+{
+ return 1;
+}
+
+SdrText* CellTextProvider::getText(sal_Int32 nIndex) const
+{
+ (void) nIndex;
+ assert(nIndex == 0);
+ return m_xCell.get();
+}
+
+}
+
namespace sdr
{
namespace properties
@@ -109,6 +149,8 @@ namespace sdr
// create a new itemset
SfxItemSet& CreateObjectSpecificItemSet(SfxItemPool& rPool);
+ const svx::ITextProvider& getTextProvider() const;
+
public:
// basic constructor
CellProperties(SdrObject& rObj, sdr::table::Cell* pCell );
@@ -131,6 +173,9 @@ namespace sdr
void SetStyleSheet(SfxStyleSheet* pNewStyleSheet, sal_Bool bDontRemoveHardAttr);
sdr::table::CellRef mxCell;
+
+ private:
+ const CellTextProvider maTextProvider;
};
// create a new itemset
@@ -153,15 +198,22 @@ namespace sdr
0, 0));
}
+ const svx::ITextProvider& CellProperties::getTextProvider() const
+ {
+ return maTextProvider;
+ }
+
CellProperties::CellProperties(SdrObject& rObj, sdr::table::Cell* pCell)
: TextProperties(rObj)
, mxCell(pCell)
+ , maTextProvider(mxCell)
{
}
CellProperties::CellProperties(const CellProperties& rProps, SdrObject& rObj, sdr::table::Cell* pCell)
: TextProperties(rProps, rObj)
, mxCell( pCell )
+ , maTextProvider(mxCell)
{
}