summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorDavid Tardon <dtardon@redhat.com>2014-12-03 22:01:57 +0100
committerDavid Tardon <dtardon@redhat.com>2014-12-05 09:57:36 +0100
commitd49e5761f359020c349c268ee78a4256cc46541e (patch)
tree51452df20c020095d9e7397f1066661f53c2e835 /include
parent8ddc963165bb52d7272ee1cca099f2ee8fed6759 (diff)
ooo#93212 avoid slicing during construction of SdrPage
Also hide copy ctor and assignment operator of all derived classes, to ensure that Clone() is the only method to make copies of them. Change-Id: Icb3b50c63b086abe8c9add32e3041fe19692d20b (cherry picked from commit 9638e6207c7fc48712b1b238177462c00f5011e8)
Diffstat (limited to 'include')
-rw-r--r--include/svx/fmpage.hxx9
-rw-r--r--include/svx/obj3d.hxx8
-rw-r--r--include/svx/svdpage.hxx27
3 files changed, 34 insertions, 10 deletions
diff --git a/include/svx/fmpage.hxx b/include/svx/fmpage.hxx
index e381a64bada7..a48df9ce5fda 100644
--- a/include/svx/fmpage.hxx
+++ b/include/svx/fmpage.hxx
@@ -40,6 +40,8 @@ class HelpEvent;
class SVX_DLLPUBLIC FmFormPage : public SdrPage
{
+ FmFormPage& operator=(const FmFormPage&) SAL_DELETED_FUNCTION;
+
friend class FmFormObj;
FmFormPageImpl* m_pImpl;
OUString m_sPageName;
@@ -48,12 +50,12 @@ public:
TYPEINFO_OVERRIDE();
FmFormPage(FmFormModel& rModel, bool bMasterPage=false);
- FmFormPage(const FmFormPage& rPage);
virtual ~FmFormPage();
virtual void SetModel(SdrModel* pNewModel) SAL_OVERRIDE;
virtual SdrPage* Clone() const SAL_OVERRIDE;
+ // TODO: Uh huh, how is this supposed to work? Creating a SdrPage from FmFormPage?
using SdrPage::Clone;
virtual void InsertObject(SdrObject* pObj, size_t nPos = SAL_MAX_SIZE,
@@ -73,6 +75,11 @@ public:
vcl::Window* pWin,
SdrView* pView,
const HelpEvent& rEvt );
+
+protected:
+ FmFormPage(const FmFormPage& rPage);
+
+ void lateInit(const FmFormPage& rPage);
};
#endif // INCLUDED_SVX_FMPAGE_HXX
diff --git a/include/svx/obj3d.hxx b/include/svx/obj3d.hxx
index bdba2c34dae2..f370f20a5647 100644
--- a/include/svx/obj3d.hxx
+++ b/include/svx/obj3d.hxx
@@ -78,16 +78,22 @@ public:
class E3dObjList : public SdrObjList
{
+ E3dObjList &operator=(const E3dObjList& rSrcList) SAL_DELETED_FUNCTION;
+
public:
TYPEINFO_OVERRIDE();
E3dObjList(SdrModel* pNewModel = 0, SdrPage* pNewPage = 0, E3dObjList* pNewUpList = 0);
- SVX_DLLPUBLIC E3dObjList(const E3dObjList& rSrcList);
SVX_DLLPUBLIC virtual ~E3dObjList();
+ virtual E3dObjList* Clone() const;
+
virtual void NbcInsertObject(SdrObject* pObj, size_t nPos=SAL_MAX_SIZE, const SdrInsertReason* pReason=NULL) SAL_OVERRIDE;
virtual void InsertObject(SdrObject* pObj, size_t nPos=SAL_MAX_SIZE, const SdrInsertReason* pReason=NULL) SAL_OVERRIDE;
virtual SdrObject* NbcRemoveObject(size_t nObjNum) SAL_OVERRIDE;
virtual SdrObject* RemoveObject(size_t nObjNum) SAL_OVERRIDE;
+
+protected:
+ SVX_DLLPUBLIC E3dObjList(const E3dObjList& rSrcList);
};
/*************************************************************************
diff --git a/include/svx/svdpage.hxx b/include/svx/svdpage.hxx
index 712079df259e..9adca6d085ce 100644
--- a/include/svx/svdpage.hxx
+++ b/include/svx/svdpage.hxx
@@ -78,6 +78,9 @@ public:
class SVX_DLLPUBLIC SdrObjList
{
+ SdrObjList(const SdrObjList& rSrcList) SAL_DELETED_FUNCTION;
+ SdrObjList &operator=(const SdrObjList& rSrcList) SAL_DELETED_FUNCTION;
+
private:
typedef ::std::vector<SdrObject*> SdrObjectContainerType;
SdrObjectContainerType maList;
@@ -97,20 +100,23 @@ friend class SdrEditView;
protected:
virtual void RecalcRects();
+ SdrObjList();
+ void lateInit(const SdrObjList& rSrcList);
+
private:
/// simple ActionChildInserted forwarder to have it on a central place
void impChildInserted(SdrObject& rChild) const;
public:
TYPEINFO();
SdrObjList(SdrModel* pNewModel, SdrPage* pNewPage, SdrObjList* pNewUpList=NULL);
- SdrObjList(const SdrObjList& rSrcList);
virtual ~SdrObjList();
+
+ virtual SdrObjList* Clone() const;
+
// !!! Diese Methode nur fuer Leute, die ganz genau wissen was sie tun !!!
// #110094# This should not be needed (!)
void SetObjOrdNumsDirty() { bObjOrdNumsDirty=true; }
- // pModel, pPage, pUpList und pOwnerObj werden Zuweisungeoperator nicht veraendert!
- void operator=(const SdrObjList& rSrcList);
void CopyObjects(const SdrObjList& rSrcList);
// alles Aufraeumen (ohne Undo)
void Clear();
@@ -403,6 +409,7 @@ public:
class SVX_DLLPUBLIC SdrPage : public SdrObjList, public tools::WeakBase< SdrPage >
{
+ SdrPage& operator=(const SdrPage& rSrcPage) SAL_DELETED_FUNCTION;
// start PageUser section
private:
@@ -473,15 +480,19 @@ protected:
::com::sun::star::drawing::XDrawPage> const&);
virtual ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > createUnoPage();
+ // Copying of pages is split into two parts: construction and copying of page objects,
+ // because the copying might need access to fully initialized page. Clone() is responsible
+ // to call lateInit() after copy-construction of a new object. Any initialization in derived
+ // classes that needs access to the page objects must be deferred to lateInit. And it must
+ // call lateInit() of its parent class.
+ SdrPage(const SdrPage& rSrcPage);
+ void lateInit(const SdrPage& rSrcPage);
+
public:
TYPEINFO_OVERRIDE();
SdrPage(SdrModel& rNewModel, bool bMasterPage=false);
- // Copy-Ctor und Zuweisungeoperator sind nicht getestet!
- SdrPage(const SdrPage& rSrcPage);
virtual ~SdrPage();
- // pModel, pPage, pUpList, pOwnerObj und mbInserted werden Zuweisungeoperator nicht veraendert!
- SdrPage& operator=(const SdrPage& rSrcPage);
- virtual SdrPage* Clone() const;
+ virtual SdrPage* Clone() const SAL_OVERRIDE;
virtual SdrPage* Clone(SdrModel* pNewModel) const;
bool IsMasterPage() const { return mbMaster; }
void SetInserted(bool bNew = true);