summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNoel Grandin <noel@peralex.com>2016-08-22 11:02:36 +0200
committerNoel Grandin <noel@peralex.com>2016-08-23 09:54:16 +0200
commitba263e124ce263c3c893542062d9c473f5aae589 (patch)
tree74b99db819c66eb333ab2188df0a65a0b7b8fc2e
parentremove dead resource name, related to tdf#92518 (diff)
downloadcore-ba263e124ce263c3c893542062d9c473f5aae589.tar.gz
core-ba263e124ce263c3c893542062d9c473f5aae589.zip
clean up the SdrObjFactory create callbacks
passing params by setting fields on yourself is just gross Change-Id: Iee98a9e8e266b56fc886c76eab470ab1ff7ff8e4
-rw-r--r--basctl/source/dlged/dlgedfac.cxx123
-rw-r--r--basctl/source/inc/dlgedfac.hxx2
-rw-r--r--include/svx/fmobjfac.hxx4
-rw-r--r--include/svx/galmisc.hxx2
-rw-r--r--include/svx/objfac3d.hxx8
-rw-r--r--include/svx/svdetc.hxx29
-rw-r--r--include/svx/svdobj.hxx43
-rw-r--r--reportdesign/source/ui/inc/dlgedfac.hxx2
-rw-r--r--reportdesign/source/ui/report/dlgedfac.cxx26
-rw-r--r--sc/inc/userdat.hxx2
-rw-r--r--sc/source/core/data/userdat.cxx22
-rw-r--r--sd/inc/sdobjfac.hxx3
-rw-r--r--sd/source/core/sdobjfac.cxx11
-rw-r--r--svx/source/engine3d/objfac3d.cxx28
-rw-r--r--svx/source/form/fmobjfac.cxx14
-rw-r--r--svx/source/gallery2/galmisc.cxx7
-rw-r--r--svx/source/svdraw/svdetc.cxx43
-rw-r--r--svx/source/svdraw/svdobj.cxx71
-rw-r--r--sw/inc/dobjfac.hxx2
-rw-r--r--sw/source/core/draw/dobjfac.cxx9
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 <svx/svxdllapi.h>
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 <svx/svxdllapi.h>
+#include <tools/link.hxx>
/*************************************************************************
@@ -30,9 +31,8 @@
\************************************************************************/
class SdrObjFactory;
-
-
-#include <tools/link.hxx>
+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 <tools/link.hxx>
#include <tools/fract.hxx>
#include <vcl/outdev.hxx>
+#include <svx/svdobj.hxx>
/**
@@ -168,26 +169,8 @@ public:
};
-class SdrObjFactory;
-
-class SdrLinkList
-{
- std::vector<Link<SdrObjFactory*,void> > aList;
-protected:
- unsigned FindEntry(const Link<SdrObjFactory*,void>& rLink) const;
-public:
- SdrLinkList(): aList() {}
- ~SdrLinkList() { Clear(); }
- SVX_DLLPUBLIC void Clear();
- unsigned GetLinkCount() const { return (unsigned)aList.size(); }
- Link<SdrObjFactory*,void>& GetLink(unsigned nNum) { return aList[nNum]; }
- const Link<SdrObjFactory*,void>& GetLink(unsigned nNum) const { return aList[nNum]; }
- void InsertLink(const Link<SdrObjFactory*,void>& rLink);
- void RemoveLink(const Link<SdrObjFactory*,void>& rLink);
-};
-
-SdrLinkList& ImpGetUserMakeObjHdl();
-SdrLinkList& ImpGetUserMakeObjUserDataHdl();
+std::vector<Link<SdrObjCreatorParams, SdrObject*>>& ImpGetUserMakeObjHdl();
+std::vector<Link<SdrObjUserDataCreatorParams, SdrObjUserData*>>& 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<Link<SdrObjCreatorParams, SdrObject*>>
+ aUserMakeObjHdl;
+ std::vector<Link<SdrObjUserDataCreatorParams, SdrObjUserData*>>
+ 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 <typeinfo>
#include <com/sun/star/uno/Any.hxx>
#include <cppuhelper/weakref.hxx>
#include <rtl/ustring.hxx>
@@ -35,6 +34,8 @@
#include <tools/weakbase.hxx>
#include <tools/mapunit.hxx>
#include <tools/gen.hxx>
+#include <typeinfo>
+#include <functional>
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<SdrObjCreatorParams, SdrObject*> const & rLink);
+ static void RemoveMakeObjectHdl(Link<SdrObjCreatorParams, SdrObject*> const & rLink);
+ static void InsertMakeUserDataHdl(Link<SdrObjUserDataCreatorParams, SdrObjUserData*> const & rLink);
+ static void RemoveMakeUserDataHdl(Link<SdrObjUserDataCreatorParams, SdrObjUserData*> 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<SdrObjFactory*,void>& rLink);
- static void RemoveMakeObjectHdl(const Link<SdrObjFactory*,void>& rLink);
- static void InsertMakeUserDataHdl(const Link<SdrObjFactory*,void>& rLink);
- static void RemoveMakeUserDataHdl(const Link<SdrObjFactory*,void>& 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<beans::XPropertySet> 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 <tools/link.hxx>
-// 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<SdrObjFactory*,void>& rLink) const
-{
- unsigned nCount=GetLinkCount();
- for (unsigned i=0; i<nCount; i++) {
- if (GetLink(i)==rLink) return i;
- }
- return 0xFFFF;
-}
-
-void SdrLinkList::InsertLink(const Link<SdrObjFactory*,void>& 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<SdrObjFactory*,void>& 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<const XFillStyleItem&>(rSet.Get(XATTR_FILLSTYLE)).GetValue();
@@ -418,13 +379,13 @@ SdrOutliner* SdrMakeOutliner(OutlinerMode nOutlinerMode, SdrModel& rModel)
return pOutl;
}
-SdrLinkList& ImpGetUserMakeObjHdl()
+std::vector<Link<SdrObjCreatorParams, SdrObject*>>& ImpGetUserMakeObjHdl()
{
SdrGlobalData& rGlobalData=GetSdrGlobalData();
return rGlobalData.aUserMakeObjHdl;
}
-SdrLinkList& ImpGetUserMakeObjUserDataHdl()
+std::vector<Link<SdrObjUserDataCreatorParams, SdrObjUserData*>>& 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<SdrObjFactory> 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<SdrObjFactory*,void>& rLink)
+void SdrObjFactory::InsertMakeObjectHdl(Link<SdrObjCreatorParams, SdrObject*> const & rLink)
{
- SdrLinkList& rLL=ImpGetUserMakeObjHdl();
- rLL.InsertLink(rLink);
+ std::vector<Link<SdrObjCreatorParams, SdrObject*>>& 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<SdrObjFactory*,void>& rLink)
+void SdrObjFactory::RemoveMakeObjectHdl(Link<SdrObjCreatorParams, SdrObject*> const & rLink)
{
- SdrLinkList& rLL=ImpGetUserMakeObjHdl();
- rLL.RemoveLink(rLink);
+ std::vector<Link<SdrObjCreatorParams, SdrObject*>>& rLL=ImpGetUserMakeObjHdl();
+ auto it = std::find(rLL.begin(), rLL.end(), rLink);
+ if (it != rLL.end())
+ rLL.erase(it);
}
-void SdrObjFactory::InsertMakeUserDataHdl(const Link<SdrObjFactory*,void>& rLink)
+void SdrObjFactory::InsertMakeUserDataHdl(Link<SdrObjUserDataCreatorParams, SdrObjUserData*> const & rLink)
{
- SdrLinkList& rLL=ImpGetUserMakeObjUserDataHdl();
- rLL.InsertLink(rLink);
+ std::vector<Link<SdrObjUserDataCreatorParams, SdrObjUserData*>>& 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<SdrObjFactory*,void>& rLink)
+void SdrObjFactory::RemoveMakeUserDataHdl(Link<SdrObjUserDataCreatorParams, SdrObjUserData*> const & rLink)
{
- SdrLinkList& rLL=ImpGetUserMakeObjUserDataHdl();
- rLL.RemoveLink(rLink);
+ std::vector<Link<SdrObjUserDataCreatorParams, SdrObjUserData*>>& 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: */