From ba263e124ce263c3c893542062d9c473f5aae589 Mon Sep 17 00:00:00 2001 From: Noel Grandin Date: Mon, 22 Aug 2016 11:02:36 +0200 Subject: clean up the SdrObjFactory create callbacks passing params by setting fields on yourself is just gross Change-Id: Iee98a9e8e266b56fc886c76eab470ab1ff7ff8e4 --- basctl/source/dlged/dlgedfac.cxx | 123 +++++++++++++---------------- basctl/source/inc/dlgedfac.hxx | 2 +- include/svx/fmobjfac.hxx | 4 +- include/svx/galmisc.hxx | 2 +- include/svx/objfac3d.hxx | 8 +- include/svx/svdetc.hxx | 29 ++----- include/svx/svdobj.hxx | 43 +++++----- reportdesign/source/ui/inc/dlgedfac.hxx | 2 +- reportdesign/source/ui/report/dlgedfac.cxx | 26 +++--- sc/inc/userdat.hxx | 2 +- sc/source/core/data/userdat.cxx | 22 +++--- sd/inc/sdobjfac.hxx | 3 +- sd/source/core/sdobjfac.cxx | 11 +-- svx/source/engine3d/objfac3d.cxx | 28 +++---- svx/source/form/fmobjfac.cxx | 14 ++-- svx/source/gallery2/galmisc.cxx | 7 +- svx/source/svdraw/svdetc.cxx | 43 +--------- svx/source/svdraw/svdobj.cxx | 71 ++++++++--------- sw/inc/dobjfac.hxx | 2 +- sw/source/core/draw/dobjfac.cxx | 9 ++- 20 files changed, 190 insertions(+), 261 deletions(-) diff --git a/basctl/source/dlged/dlgedfac.cxx b/basctl/source/dlged/dlgedfac.cxx index 496a34194699..d1df0c1f13bb 100644 --- a/basctl/source/dlged/dlgedfac.cxx +++ b/basctl/source/dlged/dlgedfac.cxx @@ -43,7 +43,7 @@ DlgEdFactory::~DlgEdFactory() } -IMPL_LINK_TYPED( DlgEdFactory, MakeObject, SdrObjFactory *, pObjFactory, void ) +IMPL_LINK_TYPED( DlgEdFactory, MakeObject, SdrObjCreatorParams, aParams, SdrObject* ) { static bool bNeedsInit = true; static uno::Reference< lang::XMultiServiceFactory > xDialogSFact; @@ -60,57 +60,49 @@ IMPL_LINK_TYPED( DlgEdFactory, MakeObject, SdrObjFactory *, pObjFactory, void ) bNeedsInit = false; } - if( (pObjFactory->nInventor == DlgInventor) && - (pObjFactory->nIdentifier >= OBJ_DLG_PUSHBUTTON) && - (pObjFactory->nIdentifier <= OBJ_DLG_FORMHSCROLL) ) + SdrObject* pNewObj = nullptr; + if( (aParams.nInventor == DlgInventor) && + (aParams.nObjIdentifier >= OBJ_DLG_PUSHBUTTON) && + (aParams.nObjIdentifier <= OBJ_DLG_FORMHSCROLL) ) { - switch( pObjFactory->nIdentifier ) + switch( aParams.nObjIdentifier ) { case OBJ_DLG_PUSHBUTTON: - pObjFactory->pNewObj = new DlgEdObj( "com.sun.star.awt.UnoControlButtonModel", xDialogSFact ); - break; - case OBJ_DLG_FORMRADIO: + pNewObj = new DlgEdObj( "com.sun.star.awt.UnoControlButtonModel", xDialogSFact ); + break; case OBJ_DLG_RADIOBUTTON: - if ( pObjFactory->nIdentifier == OBJ_DLG_RADIOBUTTON ) - pObjFactory->pNewObj = new DlgEdObj( "com.sun.star.awt.UnoControlRadioButtonModel", xDialogSFact ); - else - { - pObjFactory->pNewObj = new DlgEdObj( "com.sun.star.form.component.RadioButton", xDialogSFact ); - static_cast< DlgEdObj* >( pObjFactory->pNewObj )->MakeDataAware( mxModel ); - } + pNewObj = new DlgEdObj( "com.sun.star.awt.UnoControlRadioButtonModel", xDialogSFact ); + break; + case OBJ_DLG_FORMRADIO: + pNewObj = new DlgEdObj( "com.sun.star.form.component.RadioButton", xDialogSFact ); + static_cast< DlgEdObj* >( pNewObj )->MakeDataAware( mxModel ); break; - case OBJ_DLG_FORMCHECK: case OBJ_DLG_CHECKBOX: - if ( pObjFactory->nIdentifier == OBJ_DLG_CHECKBOX ) - pObjFactory->pNewObj = new DlgEdObj( "com.sun.star.awt.UnoControlCheckBoxModel", xDialogSFact ); - else - { - pObjFactory->pNewObj = new DlgEdObj( "com.sun.star.form.component.CheckBox", xDialogSFact ); - static_cast< DlgEdObj* >( pObjFactory->pNewObj )->MakeDataAware( mxModel ); - } + pNewObj = new DlgEdObj( "com.sun.star.awt.UnoControlCheckBoxModel", xDialogSFact ); + break; + case OBJ_DLG_FORMCHECK: + pNewObj = new DlgEdObj( "com.sun.star.form.component.CheckBox", xDialogSFact ); + static_cast< DlgEdObj* >( pNewObj )->MakeDataAware( mxModel ); break; - case OBJ_DLG_FORMLIST: case OBJ_DLG_LISTBOX: - if ( pObjFactory->nIdentifier == OBJ_DLG_LISTBOX ) - pObjFactory->pNewObj = new DlgEdObj( "com.sun.star.awt.UnoControlListBoxModel", xDialogSFact ); - else - { - pObjFactory->pNewObj = new DlgEdObj( "com.sun.star.form.component.ListBox", xDialogSFact ); - static_cast< DlgEdObj* >( pObjFactory->pNewObj )->MakeDataAware( mxModel ); - } + pNewObj = new DlgEdObj( "com.sun.star.awt.UnoControlListBoxModel", xDialogSFact ); + break; + case OBJ_DLG_FORMLIST: + pNewObj = new DlgEdObj( "com.sun.star.form.component.ListBox", xDialogSFact ); + static_cast< DlgEdObj* >( pNewObj )->MakeDataAware( mxModel ); break; case OBJ_DLG_FORMCOMBO: case OBJ_DLG_COMBOBOX: { DlgEdObj* pNew = nullptr; - if ( pObjFactory->nIdentifier == OBJ_DLG_COMBOBOX ) + if ( aParams.nObjIdentifier == OBJ_DLG_COMBOBOX ) pNew = new DlgEdObj( "com.sun.star.awt.UnoControlComboBoxModel", xDialogSFact ); else { pNew = new DlgEdObj( "com.sun.star.form.component.ComboBox", xDialogSFact ); pNew->MakeDataAware( mxModel ); } - pObjFactory->pNewObj = pNew; + pNewObj = pNew; try { uno::Reference< beans::XPropertySet > xPSet(pNew->GetUnoControlModel(), uno::UNO_QUERY); @@ -122,44 +114,42 @@ IMPL_LINK_TYPED( DlgEdFactory, MakeObject, SdrObjFactory *, pObjFactory, void ) catch(...) { } - } break; + } + break; case OBJ_DLG_GROUPBOX: - pObjFactory->pNewObj = new DlgEdObj( "com.sun.star.awt.UnoControlGroupBoxModel", xDialogSFact ); + pNewObj = new DlgEdObj( "com.sun.star.awt.UnoControlGroupBoxModel", xDialogSFact ); break; case OBJ_DLG_EDIT: - pObjFactory->pNewObj = new DlgEdObj( "com.sun.star.awt.UnoControlEditModel", xDialogSFact ); + pNewObj = new DlgEdObj( "com.sun.star.awt.UnoControlEditModel", xDialogSFact ); break; case OBJ_DLG_FIXEDTEXT: - pObjFactory->pNewObj = new DlgEdObj( "com.sun.star.awt.UnoControlFixedTextModel", xDialogSFact ); + pNewObj = new DlgEdObj( "com.sun.star.awt.UnoControlFixedTextModel", xDialogSFact ); break; case OBJ_DLG_IMAGECONTROL: - pObjFactory->pNewObj = new DlgEdObj( "com.sun.star.awt.UnoControlImageControlModel", xDialogSFact ); + pNewObj = new DlgEdObj( "com.sun.star.awt.UnoControlImageControlModel", xDialogSFact ); break; case OBJ_DLG_PROGRESSBAR: - pObjFactory->pNewObj = new DlgEdObj( "com.sun.star.awt.UnoControlProgressBarModel", xDialogSFact ); + pNewObj = new DlgEdObj( "com.sun.star.awt.UnoControlProgressBarModel", xDialogSFact ); break; - case OBJ_DLG_FORMHSCROLL: case OBJ_DLG_HSCROLLBAR: - if ( pObjFactory->nIdentifier == OBJ_DLG_HSCROLLBAR ) - pObjFactory->pNewObj = new DlgEdObj( "com.sun.star.awt.UnoControlScrollBarModel", xDialogSFact ); - else - { - pObjFactory->pNewObj = new DlgEdObj( "com.sun.star.form.component.ScrollBar", xDialogSFact ); - static_cast< DlgEdObj* >( pObjFactory->pNewObj )->MakeDataAware( mxModel ); - } + pNewObj = new DlgEdObj( "com.sun.star.awt.UnoControlScrollBarModel", xDialogSFact ); + break; + case OBJ_DLG_FORMHSCROLL: + pNewObj = new DlgEdObj( "com.sun.star.form.component.ScrollBar", xDialogSFact ); + static_cast< DlgEdObj* >( pNewObj )->MakeDataAware( mxModel ); break; case OBJ_DLG_FORMVSCROLL: case OBJ_DLG_VSCROLLBAR: { DlgEdObj* pNew = nullptr; - if ( pObjFactory->nIdentifier == OBJ_DLG_VSCROLLBAR ) + if ( aParams.nObjIdentifier == OBJ_DLG_VSCROLLBAR ) pNew = new DlgEdObj( "com.sun.star.awt.UnoControlScrollBarModel", xDialogSFact ); else { pNew = new DlgEdObj( "com.sun.star.form.component.ScrollBar", xDialogSFact ); pNew->MakeDataAware( mxModel ); } - pObjFactory->pNewObj = pNew; + pNewObj = pNew; // set vertical orientation try { @@ -174,12 +164,12 @@ IMPL_LINK_TYPED( DlgEdFactory, MakeObject, SdrObjFactory *, pObjFactory, void ) } } break; case OBJ_DLG_HFIXEDLINE: - pObjFactory->pNewObj = new DlgEdObj( "com.sun.star.awt.UnoControlFixedLineModel", xDialogSFact ); + pNewObj = new DlgEdObj( "com.sun.star.awt.UnoControlFixedLineModel", xDialogSFact ); break; case OBJ_DLG_VFIXEDLINE: { DlgEdObj* pNew = new DlgEdObj( "com.sun.star.awt.UnoControlFixedLineModel", xDialogSFact ); - pObjFactory->pNewObj = pNew; + pNewObj = pNew; // set vertical orientation try { @@ -194,42 +184,39 @@ IMPL_LINK_TYPED( DlgEdFactory, MakeObject, SdrObjFactory *, pObjFactory, void ) } } break; case OBJ_DLG_DATEFIELD: - pObjFactory->pNewObj = new DlgEdObj( "com.sun.star.awt.UnoControlDateFieldModel", xDialogSFact ); + pNewObj = new DlgEdObj( "com.sun.star.awt.UnoControlDateFieldModel", xDialogSFact ); break; case OBJ_DLG_TIMEFIELD: - pObjFactory->pNewObj = new DlgEdObj( "com.sun.star.awt.UnoControlTimeFieldModel", xDialogSFact ); + pNewObj = new DlgEdObj( "com.sun.star.awt.UnoControlTimeFieldModel", xDialogSFact ); break; case OBJ_DLG_NUMERICFIELD: - pObjFactory->pNewObj = new DlgEdObj( "com.sun.star.awt.UnoControlNumericFieldModel", xDialogSFact ); + pNewObj = new DlgEdObj( "com.sun.star.awt.UnoControlNumericFieldModel", xDialogSFact ); break; case OBJ_DLG_CURRENCYFIELD: - pObjFactory->pNewObj = new DlgEdObj( "com.sun.star.awt.UnoControlCurrencyFieldModel", xDialogSFact ); + pNewObj = new DlgEdObj( "com.sun.star.awt.UnoControlCurrencyFieldModel", xDialogSFact ); break; case OBJ_DLG_FORMATTEDFIELD: - pObjFactory->pNewObj = new DlgEdObj( "com.sun.star.awt.UnoControlFormattedFieldModel", xDialogSFact ); + pNewObj = new DlgEdObj( "com.sun.star.awt.UnoControlFormattedFieldModel", xDialogSFact ); break; case OBJ_DLG_PATTERNFIELD: - pObjFactory->pNewObj = new DlgEdObj( "com.sun.star.awt.UnoControlPatternFieldModel", xDialogSFact ); + pNewObj = new DlgEdObj( "com.sun.star.awt.UnoControlPatternFieldModel", xDialogSFact ); break; case OBJ_DLG_FILECONTROL: - pObjFactory->pNewObj = new DlgEdObj( "com.sun.star.awt.UnoControlFileControlModel", xDialogSFact ); + pNewObj = new DlgEdObj( "com.sun.star.awt.UnoControlFileControlModel", xDialogSFact ); break; - case OBJ_DLG_FORMSPIN: case OBJ_DLG_SPINBUTTON: - if ( pObjFactory->nIdentifier == OBJ_DLG_SPINBUTTON ) - pObjFactory->pNewObj = new DlgEdObj( "com.sun.star.awt.UnoControlSpinButtonModel", xDialogSFact ); - else - { - pObjFactory->pNewObj = new DlgEdObj( "com.sun.star.form.component.SpinButton", xDialogSFact ); - static_cast< DlgEdObj* >( pObjFactory->pNewObj )->MakeDataAware( mxModel ); - } + pNewObj = new DlgEdObj( "com.sun.star.awt.UnoControlSpinButtonModel", xDialogSFact ); + break; + case OBJ_DLG_FORMSPIN: + pNewObj = new DlgEdObj( "com.sun.star.form.component.SpinButton", xDialogSFact ); + static_cast< DlgEdObj* >( pNewObj )->MakeDataAware( mxModel ); break; case OBJ_DLG_TREECONTROL: - DlgEdObj* pNew = new DlgEdObj( "com.sun.star.awt.tree.TreeControlModel", xDialogSFact ); - pObjFactory->pNewObj = pNew; + pNewObj = new DlgEdObj( "com.sun.star.awt.tree.TreeControlModel", xDialogSFact ); break; } } + return pNewObj; } } // namespace basctl diff --git a/basctl/source/inc/dlgedfac.hxx b/basctl/source/inc/dlgedfac.hxx index d9079d9911ca..a824921388f8 100644 --- a/basctl/source/inc/dlgedfac.hxx +++ b/basctl/source/inc/dlgedfac.hxx @@ -38,7 +38,7 @@ public: DlgEdFactory( const css::uno::Reference< css::frame::XModel >& xModel ); ~DlgEdFactory(); - DECL_LINK_TYPED( MakeObject, SdrObjFactory *, void ); + DECL_LINK_TYPED( MakeObject, SdrObjCreatorParams, SdrObject* ); }; } // namespace basctl diff --git a/include/svx/fmobjfac.hxx b/include/svx/fmobjfac.hxx index c5eac5e51182..fa8515102ab1 100644 --- a/include/svx/fmobjfac.hxx +++ b/include/svx/fmobjfac.hxx @@ -24,6 +24,8 @@ #include class SdrObjFactory; +class SdrObject; +struct SdrObjCreatorParams; class SVX_DLLPUBLIC FmFormObjFactory { @@ -31,7 +33,7 @@ public: FmFormObjFactory(); ~FmFormObjFactory(); - DECL_STATIC_LINK_TYPED(FmFormObjFactory, MakeObject, SdrObjFactory*, void); + DECL_STATIC_LINK_TYPED(FmFormObjFactory, MakeObject, SdrObjCreatorParams, SdrObject* ); }; #endif // _FM_FMOBJFAC_HXX diff --git a/include/svx/galmisc.hxx b/include/svx/galmisc.hxx index 8f535d556784..f58a8096f773 100644 --- a/include/svx/galmisc.hxx +++ b/include/svx/galmisc.hxx @@ -130,7 +130,7 @@ public: SgaUserDataFactory() { SdrObjFactory::InsertMakeUserDataHdl( LINK(this,SgaUserDataFactory,MakeUserData) ); } ~SgaUserDataFactory() { SdrObjFactory::RemoveMakeUserDataHdl( LINK(this,SgaUserDataFactory,MakeUserData) ); } - DECL_STATIC_LINK_TYPED( SgaUserDataFactory, MakeUserData, SdrObjFactory*, void ); + DECL_STATIC_LINK_TYPED( SgaUserDataFactory, MakeUserData, SdrObjUserDataCreatorParams, SdrObjUserData* ); }; class GraphicFilter; diff --git a/include/svx/objfac3d.hxx b/include/svx/objfac3d.hxx index 6376a9cbcbbe..b06020c276d9 100644 --- a/include/svx/objfac3d.hxx +++ b/include/svx/objfac3d.hxx @@ -21,6 +21,7 @@ #define INCLUDED_SVX_OBJFAC3D_HXX #include +#include /************************************************************************* @@ -30,9 +31,8 @@ \************************************************************************/ class SdrObjFactory; - - -#include +class SdrObject; +struct SdrObjCreatorParams; class SVX_DLLPUBLIC E3dObjFactory { @@ -40,7 +40,7 @@ public: E3dObjFactory(); ~E3dObjFactory(); - DECL_STATIC_LINK_TYPED(E3dObjFactory, MakeObject, SdrObjFactory*, void); + DECL_STATIC_LINK_TYPED(E3dObjFactory, MakeObject, SdrObjCreatorParams, SdrObject*); }; diff --git a/include/svx/svdetc.hxx b/include/svx/svdetc.hxx index 20750c6a4a0b..c2bcefb44431 100644 --- a/include/svx/svdetc.hxx +++ b/include/svx/svdetc.hxx @@ -26,6 +26,7 @@ #include #include #include +#include /** @@ -168,26 +169,8 @@ public: }; -class SdrObjFactory; - -class SdrLinkList -{ - std::vector > aList; -protected: - unsigned FindEntry(const Link& rLink) const; -public: - SdrLinkList(): aList() {} - ~SdrLinkList() { Clear(); } - SVX_DLLPUBLIC void Clear(); - unsigned GetLinkCount() const { return (unsigned)aList.size(); } - Link& GetLink(unsigned nNum) { return aList[nNum]; } - const Link& GetLink(unsigned nNum) const { return aList[nNum]; } - void InsertLink(const Link& rLink); - void RemoveLink(const Link& rLink); -}; - -SdrLinkList& ImpGetUserMakeObjHdl(); -SdrLinkList& ImpGetUserMakeObjUserDataHdl(); +std::vector>& ImpGetUserMakeObjHdl(); +std::vector>& ImpGetUserMakeObjUserDataHdl(); class SdrOle2Obj; class AutoTimer; @@ -221,8 +204,10 @@ class SVX_DLLPUBLIC SdrGlobalData const SvtSysLocale* pSysLocale; // follows always locale settings const LocaleDataWrapper* pLocaleData; // follows always SysLocale public: - SdrLinkList aUserMakeObjHdl; - SdrLinkList aUserMakeObjUserDataHdl; + std::vector> + aUserMakeObjHdl; + std::vector> + aUserMakeObjUserDataHdl; SdrEngineDefaults* pDefaults; ResMgr* pResMgr; OLEObjCache aOLEObjCache; diff --git a/include/svx/svdobj.hxx b/include/svx/svdobj.hxx index a762127bdc79..9d913bc71cb4 100644 --- a/include/svx/svdobj.hxx +++ b/include/svx/svdobj.hxx @@ -20,7 +20,6 @@ #ifndef INCLUDED_SVX_SVDOBJ_HXX #define INCLUDED_SVX_SVDOBJ_HXX -#include #include #include #include @@ -35,6 +34,8 @@ #include #include #include +#include +#include class SfxBroadcaster; class Pointer; @@ -972,6 +973,18 @@ private: bool mbDoNotInsertIntoPageAutomatically; }; +struct SdrObjCreatorParams +{ + sal_uInt32 nInventor; + sal_uInt16 nObjIdentifier; +}; +struct SdrObjUserDataCreatorParams +{ + sal_uInt32 nInventor; + sal_uInt16 nObjIdentifier; + SdrObject* pObject; +}; + /** * Whoever creates his own objects must set a link in the SdrObjFactory class. * The handler must have the following signature: @@ -983,32 +996,18 @@ private: class SVX_DLLPUBLIC SdrObjFactory { public: - sal_uInt32 nInventor; - sal_uInt16 nIdentifier; - - // for MakeNewObj(): - SdrPage* pPage; - SdrModel* pModel; - SdrObject* pNewObj; - - // for MakeNewObjUserData(): - SdrObject* pObj; - SdrObjUserData* pNewData; + static SdrObject* MakeNewObject(sal_uInt32 nInventor, sal_uInt16 nObjIdentifier, SdrPage* pPage, SdrModel* pModel=nullptr); + static SdrObject* MakeNewObject(sal_uInt32 nInventor, sal_uInt16 nObjIdentifier, const Rectangle& rSnapRect, SdrPage* pPage); + static void InsertMakeObjectHdl(Link const & rLink); + static void RemoveMakeObjectHdl(Link const & rLink); + static void InsertMakeUserDataHdl(Link const & rLink); + static void RemoveMakeUserDataHdl(Link const & rLink); private: - static SVX_DLLPRIVATE SdrObject* CreateObjectFromFactory( sal_uInt32 nInventor, sal_uInt16 nIdentifier, SdrPage* pPage, SdrModel* pModel ); - SVX_DLLPRIVATE SdrObjFactory(sal_uInt32 nInvent, sal_uInt16 nIdent, SdrPage* pNewPage, SdrModel* pNewModel); - -public: - static SdrObject* MakeNewObject(sal_uInt32 nInvent, sal_uInt16 nIdent, SdrPage* pPage, SdrModel* pModel=nullptr); - static SdrObject* MakeNewObject( sal_uInt32 nInventor, sal_uInt16 nIdentifier, const Rectangle& rSnapRect, SdrPage* pPage ); - static void InsertMakeObjectHdl(const Link& rLink); - static void RemoveMakeObjectHdl(const Link& rLink); - static void InsertMakeUserDataHdl(const Link& rLink); - static void RemoveMakeUserDataHdl(const Link& rLink); + SdrObjFactory() = delete; }; typedef tools::WeakReference< SdrObject > SdrObjectWeakRef; diff --git a/reportdesign/source/ui/inc/dlgedfac.hxx b/reportdesign/source/ui/inc/dlgedfac.hxx index bdee50e2b2be..ea529bd8d591 100644 --- a/reportdesign/source/ui/inc/dlgedfac.hxx +++ b/reportdesign/source/ui/inc/dlgedfac.hxx @@ -35,7 +35,7 @@ public: DlgEdFactory(); ~DlgEdFactory(); - DECL_STATIC_LINK_TYPED( DlgEdFactory, MakeObject, SdrObjFactory *, void ); + DECL_STATIC_LINK_TYPED( DlgEdFactory, MakeObject, SdrObjCreatorParams, SdrObject* ); }; } #endif // INCLUDED_REPORTDESIGN_SOURCE_UI_INC_DLGEDFAC_HXX diff --git a/reportdesign/source/ui/report/dlgedfac.cxx b/reportdesign/source/ui/report/dlgedfac.cxx index f1c57ca559e2..09ef7bcb341e 100644 --- a/reportdesign/source/ui/report/dlgedfac.cxx +++ b/reportdesign/source/ui/report/dlgedfac.cxx @@ -44,24 +44,25 @@ DlgEdFactory::~DlgEdFactory() IMPL_STATIC_LINK_TYPED( - DlgEdFactory, MakeObject, SdrObjFactory *, pObjFactory, void ) + DlgEdFactory, MakeObject, SdrObjCreatorParams, aParams, SdrObject* ) { - if ( pObjFactory->nInventor == ReportInventor ) + SdrObject* pNewObj = nullptr; + if ( aParams.nInventor == ReportInventor ) { - switch( pObjFactory->nIdentifier ) + switch( aParams.nObjIdentifier ) { case OBJ_DLG_FIXEDTEXT: - pObjFactory->pNewObj = new OUnoObject( SERVICE_FIXEDTEXT + pNewObj = new OUnoObject( SERVICE_FIXEDTEXT ,OUString("com.sun.star.form.component.FixedText") ,OBJ_DLG_FIXEDTEXT); break; case OBJ_DLG_IMAGECONTROL: - pObjFactory->pNewObj = new OUnoObject( SERVICE_IMAGECONTROL + pNewObj = new OUnoObject( SERVICE_IMAGECONTROL ,OUString("com.sun.star.form.component.DatabaseImageControl") ,OBJ_DLG_IMAGECONTROL); break; case OBJ_DLG_FORMATTEDFIELD: - pObjFactory->pNewObj = new OUnoObject( SERVICE_FORMATTEDFIELD + pNewObj = new OUnoObject( SERVICE_FORMATTEDFIELD ,OUString("com.sun.star.form.component.FormattedField") ,OBJ_DLG_FORMATTEDFIELD); break; @@ -70,9 +71,9 @@ IMPL_STATIC_LINK_TYPED( { OUnoObject* pObj = new OUnoObject( SERVICE_FIXEDLINE ,OUString("com.sun.star.awt.UnoControlFixedLineModel") - ,pObjFactory->nIdentifier); - pObjFactory->pNewObj = pObj; - if ( pObjFactory->nIdentifier == OBJ_DLG_HFIXEDLINE ) + ,aParams.nObjIdentifier); + pNewObj = pObj; + if ( aParams.nObjIdentifier == OBJ_DLG_HFIXEDLINE ) { uno::Reference xProp = pObj->getAwtComponent(); xProp->setPropertyValue( PROPERTY_ORIENTATION, uno::makeAny(sal_Int32(0)) ); @@ -80,19 +81,20 @@ IMPL_STATIC_LINK_TYPED( } break; case OBJ_CUSTOMSHAPE: - pObjFactory->pNewObj = new OCustomShape(SERVICE_SHAPE); + pNewObj = new OCustomShape(SERVICE_SHAPE); break; case OBJ_DLG_SUBREPORT: - pObjFactory->pNewObj = new OOle2Obj(SERVICE_REPORTDEFINITION,OBJ_DLG_SUBREPORT); + pNewObj = new OOle2Obj(SERVICE_REPORTDEFINITION,OBJ_DLG_SUBREPORT); break; case OBJ_OLE2: - pObjFactory->pNewObj = new OOle2Obj(OUString("com.sun.star.chart2.ChartDocument"),OBJ_OLE2); + pNewObj = new OOle2Obj(OUString("com.sun.star.chart2.ChartDocument"),OBJ_OLE2); break; default: OSL_FAIL("Unknown object id"); break; } } + return pNewObj; } } diff --git a/sc/inc/userdat.hxx b/sc/inc/userdat.hxx index bed2070d7ea4..dd063be5ac3f 100644 --- a/sc/inc/userdat.hxx +++ b/sc/inc/userdat.hxx @@ -35,7 +35,7 @@ class ScDrawObjFactory { - DECL_STATIC_LINK_TYPED( ScDrawObjFactory, MakeUserData, SdrObjFactory *, void ); + DECL_STATIC_LINK_TYPED( ScDrawObjFactory, MakeUserData, SdrObjUserDataCreatorParams, SdrObjUserData* ); public: ScDrawObjFactory(); ~ScDrawObjFactory(); diff --git a/sc/source/core/data/userdat.cxx b/sc/source/core/data/userdat.cxx index f06d2201facc..3d02e082dd31 100644 --- a/sc/source/core/data/userdat.cxx +++ b/sc/source/core/data/userdat.cxx @@ -32,21 +32,19 @@ ScDrawObjFactory::~ScDrawObjFactory() } IMPL_STATIC_LINK_TYPED( - ScDrawObjFactory, MakeUserData, SdrObjFactory *, pObjFactory, void ) + ScDrawObjFactory, MakeUserData, SdrObjUserDataCreatorParams, aParams, SdrObjUserData* ) { - if ( pObjFactory->nInventor == SC_DRAWLAYER ) + if ( aParams.nInventor == SC_DRAWLAYER ) { - if ( pObjFactory->nIdentifier == SC_UD_OBJDATA ) - pObjFactory->pNewData = new ScDrawObjData; - else if ( pObjFactory->nIdentifier == SC_UD_IMAPDATA ) - pObjFactory->pNewData = new ScIMapInfo; - else if ( pObjFactory->nIdentifier == SC_UD_MACRODATA ) - pObjFactory->pNewData = new ScMacroInfo; - else - { - OSL_FAIL("MakeUserData: wrong ID"); - } + if ( aParams.nObjIdentifier == SC_UD_OBJDATA ) + return new ScDrawObjData; + else if ( aParams.nObjIdentifier == SC_UD_IMAPDATA ) + return new ScIMapInfo; + else if ( aParams.nObjIdentifier == SC_UD_MACRODATA ) + return new ScMacroInfo; + OSL_FAIL("MakeUserData: wrong ID"); } + return nullptr; } ScDrawObjData::ScDrawObjData() : diff --git a/sd/inc/sdobjfac.hxx b/sd/inc/sdobjfac.hxx index 5adbc68fdbb9..de130a2c4c2a 100644 --- a/sd/inc/sdobjfac.hxx +++ b/sd/inc/sdobjfac.hxx @@ -22,7 +22,6 @@ #include -// class SdObjectFactory class SdrObjFactory; class SdObjectFactory @@ -30,7 +29,7 @@ class SdObjectFactory public: SdObjectFactory() {} - DECL_STATIC_LINK_TYPED( SdObjectFactory, MakeUserData, SdrObjFactory *, void ); + DECL_STATIC_LINK_TYPED( SdObjectFactory, MakeUserData, SdrObjUserDataCreatorParams, SdrObjUserData* ); }; extern SdObjectFactory aSdObjectFactory; diff --git a/sd/source/core/sdobjfac.cxx b/sd/source/core/sdobjfac.cxx index 5d2c7bf1a0b5..193a15bfb09d 100644 --- a/sd/source/core/sdobjfac.cxx +++ b/sd/source/core/sdobjfac.cxx @@ -35,24 +35,25 @@ SdObjectFactory aSdObjectFactory; |* \************************************************************************/ -IMPL_STATIC_LINK_TYPED( SdObjectFactory, MakeUserData, SdrObjFactory *, pObjFactory, void ) +IMPL_STATIC_LINK_TYPED( SdObjectFactory, MakeUserData, SdrObjUserDataCreatorParams, aParams, SdrObjUserData* ) { - if ( pObjFactory->nInventor == SdUDInventor ) + if ( aParams.nInventor == SdUDInventor ) { - switch( pObjFactory->nIdentifier ) + switch( aParams.nObjIdentifier ) { case SD_ANIMATIONINFO_ID: - pObjFactory->pNewData = new SdAnimationInfo( *pObjFactory->pObj ); + return new SdAnimationInfo( *aParams.pObject ); break; case SD_IMAPINFO_ID: - pObjFactory->pNewData = new SdIMapInfo; + return new SdIMapInfo; break; default: break; } } + return nullptr; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/svx/source/engine3d/objfac3d.cxx b/svx/source/engine3d/objfac3d.cxx index 197c77cd3739..63d5264a405f 100644 --- a/svx/source/engine3d/objfac3d.cxx +++ b/svx/source/engine3d/objfac3d.cxx @@ -45,40 +45,34 @@ E3dObjFactory::~E3dObjFactory() // Generate chart internal objects -IMPL_STATIC_LINK_TYPED( E3dObjFactory, MakeObject, SdrObjFactory*, pObjFactory, void ) +IMPL_STATIC_LINK_TYPED( E3dObjFactory, MakeObject, SdrObjCreatorParams, aParams, SdrObject* ) { - if ( pObjFactory->nInventor == E3dInventor ) + if ( aParams.nInventor == E3dInventor ) { - switch ( pObjFactory->nIdentifier ) + switch ( aParams.nObjIdentifier ) { case E3D_POLYSCENE_ID: - pObjFactory->pNewObj = new E3dPolyScene(); - break; + return new E3dPolyScene(); case E3D_POLYGONOBJ_ID : - pObjFactory->pNewObj = new E3dPolygonObj(); - break; + return new E3dPolygonObj(); case E3D_CUBEOBJ_ID : - pObjFactory->pNewObj = new E3dCubeObj(); - break; + return new E3dCubeObj(); case E3D_SPHEREOBJ_ID: // Gets the dummy constructor, as this is only called when // loading documents. The actual number of segments is however // determined only after loading the members. This will result // in that the first sphere will be immediately destroyed, // although it was never used. - pObjFactory->pNewObj = new E3dSphereObj(123); - break; + return new E3dSphereObj(123); case E3D_EXTRUDEOBJ_ID: - pObjFactory->pNewObj = new E3dExtrudeObj(); - break; + return new E3dExtrudeObj(); case E3D_LATHEOBJ_ID: - pObjFactory->pNewObj = new E3dLatheObj(); - break; + return new E3dLatheObj(); case E3D_COMPOUNDOBJ_ID: - pObjFactory->pNewObj = new E3dCompoundObject(); - break; + return new E3dCompoundObject(); } } + return nullptr; } diff --git a/svx/source/form/fmobjfac.cxx b/svx/source/form/fmobjfac.cxx index ded879ab6d73..84733dcfd42d 100644 --- a/svx/source/form/fmobjfac.cxx +++ b/svx/source/form/fmobjfac.cxx @@ -109,16 +109,17 @@ namespace } IMPL_STATIC_LINK_TYPED( - FmFormObjFactory, MakeObject, SdrObjFactory*, pObjFactory, void) + FmFormObjFactory, MakeObject, SdrObjCreatorParams, aParams, SdrObject*) { - if (pObjFactory->nInventor == FmFormInventor) + SdrObject* pNewObj = nullptr; + if (aParams.nInventor == FmFormInventor) { OUString sServiceSpecifier; typedef ::std::vector< ::std::pair< OUString, Any > > PropertyValueArray; PropertyValueArray aInitialProperties; - switch ( pObjFactory->nIdentifier ) + switch ( aParams.nObjIdentifier ) { case OBJ_FM_EDIT: sServiceSpecifier = FM_COMPONENT_EDIT; @@ -214,9 +215,9 @@ IMPL_STATIC_LINK_TYPED( // create the actual object if ( !sServiceSpecifier.isEmpty() ) - pObjFactory->pNewObj = new FmFormObj(sServiceSpecifier); + pNewObj = new FmFormObj(sServiceSpecifier); else - pObjFactory->pNewObj = new FmFormObj(); + pNewObj = new FmFormObj(); // initialize some properties which we want to differ from the defaults for ( PropertyValueArray::const_iterator aInitProp = aInitialProperties.begin(); @@ -225,12 +226,13 @@ IMPL_STATIC_LINK_TYPED( ) { lcl_initProperty( - static_cast< FmFormObj* >( pObjFactory->pNewObj ), + static_cast< FmFormObj* >( pNewObj ), aInitProp->first, aInitProp->second ); } } + return pNewObj; } diff --git a/svx/source/gallery2/galmisc.cxx b/svx/source/gallery2/galmisc.cxx index 570b19ce9e33..b0fa80e914fa 100644 --- a/svx/source/gallery2/galmisc.cxx +++ b/svx/source/gallery2/galmisc.cxx @@ -77,10 +77,11 @@ BitmapEx GalleryResGetBitmapEx( sal_uInt32 nId ) } IMPL_STATIC_LINK_TYPED( - SgaUserDataFactory, MakeUserData, SdrObjFactory*, pObjFactory, void ) + SgaUserDataFactory, MakeUserData, SdrObjUserDataCreatorParams, aParams, SdrObjUserData* ) { - if ( pObjFactory->nInventor == IV_IMAPINFO && pObjFactory->nIdentifier == ID_IMAPINFO ) - pObjFactory->pNewData = new SgaIMapInfo; + if ( aParams.nInventor == IV_IMAPINFO && aParams.nObjIdentifier == ID_IMAPINFO ) + return new SgaIMapInfo; + return nullptr; } GalleryGraphicImportRet GalleryGraphicImport( const INetURLObject& rURL, Graphic& rGraphic, diff --git a/svx/source/svdraw/svdetc.cxx b/svx/source/svdraw/svdetc.cxx index 1d72915d8f12..3ee78e9714b5 100644 --- a/svx/source/svdraw/svdetc.cxx +++ b/svx/source/svdraw/svdetc.cxx @@ -254,45 +254,6 @@ IMPL_LINK_NOARG_TYPED(OLEObjCache, UnloadCheckHdl, Timer*, void) } -void SdrLinkList::Clear() -{ - aList.clear(); -} - -unsigned SdrLinkList::FindEntry(const Link& rLink) const -{ - unsigned nCount=GetLinkCount(); - for (unsigned i=0; i& rLink) -{ - unsigned nFnd=FindEntry(rLink); - if (nFnd==0xFFFF) { - if (rLink.IsSet()) { - aList.push_back(rLink); - } else { - OSL_FAIL("SdrLinkList::InsertLink(): Tried to insert a link that was not set already."); - } - } else { - OSL_FAIL("SdrLinkList::InsertLink(): Link already in place."); - } -} - -void SdrLinkList::RemoveLink(const Link& rLink) -{ - unsigned nFnd=FindEntry(rLink); - if (nFnd!=0xFFFF) { - aList.erase( aList.begin() + nFnd ); - } else { - OSL_FAIL("SdrLinkList::RemoveLink(): Link not found."); - } -} - - bool GetDraftFillColor(const SfxItemSet& rSet, Color& rCol) { drawing::FillStyle eFill=static_cast(rSet.Get(XATTR_FILLSTYLE)).GetValue(); @@ -418,13 +379,13 @@ SdrOutliner* SdrMakeOutliner(OutlinerMode nOutlinerMode, SdrModel& rModel) return pOutl; } -SdrLinkList& ImpGetUserMakeObjHdl() +std::vector>& ImpGetUserMakeObjHdl() { SdrGlobalData& rGlobalData=GetSdrGlobalData(); return rGlobalData.aUserMakeObjHdl; } -SdrLinkList& ImpGetUserMakeObjUserDataHdl() +std::vector>& ImpGetUserMakeObjUserDataHdl() { SdrGlobalData& rGlobalData=GetSdrGlobalData(); return rGlobalData.aUserMakeObjUserDataHdl; diff --git a/svx/source/svdraw/svdobj.cxx b/svx/source/svdraw/svdobj.cxx index d7b37c2632b2..578c787fe397 100644 --- a/svx/source/svdraw/svdobj.cxx +++ b/svx/source/svdraw/svdobj.cxx @@ -3097,33 +3097,16 @@ bool SdrObject::HasText() const return false; } -SdrObjFactory::SdrObjFactory(sal_uInt32 nInvent, sal_uInt16 nIdent, SdrPage* pNewPage, SdrModel* pNewModel) +SdrObject* SdrObjFactory::CreateObjectFromFactory( sal_uInt32 nInventor, sal_uInt16 nObjIdentifier, SdrPage* , SdrModel* ) { - nInventor=nInvent; - nIdentifier=nIdent; - pNewObj=nullptr; - pPage=pNewPage; - pModel=pNewModel; - pObj=nullptr; - pNewData=nullptr; -} - -SdrObject* SdrObjFactory::CreateObjectFromFactory( sal_uInt32 nInventor, sal_uInt16 nIdentifier, SdrPage* pPage, SdrModel* pModel ) -{ - std::unique_ptr pFact(new SdrObjFactory(nInventor, nIdentifier, pPage, pModel)); - - SdrLinkList& rLL = ImpGetUserMakeObjHdl(); - unsigned n = rLL.GetLinkCount(); - unsigned i = 0; - SdrObject* pObj = nullptr; - while (i < n && !pObj) - { - rLL.GetLink(i).Call(pFact.get()); - pObj = pFact->pNewObj; - i++; + SdrObjCreatorParams aParams { nInventor, nObjIdentifier }; + for (const auto & i : ImpGetUserMakeObjHdl()) { + SdrObject* pObj = i.Call(aParams); + if (pObj) { + return pObj; + } } - - return pObj; + return nullptr; } SdrObject* SdrObjFactory::MakeNewObject(sal_uInt32 nInvent, sal_uInt16 nIdent, SdrPage* pPage, SdrModel* pModel) @@ -3278,28 +3261,42 @@ SdrObject* SdrObjFactory::MakeNewObject( return pObj; } -void SdrObjFactory::InsertMakeObjectHdl(const Link& rLink) +void SdrObjFactory::InsertMakeObjectHdl(Link const & rLink) { - SdrLinkList& rLL=ImpGetUserMakeObjHdl(); - rLL.InsertLink(rLink); + std::vector>& rLL=ImpGetUserMakeObjHdl(); + auto it = std::find(rLL.begin(), rLL.end(), rLink); + if (it != rLL.end()) { + OSL_FAIL("SdrObjFactory::InsertMakeObjectHdl(): Link already in place."); + } else { + rLL.push_back(rLink); + } } -void SdrObjFactory::RemoveMakeObjectHdl(const Link& rLink) +void SdrObjFactory::RemoveMakeObjectHdl(Link const & rLink) { - SdrLinkList& rLL=ImpGetUserMakeObjHdl(); - rLL.RemoveLink(rLink); + std::vector>& rLL=ImpGetUserMakeObjHdl(); + auto it = std::find(rLL.begin(), rLL.end(), rLink); + if (it != rLL.end()) + rLL.erase(it); } -void SdrObjFactory::InsertMakeUserDataHdl(const Link& rLink) +void SdrObjFactory::InsertMakeUserDataHdl(Link const & rLink) { - SdrLinkList& rLL=ImpGetUserMakeObjUserDataHdl(); - rLL.InsertLink(rLink); + std::vector>& rLL=ImpGetUserMakeObjUserDataHdl(); + auto it = std::find(rLL.begin(), rLL.end(), rLink); + if (it != rLL.end()) { + OSL_FAIL("SdrObjFactory::InsertMakeUserDataHdl(): Link already in place."); + } else { + rLL.push_back(rLink); + } } -void SdrObjFactory::RemoveMakeUserDataHdl(const Link& rLink) +void SdrObjFactory::RemoveMakeUserDataHdl(Link const & rLink) { - SdrLinkList& rLL=ImpGetUserMakeObjUserDataHdl(); - rLL.RemoveLink(rLink); + std::vector>& rLL=ImpGetUserMakeObjUserDataHdl(); + auto it = std::find(rLL.begin(), rLL.end(), rLink); + if (it != rLL.end()) + rLL.erase(it); } namespace svx diff --git a/sw/inc/dobjfac.hxx b/sw/inc/dobjfac.hxx index 52fb8bc6773d..5bcc3108c842 100644 --- a/sw/inc/dobjfac.hxx +++ b/sw/inc/dobjfac.hxx @@ -26,7 +26,7 @@ class SdrObjFactory; class SwObjectFactory { public: - DECL_STATIC_LINK_TYPED( SwObjectFactory, MakeObject, SdrObjFactory *, void ); + DECL_STATIC_LINK_TYPED( SwObjectFactory, MakeObject, SdrObjCreatorParams, SdrObject* ); }; extern SwObjectFactory aSwObjectFactory; diff --git a/sw/source/core/draw/dobjfac.cxx b/sw/source/core/draw/dobjfac.cxx index 25d96fbe0d91..845c08617195 100644 --- a/sw/source/core/draw/dobjfac.cxx +++ b/sw/source/core/draw/dobjfac.cxx @@ -24,15 +24,16 @@ SwObjectFactory aSwObjectFactory; IMPL_STATIC_LINK_TYPED( - SwObjectFactory, MakeObject, SdrObjFactory*, pObjFactory, void ) + SwObjectFactory, MakeObject, SdrObjCreatorParams, aParams, SdrObject* ) { - if ( pObjFactory->nInventor == SWGInventor ) + if ( aParams.nInventor == SWGInventor ) { // No switch, there's only one at the moment - OSL_ENSURE( pObjFactory->nIdentifier == SwFlyDrawObjIdentifier, + OSL_ENSURE( aParams.nObjIdentifier == SwFlyDrawObjIdentifier, "Wrong inventor or identifier" ); - pObjFactory->pNewObj = new SwFlyDrawObj(); + return new SwFlyDrawObj; } + return nullptr; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ -- cgit