[Libreoffice-commits] core.git: Branch 'feature/item_refactor2' - 2 commits - avmedia/source basctl/source cui/source idl/source include/avmedia include/item include/sfx2 include/svx item/Library_item.mk item/source item/test reportdesign/source sc/inc sc/source sd/source sfx2/inc sfx2/source starmath/inc starmath/source svx/source sw/source

Armin Le Grand (via logerrit) logerrit at kemper.freedesktop.org
Tue Apr 9 15:25:24 UTC 2019


 avmedia/source/framework/mediatoolbox.cxx           |    2 
 basctl/source/basicide/IDEComboBox.cxx              |    4 
 basctl/source/basicide/basides1.cxx                 |    2 
 basctl/source/basicide/sbxitem.cxx                  |   35 +
 basctl/source/inc/IDEComboBox.hxx                   |    4 
 basctl/source/inc/sbxitem.hxx                       |   19 -
 cui/source/dialogs/cuihyperdlg.cxx                  |    2 
 cui/source/inc/cuihyperdlg.hxx                      |    2 
 idl/source/objects/slot.cxx                         |    2 
 idl/source/objects/types.cxx                        |    9 
 include/avmedia/mediatoolbox.hxx                    |    2 
 include/item/base/ItemAdministrator.hxx             |   30 -
 include/item/base/ItemBase.hxx                      |   30 +
 include/item/base/ItemBaseStaticHelper.hxx          |   75 ---
 include/item/base/ItemControlBlock.hxx              |   71 +++
 include/item/base/ItemSet.hxx                       |   22 -
 include/item/base/ModelSpecificItemValues.hxx       |    8 
 include/item/base/SlotSet.hxx                       |   13 
 include/item/simple/CntInt16.hxx                    |   20 -
 include/item/simple/CntOUString.hxx                 |   20 -
 include/sfx2/ctrlitem.hxx                           |    4 
 include/sfx2/msg.hxx                                |   18 
 include/sfx2/sfxstatuslistener.hxx                  |    2 
 include/sfx2/sidebar/ControllerItem.hxx             |    2 
 include/sfx2/stbitem.hxx                            |    2 
 include/sfx2/tbxctrl.hxx                            |    2 
 include/sfx2/unoctitm.hxx                           |    2 
 include/svx/ParaSpacingControl.hxx                  |    4 
 include/svx/bmpmask.hxx                             |    2 
 include/svx/clipboardctl.hxx                        |    2 
 include/svx/fillctrl.hxx                            |    2 
 include/svx/float3d.hxx                             |    4 
 include/svx/fontwork.hxx                            |    2 
 include/svx/formatpaintbrushctrl.hxx                |    2 
 include/svx/grafctrl.hxx                            |    4 
 include/svx/imapdlg.hxx                             |    2 
 include/svx/insctrl.hxx                             |    2 
 include/svx/layctrl.hxx                             |    4 
 include/svx/lboxctrl.hxx                            |    2 
 include/svx/linectrl.hxx                            |    4 
 include/svx/modctrl.hxx                             |    2 
 include/svx/pszctrl.hxx                             |    2 
 include/svx/selctrl.hxx                             |    2 
 include/svx/tbcontrl.hxx                            |    4 
 include/svx/tbxctl.hxx                              |    2 
 include/svx/verttexttbxctrl.hxx                     |    2 
 include/svx/xmlsecctrl.hxx                          |    2 
 include/svx/zoomctrl.hxx                            |    2 
 include/svx/zoomsliderctrl.hxx                      |    2 
 item/Library_item.mk                                |    1 
 item/source/base/ItemAdministrator.cxx              |   54 +-
 item/source/base/ItemBase.cxx                       |   48 +-
 item/source/base/ItemControlBlock.cxx               |   53 ++
 item/source/base/ItemSet.cxx                        |    8 
 item/source/base/ModelSpecificItemValues.cxx        |   14 
 item/source/base/SlotSet.cxx                        |    4 
 item/source/simple/CntInt16.cxx                     |   31 +
 item/source/simple/CntOUString.cxx                  |   29 +
 item/test/ItemTest.cxx                              |  377 ++++++++++++++++----
 reportdesign/source/ui/misc/statusbarcontroller.cxx |    4 
 sc/inc/NumberFormatControl.hxx                      |    2 
 sc/source/ui/cctrl/tbzoomsliderctrl.cxx             |    2 
 sc/source/ui/inc/navcitem.hxx                       |    2 
 sc/source/ui/inc/tbzoomsliderctrl.hxx               |    2 
 sc/source/ui/navipi/navcitem.cxx                    |    2 
 sc/source/ui/sidebar/NumberFormatControl.cxx        |    2 
 sd/source/ui/app/tmplctrl.cxx                       |    2 
 sd/source/ui/dlg/animobjs.cxx                       |    2 
 sd/source/ui/dlg/diactrl.cxx                        |    2 
 sd/source/ui/dlg/gluectrl.cxx                       |    2 
 sd/source/ui/dlg/navigatr.cxx                       |    4 
 sd/source/ui/inc/animobjs.hxx                       |    2 
 sd/source/ui/inc/diactrl.hxx                        |    2 
 sd/source/ui/inc/gluectrl.hxx                       |    2 
 sd/source/ui/inc/navigatr.hxx                       |    4 
 sd/source/ui/inc/tmplctrl.hxx                       |    2 
 sd/source/ui/view/sdruler.cxx                       |    4 
 sfx2/inc/inettbc.hxx                                |    2 
 sfx2/source/appl/appuno.cxx                         |    4 
 sfx2/source/control/bindings.cxx                    |    2 
 sfx2/source/control/ctrlitem.cxx                    |    4 
 sfx2/source/control/sfxstatuslistener.cxx           |    4 
 sfx2/source/control/statcach.cxx                    |   10 
 sfx2/source/control/unoctitm.cxx                    |    4 
 sfx2/source/dialog/tplcitem.cxx                     |    2 
 sfx2/source/inc/tplcitem.hxx                        |    2 
 sfx2/source/inet/inettbc.cxx                        |    2 
 sfx2/source/sidebar/ControllerItem.cxx              |    2 
 sfx2/source/statbar/stbitem.cxx                     |    4 
 sfx2/source/toolbox/tbxitem.cxx                     |    4 
 sfx2/source/view/viewfrm2.cxx                       |    2 
 starmath/inc/view.hxx                               |    4 
 starmath/source/view.cxx                            |    4 
 svx/source/dialog/_bmpmask.cxx                      |    2 
 svx/source/dialog/_contdlg.cxx                      |    2 
 svx/source/dialog/contimp.hxx                       |    2 
 svx/source/dialog/fontwork.cxx                      |    2 
 svx/source/dialog/imapdlg.cxx                       |    2 
 svx/source/dialog/rlrcitem.cxx                      |    2 
 svx/source/dialog/rlrcitem.hxx                      |    2 
 svx/source/dialog/srchctrl.cxx                      |    2 
 svx/source/dialog/srchctrl.hxx                      |    2 
 svx/source/engine3d/float3d.cxx                     |    4 
 svx/source/form/datanavi.cxx                        |    2 
 svx/source/form/filtnav.cxx                         |    2 
 svx/source/form/fmPropBrw.cxx                       |    2 
 svx/source/form/fmexpl.cxx                          |    2 
 svx/source/form/tabwin.cxx                          |    2 
 svx/source/form/tbxform.cxx                         |    4 
 svx/source/inc/datanavi.hxx                         |    2 
 svx/source/inc/filtnav.hxx                          |    2 
 svx/source/inc/fmPropBrw.hxx                        |    2 
 svx/source/inc/fmexpl.hxx                           |    2 
 svx/source/inc/tabwin.hxx                           |    2 
 svx/source/inc/tbxform.hxx                          |    4 
 svx/source/mnuctrls/clipboardctl.cxx                |    2 
 svx/source/sidebar/paragraph/ParaSpacingControl.cxx |    4 
 svx/source/stbctrls/insctrl.cxx                     |    2 
 svx/source/stbctrls/modctrl.cxx                     |    2 
 svx/source/stbctrls/pszctrl.cxx                     |    2 
 svx/source/stbctrls/selctrl.cxx                     |    2 
 svx/source/stbctrls/xmlsecctrl.cxx                  |    2 
 svx/source/stbctrls/zoomctrl.cxx                    |    2 
 svx/source/stbctrls/zoomsliderctrl.cxx              |    2 
 svx/source/tbxctrls/fillctrl.cxx                    |    2 
 svx/source/tbxctrls/formatpaintbrushctrl.cxx        |    2 
 svx/source/tbxctrls/grafctrl.cxx                    |    4 
 svx/source/tbxctrls/layctrl.cxx                     |    4 
 svx/source/tbxctrls/lboxctrl.cxx                    |    2 
 svx/source/tbxctrls/linectrl.cxx                    |    4 
 svx/source/tbxctrls/tbcontrl.cxx                    |    8 
 svx/source/tbxctrls/tbxdrctl.cxx                    |    2 
 svx/source/tbxctrls/verttexttbxctrl.cxx             |    2 
 sw/source/uibase/inc/bookctrl.hxx                   |    2 
 sw/source/uibase/inc/navipi.hxx                     |    2 
 sw/source/uibase/inc/tmplctrl.hxx                   |    2 
 sw/source/uibase/inc/viewlayoutctrl.hxx             |    2 
 sw/source/uibase/inc/wordcountctrl.hxx              |    2 
 sw/source/uibase/inc/workctrl.hxx                   |    4 
 sw/source/uibase/inc/zoomctrl.hxx                   |    2 
 sw/source/uibase/ribbar/workctrl.cxx                |    4 
 sw/source/uibase/utlui/bookctrl.cxx                 |    2 
 sw/source/uibase/utlui/navipi.cxx                   |    2 
 sw/source/uibase/utlui/tmplctrl.cxx                 |    2 
 sw/source/uibase/utlui/viewlayoutctrl.cxx           |    2 
 sw/source/uibase/utlui/wordcountctrl.cxx            |    2 
 sw/source/uibase/utlui/zoomctrl.cxx                 |    2 
 147 files changed, 811 insertions(+), 500 deletions(-)

New commits:
commit 6693a1c95420e952403cab6b6a1fe80b25bfe34f
Author:     Armin Le Grand <Armin.Le.Grand at me.com>
AuthorDate: Tue Apr 9 17:19:10 2019 +0200
Commit:     Armin Le Grand <Armin.Le.Grand at me.com>
CommitDate: Tue Apr 9 17:19:10 2019 +0200

    WIP: Huge restructuring to allow simple derivation
    
    Experimenting let me stumble over problems with the
    static methods involved when wanting to derive from
    an existing Item:: implementation. Both cases
    (1) derive and add local data
    (2) derive to get a new class/identifier
    had problems. Experimented and decided to take an
    approach closer to have a service-structure per
    derivation that e.g. allows re-usage of the Item-
    Administrator in case (2). Case (2) is important in
    potentially solving the ItemSet/SlotSet mix I currently
    have by allowing simple definition of Items derived from
    simple basic types (as e.g. CntOUString) to have a
    solution for Items that now have to go to Slots.
    
    Change-Id: Ibe1d8d967614e07de65bd81d59e36681e50687b6

diff --git a/avmedia/source/framework/mediatoolbox.cxx b/avmedia/source/framework/mediatoolbox.cxx
index 0d5a421e65da..e43811f3e784 100644
--- a/avmedia/source/framework/mediatoolbox.cxx
+++ b/avmedia/source/framework/mediatoolbox.cxx
@@ -83,7 +83,7 @@ MediaToolBoxControl::~MediaToolBoxControl()
 }
 
 
-void MediaToolBoxControl::StateChanged( sal_uInt16, SfxItemState eState, const SfxPoolItem* pState, const Item::ItemBase::SharedPtr& /*rSlotItem*/ )
+void MediaToolBoxControl::StateChanged( sal_uInt16, SfxItemState eState, const SfxPoolItem* pState, const std::shared_ptr<const Item::ItemBase>& /*rSlotItem*/ )
 {
     MediaToolBoxControl_Impl* pCtrl = static_cast< MediaToolBoxControl_Impl* >( GetToolBox().GetItemWindow( GetId() ) );
 
diff --git a/basctl/source/basicide/IDEComboBox.cxx b/basctl/source/basicide/IDEComboBox.cxx
index 1c420d3dd70d..a02584b61bd5 100644
--- a/basctl/source/basicide/IDEComboBox.cxx
+++ b/basctl/source/basicide/IDEComboBox.cxx
@@ -58,7 +58,7 @@ LibBoxControl::LibBoxControl(sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx)
 {
 }
 
-void LibBoxControl::StateChanged(sal_uInt16, SfxItemState eState, const SfxPoolItem* pState, const ::Item::ItemBase::SharedPtr& /*rSlotItem*/)
+void LibBoxControl::StateChanged(sal_uInt16, SfxItemState eState, const SfxPoolItem* pState, const ::std::shared_ptr<const ::Item::ItemBase>& /*rSlotItem*/)
 {
     LibBox* pBox = static_cast<LibBox*>(GetToolBox().GetItemWindow(GetId()));
 
@@ -335,7 +335,7 @@ LanguageBoxControl::LanguageBoxControl(sal_uInt16 nSlotId, sal_uInt16 nId, ToolB
 {
 }
 
-void LanguageBoxControl::StateChanged(sal_uInt16, SfxItemState eState, const SfxPoolItem* pItem, const ::Item::ItemBase::SharedPtr& /*rSlotItem*/)
+void LanguageBoxControl::StateChanged(sal_uInt16, SfxItemState eState, const SfxPoolItem* pItem, const ::std::shared_ptr<const ::Item::ItemBase>& /*rSlotItem*/)
 {
     if (LanguageBox* pBox = static_cast<LanguageBox*>(GetToolBox().GetItemWindow(GetId())))
     {
diff --git a/basctl/source/basicide/basides1.cxx b/basctl/source/basicide/basides1.cxx
index 32eb37cd05b2..ceb2d7991b08 100644
--- a/basctl/source/basicide/basides1.cxx
+++ b/basctl/source/basicide/basides1.cxx
@@ -573,7 +573,7 @@ void Shell::ExecuteGlobal( SfxRequest& rReq )
         {
             DBG_ASSERT( rReq.GetArgs(), "arguments expected" );
             // I2TM
-            const auto aSbxItem = rReq.GetArgs()->slotSet().GetSlot<const Item::Sbx>(SID_BASICIDE_ARG_SBX);
+            const auto aSbxItem = rReq.GetArgs()->slotSet().GetSlot<const basctl::Item::Sbx>(SID_BASICIDE_ARG_SBX);
             const ScriptDocument& aDocument( aSbxItem->GetDocument() );
             const OUString& aLibName( aSbxItem->GetLibName() );
             const OUString& aName( aSbxItem->GetName() );
diff --git a/basctl/source/basicide/sbxitem.cxx b/basctl/source/basicide/sbxitem.cxx
index 2b20734357f6..bb5e518f72ce 100644
--- a/basctl/source/basicide/sbxitem.cxx
+++ b/basctl/source/basicide/sbxitem.cxx
@@ -19,21 +19,30 @@
 
 #include <sbxitem.hxx>
 #include <sal/log.hxx>
+#include <item/base/ItemAdministrator.hxx>
 
 namespace basctl
 {
 // I2TM
 namespace Item
 {
-    // need internal access to ItemAdministrator
-    ::Item::ItemAdministrator* Sbx::GetIAdministrator() const
+    ::Item::ItemControlBlock& Sbx::GetStaticItemControlBlock()
     {
-        return &GetStaticAdmin();
+        static ::Item::ItemControlBlock aItemControlBlock(
+            std::shared_ptr<::Item::ItemAdministrator>(new ::Item::IAdministrator_vector()),
+            std::shared_ptr<const ::Item::ItemBase>(new Sbx()),
+            [](){ return new Sbx(); });
+
+        return aItemControlBlock;
+    }
+
+    ::Item::ItemControlBlock& Sbx::GetItemControlBlock() const
+    {
+        return Sbx::GetStaticItemControlBlock();
     }
 
     Sbx::Sbx(const ScriptDocument* pDocument, const OUString& aLibName, const OUString& aName, const OUString& aMethodName, ItemType eType)
-    :   SbxStaticHelper(),
-        ::Item::ItemBase(),
+    :   ::Item::ItemBase(),
         m_aDocument(nullptr != pDocument ? *pDocument : ScriptDocument::getApplicationScriptDocument()),
         m_aLibName(aLibName),
         m_aName(aName),
@@ -47,9 +56,16 @@ namespace Item
         implInstanceCleanup();
     }
 
-    std::shared_ptr<const Sbx> Sbx::Create(const ScriptDocument& rDocument, const OUString& aLibName, const OUString& aName, const OUString& aMethodName, ItemType eType)
+    std::shared_ptr<const Sbx> Sbx::Create(
+        const ScriptDocument& rDocument,
+        const OUString& aLibName,
+        const OUString& aName,
+        const OUString& aMethodName,
+        ItemType eType)
     {
-        return std::static_pointer_cast<const Sbx>(GetStaticAdmin().Create(new Sbx(&rDocument, aLibName, aName, aMethodName, eType)));
+        return std::static_pointer_cast<const Sbx>(
+            Sbx::GetStaticItemControlBlock().GetItemAdministrator()->Create(
+                new Sbx(&rDocument, aLibName, aName, aMethodName, eType)));
     }
 
     bool Sbx::operator==(const ItemBase& rCandidate) const
diff --git a/basctl/source/inc/IDEComboBox.hxx b/basctl/source/inc/IDEComboBox.hxx
index 392df989ebd3..283fe4dff1c4 100644
--- a/basctl/source/inc/IDEComboBox.hxx
+++ b/basctl/source/inc/IDEComboBox.hxx
@@ -60,7 +60,7 @@ public:
      * @param pState --
      */
     virtual void StateChanged(sal_uInt16 nSlotID, SfxItemState eState,
-                              const SfxPoolItem* pState, const ::Item::ItemBase::SharedPtr& rSlotItem) override;
+                              const SfxPoolItem* pState, const ::std::shared_ptr<const ::Item::ItemBase>& rSlotItem) override;
     /*!
      * Create combobox of Macro and Dialog Library
      *
@@ -189,7 +189,7 @@ public:
      * @param pState --
      */
     virtual void StateChanged(sal_uInt16 nSID, SfxItemState eState,
-                              const SfxPoolItem* pState, const ::Item::ItemBase::SharedPtr& rSlotItem) override;
+                              const SfxPoolItem* pState, const ::std::shared_ptr<const ::Item::ItemBase>& rSlotItem) override;
     /*!
      * Create ComboBox of Language
      *
diff --git a/basctl/source/inc/sbxitem.hxx b/basctl/source/inc/sbxitem.hxx
index 89ee646a35ae..fe6cc705b83d 100644
--- a/basctl/source/inc/sbxitem.hxx
+++ b/basctl/source/inc/sbxitem.hxx
@@ -23,7 +23,8 @@
 #include <svl/poolitem.hxx>
 
 // I2TM
-#include <item/base/ItemBaseStaticHelper.hxx>
+#include <item/base/ItemBase.hxx>
+//#include <item/base/ItemBaseStaticHelper.hxx>
 // ~I2TM
 
 namespace basctl
@@ -42,19 +43,11 @@ enum ItemType
 // I2TM
 namespace Item
 {
-    class Sbx;
-    typedef ::Item::ItemBaseStaticHelper<Sbx, ::Item::IAdministrator_vector> SbxStaticHelper;
-
-    class Sbx final : public SbxStaticHelper, public ::Item::ItemBase
+    class Sbx final : public ::Item::ItemBase
     {
     public:
-        // SharedPtr typedef to be used handling instances of given type
-        typedef std::shared_ptr<const Sbx> SharedPtr;
-
-    private:
-        // need to offer internal access to ItemAdministrator
-        // in each derivation - just calls GetStaticAdmin internally
-        virtual ::Item::ItemAdministrator* GetIAdministrator() const override;
+        static ::Item::ItemControlBlock& GetStaticItemControlBlock();
+        virtual ::Item::ItemControlBlock& GetItemControlBlock() const override;
 
     private:
         const ScriptDocument    m_aDocument;
@@ -64,8 +57,6 @@ namespace Item
         ItemType                m_eType;
 
     protected:
-        friend SbxStaticHelper;
-
         Sbx(
             const ScriptDocument* pDocument = nullptr,
             const OUString& aLibName = OUString(),
diff --git a/cui/source/dialogs/cuihyperdlg.cxx b/cui/source/dialogs/cuihyperdlg.cxx
index 331abdc2aed9..84b25bf20fb7 100644
--- a/cui/source/dialogs/cuihyperdlg.cxx
+++ b/cui/source/dialogs/cuihyperdlg.cxx
@@ -57,7 +57,7 @@ void SvxHlinkCtrl::dispose()
 }
 
 void SvxHlinkCtrl::StateChanged( sal_uInt16 nSID, SfxItemState eState,
-                                 const SfxPoolItem* pState, const Item::ItemBase::SharedPtr& /*rSlotItem*/ )
+                                 const SfxPoolItem* pState, const std::shared_ptr<const Item::ItemBase>& /*rSlotItem*/ )
 {
     if ( eState == SfxItemState::DEFAULT && !pParent->IsDisposed() )
     {
diff --git a/cui/source/inc/cuihyperdlg.hxx b/cui/source/inc/cuihyperdlg.hxx
index fb3ec9aad6e3..48a8894fcb40 100644
--- a/cui/source/inc/cuihyperdlg.hxx
+++ b/cui/source/inc/cuihyperdlg.hxx
@@ -61,7 +61,7 @@ public:
     virtual void dispose() override;
 
     virtual void    StateChanged( sal_uInt16 nSID, SfxItemState eState,
-                                const SfxPoolItem* pState, const Item::ItemBase::SharedPtr& rSlotItem ) override;
+                                const SfxPoolItem* pState, const std::shared_ptr<const Item::ItemBase>& rSlotItem ) override;
 };
 
 
diff --git a/idl/source/objects/slot.cxx b/idl/source/objects/slot.cxx
index e15d4ef19a53..d1885dda923b 100644
--- a/idl/source/objects/slot.cxx
+++ b/idl/source/objects/slot.cxx
@@ -614,10 +614,10 @@ sal_uInt16 SvMetaSlot::WriteSlotParamArray( SvIdlDataBase & rBase, SvStream & rO
             SvMetaAttribute * pPar  = rList[n];
             SvMetaType * pPType     = pPar->GetType();
             WriteTab( rOutStm, 1 );
+            // I2TM use simple self-demangling for VarName to support nakmespaces
             const OString aDemangledVarName(pPType->GetName().replaceAll("::", "_"));
             rOutStm.WriteCharPtr("{ (const SfxType*) &a")
                 // item type
-//               .WriteOString(pPType->GetName()).WriteCharPtr("_Impl, ")
                .WriteOString(aDemangledVarName).WriteCharPtr("_Impl, ")
                 // parameter name
                .WriteCharPtr("\"").WriteOString(pPar->GetName()).WriteCharPtr("\", ")
diff --git a/idl/source/objects/types.cxx b/idl/source/objects/types.cxx
index 2c214ff2f881..e3338ba01537 100644
--- a/idl/source/objects/types.cxx
+++ b/idl/source/objects/types.cxx
@@ -221,7 +221,7 @@ void SvMetaType::WriteSfxItem(
     const OString& rItemName, SvIdlDataBase const & rBase, SvStream& rOutStm )
 {
     WriteStars( rOutStm );
-//    OString aVarName = " a" + rItemName + "_Impl";
+    // I2TM use simple self-demangling for VarName to support nakmespaces
     const OString aDemangledVarName(" a" + rItemName.replaceAll("::", "_") + "_Impl");
 
     OStringBuffer aAttrArray;
@@ -246,7 +246,6 @@ void SvMetaType::WriteSfxItem(
     if (bExport)
         rOutStm.WriteCharPtr( "SFX2_DLLPUBLIC " );
     rOutStm.WriteOString( aTypeName )
-//           .WriteOString( aVarName ).WriteChar( ';' ) << endl;
            .WriteOString( aDemangledVarName ).WriteChar( ';' ) << endl;
     if (bReturn)
         return;
@@ -256,11 +255,11 @@ void SvMetaType::WriteSfxItem(
     rOutStm.WriteCharPtr( "#if !defined(_WIN32) && ((defined(DISABLE_DYNLOADING) && (defined(ANDROID) || defined(IOS) || defined(LINUX))) || STATIC_LINKING)" ) << endl;
     rOutStm.WriteCharPtr( "__attribute__((__weak__))" ) << endl;
     rOutStm.WriteCharPtr( "#endif" ) << endl;
-//    rOutStm.WriteOString( aTypeName ).WriteOString( aVarName )
     rOutStm.WriteOString( aTypeName ).WriteOString( aDemangledVarName )
            .WriteCharPtr( " = " ) << endl;
     rOutStm.WriteChar( '{' ) << endl;
 
+    // I2TM bIsSlotItem is temorary - when change would be completely done, may be remoevd
     const bool bIsSlotItem(rItemName.indexOf("Item::") >= 0);
     if(bIsSlotItem)
     {
@@ -276,10 +275,6 @@ void SvMetaType::WriteSfxItem(
     rOutStm.WriteCharPtr("&typeid(").WriteOString( rItemName ).WriteCharPtr( "), " );
     rOutStm.WriteOString( aAttrCount );
 
-    // rOutStm.WriteCharPtr( "\tcreateSfxPoolItem<" ).WriteOString( rItemName )
-    //     .WriteCharPtr(">, &typeid(").WriteOString( rItemName ).WriteCharPtr( "), " );
-    // rOutStm.WriteOString( aAttrCount );
-
     if( nAttrCount )
     {
         rOutStm.WriteCharPtr( ", { " );
diff --git a/include/avmedia/mediatoolbox.hxx b/include/avmedia/mediatoolbox.hxx
index 751d5d50c1be..56b9321c9a06 100644
--- a/include/avmedia/mediatoolbox.hxx
+++ b/include/avmedia/mediatoolbox.hxx
@@ -40,7 +40,7 @@ public:
                                 MediaToolBoxControl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbX );
                                 virtual ~MediaToolBoxControl() override;
 
-    virtual void                StateChanged( sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState, const Item::ItemBase::SharedPtr& rSlotItem ) override;
+    virtual void                StateChanged( sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState, const std::shared_ptr<const Item::ItemBase>& rSlotItem ) override;
     virtual VclPtr<vcl::Window> CreateItemWindow( vcl::Window* pParent ) override;
 
 private:
diff --git a/include/item/base/ItemAdministrator.hxx b/include/item/base/ItemAdministrator.hxx
index 81e90a45b308..e3e14aea126a 100644
--- a/include/item/base/ItemAdministrator.hxx
+++ b/include/item/base/ItemAdministrator.hxx
@@ -24,12 +24,15 @@
 #include <set>
 #include <unordered_set>
 #include <cassert>
-#include <item/base/ItemBase.hxx>
+//#include <item/base/ItemBase.hxx>
 
 ///////////////////////////////////////////////////////////////////////////////
 
 namespace Item
 {
+    // predefine ItemAdministrator and ItemBase - no need to include
+    class ItemBase;
+
     // Base class for ItemAdministrator. It's Task is to administer instances
     // of ItemBase - Items. Target is to always have only one instance
     // of a typed Item in one attributation, e.g. for sal_uInt16 many
@@ -64,13 +67,9 @@ namespace Item
     // for ModelSpecificItemValues need to be overriden.
     class ITEM_DLLPUBLIC ItemAdministrator
     {
-    protected:
-        // instance of global default value
-        ItemBase::SharedPtr m_aDefault;
-
     public:
         // constructor/destructor
-        ItemAdministrator(const ItemBase* pDefault);
+        ItemAdministrator();
         virtual ~ItemAdministrator();
 
         // noncopyable
@@ -82,12 +81,7 @@ namespace Item
         // will check existance/default and either re-use existing
         // instance (and delete given one) or start using given instance
         virtual void HintExpired(const ItemBase* pIBase);
-        virtual ItemBase::SharedPtr Create(const ItemBase* pIBase) = 0;
-
-        // interface for global default value support
-        // on Administrator level
-        const ItemBase::SharedPtr& GetDefault() const;
-        bool IsDefault(const ItemBase* pIBase) const;
+        virtual std::shared_ptr<const ItemBase> Create(const ItemBase* pIBase) = 0;
     };
 } // end of namespace Item
 
@@ -117,9 +111,9 @@ namespace Item
         std::set<const ItemBase*, less_for_set> m_aEntries;
 
     public:
-        IAdministrator_set(const ItemBase* pDefault);
+        IAdministrator_set();
 
-        virtual ItemBase::SharedPtr Create(const ItemBase* pIBase) override;
+        virtual std::shared_ptr<const ItemBase> Create(const ItemBase* pIBase) override;
         virtual void HintExpired(const ItemBase* pIBase) override;
     };
 } // end of namespace Item
@@ -160,9 +154,9 @@ namespace Item
         std::unordered_set<const ItemBase*, hash_for_unordered_set, compare_for_unordered_set> m_aEntries;
 
     public:
-        IAdministrator_unordered_set(const ItemBase* pDefault);
+        IAdministrator_unordered_set();
 
-        virtual ItemBase::SharedPtr Create(const ItemBase* pIBase) override;
+        virtual std::shared_ptr<const ItemBase> Create(const ItemBase* pIBase) override;
         virtual void HintExpired(const ItemBase* pIBase) override;
     };
 } // end of namespace Item
@@ -196,9 +190,9 @@ namespace Item
         void erase(std::vector<const ItemBase*>::iterator& rIter);
 
     public:
-        IAdministrator_vector(const ItemBase* pDefault);
+        IAdministrator_vector();
 
-        virtual ItemBase::SharedPtr Create(const ItemBase* pIBase) override;
+        virtual std::shared_ptr<const ItemBase> Create(const ItemBase* pIBase) override;
         virtual void HintExpired(const ItemBase* pIBase) override;
     };
 } // end of namespace Item
diff --git a/include/item/base/ItemBase.hxx b/include/item/base/ItemBase.hxx
index d06f766a4212..6af2858e8d0a 100644
--- a/include/item/base/ItemBase.hxx
+++ b/include/item/base/ItemBase.hxx
@@ -32,6 +32,7 @@ namespace Item
 {
     // predefine ItemAdministrator - no need to include
     class ItemAdministrator;
+    class ItemControlBlock;
 
     // Base class for ItemBase and thus for all new implementation of
     // Items. Items are in general read-only instances. The constructor
@@ -91,9 +92,6 @@ namespace Item
     class ITEM_DLLPUBLIC ItemBase : public std::enable_shared_from_this<ItemBase>
     {
     public:
-        // SharedPtr typedef to be used handling instances of this type
-        typedef std::shared_ptr<const ItemBase> SharedPtr;
-
         // typedefs for PutValues/PutValue/CreateFromAny functionality
         // used from the SfxSlot mechanism (see CreateSlotItem)
         typedef std::pair<const css::uno::Any, sal_uInt8> AnyIDPair;
@@ -114,6 +112,10 @@ namespace Item
         // but limited to a single local method in the implementation there
         friend void SetAdministratedFromItemAdministrator(ItemBase& rIBase);
 
+    public:
+        static ItemControlBlock& GetStaticItemControlBlock();
+        virtual ItemControlBlock& GetItemControlBlock() const;
+
     protected:
         // constructor - protected BY DEFAULT - do NOT CHANGE (!)
         // Use ::Create(...) methods in derived classes instead
@@ -125,13 +127,9 @@ namespace Item
         // basic RTTI TypeCheck to secure e.g. operator== and similar
         bool CheckSameType(const ItemBase& rCmp) const;
 
-        // basic access to Adminiatrator, default returns nullptr and is *not*
-        // designed to be used/called, only exists to have simple Item
-        // representations for special purposes, e.g. InvalidateItem/DisableItem
-        virtual ItemAdministrator* GetIAdministrator() const;
-
         // PutValue/Any interface for automated instance creation from SfxType
         // mechanism (UNO API and sfx2 stuff)
+        friend class ItemControlBlock;
         void PutValues(const AnyIDArgs& rArgs);
         virtual void PutValue(const css::uno::Any& rVal, sal_uInt8 nMemberId);
 
@@ -152,7 +150,7 @@ namespace Item
 
         // Interface for global default value support. These non-static and
         // non-virtual non-typed local versions can/may work more direct. The
-        // typed static versions are not capable of working with 'const ItemBase::SharedPtr&'
+        // typed static versions are not capable of working with 'const std::shared_ptr<const ItemBase>&'
         // due to using std::static_pointer_cast, thus these may be faster and
         // use less ressources when the type is not needed.
         // These will use the callback to static administrator and it's administrated
@@ -160,13 +158,20 @@ namespace Item
         // Remember that there *will* also be static, typed versions of this call
         // in derived Item(s), see ItemBaseStaticHelper for reference
         bool IsDefault() const;
-        const SharedPtr& GetDefault() const;
+        const std::shared_ptr<const ItemBase>& GetDefault() const;
 
         // check Administrated flag
         bool IsAdministrated() const
         {
             return m_bAdministrated;
         }
+
+        static bool IsDefault(const std::shared_ptr<const ItemBase>& rCandidate);
+
+        template<class T> static std::shared_ptr<const T> GetDefault()
+        {
+            return std::static_pointer_cast<const T>(T::GetStaticItemControlBlock().GetDefaultItem());
+        }
     };
 } // end of namespace Item
 
diff --git a/include/item/base/ItemBaseStaticHelper.hxx b/include/item/base/ItemBaseStaticHelper.hxx
deleted file mode 100644
index 29c228059836..000000000000
--- a/include/item/base/ItemBaseStaticHelper.hxx
+++ /dev/null
@@ -1,75 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- *   Licensed to the Apache Software Foundation (ASF) under one or more
- *   contributor license agreements. See the NOTICE file distributed
- *   with this work for additional information regarding copyright
- *   ownership. The ASF licenses this file to you under the Apache
- *   License, Version 2.0 (the "License"); you may not use this file
- *   except in compliance with the License. You may obtain a copy of
- *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
- */
-
-#ifndef INCLUDED_ITEM_BASE_ITEMBASESTATICHELPER_HXX
-#define INCLUDED_ITEM_BASE_ITEMBASESTATICHELPER_HXX
-
-#include <item/base/ItemBase.hxx>
-#include <item/base/ItemAdministrator.hxx>
-
-///////////////////////////////////////////////////////////////////////////////
-
-namespace Item
-{
-    // Template class which supports Item implementations using ItemBase.
-    // It allows automatic creation of default static methods.
-    // It provides implementation of all static typed stuff needed to
-    // implement and make available the single global static ItemAdministrator
-    // which will be used for the implementation of that new Item-type.
-    // Usually one of three predefined/preimplemented IAdministrators
-    // will be used, for details see ItemAdministrator.hxx and
-    // - IAdministrator_set
-    // - IAdministrator_unordered_set
-    // - IAdministrator_vector
-    // and the explanations/preconditions for their usage.
-    template< class TargetType, typename AdminType > class ItemBaseStaticHelper //: public ItemBase
-    {
-    protected:
-        static ItemAdministrator& GetStaticAdmin()
-        {
-            static AdminType aAdmin(new TargetType());
-            return aAdmin;
-        }
-
-    public:
-        static std::shared_ptr<const TargetType> GetStaticDefault()
-        {
-            return std::static_pointer_cast<const TargetType>(GetStaticAdmin().GetDefault());
-        }
-
-        static bool IsStaticDefault(const std::shared_ptr<const TargetType>& rCandidate)
-        {
-            return rCandidate && GetStaticAdmin().IsDefault(rCandidate.get());
-        }
-
-        // SharedPtr-constructor
-        static std::shared_ptr<const TargetType> CreateFromAny(const ItemBase::AnyIDArgs& rArgs)
-        {
-            TargetType* pNewInstance(new TargetType());
-            pNewInstance->PutValues(rArgs);
-            return std::shared_ptr<const TargetType>(pNewInstance);
-        }
-    };
-} // end of namespace Item
-
-///////////////////////////////////////////////////////////////////////////////
-
-#endif // INCLUDED_ITEM_BASE_ITEMBASESTATICHELPER_HXX
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/item/base/ItemControlBlock.hxx b/include/item/base/ItemControlBlock.hxx
new file mode 100755
index 000000000000..cfa2e62583fc
--- /dev/null
+++ b/include/item/base/ItemControlBlock.hxx
@@ -0,0 +1,71 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ *   Licensed to the Apache Software Foundation (ASF) under one or more
+ *   contributor license agreements. See the NOTICE file distributed
+ *   with this work for additional information regarding copyright
+ *   ownership. The ASF licenses this file to you under the Apache
+ *   License, Version 2.0 (the "License"); you may not use this file
+ *   except in compliance with the License. You may obtain a copy of
+ *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#ifndef INCLUDED_ITEM_BASE_ITEMCONTROLBLOCK_HXX
+#define INCLUDED_ITEM_BASE_ITEMCONTROLBLOCK_HXX
+
+#include <functional>
+
+///////////////////////////////////////////////////////////////////////////////
+
+namespace Item
+{
+    // predefine ItemAdministrator and ItemBase - no need to include
+    class ItemAdministrator;
+    class ItemBase;
+
+    class ITEM_DLLPUBLIC ItemControlBlock
+    {
+    private:
+        std::shared_ptr<ItemAdministrator>      m_aItemAdministrator;
+        const std::shared_ptr<const ItemBase>   m_aDefaultItem;
+        std::function<ItemBase*()>              m_aConstructItem;
+
+    public:
+        ItemControlBlock(
+            const std::shared_ptr<ItemAdministrator>& rItemAdministrator,
+            const std::shared_ptr<const ItemBase>& rDefaultItem,
+            std::function<ItemBase*()>constructItem);
+        ItemControlBlock();
+
+        const std::shared_ptr<ItemAdministrator>& GetItemAdministrator()
+        {
+            return m_aItemAdministrator;
+        }
+
+        const std::shared_ptr<const ItemBase>& GetDefaultItem() const
+        {
+            return m_aDefaultItem;
+        }
+
+        ItemBase* ConstructItem() const
+        {
+            return m_aConstructItem();
+        }
+
+        std::shared_ptr<const ItemBase> CreateFromAny(const ItemBase::AnyIDArgs& rArgs);
+        bool IsDefaultDDD(const ItemBase& rItem) const;
+    };
+} // end of namespace Item
+
+///////////////////////////////////////////////////////////////////////////////
+
+#endif // INCLUDED_ITEM_BASE_ITEMCONTROLBLOCK_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/item/base/ItemSet.hxx b/include/item/base/ItemSet.hxx
index 7be0092f5ddf..3f1cab7ed137 100644
--- a/include/item/base/ItemSet.hxx
+++ b/include/item/base/ItemSet.hxx
@@ -235,20 +235,20 @@ namespace Item
         ModelSpecificItemValues::SharedPtr m_aModelSpecificIValues;
 
         // the items as content
-        std::unordered_map<size_t, ItemBase::SharedPtr> m_aItems;
+        std::unordered_map<size_t, std::shared_ptr<const ItemBase>> m_aItems;
 
         // single global static instance for helper class ImplInvalidateItem
-        static const ItemBase::SharedPtr& getInvalidateItem()
+        static const std::shared_ptr<const ItemBase>& getInvalidateItem()
         {
-            static ItemBase::SharedPtr aImplInvalidateItem(new ImplInvalidateItem());
+            static std::shared_ptr<const ItemBase> aImplInvalidateItem(new ImplInvalidateItem());
 
             return aImplInvalidateItem;
         }
 
         // single global static instance for helper class ImplDisableItem
-        static const ItemBase::SharedPtr& getDisableItem()
+        static const std::shared_ptr<const ItemBase>& getDisableItem()
         {
-            static ItemBase::SharedPtr aImplDisableItem(new ImplDisableItem());
+            static std::shared_ptr<const ItemBase> aImplDisableItem(new ImplDisableItem());
 
             return aImplDisableItem;
         }
@@ -288,11 +288,11 @@ namespace Item
             m_aItems[hash_code] = getDisableItem();
         }
 
-        template< typename TItem > std::shared_ptr<TItem> GetDefault() const
+        template< typename TItem > std::shared_ptr<const TItem> GetDefault() const
         {
             // get static available default as instance
-            ItemBase::SharedPtr aRetval(TItem::GetStaticDefault());
-            assert(aRetval && "empty ItemBase::SharedPtr not allowed for default (!)");
+            std::shared_ptr<const ItemBase> aRetval(TItem::GetStaticItemControlBlock().GetDefaultItem());
+            assert(aRetval && "empty std::shared_ptr<const ItemBase> not allowed for default (!)");
 
             if(m_aModelSpecificIValues)
             {
@@ -301,10 +301,10 @@ namespace Item
                 aRetval = m_aModelSpecificIValues->GetDefault(aRetval);
             }
 
-            return std::static_pointer_cast<TItem>(aRetval);
+            return std::static_pointer_cast<const TItem>(aRetval);
         }
 
-        void SetItem(const ItemBase::SharedPtr& rItem);
+        void SetItem(const std::shared_ptr<const ItemBase>& rItem);
 
         template< typename TItem > StateAndItem<TItem> GetStateAndItem(bool bSearchParent = true) const
         {
@@ -313,7 +313,7 @@ namespace Item
 
             if(aRetval != m_aItems.end()) // && aRetval->second)
             {
-                assert(aRetval->second && "empty ItemBase::SharedPtr set in ItemSet (!)");
+                assert(aRetval->second && "empty std::shared_ptr<const ItemBase> set in ItemSet (!)");
 
                 if(aRetval->second.get() == getInvalidateItem().get())
                 {
diff --git a/include/item/base/ModelSpecificItemValues.hxx b/include/item/base/ModelSpecificItemValues.hxx
index 830145f9ab92..e8e9289686d1 100644
--- a/include/item/base/ModelSpecificItemValues.hxx
+++ b/include/item/base/ModelSpecificItemValues.hxx
@@ -45,7 +45,7 @@ namespace Item
 
     private:
         // the alternative default items
-        std::unordered_map<size_t, ItemBase::SharedPtr> m_aAlternativeItems;
+        std::unordered_map<size_t, std::shared_ptr<const ItemBase>> m_aAlternativeItems;
 
     protected:
         // constructor - protected BY DEFAULT - do NOT CHANGE (!)
@@ -63,9 +63,9 @@ namespace Item
         static SharedPtr Create();
 
         // AlternativeDefault interface
-        void SetAlternativeDefaultItem(const ItemBase::SharedPtr& rItem);
-        bool IsDefault(const ItemBase::SharedPtr& rItem) const;
-        const ItemBase::SharedPtr& GetDefault(const ItemBase::SharedPtr& rItem) const;
+        void SetAlternativeDefaultItem(const std::shared_ptr<const ItemBase>& rItem);
+        bool IsDefault(const std::shared_ptr<const ItemBase>& rItem) const;
+        const std::shared_ptr<const ItemBase>& GetDefault(const std::shared_ptr<const ItemBase>& rItem) const;
     };
 } // end of namespace Item
 
diff --git a/include/item/base/SlotSet.hxx b/include/item/base/SlotSet.hxx
index 73c9fe053298..491354463fa7 100755
--- a/include/item/base/SlotSet.hxx
+++ b/include/item/base/SlotSet.hxx
@@ -22,6 +22,7 @@
 
 #include <cassert>
 #include <item/base/ModelSpecificItemValues.hxx>
+#include <item/base/ItemControlBlock.hxx>
 
 ///////////////////////////////////////////////////////////////////////////////
 
@@ -36,7 +37,7 @@ namespace Item
 
     private:
         // the slots as content
-        std::unordered_map<SlotID, ItemBase::SharedPtr> m_aSlots;
+        std::unordered_map<SlotID, std::shared_ptr<const ItemBase>> m_aSlots;
 
     protected:
         // constructor - protected BY DEFAULT - do NOT CHANGE (!)
@@ -58,22 +59,22 @@ namespace Item
         // SharedPtr-construtcor
         static SharedPtr Create();
 
-        void SetSlot(SlotID aSlotID, const ItemBase::SharedPtr& rItem);
+        void SetSlot(SlotID aSlotID, const std::shared_ptr<const ItemBase>& rItem);
         void SetSlots(const SlotSet& rSlotSet);
 
-        template< typename TargetType > std::shared_ptr<const TargetType> GetSlot(SlotID aSlotID) const
+        template< typename TargetType > const std::shared_ptr<const TargetType> GetSlot(SlotID aSlotID) const
         {
             const auto aRetval(m_aSlots.find(aSlotID));
 
             if(aRetval != m_aSlots.end()) // && aRetval->second)
             {
-                assert(aRetval->second && "empty ItemBase::SharedPtr set in SlotSet (!)");
-                assert(typeid(*aRetval->second) == typeid(TargetType) && "wrong ItemBase::SharedPtr type in SlotSet (!)");
+                assert(aRetval->second && "empty std::shared_ptr<const ItemBase> set in SlotSet (!)");
+                assert(typeid(*aRetval->second) == typeid(TargetType) && "wrong std::shared_ptr<const ItemBase> type in SlotSet (!)");
 
                 return std::static_pointer_cast<TargetType>(aRetval->second);
             }
 
-            return TargetType::GetStaticDefault();
+            return std::static_pointer_cast<const TargetType>(TargetType::GetStaticItemControlBlock().GetDefaultItem());
         }
 
         bool ClearSlot(SlotID aSlotID);
diff --git a/include/item/simple/CntInt16.hxx b/include/item/simple/CntInt16.hxx
index a0d52940d9a4..677221f359d0 100644
--- a/include/item/simple/CntInt16.hxx
+++ b/include/item/simple/CntInt16.hxx
@@ -10,7 +10,7 @@
 #ifndef INCLUDED_ITEM_SIMPLE_CNTINT16_HXX
 #define INCLUDED_ITEM_SIMPLE_CNTINT16_HXX
 
-#include <item/base/ItemBaseStaticHelper.hxx>
+#include <item/base/ItemBase.hxx>
 
 ///////////////////////////////////////////////////////////////////////////////
 
@@ -20,35 +20,25 @@ namespace Item
     // It uses IAdministrator_set to provide an Administrator using
     // a sorted list for fast accesses. This requires ::operator< to be
     // implemented.
-    class CntInt16;
-    typedef ItemBaseStaticHelper<CntInt16, IAdministrator_set> CntInt16StaticHelper;
 
-    class ITEM_DLLPUBLIC CntInt16 : public CntInt16StaticHelper, public ItemBase
+    class ITEM_DLLPUBLIC CntInt16 : public ItemBase
     {
     public:
-        // SharedPtr typedef to be used handling instances of given type
-        typedef std::shared_ptr<const CntInt16> SharedPtr;
-
-    private:
-        // need to offer internal access to ItemAdministrator
-        // in each derivation - just calls GetStaticAdmin internally
-        virtual ItemAdministrator* GetIAdministrator() const override;
+        static ItemControlBlock& GetStaticItemControlBlock();
+        virtual ItemControlBlock& GetItemControlBlock() const override;
 
     private:
         // local variavbles
         sal_Int16 m_nValue;
 
     protected:
-        // allow local ItemAdministrator access to protected constructor
-        friend CntInt16StaticHelper;
-
         // SharedPtr-constructor - protected BY DEFAULT - do NOT CHANGE (!)
         CntInt16(sal_Int16 nValue = 0);
 
     public:
         virtual ~CntInt16();
 
-        static CntInt16::SharedPtr Create(sal_Int16 nValue);
+        static std::shared_ptr<const CntInt16> Create(sal_Int16 nValue);
         virtual bool operator==(const ItemBase& rCandidate) const override;
         virtual bool operator<(const ItemBase& rCandidate) const override;
         sal_Int16 GetValue() const;
diff --git a/include/item/simple/CntOUString.hxx b/include/item/simple/CntOUString.hxx
index 4f52ec33942e..1d5b085f7351 100644
--- a/include/item/simple/CntOUString.hxx
+++ b/include/item/simple/CntOUString.hxx
@@ -10,7 +10,8 @@
 #ifndef INCLUDED_ITEM_SIMPLE_CNTOUSTRING_HXX
 #define INCLUDED_ITEM_SIMPLE_CNTOUSTRING_HXX
 
-#include <item/base/ItemBaseStaticHelper.hxx>
+//#include <item/base/ItemBaseStaticHelper.hxx>
+#include <item/base/ItemBase.hxx>
 #include <rtl/ustring.hxx>
 
 ///////////////////////////////////////////////////////////////////////////////
@@ -21,28 +22,17 @@ namespace Item
     // It uses IAdministrator_unordered_set to provide an Administrator using
     // a hashed list for fast accesses. This requires ::operator== and
     // ::GetUniqueKey() to be implemented.
-    class CntOUString;
-    typedef ItemBaseStaticHelper<CntOUString, IAdministrator_unordered_set> CntOUStringStaticHelper;
-
-    class ITEM_DLLPUBLIC CntOUString : public CntOUStringStaticHelper, public ItemBase
+    class ITEM_DLLPUBLIC CntOUString : public ItemBase
     {
     public:
-        // SharedPtr typedef to be used handling instances of given type
-        typedef std::shared_ptr<const CntOUString> SharedPtr;
-
-    private:
-        // need to offer internal access to ItemAdministrator
-        // in each derivation - just calls GetStaticAdmin internally
-        virtual ItemAdministrator* GetIAdministrator() const override;
+        static ItemControlBlock& GetStaticItemControlBlock();
+        virtual ItemControlBlock& GetItemControlBlock() const override;
 
     private:
         // local variavbles
         rtl::OUString m_aValue;
 
     protected:
-        // allow local ItemAdministrator access to protected constructor
-        friend CntOUStringStaticHelper;
-
         // SharedPtr-constructor - protected BY DEFAULT - do NOT CHANGE (!)
         CntOUString(const rtl::OUString& rValue = rtl::OUString());
 
diff --git a/include/sfx2/ctrlitem.hxx b/include/sfx2/ctrlitem.hxx
index 2cea8cd1e85c..0a6d6fdb27d9 100644
--- a/include/sfx2/ctrlitem.hxx
+++ b/include/sfx2/ctrlitem.hxx
@@ -63,7 +63,7 @@ public:
     sal_uInt16          GetId() const { return nId; }
 
     virtual void        StateChanged( sal_uInt16 nSID, SfxItemState eState,
-                                      const SfxPoolItem* pState, const Item::ItemBase::SharedPtr& rSlotItem );
+                                      const SfxPoolItem* pState, const std::shared_ptr<const Item::ItemBase>& rSlotItem );
 
     MapUnit             GetCoreMetric() const;
 
@@ -79,7 +79,7 @@ class SFX2_DLLPUBLIC SfxStatusForwarder: public SfxControllerItem
 
 protected:
     virtual void        StateChanged( sal_uInt16 nSID, SfxItemState eState,
-                                      const SfxPoolItem* pState, const Item::ItemBase::SharedPtr& rSlotItem ) override;
+                                      const SfxPoolItem* pState, const std::shared_ptr<const Item::ItemBase>& rSlotItem ) override;
 
 public:
                             SfxStatusForwarder( sal_uInt16 nSlotId,
diff --git a/include/sfx2/msg.hxx b/include/sfx2/msg.hxx
index 849634b3b32a..53a97814b15b 100644
--- a/include/sfx2/msg.hxx
+++ b/include/sfx2/msg.hxx
@@ -101,14 +101,18 @@ template<class T> SfxPoolItem* createSfxPoolItem()
 {
     return T::CreateDefault();
 }
+// I2TM version for ::Item stuff - if all would be changed, version above may be deleted
 template<class T> std::shared_ptr<const T> createSlotItem(const Item::ItemBase::AnyIDArgs& rArgs)
 {
-    return T::CreateFromAny(rArgs);
+    // I2TM was 'return T::CreateFromAny(rArgs);' but no real need to have a
+    // static Item::CreateFromAny templated version
+    return std::static_pointer_cast<const T>(T::GetStaticItemControlBlock().CreateFromAny(rArgs));
 }
 struct SfxType
 {
     std::function<SfxPoolItem* ()> const createSfxPoolItemFunc;
-    std::function<Item::ItemBase::SharedPtr(const Item::ItemBase::AnyIDArgs& rArgs)> const createSlotItemFunc;
+    // I2TM extended to five members due to need of new creator method
+    std::function<std::shared_ptr<const Item::ItemBase>(const Item::ItemBase::AnyIDArgs& rArgs)> const createSlotItemFunc;
     const std::type_info* pType;
     sal_uInt16 const nAttribs;
     SfxTypeAttrib aAttrib[1]; // variable length
@@ -123,11 +127,13 @@ struct SfxType
         return std::unique_ptr<SfxPoolItem>(createSfxPoolItemFunc());
     }
 
-    Item::ItemBase::SharedPtr CreateSlotItem(const Item::ItemBase::AnyIDArgs& rArgs) const
+    // I2TM
+    std::shared_ptr<const Item::ItemBase> CreateSlotItem(const Item::ItemBase::AnyIDArgs& rArgs) const
     {
         return createSlotItemFunc(rArgs);
     }
 
+    // I2TM temporary
     bool isSlotItem() const
     {
         return nullptr != createSlotItemFunc;
@@ -137,7 +143,7 @@ struct SfxType
 struct SfxType0
 {
     std::function<SfxPoolItem* ()> const createSfxPoolItemFunc;
-    std::function<Item::ItemBase::SharedPtr(const Item::ItemBase::AnyIDArgs& rArgs)> const createSlotItemFunc;
+    std::function<std::shared_ptr<const Item::ItemBase>(const Item::ItemBase::AnyIDArgs& rArgs)> const createSlotItemFunc;
     const std::type_info* pType;
     sal_uInt16 const nAttribs;
 
@@ -149,7 +155,7 @@ struct SfxType0
 #define SFX_DECL_TYPE(n) struct SfxType##n \
 { \
     std::function<SfxPoolItem* ()> createSfxPoolItemFunc; \
-    std::function<Item::ItemBase::SharedPtr(const Item::ItemBase::AnyIDArgs& rArgs)> const createSlotItemFunc; \
+    std::function<std::shared_ptr<const Item::ItemBase>(const Item::ItemBase::AnyIDArgs& rArgs)> const createSlotItemFunc; \
     const std::type_info* pType; \
     sal_uInt16 nAttribs; \
     SfxTypeAttrib aAttrib[n]; \
@@ -208,7 +214,7 @@ struct SfxFormalArgument
         return pType->CreateSfxPoolItem();
     }
 
-    Item::ItemBase::SharedPtr CreateSlotItem(const Item::ItemBase::AnyIDArgs& rArgs) const
+    std::shared_ptr<const Item::ItemBase> CreateSlotItem(const Item::ItemBase::AnyIDArgs& rArgs) const
     {
         return pType->CreateSlotItem(rArgs);
     }
diff --git a/include/sfx2/sfxstatuslistener.hxx b/include/sfx2/sfxstatuslistener.hxx
index 3b3ec33c8153..44dba1f18db8 100644
--- a/include/sfx2/sfxstatuslistener.hxx
+++ b/include/sfx2/sfxstatuslistener.hxx
@@ -47,7 +47,7 @@ class SFX2_DLLPUBLIC SfxStatusListener : public cppu::WeakImplHelper<
         void    UnBind();
         void    ReBind();
 
-        virtual void StateChanged( sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState, const Item::ItemBase::SharedPtr& rSlotItem );
+        virtual void StateChanged( sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState, const std::shared_ptr<const Item::ItemBase>& rSlotItem );
 
         // XComponent
         virtual void SAL_CALL dispose() override;
diff --git a/include/sfx2/sidebar/ControllerItem.hxx b/include/sfx2/sidebar/ControllerItem.hxx
index c2372899447f..0f071a5145c6 100644
--- a/include/sfx2/sidebar/ControllerItem.hxx
+++ b/include/sfx2/sidebar/ControllerItem.hxx
@@ -76,7 +76,7 @@ public:
 
 protected:
 
-    virtual void StateChanged (sal_uInt16 nSId, SfxItemState eState, const SfxPoolItem* pState, const Item::ItemBase::SharedPtr& rSlotItem) override;
+    virtual void StateChanged (sal_uInt16 nSId, SfxItemState eState, const SfxPoolItem* pState, const std::shared_ptr<const Item::ItemBase>& rSlotItem) override;
 
 private:
     ItemUpdateReceiverInterface& mrItemUpdateReceiver;
diff --git a/include/sfx2/stbitem.hxx b/include/sfx2/stbitem.hxx
index ee429970375e..076f7b44a845 100644
--- a/include/sfx2/stbitem.hxx
+++ b/include/sfx2/stbitem.hxx
@@ -94,7 +94,7 @@ protected:
 
     // Old sfx2 interface
     virtual void    StateChanged( sal_uInt16 nSID, SfxItemState eState,
-                                  const SfxPoolItem* pState, const Item::ItemBase::SharedPtr& rSlotItem );
+                                  const SfxPoolItem* pState, const std::shared_ptr<const Item::ItemBase>& rSlotItem );
     virtual void    Click();
     virtual void    Command( const CommandEvent& rCEvt );
     virtual bool    MouseButtonDown( const MouseEvent & );
diff --git a/include/sfx2/tbxctrl.hxx b/include/sfx2/tbxctrl.hxx
index 7ccac5d3272f..78f4add866dd 100644
--- a/include/sfx2/tbxctrl.hxx
+++ b/include/sfx2/tbxctrl.hxx
@@ -137,7 +137,7 @@ protected:
     DECL_LINK( ClosePopupWindow, SfxPopupWindow *, void );
 
     // old SfxToolBoxControl methods
-    virtual void               StateChanged( sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState, const Item::ItemBase::SharedPtr& rSlotItem );
+    virtual void               StateChanged( sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState, const std::shared_ptr<const Item::ItemBase>& rSlotItem );
     virtual void               Select( sal_uInt16 nSelectModifier );
 
     virtual void               DoubleClick();
diff --git a/include/sfx2/unoctitm.hxx b/include/sfx2/unoctitm.hxx
index df2dcd29e33e..4766387118d1 100644
--- a/include/sfx2/unoctitm.hxx
+++ b/include/sfx2/unoctitm.hxx
@@ -130,7 +130,7 @@ public:
     static OUString getSlaveCommand( const css::util::URL& rURL );
 
     void                StateChanged( sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState, SfxSlotServer const * pServ );
-    virtual void        StateChanged( sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState, const Item::ItemBase::SharedPtr& rSlotItem ) override;
+    virtual void        StateChanged( sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState, const std::shared_ptr<const Item::ItemBase>& rSlotItem ) override;
     void                setMasterSlaveCommand( bool bSet );
     /// @throws css::uno::RuntimeException
     void       dispatch( const css::util::URL& aURL,
diff --git a/include/svx/ParaSpacingControl.hxx b/include/svx/ParaSpacingControl.hxx
index 3ff213936290..67feabc8269e 100644
--- a/include/svx/ParaSpacingControl.hxx
+++ b/include/svx/ParaSpacingControl.hxx
@@ -37,7 +37,7 @@ public:
     virtual ~ParaULSpacingControl() override;
 
     virtual void StateChanged(sal_uInt16 nSID, SfxItemState eState,
-                              const SfxPoolItem* pState, const Item::ItemBase::SharedPtr& rSlotItem) override;
+                              const SfxPoolItem* pState, const std::shared_ptr<const Item::ItemBase>& rSlotItem) override;
     virtual VclPtr<vcl::Window> CreateItemWindow(vcl::Window* pParent) override = 0;
 };
 
@@ -71,7 +71,7 @@ public:
     virtual void SAL_CALL dispose() override;
 
     virtual void StateChanged(sal_uInt16 nSID, SfxItemState eState,
-                              const SfxPoolItem* pState, const Item::ItemBase::SharedPtr& rSlotItem) override;
+                              const SfxPoolItem* pState, const std::shared_ptr<const Item::ItemBase>& rSlotItem) override;
     virtual VclPtr<vcl::Window> CreateItemWindow(vcl::Window* pParent) override = 0;
 
     // XContextChangeEventListener
diff --git a/include/svx/bmpmask.hxx b/include/svx/bmpmask.hxx
index 53cd4ba6fe6b..3e6c35a4150e 100644
--- a/include/svx/bmpmask.hxx
+++ b/include/svx/bmpmask.hxx
@@ -59,7 +59,7 @@ private:
 
 protected:
     virtual void StateChanged( sal_uInt16 nSID, SfxItemState eState,
-                               const SfxPoolItem* pState, const Item::ItemBase::SharedPtr& rSlotItem ) override;
+                               const SfxPoolItem* pState, const std::shared_ptr<const Item::ItemBase>& rSlotItem ) override;
 
 public:
     SvxBmpMaskSelectItem( SvxBmpMask& rMask,
diff --git a/include/svx/clipboardctl.hxx b/include/svx/clipboardctl.hxx
index 4e4bd075a1a3..6a84eb14910f 100644
--- a/include/svx/clipboardctl.hxx
+++ b/include/svx/clipboardctl.hxx
@@ -49,7 +49,7 @@ public:
     virtual VclPtr<SfxPopupWindow> CreatePopupWindow() override;
     virtual void                StateChanged( sal_uInt16 nSID,
                                               SfxItemState eState,
-                                              const SfxPoolItem* pState, const Item::ItemBase::SharedPtr& rSlotItem ) override;
+                                              const SfxPoolItem* pState, const std::shared_ptr<const Item::ItemBase>& rSlotItem ) override;
 };
 
 #endif
diff --git a/include/svx/fillctrl.hxx b/include/svx/fillctrl.hxx
index 55d5d87e6f0e..42de248b99f8 100644
--- a/include/svx/fillctrl.hxx
+++ b/include/svx/fillctrl.hxx
@@ -70,7 +70,7 @@ public:
     SvxFillToolBoxControl(sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx);
     virtual ~SvxFillToolBoxControl() override;
 
-    virtual void StateChanged(sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState, const Item::ItemBase::SharedPtr& rSlotItem) override;
+    virtual void StateChanged(sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState, const std::shared_ptr<const Item::ItemBase>& rSlotItem) override;
     void Update();
     virtual VclPtr<vcl::Window> CreateItemWindow(vcl::Window* pParent) override;
 };
diff --git a/include/svx/float3d.hxx b/include/svx/float3d.hxx
index 5b0698e58984..91d0b1815493 100644
--- a/include/svx/float3d.hxx
+++ b/include/svx/float3d.hxx
@@ -236,7 +236,7 @@ class Svx3DCtrlItem : public SfxControllerItem
 {
  protected:
     virtual void StateChanged( sal_uInt16 nSId, SfxItemState eState,
-                                const SfxPoolItem* pState, const Item::ItemBase::SharedPtr& rSlotItem ) override;
+                                const SfxPoolItem* pState, const std::shared_ptr<const Item::ItemBase>& rSlotItem ) override;
 
  public:
     Svx3DCtrlItem( sal_uInt16, SfxBindings* );
@@ -254,7 +254,7 @@ class SvxConvertTo3DItem : public SfxControllerItem
     bool                        bState;
 
 protected:
-    virtual void StateChanged(sal_uInt16 nSId, SfxItemState eState, const SfxPoolItem* pState, const Item::ItemBase::SharedPtr& rSlotItem) override;
+    virtual void StateChanged(sal_uInt16 nSId, SfxItemState eState, const SfxPoolItem* pState, const std::shared_ptr<const Item::ItemBase>& rSlotItem) override;
 
 public:
     SvxConvertTo3DItem(sal_uInt16 nId, SfxBindings* pBindings);
diff --git a/include/svx/fontwork.hxx b/include/svx/fontwork.hxx
index aee0aced0cf7..ff53e0485b9b 100644
--- a/include/svx/fontwork.hxx
+++ b/include/svx/fontwork.hxx
@@ -58,7 +58,7 @@ class SvxFontWorkControllerItem : public SfxControllerItem
 
 protected:
     virtual void StateChanged(sal_uInt16 nSID, SfxItemState eState,
-                              const SfxPoolItem* pState, const Item::ItemBase::SharedPtr& rSlotItem) override;
+                              const SfxPoolItem* pState, const std::shared_ptr<const Item::ItemBase>& rSlotItem) override;
 
 public:
     SvxFontWorkControllerItem(sal_uInt16 nId, SvxFontWorkDialog&, SfxBindings&);
diff --git a/include/svx/formatpaintbrushctrl.hxx b/include/svx/formatpaintbrushctrl.hxx
index 03fb6b62f2a2..496a668df5c7 100644
--- a/include/svx/formatpaintbrushctrl.hxx
+++ b/include/svx/formatpaintbrushctrl.hxx
@@ -41,7 +41,7 @@ public:
     virtual void    Select(sal_uInt16 nSelectModifier) override;
 
     virtual void    StateChanged( sal_uInt16 nSID, SfxItemState eState,
-                                              const SfxPoolItem* pState, const Item::ItemBase::SharedPtr& rSlotItem ) override;
+                                              const SfxPoolItem* pState, const std::shared_ptr<const Item::ItemBase>& rSlotItem ) override;
 private:
     DECL_LINK( WaitDoubleClickHdl, Timer*, void );
     void impl_executePaintBrush();
diff --git a/include/svx/grafctrl.hxx b/include/svx/grafctrl.hxx
index 854484b90908..2309f4a5ac95 100644
--- a/include/svx/grafctrl.hxx
+++ b/include/svx/grafctrl.hxx
@@ -32,7 +32,7 @@ public:
     SvxGrafToolBoxControl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx );
     virtual ~SvxGrafToolBoxControl() override;
 
-    virtual void        StateChanged( sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState, const Item::ItemBase::SharedPtr& rSlotItem ) override;
+    virtual void        StateChanged( sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState, const std::shared_ptr<const Item::ItemBase>& rSlotItem ) override;
     virtual VclPtr<vcl::Window> CreateItemWindow( vcl::Window *pParent ) override;
 };
 
@@ -100,7 +100,7 @@ public:
                         SvxGrafModeToolBoxControl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx );
                         virtual ~SvxGrafModeToolBoxControl() override;
 
-    virtual void        StateChanged( sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState, const Item::ItemBase::SharedPtr& rSlotItem ) override;
+    virtual void        StateChanged( sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState, const std::shared_ptr<const Item::ItemBase>& rSlotItem ) override;
     virtual VclPtr<vcl::Window> CreateItemWindow( vcl::Window *pParent ) override;
 };
 
diff --git a/include/svx/imapdlg.hxx b/include/svx/imapdlg.hxx
index eed8b334f498..1ad202fc0c18 100644
--- a/include/svx/imapdlg.hxx
+++ b/include/svx/imapdlg.hxx
@@ -67,7 +67,7 @@ class SvxIMapDlgItem : public SfxControllerItem
 protected:
 
     virtual void StateChanged( sal_uInt16 nSID, SfxItemState eState,
-                               const SfxPoolItem* pState, const Item::ItemBase::SharedPtr& rSlotItem ) override;
+                               const SfxPoolItem* pState, const std::shared_ptr<const Item::ItemBase>& rSlotItem ) override;
 
 
 public:
diff --git a/include/svx/insctrl.hxx b/include/svx/insctrl.hxx
index 68a9eec5ad84..46306e774a68 100644
--- a/include/svx/insctrl.hxx
+++ b/include/svx/insctrl.hxx
@@ -27,7 +27,7 @@ class SVX_DLLPUBLIC SvxInsertStatusBarControl : public SfxStatusBarControl
 {
 public:
     virtual void    StateChanged( sal_uInt16 nSID, SfxItemState eState,
-                                  const SfxPoolItem* pState, const Item::ItemBase::SharedPtr& rSlotItem ) override;
+                                  const SfxPoolItem* pState, const std::shared_ptr<const Item::ItemBase>& rSlotItem ) override;
     virtual void    Paint( const UserDrawEvent& rEvt ) override;
 
     SFX_DECL_STATUSBAR_CONTROL();
diff --git a/include/svx/layctrl.hxx b/include/svx/layctrl.hxx
index e6ddc26de437..60306e5d7075 100644
--- a/include/svx/layctrl.hxx
+++ b/include/svx/layctrl.hxx
@@ -31,7 +31,7 @@ public:
     virtual VclPtr<SfxPopupWindow> CreatePopupWindow() override;
     virtual void                StateChanged( sal_uInt16 nSID,
                                               SfxItemState eState,
-                                              const SfxPoolItem* pState, const Item::ItemBase::SharedPtr& rSlotItem ) override;
+                                              const SfxPoolItem* pState, const std::shared_ptr<const Item::ItemBase>& rSlotItem ) override;
 
     SFX_DECL_TOOLBOX_CONTROL();
 
@@ -52,7 +52,7 @@ public:
 
     virtual void                StateChanged( sal_uInt16 nSID,
                                               SfxItemState eState,
-                                              const SfxPoolItem* pState, const Item::ItemBase::SharedPtr& rSlotItem ) override;
+                                              const SfxPoolItem* pState, const std::shared_ptr<const Item::ItemBase>& rSlotItem ) override;
 };
 
 #endif
diff --git a/include/svx/lboxctrl.hxx b/include/svx/lboxctrl.hxx
index 60166d60e38b..3a92af52e085 100644
--- a/include/svx/lboxctrl.hxx
+++ b/include/svx/lboxctrl.hxx
@@ -49,7 +49,7 @@ public:
 
     virtual void StateChanged( sal_uInt16 nSID,
                                SfxItemState eState,
-                               const SfxPoolItem* pState, const Item::ItemBase::SharedPtr& rSlotItem ) override;
+                               const SfxPoolItem* pState, const std::shared_ptr<const Item::ItemBase>& rSlotItem ) override;
 
     virtual VclPtr<SfxPopupWindow> CreatePopupWindow() override;
 };
diff --git a/include/svx/linectrl.hxx b/include/svx/linectrl.hxx
index cdb9c2eb99ac..5d74b4c3093f 100644
--- a/include/svx/linectrl.hxx
+++ b/include/svx/linectrl.hxx
@@ -51,7 +51,7 @@ public:
     virtual ~SvxLineStyleToolBoxControl() override;
 
     virtual void        StateChanged( sal_uInt16 nSID, SfxItemState eState,
-                                      const SfxPoolItem* pState, const Item::ItemBase::SharedPtr& rSlotItem ) override;
+                                      const SfxPoolItem* pState, const std::shared_ptr<const Item::ItemBase>& rSlotItem ) override;
     void                Update( const SfxPoolItem* pState );
     virtual VclPtr<vcl::Window> CreateItemWindow( vcl::Window *pParent ) override;
 };
@@ -69,7 +69,7 @@ public:
     virtual ~SvxLineWidthToolBoxControl() override;
 
     virtual void        StateChanged( sal_uInt16 nSID, SfxItemState eState,
-                                      const SfxPoolItem* pState, const Item::ItemBase::SharedPtr& rSlotItem ) override;
+                                      const SfxPoolItem* pState, const std::shared_ptr<const Item::ItemBase>& rSlotItem ) override;
     virtual VclPtr<vcl::Window> CreateItemWindow( vcl::Window *pParent ) override;
 };
 
diff --git a/include/svx/modctrl.hxx b/include/svx/modctrl.hxx
index 29b672d07636..c46f5db9fe77 100644
--- a/include/svx/modctrl.hxx
+++ b/include/svx/modctrl.hxx
@@ -31,7 +31,7 @@ class SVX_DLLPUBLIC SvxModifyControl : public SfxStatusBarControl
 {
 public:
     virtual void    StateChanged( sal_uInt16 nSID, SfxItemState eState,
-                                  const SfxPoolItem* pState, const Item::ItemBase::SharedPtr& rSlotItem ) override;
+                                  const SfxPoolItem* pState, const std::shared_ptr<const Item::ItemBase>& rSlotItem ) override;
     virtual void    Paint( const UserDrawEvent& rUsrEvt ) override;
     virtual void    Click() override;
 
diff --git a/include/svx/pszctrl.hxx b/include/svx/pszctrl.hxx
index 7a5b35b39e86..a5c9f36a0f7a 100644
--- a/include/svx/pszctrl.hxx
+++ b/include/svx/pszctrl.hxx
@@ -37,7 +37,7 @@ public:
     SvxPosSizeStatusBarControl( sal_uInt16 nSlotId, sal_uInt16 nId, StatusBar& rStb );
     virtual ~SvxPosSizeStatusBarControl() override;
 
-    virtual void    StateChanged( sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState, const Item::ItemBase::SharedPtr& rSlotItem ) override;
+    virtual void    StateChanged( sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState, const std::shared_ptr<const Item::ItemBase>& rSlotItem ) override;
     virtual void    Paint( const UserDrawEvent& rEvt ) override;
     virtual void    Command( const CommandEvent& rCEvt ) override;
 };
diff --git a/include/svx/selctrl.hxx b/include/svx/selctrl.hxx
index ae346c2cbfa0..34e4e2c3dc0c 100644
--- a/include/svx/selctrl.hxx
+++ b/include/svx/selctrl.hxx
@@ -32,7 +32,7 @@ public:
     SvxSelectionModeControl( sal_uInt16 nSlotId, sal_uInt16 nId, StatusBar& rStb );
 
     virtual void     StateChanged( sal_uInt16 nSID, SfxItemState eState,
-                                   const SfxPoolItem* pState, const Item::ItemBase::SharedPtr& rSlotItem ) override;
+                                   const SfxPoolItem* pState, const std::shared_ptr<const Item::ItemBase>& rSlotItem ) override;
     virtual bool     MouseButtonDown( const MouseEvent& rEvt ) override;
     virtual void     Paint( const UserDrawEvent& rEvt ) override;
 
diff --git a/include/svx/tbcontrl.hxx b/include/svx/tbcontrl.hxx
index 5a5e3181e1d1..dc7fd663a53f 100644
--- a/include/svx/tbcontrl.hxx
+++ b/include/svx/tbcontrl.hxx
@@ -170,7 +170,7 @@ public:
     virtual VclPtr<vcl::Window> CreateItemWindow(vcl::Window* pParent) override;
 
     virtual void StateChanged(sal_uInt16 nSID, SfxItemState eState,
-                              const SfxPoolItem* pState, const Item::ItemBase::SharedPtr& rSlotItem) override;
+                              const SfxPoolItem* pState, const std::shared_ptr<const Item::ItemBase>& rSlotItem) override;
 
     DECL_LINK( VisibilityNotification, SvxStyleBox_Impl&, void );
 protected:
@@ -259,7 +259,7 @@ public:
     virtual ~SvxSimpleUndoRedoController() override;
 
     virtual void StateChanged(sal_uInt16 nSID, SfxItemState eState,
-                              const SfxPoolItem* pState, const Item::ItemBase::SharedPtr& rSlotItem) override;
+                              const SfxPoolItem* pState, const std::shared_ptr<const Item::ItemBase>& rSlotItem) override;
 };
 
 class SVX_DLLPUBLIC SvxCurrencyToolBoxControl : public svt::PopupWindowController
diff --git a/include/svx/tbxctl.hxx b/include/svx/tbxctl.hxx
index 180a3ed26510..feac07550f85 100644
--- a/include/svx/tbxctl.hxx
+++ b/include/svx/tbxctl.hxx
@@ -46,7 +46,7 @@ public:
 
     virtual void                Select(sal_uInt16 nSelectModifier) override;
     virtual void                StateChanged( sal_uInt16 nSID, SfxItemState eState,
-                                              const SfxPoolItem* pState, const Item::ItemBase::SharedPtr& rSlotItem ) override;
+                                              const SfxPoolItem* pState, const std::shared_ptr<const Item::ItemBase>& rSlotItem ) override;
 };
 
 #endif
diff --git a/include/svx/verttexttbxctrl.hxx b/include/svx/verttexttbxctrl.hxx
index cd64d57993a4..e73b8ad5334f 100644
--- a/include/svx/verttexttbxctrl.hxx
+++ b/include/svx/verttexttbxctrl.hxx
@@ -35,7 +35,7 @@ public:
     virtual void SAL_CALL initialize(const css::uno::Sequence<css::uno::Any>& rArguments) override;
 
     virtual void                StateChanged( sal_uInt16 nSID, SfxItemState eState,
-                                              const SfxPoolItem* pState, const Item::ItemBase::SharedPtr& rSlotItem ) override;
+                                              const SfxPoolItem* pState, const std::shared_ptr<const Item::ItemBase>& rSlotItem ) override;
 };
 
 class SVX_DLLPUBLIC SvxCTLTextTbxCtrl : public SvxVertCTLTextTbxCtrl
diff --git a/include/svx/xmlsecctrl.hxx b/include/svx/xmlsecctrl.hxx
index ec479fcc8dea..f872526e91f2 100644
--- a/include/svx/xmlsecctrl.hxx
+++ b/include/svx/xmlsecctrl.hxx
@@ -39,7 +39,7 @@ public:
     XmlSecStatusBarControl( sal_uInt16 _nSlotId, sal_uInt16 _nId, StatusBar& _rStb );
     virtual ~XmlSecStatusBarControl() override;
 
-    virtual void    StateChanged( sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState, const Item::ItemBase::SharedPtr& rSlotItem ) override;
+    virtual void    StateChanged( sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState, const std::shared_ptr<const Item::ItemBase>& rSlotItem ) override;
     virtual void    Paint( const UserDrawEvent& rEvt ) override;
     virtual void    Command( const CommandEvent& rCEvt ) override;
 };
diff --git a/include/svx/zoomctrl.hxx b/include/svx/zoomctrl.hxx
index 88301bbc2f29..e3acef4de096 100644
--- a/include/svx/zoomctrl.hxx
+++ b/include/svx/zoomctrl.hxx
@@ -32,7 +32,7 @@ private:
 
 public:
     virtual void    StateChanged( sal_uInt16 nSID, SfxItemState eState,
-                                  const SfxPoolItem* pState, const Item::ItemBase::SharedPtr& rSlotItem ) override;
+                                  const SfxPoolItem* pState, const std::shared_ptr<const Item::ItemBase>& rSlotItem ) override;
     virtual void    Paint( const UserDrawEvent& rEvt ) override;
     virtual void    Command( const CommandEvent& rCEvt ) override;
 
diff --git a/include/svx/zoomsliderctrl.hxx b/include/svx/zoomsliderctrl.hxx
index 7c289a522ba1..a2a039c85b17 100644
--- a/include/svx/zoomsliderctrl.hxx
+++ b/include/svx/zoomsliderctrl.hxx
@@ -44,7 +44,7 @@ public:
     SvxZoomSliderControl( sal_uInt16 _nSlotId, sal_uInt16 _nId, StatusBar& _rStb );
     virtual ~SvxZoomSliderControl() override;
 
-    virtual void  StateChanged( sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState, const Item::ItemBase::SharedPtr& rSlotItem ) override;
+    virtual void  StateChanged( sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState, const std::shared_ptr<const Item::ItemBase>& rSlotItem ) override;
     virtual void  Paint( const UserDrawEvent& rEvt ) override;
     virtual bool  MouseButtonDown( const MouseEvent & ) override;
     virtual bool  MouseButtonUp( const MouseEvent & ) override;
diff --git a/item/Library_item.mk b/item/Library_item.mk
index dd7de41135ca..f59247140a1f 100644
--- a/item/Library_item.mk
+++ b/item/Library_item.mk
@@ -36,6 +36,7 @@ $(eval $(call gb_Library_add_exception_objects,item,\
     item/source/base/ModelSpecificItemValues \
     item/source/base/ItemSet \
     item/source/base/SlotSet \
+    item/source/base/ItemControlBlock \
     item/source/simple/CntInt16 \
     item/source/simple/CntOUString \
 ))
diff --git a/item/source/base/ItemAdministrator.cxx b/item/source/base/ItemAdministrator.cxx
index c3aa8a0b8aa2..5010b4b02830 100644
--- a/item/source/base/ItemAdministrator.cxx
+++ b/item/source/base/ItemAdministrator.cxx
@@ -18,10 +18,8 @@ namespace Item
         rIBase.m_bAdministrated = true;
     }
 
-    ItemAdministrator::ItemAdministrator(const ItemBase* pDefault)
-    :   m_aDefault(ItemBase::SharedPtr(pDefault))
+    ItemAdministrator::ItemAdministrator()
     {
-        assert(pDefault != nullptr && "nullptr not allowed, default *is* required (!)");
     }
 
     ItemAdministrator::~ItemAdministrator()
@@ -35,39 +33,29 @@ namespace Item
         // m_aDefault being destroyed from ~ItemAdministrator() above as last thing in
         // ItemAdministrator cleanup, the derived classes are no longer available at that time.
     }
-
-    const ItemBase::SharedPtr& ItemAdministrator::GetDefault() const
-    {
-        return m_aDefault;
-    }
-
-    bool ItemAdministrator::IsDefault(const ItemBase* pIBase) const
-    {
-        assert(pIBase != nullptr && "nullptr not allowed (!)");
-        return pIBase == m_aDefault.get() || pIBase->operator==(*m_aDefault.get());
-    }
 } // end of namespace Item
 
 ///////////////////////////////////////////////////////////////////////////////
 
 namespace Item
 {
-    IAdministrator_set::IAdministrator_set(const ItemBase* pDefault)
-    :   ItemAdministrator(pDefault),
+    IAdministrator_set::IAdministrator_set()
+    :   ItemAdministrator(),
         m_aEntries()
     {
     }
 
-    ItemBase::SharedPtr IAdministrator_set::Create(const ItemBase* pIBase)
+    std::shared_ptr<const ItemBase> IAdministrator_set::Create(const ItemBase* pIBase)
     {
         assert(pIBase != nullptr && "nullptr not allowed (!)");
 
-        if(IsDefault(pIBase))
+        if(pIBase->IsDefault())
         {
             // if the Item to-be-created equals default, delete it and
             // use the existing single global default
+            const std::shared_ptr<const ItemBase>& rDefault(pIBase->GetDefault());
             delete pIBase;
-            return GetDefault();
+            return rDefault;
         }
 
         // check for existance
@@ -85,7 +73,7 @@ namespace Item
             // start using offered instance and administrate it from now
             SetAdministratedFromItemAdministrator(*const_cast<ItemBase*>(pIBase));
             m_aEntries.insert(pIBase);
-            return ItemBase::SharedPtr(pIBase);
+            return std::shared_ptr<const ItemBase>(pIBase);
         }
     }
 
@@ -107,22 +95,23 @@ namespace Item
 
 namespace Item
 {
-    IAdministrator_unordered_set::IAdministrator_unordered_set(const ItemBase* pDefault)
-    :   ItemAdministrator(pDefault),
+    IAdministrator_unordered_set::IAdministrator_unordered_set()
+    :   ItemAdministrator(),
         m_aEntries()
     {
     }
 
-    ItemBase::SharedPtr IAdministrator_unordered_set::Create(const ItemBase* pIBase)
+    std::shared_ptr<const ItemBase> IAdministrator_unordered_set::Create(const ItemBase* pIBase)
     {
         assert(pIBase != nullptr && "nullptr not allowed (!)");
 
-        if(IsDefault(pIBase))
+        if(pIBase->IsDefault())
         {
             // if the Item to-be-created equals default, delete it and
             // use the existing single global default
+            const std::shared_ptr<const ItemBase>& rDefault(pIBase->GetDefault());
             delete pIBase;
-            return GetDefault();
+            return rDefault;
         }
 
         // check for existance
@@ -140,7 +129,7 @@ namespace Item
             // start using offered instance and administrate it from now
             SetAdministratedFromItemAdministrator(*const_cast<ItemBase*>(pIBase));
             m_aEntries.insert(pIBase);
-            return ItemBase::SharedPtr(pIBase);
+            return std::shared_ptr<const ItemBase>(pIBase);
         }
     }
 
@@ -234,23 +223,24 @@ namespace Item
         }
     }
 
-    IAdministrator_vector::IAdministrator_vector(const ItemBase* pDefault)
-    :   ItemAdministrator(pDefault),
+    IAdministrator_vector::IAdministrator_vector()
+    :   ItemAdministrator(),
         m_aEntries(),
         m_aFreeSlots()
     {
     }
 
-    ItemBase::SharedPtr IAdministrator_vector::Create(const ItemBase* pIBase)
+    std::shared_ptr<const ItemBase> IAdministrator_vector::Create(const ItemBase* pIBase)
     {
         assert(pIBase != nullptr && "nullptr not allowed (!)");
 
-        if(IsDefault(pIBase))
+        if(pIBase->IsDefault())
         {
             // if the Item to-be-created equals default, delete it and
             // use the existing single global default
+            const std::shared_ptr<const ItemBase>& rDefault(pIBase->GetDefault());
             delete pIBase;
-            return GetDefault();
+            return rDefault;
         }
 
         // check for existance
@@ -268,7 +258,7 @@ namespace Item
             // start using offered instance and administrate it from now
             SetAdministratedFromItemAdministrator(*const_cast<ItemBase*>(pIBase));
             insert(pIBase);
-            return ItemBase::SharedPtr(pIBase);
+            return std::shared_ptr<const ItemBase>(pIBase);
         }
     }
 
diff --git a/item/source/base/ItemBase.cxx b/item/source/base/ItemBase.cxx
index f4b5705aae2e..1e7ac4d55fc9 100644
--- a/item/source/base/ItemBase.cxx
+++ b/item/source/base/ItemBase.cxx
@@ -9,6 +9,7 @@
 
 #include <item/base/ItemBase.hxx>
 #include <item/base/ItemAdministrator.hxx>
+#include <item/base/ItemControlBlock.hxx>
 #include <cassert>
 
 ///////////////////////////////////////////////////////////////////////////////
@@ -202,6 +203,22 @@ class SW_DLLPUBLIC SwPaMItem : public SfxPoolItem
 
 namespace Item
 {
+    ItemControlBlock& ItemBase::GetStaticItemControlBlock()
+    {
+        assert(false && "ItemBase::GetItemControlBlock call not allowed (!)");
+        static ItemControlBlock aItemControlBlock(
+            std::shared_ptr<ItemAdministrator>(),
+            std::shared_ptr<const ItemBase>(),
+            [](){ return nullptr; });
+
+        return aItemControlBlock;
+    }
+
+    ItemControlBlock& ItemBase::GetItemControlBlock() const
+    {
+        return ItemBase::GetStaticItemControlBlock();
+    }
+
     ItemBase::ItemBase()
     :   std::enable_shared_from_this<ItemBase>(),
         m_bAdministrated(false)
@@ -213,13 +230,6 @@ namespace Item
         return typeid(rCmp) == typeid(*this);
     }
 
-    ItemAdministrator* ItemBase::GetIAdministrator() const
-    {
-        // not intended to be used, error
-        assert(false && "ItemBase::GetIAdministrator call not allowed (!)");
-        return nullptr;
-    }
-
     void ItemBase::PutValues(const AnyIDArgs& rArgs)
     {
         for(const auto& arg : rArgs)
@@ -238,7 +248,7 @@ namespace Item
     {
         if(IsAdministrated())
         {
-            GetIAdministrator()->HintExpired(this);
+            GetItemControlBlock().GetItemAdministrator()->HintExpired(this);
         }
     }
 
@@ -271,14 +281,20 @@ namespace Item
 
     bool ItemBase::IsDefault() const
     {
-        // callback to static administrator
-        return GetIAdministrator()->IsDefault(this);
+        // callback to ItemControlBlock
+        return GetItemControlBlock().IsDefaultDDD(*this);
+    }
+
+    const std::shared_ptr<const ItemBase>& ItemBase::GetDefault() const
+    {
+        // callback to ItemControlBlock
+        assert(GetItemControlBlock().GetDefaultItem() && "empty DefaultItem detected - not allowed (!)");
+        return GetItemControlBlock().GetDefaultItem();
     }
 
-    const ItemBase::SharedPtr& ItemBase::GetDefault() const
+    bool ItemBase::IsDefault(const std::shared_ptr<const ItemBase>& rCandidate)
     {
-        // callback to static administrator
-        return GetIAdministrator()->GetDefault();
+        return rCandidate && rCandidate->GetItemControlBlock().IsDefaultDDD(*rCandidate);
     }
 } // end of namespace Item
 
diff --git a/item/source/base/ItemControlBlock.cxx b/item/source/base/ItemControlBlock.cxx
new file mode 100755
index 000000000000..c95517e7ef12
--- /dev/null
+++ b/item/source/base/ItemControlBlock.cxx
@@ -0,0 +1,53 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <cassert>
+#include <item/base/ItemControlBlock.hxx>
+
+///////////////////////////////////////////////////////////////////////////////
+
+namespace Item
+{
+    ItemControlBlock::ItemControlBlock(
+        const std::shared_ptr<ItemAdministrator>& rItemAdministrator,
+        const std::shared_ptr<const ItemBase>& rDefaultItem,
+        std::function<ItemBase*()>constructItem)
+    :   m_aItemAdministrator(rItemAdministrator),
+        m_aDefaultItem(rDefaultItem),
+        m_aConstructItem(constructItem)
+    {
+        assert(rItemAdministrator && "nullptr not allowed, an ItemAdministrator *is* required (!)");
+        assert(rDefaultItem && "nullptr not allowed, a default value *is* required (!)");
+    }
+
+    ItemControlBlock::ItemControlBlock()
+    :   m_aItemAdministrator(),
+        m_aDefaultItem(),
+        m_aConstructItem()
+    {
+    }
+
+    std::shared_ptr<const ItemBase> ItemControlBlock::CreateFromAny(const ItemBase::AnyIDArgs& rArgs)
+    {
+        ItemBase* pNewInstance(ConstructItem());
+        pNewInstance->PutValues(rArgs);
+        return std::shared_ptr<const ItemBase>(pNewInstance);
+    }
+
+    bool ItemControlBlock::IsDefaultDDD(const ItemBase& rItem) const
+    {
+        assert(nullptr != m_aDefaultItem.get() && "empty DefaultItem detected - not allowed (!)");
+        assert(typeid(rItem) == typeid(*m_aDefaultItem) && "different types compared - not allowed (!)");
+        return &rItem == m_aDefaultItem.get() || rItem.operator==(*m_aDefaultItem.get());
+    }
+} // end of namespace Item
+
+///////////////////////////////////////////////////////////////////////////////
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/item/source/base/ItemSet.cxx b/item/source/base/ItemSet.cxx
index e2a2e6b8b547..7a8a58b2dabd 100644
--- a/item/source/base/ItemSet.cxx
+++ b/item/source/base/ItemSet.cxx
@@ -46,9 +46,9 @@ namespace Item
         return m_aModelSpecificIValues;
     }
 
-    void ItemSet::SetItem(const ItemBase::SharedPtr& rItem)
+    void ItemSet::SetItem(const std::shared_ptr<const ItemBase>& rItem)
     {
-        assert(rItem && "empty ItemBase::SharedPtr not allowed - and should be unable to be created (!)");
+        assert(rItem && "empty std::shared_ptr<const ItemBase> not allowed - and should be unable to be created (!)");
         bool bDefault(false);
 
         // detect if rItem is default item, include evtl. model-specific
@@ -62,7 +62,7 @@ namespace Item
         else
         {
             // use Item's own static global default
-            bDefault = rItem->IsDefault();
+            bDefault = ItemBase::IsDefault(rItem);
         }
 
         const size_t hash_code(typeid(*rItem).hash_code());
@@ -83,7 +83,7 @@ namespace Item
     {
         for(const auto& candidate : rSource.m_aItems)
         {
-            assert(candidate.second && "empty ItemBase::SharedPtr not allowed - and should be unable to be created (!)");
+            assert(candidate.second && "empty std::shared_ptr<const ItemBase> not allowed - and should be unable to be created (!)");
 
             if(bDontCareToDefault && candidate.second.get() == getInvalidateItem().get())
             {
diff --git a/item/source/base/ModelSpecificItemValues.cxx b/item/source/base/ModelSpecificItemValues.cxx
index 265649b0e9e3..99831349d95c 100644
--- a/item/source/base/ModelSpecificItemValues.cxx
+++ b/item/source/base/ModelSpecificItemValues.cxx
@@ -29,17 +29,17 @@ namespace Item
         return ModelSpecificItemValues::SharedPtr(new ModelSpecificItemValues());
     }
 
-    void ModelSpecificItemValues::SetAlternativeDefaultItem(const ItemBase::SharedPtr& rItem)
+    void ModelSpecificItemValues::SetAlternativeDefaultItem(const std::shared_ptr<const ItemBase>& rItem)
     {
-        assert(rItem && "empty ItemBase::SharedPtr not allowed - and should be unable to be created (!)");
+        assert(rItem && "empty std::shared_ptr<const ItemBase> not allowed - and should be unable to be created (!)");
         const size_t hash_code(typeid(*rItem).hash_code());
 
         m_aAlternativeItems[hash_code] = rItem;
     }
 
-    bool ModelSpecificItemValues::IsDefault(const ItemBase::SharedPtr& rItem) const
+    bool ModelSpecificItemValues::IsDefault(const std::shared_ptr<const ItemBase>& rItem) const
     {
-        assert(rItem && "empty ItemBase::SharedPtr not allowed - and should be unable to be created (!)");
+        assert(rItem && "empty std::shared_ptr<const ItemBase> not allowed - and should be unable to be created (!)");
 
         if(!m_aAlternativeItems.empty())
         {
@@ -54,12 +54,12 @@ namespace Item
         }
 
         // use Item's own static global default
-        return rItem->IsDefault();
+        return ItemBase::IsDefault(rItem);
     }
 
-    const ItemBase::SharedPtr& ModelSpecificItemValues::GetDefault(const ItemBase::SharedPtr& rItem) const
+    const std::shared_ptr<const ItemBase>& ModelSpecificItemValues::GetDefault(const std::shared_ptr<const ItemBase>& rItem) const
     {
-        assert(rItem && "empty ItemBase::SharedPtr not allowed - and should be unable to be created (!)");
+        assert(rItem && "empty std::shared_ptr<const ItemBase> not allowed - and should be unable to be created (!)");
 
         if(!m_aAlternativeItems.empty())
         {
diff --git a/item/source/base/SlotSet.cxx b/item/source/base/SlotSet.cxx
index e2ddda5a0013..1783caba9baf 100755
--- a/item/source/base/SlotSet.cxx
+++ b/item/source/base/SlotSet.cxx
@@ -29,9 +29,9 @@ namespace Item
         return SlotSet::SharedPtr(new SlotSet());
     }
 
-    void SlotSet::SetSlot(SlotID aSlotID, const ItemBase::SharedPtr& rItem)
+    void SlotSet::SetSlot(SlotID aSlotID, const std::shared_ptr<const ItemBase>& rItem)
     {
-        assert(rItem && "empty ItemBase::SharedPtr not allowed - and should be unable to be created (!)");
+        assert(rItem && "empty std::shared_ptr<const ItemBase> not allowed - and should be unable to be created (!)");
         m_aSlots[aSlotID] = rItem;
     }
 
diff --git a/item/source/simple/CntInt16.cxx b/item/source/simple/CntInt16.cxx
index 2bbbc1dc240e..14885387a979 100644
--- a/item/source/simple/CntInt16.cxx
+++ b/item/source/simple/CntInt16.cxx
@@ -9,20 +9,30 @@
 
 #include <cassert>
 #include <item/simple/CntInt16.hxx>
+#include <item/base/ItemAdministrator.hxx>
+#include <item/base/ItemControlBlock.hxx>
 
 ///////////////////////////////////////////////////////////////////////////////
 
 namespace Item
 {
-    // need internal access to ItemAdministrator
-    ItemAdministrator* CntInt16::GetIAdministrator() const
+    ItemControlBlock& CntInt16::GetStaticItemControlBlock()
     {
-        return &GetStaticAdmin();
+        static ItemControlBlock aItemControlBlock(
+            std::shared_ptr<ItemAdministrator>(new IAdministrator_set()),
+            std::shared_ptr<const ItemBase>(new CntInt16()),
+            [](){ return new CntInt16(); });
+
+        return aItemControlBlock;
+    }
+
+    ItemControlBlock& CntInt16::GetItemControlBlock() const
+    {
+        return CntInt16::GetStaticItemControlBlock();
     }
 
     CntInt16::CntInt16(sal_Int16 nValue)
-    :   CntInt16StaticHelper(),
-        ItemBase(),
+    :   ItemBase(),
         m_nValue(nValue)
     {
     }
@@ -35,13 +45,15 @@ namespace Item
         implInstanceCleanup();
     }
 
-    CntInt16::SharedPtr CntInt16::Create(sal_Int16 nValue)
+    std::shared_ptr<const CntInt16> CntInt16::Create(sal_Int16 nValue)
     {
         // use ::Create(...) method with local incarnation, it will handle
         // - detection of being default (will delete local incarnation)
         // - detection of reuse (will delete local incarnation)
         // - detectiomn of new use - will create shared_ptr for local incarnation and buffer
-        return std::static_pointer_cast<const CntInt16>(GetStaticAdmin().Create(new CntInt16(nValue)));
+        return std::static_pointer_cast<const CntInt16>(
+            CntInt16::GetStaticItemControlBlock().GetItemAdministrator()->Create(
+                new CntInt16(nValue)));
     }
 
     bool CntInt16::operator==(const ItemBase& rCandidate) const
diff --git a/item/source/simple/CntOUString.cxx b/item/source/simple/CntOUString.cxx
index b18a9340a690..bd77b934cb05 100644
--- a/item/source/simple/CntOUString.cxx
+++ b/item/source/simple/CntOUString.cxx
@@ -9,20 +9,30 @@
 
 #include <cassert>
 #include <item/simple/CntOUString.hxx>
+#include <item/base/ItemAdministrator.hxx>
+#include <item/base/ItemControlBlock.hxx>
 
 ///////////////////////////////////////////////////////////////////////////////
 
 namespace Item
 {
-    // need internal access to ItemAdministrator
-    ItemAdministrator* CntOUString::GetIAdministrator() const
+    ItemControlBlock& CntOUString::GetStaticItemControlBlock()
     {
-        return &GetStaticAdmin();
+        static ItemControlBlock aItemControlBlock(
+            std::shared_ptr<ItemAdministrator>(new IAdministrator_unordered_set()),
+            std::shared_ptr<const ItemBase>(new CntOUString()),
+            [](){ return new CntOUString(); });
+
+        return aItemControlBlock;
+    }
+
+    ItemControlBlock& CntOUString::GetItemControlBlock() const
+    {
+        return CntOUString::GetStaticItemControlBlock();
     }
 
     CntOUString::CntOUString(const rtl::OUString& rValue)
-    :   CntOUStringStaticHelper(),
-        ItemBase(),
+    :   ItemBase(),
         m_aValue(rValue)
     {
     }
@@ -41,7 +51,9 @@ namespace Item
         // - detection of being default (will delete local incarnation)
         // - detection of reuse (will delete local incarnation)
         // - detectiomn of new use - will create shared_ptr for local incarnation and buffer
-        return std::static_pointer_cast<const CntOUString>(GetStaticAdmin().Create(new CntOUString(rValue)));
+        return std::static_pointer_cast<const CntOUString>(
+            CntOUString::GetStaticItemControlBlock().GetItemAdministrator()->Create(
+                new CntOUString(rValue)));
     }
 
     bool CntOUString::operator==(const ItemBase& rCandidate) const
diff --git a/item/test/ItemTest.cxx b/item/test/ItemTest.cxx
index 6b0029bdd9c3..46816e7507c5 100644
--- a/item/test/ItemTest.cxx
+++ b/item/test/ItemTest.cxx
@@ -18,29 +18,30 @@
 #include <item/base/ItemSet.hxx>
 #include <item/simple/CntInt16.hxx>
 #include <item/simple/CntOUString.hxx>
+#include <item/base/ItemControlBlock.hxx>
 
 namespace Item
 {
     // example for multi value Item
-    class MultiValueAB;
-    typedef ItemBaseStaticHelper<MultiValueAB, IAdministrator_vector> MultiValueStaticHelperAB;
-
     // if this should be based on faster IAdministrator_set, changes needed would be:
     // - typedef ItemBaseStaticHelper<MultiValueAB, IAdministrator_set> MultiValueStaticHelperAB;
     // - define virtual bool operator<(const ItemBase& rCandidate) const override
-
-    class MultiValueAB : public MultiValueStaticHelperAB, public ItemBase
+    class MultiValueAB : public ItemBase
     {
     public:
-        // SharedPtr typedef to be used handling instances of given type
-        typedef std::shared_ptr<const MultiValueAB> SharedPtr;
+        static ItemControlBlock& MultiValueAB::GetStaticItemControlBlock()
+        {
+            static ItemControlBlock aItemControlBlock(
+                std::shared_ptr<ItemAdministrator>(new IAdministrator_vector()),
+                std::shared_ptr<const ItemBase>(new MultiValueAB()),
+                [](){ return new MultiValueAB(); });
 
-    private:
-        // need to offer internal access to ItemAdministrator
-        // in each derivation - just calls GetStaticAdmin internally
-        virtual ItemAdministrator* GetIAdministrator() const override
+            return aItemControlBlock;
+        }
+
+        virtual ItemControlBlock& MultiValueAB::GetItemControlBlock() const override
         {
-            return &MultiValueStaticHelperAB::GetStaticAdmin();
+            return MultiValueAB::GetStaticItemControlBlock();
         }
 
     private:
@@ -48,11 +49,8 @@ namespace Item
         sal_Int32 m_nValueB;
 
     protected:
-        friend MultiValueStaticHelperAB;
-
         MultiValueAB(sal_Int16 nValueA = 0, sal_Int16 nValueB = 0)
-        :   MultiValueStaticHelperAB(),
-            ItemBase(),
+        :   ItemBase(),
             m_nValueA(nValueA),
             m_nValueB(nValueB)
         {
@@ -74,7 +72,7 @@ namespace Item
             // - detection of reuse (will delete local incarnation)
             // - detectiomn of new use - will create shared_ptr for local incarnation and buffer
             return std::static_pointer_cast<const MultiValueAB>(
-                MultiValueStaticHelperAB::GetStaticAdmin().Create(
+                MultiValueAB::GetStaticItemControlBlock().GetItemAdministrator()->Create(
                     new MultiValueAB(nValueA, nValueB)));
         }
 
@@ -111,32 +109,30 @@ namespace Item
 {
     // example for multi value Item deived from already defined one,
     // adding parameters (only one here)
-    class MultiValueABC;
-    typedef ItemBaseStaticHelper<MultiValueABC, IAdministrator_vector> MultiValueStaticHelperABC;
-
-    class MultiValueABC : public MultiValueAB, public MultiValueStaticHelperABC
+    class MultiValueABC : public MultiValueAB
     {
     public:
-        // SharedPtr typedef to be used handling instances of given type
-        typedef std::shared_ptr<const MultiValueABC> SharedPtr;
+        static ItemControlBlock& MultiValueABC::GetStaticItemControlBlock()
+        {
+            static ItemControlBlock aItemControlBlock(
+                std::shared_ptr<ItemAdministrator>(new IAdministrator_vector()),
+                std::shared_ptr<const ItemBase>(new MultiValueABC()),
+                [](){ return new MultiValueABC(); });
 
-    private:
-        // need to offer internal access to ItemAdministrator
-        // in each derivation - just calls GetStaticAdmin internally
-        virtual ItemAdministrator* GetIAdministrator() const override
+            return aItemControlBlock;
+        }
+
+        virtual ItemControlBlock& MultiValueABC::GetItemControlBlock() const override
         {
-            return &MultiValueStaticHelperABC::GetStaticAdmin();
+            return MultiValueABC::GetStaticItemControlBlock();
         }
 
     private:
         sal_Int64 m_nValueC;
 
     protected:
-        friend MultiValueStaticHelperABC;
-
         MultiValueABC(sal_Int16 nValueA = 0, sal_Int16 nValueB = 0, sal_Int16 nValueC = 0)
         :   MultiValueAB(nValueA, nValueB),
-            MultiValueStaticHelperABC(),
             m_nValueC(nValueC)
         {
         }
@@ -157,7 +153,7 @@ namespace Item
             // - detection of reuse (will delete local incarnation)
             // - detectiomn of new use - will create shared_ptr for local incarnation and buffer
             return std::static_pointer_cast<const MultiValueABC>(
-                MultiValueStaticHelperABC::GetStaticAdmin().Create(
+                MultiValueABC::GetStaticItemControlBlock().GetItemAdministrator()->Create(
                     new MultiValueABC(nValueA, nValueB, nValueC)));
         }
 
@@ -191,8 +187,20 @@ namespace Item
     class MultiValueAB_Alternative : public MultiValueAB
     {
     public:
-        // SharedPtr typedef to be used handling instances of given type
-        typedef std::shared_ptr<const MultiValueAB_Alternative> SharedPtr;
+        static ItemControlBlock& MultiValueAB_Alternative::GetStaticItemControlBlock()
+        {
+            static ItemControlBlock aItemControlBlock(
+                MultiValueABC::GetStaticItemControlBlock().GetItemAdministrator(),
+                std::shared_ptr<const ItemBase>(new MultiValueAB_Alternative()),
+                [](){ return new MultiValueAB_Alternative(); });
+
+            return aItemControlBlock;
+        }
+
+        virtual ItemControlBlock& MultiValueAB_Alternative::GetItemControlBlock() const override
+        {
+            return MultiValueAB_Alternative::GetStaticItemControlBlock();
+        }
 
     protected:
         MultiValueAB_Alternative(sal_Int16 nValueA = 0, sal_Int16 nValueB = 0)
@@ -208,7 +216,7 @@ namespace Item
             // - detection of reuse (will delete local incarnation)
             // - detectiomn of new use - will create shared_ptr for local incarnation and buffer
             return std::static_pointer_cast<const MultiValueAB_Alternative>(
-                MultiValueStaticHelperAB::GetStaticAdmin().Create(
+                MultiValueAB_Alternative::GetStaticItemControlBlock().GetItemAdministrator()->Create(
                     new MultiValueAB_Alternative(nValueA, nValueB)));
         }
 
@@ -247,31 +255,26 @@ namespace Item
             // current SfxPoolItem/SfxItemSet/SfxItemPool stuff ...
             int nIncrement(0);
 
-            MultiValueAB::SharedPtr mhas3(MultiValueAB::Create(5,2));
-            MultiValueAB::SharedPtr mhas4(MultiValueAB::Create(2,3));
-
-            if(MultiValueStaticHelperAB::IsStaticDefault(MultiValueAB::Create(3,0)))
-            {
-                nIncrement++;
-            }
+            std::shared_ptr<const MultiValueAB> mhas3(MultiValueAB::Create(5,2));
+            std::shared_ptr<const MultiValueAB> mhas4(MultiValueAB::Create(2,3));
 
-            if(MultiValueStaticHelperAB::IsStaticDefault(MultiValueAB::Create(8,7)))
+            if(ItemBase::IsDefault(MultiValueAB::Create(3,0)))
             {
                 nIncrement++;
             }
 
-            if(MultiValueStaticHelperAB::IsStaticDefault(MultiValueStaticHelperAB::GetStaticDefault()))
+            if(ItemBase::IsDefault(MultiValueAB::Create(8,7)))
             {
                 nIncrement++;
             }
 
-            if(MultiValueStaticHelperABC::IsStaticDefault(MultiValueStaticHelperABC::GetStaticDefault()))
+            if(ItemBase::IsDefault(ItemBase::GetDefault<MultiValueAB>()))
             {
                 nIncrement++;
             }
 
-            MultiValueAB::SharedPtr testAA(MultiValueAB::Create(11,22));
-            std::vector<MultiValueAB::SharedPtr> test;
+            std::shared_ptr<const MultiValueAB> testAA(MultiValueAB::Create(11,22));
+            std::vector<std::shared_ptr<const MultiValueAB>> test;
             const sal_uInt32 nLoopNumber(50);
 
             for(sal_uInt32 aloop(0); aloop < nLoopNumber; aloop++)
@@ -279,8 +282,8 @@ namespace Item
                 test.push_back(MultiValueAB::Create(aloop+1, (aloop+1)*2));
             }
 
-            MultiValueAB::SharedPtr testA(MultiValueAB::Create(2,4));
-            MultiValueAB::SharedPtr testB(MultiValueAB::Create(2,3));
+            std::shared_ptr<const MultiValueAB> testA(MultiValueAB::Create(2,4));
+            std::shared_ptr<const MultiValueAB> testB(MultiValueAB::Create(2,3));
 
             for(sal_uInt32 dloop(0); dloop < nLoopNumber; dloop+=2)
             {
@@ -308,25 +311,25 @@ namespace Item
             // make direct use of local MultiValueABC item
             int nIncrement(0);
 
-            MultiValueABC::SharedPtr mhas3x(MultiValueABC::Create(5,2,5));
-            MultiValueABC::SharedPtr mhas4x(MultiValueABC::Create(2,3,7));
+            std::shared_ptr<const MultiValueABC> mhas3x(MultiValueABC::Create(5,2,5));
+            std::shared_ptr<const MultiValueABC> mhas4x(MultiValueABC::Create(2,3,7));
 
-            if(MultiValueStaticHelperABC::IsStaticDefault(MultiValueABC::Create(3,0,5)))
+            if(ItemBase::IsDefault(MultiValueABC::Create(3,0,5)))
             {
                 nIncrement++;
             }
 
-            if(MultiValueStaticHelperABC::IsStaticDefault(MultiValueABC::Create(8,7,12)))
+            if(ItemBase::IsDefault(MultiValueABC::Create(8,7,12)))
             {
                 nIncrement++;
             }
 
-            if(MultiValueStaticHelperABC::IsStaticDefault(MultiValueStaticHelperABC::GetStaticDefault()))
+            if(ItemBase::IsDefault(ItemBase::GetDefault<MultiValueABC>()))
             {
                 nIncrement++;
             }
 
-            std::vector<MultiValueABC::SharedPtr> testx;
+            std::vector<std::shared_ptr<const MultiValueABC>> testx;
             const sal_uInt32 nLoopNumber(50);
 
             for(sal_uInt32 aloop(0); aloop < nLoopNumber; aloop++)
@@ -334,8 +337,8 @@ namespace Item
                 testx.push_back(MultiValueABC::Create(aloop+1, (aloop+1)*2, (aloop+1)*4));
             }
 
-            MultiValueABC::SharedPtr testAx(MultiValueABC::Create(2,4,3));
-            MultiValueABC::SharedPtr testBx(MultiValueABC::Create(2,4,6));
+            std::shared_ptr<const MultiValueABC> testAx(MultiValueABC::Create(2,4,3));
+            std::shared_ptr<const MultiValueABC> testBx(MultiValueABC::Create(2,4,6));
 
             for(sal_uInt32 dloop(0); dloop < nLoopNumber; dloop+=2)
             {
@@ -362,32 +365,32 @@ namespace Item
         {
             int nIncrement(0);
             const sal_uInt32 nLoopNumber(50);
-            MultiValueAB_Alternative::SharedPtr mhas3_A(MultiValueAB_Alternative::Create(5,2));
+            std::shared_ptr<const MultiValueAB_Alternative> mhas3_A(MultiValueAB_Alternative::Create(5,2));
 
-            if(MultiValueStaticHelperAB::IsStaticDefault(MultiValueAB_Alternative::Create(3,0)))
+            if(ItemBase::IsDefault(MultiValueAB_Alternative::Create(3,0)))
             {
                 nIncrement++;
             }
 
-            if(MultiValueStaticHelperAB::IsStaticDefault(MultiValueAB_Alternative::Create(8,7)))
+            if(ItemBase::IsDefault(MultiValueAB_Alternative::Create(8,7)))
             {
                 nIncrement++;
             }
 
-            if(MultiValueStaticHelperAB::IsStaticDefault(MultiValueStaticHelperAB::GetStaticDefault()))
+            if(ItemBase::IsDefault(ItemBase::GetDefault<MultiValueAB_Alternative>()))
             {
                 nIncrement++;
             }
 
-            std::vector<MultiValueAB_Alternative::SharedPtr> testAB_A;
+            std::vector<std::shared_ptr<const MultiValueAB_Alternative>> testAB_A;
 
             for(sal_uInt32 aloop(0); aloop < nLoopNumber; aloop++)
             {
                 testAB_A.push_back(MultiValueAB_Alternative::Create(aloop+1, (aloop+1)*2));
             }
 
-            MultiValueAB_Alternative::SharedPtr testA_A(MultiValueAB_Alternative::Create(2,4));
-            MultiValueAB_Alternative::SharedPtr testB_A(MultiValueAB_Alternative::Create(2,3));
+            std::shared_ptr<const MultiValueAB_Alternative> testA_A(MultiValueAB_Alternative::Create(2,4));
+            std::shared_ptr<const MultiValueAB_Alternative> testB_A(MultiValueAB_Alternative::Create(2,3));
 
             for(sal_uInt32 dloop(0); dloop < nLoopNumber; dloop+=2)
             {
@@ -447,10 +450,10 @@ namespace Item
         void checkSimpleItems()
         {
             static bool bInit(false);
-            static CntInt16::SharedPtr a_sp, b_sp, c_sp;
-            static CntInt16::SharedPtr theDefault;
-            static CntOUString::SharedPtr sa_sp, sb_sp, sc_sp;
-            static CntOUString::SharedPtr stheDefault;
+            static std::shared_ptr<const CntInt16> a_sp, b_sp, c_sp;
+            static std::shared_ptr<const CntInt16> theDefault;
+            static std::shared_ptr<const CntOUString> sa_sp, sb_sp, sc_sp;
+            static std::shared_ptr<const CntOUString> stheDefault;
             const sal_uInt32 nLoopNumber(50);
             int nIncrement(0);
 
@@ -460,35 +463,35 @@ namespace Item
                 a_sp = CntInt16::Create(3);
                 b_sp = CntInt16::Create(5);
                 c_sp = CntInt16::Create(7);
-                theDefault = CntInt16::GetStaticDefault();
+                theDefault = ItemBase::GetDefault<CntInt16>();
 
                 sa_sp = CntOUString::Create("Hello");
                 sb_sp = CntOUString::Create("World");
                 sc_sp = CntOUString::Create("..of Doom!");
-                stheDefault = CntOUString::GetStaticDefault();
+                stheDefault = ItemBase::GetDefault<CntOUString>();
             }
 
             ///////////////////////////////////////////////////////////////////////////////
 
-            CntInt16::SharedPtr has3(CntInt16::Create(3));
-            CntInt16::SharedPtr has4(CntInt16::Create(4));
+            std::shared_ptr<const CntInt16> has3(CntInt16::Create(3));
+            std::shared_ptr<const CntInt16> has4(CntInt16::Create(4));
 
-            if(CntInt16::IsStaticDefault(CntInt16::Create(11)))
+            if(ItemBase::IsDefault(CntInt16::Create(11)))
             {
                 nIncrement++;
             }
 
-            if(CntInt16::IsStaticDefault(CntInt16::Create(0)))
+            if(ItemBase::IsDefault(CntInt16::Create(0)))
             {
                 nIncrement++;
             }
 
-            if(CntInt16::IsStaticDefault(theDefault))
+            if(ItemBase::IsDefault(theDefault))
             {
                 nIncrement++;
             }
 
-            std::vector<CntInt16::SharedPtr> test16;
+            std::vector<std::shared_ptr<const CntInt16>> test16;
 
             for(sal_uInt32 a(0); a < nLoopNumber; a++)
             {
@@ -499,25 +502,25 @@ namespace Item
 
             ///////////////////////////////////////////////////////////////////////////////
 
-            CntOUString::SharedPtr shas3(CntOUString::Create("Hello"));
-            CntOUString::SharedPtr shas4(CntOUString::Create("WhateverComesAlong"));
+            std::shared_ptr<const CntOUString> shas3(CntOUString::Create("Hello"));
+            std::shared_ptr<const CntOUString> shas4(CntOUString::Create("WhateverComesAlong"));
 
-            if(CntOUString::IsStaticDefault(CntOUString::Create("NotDefault")))
+            if(ItemBase::IsDefault(CntOUString::Create("NotDefault")))
             {
                 nIncrement++;
             }
 
-            if(CntOUString::IsStaticDefault(CntOUString::Create(OUString())))
+            if(ItemBase::IsDefault(CntOUString::Create(OUString())))
             {
                 nIncrement++;
             }
 
-            if(CntOUString::IsStaticDefault(stheDefault))
+            if(ItemBase::IsDefault(stheDefault))
             {
                 nIncrement++;
             }
 
-            std::vector<CntOUString::SharedPtr> testStr;
+            std::vector<std::shared_ptr<const CntOUString>> testStr;
 
             for(sal_uInt32 a(0); a < nLoopNumber; a++)
             {
@@ -554,7 +557,7 @@ namespace Item
             aSet->SetItem(CntInt16::Create(4));
             const auto aActA(aSet->GetStateAndItem<const CntInt16>());
 
-            aSet->SetItem(CntInt16::GetStaticDefault());
+            aSet->SetItem(ItemBase::GetDefault<CntInt16>());
             const auto aActB(aSet->GetStateAndItem<const CntInt16>());
 
             aSet->SetItem(CntInt16::Create(12));
@@ -587,9 +590,9 @@ namespace Item
             }
 
             // check getting default at Set, this will include ModelSpecificItemValues
-            // compared with the static CntInt16::GetStaticDefault() call

... etc. - the rest is truncated


More information about the Libreoffice-commits mailing list