diff options
author | Luboš Luňák <l.lunak@suse.cz> | 2011-03-25 17:33:24 +0100 |
---|---|---|
committer | Luboš Luňák <l.lunak@suse.cz> | 2011-03-25 17:33:24 +0100 |
commit | b95a6c26809b1fa18bde2596594b5079ae41a48f (patch) | |
tree | 65f1bad80db294e7febbb34d5bfb687d82f7680f /svx/inc | |
parent | a99622adb690c8850162bb2f3302516f9630c622 (diff) |
more sensible SdrObject::Clone() and SdrObject::operator=()
Virtual operator=() is IMO pointless, and especially in a class hierarchy
like SdrObject it's pretty unlikely one could reasonably assign any
SdrObject-based object to any other one. Moreover, it was actually
only used in Clone(), which was almost never reimplemented, so the
more sensible choice is to have non-virtual operator= and virtual
Clone() always being reimplemented and using that.
This commit also fixes various smaller or bigger, er, interesting
details in the various operator= implementations.
Diffstat (limited to 'svx/inc')
-rwxr-xr-x | svx/inc/svx/cube3d.hxx | 2 | ||||
-rwxr-xr-x | svx/inc/svx/extrud3d.hxx | 2 | ||||
-rwxr-xr-x | svx/inc/svx/lathe3d.hxx | 2 | ||||
-rwxr-xr-x | svx/inc/svx/obj3d.hxx | 6 | ||||
-rwxr-xr-x | svx/inc/svx/polygn3d.hxx | 2 | ||||
-rwxr-xr-x | svx/inc/svx/polysc3d.hxx | 1 | ||||
-rwxr-xr-x | svx/inc/svx/scene3d.hxx | 3 | ||||
-rwxr-xr-x | svx/inc/svx/sphere3d.hxx | 2 | ||||
-rwxr-xr-x | svx/inc/svx/svdoashp.hxx | 3 | ||||
-rwxr-xr-x | svx/inc/svx/svdobj.hxx | 26 | ||||
-rwxr-xr-x | svx/inc/svx/svdocapt.hxx | 2 | ||||
-rwxr-xr-x | svx/inc/svx/svdocirc.hxx | 2 | ||||
-rwxr-xr-x | svx/inc/svx/svdoedge.hxx | 3 | ||||
-rwxr-xr-x | svx/inc/svx/svdograf.hxx | 3 | ||||
-rwxr-xr-x | svx/inc/svx/svdogrp.hxx | 3 | ||||
-rwxr-xr-x | svx/inc/svx/svdomeas.hxx | 2 | ||||
-rwxr-xr-x | svx/inc/svx/svdomedia.hxx | 3 | ||||
-rwxr-xr-x | svx/inc/svx/svdoole2.hxx | 3 | ||||
-rwxr-xr-x | svx/inc/svx/svdopage.hxx | 3 | ||||
-rwxr-xr-x | svx/inc/svx/svdopath.hxx | 3 | ||||
-rwxr-xr-x | svx/inc/svx/svdorect.hxx | 2 | ||||
-rwxr-xr-x | svx/inc/svx/svdotable.hxx | 3 | ||||
-rwxr-xr-x | svx/inc/svx/svdotext.hxx | 3 | ||||
-rwxr-xr-x | svx/inc/svx/svdouno.hxx | 3 | ||||
-rwxr-xr-x | svx/inc/svx/svdovirt.hxx | 4 | ||||
-rwxr-xr-x | svx/inc/svx/svdpage.hxx | 2 |
26 files changed, 64 insertions, 29 deletions
diff --git a/svx/inc/svx/cube3d.hxx b/svx/inc/svx/cube3d.hxx index c3aca2e648..c748c7a8ee 100755 --- a/svx/inc/svx/cube3d.hxx +++ b/svx/inc/svx/cube3d.hxx @@ -73,7 +73,7 @@ public: virtual sal_uInt16 GetObjIdentifier() const; virtual SdrObject* DoConvertToPolyObj(sal_Bool bBezier) const; - virtual void operator=(const SdrObject&); + virtual E3dCubeObj* Clone() const; // Set local parameters with geometry recreation void SetCubePos(const basegfx::B3DPoint& rNew); diff --git a/svx/inc/svx/extrud3d.hxx b/svx/inc/svx/extrud3d.hxx index 0df8d1eac5..6cd65bb2e0 100755 --- a/svx/inc/svx/extrud3d.hxx +++ b/svx/inc/svx/extrud3d.hxx @@ -92,7 +92,7 @@ public: virtual sal_uInt16 GetObjIdentifier() const; - virtual void operator=(const SdrObject&); + virtual E3dExtrudeObj* Clone() const; // TakeObjName...() is for the display in the UI (for example "3 frames selected") virtual void TakeObjNameSingul(String& rName) const; diff --git a/svx/inc/svx/lathe3d.hxx b/svx/inc/svx/lathe3d.hxx index 5e5e86ab30..2d1f23b816 100755 --- a/svx/inc/svx/lathe3d.hxx +++ b/svx/inc/svx/lathe3d.hxx @@ -102,7 +102,7 @@ private: virtual sal_uInt16 GetObjIdentifier() const; void ReSegment(sal_uInt32 nHSegs, sal_uInt32 nVSegs); - virtual void operator=(const SdrObject&); + virtual E3dLatheObj* Clone() const; virtual SdrObject* DoConvertToPolyObj(sal_Bool bBezier) const; diff --git a/svx/inc/svx/obj3d.hxx b/svx/inc/svx/obj3d.hxx index 953a9cd8c8..c28e304f45 100755 --- a/svx/inc/svx/obj3d.hxx +++ b/svx/inc/svx/obj3d.hxx @@ -196,7 +196,8 @@ public: virtual void TakeObjNameSingul(String& rName) const; virtual void TakeObjNamePlural(String& rName) const; sal_uInt16 GetLogicalGroup() { return 0; } - virtual void operator=(const SdrObject&); + virtual E3dObject* Clone() const; + E3dObject& operator=( const E3dObject& rObj ); virtual SdrObjGeoData *NewGeoData() const; virtual void SaveGeoData(SdrObjGeoData& rGeo) const; @@ -316,8 +317,7 @@ public : sal_Bool GetCreateTexture() const { return bCreateTexture; } void SetCreateTexture(sal_Bool bNew); - // copy operator - virtual void operator=(const SdrObject&); + virtual E3dCompoundObject* Clone() const; // material of the object const Color& GetMaterialAmbientColor() const { return aMaterialAmbientColor; } diff --git a/svx/inc/svx/polygn3d.hxx b/svx/inc/svx/polygn3d.hxx index 907cb69ecb..5fd24a36ba 100755 --- a/svx/inc/svx/polygn3d.hxx +++ b/svx/inc/svx/polygn3d.hxx @@ -80,7 +80,7 @@ public: virtual sal_uInt16 GetObjIdentifier() const; virtual SdrObject* DoConvertToPolyObj(sal_Bool bBezier) const; - virtual void operator=(const SdrObject&); + virtual E3dPolygonObj* Clone() const; // LineOnly? sal_Bool GetLineOnly() { return bLineOnly; } diff --git a/svx/inc/svx/polysc3d.hxx b/svx/inc/svx/polysc3d.hxx index f31929a387..dddddf59e7 100755 --- a/svx/inc/svx/polysc3d.hxx +++ b/svx/inc/svx/polysc3d.hxx @@ -46,6 +46,7 @@ public: E3dPolyScene(E3dDefaultAttributes& rDefault); virtual sal_uInt16 GetObjIdentifier() const; + virtual E3dPolyScene* Clone() const; }; #endif // _E3D_POLYSC3D_HXX diff --git a/svx/inc/svx/scene3d.hxx b/svx/inc/svx/scene3d.hxx index e56f8bb0b4..0ba52d41c3 100755 --- a/svx/inc/svx/scene3d.hxx +++ b/svx/inc/svx/scene3d.hxx @@ -210,7 +210,8 @@ public: const Camera3D& GetCamera() const { return aCamera; } void removeAllNonSelectedObjects(); - virtual void operator=(const SdrObject&); + virtual E3dScene* Clone() const; + E3dScene& operator=(const E3dScene&); virtual SdrObjGeoData *NewGeoData() const; virtual void SaveGeoData(SdrObjGeoData& rGeo) const; diff --git a/svx/inc/svx/sphere3d.hxx b/svx/inc/svx/sphere3d.hxx index 6c71b797ee..4e6271e081 100755 --- a/svx/inc/svx/sphere3d.hxx +++ b/svx/inc/svx/sphere3d.hxx @@ -71,7 +71,7 @@ public: virtual sal_uInt16 GetObjIdentifier() const; virtual SdrObject* DoConvertToPolyObj(sal_Bool bBezier) const; - virtual void operator=(const SdrObject&); + virtual E3dSphereObj* Clone() const; void ReSegment(sal_uInt32 nHorzSegments, sal_uInt32 nVertSegments); const basegfx::B3DPoint& Center() const { return aCenter; } diff --git a/svx/inc/svx/svdoashp.hxx b/svx/inc/svx/svdoashp.hxx index 7727a35e98..4a7f8688d9 100755 --- a/svx/inc/svx/svdoashp.hxx +++ b/svx/inc/svx/svdoashp.hxx @@ -225,7 +225,8 @@ public: virtual void TakeTextAnchorRect( Rectangle& rAnchorRect ) const; virtual void TakeTextRect( SdrOutliner& rOutliner, Rectangle& rTextRect, bool bNoEditText = false, Rectangle* pAnchorRect=NULL, bool bLineWidth = true ) const; - virtual void operator=(const SdrObject& rObj); + virtual SdrObjCustomShape* Clone() const; + SdrObjCustomShape& operator=(const SdrObjCustomShape& rObj); virtual void TakeObjNameSingul(String& rName) const; virtual void TakeObjNamePlural(String& rName) const; diff --git a/svx/inc/svx/svdobj.hxx b/svx/inc/svx/svdobj.hxx index f1660702ef..4cf6bd4c5e 100755 --- a/svx/inc/svx/svdobj.hxx +++ b/svx/inc/svx/svdobj.hxx @@ -30,6 +30,7 @@ #define _SVDOBJ_HXX #include <memory> +#include <typeinfo> #include <cppuhelper/weakref.hxx> #include <vcl/mapmod.hxx> #include <tools/weakbase.hxx> @@ -686,9 +687,16 @@ public: sal_Bool SingleObjectPainter(OutputDevice& rOut) const; sal_Bool LineGeometryUsageIsNecessary() const; - // Clone() soll eine komplette Kopie des Objektes erzeugen. + /** + Returns a copy of the object. Every inherited class must reimplement this (in class Foo + it should be sufficient to do "virtual Foo* Clone() const { return CloneHelper< Foo >(); }". + Note that this function uses operator= internally. + */ virtual SdrObject* Clone() const; - virtual void operator=(const SdrObject& rObj); + /** + Implemented mainly for the purposes of Clone(). + */ + SdrObject& operator=(const SdrObject& rObj); // TakeObjName...() ist fuer die Anzeige in der UI, z.B. "3 Rahmen selektiert". virtual void TakeObjNameSingul(String& rName) const; @@ -1129,6 +1137,11 @@ public: protected: void impl_setUnoShape( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _rxUnoShape ); + /** + Helper function for reimplementing Clone(). + */ + template< typename T > T* CloneHelper() const; + private: /** only for internal use! */ @@ -1183,6 +1196,15 @@ public: typedef tools::WeakReference< SdrObject > SdrObjectWeakRef; +template< typename T > T* SdrObject::CloneHelper() const +{ + OSL_ASSERT( typeid( T ) == typeid( *this )); + T* pObj = dynamic_cast< T* >( SdrObjFactory::MakeNewObject(GetObjInventor(),GetObjIdentifier(),NULL)); + if (pObj!=NULL) + *pObj=*static_cast< const T* >( this ); + return pObj; +} + #endif //_SVDOBJ_HXX /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/svx/inc/svx/svdocapt.hxx b/svx/inc/svx/svdocapt.hxx index 454a6b1471..9c90a1e533 100755 --- a/svx/inc/svx/svdocapt.hxx +++ b/svx/inc/svx/svdocapt.hxx @@ -94,7 +94,7 @@ public: virtual void TakeObjInfo(SdrObjTransformInfoRec& rInfo) const; virtual sal_uInt16 GetObjIdentifier() const; - virtual void operator=(const SdrObject& rObj); + virtual SdrCaptionObj* Clone() const; // for calc: special shadow only for text box void SetSpecialTextBoxShadow() { mbSpecialTextBoxShadow = sal_True; } diff --git a/svx/inc/svx/svdocirc.hxx b/svx/inc/svx/svdocirc.hxx index 9b65e459fd..9522cbf623 100755 --- a/svx/inc/svx/svdocirc.hxx +++ b/svx/inc/svx/svdocirc.hxx @@ -110,7 +110,7 @@ public: virtual void TakeObjNameSingul(String& rName) const; virtual void TakeObjNamePlural(String& rName) const; - virtual void operator=(const SdrObject& rObj); + virtual SdrCircObj* Clone() const; virtual void RecalcSnapRect(); virtual void NbcSetSnapRect(const Rectangle& rRect); virtual basegfx::B2DPolyPolygon TakeXorPoly() const; diff --git a/svx/inc/svx/svdoedge.hxx b/svx/inc/svx/svdoedge.hxx index 6186670b85..abc369004b 100755 --- a/svx/inc/svx/svdoedge.hxx +++ b/svx/inc/svx/svdoedge.hxx @@ -247,7 +247,8 @@ public: virtual void RecalcSnapRect(); virtual void TakeUnrotatedSnapRect(Rectangle& rRect) const; - virtual void operator=(const SdrObject& rObj); + virtual SdrEdgeObj* Clone() const; + SdrEdgeObj& operator=(const SdrEdgeObj& rObj); virtual void TakeObjNameSingul(String& rName) const; virtual void TakeObjNamePlural(String& rName) const; diff --git a/svx/inc/svx/svdograf.hxx b/svx/inc/svx/svdograf.hxx index f361f01adc..4944bb3064 100755 --- a/svx/inc/svx/svdograf.hxx +++ b/svx/inc/svx/svdograf.hxx @@ -181,7 +181,8 @@ public: // #i25616# virtual basegfx::B2DPolyPolygon TakeXorPoly() const; - virtual void operator=(const SdrObject& rObj); + virtual SdrGrafObj* Clone() const; + SdrGrafObj& operator=(const SdrGrafObj& rObj); virtual sal_uInt32 GetHdlCount() const; virtual SdrHdl* GetHdl(sal_uInt32 nHdlNum) const; diff --git a/svx/inc/svx/svdogrp.hxx b/svx/inc/svx/svdogrp.hxx index c34ff7210f..1792a8955d 100755 --- a/svx/inc/svx/svdogrp.hxx +++ b/svx/inc/svx/svdogrp.hxx @@ -80,7 +80,8 @@ public: virtual const Rectangle& GetCurrentBoundRect() const; virtual const Rectangle& GetSnapRect() const; - virtual void operator=(const SdrObject& rObj); + virtual SdrObjGroup* Clone() const; + SdrObjGroup& operator=(const SdrObjGroup& rObj); virtual void TakeObjNameSingul(String& rName) const; virtual void TakeObjNamePlural(String& rName) const; diff --git a/svx/inc/svx/svdomeas.hxx b/svx/inc/svx/svdomeas.hxx index e635256128..044ef991f5 100755 --- a/svx/inc/svx/svdomeas.hxx +++ b/svx/inc/svx/svdomeas.hxx @@ -102,7 +102,7 @@ public: virtual void TakeObjInfo(SdrObjTransformInfoRec& rInfo) const; virtual sal_uInt16 GetObjIdentifier() const; virtual void TakeUnrotatedSnapRect(Rectangle& rRect) const; - virtual void operator=(const SdrObject& rObj); + virtual SdrMeasureObj* Clone() const; virtual void TakeObjNameSingul(String& rName) const; virtual void TakeObjNamePlural(String& rName) const; diff --git a/svx/inc/svx/svdomedia.hxx b/svx/inc/svx/svdomedia.hxx index 87ed2f5e78..3234a1cdd3 100755 --- a/svx/inc/svx/svdomedia.hxx +++ b/svx/inc/svx/svdomedia.hxx @@ -62,7 +62,8 @@ public: virtual void TakeObjNameSingul(String& rName) const; virtual void TakeObjNamePlural(String& rName) const; - virtual void operator=(const SdrObject& rObj); + virtual SdrMediaObj* Clone() const; + SdrMediaObj& operator=(const SdrMediaObj& rObj); virtual void AdjustToMaxRect( const Rectangle& rMaxRect, bool bShrinkOnly = false ); diff --git a/svx/inc/svx/svdoole2.hxx b/svx/inc/svx/svdoole2.hxx index 515ad8d214..c480cc2a2b 100755 --- a/svx/inc/svx/svdoole2.hxx +++ b/svx/inc/svx/svdoole2.hxx @@ -145,7 +145,8 @@ public: virtual void TakeObjNameSingul(String& rName) const; virtual void TakeObjNamePlural(String& rName) const; - virtual void operator=(const SdrObject& rObj); + SdrOle2Obj* Clone() const; + SdrOle2Obj& operator=(const SdrOle2Obj& rObj); virtual void NbcMove(const Size& rSize); virtual void NbcResize(const Point& rRef, const Fraction& xFact, const Fraction& yFact); diff --git a/svx/inc/svx/svdopage.hxx b/svx/inc/svx/svdopage.hxx index 31c607edb0..bbd074ee21 100755 --- a/svx/inc/svx/svdopage.hxx +++ b/svx/inc/svx/svdopage.hxx @@ -65,7 +65,8 @@ public: virtual sal_uInt16 GetObjIdentifier() const; virtual void TakeObjInfo(SdrObjTransformInfoRec& rInfo) const; - virtual void operator=(const SdrObject& rObj); + virtual SdrPageObj* Clone() const; + SdrPageObj& operator=(const SdrPageObj& rObj); virtual void TakeObjNameSingul(String& rName) const; virtual void TakeObjNamePlural(String& rName) const; diff --git a/svx/inc/svx/svdopath.hxx b/svx/inc/svx/svdopath.hxx index 57ebf01e81..0ecc3987b1 100755 --- a/svx/inc/svx/svdopath.hxx +++ b/svx/inc/svx/svdopath.hxx @@ -96,7 +96,8 @@ public: virtual void TakeObjInfo(SdrObjTransformInfoRec& rInfo) const; virtual sal_uInt16 GetObjIdentifier() const; virtual void TakeUnrotatedSnapRect(Rectangle& rRect) const; - virtual void operator=(const SdrObject& rObj); + virtual SdrPathObj* Clone() const; + SdrPathObj& operator=(const SdrPathObj& rObj); virtual void TakeObjNameSingul(String& rName) const; virtual void TakeObjNamePlural(String& rName) const; diff --git a/svx/inc/svx/svdorect.hxx b/svx/inc/svx/svdorect.hxx index e17bd4a205..6114875891 100755 --- a/svx/inc/svx/svdorect.hxx +++ b/svx/inc/svx/svdorect.hxx @@ -99,7 +99,7 @@ public: virtual void TakeObjNameSingul(String& rName) const; virtual void TakeObjNamePlural(String& rName) const; - virtual void operator=(const SdrObject& rObj); + virtual SdrRectObj* Clone() const; virtual void RecalcSnapRect(); virtual void NbcSetSnapRect(const Rectangle& rRect); virtual void NbcSetLogicRect(const Rectangle& rRect); diff --git a/svx/inc/svx/svdotable.hxx b/svx/inc/svx/svdotable.hxx index 22f80d3462..3df9a2a78d 100755 --- a/svx/inc/svx/svdotable.hxx +++ b/svx/inc/svx/svdotable.hxx @@ -226,7 +226,8 @@ public: virtual bool AdjustTextFrameWidthAndHeight(bool bHgt = true, bool bWdt = true); virtual void TakeObjNameSingul(String& rName) const; virtual void TakeObjNamePlural(String& rName) const; - virtual void operator=(const SdrObject& rObj); + virtual SdrTableObj* Clone() const; + SdrTableObj& operator=(const SdrTableObj& rObj); virtual basegfx::B2DPolyPolygon TakeXorPoly() const; virtual basegfx::B2DPolyPolygon TakeContour() const; virtual void RecalcSnapRect(); diff --git a/svx/inc/svx/svdotext.hxx b/svx/inc/svx/svdotext.hxx index 7148b74ed9..fb3a552f6d 100755 --- a/svx/inc/svx/svdotext.hxx +++ b/svx/inc/svx/svdotext.hxx @@ -438,7 +438,8 @@ public: virtual void TakeUnrotatedSnapRect(Rectangle& rRect) const; virtual void TakeObjNameSingul(String& rName) const; virtual void TakeObjNamePlural(String& rName) const; - virtual void operator=(const SdrObject& rObj); + virtual SdrTextObj* Clone() const; + SdrTextObj& operator=(const SdrTextObj& rObj); virtual basegfx::B2DPolyPolygon TakeXorPoly() const; virtual basegfx::B2DPolyPolygon TakeContour() const; virtual void RecalcSnapRect(); diff --git a/svx/inc/svx/svdouno.hxx b/svx/inc/svx/svdouno.hxx index 09acde6f16..8bfee668cb 100755 --- a/svx/inc/svx/svdouno.hxx +++ b/svx/inc/svx/svdouno.hxx @@ -87,7 +87,8 @@ public: virtual void TakeObjInfo(SdrObjTransformInfoRec& rInfo) const; virtual sal_uInt16 GetObjIdentifier() const; - virtual void operator = (const SdrObject& rObj); + virtual SdrUnoObj* Clone() const; + SdrUnoObj& operator= (const SdrUnoObj& rObj); virtual void NbcResize(const Point& rRef, const Fraction& xFact, const Fraction& yFact); virtual void NbcSetLayer(SdrLayerID nLayer); diff --git a/svx/inc/svx/svdovirt.hxx b/svx/inc/svx/svdovirt.hxx index 022638e498..52284ca1dc 100755 --- a/svx/inc/svx/svdovirt.hxx +++ b/svx/inc/svx/svdovirt.hxx @@ -79,8 +79,8 @@ public: virtual const Rectangle& GetLastBoundRect() const; virtual void RecalcBoundRect(); virtual void SetChanged(); - virtual SdrObject* Clone() const; - virtual void operator=(const SdrObject& rObj); + virtual SdrVirtObj* Clone() const; + SdrVirtObj& operator=(const SdrVirtObj& rObj); virtual void TakeObjNameSingul(String& rName) const; virtual void TakeObjNamePlural(String& rName) const; diff --git a/svx/inc/svx/svdpage.hxx b/svx/inc/svx/svdpage.hxx index d44fa604da..f09b6bc6c8 100755 --- a/svx/inc/svx/svdpage.hxx +++ b/svx/inc/svx/svdpage.hxx @@ -476,7 +476,7 @@ public: SdrPage(const SdrPage& rSrcPage); virtual ~SdrPage(); // pModel, pPage, pUpList, pOwnerObj und mbInserted werden Zuweisungeoperator nicht veraendert! - virtual void operator=(const SdrPage& rSrcPage); + SdrPage& operator=(const SdrPage& rSrcPage); virtual SdrPage* Clone() const; virtual SdrPage* Clone(SdrModel* pNewModel) const; bool IsMasterPage() const { return mbMaster; } |