diff options
author | David Tardon <dtardon@redhat.com> | 2012-12-18 15:24:28 +0100 |
---|---|---|
committer | David Tardon <dtardon@redhat.com> | 2012-12-19 08:03:35 +0100 |
commit | 7fec8dfcaca4efc92516f9af51a3157f1a11ccd7 (patch) | |
tree | dcbfddc0f4eac654c43055333cab6b3879d8533c /svx | |
parent | Revert "fdo#58399 - revert attempts to untangle and accelerate this mess." (diff) | |
download | core-7fec8dfcaca4efc92516f9af51a3157f1a11ccd7.tar.gz core-7fec8dfcaca4efc92516f9af51a3157f1a11ccd7.zip |
fdo#56267, fdo#56980 propagate shape change to subclasses
It turns out (as witnessed by fdo#56267) that my fix for fdo#56980 only
cured the symptom, not the cause. The real problem is caused by the
following sequence of events during ODF import:
1) an SvxCustomShape object is created (XShape iface)
2) an SdrObjCustomShape object is created for the SvxCustomShape, but it
is not associated with it (yet)
3) another SvxCustomShape object is created internally by the
SdrObjCustomShape and they are associated
4) an EnhancedCustomShapeEngine is created for this SvxCustomShape by
SdrObjCustomShape
5) the SvxCustomShape from point 1 is set to the SdrObjCustomShape
At some point (I did not follow this explicitly) the SvxCustomShape
cached by the EnhancedCustomShapeEngine loses its (weak) reference to
the SdrObjCustomShape. This leaves it gutted and all subsequent calls to
render() return an empty XShape.
The solution is simple: let SdrObjCustomShape know that the associated
UNO shape has changed, so it can drop the custom shape engine.
Change-Id: I267838ea4857dfcd646f40c811f3ae572237a1e6
Diffstat (limited to 'svx')
-rw-r--r-- | svx/inc/svx/svdoashp.hxx | 1 | ||||
-rw-r--r-- | svx/inc/svx/svdobj.hxx | 21 | ||||
-rw-r--r-- | svx/source/svdraw/svdoashp.cxx | 10 |
3 files changed, 29 insertions, 3 deletions
diff --git a/svx/inc/svx/svdoashp.hxx b/svx/inc/svx/svdoashp.hxx index 987132f9b7a5..aae1f51df7f2 100644 --- a/svx/inc/svx/svdoashp.hxx +++ b/svx/inc/svx/svdoashp.hxx @@ -83,6 +83,7 @@ private: protected: virtual sdr::contact::ViewContact* CreateObjectSpecificViewContact(); + virtual void impl_setUnoShape(const com::sun::star::uno::Reference<com::sun::star::uno::XInterface>& rxUnoShape); public: virtual sdr::properties::BaseProperties* CreateObjectSpecificProperties(); diff --git a/svx/inc/svx/svdobj.hxx b/svx/inc/svx/svdobj.hxx index 656a218237fe..8241ed461e52 100644 --- a/svx/inc/svx/svdobj.hxx +++ b/svx/inc/svx/svdobj.hxx @@ -989,7 +989,14 @@ public: static SdrObject* getSdrObjectFromXShape( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& xInt ); - // setting the UNO representation is allowed for the UNO representation itself only! + /** Sets a new UNO representation of the shape + * + * This is only a public interface function. The actual work is + * done by impl_setUnoShape(). + * + * Calling this function is only allowed for the UNO representation + * itself! + */ void setUnoShape( const com::sun::star::uno::Reference< com::sun::star::uno::XInterface>& _rxUnoShape); @@ -1045,7 +1052,17 @@ public: void SetBLIPSizeRectangle( const Rectangle& aRect ); protected: - void impl_setUnoShape( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _rxUnoShape ); + /** Sets a new UNO shape + * + * The default implementation of this function sets the new UNO + * shape. Derived classes should override the function to handle + * any other actions that are needed when the shape is being + * changed. + * + * The implementation _must_ call the same method of its parent + * class (preferably as the first step)! + */ + virtual void impl_setUnoShape( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _rxUnoShape ); /** Helper function for reimplementing Clone(). diff --git a/svx/source/svdraw/svdoashp.cxx b/svx/source/svdraw/svdoashp.cxx index 61b9002253f9..68ca86189030 100644 --- a/svx/source/svdraw/svdoashp.cxx +++ b/svx/source/svdraw/svdoashp.cxx @@ -3211,9 +3211,17 @@ bool SdrObjCustomShape::doConstructOrthogonal(const ::rtl::OUString& rName) void SdrObjCustomShape::InvalidateRenderGeometry() { mXRenderedCustomShape = 0L; - mxCustomShapeEngine = 0L; SdrObject::Free( mpLastShadowGeometry ); mpLastShadowGeometry = 0L; } +void SdrObjCustomShape::impl_setUnoShape(const uno::Reference<uno::XInterface>& rxUnoShape) +{ + SdrTextObj::impl_setUnoShape(rxUnoShape); + + // The shape engine is created with _current_ shape. This means we + // _must_ reset it when the shape changes. + mxCustomShapeEngine.set(0); +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |