[Libreoffice-commits] core.git: sw/source

Chris Sherlock chris.sherlock79 at gmail.com
Tue Jan 19 22:33:45 PST 2016


 sw/source/core/unocore/unostyle.cxx |  995 +++++++++++++++---------------------
 1 file changed, 437 insertions(+), 558 deletions(-)

New commits:
commit c116aafe38f264be29f415b74a968f6efa59a56a
Author: Chris Sherlock <chris.sherlock79 at gmail.com>
Date:   Wed Jan 20 10:50:49 2016 +1100

    sw: (mea culpa) fix unostyle.cxx
    
    Unfortunately in commit 2b297116cb6bb1061c4 I messed up whilst
    doing a rebase via meld to incorporate my changes. This meant
    that I overwrote changes made to
    sw/source/core/unocore/unostyle.cxx.
    
    Even more regrettably, my original changes missed making changes
    in Windows and OS X builds as I pushed too quickly from within
    gerrit, assuming that the build errors weren't caused by me.
    
    These series of VCL changes I had made were quite rightly
    reverted, and I worked towards fixing them up again - sadly my
    ISP (iiNet) had connectivity problems so it took me some time to
    even gain access to the repository to do the cherry-picks of my
    previous commits so I could fix them up and resubmit them.
    
    I honestly didn't notice that I had overwritten the changes in
    unostyle.cxx previously, as I was so intent on fixing my errors
    that this entirely passed me by. This unfortunately led to this
    commit, where I overwrote the changes a second time:
    
    28c96fc2553a5c3dee108f1e2060d7bc081a7e7e
    
    I was informed of this problem via the mailing list [1] which I
    read the next morning immediately after I work up. I take full
    responsibility and very much regret having made these mistakes.
    This commit fixes the issue and I will take steps to ensure that
    it doesn't occur again. I can reassure all that this was not
    intentional, nor would I ever do such a thing on purpose - quite
    frankly I'm mortified.
    
    1. http://lists.freedesktop.org/archives/libreoffice/2016-January/072067.html
    
    Change-Id: I336626059d4acd175669832950f3ed52b2539087
    Reviewed-on: https://gerrit.libreoffice.org/21618
    Reviewed-by: Chris Sherlock <chris.sherlock79 at gmail.com>
    Tested-by: Chris Sherlock <chris.sherlock79 at gmail.com>

diff --git a/sw/source/core/unocore/unostyle.cxx b/sw/source/core/unocore/unostyle.cxx
index 118d4d5..2e6ef30 100644
--- a/sw/source/core/unocore/unostyle.cxx
+++ b/sw/source/core/unocore/unostyle.cxx
@@ -89,6 +89,7 @@
 #include <cassert>
 #include <memory>
 #include <set>
+#include <limits>
 
 namespace
 {
@@ -243,6 +244,8 @@ namespace sw
     };
 
 }
+
+class SwStyleBase_Impl;
 class SwXStyle : public cppu::WeakImplHelper
     <
         css::style::XStyle,
@@ -269,6 +272,8 @@ protected:
     css::uno::Reference<css::container::XNameAccess> m_xStyleFamily;
     css::uno::Reference<css::beans::XPropertySet> m_xStyleData;
 
+    template<sal_uInt16>
+    void SetPropertyValue(const SfxItemPropertySimpleEntry&, const SfxItemPropertySet&, const uno::Any&, SwStyleBase_Impl&);
     void SAL_CALL SetPropertyValues_Impl( const css::uno::Sequence< OUString >& aPropertyNames, const css::uno::Sequence< css::uno::Any >& aValues )
         throw (css::beans::UnknownPropertyException,
                css::beans::PropertyVetoException,
@@ -359,6 +364,8 @@ public:
     void Invalidate();
     void ApplyDescriptorProperties();
     void SetStyleName(const OUString& rSet){ m_sStyleName = rSet;}
+    void SetStyleProperty(const SfxItemPropertySimpleEntry& rEntry, const SfxItemPropertySet& rPropSet, const uno::Any& rValue, SwStyleBase_Impl& rBase) throw(beans::PropertyVetoException, lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException, std::exception);
+    void PutItemToSet(const SvxSetItem* pSetItem, const SfxItemPropertySet& rPropSet, const SfxItemPropertySimpleEntry& rEntry, const uno::Any& rVal, SwStyleBase_Impl& rBaseImpl);
 };
 
 class SwXFrameStyle
@@ -1092,7 +1099,7 @@ static uno::Reference<beans::XPropertySet> lcl_InitStandardStyle(const SfxStyleF
     if(eFamily != SFX_STYLE_FAMILY_PARA && eFamily != SFX_STYLE_FAMILY_PAGE)
         return {};
     auto aResult(rxStyleFamily->getByName("Standard"));
-    if(!aResult.isExtractableTo(cppu::UnoType<return_t>::get()))
+    if(!aResult.has<return_t>())
         return {};
     return aResult.get<return_t>();
 }
@@ -1108,7 +1115,7 @@ static uno::Reference<container::XNameAccess> lcl_InitStyleFamily(SwDoc* pDoc, c
     uno::Reference<style::XStyleFamiliesSupplier> xFamilySupplier(xModel, uno::UNO_QUERY);
     auto xFamilies = xFamilySupplier->getStyleFamilies();
     auto aResult(xFamilies->getByName(rEntry.m_sName));
-    if(!aResult.isExtractableTo(cppu::UnoType<return_t>::get()))
+    if(!aResult.has<return_t>())
         return {};
     return aResult.get<return_t>();
 }
@@ -1399,580 +1406,453 @@ const SwPageDesc* SwStyleBase_Impl::GetOldPageDesc()
     return m_pOldPageDesc;
 }
 
+static void lcl_SetDefaultWay(const SfxItemPropertySimpleEntry& rEntry, const SfxItemPropertySet& rPropSet, const uno::Any& rValue, SwStyleBase_Impl& o_rStyleBase)
+{
+    // default ItemSet handling
+    SfxItemSet& rStyleSet = o_rStyleBase.GetItemSet();
+    SfxItemSet aSet(*rStyleSet.GetPool(), rEntry.nWID, rEntry.nWID);
+    aSet.SetParent(&rStyleSet);
+    rPropSet.setPropertyValue(rEntry, rValue, aSet);
+    rStyleSet.Put(aSet);
+}
 
-static void lcl_SetStyleProperty(const SfxItemPropertySimpleEntry& rEntry,
-                        const SfxItemPropertySet& rPropSet,
-                        const uno::Any& rValue,
-                        SwStyleBase_Impl& rBase,
-                        SfxStyleSheetBasePool* pBasePool,
-                        SwDoc* pDoc,
-                        SfxStyleFamily eFamily)
-                            throw(beans::PropertyVetoException, lang::IllegalArgumentException,
-                                  lang::WrappedTargetException, uno::RuntimeException,
-                                  std::exception)
-
+sal_uInt8 lcl_TranslateMetric(const SfxItemPropertySimpleEntry& rEntry, SwDoc* pDoc, uno::Any& o_aValue)
 {
-    //UUUU adapted switch logic to a more readable state; removed goto's and made
-    // execution of standard setting of proerty in ItemSet dependent of this variable
-    bool bDone(false);
+    // check for needed metric translation
+    if(!(rEntry.nMemberId & SFX_METRIC_ITEM))
+        return rEntry.nMemberId;
+    // exception: If these ItemTypes are used, do not convert when these are negative
+    // since this means they are intended as percent values
+    if((XATTR_FILLBMP_SIZEX == rEntry.nWID || XATTR_FILLBMP_SIZEY == rEntry.nWID)
+            && o_aValue.has<sal_Int32>()
+            && o_aValue.get<sal_Int32>() < 0)
+        return rEntry.nMemberId;
+    if(!pDoc)
+        return rEntry.nMemberId & (~SFX_METRIC_ITEM);
 
-    //UUUU
-    const sal_uInt8 nMemberId(rEntry.nMemberId & (~SFX_METRIC_ITEM));
+    const SfxItemPool& rPool = pDoc->GetAttrPool();
+    const SfxMapUnit eMapUnit(rPool.GetMetric(rEntry.nWID));
+    if(eMapUnit != SFX_MAPUNIT_100TH_MM)
+        SvxUnoConvertFromMM(eMapUnit, o_aValue);
+    return rEntry.nMemberId & (~SFX_METRIC_ITEM);
+}
+template<>
+void SwXStyle::SetPropertyValue<FN_UNO_HIDDEN>(const SfxItemPropertySimpleEntry& rEntry, const SfxItemPropertySet& rPropSet, const uno::Any& rValue, SwStyleBase_Impl& o_rStyleBase)
+{
+    bool bHidden = false;
+    if(rValue >>= bHidden)
+    {
+        //make it a 'real' style - necessary for pooled styles
+        o_rStyleBase.getNewBase()->GetItemSet();
+        o_rStyleBase.getNewBase()->SetHidden(bHidden);
+    }
+    lcl_SetDefaultWay(rEntry, rPropSet, rValue, o_rStyleBase);
+}
+template<>
+void SwXStyle::SetPropertyValue<FN_UNO_STYLE_INTEROP_GRAB_BAG>(const SfxItemPropertySimpleEntry& rEntry, const SfxItemPropertySet& rPropSet, const uno::Any& rValue, SwStyleBase_Impl& o_rStyleBase)
+{
+    o_rStyleBase.getNewBase()->GetItemSet();
+    o_rStyleBase.getNewBase()->SetGrabBagItem(rValue);
+    lcl_SetDefaultWay(rEntry, rPropSet, rValue, o_rStyleBase);
+}
+template<>
+void SwXStyle::SetPropertyValue<XATTR_FILLGRADIENT>(const SfxItemPropertySimpleEntry& rEntry, const SfxItemPropertySet& rPropSet, const uno::Any& rValue, SwStyleBase_Impl& o_rStyleBase)
+{
     uno::Any aValue(rValue);
-
-    //UUUU check for needed metric translation
-    if(rEntry.nMemberId & SFX_METRIC_ITEM)
+    const auto nMemberId(lcl_TranslateMetric(rEntry, m_pDoc, aValue));
+    if(MID_NAME == nMemberId)
     {
-        bool bDoIt(true);
-
-        if(XATTR_FILLBMP_SIZEX == rEntry.nWID || XATTR_FILLBMP_SIZEY == rEntry.nWID)
-        {
-            // exception: If these ItemTypes are used, do not convert when these are negative
-            // since this means they are intended as percent values
-            sal_Int32 nValue = 0;
-
-            if(aValue >>= nValue)
-            {
-                bDoIt = nValue > 0;
-            }
-        }
-
-        if(bDoIt && pDoc)
-        {
-            const SfxItemPool& rPool = pDoc->GetAttrPool();
-            const SfxMapUnit eMapUnit(rPool.GetMetric(rEntry.nWID));
-
-            if(eMapUnit != SFX_MAPUNIT_100TH_MM)
-            {
-                SvxUnoConvertFromMM(eMapUnit, aValue);
-            }
-        }
+        // add set commands for FillName items
+        SfxItemSet& rStyleSet = o_rStyleBase.GetItemSet();
+        if(!aValue.has<OUString>())
+            throw lang::IllegalArgumentException();
+        SvxShape::SetFillAttribute(rEntry.nWID, aValue.get<OUString>(), rStyleSet);
     }
-
-    switch(rEntry.nWID)
+    else if(MID_GRAFURL == nMemberId)
     {
-        case FN_UNO_HIDDEN:
-        {
-            bool bHidden = false;
-            if ( rValue >>= bHidden )
-            {
-                //make it a 'real' style - necessary for pooled styles
-                rBase.getNewBase()->GetItemSet();
-                rBase.getNewBase()->SetHidden( bHidden );
-            }
-        }
-        break;
-
-        case FN_UNO_STYLE_INTEROP_GRAB_BAG:
+        if(XATTR_FILLBITMAP == rEntry.nWID)
         {
-            rBase.getNewBase()->GetItemSet();
-            rBase.getNewBase()->SetGrabBagItem(rValue);
+            // Bitmap also has the MID_GRAFURL mode where a Bitmap URL is used
+            const Graphic aNullGraphic;
+            SfxItemSet& rStyleSet = o_rStyleBase.GetItemSet();
+            XFillBitmapItem aXFillBitmapItem(rStyleSet.GetPool(), aNullGraphic);
+            aXFillBitmapItem.PutValue(aValue, nMemberId);
+            rStyleSet.Put(aXFillBitmapItem);
         }
-        break;
-
-        case XATTR_FILLGRADIENT:
-        case XATTR_FILLHATCH:
-        case XATTR_FILLBITMAP:
-        case XATTR_FILLFLOATTRANSPARENCE:
-        // not yet needed; activate when LineStyle support may be added
-        // case XATTR_LINESTART:
-        // case XATTR_LINEEND:
-        // case XATTR_LINEDASH:
-        {
-            if(MID_NAME == nMemberId)
-            {
-                //UUUU add set commands for FillName items
-                OUString aTempName;
-                SfxItemSet& rStyleSet = rBase.GetItemSet();
-
-                if(!(aValue >>= aTempName))
-                {
-                    throw lang::IllegalArgumentException();
-                }
-
-                SvxShape::SetFillAttribute(rEntry.nWID, aTempName, rStyleSet);
-                bDone = true;
-            }
-            else if(MID_GRAFURL == nMemberId)
-            {
-                if(XATTR_FILLBITMAP == rEntry.nWID)
-                {
-                    //UUUU Bitmap also has the MID_GRAFURL mode where a Bitmap URL is used
-                    const Graphic aNullGraphic;
-                    SfxItemSet& rStyleSet = rBase.GetItemSet();
-                    XFillBitmapItem aXFillBitmapItem(rStyleSet.GetPool(), aNullGraphic);
-
-                    aXFillBitmapItem.PutValue(aValue, nMemberId);
-                    rStyleSet.Put(aXFillBitmapItem);
-                    bDone = true;
-                }
-            }
-
-            break;
-        }
-        case RES_BACKGROUND:
-        {
-            //UUUU
-            SfxItemSet& rStyleSet = rBase.GetItemSet();
-            const SvxBrushItem aOriginalBrushItem(getSvxBrushItemFromSourceSet(rStyleSet, RES_BACKGROUND, true, pDoc->IsInXMLImport()));
-            SvxBrushItem aChangedBrushItem(aOriginalBrushItem);
-
-            aChangedBrushItem.PutValue(aValue, nMemberId);
-
-            if (!(aChangedBrushItem == aOriginalBrushItem) ||
-                // 0xff is already the default - but if BackTransparent is set
-                // to true, it must be applied in the item set on ODF import
-                // to potentially override parent style, which is unknown yet
-                (MID_GRAPHIC_TRANSPARENT == nMemberId && aValue.has<bool>() && aValue.get<bool>()))
-            {
-                setSvxBrushItemAsFillAttributesToTargetSet(aChangedBrushItem, rStyleSet);
-            }
-
-            bDone = true;
-            break;
-        }
-        case OWN_ATTR_FILLBMP_MODE:
-        {
-            //UUUU
-            drawing::BitmapMode eMode;
-
-            if(!(aValue >>= eMode))
-            {
-                sal_Int32 nMode = 0;
-
-                if(!(aValue >>= nMode))
-                {
-                    throw lang::IllegalArgumentException();
-                }
-
-                eMode = (drawing::BitmapMode)nMode;
-            }
-
-            SfxItemSet& rStyleSet = rBase.GetItemSet();
+    }
+    else
+        lcl_SetDefaultWay(rEntry, rPropSet, aValue, o_rStyleBase);
+}
+template<>
+void SwXStyle::SetPropertyValue<RES_BACKGROUND>(const SfxItemPropertySimpleEntry& rEntry, const SfxItemPropertySet&, const uno::Any& rValue, SwStyleBase_Impl& o_rStyleBase)
+{
+    SfxItemSet& rStyleSet = o_rStyleBase.GetItemSet();
+    const SvxBrushItem aOriginalBrushItem(getSvxBrushItemFromSourceSet(rStyleSet, RES_BACKGROUND, true, m_pDoc->IsInXMLImport()));
+    SvxBrushItem aChangedBrushItem(aOriginalBrushItem);
 
-            rStyleSet.Put(XFillBmpStretchItem(drawing::BitmapMode_STRETCH == eMode));
-            rStyleSet.Put(XFillBmpTileItem(drawing::BitmapMode_REPEAT == eMode));
+    uno::Any aValue(rValue);
+    const auto nMemberId(lcl_TranslateMetric(rEntry, m_pDoc, aValue));
+    aChangedBrushItem.PutValue(aValue, nMemberId);
 
-            bDone = true;
-            break;
-        }
-        case RES_PAPER_BIN:
-        {
-            SfxPrinter *pPrinter = pDoc->getIDocumentDeviceAccess().getPrinter( true );
-            OUString sTmp;
-            sal_uInt16 nBin = USHRT_MAX;
-            if ( !( aValue >>= sTmp ) )
-                throw lang::IllegalArgumentException();
-            if ( sTmp == "[From printer settings]" )
-                nBin = USHRT_MAX-1;
-            else if ( pPrinter )
-            {
-                for (sal_uInt16 i=0, nEnd = pPrinter->GetPaperBinCount(); i < nEnd; i++ )
-                {
-                    if (sTmp == pPrinter->GetPaperBinName ( i ) )
-                    {
-                        nBin = i;
-                        break;
-                    }
-                }
-            }
-            if ( nBin == USHRT_MAX )
-                throw lang::IllegalArgumentException();
-            else
-            {
-                SfxItemSet& rStyleSet = rBase.GetItemSet();
-                SfxItemSet aSet(*rStyleSet.GetPool(), rEntry.nWID, rEntry.nWID);
-                aSet.SetParent(&rStyleSet);
-                rPropSet.setPropertyValue(rEntry, uno::makeAny ( static_cast < sal_Int8 > ( nBin == USHRT_MAX-1 ? -1 : nBin ) ), aSet);
-                rStyleSet.Put(aSet);
-            }
+    // 0xff is already the default - but if BackTransparent is set
+    // to true, it must be applied in the item set on ODF import
+    // to potentially override parent style, which is unknown yet
+    if(aChangedBrushItem == aOriginalBrushItem && (MID_GRAPHIC_TRANSPARENT != nMemberId || !aValue.has<bool>() || !aValue.get<bool>()))
+        return;
 
-            bDone = true;
-            break;
-        }
-        case  FN_UNO_NUM_RULES: // special handling for a SvxNumRuleItem:
+    setSvxBrushItemAsFillAttributesToTargetSet(aChangedBrushItem, rStyleSet);
+}
+template<>
+void SwXStyle::SetPropertyValue<OWN_ATTR_FILLBMP_MODE>(const SfxItemPropertySimpleEntry&, const SfxItemPropertySet&, const uno::Any& rValue, SwStyleBase_Impl& o_rStyleBase)
+{
+    drawing::BitmapMode eMode;
+    if(!(rValue >>= eMode))
+    {
+        if(!rValue.has<sal_Int32>())
+            throw lang::IllegalArgumentException();
+        eMode = ((drawing::BitmapMode)rValue.get<sal_Int32>());
+    }
+    SfxItemSet& rStyleSet = o_rStyleBase.GetItemSet();
+    rStyleSet.Put(XFillBmpStretchItem(drawing::BitmapMode_STRETCH == eMode));
+    rStyleSet.Put(XFillBmpTileItem(drawing::BitmapMode_REPEAT == eMode));
+}
+template<>
+void SwXStyle::SetPropertyValue<RES_PAPER_BIN>(const SfxItemPropertySimpleEntry& rEntry, const SfxItemPropertySet& rPropSet, const uno::Any& rValue, SwStyleBase_Impl& o_rStyleBase)
+{
+    if(!rValue.has<OUString>())
+        throw lang::IllegalArgumentException();
+    SfxPrinter* pPrinter = m_pDoc->getIDocumentDeviceAccess().getPrinter(true);
+    OUString sValue(rValue.get<OUString>());
+    using printeridx_t = decltype(pPrinter->GetPaperBinCount());
+    printeridx_t nBin = std::numeric_limits<printeridx_t>::max();
+    if(sValue == "[From printer settings]")
+        nBin = std::numeric_limits<printeridx_t>::max()-1;
+    else if(pPrinter)
+    {
+        for(sal_uInt16 i=0, nEnd = pPrinter->GetPaperBinCount(); i < nEnd; ++i)
         {
-            if(aValue.getValueType() == cppu::UnoType<container::XIndexReplace>::get())
+            if (sValue == pPrinter->GetPaperBinName(i))
             {
-                uno::Reference< container::XIndexReplace > const * pxRulesRef =
-                        static_cast<uno::Reference< container::XIndexReplace > const *>(aValue.getValue());
-
-                uno::Reference<lang::XUnoTunnel> xNumberTunnel( *pxRulesRef, uno::UNO_QUERY);
-
-                SwXNumberingRules* pSwXRules = nullptr;
-                if(xNumberTunnel.is())
-                {
-                    pSwXRules = reinterpret_cast< SwXNumberingRules * >(
-                            sal::static_int_cast< sal_IntPtr >(xNumberTunnel->getSomething( SwXNumberingRules::getUnoTunnelId()) ));
-                }
-                if(pSwXRules)
-                {
-                    const OUString* pCharStyleNames = pSwXRules->GetNewCharStyleNames();
-                    const OUString* pBulletFontNames = pSwXRules->GetBulletFontNames();
-
-                    SwNumRule aSetRule(*pSwXRules->GetNumRule());
-                    const SwCharFormats* pFormats = pDoc->GetCharFormats();
-                    const size_t nChCount = pFormats->size();
-                    for(sal_uInt16 i = 0; i < MAXLEVEL; i++)
-                    {
-
-                        const SwNumFormat* pFormat = aSetRule.GetNumFormat( i );
-                        if(pFormat)
-                        {
-                            SwNumFormat aFormat(*pFormat);
-                            if (!pCharStyleNames[i].isEmpty() &&
-                                !SwXNumberingRules::isInvalidStyle(pCharStyleNames[i]) &&
-                                (!pFormat->GetCharFormat() || pFormat->GetCharFormat()->GetName() != pCharStyleNames[i]) )
-                            {
-
-                                SwCharFormat* pCharFormat = nullptr;
-                                for(size_t j = 0; j< nChCount; ++j)
-                                {
-                                    SwCharFormat* pTmp = (*pFormats)[j];
-                                    if(pTmp->GetName() == pCharStyleNames[i])
-                                    {
-                                        pCharFormat = pTmp;
-                                        break;
-                                    }
-                                }
-                                if(!pCharFormat && pBasePool)
-                                {
-
-                                    SfxStyleSheetBase* pBase;
-                                    pBase = static_cast<SfxStyleSheetBasePool*>(pBasePool)->Find(pCharStyleNames[i], SFX_STYLE_FAMILY_CHAR);
-                                    if(!pBase)
-                                        pBase = &pBasePool->Make(pCharStyleNames[i], SFX_STYLE_FAMILY_CHAR);
-                                    pCharFormat = static_cast<SwDocStyleSheet*>(pBase)->GetCharFormat();
-
-                                }
-
-                                aFormat.SetCharFormat( pCharFormat );
-                            }
-                            // same for fonts:
-                            if (!pBulletFontNames[i].isEmpty() &&
-                                !SwXNumberingRules::isInvalidStyle(pBulletFontNames[i]) &&
-                                (!pFormat->GetBulletFont() || pFormat->GetBulletFont()->GetFamilyName() != pBulletFontNames[i]) )
-                            {
-                                const SvxFontListItem* pFontListItem =
-                                        static_cast<const SvxFontListItem*>(pDoc->GetDocShell()
-                                                            ->GetItem( SID_ATTR_CHAR_FONTLIST ));
-                                const FontList*  pList = pFontListItem->GetFontList();
-                                FontMetric aFontMetric = pList->Get(
-                                    pBulletFontNames[i],WEIGHT_NORMAL, ITALIC_NONE);
-                                vcl::Font aFont(aFontMetric);
-                                aFormat.SetBulletFont(&aFont);
-                            }
-                            aSetRule.Set( i, &aFormat );
-                        }
-                    }
-                    rBase.getNewBase()->SetNumRule(aSetRule);
-                }
-            }
-            else
-                throw lang::IllegalArgumentException();
-
-            bDone = true;
-            break;
-        }
-
-        case RES_PARATR_OUTLINELEVEL:
-        {
-            sal_Int16 nLevel = 0;
-            aValue >>= nLevel;
-            if( 0 <= nLevel && nLevel <= MAXLEVEL)
-                rBase.getNewBase()->GetCollection()->SetAttrOutlineLevel( nLevel );
-
-            bDone = true;
-            break;
-        }
-
-        case FN_UNO_FOLLOW_STYLE:
-        {
-            OUString sTmp;
-            aValue >>= sTmp;
-            OUString aString;
-            SwStyleNameMapper::FillUIName(sTmp, aString, lcl_GetSwEnumFromSfxEnum ( eFamily ), true ) ;
-            rBase.getNewBase()->SetFollow( aString );
-
-            bDone = true;
-            break;
-        }
-        case RES_PAGEDESC :
-        {
-            if (MID_PAGEDESC_PAGEDESCNAME != nMemberId)
+                nBin = i;
                 break;
-            // special handling for RES_PAGEDESC
-            if(aValue.getValueType() != ::cppu::UnoType<OUString>::get())
-                throw lang::IllegalArgumentException();
-            SfxItemSet& rStyleSet = rBase.GetItemSet();
-
-            std::unique_ptr<SwFormatPageDesc> pNewDesc;
-            const SfxPoolItem* pItem;
-            if(SfxItemState::SET == rStyleSet.GetItemState( RES_PAGEDESC, true, &pItem ) )
-            {
-                pNewDesc.reset( new SwFormatPageDesc(*static_cast<const SwFormatPageDesc*>(pItem)) );
-            }
-            else
-                pNewDesc.reset( new SwFormatPageDesc );
-            OUString uDescName;
-            aValue >>= uDescName;
-            OUString sDescName;
-            SwStyleNameMapper::FillUIName(uDescName, sDescName, nsSwGetPoolIdFromName::GET_POOLID_PAGEDESC, true );
-            if(!pNewDesc->GetPageDesc() || pNewDesc->GetPageDesc()->GetName() != sDescName)
-            {
-                bool bPut = false;
-                if (!sDescName.isEmpty())
-                {
-                    SwPageDesc* pPageDesc = SwPageDesc::GetByName(*pDoc, sDescName);
-                    if(pPageDesc)
-                    {
-                        pNewDesc->RegisterToPageDesc( *pPageDesc );
-                        bPut = true;
-                    }
-                    else
-                    {
-                        throw lang::IllegalArgumentException();
-                    }
-                }
-                if(!bPut)
-                {
-                    rStyleSet.ClearItem(RES_BREAK);
-                    rStyleSet.Put(SwFormatPageDesc());
-                }
-                else
-                    rStyleSet.Put(*pNewDesc);
-
             }
-            bDone = true;
-            break;
         }
-        case RES_TEXT_VERT_ADJUST:
+    }
+    if(nBin == std::numeric_limits<printeridx_t>::max())
+        throw lang::IllegalArgumentException();
+    SfxItemSet& rStyleSet = o_rStyleBase.GetItemSet();
+    SfxItemSet aSet(*rStyleSet.GetPool(), rEntry.nWID, rEntry.nWID);
+    aSet.SetParent(&rStyleSet);
+    rPropSet.setPropertyValue(rEntry, uno::makeAny(static_cast<sal_Int8>(nBin == std::numeric_limits<printeridx_t>::max()-1 ? -1 : nBin)), aSet);
+    rStyleSet.Put(aSet);
+}
+template<>
+void SwXStyle::SetPropertyValue<FN_UNO_NUM_RULES>(const SfxItemPropertySimpleEntry&, const SfxItemPropertySet&, const uno::Any& rValue, SwStyleBase_Impl& o_rStyleBase)
+{
+    if(!rValue.has<uno::Reference<container::XIndexReplace>>() || !rValue.has<uno::Reference<lang::XUnoTunnel>>())
+        throw lang::IllegalArgumentException();
+    auto xNumberTunnel(rValue.get<uno::Reference<lang::XUnoTunnel>>());
+    SwXNumberingRules* pSwXRules = reinterpret_cast<SwXNumberingRules*>(sal::static_int_cast<sal_IntPtr>(xNumberTunnel->getSomething(SwXNumberingRules::getUnoTunnelId())));
+    if(!pSwXRules)
+        return;
+    SwNumRule aSetRule(*pSwXRules->GetNumRule());
+    for(sal_uInt16 i = 0; i < MAXLEVEL; ++i)
+    {
+        const SwNumFormat* pFormat = aSetRule.GetNumFormat(i);
+        if(!pFormat)
+            continue;
+        SwNumFormat aFormat(*pFormat);
+        const auto pCharName(pSwXRules->GetNewCharStyleNames()[i]);
+        if(!pCharName.isEmpty()
+               && !SwXNumberingRules::isInvalidStyle(pCharName)
+               && (!pFormat->GetCharFormat() || pFormat->GetCharFormat()->GetName() != pCharName))
         {
-            if( pDoc )
+            auto pCharFormatIt(std::find_if(m_pDoc->GetCharFormats()->begin(), m_pDoc->GetCharFormats()->end(),
+                    [pCharName] (SwCharFormat* pF) { return pF->GetName() == pCharName; }));
+            if(pCharFormatIt != m_pDoc->GetCharFormats()->end())
+                aFormat.SetCharFormat(*pCharFormatIt);
+            else if(m_pBasePool)
             {
-                const SwPageDesc* pOldPageDesc = rBase.GetOldPageDesc();
-                SwPageDesc* pPageDesc = pOldPageDesc ? pDoc->FindPageDesc(pOldPageDesc->GetName()) : nullptr;
-                if (pPageDesc)
-                {
-                    drawing::TextVerticalAdjust nVA;
-                    rValue >>= nVA;
-                    pPageDesc->SetVerticalAdjustment( nVA );
-                }
+                auto pBase(static_cast<SfxStyleSheetBasePool*>(m_pBasePool)->Find(pCharName, SFX_STYLE_FAMILY_CHAR));
+                if(!pBase)
+                    pBase = &m_pBasePool->Make(pCharName, SFX_STYLE_FAMILY_CHAR);
+                aFormat.SetCharFormat(static_cast<SwDocStyleSheet*>(pBase)->GetCharFormat());
             }
-            bDone = true;
-            break;
+            else
+                aFormat.SetCharFormat(nullptr);
         }
-        case FN_UNO_IS_AUTO_UPDATE:
+        // same for fonts:
+        const auto pBulletName(pSwXRules->GetBulletFontNames()[i]);
+        if(!pBulletName.isEmpty()
+                && !SwXNumberingRules::isInvalidStyle(pBulletName)
+                && (!pFormat->GetBulletFont() || pFormat->GetBulletFont()->GetFamilyName() != pBulletName))
         {
-            bool bAuto = *static_cast<sal_Bool const *>(aValue.getValue());
-            if(SFX_STYLE_FAMILY_PARA == eFamily)
-                rBase.getNewBase()->GetCollection()->SetAutoUpdateFormat(bAuto);
-            else if(SFX_STYLE_FAMILY_FRAME == eFamily)
-                rBase.getNewBase()->GetFrameFormat()->SetAutoUpdateFormat(bAuto);
-
-            bDone = true;
-            break;
+            const auto pFontListItem(static_cast<const SvxFontListItem*>(m_pDoc->GetDocShell()->GetItem(SID_ATTR_CHAR_FONTLIST)));
+            const auto pList(pFontListItem->GetFontList());
+            FontMetric aFontInfo(pList->Get(pBulletName, WEIGHT_NORMAL, ITALIC_NONE));
+            vcl::Font aFont(aFontInfo);
+            aFormat.SetBulletFont(&aFont);
         }
-        case FN_UNO_PARA_STYLE_CONDITIONS:
+        aSetRule.Set(i, &aFormat);
+    }
+    o_rStyleBase.getNewBase()->SetNumRule(aSetRule);
+}
+template<>
+void SwXStyle::SetPropertyValue<RES_PARATR_OUTLINELEVEL>(const SfxItemPropertySimpleEntry&, const SfxItemPropertySet&, const uno::Any& rValue, SwStyleBase_Impl& o_rStyleBase)
+{
+    if(!rValue.has<sal_Int16>())
+        return;
+    const auto nLevel(rValue.get<sal_Int16>());
+    if(0 <= nLevel && nLevel <= MAXLEVEL)
+        o_rStyleBase.getNewBase()->GetCollection()->SetAttrOutlineLevel(nLevel);
+}
+template<>
+void SwXStyle::SetPropertyValue<FN_UNO_FOLLOW_STYLE>(const SfxItemPropertySimpleEntry&, const SfxItemPropertySet&, const uno::Any& rValue, SwStyleBase_Impl& o_rStyleBase)
+{
+    if(!rValue.has<OUString>())
+        return;
+    const auto sValue(rValue.get<OUString>());
+    OUString aString;
+    SwStyleNameMapper::FillUIName(sValue, aString, m_rEntry.m_aPoolId, true);
+    o_rStyleBase.getNewBase()->SetFollow(aString);
+}
+template<>
+void SwXStyle::SetPropertyValue<RES_PAGEDESC>(const SfxItemPropertySimpleEntry& rEntry, const SfxItemPropertySet& rPropSet, const uno::Any& rValue, SwStyleBase_Impl& o_rStyleBase)
+{
+    if(MID_PAGEDESC_PAGEDESCNAME != rEntry.nMemberId)
+    {
+        lcl_SetDefaultWay(rEntry, rPropSet, rValue, o_rStyleBase);
+        return;
+    }
+    if(!rValue.has<OUString>())
+        throw lang::IllegalArgumentException();
+    // special handling for RES_PAGEDESC
+    SfxItemSet& rStyleSet = o_rStyleBase.GetItemSet();
+    std::unique_ptr<SwFormatPageDesc> pNewDesc;
+    const SfxPoolItem* pItem;
+    if(SfxItemState::SET == rStyleSet.GetItemState(RES_PAGEDESC, true, &pItem))
+        pNewDesc.reset(new SwFormatPageDesc(*static_cast<const SwFormatPageDesc*>(pItem)));
+    else
+        pNewDesc.reset(new SwFormatPageDesc);
+    const auto sValue(rValue.get<OUString>());
+    OUString sDescName;
+    SwStyleNameMapper::FillUIName(sValue, sDescName, nsSwGetPoolIdFromName::GET_POOLID_PAGEDESC, true);
+    if(pNewDesc->GetPageDesc() && pNewDesc->GetPageDesc()->GetName() == sDescName)
+        return;
+    if(sDescName.isEmpty())
+    {
+        rStyleSet.ClearItem(RES_BREAK);
+        rStyleSet.Put(SwFormatPageDesc());
+    }
+    else
+    {
+        SwPageDesc* pPageDesc(SwPageDesc::GetByName(*m_pDoc, sDescName));
+        if(!pPageDesc)
+            throw lang::IllegalArgumentException();
+        pNewDesc->RegisterToPageDesc(*pPageDesc);
+        rStyleSet.Put(*pNewDesc);
+    }
+}
+template<>
+void SwXStyle::SetPropertyValue<RES_TEXT_VERT_ADJUST>(const SfxItemPropertySimpleEntry&, const SfxItemPropertySet&, const uno::Any& rValue, SwStyleBase_Impl& o_rStyleBase)
+{
+    if(!m_pDoc || !rValue.has<drawing::TextVerticalAdjust>() || !o_rStyleBase.GetOldPageDesc())
+        return;
+    SwPageDesc* pPageDesc = m_pDoc->FindPageDesc(o_rStyleBase.GetOldPageDesc()->GetName());
+    if(pPageDesc)
+        pPageDesc->SetVerticalAdjustment(rValue.get<drawing::TextVerticalAdjust>());
+}
+template<>
+void SwXStyle::SetPropertyValue<FN_UNO_IS_AUTO_UPDATE>(const SfxItemPropertySimpleEntry&, const SfxItemPropertySet&, const uno::Any& rValue, SwStyleBase_Impl& o_rStyleBase)
+{
+    if(!rValue.has<bool>())
+        throw lang::IllegalArgumentException();
+    const bool bAuto(rValue.get<bool>());
+    if(SFX_STYLE_FAMILY_PARA == m_rEntry.m_eFamily)
+        o_rStyleBase.getNewBase()->GetCollection()->SetAutoUpdateFormat(bAuto);
+    else if(SFX_STYLE_FAMILY_FRAME == m_rEntry.m_eFamily)
+        o_rStyleBase.getNewBase()->GetFrameFormat()->SetAutoUpdateFormat(bAuto);
+}
+template<>
+void SwXStyle::SetPropertyValue<FN_UNO_PARA_STYLE_CONDITIONS>(const SfxItemPropertySimpleEntry&, const SfxItemPropertySet&, const uno::Any& rValue, SwStyleBase_Impl& o_rStyleBase)
+{
+    static_assert(COND_COMMAND_COUNT == 28, "invalid size of command count?");
+    using expectedarg_t = uno::Sequence<beans::NamedValue>;
+    if(!rValue.has<expectedarg_t>() || !m_pBasePool)
+        throw lang::IllegalArgumentException();
+    SwCondCollItem aCondItem;
+    for(auto& rNamedValue : rValue.get<expectedarg_t>())
+    {
+        if(!rNamedValue.Value.has<OUString>())
+            throw lang::IllegalArgumentException();
+
+        const OUString sValue(rNamedValue.Value.get<OUString>());
+        // get UI style name from programmatic style name
+        OUString aStyleName;
+        SwStyleNameMapper::FillUIName(sValue, aStyleName, lcl_GetSwEnumFromSfxEnum(m_rEntry.m_eFamily), true);
+
+        // check for correct context and style name
+        const auto nIdx(GetCommandContextIndex(rNamedValue.Name));
+        if(nIdx == -1)
+            throw lang::IllegalArgumentException();
+        m_pBasePool->SetSearchMask(SFX_STYLE_FAMILY_PARA);
+        for(auto pBase = m_pBasePool->First(); pBase->GetName() != aStyleName; pBase = m_pBasePool->Next())
         {
-            uno::Sequence< beans::NamedValue > aSeq;
-            if (!(aValue >>= aSeq))
-                throw lang::IllegalArgumentException();
-
-            OSL_ENSURE(COND_COMMAND_COUNT == 28,
-                    "invalid size of command count?");
-            const beans::NamedValue *pSeq = aSeq.getConstArray();
-            const sal_Int32 nLen = aSeq.getLength();
-
-            bool bFailed = false;
-            SwCondCollItem aCondItem;
-            for(sal_Int32 i = 0; i < nLen; ++i)
-            {
-                OUString aTmp;
-                if ((pSeq[i].Value >>= aTmp))
-                {
-                    // get UI style name from programmatic style name
-                    OUString aStyleName;
-                    SwStyleNameMapper::FillUIName(aTmp, aStyleName,
-                            lcl_GetSwEnumFromSfxEnum(eFamily), true);
-
-                    // check for correct context and style name
-
-                    sal_Int16 nIdx = GetCommandContextIndex( pSeq[i].Name );
-
-                    bool bStyleFound = false;
-                    if (pBasePool)
-                    {
-                        pBasePool->SetSearchMask( SFX_STYLE_FAMILY_PARA);
-                        const SfxStyleSheetBase* pBase = pBasePool->First();
-                        while (pBase && !bStyleFound)
-                        {
-                            if(pBase->GetName() == aStyleName)
-                                bStyleFound = true;
-                            pBase = pBasePool->Next();
-                        }
-                    }
-
-                    if (nIdx == -1 || !bStyleFound)
-                    {
-                        bFailed = true;
-                        break;
-                    }
-
-                    aCondItem.SetStyle(&aStyleName, nIdx);
-                }
-                else
-                    bFailed = true;
-            }
-            if (bFailed)
+            if(!pBase)
                 throw lang::IllegalArgumentException();
-            rBase.GetItemSet().Put( aCondItem );
-            bDone = true;
-            break;
-        }
-        case FN_UNO_CATEGORY:
-        {
-            if(!rBase.getNewBase()->IsUserDefined())
-                throw lang::IllegalArgumentException();
-            short nSet = 0;
-            aValue >>= nSet;
-
-            sal_uInt16 nId;
-            switch( nSet )
-            {
-                case style::ParagraphStyleCategory::TEXT:
-                    nId = SWSTYLEBIT_TEXT;
-                    break;
-                case style::ParagraphStyleCategory::CHAPTER:
-                    nId = SWSTYLEBIT_CHAPTER;
-                    break;
-                case style::ParagraphStyleCategory::LIST:
-                    nId = SWSTYLEBIT_LIST;
-                    break;
-                case style::ParagraphStyleCategory::INDEX:
-                    nId = SWSTYLEBIT_IDX;
-                    break;
-                case style::ParagraphStyleCategory::EXTRA:
-                    nId = SWSTYLEBIT_EXTRA;
-                    break;
-                case style::ParagraphStyleCategory::HTML:
-                    nId = SWSTYLEBIT_HTML;
-                    break;
-                default: throw lang::IllegalArgumentException();
-            }
-
-            rBase.getNewBase()->SetMask( nId|SFXSTYLEBIT_USERDEF );
-            bDone = true;
-            break;
-        }
-        case SID_SWREGISTER_COLLECTION:
-        {
-            OUString sName;
-            aValue >>= sName;
-            SwRegisterItem aReg( !sName.isEmpty() );
-            aReg.SetWhich(SID_SWREGISTER_MODE);
-            rBase.GetItemSet().Put(aReg);
-            OUString aString;
-            SwStyleNameMapper::FillUIName(sName, aString, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL, true);
-
-            rBase.GetItemSet().Put(SfxStringItem(SID_SWREGISTER_COLLECTION, aString ) );
-            bDone = true;
-            break;
-        }
-        case RES_TXTATR_CJK_RUBY:
-        {
-            if(MID_RUBY_CHARSTYLE == nMemberId )
-            {
-                OUString sTmp;
-                if(aValue >>= sTmp)
-                {
-                    SfxItemSet& rStyleSet = rBase.GetItemSet();
-                    std::unique_ptr<SwFormatRuby> pRuby;
-                    const SfxPoolItem* pItem;
-                    if(SfxItemState::SET == rStyleSet.GetItemState( RES_TXTATR_CJK_RUBY, true, &pItem ) )
-                        pRuby.reset(new SwFormatRuby(*static_cast<const SwFormatRuby*>(pItem)));
-                    else
-                        pRuby.reset(new SwFormatRuby(OUString()));
-                    OUString sStyle;
-                    SwStyleNameMapper::FillUIName(sTmp, sStyle, nsSwGetPoolIdFromName::GET_POOLID_CHRFMT, true );
-                    pRuby->SetCharFormatName( sTmp );
-                    pRuby->SetCharFormatId( 0 );
-                    if(!sTmp.isEmpty())
-                    {
-                        sal_uInt16 nId = SwStyleNameMapper::GetPoolIdFromUIName( sTmp, nsSwGetPoolIdFromName::GET_POOLID_CHRFMT );
-                        pRuby->SetCharFormatId(nId);
-                    }
-                    rStyleSet.Put(*pRuby);
-                }
-                else
-                    throw lang::IllegalArgumentException();
-            }
-            break;
-        }
-        case RES_PARATR_DROP:
-        {
-            if( MID_DROPCAP_CHAR_STYLE_NAME == nMemberId)
-            {
-                if(aValue.getValueType() == ::cppu::UnoType<OUString>::get())
-                {
-                    SfxItemSet& rStyleSet = rBase.GetItemSet();
-
-                    std::unique_ptr<SwFormatDrop> pDrop;
-                    const SfxPoolItem* pItem;
-                    if(SfxItemState::SET == rStyleSet.GetItemState( RES_PARATR_DROP, true, &pItem ) )
-                        pDrop.reset(new SwFormatDrop(*static_cast<const SwFormatDrop*>(pItem)));
-                    else
-                        pDrop.reset( new SwFormatDrop );
-                    OUString uStyle;
-                    aValue >>= uStyle;
-                    OUString sStyle;
-                    SwStyleNameMapper::FillUIName(uStyle, sStyle, nsSwGetPoolIdFromName::GET_POOLID_CHRFMT, true );
-                    SwDocStyleSheet* pStyle =
-                        static_cast<SwDocStyleSheet*>(pDoc->GetDocShell()->GetStyleSheetPool()->Find(sStyle, SFX_STYLE_FAMILY_CHAR));
-                    if(pStyle)
-                        pDrop->SetCharFormat(pStyle->GetCharFormat());
-                    else
-                        throw lang::IllegalArgumentException();
-                    rStyleSet.Put(*pDrop);
-                }
-                else
-                    throw lang::IllegalArgumentException();
-
-                bDone = true;
-            }
-            break;
-        }
-        default:
-        {
-            // nothing to do
-            break;
         }
+        aCondItem.SetStyle(&aStyleName, nIdx);
+    }
+    o_rStyleBase.GetItemSet().Put(aCondItem);
+}
+template<>
+void SwXStyle::SetPropertyValue<FN_UNO_CATEGORY>(const SfxItemPropertySimpleEntry&, const SfxItemPropertySet&, const uno::Any& rValue, SwStyleBase_Impl& o_rStyleBase)
+{
+    using paragraphstyle_t = std::remove_const<decltype(style::ParagraphStyleCategory::TEXT)>::type;
+    using paragraphcorestyle_t = sal_uInt16;
+    if(!o_rStyleBase.getNewBase()->IsUserDefined() || !rValue.has<paragraphstyle_t>())
+        throw lang::IllegalArgumentException();
+    static std::unique_ptr<std::map<paragraphstyle_t, paragraphcorestyle_t>> pUnoToCore;
+    if(!pUnoToCore)
+    {
+        pUnoToCore.reset(new std::map<paragraphstyle_t, paragraphcorestyle_t> {
+            { style::ParagraphStyleCategory::TEXT,    SWSTYLEBIT_TEXT    },
+            { style::ParagraphStyleCategory::CHAPTER, SWSTYLEBIT_CHAPTER },
+            { style::ParagraphStyleCategory::LIST,    SWSTYLEBIT_LIST    },
+            { style::ParagraphStyleCategory::INDEX,   SWSTYLEBIT_IDX     },
+            { style::ParagraphStyleCategory::EXTRA,   SWSTYLEBIT_EXTRA   },
+            { style::ParagraphStyleCategory::HTML,    SWSTYLEBIT_HTML    }
+        });
+    }
+    const auto pUnoToCoreIt(pUnoToCore->find(rValue.get<paragraphstyle_t>()));
+    if(pUnoToCoreIt == pUnoToCore->end())
+        throw lang::IllegalArgumentException();
+    o_rStyleBase.getNewBase()->SetMask( pUnoToCoreIt->second|SFXSTYLEBIT_USERDEF );
+}
+template<>
+void SwXStyle::SetPropertyValue<SID_SWREGISTER_COLLECTION>(const SfxItemPropertySimpleEntry&, const SfxItemPropertySet&, const uno::Any& rValue, SwStyleBase_Impl& o_rStyleBase)
+{
+    OUString sName;
+    rValue >>= sName;
+    SwRegisterItem aReg(!sName.isEmpty());
+    aReg.SetWhich(SID_SWREGISTER_MODE);
+    o_rStyleBase.GetItemSet().Put(aReg);
+    OUString aString;
+    SwStyleNameMapper::FillUIName(sName, aString, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL, true);
+    o_rStyleBase.GetItemSet().Put(SfxStringItem(SID_SWREGISTER_COLLECTION, aString ) );
+}
+template<>
+void SwXStyle::SetPropertyValue<RES_TXTATR_CJK_RUBY>(const SfxItemPropertySimpleEntry& rEntry, const SfxItemPropertySet& rPropSet, const uno::Any& rValue, SwStyleBase_Impl& o_rStyleBase)
+{
+    if(MID_RUBY_CHARSTYLE != rEntry.nMemberId)
+        return;
+    if(!rValue.has<OUString>())
+        throw lang::IllegalArgumentException();
+    const auto sValue(rValue.get<OUString>());
+    SfxItemSet& rStyleSet(o_rStyleBase.GetItemSet());
+    std::unique_ptr<SwFormatRuby> pRuby;
+    const SfxPoolItem* pItem;
+    if(SfxItemState::SET == rStyleSet.GetItemState(RES_TXTATR_CJK_RUBY, true, &pItem))
+        pRuby.reset(new SwFormatRuby(*static_cast<const SwFormatRuby*>(pItem)));
+    else
+        pRuby.reset(new SwFormatRuby(OUString()));
+    OUString sStyle;
+    SwStyleNameMapper::FillUIName(sValue, sStyle, nsSwGetPoolIdFromName::GET_POOLID_CHRFMT, true);
+    pRuby->SetCharFormatName(sValue);
+    pRuby->SetCharFormatId(0);
+    if(!sValue.isEmpty())
+    {
+        const sal_uInt16 nId(SwStyleNameMapper::GetPoolIdFromUIName(sValue, nsSwGetPoolIdFromName::GET_POOLID_CHRFMT));
+        pRuby->SetCharFormatId(nId);
+    }
+    rStyleSet.Put(*pRuby);
+    lcl_SetDefaultWay(rEntry, rPropSet, rValue, o_rStyleBase);
+}
+template<>
+void SwXStyle::SetPropertyValue<RES_PARATR_DROP>(const SfxItemPropertySimpleEntry& rEntry, const SfxItemPropertySet&, const uno::Any& rValue, SwStyleBase_Impl& o_rStyleBase)
+{
+    if(MID_DROPCAP_CHAR_STYLE_NAME != rEntry.nMemberId)
+        return;
+    if(!rValue.has<OUString>())
+        throw lang::IllegalArgumentException();
+    SfxItemSet& rStyleSet(o_rStyleBase.GetItemSet());
+    std::unique_ptr<SwFormatDrop> pDrop;
+    const SfxPoolItem* pItem;
+    if(SfxItemState::SET == rStyleSet.GetItemState(RES_PARATR_DROP, true, &pItem))
+        pDrop.reset(new SwFormatDrop(*static_cast<const SwFormatDrop*>(pItem)));
+    else
+        pDrop.reset(new SwFormatDrop);
+    const auto sValue(rValue.get<OUString>());
+    OUString sStyle;
+    SwStyleNameMapper::FillUIName(sValue, sStyle, nsSwGetPoolIdFromName::GET_POOLID_CHRFMT, true);
+    auto pStyle(static_cast<SwDocStyleSheet*>(m_pDoc->GetDocShell()->GetStyleSheetPool()->Find(sStyle, SFX_STYLE_FAMILY_CHAR)));
+    if(!pStyle)
+        throw lang::IllegalArgumentException();
+    pDrop->SetCharFormat(pStyle->GetCharFormat());
+    rStyleSet.Put(*pDrop);
+}
+template<>
+void SwXStyle::SetPropertyValue<RES_PARATR_NUMRULE>(const SfxItemPropertySimpleEntry& rEntry, const SfxItemPropertySet& rPropSet, const uno::Any& rValue, SwStyleBase_Impl& o_rStyleBase)
+{
+    uno::Any aValue(rValue);
+    lcl_TranslateMetric(rEntry, m_pDoc, aValue);
+    lcl_SetDefaultWay(rEntry, rPropSet, aValue, o_rStyleBase);
+    // --> OD 2006-10-18 #i70223#
+    if(SFX_STYLE_FAMILY_PARA == m_rEntry.m_eFamily &&
+            o_rStyleBase.getNewBase().is() && o_rStyleBase.getNewBase()->GetCollection() &&
+            //rBase.getNewBase()->GetCollection()->GetOutlineLevel() < MAXLEVEL /* assigned to list level of outline style */) //#outline level,removed by zhaojianwei
+            o_rStyleBase.getNewBase()->GetCollection()->IsAssignedToListLevelOfOutlineStyle())       ////<-end,add by zhaojianwei
+    {
+        OUString sNewNumberingRuleName;
+        aValue >>= sNewNumberingRuleName;
+        if(sNewNumberingRuleName.isEmpty() || sNewNumberingRuleName != m_pDoc->GetOutlineNumRule()->GetName())
+            o_rStyleBase.getNewBase()->GetCollection()->DeleteAssignmentToListLevelOfOutlineStyle();
     }
+}
 
-    if(!bDone)
+void SwXStyle::SetStyleProperty(const SfxItemPropertySimpleEntry& rEntry, const SfxItemPropertySet& rPropSet, const uno::Any& rValue, SwStyleBase_Impl& rBase) throw(beans::PropertyVetoException, lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException, std::exception)
+{
+    using propertytype_t = decltype(rEntry.nWID);
+    using coresetter_t = std::function<void(SwXStyle&, const SfxItemPropertySimpleEntry&, const SfxItemPropertySet&, const uno::Any&, SwStyleBase_Impl&)>;
+    static std::unique_ptr<std::map<propertytype_t, coresetter_t>> pUnoToCore;
+    if(!pUnoToCore)
     {
-        // default ItemSet handling
-        SfxItemSet& rStyleSet = rBase.GetItemSet();
-        SfxItemSet aSet(*rStyleSet.GetPool(), rEntry.nWID, rEntry.nWID);
-        aSet.SetParent(&rStyleSet);
-        rPropSet.setPropertyValue(rEntry, aValue, aSet);
-        rStyleSet.Put(aSet);
-
-        // --> OD 2006-10-18 #i70223#
-        if ( SFX_STYLE_FAMILY_PARA == eFamily &&
-                rEntry.nWID == RES_PARATR_NUMRULE &&
-                rBase.getNewBase().is() && rBase.getNewBase()->GetCollection() &&
-                //rBase.getNewBase()->GetCollection()->GetOutlineLevel() < MAXLEVEL /* assigned to list level of outline style */) //#outline level,removed by zhaojianwei
-                rBase.getNewBase()->GetCollection()->IsAssignedToListLevelOfOutlineStyle() )       ////<-end,add by zhaojianwei
-        {
-            OUString sNewNumberingRuleName;
-            aValue >>= sNewNumberingRuleName;
-            if ( sNewNumberingRuleName.isEmpty() ||
-                 sNewNumberingRuleName != pDoc->GetOutlineNumRule()->GetName() )
-            {
-                rBase.getNewBase()->GetCollection()->DeleteAssignmentToListLevelOfOutlineStyle();
-            }
-        }
+        pUnoToCore.reset(new std::map<propertytype_t, coresetter_t> {
+            // these explicit std::mem_fn() calls shouldnt be needed, but apparently MSVC is currently too stupid for C++11 again
+            { FN_UNO_HIDDEN,                 std::mem_fn(&SwXStyle::SetPropertyValue<FN_UNO_HIDDEN>)                 },
+            { FN_UNO_STYLE_INTEROP_GRAB_BAG, std::mem_fn(&SwXStyle::SetPropertyValue<FN_UNO_STYLE_INTEROP_GRAB_BAG>) },
+            { XATTR_FILLGRADIENT,            std::mem_fn(&SwXStyle::SetPropertyValue<XATTR_FILLGRADIENT>)            },
+            { XATTR_FILLHATCH,               std::mem_fn(&SwXStyle::SetPropertyValue<XATTR_FILLGRADIENT>)            },
+            { XATTR_FILLBITMAP,              std::mem_fn(&SwXStyle::SetPropertyValue<XATTR_FILLGRADIENT>)            },
+            { XATTR_FILLFLOATTRANSPARENCE,   std::mem_fn(&SwXStyle::SetPropertyValue<XATTR_FILLGRADIENT>)            },
+            { RES_BACKGROUND,                std::mem_fn(&SwXStyle::SetPropertyValue<RES_BACKGROUND>)                },
+            { OWN_ATTR_FILLBMP_MODE,         std::mem_fn(&SwXStyle::SetPropertyValue<OWN_ATTR_FILLBMP_MODE>)         },
+            { RES_PAPER_BIN,                 std::mem_fn(&SwXStyle::SetPropertyValue<RES_PAPER_BIN>)                 },
+            { FN_UNO_NUM_RULES,              std::mem_fn(&SwXStyle::SetPropertyValue<FN_UNO_NUM_RULES>)              },
+            { RES_PARATR_OUTLINELEVEL,       std::mem_fn(&SwXStyle::SetPropertyValue<RES_PARATR_OUTLINELEVEL>)       },
+            { FN_UNO_FOLLOW_STYLE,           std::mem_fn(&SwXStyle::SetPropertyValue<FN_UNO_FOLLOW_STYLE>)           },
+            { RES_PAGEDESC,                  std::mem_fn(&SwXStyle::SetPropertyValue<RES_PAGEDESC>)                  },
+            { RES_TEXT_VERT_ADJUST,          std::mem_fn(&SwXStyle::SetPropertyValue<RES_TEXT_VERT_ADJUST>)          },
+            { FN_UNO_IS_AUTO_UPDATE,         std::mem_fn(&SwXStyle::SetPropertyValue<FN_UNO_IS_AUTO_UPDATE>)         },
+            { FN_UNO_PARA_STYLE_CONDITIONS,  std::mem_fn(&SwXStyle::SetPropertyValue<FN_UNO_PARA_STYLE_CONDITIONS>)  },
+            { FN_UNO_CATEGORY,               std::mem_fn(&SwXStyle::SetPropertyValue<FN_UNO_CATEGORY>)               },
+            { SID_SWREGISTER_COLLECTION,     std::mem_fn(&SwXStyle::SetPropertyValue<SID_SWREGISTER_COLLECTION>)     },
+            { RES_TXTATR_CJK_RUBY,           std::mem_fn(&SwXStyle::SetPropertyValue<RES_TXTATR_CJK_RUBY>)           },
+            { RES_PARATR_DROP,               std::mem_fn(&SwXStyle::SetPropertyValue<RES_PARATR_DROP>)               },
+            { RES_PARATR_DROP,               std::mem_fn(&SwXStyle::SetPropertyValue<RES_PARATR_DROP>)               },
+            { RES_PARATR_NUMRULE,            std::mem_fn(&SwXStyle::SetPropertyValue<RES_PARATR_NUMRULE>)            }
+        });
+    }
+    const auto pUnoToCoreIt(pUnoToCore->find(rEntry.nWID));
+    if(pUnoToCoreIt != pUnoToCore->end())
+        pUnoToCoreIt->second(*this, rEntry, rPropSet, rValue, rBase);
+    else
+    {
+        //UUUU adapted switch logic to a more readable state; removed goto's and made
+        // execution of standard setting of proerty in ItemSet dependent of this variable
+        uno::Any aValue(rValue);
+        lcl_TranslateMetric(rEntry, m_pDoc, aValue);
+        lcl_SetDefaultWay(rEntry, rPropSet, aValue, rBase);
     }
 }
 
@@ -2015,7 +1895,7 @@ void SAL_CALL SwXStyle::SetPropertyValues_Impl(
             throw beans::PropertyVetoException ("Property is read-only: " + pNames[nProp], static_cast<cppu::OWeakObject*>(this));
         if(aBaseImpl.getNewBase().is())
         {
-            lcl_SetStyleProperty(*pEntry, *pPropSet, pValues[nProp], aBaseImpl, m_pBasePool, m_pDoc, m_rEntry.m_eFamily);
+            SetStyleProperty(*pEntry, *pPropSet, pValues[nProp], aBaseImpl);
         }
         else if(m_bIsDescriptor)
         {
@@ -3053,20 +2933,20 @@ SwXPageStyle::~SwXPageStyle()
 
 }
 
-static void lcl_putItemToSet(const SvxSetItem* pSetItem, const SfxItemPropertySet& rPropSet, const SfxItemPropertySimpleEntry& rEntry, const uno::Any& rVal, SwStyleBase_Impl& rBaseImpl, SfxStyleSheetBasePool* pPool, SwDoc *pDoc, SfxStyleFamily eFamily)
+void SwXStyle::PutItemToSet(const SvxSetItem* pSetItem, const SfxItemPropertySet& rPropSet, const SfxItemPropertySimpleEntry& rEntry, const uno::Any& rVal, SwStyleBase_Impl& rBaseImpl)
 {
     // create a new SvxSetItem and get it's ItemSet as new target
     SvxSetItem* pNewSetItem = static_cast< SvxSetItem* >(pSetItem->Clone());
     SfxItemSet& rSetSet = pNewSetItem->GetItemSet();
 
     // set parent to ItemSet to ensure XFILL_NONE as XFillStyleItem
-    rSetSet.SetParent(&pDoc->GetDfltFrameFormat()->GetAttrSet());
+    rSetSet.SetParent(&m_pDoc->GetDfltFrameFormat()->GetAttrSet());
 
     // replace the used SfxItemSet at the SwStyleBase_Impl temporarily and use the
     // default method to set the property
     {
         SwStyleBase_Impl::ItemSetOverrider o(rBaseImpl, &rSetSet);
-        lcl_SetStyleProperty(rEntry, rPropSet, rVal, rBaseImpl, pPool, pDoc, eFamily);
+        SetStyleProperty(rEntry, rPropSet, rVal, rBaseImpl);
     }
 
     // reset paret at ItemSet from SetItem
@@ -3155,7 +3035,7 @@ void SAL_CALL SwXPageStyle::SetPropertyValues_Impl(
                         if (lcl_GetHeaderFooterItem(aBaseImpl.GetItemSet(),
                                     rPropName, bFooter, pSetItem))
                         {
-                            lcl_putItemToSet(pSetItem, *pPropSet, *pEntry, pValues[nProp], aBaseImpl, m_pBasePool, GetDoc(), GetFamily());
+                            PutItemToSet(pSetItem, *pPropSet, *pEntry, pValues[nProp], aBaseImpl);
 
                             if (pEntry->nWID == SID_ATTR_PAGE_SHARED_FIRST)
                             {
@@ -3164,7 +3044,7 @@ void SAL_CALL SwXPageStyle::SetPropertyValues_Impl(
                                             bFooter ? SID_ATTR_PAGE_HEADERSET : SID_ATTR_PAGE_FOOTERSET,
                                             false, reinterpret_cast<const SfxPoolItem**>(&pSetItem)))
                                 {
-                                    lcl_putItemToSet(pSetItem, *pPropSet, *pEntry, pValues[nProp], aBaseImpl, m_pBasePool, GetDoc(), GetFamily());
+                                    PutItemToSet(pSetItem, *pPropSet, *pEntry, pValues[nProp], aBaseImpl);
                                 }
                             }
                         }
@@ -3219,7 +3099,7 @@ void SAL_CALL SwXPageStyle::SetPropertyValues_Impl(
                             default:
                             {
                                 // part of PageStyle, fallback to default
-                                lcl_SetStyleProperty(*pEntry, *pPropSet, pValues[nProp], aBaseImpl, m_pBasePool, GetDoc(), GetFamily());
+                                SetStyleProperty(*pEntry, *pPropSet, pValues[nProp], aBaseImpl);
                             }
                         }
                     }
@@ -3270,7 +3150,7 @@ void SAL_CALL SwXPageStyle::SetPropertyValues_Impl(
                             // default method to set the property
                             {
                                 SwStyleBase_Impl::ItemSetOverrider o(aBaseImpl, &rSetSet);
-                                lcl_SetStyleProperty(*pEntry, *pPropSet, pValues[nProp], aBaseImpl, m_pBasePool, GetDoc(), GetFamily());
+                                SetStyleProperty(*pEntry, *pPropSet, pValues[nProp], aBaseImpl);
                             }
 
                             // reset paret at ItemSet from SetItem
@@ -3284,7 +3164,7 @@ void SAL_CALL SwXPageStyle::SetPropertyValues_Impl(
                     else
                     {
                         // part of PageStyle, fallback to default
-                        lcl_SetStyleProperty(*pEntry, *pPropSet, pValues[nProp], aBaseImpl, m_pBasePool, GetDoc(), GetFamily());
+                        SetStyleProperty(*pEntry, *pPropSet, pValues[nProp], aBaseImpl);
                     }
 
                     break;
@@ -3313,8 +3193,7 @@ void SAL_CALL SwXPageStyle::SetPropertyValues_Impl(
                 }
                 default:
                 {
-                    //UUUU
-                    lcl_SetStyleProperty(*pEntry, *pPropSet, pValues[nProp], aBaseImpl, m_pBasePool, GetDoc(), GetFamily());
+                    SetStyleProperty(*pEntry, *pPropSet, pValues[nProp], aBaseImpl);
                     break;
                 }
             }


More information about the Libreoffice-commits mailing list