[Libreoffice-commits] core.git: chart2/source editeng/inc editeng/source filter/source forms/source include/editeng include/svl include/svx sc/source sd/qa sd/source svx/source sw/source

Noel Grandin noel.grandin at collabora.co.uk
Wed Nov 15 07:25:12 UTC 2017


 chart2/source/controller/dialogs/res_DataLabel.cxx                         |    2 
 chart2/source/controller/dialogs/tp_AxisLabel.cxx                          |    2 
 chart2/source/controller/dialogs/tp_LegendPosition.cxx                     |    2 
 chart2/source/controller/dialogs/tp_TitleRotation.cxx                      |    2 
 chart2/source/controller/itemsetwrapper/CharacterPropertyItemConverter.cxx |    8 -
 chart2/source/controller/itemsetwrapper/SchWhichPairs.hxx                  |    2 
 chart2/source/view/main/ChartView.cxx                                      |    2 
 chart2/source/view/main/DrawModelWrapper.cxx                               |    2 
 editeng/inc/editdoc.hxx                                                    |    5 
 editeng/source/accessibility/AccessibleEditableTextPara.cxx                |    5 
 editeng/source/editeng/editdbg.cxx                                         |   14 +-
 editeng/source/editeng/editdoc.cxx                                         |    4 
 editeng/source/editeng/editeng.cxx                                         |    2 
 editeng/source/editeng/edtspell.cxx                                        |    6 
 editeng/source/editeng/eerdll.cxx                                          |   22 +--
 editeng/source/editeng/eertfpar.cxx                                        |    2 
 editeng/source/editeng/impedit.cxx                                         |    4 
 editeng/source/editeng/impedit.hxx                                         |    5 
 editeng/source/editeng/impedit2.cxx                                        |    4 
 editeng/source/editeng/impedit3.cxx                                        |   11 -
 editeng/source/editeng/impedit4.cxx                                        |    8 -
 editeng/source/outliner/outliner.cxx                                       |   20 +--
 editeng/source/outliner/outlvw.cxx                                         |   12 -
 editeng/source/uno/unotext.cxx                                             |   12 -
 editeng/source/xml/xmltxtexp.cxx                                           |    6 
 filter/source/msfilter/msdffimp.cxx                                        |    6 
 filter/source/msfilter/svdfppt.cxx                                         |   20 +--
 forms/source/richtext/rtattributehandler.cxx                               |    2 
 include/editeng/editeng.hxx                                                |    6 
 include/editeng/eeitem.hxx                                                 |   31 +++--
 include/editeng/unotext.hxx                                                |   20 +--
 include/svl/itempool.hxx                                                   |   17 ++
 include/svl/itemset.hxx                                                    |   26 ++++
 include/svl/poolitem.hxx                                                   |    9 +
 include/svl/typedwhich.hxx                                                 |   61 ++++++++++
 include/svx/svdobj.hxx                                                     |    6 
 sc/source/core/data/column2.cxx                                            |    2 
 sc/source/core/data/drwlayer.cxx                                           |    4 
 sc/source/core/data/patattr.cxx                                            |    8 -
 sc/source/ui/app/inputwin.cxx                                              |    2 
 sc/source/ui/drawfunc/drawsh2.cxx                                          |    2 
 sc/source/ui/drawfunc/drawsh5.cxx                                          |    4 
 sc/source/ui/drawfunc/drtxtob.cxx                                          |   11 -
 sc/source/ui/drawfunc/drtxtob2.cxx                                         |    8 -
 sc/source/ui/drawfunc/futext.cxx                                           |    2 
 sc/source/ui/view/output2.cxx                                              |    4 
 sc/source/ui/view/printfun.cxx                                             |    2 
 sd/qa/unit/export-tests-ooxml1.cxx                                         |    8 -
 sd/qa/unit/import-tests.cxx                                                |    6 
 sd/source/core/drawdoc.cxx                                                 |    2 
 sd/source/core/drawdoc4.cxx                                                |   16 +-
 sd/source/core/sdpage.cxx                                                  |   10 -
 sd/source/core/stlpool.cxx                                                 |   13 --
 sd/source/core/stlsheet.cxx                                                |    4 
 sd/source/ui/dlg/dlgolbul.cxx                                              |    4 
 sd/source/ui/func/fuolbull.cxx                                             |    6 
 sd/source/ui/func/fupage.cxx                                               |    4 
 sd/source/ui/func/fuparagr.cxx                                             |    2 
 sd/source/ui/func/futempl.cxx                                              |    2 
 sd/source/ui/func/futext.cxx                                               |    6 
 sd/source/ui/view/drtxtob.cxx                                              |    6 
 sd/source/ui/view/drtxtob1.cxx                                             |   14 +-
 sd/source/ui/view/drviews2.cxx                                             |    8 -
 sd/source/ui/view/drviews3.cxx                                             |   26 ++--
 sd/source/ui/view/drviewsf.cxx                                             |    4 
 sd/source/ui/view/outlview.cxx                                             |    2 
 sd/source/ui/view/viewshel.cxx                                             |    6 
 svx/source/customshapes/EnhancedCustomShapeFontWork.cxx                    |    2 
 svx/source/svdraw/svdattr.cxx                                              |   12 -
 svx/source/unodraw/unomod.cxx                                              |    2 
 sw/source/uibase/shells/annotsh.cxx                                        |   10 -
 sw/source/uibase/shells/drwtxtex.cxx                                       |   12 -
 sw/source/uibase/uiview/viewdraw.cxx                                       |    9 -
 73 files changed, 376 insertions(+), 237 deletions(-)

New commits:
commit 3588a48a82d37f940595570758bc1d1179d18b84
Author: Noel Grandin <noel.grandin at collabora.co.uk>
Date:   Fri Nov 10 12:48:21 2017 +0200

    TypedWhichId
    
    use a strong-typedef template to give which IDs a type, which we can
    carry around to do a
    (a) little bit more convenience when Get()'ing them
    and
    (b) a little bit of enforcement of which PoolItem subclass each ID uses
    
    Fix a bug in casting EE_PARA_BULLETSTATE to the wrong subclass
    in AccessibleEditableTextPara::_correctValues
    
    Change-Id: I015ce8b3b0f6d21308af182afa3caf122c877a5b
    Reviewed-on: https://gerrit.libreoffice.org/44587
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Noel Grandin <noel.grandin at collabora.co.uk>

diff --git a/chart2/source/controller/dialogs/res_DataLabel.cxx b/chart2/source/controller/dialogs/res_DataLabel.cxx
index 73d8598a6dd2..abfffe1b6355 100644
--- a/chart2/source/controller/dialogs/res_DataLabel.cxx
+++ b/chart2/source/controller/dialogs/res_DataLabel.cxx
@@ -306,7 +306,7 @@ bool DataLabelResources::FillItemSet( SfxItemSet* rOutAttrs ) const
     }
 
     if( m_pLB_TextDirection->GetSelectedEntryCount() > 0 )
-        rOutAttrs->Put( SvxFrameDirectionItem( m_pLB_TextDirection->GetSelectEntryValue(), EE_PARA_WRITINGDIR ) );
+        rOutAttrs->Put( SvxFrameDirectionItem( m_pLB_TextDirection->GetSelectEntryValue(), EE_PARA_WRITINGDIR.Which() ) );
 
     if( m_pDC_Dial->IsVisible() )
     {
diff --git a/chart2/source/controller/dialogs/tp_AxisLabel.cxx b/chart2/source/controller/dialogs/tp_AxisLabel.cxx
index 3df8869364be..7fdeb8ffea7d 100644
--- a/chart2/source/controller/dialogs/tp_AxisLabel.cxx
+++ b/chart2/source/controller/dialogs/tp_AxisLabel.cxx
@@ -149,7 +149,7 @@ bool SchAxisLabelTabPage::FillItemSet( SfxItemSet* rOutAttrs )
         rOutAttrs->Put( SfxBoolItem( SCHATTR_AXIS_SHOWDESCR, m_pCbShowDescription->IsChecked() ) );
 
     if( m_pLbTextDirection->GetSelectedEntryCount() > 0 )
-        rOutAttrs->Put( SvxFrameDirectionItem( m_pLbTextDirection->GetSelectEntryValue(), EE_PARA_WRITINGDIR ) );
+        rOutAttrs->Put( SvxFrameDirectionItem( m_pLbTextDirection->GetSelectEntryValue(), EE_PARA_WRITINGDIR.Which() ) );
 
     return true;
 }
diff --git a/chart2/source/controller/dialogs/tp_LegendPosition.cxx b/chart2/source/controller/dialogs/tp_LegendPosition.cxx
index 554235d17343..8c0e7310081d 100644
--- a/chart2/source/controller/dialogs/tp_LegendPosition.cxx
+++ b/chart2/source/controller/dialogs/tp_LegendPosition.cxx
@@ -63,7 +63,7 @@ bool SchLegendPosTabPage::FillItemSet(SfxItemSet* rOutAttrs)
     m_aLegendPositionResources.writeToItemSet(*rOutAttrs);
 
     if( m_pLbTextDirection->GetSelectedEntryCount() > 0 )
-        rOutAttrs->Put( SvxFrameDirectionItem( m_pLbTextDirection->GetSelectEntryValue(), EE_PARA_WRITINGDIR ) );
+        rOutAttrs->Put( SvxFrameDirectionItem( m_pLbTextDirection->GetSelectEntryValue(), EE_PARA_WRITINGDIR.Which() ) );
 
     return true;
 }
diff --git a/chart2/source/controller/dialogs/tp_TitleRotation.cxx b/chart2/source/controller/dialogs/tp_TitleRotation.cxx
index ae304b22d24e..05537d931c8a 100644
--- a/chart2/source/controller/dialogs/tp_TitleRotation.cxx
+++ b/chart2/source/controller/dialogs/tp_TitleRotation.cxx
@@ -96,7 +96,7 @@ bool SchAlignmentTabPage::FillItemSet(SfxItemSet* rOutAttrs)
     rOutAttrs->Put( SfxInt32Item( SCHATTR_TEXT_DEGREES, nDegrees ) );
 
     SvxFrameDirection aDirection( m_pLbTextDirection->GetSelectEntryValue() );
-    rOutAttrs->Put( SvxFrameDirectionItem( aDirection, EE_PARA_WRITINGDIR ) );
+    rOutAttrs->Put( SvxFrameDirectionItem( aDirection, EE_PARA_WRITINGDIR.Which() ) );
 
     return true;
 }
diff --git a/chart2/source/controller/itemsetwrapper/CharacterPropertyItemConverter.cxx b/chart2/source/controller/itemsetwrapper/CharacterPropertyItemConverter.cxx
index 062b4b173b3e..7810f28e4b3c 100644
--- a/chart2/source/controller/itemsetwrapper/CharacterPropertyItemConverter.cxx
+++ b/chart2/source/controller/itemsetwrapper/CharacterPropertyItemConverter.cxx
@@ -56,9 +56,9 @@ ItemPropertyMapType & lcl_GetCharacterPropertyPropertyMap()
         {EE_CHAR_OUTLINE, {"CharContoured", 0}},
         {EE_CHAR_EMPHASISMARK, {"CharEmphasis", 0}},
 
-        {EE_PARA_WRITINGDIR, {"WritingMode", 0}},
+        {EE_PARA_WRITINGDIR.Which(), {"WritingMode", 0}},
 
-        {EE_PARA_ASIANCJKSPACING, {"ParaIsCharacterDistance", 0}}};
+        {EE_PARA_ASIANCJKSPACING.Which(), {"ParaIsCharacterDistance", 0}}};
 
     return aCharacterPropertyMap;
 }
@@ -296,8 +296,8 @@ void CharacterPropertyItemConverter::FillSpecialItem(
         }
         break;
 
-        case EE_PARA_FORBIDDENRULES:
-        case EE_PARA_HANGINGPUNCTUATION:
+        case EE_PARA_FORBIDDENRULES.Which():
+        case EE_PARA_HANGINGPUNCTUATION.Which():
             rOutItemSet.DisableItem( nWhichId );
             break;
     }
diff --git a/chart2/source/controller/itemsetwrapper/SchWhichPairs.hxx b/chart2/source/controller/itemsetwrapper/SchWhichPairs.hxx
index b8c85f61c046..3c3d4fd2a1a1 100644
--- a/chart2/source/controller/itemsetwrapper/SchWhichPairs.hxx
+++ b/chart2/source/controller/itemsetwrapper/SchWhichPairs.hxx
@@ -82,7 +82,7 @@ const sal_uInt16 nDataLabelWhichPairs[] =
     SID_ATTR_NUMBERFORMAT_VALUE, SID_ATTR_NUMBERFORMAT_INFO,    /* 10585 - 10585  svx/svxids.hrc */
     SID_ATTR_NUMBERFORMAT_SOURCE, SID_ATTR_NUMBERFORMAT_SOURCE, /* 11432          svx/svxids.hrc */
     SCHATTR_TEXT_DEGREES,SCHATTR_TEXT_DEGREES,
-    EE_PARA_WRITINGDIR,EE_PARA_WRITINGDIR,
+    EE_PARA_WRITINGDIR.Which(),EE_PARA_WRITINGDIR.Which(),
     0
 };
 
diff --git a/chart2/source/view/main/ChartView.cxx b/chart2/source/view/main/ChartView.cxx
index 49f1670e9f37..7dc5a3d8e99a 100644
--- a/chart2/source/view/main/ChartView.cxx
+++ b/chart2/source/view/main/ChartView.cxx
@@ -1538,7 +1538,7 @@ void lcl_setDefaultWritingMode( const std::shared_ptr< DrawModelWrapper >& pDraw
             if( nWritingMode != -1 && nWritingMode != text::WritingMode2::PAGE )
             {
                 if( pDrawModelWrapper.get() )
-                    pDrawModelWrapper->GetItemPool().SetPoolDefaultItem(SvxFrameDirectionItem(static_cast<SvxFrameDirection>(nWritingMode), EE_PARA_WRITINGDIR) );
+                    pDrawModelWrapper->GetItemPool().SetPoolDefaultItem(SvxFrameDirectionItem(static_cast<SvxFrameDirection>(nWritingMode), EE_PARA_WRITINGDIR.Which()) );
             }
         }
         catch( const uno::Exception& ex )
diff --git a/chart2/source/view/main/DrawModelWrapper.cxx b/chart2/source/view/main/DrawModelWrapper.cxx
index ab87a0769172..100517b08de1 100644
--- a/chart2/source/view/main/DrawModelWrapper.cxx
+++ b/chart2/source/view/main/DrawModelWrapper.cxx
@@ -63,7 +63,7 @@ DrawModelWrapper::DrawModelWrapper()
 
     SfxItemPool* pMasterPool = &GetItemPool();
     pMasterPool->SetDefaultMetric(MapUnit::Map100thMM);
-    pMasterPool->SetPoolDefaultItem(SfxBoolItem(EE_PARA_HYPHENATE, true) );
+    pMasterPool->SetPoolDefaultItem(SfxBoolItem(EE_PARA_HYPHENATE.Which(), true) );
     pMasterPool->SetPoolDefaultItem(makeSvx3DPercentDiagonalItem (5));
 
     SfxItemPool* pPool = pMasterPool;
diff --git a/editeng/inc/editdoc.hxx b/editeng/inc/editdoc.hxx
index 541ccca8b424..542b6d319982 100644
--- a/editeng/inc/editdoc.hxx
+++ b/editeng/inc/editdoc.hxx
@@ -174,6 +174,11 @@ public:
     void            SetStyleSheet( SfxStyleSheet* pS );
 
     const SfxPoolItem& GetItem( sal_uInt16 nWhich ) const;
+    template<class T>
+    const T&           GetItem( TypedWhichId<T> nWhich ) const
+    {
+        return static_cast<const T&>(GetItem(nWhich.Which()));
+    }
     bool HasItem( sal_uInt16 nWhich ) const;
 };
 
diff --git a/editeng/source/accessibility/AccessibleEditableTextPara.cxx b/editeng/source/accessibility/AccessibleEditableTextPara.cxx
index 33f884d7bc62..2348709303b1 100644
--- a/editeng/source/accessibility/AccessibleEditableTextPara.cxx
+++ b/editeng/source/accessibility/AccessibleEditableTextPara.cxx
@@ -52,6 +52,7 @@
 #include <editeng/unoipset.hxx>
 #include <editeng/outliner.hxx>
 #include <svl/intitem.hxx>
+#include <svl/eitem.hxx>
 
 
 // Project-local header
@@ -1534,7 +1535,7 @@ namespace accessibility
             // NumberingLevel
             if (rRes.Name == "NumberingLevel")
             {
-                const SvxNumBulletItem& rNumBullet = static_cast<const SvxNumBulletItem&>(rCacheTF.GetParaAttribs(GetParagraphIndex()).Get(EE_PARA_NUMBULLET));
+                const SvxNumBulletItem& rNumBullet = rCacheTF.GetParaAttribs(GetParagraphIndex()).Get(EE_PARA_NUMBULLET);
                 if(rNumBullet.GetNumRule()->GetLevelCount()==0)
                 {
                     rRes.Value <<= (sal_Int16)-1;
@@ -1559,7 +1560,7 @@ namespace accessibility
             if (rRes.Name == "NumberingRules")
             {
                 SfxItemSet aAttribs = rCacheTF.GetParaAttribs(GetParagraphIndex());
-                bool bVis = static_cast<const SfxUInt16Item&>(aAttribs.Get( EE_PARA_BULLETSTATE )).GetValue() != 0;
+                bool bVis = aAttribs.Get( EE_PARA_BULLETSTATE ).GetValue();
                 if(bVis)
                 {
                     rRes.Value <<= (sal_Int16)-1;
diff --git a/editeng/source/editeng/editdbg.cxx b/editeng/source/editeng/editdbg.cxx
index c93477eb7309..40eaab64d1bb 100644
--- a/editeng/source/editeng/editdbg.cxx
+++ b/editeng/source/editeng/editdbg.cxx
@@ -64,12 +64,12 @@ OString DbgOutItem(const SfxItemPool& rPool, const SfxPoolItem& rItem)
     OStringBuffer aDebStr;
     switch ( rItem.Which() )
     {
-        case EE_PARA_WRITINGDIR:
+        case EE_PARA_WRITINGDIR.Which():
             aDebStr.append("WritingDir=");
             aDebStr.append(static_cast<sal_Int32>(static_cast<const SvxFrameDirectionItem&>(rItem).GetValue()));
         break;
-        case EE_PARA_OUTLLRSPACE:
-        case EE_PARA_LRSPACE:
+        case EE_PARA_OUTLLRSPACE.Which():
+        case EE_PARA_LRSPACE.Which():
             aDebStr.append("FI=");
             aDebStr.append(static_cast<sal_Int32>(static_cast<const SvxLRSpaceItem&>(rItem).GetTextFirstLineOfst()));
             aDebStr.append(", LI=");
@@ -77,7 +77,7 @@ OString DbgOutItem(const SfxItemPool& rPool, const SfxPoolItem& rItem)
             aDebStr.append(", RI=");
             aDebStr.append(static_cast<sal_Int32>(static_cast<const SvxLRSpaceItem&>(rItem).GetRight()));
         break;
-        case EE_PARA_NUMBULLET:
+        case EE_PARA_NUMBULLET.Which():
             aDebStr.append("NumItem ");
             for ( sal_uInt16 nLevel = 0; nLevel < 3; nLevel++ )
             {
@@ -106,15 +106,15 @@ OString DbgOutItem(const SfxItemPool& rPool, const SfxPoolItem& rItem)
                 }
             }
         break;
-        case EE_PARA_BULLETSTATE:
+        case EE_PARA_BULLETSTATE.Which():
             aDebStr.append("ShowBullet=");
             aDebStr.append(static_cast<sal_Int32>(static_cast<const SfxBoolItem&>(rItem).GetValue()));
         break;
-        case EE_PARA_HYPHENATE:
+        case EE_PARA_HYPHENATE.Which():
             aDebStr.append("Hyphenate=");
             aDebStr.append(static_cast<sal_Int32>(static_cast<const SfxBoolItem&>(rItem).GetValue()));
         break;
-        case EE_PARA_OUTLLEVEL:
+        case EE_PARA_OUTLLEVEL.Which():
             aDebStr.append("Level=");
             aDebStr.append(static_cast<sal_Int32>(static_cast<const SfxInt16Item&>(rItem).GetValue()));
         break;
diff --git a/editeng/source/editeng/editdoc.cxx b/editeng/source/editeng/editdoc.cxx
index 8db5de5780d8..56219c85196e 100644
--- a/editeng/source/editeng/editdoc.cxx
+++ b/editeng/source/editeng/editdoc.cxx
@@ -825,7 +825,7 @@ void ConvertItem( SfxPoolItem& rPoolItem, MapUnit eSourceUnit, MapUnit eDestUnit
 
     switch ( rPoolItem.Which() )
     {
-        case EE_PARA_LRSPACE:
+        case EE_PARA_LRSPACE.Which():
         {
             assert(dynamic_cast<const SvxLRSpaceItem *>(&rPoolItem) != nullptr);
             SvxLRSpaceItem& rItem = static_cast<SvxLRSpaceItem&>(rPoolItem);
@@ -2271,7 +2271,7 @@ EditPaM EditDoc::InsertParaBreak( EditPaM aPaM, bool bKeepEndingAttribs )
     ContentAttribs aContentAttribs( aPaM.GetNode()->GetContentAttribs() );
 
     // for a new paragraph we like to have the bullet/numbering visible by default
-    aContentAttribs.GetItems().Put( SfxBoolItem( EE_PARA_BULLETSTATE, true) );
+    aContentAttribs.GetItems().Put( SfxBoolItem( EE_PARA_BULLETSTATE.Which(), true) );
 
     // ContentNode constructor copies also the paragraph attributes
     ContentNode* pNode = new ContentNode( aStr, aContentAttribs );
diff --git a/editeng/source/editeng/editeng.cxx b/editeng/source/editeng/editeng.cxx
index bb09af238d99..db6c7710dc38 100644
--- a/editeng/source/editeng/editeng.cxx
+++ b/editeng/source/editeng/editeng.cxx
@@ -1126,7 +1126,7 @@ bool EditEngine::PostKeyEvent( const KeyEvent& rKeyEvent, EditView* pEditView, v
 
 
                         sal_Int32 nPara = pImpEditEngine->GetEditDoc().GetPos( pNode );
-                        SfxBoolItem aBulletState( static_cast<const SfxBoolItem&>( pImpEditEngine->GetParaAttrib( nPara, EE_PARA_BULLETSTATE ) ) );
+                        SfxBoolItem aBulletState( pImpEditEngine->GetParaAttrib( nPara, EE_PARA_BULLETSTATE ) );
                         bool bBulletIsVisible = aBulletState.GetValue();
 
                         // just toggling EE_PARA_BULLETSTATE should be fine for both cases...
diff --git a/editeng/source/editeng/edtspell.cxx b/editeng/source/editeng/edtspell.cxx
index a27ae110a04e..e123b64c2bec 100644
--- a/editeng/source/editeng/edtspell.cxx
+++ b/editeng/source/editeng/edtspell.cxx
@@ -648,14 +648,12 @@ OUString const* EdtAutoCorrDoc::GetPrevPara(bool const)
     sal_Int32 nPos = rNodes.GetPos( pCurNode );
 
     // Special case: Bullet => Paragraph start => simply return NULL...
-    const SfxBoolItem& rBulletState = static_cast<const SfxBoolItem&>(
-            mpEditEngine->GetParaAttrib( nPos, EE_PARA_BULLETSTATE ));
+    const SfxBoolItem& rBulletState = mpEditEngine->GetParaAttrib( nPos, EE_PARA_BULLETSTATE );
     bool bBullet = rBulletState.GetValue();
     if ( !bBullet && (mpEditEngine->GetControlWord() & EEControlBits::OUTLINER) )
     {
         // The Outliner has still a Bullet at Level 0.
-        const SfxInt16Item& rLevel = static_cast<const SfxInt16Item&>(
-                mpEditEngine->GetParaAttrib( nPos, EE_PARA_OUTLLEVEL ));
+        const SfxInt16Item& rLevel = mpEditEngine->GetParaAttrib( nPos, EE_PARA_OUTLLEVEL );
         if ( rLevel.GetValue() == 0 )
             bBullet = true;
     }
diff --git a/editeng/source/editeng/eerdll.cxx b/editeng/source/editeng/eerdll.cxx
index a7f74bf2701f..80a6bed5723e 100644
--- a/editeng/source/editeng/eerdll.cxx
+++ b/editeng/source/editeng/eerdll.cxx
@@ -94,18 +94,18 @@ DefItems::DefItems()
     // Paragraph attributes:
     SvxNumRule aDefaultNumRule( SvxNumRuleFlags::NONE, 0, false );
 
-    rDefItems[0]  = new SvxFrameDirectionItem( SvxFrameDirection::Horizontal_LR_TB, EE_PARA_WRITINGDIR );
+    rDefItems[0]  = new SvxFrameDirectionItem( SvxFrameDirection::Horizontal_LR_TB, EE_PARA_WRITINGDIR.Which() );
     rDefItems[1]  = new SvXMLAttrContainerItem( EE_PARA_XMLATTRIBS );
-    rDefItems[2]  = new SvxHangingPunctuationItem(false, EE_PARA_HANGINGPUNCTUATION);
-    rDefItems[3]  = new SvxForbiddenRuleItem(true, EE_PARA_FORBIDDENRULES);
-    rDefItems[4]  = new SvxScriptSpaceItem( true, EE_PARA_ASIANCJKSPACING );
-    rDefItems[5]  = new SvxNumBulletItem( aDefaultNumRule, EE_PARA_NUMBULLET );
-    rDefItems[6]  = new SfxBoolItem( EE_PARA_HYPHENATE, false );
-    rDefItems[7]  = new SfxBoolItem( EE_PARA_BULLETSTATE, true );
-    rDefItems[8]  = new SvxLRSpaceItem( EE_PARA_OUTLLRSPACE );
-    rDefItems[9]  = new SfxInt16Item( EE_PARA_OUTLLEVEL, -1 );
-    rDefItems[10] = new SvxBulletItem( EE_PARA_BULLET );
-    rDefItems[11] = new SvxLRSpaceItem( EE_PARA_LRSPACE );
+    rDefItems[2]  = new SvxHangingPunctuationItem(false, EE_PARA_HANGINGPUNCTUATION.Which());
+    rDefItems[3]  = new SvxForbiddenRuleItem(true, EE_PARA_FORBIDDENRULES.Which());
+    rDefItems[4]  = new SvxScriptSpaceItem( true, EE_PARA_ASIANCJKSPACING.Which() );
+    rDefItems[5]  = new SvxNumBulletItem( aDefaultNumRule, EE_PARA_NUMBULLET.Which() );
+    rDefItems[6]  = new SfxBoolItem( EE_PARA_HYPHENATE.Which(), false );
+    rDefItems[7]  = new SfxBoolItem( EE_PARA_BULLETSTATE.Which(), true );
+    rDefItems[8]  = new SvxLRSpaceItem( EE_PARA_OUTLLRSPACE.Which() );
+    rDefItems[9]  = new SfxInt16Item( EE_PARA_OUTLLEVEL.Which(), -1 );
+    rDefItems[10] = new SvxBulletItem( EE_PARA_BULLET.Which() );
+    rDefItems[11] = new SvxLRSpaceItem( EE_PARA_LRSPACE.Which() );
     rDefItems[12] = new SvxULSpaceItem( EE_PARA_ULSPACE );
     rDefItems[13] = new SvxLineSpacingItem( 0, EE_PARA_SBL );
     rDefItems[14] = new SvxAdjustItem( SvxAdjust::Left, EE_PARA_JUST );
diff --git a/editeng/source/editeng/eertfpar.cxx b/editeng/source/editeng/eertfpar.cxx
index 428e76cc5e32..5f81f3709c2f 100644
--- a/editeng/source/editeng/eertfpar.cxx
+++ b/editeng/source/editeng/eertfpar.cxx
@@ -433,7 +433,7 @@ void EditRTFParser::SetAttrInDoc( SvxRTFItemStackType &rSet )
         for ( sal_Int32 n = nStartNode; n <= nEndNode; n++ )
         {
             ContentNode* pNode = mpEditEngine->GetEditDoc().GetObject( n );
-            pNode->GetContentAttribs().GetItems().Put( SfxInt16Item( EE_PARA_OUTLLEVEL, nOutlLevel ) );
+            pNode->GetContentAttribs().GetItems().Put( SfxInt16Item( EE_PARA_OUTLLEVEL.Which(), nOutlLevel ) );
         }
     }
 }
diff --git a/editeng/source/editeng/impedit.cxx b/editeng/source/editeng/impedit.cxx
index 1cadc38a7539..6a89f6f360f0 100644
--- a/editeng/source/editeng/impedit.cxx
+++ b/editeng/source/editeng/impedit.cxx
@@ -1876,10 +1876,10 @@ void ImpEditView::dragGestureRecognized(const css::datatransfer::dnd::DragGestur
             pDragAndDropInfo->bOutlinerMode = true;
             EditPaM aStartPaM( pEditEngine->GetEditDoc().GetObject( nPara ), 0 );
             EditPaM aEndPaM( aStartPaM );
-            const SfxInt16Item& rLevel = static_cast<const SfxInt16Item&>(pEditEngine->GetParaAttrib( nPara, EE_PARA_OUTLLEVEL ));
+            const SfxInt16Item& rLevel = pEditEngine->GetParaAttrib( nPara, EE_PARA_OUTLLEVEL );
             for ( sal_Int32 n = nPara +1; n < pEditEngine->GetEditDoc().Count(); n++ )
             {
-                const SfxInt16Item& rL = static_cast<const SfxInt16Item&>( pEditEngine->GetParaAttrib( n, EE_PARA_OUTLLEVEL ) );
+                const SfxInt16Item& rL = pEditEngine->GetParaAttrib( n, EE_PARA_OUTLLEVEL );
                 if ( rL.GetValue() > rLevel.GetValue() )
                 {
                     aEndPaM.SetNode( pEditEngine->GetEditDoc().GetObject( n ) );
diff --git a/editeng/source/editeng/impedit.hxx b/editeng/source/editeng/impedit.hxx
index 3f1e0f3f0b05..56e27e67b5b4 100644
--- a/editeng/source/editeng/impedit.hxx
+++ b/editeng/source/editeng/impedit.hxx
@@ -852,6 +852,11 @@ public:
 
     bool            HasParaAttrib( sal_Int32 nPara, sal_uInt16 nWhich ) const;
     const SfxPoolItem&  GetParaAttrib( sal_Int32 nPara, sal_uInt16 nWhich ) const;
+    template<class T>
+    const T&            GetParaAttrib( sal_Int32 nPara, TypedWhichId<T> nWhich ) const
+    {
+        return static_cast<const T&>(GetParaAttrib(nPara, nWhich.Which()));
+    }
 
     tools::Rectangle       PaMtoEditCursor( EditPaM aPaM, GetCursorFlags nFlags = GetCursorFlags::NONE );
     tools::Rectangle       GetEditCursor( ParaPortion* pPortion, sal_Int32 nIndex, GetCursorFlags nFlags = GetCursorFlags::NONE );
diff --git a/editeng/source/editeng/impedit2.cxx b/editeng/source/editeng/impedit2.cxx
index 1cb3649e89b1..a8571b69a200 100644
--- a/editeng/source/editeng/impedit2.cxx
+++ b/editeng/source/editeng/impedit2.cxx
@@ -1972,7 +1972,7 @@ bool ImpEditEngine::IsRightToLeft( sal_Int32 nPara ) const
     if ( !IsVertical() )
     {
         bR2L = GetDefaultHorizontalTextDirection() == EE_HTEXTDIR_R2L;
-        pFrameDirItem = &static_cast<const SvxFrameDirectionItem&>(GetParaAttrib( nPara, EE_PARA_WRITINGDIR ));
+        pFrameDirItem = &GetParaAttrib( nPara, EE_PARA_WRITINGDIR );
         if ( pFrameDirItem->GetValue() == SvxFrameDirection::Environment )
         {
             // #103045# if DefaultHorizontalTextDirection is set, use that value, otherwise pool default.
@@ -1983,7 +1983,7 @@ bool ImpEditEngine::IsRightToLeft( sal_Int32 nPara ) const
             else
             {
                 // Use pool default
-                pFrameDirItem = &static_cast<const SvxFrameDirectionItem&>(const_cast<ImpEditEngine*>(this)->GetEmptyItemSet().Get( EE_PARA_WRITINGDIR ));
+                pFrameDirItem = &const_cast<ImpEditEngine*>(this)->GetEmptyItemSet().Get( EE_PARA_WRITINGDIR );
             }
         }
     }
diff --git a/editeng/source/editeng/impedit3.cxx b/editeng/source/editeng/impedit3.cxx
index 6d153502585f..dece17fbb7a9 100644
--- a/editeng/source/editeng/impedit3.cxx
+++ b/editeng/source/editeng/impedit3.cxx
@@ -30,6 +30,7 @@
 #include <editeng/tstpitem.hxx>
 #include <editeng/lspcitem.hxx>
 #include <editeng/flditem.hxx>
+#include <editeng/forbiddenruleitem.hxx>
 #include "impedit.hxx"
 #include <editeng/editeng.hxx>
 #include <editeng/editview.hxx>
@@ -54,6 +55,7 @@
 #include <svl/ctloptions.hxx>
 #include <svl/asiancfg.hxx>
 
+#include <editeng/hngpnctitem.hxx>
 #include <editeng/forbiddencharacterstable.hxx>
 
 #include <unotools/configmgr.hxx>
@@ -638,13 +640,13 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY )
     bool bRightToLeftPara = IsRightToLeft( nPara );
 
     SvxAdjust eJustification = GetJustification( nPara );
-    bool bHyphenatePara = static_cast<const SfxBoolItem&>(pNode->GetContentAttribs().GetItem( EE_PARA_HYPHENATE )).GetValue();
+    bool bHyphenatePara = pNode->GetContentAttribs().GetItem( EE_PARA_HYPHENATE ).GetValue();
     sal_Int32 nSpaceBefore      = 0;
     sal_Int32 nMinLabelWidth    = 0;
     sal_Int32 nSpaceBeforeAndMinLabelWidth = GetSpaceBeforeAndMinLabelWidth( pNode, &nSpaceBefore, &nMinLabelWidth );
     const SvxLRSpaceItem& rLRItem = GetLRSpaceItem( pNode );
     const SvxLineSpacingItem& rLSItem = static_cast<const SvxLineSpacingItem&>( pNode->GetContentAttribs().GetItem( EE_PARA_SBL ) );
-    const bool bScriptSpace = static_cast<const SvxScriptSpaceItem&>(pNode->GetContentAttribs().GetItem( EE_PARA_ASIANCJKSPACING )).GetValue();
+    const bool bScriptSpace = pNode->GetContentAttribs().GetItem( EE_PARA_ASIANCJKSPACING ).GetValue();
 
     const short nInvalidDiff = pParaPortion->GetInvalidDiff();
     const sal_Int32 nInvalidStart = pParaPortion->GetInvalidPosStart();
@@ -3080,8 +3082,7 @@ void ImpEditEngine::Paint( OutputDevice* pOutDev, tools::Rectangle aClipRect, Po
                         GetEditEnginePtr()->PaintingFirstLine( n, aParaStart, aTmpPos.Y(), aOrigin, nOrientation, pOutDev );
 
                         // Remember whether a bullet was painted.
-                        const SfxBoolItem& rBulletState = static_cast<const SfxBoolItem&>(
-                            pEditEngine->GetParaAttrib(n, EE_PARA_BULLETSTATE));
+                        const SfxBoolItem& rBulletState = pEditEngine->GetParaAttrib(n, EE_PARA_BULLETSTATE);
                         bPaintBullet = rBulletState.GetValue();
                     }
 
@@ -4329,7 +4330,7 @@ sal_Int32 ImpEditEngine::GetSpaceBeforeAndMinLabelWidth(
 
 const SvxLRSpaceItem& ImpEditEngine::GetLRSpaceItem( ContentNode* pNode )
 {
-    return static_cast<const SvxLRSpaceItem&>(pNode->GetContentAttribs().GetItem( aStatus.IsOutliner() ? EE_PARA_OUTLLRSPACE : EE_PARA_LRSPACE ));
+    return pNode->GetContentAttribs().GetItem( aStatus.IsOutliner() ? EE_PARA_OUTLLRSPACE : EE_PARA_LRSPACE );
 }
 
 // select a representative text language for the digit type according to the
diff --git a/editeng/source/editeng/impedit4.cxx b/editeng/source/editeng/impedit4.cxx
index 6b82c0b658d6..1019cc0b84fc 100644
--- a/editeng/source/editeng/impedit4.cxx
+++ b/editeng/source/editeng/impedit4.cxx
@@ -673,7 +673,7 @@ void ImpEditEngine::WriteItemAsRTF( const SfxPoolItem& rItem, SvStream& rOutput,
     sal_uInt16 nWhich = rItem.Which();
     switch ( nWhich )
     {
-        case EE_PARA_WRITINGDIR:
+        case EE_PARA_WRITINGDIR.Which():
         {
             const SvxFrameDirectionItem& rWritingMode = static_cast<const SvxFrameDirectionItem&>(rItem);
             if ( rWritingMode.GetValue() == SvxFrameDirection::Horizontal_RL_TB )
@@ -682,7 +682,7 @@ void ImpEditEngine::WriteItemAsRTF( const SfxPoolItem& rItem, SvStream& rOutput,
                 rOutput.WriteCharPtr( "\\ltrpar" );
         }
         break;
-        case EE_PARA_OUTLLEVEL:
+        case EE_PARA_OUTLLEVEL.Which():
         {
             sal_Int32 nLevel = static_cast<const SfxInt16Item&>(rItem).GetValue();
             if( nLevel >= 0 )
@@ -692,8 +692,8 @@ void ImpEditEngine::WriteItemAsRTF( const SfxPoolItem& rItem, SvStream& rOutput,
             }
         }
         break;
-        case EE_PARA_OUTLLRSPACE:
-        case EE_PARA_LRSPACE:
+        case EE_PARA_OUTLLRSPACE.Which():
+        case EE_PARA_LRSPACE.Which():
         {
             rOutput.WriteCharPtr( OOO_STRING_SVTOOLS_RTF_FI );
             sal_Int32 nTxtFirst = static_cast<const SvxLRSpaceItem&>(rItem).GetTextFirstLineOfst();
diff --git a/editeng/source/outliner/outliner.cxx b/editeng/source/outliner/outliner.cxx
index e4455865396d..6ef469e64c3e 100644
--- a/editeng/source/outliner/outliner.cxx
+++ b/editeng/source/outliner/outliner.cxx
@@ -132,7 +132,7 @@ void Outliner::ParagraphInserted( sal_Int32 nPara )
         {
             pPara->nFlags = ParaFlag::SETBULLETTEXT;
             pPara->bVisible = true;
-            const SfxInt16Item& rLevel = static_cast<const SfxInt16Item&>( pEditEngine->GetParaAttrib( nPara, EE_PARA_OUTLLEVEL ) );
+            const SfxInt16Item& rLevel = pEditEngine->GetParaAttrib( nPara, EE_PARA_OUTLLEVEL );
             pPara->SetDepth( rLevel.GetValue() );
         }
     }
@@ -550,7 +550,7 @@ bool Outliner::ImpConvertEdtToOut( sal_Int32 nPara )
         pEditEngine->QuickDelete( aDelSel );
     }
 
-    const SfxInt16Item& rLevel = static_cast<const SfxInt16Item&>( pEditEngine->GetParaAttrib( nPara, EE_PARA_OUTLLEVEL ) );
+    const SfxInt16Item& rLevel = pEditEngine->GetParaAttrib( nPara, EE_PARA_OUTLLEVEL );
     sal_Int16 nOutlLevel = rLevel.GetValue();
 
     ImplCheckDepth( nOutlLevel );
@@ -726,7 +726,7 @@ void Outliner::ImplInitDepth( sal_Int32 nPara, sal_Int16 nDepth, bool bCreateUnd
         bool bUndo = bCreateUndo && IsUndoEnabled();
 
         SfxItemSet aAttrs( pEditEngine->GetParaAttribs( nPara ) );
-        aAttrs.Put( SfxInt16Item( EE_PARA_OUTLLEVEL, nDepth ) );
+        aAttrs.Put( SfxInt16Item( EE_PARA_OUTLLEVEL.Which(), nDepth ) );
         pEditEngine->SetParaAttribs( nPara, aAttrs );
         ImplCheckNumBulletItem( nPara );
         ImplCalcBulletText( nPara, false, false );
@@ -871,7 +871,7 @@ void Outliner::PaintBullet( sal_Int32 nPara, const Point& rStartPos,
     bool bDrawBullet = false;
     if (pEditEngine)
     {
-        const SfxBoolItem& rBulletState = static_cast<const SfxBoolItem&>( pEditEngine->GetParaAttrib( nPara, EE_PARA_BULLETSTATE ) );
+        const SfxBoolItem& rBulletState = pEditEngine->GetParaAttrib( nPara, EE_PARA_BULLETSTATE );
         bDrawBullet = rBulletState.GetValue();
     }
 
@@ -1107,7 +1107,7 @@ ErrCode Outliner::Read( SvStream& rInput, const OUString& rBaseURL, sal_uInt16 e
         if ( eFormat == EE_FORMAT_BIN )
         {
             const SfxItemSet& rAttrs = pEditEngine->GetParaAttribs( n );
-            const SfxInt16Item& rLevel = static_cast<const SfxInt16Item&>( rAttrs.Get( EE_PARA_OUTLLEVEL ));
+            const SfxInt16Item& rLevel = rAttrs.Get( EE_PARA_OUTLLEVEL );
             sal_Int16 nDepth = rLevel.GetValue();
             ImplInitDepth( n, nDepth, false );
         }
@@ -1197,7 +1197,7 @@ void Outliner::ImpTextPasted( sal_Int32 nStartPara, sal_Int32 nCount )
             const SfxItemSet& rAttrs = pEditEngine->GetParaAttribs( nStartPara );
             if ( rAttrs.GetItemState( EE_PARA_OUTLLEVEL ) == SfxItemState::SET )
             {
-                const SfxInt16Item& rLevel = static_cast<const SfxInt16Item&>( rAttrs.Get( EE_PARA_OUTLLEVEL ) );
+                const SfxInt16Item& rLevel = rAttrs.Get( EE_PARA_OUTLLEVEL );
                 nDepth = rLevel.GetValue();
             }
             if ( nDepth != GetDepth( nStartPara ) )
@@ -1402,7 +1402,7 @@ const SvxNumberFormat* Outliner::GetNumberFormat( sal_Int32 nPara ) const
 
     if( nDepth >= 0 )
     {
-        const SvxNumBulletItem& rNumBullet = static_cast<const SvxNumBulletItem&>( pEditEngine->GetParaAttrib( nPara, EE_PARA_NUMBULLET ) );
+        const SvxNumBulletItem& rNumBullet = pEditEngine->GetParaAttrib( nPara, EE_PARA_NUMBULLET );
         if ( rNumBullet.GetNumRule()->GetLevelCount() > nDepth )
             pFmt = rNumBullet.GetNumRule()->Get( nDepth );
     }
@@ -1486,7 +1486,7 @@ void Outliner::ParaAttribsChanged( sal_Int32 nPara )
         return;
     // tdf#100734: force update of bullet
     pPara->Invalidate();
-    const SfxInt16Item& rLevel = static_cast<const SfxInt16Item&>( pEditEngine->GetParaAttrib( nPara, EE_PARA_OUTLLEVEL ) );
+    const SfxInt16Item& rLevel = pEditEngine->GetParaAttrib( nPara, EE_PARA_OUTLLEVEL );
     if (pPara->GetDepth() == rLevel.GetValue())
         return;
     pPara->SetDepth(rLevel.GetValue());
@@ -1530,7 +1530,7 @@ tools::Rectangle Outliner::ImpCalcBulletArea( sal_Int32 nPara, bool bAdjust, boo
         // the ODF attribute text:space-before which holds the spacing to add to the left of the label
         const short nSpaceBefore = pFmt->GetAbsLSpace() + pFmt->GetFirstLineOffset();
 
-        const SvxLRSpaceItem& rLR = static_cast<const SvxLRSpaceItem&>( pEditEngine->GetParaAttrib( nPara, bOutlineMode ? EE_PARA_OUTLLRSPACE : EE_PARA_LRSPACE ) );
+        const SvxLRSpaceItem& rLR = pEditEngine->GetParaAttrib( nPara, bOutlineMode ? EE_PARA_OUTLLRSPACE : EE_PARA_LRSPACE );
         aTopLeft.X() = rLR.GetTextLeft() + rLR.GetTextFirstLineOfst() + nSpaceBefore;
 
         long nBulletWidth = std::max( (long) -rLR.GetTextFirstLineOfst(), (long) ((-pFmt->GetFirstLineOffset()) + pFmt->GetCharTextDistance()) );
@@ -1824,7 +1824,7 @@ sal_uInt16 Outliner::ImplGetNumbering( sal_Int32 nPara, const SvxNumberFormat* p
            pParaFmt = pFmt;
         }
 
-        const SfxBoolItem& rBulletState = static_cast<const SfxBoolItem&>( pEditEngine->GetParaAttrib( nPara, EE_PARA_BULLETSTATE ) );
+        const SfxBoolItem& rBulletState = pEditEngine->GetParaAttrib( nPara, EE_PARA_BULLETSTATE );
 
         if( rBulletState.GetValue() )
             nNumber += 1;
diff --git a/editeng/source/outliner/outlvw.cxx b/editeng/source/outliner/outlvw.cxx
index e9e8c4e02036..a83110ee3876 100644
--- a/editeng/source/outliner/outlvw.cxx
+++ b/editeng/source/outliner/outlvw.cxx
@@ -878,7 +878,7 @@ void OutlinerView::ToggleBullets()
                     {
                         SfxItemSet aAttrs( pOwner->GetParaAttribs( nPara ) );
                         SvxNumRule aNewNumRule( *pDefaultBulletNumRule );
-                        aAttrs.Put( SvxNumBulletItem( aNewNumRule, EE_PARA_NUMBULLET ) );
+                        aAttrs.Put( SvxNumBulletItem( aNewNumRule, EE_PARA_NUMBULLET.Which() ) );
                         pOwner->SetParaAttribs( nPara, aAttrs );
                     }
                 }
@@ -1013,7 +1013,7 @@ void OutlinerView::ApplyBulletsNumbering(
 
             const SfxItemSet& rAttrs = pOwner->GetParaAttribs(nPara);
             SfxItemSet aAttrs(rAttrs);
-            aAttrs.Put(SfxBoolItem(EE_PARA_BULLETSTATE, true));
+            aAttrs.Put(SfxBoolItem(EE_PARA_BULLETSTATE.Which(), true));
 
             // apply new numbering rule
             if ( pNewNumRule )
@@ -1083,7 +1083,7 @@ void OutlinerView::ApplyBulletsNumbering(
                         }
                     }
 
-                    aAttrs.Put(SvxNumBulletItem(aNewRule, EE_PARA_NUMBULLET));
+                    aAttrs.Put(SvxNumBulletItem(aNewRule, EE_PARA_NUMBULLET.Which()));
                 }
             }
             pOwner->SetParaAttribs(nPara, aAttrs);
@@ -1132,10 +1132,10 @@ void OutlinerView::SwitchOffBulletsNumbering(
             pOwner->SetDepth( pPara, -1 );
 
             const SfxItemSet& rAttrs = pOwner->GetParaAttribs( nPara );
-            if (rAttrs.GetItemState( EE_PARA_BULLETSTATE ) == SfxItemState::SET)
+            if (rAttrs.GetItemState( EE_PARA_BULLETSTATE.Which() ) == SfxItemState::SET)
             {
                 SfxItemSet aAttrs(rAttrs);
-                aAttrs.ClearItem( EE_PARA_BULLETSTATE );
+                aAttrs.ClearItem( EE_PARA_BULLETSTATE.Which() );
                 pOwner->SetParaAttribs( nPara, aAttrs );
             }
         }
@@ -1391,7 +1391,7 @@ void OutlinerView::Read( SvStream& rInput, EETextFormat eFormat, SvKeyValueItera
         if ( eFormat == EE_FORMAT_BIN )
         {
             const SfxItemSet& rAttrs = pOwner->GetParaAttribs( n );
-            const SfxInt16Item& rLevel = static_cast<const SfxInt16Item&>( rAttrs.Get( EE_PARA_OUTLLEVEL ) );
+            const SfxInt16Item& rLevel = rAttrs.Get( EE_PARA_OUTLLEVEL );
             sal_uInt16 nDepth = rLevel.GetValue();
             pOwner->ImplInitDepth( n, nDepth, false );
         }
diff --git a/editeng/source/uno/unotext.cxx b/editeng/source/uno/unotext.cxx
index d5c0a32d8b06..eb745a27f4c9 100644
--- a/editeng/source/uno/unotext.cxx
+++ b/editeng/source/uno/unotext.cxx
@@ -506,7 +506,7 @@ bool SvxUnoTextRangeBase::SetPropertyValueHelper( const SfxItemPropertySimpleEnt
         }
         break;
 
-    case EE_PARA_NUMBULLET:
+    case EE_PARA_NUMBULLET.Which():
         {
             uno::Reference< container::XIndexReplace > xRule;
             return !aValue.hasValue() || ((aValue >>= xRule) && !xRule.is());
@@ -557,12 +557,12 @@ bool SvxUnoTextRangeBase::SetPropertyValueHelper( const SfxItemPropertySimpleEnt
             }
         }
         break;
-    case EE_PARA_BULLETSTATE:
+    case EE_PARA_BULLETSTATE.Which():
         {
             bool bBullet = true;
             if( aValue >>= bBullet )
             {
-                SfxBoolItem aItem( EE_PARA_BULLETSTATE, bBullet );
+                SfxBoolItem aItem( EE_PARA_BULLETSTATE.Which(), bBullet );
                 rNewSet.Put(aItem);
                 return true;
             }
@@ -678,13 +678,13 @@ bool SvxUnoTextRangeBase::GetPropertyValueHelper(  SfxItemSet const & rSet, cons
         }
         break;
 
-    case EE_PARA_NUMBULLET:
+    case EE_PARA_NUMBULLET.Which():
         {
             SfxItemState eState = rSet.GetItemState( EE_PARA_NUMBULLET );
             if( eState != SfxItemState::SET && eState != SfxItemState::DEFAULT)
                 throw uno::RuntimeException();
 
-            const SvxNumBulletItem* pBulletItem = rSet.GetItem<SvxNumBulletItem>( EE_PARA_NUMBULLET );
+            const SvxNumBulletItem* pBulletItem = rSet.GetItem( EE_PARA_NUMBULLET );
 
             if( pBulletItem == nullptr )
                 throw uno::RuntimeException();
@@ -719,7 +719,7 @@ bool SvxUnoTextRangeBase::GetPropertyValueHelper(  SfxItemSet const & rSet, cons
         }
         break;
 
-    case EE_PARA_BULLETSTATE:
+    case EE_PARA_BULLETSTATE.Which():
         {
             bool bState = false;
             SfxItemState eState = rSet.GetItemState( EE_PARA_BULLETSTATE );
diff --git a/editeng/source/xml/xmltxtexp.cxx b/editeng/source/xml/xmltxtexp.cxx
index 1ada3a700339..b3ffd98b675b 100644
--- a/editeng/source/xml/xmltxtexp.cxx
+++ b/editeng/source/xml/xmltxtexp.cxx
@@ -281,9 +281,9 @@ SvxXMLTextExportComponent::SvxXMLTextExportComponent(
     {
         SVX_UNOEDIT_CHAR_PROPERTIES,
         SVX_UNOEDIT_FONT_PROPERTIES,
-        { OUString(UNO_NAME_NUMBERING_RULES),        EE_PARA_NUMBULLET,  cppu::UnoType<css::container::XIndexReplace>::get(), 0, 0 },
-        { OUString(UNO_NAME_NUMBERING),              EE_PARA_BULLETSTATE,cppu::UnoType<bool>::get(), 0, 0 },
-        { OUString(UNO_NAME_NUMBERING_LEVEL),        EE_PARA_OUTLLEVEL,  ::cppu::UnoType<sal_Int16>::get(), 0, 0 },
+        { OUString(UNO_NAME_NUMBERING_RULES),        EE_PARA_NUMBULLET.Which(),  cppu::UnoType<css::container::XIndexReplace>::get(), 0, 0 },
+        { OUString(UNO_NAME_NUMBERING),              EE_PARA_BULLETSTATE.Which(),cppu::UnoType<bool>::get(), 0, 0 },
+        { OUString(UNO_NAME_NUMBERING_LEVEL),        EE_PARA_OUTLLEVEL.Which(),  ::cppu::UnoType<sal_Int16>::get(), 0, 0 },
         SVX_UNOEDIT_PARA_PROPERTIES,
         { OUString(), 0, css::uno::Type(), 0, 0 }
     };
diff --git a/filter/source/msfilter/msdffimp.cxx b/filter/source/msfilter/msdffimp.cxx
index 25be4f0f04f6..63f152418418 100644
--- a/filter/source/msfilter/msdffimp.cxx
+++ b/filter/source/msfilter/msdffimp.cxx
@@ -1532,7 +1532,7 @@ void DffPropertyReader::ApplyCustomShapeTextAttributes( SfxItemSet& rSet ) const
             break;
         }
     }
-    rSet.Put( SvxFrameDirectionItem( bVerticalText ? SvxFrameDirection::Vertical_RL_TB : SvxFrameDirection::Horizontal_LR_TB, EE_PARA_WRITINGDIR ) );
+    rSet.Put( SvxFrameDirectionItem( bVerticalText ? SvxFrameDirection::Vertical_RL_TB : SvxFrameDirection::Horizontal_LR_TB, EE_PARA_WRITINGDIR.Which() ) );
 
     rSet.Put( SdrTextVertAdjustItem( eTVA ) );
     rSet.Put( SdrTextHorzAdjustItem( eTHA ) );
@@ -3661,7 +3661,7 @@ void SvxMSDffManager::ReadObjText( const OUString& rText, SdrObject* pObj )
 
             SfxItemSet aParagraphAttribs( rOutliner.GetEmptyItemSet() );
             if ( !aSelection.nStartPos )
-                aParagraphAttribs.Put( SfxBoolItem( EE_PARA_BULLETSTATE, false ) );
+                aParagraphAttribs.Put( SfxBoolItem( EE_PARA_BULLETSTATE.Which(), false ) );
             aSelection.nStartPos = 0;
             rOutliner.QuickSetAttribs( aParagraphAttribs, aSelection );
             nParaIndex++;
@@ -4469,7 +4469,7 @@ SdrObject* SvxMSDffManager::ImportShape( const DffRecordHeader& rHd, SvStream& r
                                     if ( bIsRTL )
                                     {
                                         SfxItemSet aSet2( rOutliner.GetParaAttribs( i ) );
-                                        aSet2.Put( SvxFrameDirectionItem( SvxFrameDirection::Horizontal_RL_TB, EE_PARA_WRITINGDIR ) );
+                                        aSet2.Put( SvxFrameDirectionItem( SvxFrameDirection::Horizontal_RL_TB, EE_PARA_WRITINGDIR.Which() ) );
                                         rOutliner.SetParaAttribs( i, aSet2 );
                                         bCreateNewParaObject = true;
                                     }
diff --git a/filter/source/msfilter/svdfppt.cxx b/filter/source/msfilter/svdfppt.cxx
index 0ba7d259d7a5..78ee76593663 100644
--- a/filter/source/msfilter/svdfppt.cxx
+++ b/filter/source/msfilter/svdfppt.cxx
@@ -1090,7 +1090,7 @@ SdrObject* SdrEscherImport::ProcessObj( SvStream& rSt, DffObjData& rObjData, voi
                         bAutoGrowHeight = bFitShapeToText;
                     }
                 }
-                pTObj->SetMergedItem( SvxFrameDirectionItem( bVerticalText ? SvxFrameDirection::Vertical_RL_TB : SvxFrameDirection::Horizontal_LR_TB, EE_PARA_WRITINGDIR ) );
+                pTObj->SetMergedItem( SvxFrameDirectionItem( bVerticalText ? SvxFrameDirection::Vertical_RL_TB : SvxFrameDirection::Horizontal_LR_TB, EE_PARA_WRITINGDIR.Which() ) );
 
                 //Autofit text only if there is no auto grow height and width
                 //See fdo#41245
@@ -2329,11 +2329,11 @@ SdrObject* SdrPowerPointImport::ApplyTextObj( PPTTextObj* pTextObj, SdrTextObj*
                 sal_uInt32  nIsBullet2 = 0; //, nInstance = nDestinationInstance != 0xffffffff ? nDestinationInstance : pTextObj->GetInstance();
                 pPara->GetAttrib( PPT_ParaAttr_BulletOn, nIsBullet2, nDestinationInstance );
                 if ( !nIsBullet2 )
-                    aParagraphAttribs.Put( SfxBoolItem( EE_PARA_BULLETSTATE, false ) );
+                    aParagraphAttribs.Put( SfxBoolItem( EE_PARA_BULLETSTATE.Which(), false ) );
 
                 if ( !aSelection.nStartPos )    // in PPT empty paragraphs never gets a bullet
                 {
-                    aParagraphAttribs.Put( SfxBoolItem( EE_PARA_BULLETSTATE, false ) );
+                    aParagraphAttribs.Put( SfxBoolItem( EE_PARA_BULLETSTATE.Which(), false ) );
                 }
                 aSelection.nStartPos = 0;
                 rOutliner.QuickSetAttribs( aParagraphAttribs, aSelection );
@@ -4396,7 +4396,7 @@ PPTStyleSheet::PPTStyleSheet( const DffRecordHeader& rSlideHd, SvStream& rIn, Sd
                     aRule.SetLevel( 0, aNumberFormat );
             }
         }
-        mpNumBulletItem[ i ] = new SvxNumBulletItem( aRule, EE_PARA_NUMBULLET );
+        mpNumBulletItem[ i ] = new SvxNumBulletItem( aRule, EE_PARA_NUMBULLET.Which() );
     }
 }
 
@@ -6231,7 +6231,7 @@ void PPTParagraphObj::ApplyTo( SfxItemSet& rSet,  boost::optional< sal_Int16 >&
     GetAttrib(PPT_ParaAttr_BulletOfs, _nBulletOfs, nDestinationInstance);
     if ( !nIsBullet2 )
     {
-        SvxLRSpaceItem aLRSpaceItem( EE_PARA_LRSPACE );
+        SvxLRSpaceItem aLRSpaceItem( EE_PARA_LRSPACE.Which() );
         sal_uInt16 nAbsLSpace = (sal_uInt16)( ( _nTextOfs * 2540 ) / 576 );
         sal_uInt16 nFirstLineOffset = nAbsLSpace - (sal_uInt16)( ( _nBulletOfs * 2540 ) / 576 );
         aLRSpaceItem.SetLeft( nAbsLSpace );
@@ -6240,7 +6240,7 @@ void PPTParagraphObj::ApplyTo( SfxItemSet& rSet,  boost::optional< sal_Int16 >&
     }
     else
     {
-        SvxLRSpaceItem aLRSpaceItem( EE_PARA_LRSPACE );
+        SvxLRSpaceItem aLRSpaceItem( EE_PARA_LRSPACE.Which() );
         aLRSpaceItem.SetLeft( 0 );
         aLRSpaceItem.SetTextFirstLineOfstValue( 0 );
         rSet.Put( aLRSpaceItem );
@@ -6255,12 +6255,12 @@ void PPTParagraphObj::ApplyTo( SfxItemSet& rSet,  boost::optional< sal_Int16 >&
     }
 
     if ( GetAttrib( PPT_ParaAttr_AsianLB_1, nVal, nDestinationInstance ) )
-        rSet.Put(SvxForbiddenRuleItem(nVal != 0, EE_PARA_FORBIDDENRULES));
+        rSet.Put(SvxForbiddenRuleItem(nVal != 0, EE_PARA_FORBIDDENRULES.Which()));
     if ( GetAttrib( PPT_ParaAttr_AsianLB_3, nVal, nDestinationInstance ) )
-        rSet.Put(SvxHangingPunctuationItem(nVal != 0, EE_PARA_HANGINGPUNCTUATION));
+        rSet.Put(SvxHangingPunctuationItem(nVal != 0, EE_PARA_HANGINGPUNCTUATION.Which()));
 
     if ( GetAttrib( PPT_ParaAttr_BiDi, nVal, nDestinationInstance ) )
-        rSet.Put( SvxFrameDirectionItem( nVal == 1 ? SvxFrameDirection::Horizontal_RL_TB : SvxFrameDirection::Horizontal_LR_TB, EE_PARA_WRITINGDIR ) );
+        rSet.Put( SvxFrameDirectionItem( nVal == 1 ? SvxFrameDirection::Horizontal_RL_TB : SvxFrameDirection::Horizontal_LR_TB, EE_PARA_WRITINGDIR.Which() ) );
 
     // LineSpacing
     PPTPortionObj* pPortion = First();
@@ -7406,7 +7406,7 @@ void ApplyCellAttributes( const SdrObject* pObj, Reference< XCell > const & xCel
 
         //set textHorizontalAdjust and TextWritingMode attr
         const sal_Int32 eHA(static_cast<const SdrTextHorzAdjustItem&>(pObj->GetMergedItem(SDRATTR_TEXT_HORZADJUST)).GetValue());
-        const SvxFrameDirection eDirection = static_cast<const SvxFrameDirectionItem&>(pObj->GetMergedItem(EE_PARA_WRITINGDIR)).GetValue();
+        const SvxFrameDirection eDirection = pObj->GetMergedItem(EE_PARA_WRITINGDIR).GetValue();
         xPropSet->setPropertyValue(  "TextHorizontalAdjust" , Any( eHA ) );
         if ( eDirection == SvxFrameDirection::Vertical_RL_TB )
         {//vertical writing
diff --git a/forms/source/richtext/rtattributehandler.cxx b/forms/source/richtext/rtattributehandler.cxx
index 84d3464e571c..6ea84eab3ebd 100644
--- a/forms/source/richtext/rtattributehandler.cxx
+++ b/forms/source/richtext/rtattributehandler.cxx
@@ -369,7 +369,7 @@ namespace frm
     }
 
     ParagraphDirectionHandler::ParagraphDirectionHandler( AttributeId _nAttributeId )
-        :AttributeHandler( _nAttributeId, EE_PARA_WRITINGDIR )
+        :AttributeHandler( _nAttributeId, EE_PARA_WRITINGDIR.Which() )
         ,m_eParagraphDirection( SvxFrameDirection::Horizontal_LR_TB )
         ,m_eDefaultAdjustment( SvxAdjust::Right )
         ,m_eOppositeDefaultAdjustment( SvxAdjust::Left )
diff --git a/include/editeng/editeng.hxx b/include/editeng/editeng.hxx
index e7b33cfd5345..4f0be32b9dee 100644
--- a/include/editeng/editeng.hxx
+++ b/include/editeng/editeng.hxx
@@ -28,6 +28,7 @@
 #include <com/sun/star/i18n/CharacterIteratorMode.hpp>
 
 #include <svl/style.hxx>
+#include <svl/typedwhich.hxx>
 #include <editeng/editdata.hxx>
 #include <editeng/editstat.hxx>
 #include <editeng/editengdllapi.h>
@@ -319,6 +320,11 @@ public:
 
     bool            HasParaAttrib( sal_Int32 nPara, sal_uInt16 nWhich ) const;
     const SfxPoolItem&  GetParaAttrib( sal_Int32 nPara, sal_uInt16 nWhich );
+    template<class T>
+    const T&            GetParaAttrib( sal_Int32 nPara, TypedWhichId<T> nWhich )
+    {
+        return static_cast<const T&>(GetParaAttrib(nPara, nWhich.Which()));
+    }
 
     vcl::Font       GetStandardFont( sal_Int32 nPara );
     SvxFont         GetStandardSvxFont( sal_Int32 nPara );
diff --git a/include/editeng/eeitem.hxx b/include/editeng/eeitem.hxx
index 19393957e6bf..afc0eb8cd715 100644
--- a/include/editeng/eeitem.hxx
+++ b/include/editeng/eeitem.hxx
@@ -21,6 +21,15 @@
 #define INCLUDED_EDITENG_EEITEM_HXX
 
 #include <svl/solar.hrc>
+#include <svl/typedwhich.hxx>
+
+class SvxForbiddenRuleItem;
+class SvxFrameDirectionItem;
+class SvxHangingPunctuationItem;
+class SfxBoolItem;
+class SfxInt16Item;
+class SvxLRSpaceItem;
+class SvxScriptSpaceItem;
 
 /*
  * NOTE: Changes in this file will probably require
@@ -32,18 +41,18 @@
 
 // Paragraph attributes:
 #define EE_PARA_START               (EE_ITEMS_START+0)
-#define EE_PARA_WRITINGDIR          (EE_ITEMS_START+0)
+#define EE_PARA_WRITINGDIR          TypedWhichId<SvxFrameDirectionItem>(EE_ITEMS_START+0)
 #define EE_PARA_XMLATTRIBS          (EE_ITEMS_START+1)
-#define EE_PARA_HANGINGPUNCTUATION  (EE_ITEMS_START+2)
-#define EE_PARA_FORBIDDENRULES      (EE_ITEMS_START+3)
-#define EE_PARA_ASIANCJKSPACING     (EE_ITEMS_START+4)
-#define EE_PARA_NUMBULLET           (EE_ITEMS_START+5)
-#define EE_PARA_HYPHENATE           (EE_ITEMS_START+6)
-#define EE_PARA_BULLETSTATE         (EE_ITEMS_START+7)
-#define EE_PARA_OUTLLRSPACE         (EE_ITEMS_START+8)
-#define EE_PARA_OUTLLEVEL           (EE_ITEMS_START+9)
-#define EE_PARA_BULLET              (EE_ITEMS_START+10)
-#define EE_PARA_LRSPACE             (EE_ITEMS_START+11)
+#define EE_PARA_HANGINGPUNCTUATION  TypedWhichId<SvxHangingPunctuationItem>(EE_ITEMS_START+2)
+#define EE_PARA_FORBIDDENRULES      TypedWhichId<SvxForbiddenRuleItem>(EE_ITEMS_START+3)
+#define EE_PARA_ASIANCJKSPACING     TypedWhichId<SvxScriptSpaceItem>(EE_ITEMS_START+4)
+#define EE_PARA_NUMBULLET           TypedWhichId<SvxNumBulletItem>(EE_ITEMS_START+5)
+#define EE_PARA_HYPHENATE           TypedWhichId<SfxBoolItem>(EE_ITEMS_START+6)
+#define EE_PARA_BULLETSTATE         TypedWhichId<SfxBoolItem>(EE_ITEMS_START+7)
+#define EE_PARA_OUTLLRSPACE         TypedWhichId<SvxLRSpaceItem>(EE_ITEMS_START+8)
+#define EE_PARA_OUTLLEVEL           TypedWhichId<SfxInt16Item>(EE_ITEMS_START+9)
+#define EE_PARA_BULLET              TypedWhichId<SvxBulletItem>(EE_ITEMS_START+10)
+#define EE_PARA_LRSPACE             TypedWhichId<SvxLRSpaceItem>(EE_ITEMS_START+11)
 #define EE_PARA_ULSPACE             (EE_ITEMS_START+12)
 #define EE_PARA_SBL                 (EE_ITEMS_START+13)
 #define EE_PARA_JUST                (EE_ITEMS_START+14)
diff --git a/include/editeng/unotext.hxx b/include/editeng/unotext.hxx
index d2d29a8b0078..d55a5da31123 100644
--- a/include/editeng/unotext.hxx
+++ b/include/editeng/unotext.hxx
@@ -70,8 +70,8 @@ class SvxItemPropertySet;
 #define WID_PARAISNUMBERINGRESTART  OWN_ATTR_VALUE_START+4
 
 #define SVX_UNOEDIT_NUMBERING_PROPERTIE \
-    {OUString(UNO_NAME_NUMBERING_RULES),        EE_PARA_NUMBULLET,  cppu::UnoType<css::container::XIndexReplace>::get(), 0, 0 }, \
-    {OUString(UNO_NAME_NUMBERING),              EE_PARA_BULLETSTATE,cppu::UnoType<bool>::get(), 0, 0 }
+    {OUString(UNO_NAME_NUMBERING_RULES),        EE_PARA_NUMBULLET.Which(),  cppu::UnoType<css::container::XIndexReplace>::get(), 0, 0 }, \
+    {OUString(UNO_NAME_NUMBERING),              EE_PARA_BULLETSTATE.Which(),cppu::UnoType<bool>::get(), 0, 0 }
 
 #define SVX_UNOEDIT_OUTLINER_PROPERTIES \
     SVX_UNOEDIT_NUMBERING_PROPERTIE, \
@@ -138,18 +138,18 @@ class SvxItemPropertySet;
 #define SVX_UNOEDIT_PARA_PROPERTIES \
     {OUString(UNO_NAME_EDIT_PARA_ADJUST),       EE_PARA_JUST,               ::cppu::UnoType<sal_Int16>::get(),            0, MID_PARA_ADJUST }, \
     {OUString(UNO_NAME_EDIT_PARA_BMARGIN),      EE_PARA_ULSPACE,            ::cppu::UnoType<sal_Int32>::get(),            0, MID_LO_MARGIN|SFX_METRIC_ITEM }, \
-    {OUString(UNO_NAME_EDIT_PARA_IS_HYPHEN),    EE_PARA_HYPHENATE,          cppu::UnoType<bool>::get(),                0, 0 }, \
+    {OUString(UNO_NAME_EDIT_PARA_IS_HYPHEN),    EE_PARA_HYPHENATE.Which(),  ::cppu::UnoType<bool>::get(),                0, 0 }, \
     {OUString(UNO_NAME_EDIT_PARA_LASTLINEADJ),  EE_PARA_JUST,               ::cppu::UnoType<sal_Int16>::get(),            0, MID_LAST_LINE_ADJUST }, \
-    {OUString(UNO_NAME_EDIT_PARA_LMARGIN),      EE_PARA_LRSPACE,            ::cppu::UnoType<sal_Int32>::get(),            0, MID_TXT_LMARGIN|SFX_METRIC_ITEM }, \
+    {OUString(UNO_NAME_EDIT_PARA_LMARGIN),      EE_PARA_LRSPACE.Which(),    ::cppu::UnoType<sal_Int32>::get(),            0, MID_TXT_LMARGIN|SFX_METRIC_ITEM }, \
     {OUString(UNO_NAME_EDIT_PARA_LINESPACING),  EE_PARA_SBL,                cppu::UnoType<css::style::LineSpacing>::get(),     0, CONVERT_TWIPS}, \
-    {OUString(UNO_NAME_EDIT_PARA_RMARGIN),      EE_PARA_LRSPACE,            ::cppu::UnoType<sal_Int32>::get(),            0, MID_R_MARGIN|SFX_METRIC_ITEM }, \
+    {OUString(UNO_NAME_EDIT_PARA_RMARGIN),      EE_PARA_LRSPACE.Which(),    ::cppu::UnoType<sal_Int32>::get(),            0, MID_R_MARGIN|SFX_METRIC_ITEM }, \
     {OUString(UNO_NAME_EDIT_PARA_TAPSTOPS),     EE_PARA_TABS,               cppu::UnoType<css::uno::Sequence< css::style::TabStop >>::get(), 0, 0 }, \
     {OUString(UNO_NAME_EDIT_PARA_TMARGIN),      EE_PARA_ULSPACE,            ::cppu::UnoType<sal_Int32>::get(),            0, MID_UP_MARGIN|SFX_METRIC_ITEM },\
-    {OUString(UNO_NAME_EDIT_PARA_FIRST_LINE_INDENT),     EE_PARA_LRSPACE,       ::cppu::UnoType<sal_Int32>::get(),            0, MID_FIRST_LINE_INDENT|SFX_METRIC_ITEM}, \
-    {OUString(UNO_NAME_EDIT_PARA_IS_HANGING_PUNCTUATION),EE_PARA_HANGINGPUNCTUATION,    cppu::UnoType<bool>::get(),                0 ,0 }, \
-    {OUString(UNO_NAME_EDIT_PARA_IS_CHARACTER_DISTANCE), EE_PARA_ASIANCJKSPACING,   cppu::UnoType<bool>::get(),                0 ,0 }, \
-    {OUString(UNO_NAME_EDIT_PARA_IS_FORBIDDEN_RULES),    EE_PARA_FORBIDDENRULES,        cppu::UnoType<bool>::get(),                0 ,0 },\
-    {OUString("WritingMode"),                   EE_PARA_WRITINGDIR,         ::cppu::UnoType<sal_Int16>::get(),            0, 0 }
+    {OUString(UNO_NAME_EDIT_PARA_FIRST_LINE_INDENT),     EE_PARA_LRSPACE.Which(),   ::cppu::UnoType<sal_Int32>::get(),            0, MID_FIRST_LINE_INDENT|SFX_METRIC_ITEM}, \
+    {OUString(UNO_NAME_EDIT_PARA_IS_HANGING_PUNCTUATION),EE_PARA_HANGINGPUNCTUATION.Which(),  cppu::UnoType<bool>::get(),                0 ,0 }, \
+    {OUString(UNO_NAME_EDIT_PARA_IS_CHARACTER_DISTANCE), EE_PARA_ASIANCJKSPACING.Which(),   cppu::UnoType<bool>::get(),                0 ,0 }, \
+    {OUString(UNO_NAME_EDIT_PARA_IS_FORBIDDEN_RULES),    EE_PARA_FORBIDDENRULES.Which(),     cppu::UnoType<bool>::get(),                0 ,0 },\
+    {OUString("WritingMode"),                   EE_PARA_WRITINGDIR.Which(), ::cppu::UnoType<sal_Int16>::get(),            0, 0 }
 
 class SvxEditSource;
 class SvxTextForwarder;
diff --git a/include/svl/itempool.hxx b/include/svl/itempool.hxx
index 0cd5bfc13342..22ea12cf4e24 100644
--- a/include/svl/itempool.hxx
+++ b/include/svl/itempool.hxx
@@ -23,6 +23,7 @@
 #include <rtl/string.hxx>
 #include <svl/poolitem.hxx>
 #include <svl/svldllapi.h>
+#include <svl/typedwhich.hxx>
 #include <tools/solar.h>
 #include <memory>
 #include <vector>
@@ -101,7 +102,11 @@ public:
     SfxBroadcaster&                 BC();
 
     void                            SetPoolDefaultItem( const SfxPoolItem& );
+
     const SfxPoolItem*              GetPoolDefaultItem( sal_uInt16 nWhich ) const;
+    template<class T> const T*      GetPoolDefaultItem( TypedWhichId<T> nWhich ) const
+    { return static_cast<const T*>(GetPoolDefaultItem(nWhich.Which())); }
+
     void                            ResetPoolDefaultItem( sal_uInt16 nWhich );
 
     void                            SetDefaults(std::vector<SfxPoolItem*>* pDefaults);
@@ -147,11 +152,21 @@ public:
 
     virtual const SfxPoolItem&      Put( const SfxPoolItem&, sal_uInt16 nWhich = 0 );
     void                            Remove( const SfxPoolItem& );
+
     const SfxPoolItem&              GetDefaultItem( sal_uInt16 nWhich ) const;
+    template<class T> const T&      GetDefaultItem( TypedWhichId<T> nWhich ) const
+    { return static_cast<const T&>(GetDefaultItem(nWhich.Which())); }
 
     bool                            CheckItemInPool(const SfxPoolItem *) const;
+
     const SfxPoolItem *             GetItem2(sal_uInt16 nWhich, sal_uInt32 nSurrogate) const;
+    template<class T> const T*      GetItem2( TypedWhichId<T> nWhich, sal_uInt32 nSurrogate ) const
+    { return dynamic_cast<const T*>(GetItem2(nWhich.Which(), nSurrogate)); }
+
     const SfxPoolItem *             GetItem2Default(sal_uInt16 nWhich) const;
+    template<class T> const T*      GetItem2Default( TypedWhichId<T> nWhich ) const
+    { return static_cast<const T*>(GetItem2Default(nWhich.Which())); }
+
     sal_uInt32                      GetItemCount2(sal_uInt16 nWhich) const;
 
     sal_uInt16                      GetFirstWhich() const;
@@ -169,6 +184,8 @@ public:
                                     { return IsItemPoolable( rItem.Which() ); }
     void                            SetItemInfos( const SfxItemInfo *pInfos );
     sal_uInt16                      GetWhich( sal_uInt16 nSlot, bool bDeep = true ) const;
+    template<class T> sal_uInt16    GetWhich( TypedWhichId<T> nSlot, bool bDeep = true ) const
+    { return GetWhich(nSlot.Which(), bDeep); }
     sal_uInt16                      GetSlotId( sal_uInt16 nWhich ) const;
     sal_uInt16                      GetTrueWhich( sal_uInt16 nSlot, bool bDeep = true ) const;
     sal_uInt16                      GetTrueSlotId( sal_uInt16 nWhich ) const;
diff --git a/include/svl/itemset.hxx b/include/svl/itemset.hxx
index 89c6149f44a2..3254263c38ab 100644
--- a/include/svl/itemset.hxx
+++ b/include/svl/itemset.hxx
@@ -28,6 +28,7 @@
 
 #include <svl/svldllapi.h>
 #include <svl/poolitem.hxx>
+#include <svl/typedwhich.hxx>
 
 class SfxItemPool;
 class SfxPoolItem;
@@ -131,6 +132,11 @@ public:
     sal_uInt16                  TotalCount() const;
 
     const SfxPoolItem&          Get( sal_uInt16 nWhich, bool bSrchInParent = true ) const;
+    template<class T>
+    const T&                    Get( TypedWhichId<T> nWhich, bool bSrchInParent = true ) const
+    {
+        return static_cast<const T&>(Get(nWhich.Which(), bSrchInParent));
+    }
 
     /** This method eases accessing single Items in the SfxItemSet.
 
@@ -149,6 +155,15 @@ public:
         assert(!pItem || pCastedItem); // if it exists, must have the correct type
         return pCastedItem;
     }
+    template<class T> const T* GetItem( TypedWhichId<T> nWhich, bool bSearchInParent = true ) const
+    {
+        const SfxPoolItem* pItem = GetItem(nWhich.Which(), bSearchInParent);
+        const T* pCastedItem = dynamic_cast<const T*>(pItem);
+
+        assert(!pItem || pCastedItem); // if it exists, must have the correct type
+        return pCastedItem;
+    }
+
 
     /// Templatized static version of GetItem() to directly return the correct type if the SfxItemSet is available.
     template<class T> static const T* GetItem(const SfxItemSet* pItemSet, sal_uInt16 nWhich, bool bSearchInParent = true)
@@ -166,12 +181,23 @@ public:
     SfxItemState                GetItemState(   sal_uInt16 nWhich,
                                                 bool bSrchInParent = true,
                                                 const SfxPoolItem **ppItem = nullptr ) const;
+    template<class T>
+    SfxItemState                GetItemState(   TypedWhichId<T> nWhich,
+                                                bool bSrchInParent = true,
+                                                const SfxPoolItem **ppItem = nullptr ) const
+    { return GetItemState(nWhich.Which(), bSrchInParent, ppItem); }
 
     bool                        HasItem(sal_uInt16 nWhich, const SfxPoolItem** ppItem = nullptr) const;
 
     void                        DisableItem(sal_uInt16 nWhich);
+    template<class T> void      DisableItem( TypedWhichId<T> nWhich )
+    { DisableItem(nWhich.Which()); }
     void                        InvalidateItem( sal_uInt16 nWhich );
+    template<class T> void      InvalidateItem( TypedWhichId<T> nWhich )
+    { InvalidateItem(nWhich.Which()); }
     sal_uInt16                  ClearItem( sal_uInt16 nWhich = 0);
+    template<class T> sal_uInt16 ClearItem( TypedWhichId<T> nWhich )
+    { return ClearItem(nWhich.Which()); }
     void                        ClearInvalidItems();
     void                        InvalidateAllItems(); // HACK(via nWhich = 0) ???
 
diff --git a/include/svl/poolitem.hxx b/include/svl/poolitem.hxx
index 7f9540c166a2..2d5a6f567c0b 100644
--- a/include/svl/poolitem.hxx
+++ b/include/svl/poolitem.hxx
@@ -28,6 +28,7 @@
 #include <com/sun/star/uno/Any.hxx>
 #include <svl/hint.hxx>
 #include <svl/svldllapi.h>
+#include <svl/typedwhich.hxx>
 #include <tools/debug.hxx>
 #include <tools/mapunit.hxx>
 #include <tools/solar.h>
@@ -149,6 +150,10 @@ public:
                                  assert(m_nRefCount==0);
                                  m_nWhich = nId;
                              }
+    template<class T> void   SetWhich( TypedWhichId<T> nId )
+    {
+        SetWhich(nId.Which());
+    }
     sal_uInt16               Which() const { return m_nWhich; }
     virtual bool             operator==( const SfxPoolItem& ) const = 0;
     bool                     operator!=( const SfxPoolItem& rItem ) const
@@ -173,6 +178,10 @@ public:
     virtual SfxPoolItem*     Clone( SfxItemPool *pPool = nullptr ) const = 0;
     // clone and call SetWhich
     SfxPoolItem*             CloneSetWhich( sal_uInt16 nNewWhich ) const;
+    template<class T> T*     CloneSetWhich( TypedWhichId<T> nId ) const
+    {
+        return static_cast<T*>(CloneSetWhich(nId.Which()));
+    }
 
     sal_uInt32               GetRefCount() const { return m_nRefCount; }
     SfxItemKind       GetKind() const { return m_nKind; }
diff --git a/include/svl/typedwhich.hxx b/include/svl/typedwhich.hxx
new file mode 100644
index 000000000000..43318cc52303
--- /dev/null
+++ b/include/svl/typedwhich.hxx
@@ -0,0 +1,61 @@
+/* -*- 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_SVL_TYPEDWHICH_HXX
+#define INCLUDED_SVL_TYPEDWHICH_HXX
+
+#include <sal/config.h>
+#include <sal/types.h>
+
+/**
+ * A very thin wrapper around the sal_uInt16 WhichId whose purpose is mostly to carry type information,
+ * so that we Put() and Get() the right subclasses of SfxPoolItem for each WhichId.
+ */
+template <class T> class TypedWhichId final
+{
+public:
+    constexpr TypedWhichId(sal_uInt16 nWhich)
+        : mnWhich(nWhich)
+    {
+    }
+    constexpr sal_uInt16 Which() const { return mnWhich; }
+    //constexpr operator sal_uInt16() const { return mnWhich; }
+private:
+    sal_uInt16 const mnWhich;
+};
+
+template <class T> constexpr bool operator==(sal_uInt16 lhs, TypedWhichId<T> const& rhs)
+{
+    return lhs == rhs.Which();
+}
+template <class T> constexpr bool operator!=(sal_uInt16 lhs, TypedWhichId<T> const& rhs)
+{
+    return lhs != rhs.Which();
+}
+template <class T> constexpr bool operator==(TypedWhichId<T> const& lhs, sal_uInt16 rhs)
+{
+    return lhs.Which() == rhs;
+}
+template <class T> constexpr bool operator!=(TypedWhichId<T> const& lhs, sal_uInt16 rhs)
+{
+    return lhs.Which() != rhs;
+}
+
+#endif // INCLUDED_SVL_TYPEDWHICH_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/svx/svdobj.hxx b/include/svx/svdobj.hxx
index cd6953312565..af4f7ec72e21 100644
--- a/include/svx/svdobj.hxx
+++ b/include/svx/svdobj.hxx
@@ -27,6 +27,7 @@
 #include <vcl/vclptr.hxx>
 #include <svl/lstner.hxx>
 #include <svl/poolitem.hxx>
+#include <svl/typedwhich.hxx>
 #include <svx/svdtypes.hxx>
 #include <svx/xenum.hxx>
 #include <svx/svxdllapi.h>
@@ -581,6 +582,11 @@ public:
     void ClearMergedItem(const sal_uInt16 nWhich = 0);
     void SetMergedItemSet(const SfxItemSet& rSet, bool bClearAllItems = false);
     const SfxPoolItem& GetMergedItem(const sal_uInt16 nWhich) const;
+    template<class T>
+    const T&           GetMergedItem( TypedWhichId<T> nWhich ) const
+    {
+        return static_cast<const T&>(GetMergedItem(nWhich.Which()));
+    }
 
     // syntactical sugar for ItemSet accesses
     void SetMergedItemSetAndBroadcast(const SfxItemSet& rSet, bool bClearAllItems = false);
diff --git a/sc/source/core/data/column2.cxx b/sc/source/core/data/column2.cxx
index 562137f53d1e..0fa0f3d1358b 100644
--- a/sc/source/core/data/column2.cxx
+++ b/sc/source/core/data/column2.cxx
@@ -391,7 +391,7 @@ long ScColumn::GetNeededSize(
 //          no longer needed, are set with the text (is faster)
 //          pEngine->SetDefaults( pSet );
 
-        if ( static_cast<const SfxBoolItem&>(pSet->Get(EE_PARA_HYPHENATE)).GetValue() ) {
+        if ( pSet->Get(EE_PARA_HYPHENATE).GetValue() ) {
 
             css::uno::Reference<css::linguistic2::XHyphenator> xXHyphenator( LinguMgr::GetHyphenator() );
             pEngine->SetHyphenator( xXHyphenator );
diff --git a/sc/source/core/data/drwlayer.cxx b/sc/source/core/data/drwlayer.cxx
index 103093b1741f..b0e709b67dfa 100644
--- a/sc/source/core/data/drwlayer.cxx
+++ b/sc/source/core/data/drwlayer.cxx
@@ -265,7 +265,7 @@ ScDrawLayer::ScDrawLayer( ScDocument* pDocument, const OUString& rName ) :
     SetScaleUnit(MapUnit::Map100thMM);
     SfxItemPool& rPool = GetItemPool();
     rPool.SetDefaultMetric(MapUnit::Map100thMM);
-    SvxFrameDirectionItem aModeItem( SvxFrameDirection::Environment, EE_PARA_WRITINGDIR );
+    SvxFrameDirectionItem aModeItem( SvxFrameDirection::Environment, EE_PARA_WRITINGDIR.Which() );
     rPool.SetPoolDefaultItem( aModeItem );
 
     // #i33700#
@@ -278,7 +278,7 @@ ScDrawLayer::ScDrawLayer( ScDocument* pDocument, const OUString& rName ) :
     if (MsLangId::isKorean(eOfficeLanguage) || eOfficeLanguage == LANGUAGE_JAPANESE)
     {
         // secondary is edit engine pool
-        rPool.GetSecondaryPool()->SetPoolDefaultItem( SvxScriptSpaceItem( false, EE_PARA_ASIANCJKSPACING ) );
+        rPool.GetSecondaryPool()->SetPoolDefaultItem( SvxScriptSpaceItem( false, EE_PARA_ASIANCJKSPACING.Which() ) );
     }
 
     rPool.FreezeIdRanges();                         // the pool is also used directly
diff --git a/sc/source/core/data/patattr.cxx b/sc/source/core/data/patattr.cxx
index 8238ea0b18e2..b5fe55473f73 100644
--- a/sc/source/core/data/patattr.cxx
+++ b/sc/source/core/data/patattr.cxx
@@ -763,21 +763,21 @@ void ScPatternAttr::FillToEditItemSet( SfxItemSet& rEditSet, const SfxItemSet& r
     rEditSet.Put( SvxPostureItem    ( eCtlItalic,   EE_CHAR_ITALIC_CTL ) );
     rEditSet.Put( SvxContourItem    ( bOutline,     EE_CHAR_OUTLINE ) );
     rEditSet.Put( SvxShadowedItem   ( bShadow,      EE_CHAR_SHADOW ) );
-    rEditSet.Put( SvxForbiddenRuleItem(bForbidden, EE_PARA_FORBIDDENRULES) );
+    rEditSet.Put( SvxForbiddenRuleItem(bForbidden, EE_PARA_FORBIDDENRULES.Which()) );
     rEditSet.Put( SvxEmphasisMarkItem( eEmphasis,   EE_CHAR_EMPHASISMARK ) );
     rEditSet.Put( SvxCharReliefItem( eRelief,       EE_CHAR_RELIEF ) );
     rEditSet.Put( SvxLanguageItem   ( eLang,        EE_CHAR_LANGUAGE ) );
     rEditSet.Put( SvxLanguageItem   ( eCjkLang,     EE_CHAR_LANGUAGE_CJK ) );
     rEditSet.Put( SvxLanguageItem   ( eCtlLang,     EE_CHAR_LANGUAGE_CTL ) );
-    rEditSet.Put( SfxBoolItem       ( EE_PARA_HYPHENATE, bHyphenate ) );
-    rEditSet.Put( SvxFrameDirectionItem( eDirection, EE_PARA_WRITINGDIR ) );
+    rEditSet.Put( SfxBoolItem       ( EE_PARA_HYPHENATE.Which(), bHyphenate ) );
+    rEditSet.Put( SvxFrameDirectionItem( eDirection, EE_PARA_WRITINGDIR.Which() ) );
 
     // Script spacing is always off.
     // The cell attribute isn't used here as long as there is no UI to set it
     // (don't evaluate attributes that can't be changed).
     // If a locale-dependent default is needed, it has to go into the cell
     // style, like the fonts.
-    rEditSet.Put( SvxScriptSpaceItem( false, EE_PARA_ASIANCJKSPACING ) );
+    rEditSet.Put( SvxScriptSpaceItem( false, EE_PARA_ASIANCJKSPACING.Which() ) );
 }
 
 void ScPatternAttr::FillEditItemSet( SfxItemSet* pEditSet, const SfxItemSet* pCondSet ) const
diff --git a/sc/source/ui/app/inputwin.cxx b/sc/source/ui/app/inputwin.cxx
index bd5293e9b1c3..71524d74dc9d 100644
--- a/sc/source/ui/app/inputwin.cxx
+++ b/sc/source/ui/app/inputwin.cxx
@@ -1203,7 +1203,7 @@ void ScTextWnd::InitEditEngine()
         EditEngine::SetFontInfoInItemSet( *pSet, aTextFont );
         lcl_ExtendEditFontAttribs( *pSet );
         // turn off script spacing to match DrawText output
-        pSet->Put( SvxScriptSpaceItem( false, EE_PARA_ASIANCJKSPACING ) );
+        pSet->Put( SvxScriptSpaceItem( false, EE_PARA_ASIANCJKSPACING.Which() ) );
         if ( bIsRTL )
             lcl_ModifyRTLDefaults( *pSet );
         mpEditEngine->SetDefaults( pSet );
diff --git a/sc/source/ui/drawfunc/drawsh2.cxx b/sc/source/ui/drawfunc/drawsh2.cxx
index b07d67947910..099ed3d3aee1 100644
--- a/sc/source/ui/drawfunc/drawsh2.cxx
+++ b/sc/source/ui/drawfunc/drawsh2.cxx
@@ -266,7 +266,7 @@ void ScDrawShell::GetDrawFuncState( SfxItemSet& rSet )      // disable functions
         pView->GetAttributes( aAttrs );
         if( aAttrs.GetItemState( EE_PARA_HYPHENATE ) >= SfxItemState::DEFAULT )
         {
-            bool bValue = static_cast<const SfxBoolItem&>( aAttrs.Get( EE_PARA_HYPHENATE ) ).GetValue();
+            bool bValue = aAttrs.Get( EE_PARA_HYPHENATE ).GetValue();
             rSet.Put( SfxBoolItem( SID_ENABLE_HYPHENATION, bValue ) );
         }
     }
diff --git a/sc/source/ui/drawfunc/drawsh5.cxx b/sc/source/ui/drawfunc/drawsh5.cxx
index 95122e1c9e0d..a6e7e99db274 100644
--- a/sc/source/ui/drawfunc/drawsh5.cxx
+++ b/sc/source/ui/drawfunc/drawsh5.cxx
@@ -450,9 +450,9 @@ void ScDrawShell::ExecDrawFunc( SfxRequest& rReq )
                 const SfxBoolItem* pItem = rReq.GetArg<SfxBoolItem>(SID_ENABLE_HYPHENATION);
                 if( pItem )
                 {
-                    SfxItemSet aSet( GetPool(), svl::Items<EE_PARA_HYPHENATE, EE_PARA_HYPHENATE>{} );
+                    SfxItemSet aSet( GetPool(), svl::Items<EE_PARA_HYPHENATE.Which(), EE_PARA_HYPHENATE.Which()>{} );
                     bool bValue = pItem->GetValue();
-                    aSet.Put( SfxBoolItem( EE_PARA_HYPHENATE, bValue ) );
+                    aSet.Put( SfxBoolItem( EE_PARA_HYPHENATE.Which(), bValue ) );
                     pView->SetAttributes( aSet );
                 }
                 rReq.Done();
diff --git a/sc/source/ui/drawfunc/drtxtob.cxx b/sc/source/ui/drawfunc/drtxtob.cxx
index 3a8c3bdc14a0..f9a66daf5e88 100644
--- a/sc/source/ui/drawfunc/drtxtob.cxx
+++ b/sc/source/ui/drawfunc/drtxtob.cxx
@@ -439,7 +439,7 @@ void ScDrawTextObjectBar::GetState( SfxItemSet& rSet )
         pView->GetAttributes( aAttrs );
         if( aAttrs.GetItemState( EE_PARA_HYPHENATE ) >= SfxItemState::DEFAULT )
         {
-            bool bValue = static_cast<const SfxBoolItem&>( aAttrs.Get( EE_PARA_HYPHENATE ) ).GetValue();
+            bool bValue = aAttrs.Get( EE_PARA_HYPHENATE ).GetValue();
             rSet.Put( SfxBoolItem( SID_ENABLE_HYPHENATION, bValue ) );
         }
     }
@@ -924,8 +924,8 @@ void ScDrawTextObjectBar::ExecuteAttr( SfxRequest &rReq )
             sal_uInt16 nId = SID_ATTR_PARA_LRSPACE;
             const SvxLRSpaceItem& rItem = static_cast<const SvxLRSpaceItem&>(
                 pArgs->Get( nId ));
-            SfxItemSet aAttr( GetPool(), svl::Items<EE_PARA_LRSPACE, EE_PARA_LRSPACE>{} );
-            nId = EE_PARA_LRSPACE;
+            SfxItemSet aAttr( GetPool(), svl::Items<EE_PARA_LRSPACE.Which(), EE_PARA_LRSPACE.Which()>{} );
+            nId = EE_PARA_LRSPACE.Which();
             SvxLRSpaceItem aLRSpaceItem( rItem.GetLeft(),
                 rItem.GetRight(), rItem.GetTextLeft(),
                 rItem.GetTextFirstLineOfst(), nId );
@@ -1040,7 +1040,7 @@ void ScDrawTextObjectBar::GetAttrState( SfxItemSet& rDestSet )
     rDestSet.Put( SfxBoolItem( SID_ALIGN_ANY_RIGHT,     eAdj == SvxAdjust::Right ) );
     rDestSet.Put( SfxBoolItem( SID_ALIGN_ANY_JUSTIFIED, eAdj == SvxAdjust::Block ) );
 
-        SvxLRSpaceItem aLR = static_cast<const SvxLRSpaceItem&>(aAttrSet.Get( EE_PARA_LRSPACE ));
+        SvxLRSpaceItem aLR = aAttrSet.Get( EE_PARA_LRSPACE );
     aLR.SetWhich(SID_ATTR_PARA_LRSPACE);
     rDestSet.Put(aLR);
     Invalidate( SID_ATTR_PARA_LRSPACE );
@@ -1168,8 +1168,7 @@ void ScDrawTextObjectBar::GetAttrState( SfxItemSet& rDestSet )
     }
     else
     {
-        SvxFrameDirection eAttrDir = static_cast<const SvxFrameDirectionItem&>(
-                                        aAttrSet.Get( EE_PARA_WRITINGDIR )).GetValue();
+        SvxFrameDirection eAttrDir = aAttrSet.Get( EE_PARA_WRITINGDIR ).GetValue();
         if ( eAttrDir == SvxFrameDirection::Environment )
         {
             //  get "environment" direction from page style
diff --git a/sc/source/ui/drawfunc/drtxtob2.cxx b/sc/source/ui/drawfunc/drtxtob2.cxx
index 28050513064b..bc0e8f35bff0 100644
--- a/sc/source/ui/drawfunc/drtxtob2.cxx
+++ b/sc/source/ui/drawfunc/drtxtob2.cxx
@@ -107,9 +107,9 @@ void ScDrawTextObjectBar::ExecuteGlobal( SfxRequest &rReq )
                 const SfxBoolItem* pItem = rReq.GetArg<SfxBoolItem>(SID_ENABLE_HYPHENATION);
                 if( pItem )
                 {
-                    SfxItemSet aSet( GetPool(), svl::Items<EE_PARA_HYPHENATE, EE_PARA_HYPHENATE>{} );
+                    SfxItemSet aSet( GetPool(), svl::Items<EE_PARA_HYPHENATE.Which(), EE_PARA_HYPHENATE.Which()>{} );
                     bool bValue = pItem->GetValue();
-                    aSet.Put( SfxBoolItem( EE_PARA_HYPHENATE, bValue ) );
+                    aSet.Put( SfxBoolItem( EE_PARA_HYPHENATE.Which(), bValue ) );
                     pView->SetAttributes( aSet );
                 }
                 rReq.Done();
@@ -163,12 +163,12 @@ void ScDrawTextObjectBar::ExecuteExtra( SfxRequest &rReq )
         case SID_ATTR_PARA_RIGHT_TO_LEFT:
             {
                 SfxItemSet aAttr( pView->GetModel()->GetItemPool(),
-                                    svl::Items<EE_PARA_WRITINGDIR, EE_PARA_WRITINGDIR,
+                                    svl::Items<EE_PARA_WRITINGDIR.Which(), EE_PARA_WRITINGDIR.Which(),
                                     EE_PARA_JUST, EE_PARA_JUST>{} );
                 bool bLeft = ( nSlot == SID_ATTR_PARA_LEFT_TO_RIGHT );
                 aAttr.Put( SvxFrameDirectionItem(
                                 bLeft ? SvxFrameDirection::Horizontal_LR_TB : SvxFrameDirection::Horizontal_RL_TB,
-                                EE_PARA_WRITINGDIR ) );
+                                EE_PARA_WRITINGDIR.Which() ) );
                 aAttr.Put( SvxAdjustItem(
                                 bLeft ? SvxAdjust::Left : SvxAdjust::Right,
                                 EE_PARA_JUST ) );
diff --git a/sc/source/ui/drawfunc/futext.cxx b/sc/source/ui/drawfunc/futext.cxx
index bf3e1bbebd09..f95b6465e07d 100644
--- a/sc/source/ui/drawfunc/futext.cxx
+++ b/sc/source/ui/drawfunc/futext.cxx
@@ -95,7 +95,7 @@ static void lcl_InvalidateAttribs( SfxBindings& rBindings )
 static void lcl_UpdateHyphenator( Outliner& rOutliner, const SdrObject* pObj )
 {
     // use hyphenator only if hyphenation attribute is set
-    if ( pObj && static_cast<const SfxBoolItem&>(pObj->GetMergedItem(EE_PARA_HYPHENATE)).GetValue() ) {
+    if ( pObj && pObj->GetMergedItem(EE_PARA_HYPHENATE).GetValue() ) {
             css::uno::Reference<css::linguistic2::XHyphenator> xHyphenator( LinguMgr::GetHyphenator() );
             rOutliner.SetHyphenator( xHyphenator );
     }
diff --git a/sc/source/ui/view/output2.cxx b/sc/source/ui/view/output2.cxx
index 0a27abb7ccf2..c344f751c10e 100644
--- a/sc/source/ui/view/output2.cxx
+++ b/sc/source/ui/view/output2.cxx
@@ -2442,7 +2442,7 @@ void ScOutputData::DrawEditParam::setPatternToEngine(bool bUseStyleColor)
         nControl &= ~EEControlBits::ONECHARPERLINE;
     mpEngine->SetControlWord( nControl );
 
-    if ( !mbHyphenatorSet && static_cast<const SfxBoolItem&>(pSet->Get(EE_PARA_HYPHENATE)).GetValue() )
+    if ( !mbHyphenatorSet && pSet->Get(EE_PARA_HYPHENATE).GetValue() )
     {
         //  set hyphenator the first time it is needed
         css::uno::Reference<css::linguistic2::XHyphenator> xXHyphenator( LinguMgr::GetHyphenator() );
@@ -4798,7 +4798,7 @@ void ScOutputData::DrawRotated(bool bPixelToLogic)
                                     nControl &= ~EEControlBits::ONECHARPERLINE;
                                 pEngine->SetControlWord( nControl );
 
-                                if ( !bHyphenatorSet && static_cast<const SfxBoolItem&>(pSet->Get(EE_PARA_HYPHENATE)).GetValue() )
+                                if ( !bHyphenatorSet && pSet->Get(EE_PARA_HYPHENATE).GetValue() )
                                 {
                                     //  set hyphenator the first time it is needed
                                     css::uno::Reference<css::linguistic2::XHyphenator> xXHyphenator( LinguMgr::GetHyphenator() );
diff --git a/sc/source/ui/view/printfun.cxx b/sc/source/ui/view/printfun.cxx
index 12236ffdac7f..772a60df0df4 100644
--- a/sc/source/ui/view/printfun.cxx
+++ b/sc/source/ui/view/printfun.cxx
@@ -1703,7 +1703,7 @@ void ScPrintFunc::MakeEditEngine()
         //! there's no way to set the background for note pages
         pEditDefaults->ClearItem( EE_CHAR_COLOR );
         if (ScGlobal::IsSystemRTL())
-            pEditDefaults->Put( SvxFrameDirectionItem( SvxFrameDirection::Horizontal_RL_TB, EE_PARA_WRITINGDIR ) );
+            pEditDefaults->Put( SvxFrameDirectionItem( SvxFrameDirection::Horizontal_RL_TB, EE_PARA_WRITINGDIR.Which() ) );
     }
 
     pEditEngine->SetData( aFieldData );     // Set page count etc.
diff --git a/sd/qa/unit/export-tests-ooxml1.cxx b/sd/qa/unit/export-tests-ooxml1.cxx
index 1ffcdf3cc8ea..0ad825d57700 100644
--- a/sd/qa/unit/export-tests-ooxml1.cxx
+++ b/sd/qa/unit/export-tests-ooxml1.cxx
@@ -293,7 +293,7 @@ void SdOOXMLExportTest1::testN828390_5()
         SdrTextObj *pTxtObj = dynamic_cast<SdrTextObj *>( pObj );
         CPPUNIT_ASSERT( pTxtObj );
         const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject();
-        const SvxNumBulletItem *pNumFmt = dynamic_cast<const SvxNumBulletItem *>(aEdit.GetPool()->GetItem2(EE_PARA_NUMBULLET, 5));
+        const SvxNumBulletItem *pNumFmt = aEdit.GetPool()->GetItem2(EE_PARA_NUMBULLET, 5);
         CPPUNIT_ASSERT( pNumFmt );
         CPPUNIT_ASSERT_EQUAL_MESSAGE( "Bullet's relative size is wrong!", pNumFmt->GetNumRule()->GetLevel(1).GetBulletRelSize(), sal_uInt16(75) ); // != 25
     }
@@ -535,7 +535,7 @@ void SdOOXMLExportTest1::testBulletStartNumber()
     SdrTextObj *pTxtObj = dynamic_cast<SdrTextObj *>( pPage->GetObj(0) );
     CPPUNIT_ASSERT_MESSAGE( "no text object", pTxtObj != nullptr);
     const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject();
-    const SvxNumBulletItem *pNumFmt = dynamic_cast<const SvxNumBulletItem *>(aEdit.GetParaAttribs(0).GetItem(EE_PARA_NUMBULLET));
+    const SvxNumBulletItem *pNumFmt = aEdit.GetParaAttribs(0).GetItem(EE_PARA_NUMBULLET);
     CPPUNIT_ASSERT(pNumFmt);
     CPPUNIT_ASSERT_EQUAL_MESSAGE( "Bullet's start number is wrong!", sal_Int16(pNumFmt->GetNumRule()->GetLevel(0).GetStart()), sal_Int16(3) );
     xDocShRef->DoClose();
@@ -613,7 +613,7 @@ void SdOOXMLExportTest1::testBulletColor()
     CPPUNIT_ASSERT_MESSAGE( "no text object", pTxtObj != nullptr);
 
     const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject();
-    const SvxNumBulletItem *pNumFmt = dynamic_cast<const SvxNumBulletItem *>(aEdit.GetParaAttribs(0).GetItem(EE_PARA_NUMBULLET));
+    const SvxNumBulletItem *pNumFmt = aEdit.GetParaAttribs(0).GetItem(EE_PARA_NUMBULLET);
     CPPUNIT_ASSERT(pNumFmt);
     CPPUNIT_ASSERT_EQUAL_MESSAGE( "Bullet's color is wrong!", sal_uInt32(0xff0000),pNumFmt->GetNumRule()->GetLevel(0).GetBulletColor().GetColor());
 
@@ -659,7 +659,7 @@ void SdOOXMLExportTest1::testBulletMarginAndIndentation()
     CPPUNIT_ASSERT_MESSAGE( "no text object", pTxtObj != nullptr);
 
     const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject();
-    const SvxNumBulletItem *pNumFmt = dynamic_cast<const SvxNumBulletItem *>(aEdit.GetParaAttribs(0).GetItem(EE_PARA_NUMBULLET));
+    const SvxNumBulletItem *pNumFmt = aEdit.GetParaAttribs(0).GetItem(EE_PARA_NUMBULLET);
     CPPUNIT_ASSERT(pNumFmt);
 
     CPPUNIT_ASSERT_EQUAL_MESSAGE( "Bullet's left margin is wrong!", sal_uInt32(1000),sal_uInt32(pNumFmt->GetNumRule()->GetLevel(0).GetAbsLSpace()) ); // left margin is 0.79 cm
diff --git a/sd/qa/unit/import-tests.cxx b/sd/qa/unit/import-tests.cxx
index 875c110584a6..d80981457188 100644
--- a/sd/qa/unit/import-tests.cxx
+++ b/sd/qa/unit/import-tests.cxx
@@ -1218,7 +1218,7 @@ void SdImportTest::testBulletSuffix()
     SdrTextObj *pTxtObj = dynamic_cast<SdrTextObj *>( pPage->GetObj(0) );
     CPPUNIT_ASSERT_MESSAGE( "no text object", pTxtObj != nullptr);
     const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject();
-    const SvxNumBulletItem *pNumFmt = dynamic_cast<const SvxNumBulletItem *>(aEdit.GetParaAttribs(1).GetItem(EE_PARA_NUMBULLET));
+    const SvxNumBulletItem *pNumFmt = aEdit.GetParaAttribs(1).GetItem(EE_PARA_NUMBULLET);
     CPPUNIT_ASSERT(pNumFmt);
     CPPUNIT_ASSERT_EQUAL_MESSAGE( "Bullet's suffix is wrong!", pNumFmt->GetNumRule()->GetLevel(0).GetSuffix(), OUString() );
     xDocShRef->DoClose();
@@ -1755,7 +1755,7 @@ void SdImportTest::testTdf103477()
     CPPUNIT_ASSERT_MESSAGE( "no text object", pTxtObj != nullptr );
 
     const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject();
-    const SvxNumBulletItem *pNumFmt = dynamic_cast<const SvxNumBulletItem *>( aEdit.GetParaAttribs(0).GetItem(EE_PARA_NUMBULLET) );
+    const SvxNumBulletItem *pNumFmt = aEdit.GetParaAttribs(0).GetItem(EE_PARA_NUMBULLET);
     CPPUNIT_ASSERT(pNumFmt);
     CPPUNIT_ASSERT_EQUAL_MESSAGE( "Bullet's color is wrong!", sal_uInt32(0x000000), pNumFmt->GetNumRule()->GetLevel(1).GetBulletColor().GetColor());
 
@@ -2216,7 +2216,7 @@ void SdImportTest::testTdf108925()
     CPPUNIT_ASSERT_MESSAGE("No text object", pTxtObj != nullptr);
     const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject();
 
-    const SvxNumBulletItem *pNumFmt = dynamic_cast<const SvxNumBulletItem *>(aEdit.GetParaAttribs(0).GetItem(EE_PARA_NUMBULLET));
+    const SvxNumBulletItem *pNumFmt = aEdit.GetParaAttribs(0).GetItem(EE_PARA_NUMBULLET);
     CPPUNIT_ASSERT(pNumFmt);
     CPPUNIT_ASSERT_EQUAL(pNumFmt->GetNumRule()->GetLevel(0).GetBulletRelSize(), sal_uInt16(25));
 
diff --git a/sd/source/core/drawdoc.cxx b/sd/source/core/drawdoc.cxx
index ff30462fc3c9..c6ad5a56fba5 100644
--- a/sd/source/core/drawdoc.cxx
+++ b/sd/source/core/drawdoc.cxx
@@ -241,7 +241,7 @@ SdDrawDocument::SdDrawDocument(DocumentType eType, SfxObjectShell* pDrDocSh)
     // for korean and japanese languages we have a different default for apply spacing between asian, latin and ctl text
     if (MsLangId::isKorean(eRealCTLLanguage) || (LANGUAGE_JAPANESE == eRealCTLLanguage))
     {
-        GetPool().GetSecondaryPool()->SetPoolDefaultItem( SvxScriptSpaceItem( false, EE_PARA_ASIANCJKSPACING ) );
+        GetPool().GetSecondaryPool()->SetPoolDefaultItem( SvxScriptSpaceItem( false, EE_PARA_ASIANCJKSPACING.Which() ) );
     }
 
     // Set DefTab and SpellOptions for the SD module
diff --git a/sd/source/core/drawdoc4.cxx b/sd/source/core/drawdoc4.cxx
index 4fc6bba2d5d7..3c12d11e64c8 100644
--- a/sd/source/core/drawdoc4.cxx
+++ b/sd/source/core/drawdoc4.cxx
@@ -218,7 +218,7 @@ void SdDrawDocument::CreateLayoutTemplates()
     rISet.Put(SvxColorItem(Color(COL_AUTO), EE_CHAR_COLOR ));
 
     // Paragraph attributes (Edit Engine)
-    rISet.Put(SvxLRSpaceItem(EE_PARA_LRSPACE));
+    rISet.Put(SvxLRSpaceItem(EE_PARA_LRSPACE.Which()));
     rISet.Put(SvxULSpaceItem(EE_PARA_ULSPACE));
 
     rISet.Put( makeSdrTextLeftDistItem( 250 ) );    // sj: (i33745) using text frame distances seems to be a better default
@@ -233,7 +233,7 @@ void SdDrawDocument::CreateLayoutTemplates()
 
     // Bullet
     // BulletItem and BulletFont for title and outline
-    SvxBulletItem aBulletItem(EE_PARA_BULLET);
+    SvxBulletItem aBulletItem(EE_PARA_BULLET.Which());
                             // Identical in all layers
     aBulletItem.SetStyle(SvxBulletStyle::BULLET);
     aBulletItem.SetStart(1);
@@ -352,7 +352,7 @@ void SdDrawDocument::CreateLayoutTemplates()
     pISet->Put(XLineStyleItem(drawing::LineStyle_NONE));
     pISet->Put(XFillStyleItem(drawing::FillStyle_NONE));
 
-    SvxLRSpaceItem aLRSpaceItem( EE_PARA_LRSPACE );
+    SvxLRSpaceItem aLRSpaceItem( EE_PARA_LRSPACE.Which() );
     aLRSpaceItem.SetTextFirstLineOfst(600);      // Indentation of first line: 6mm; right: 0
     pISet->Put(aLRSpaceItem);
 
@@ -411,7 +411,7 @@ void SdDrawDocument::CreateLayoutTemplates()
 
     pISet->Put(SvxFontHeightItem(1270, 100, EE_CHAR_FONTHEIGHT ));      // 36 pt
 
-    SvxLRSpaceItem aLRSpItem( 200, 200, 0, 0, EE_PARA_LRSPACE);
+    SvxLRSpaceItem aLRSpItem( 200, 200, 0, 0, EE_PARA_LRSPACE.Which());
     pISet->Put( aLRSpItem );    // Indentation of first line: 0 mm; left and right: 2 mm
 
     pISet->Put(SvxULSpaceItem(100, 100, EE_PARA_ULSPACE ));      // Paragraph margin above/below: 1 mm
@@ -578,7 +578,7 @@ void SdDrawDocument::CreateDefaultCellStyles()
     rISet.Put(SvxColorItem(Color(COL_AUTO), EE_CHAR_COLOR ));
 
     // Paragraph attributes (Edit Engine)
-    rISet.Put(SvxLRSpaceItem(EE_PARA_LRSPACE));
+    rISet.Put(SvxLRSpaceItem(EE_PARA_LRSPACE.Which()));
     rISet.Put(SvxULSpaceItem(EE_PARA_ULSPACE));
 
     rISet.Put( makeSdrTextLeftDistItem( 250 ) );
@@ -1188,7 +1188,7 @@ void SdDrawDocument::RenameLayoutTemplate(const OUString& rOldLayoutName, const
 void SdDrawDocument::SetTextDefaults() const
 {
     // BulletItem and BulletFont for Title and Outline
-    SvxBulletItem aBulletItem(EE_PARA_BULLET);
+    SvxBulletItem aBulletItem(EE_PARA_BULLET.Which());
     vcl::Font aBulletFont( SdStyleSheetPool::GetBulletFont() );
     aBulletFont.SetFontSize(Size(0,846));       // 24 pt
     aBulletItem.SetFont(aBulletFont);
@@ -1221,7 +1221,7 @@ void SdDrawDocument::SetTextDefaults() const
         aNumRule.SetLevel( i, aNumberFormat );
     }
 
-    SvxNumBulletItem aNumBulletItem( aNumRule, EE_PARA_NUMBULLET );
+    SvxNumBulletItem aNumBulletItem( aNumRule, EE_PARA_NUMBULLET.Which() );
     pItemPool->SetPoolDefaultItem( aNumBulletItem );
 }
 
@@ -1262,7 +1262,7 @@ void SdDrawDocument::SetDefaultWritingMode(css::text::WritingMode eMode )
             return;
         }
 
-        SvxFrameDirectionItem aModeItem( nVal, EE_PARA_WRITINGDIR );
+        SvxFrameDirectionItem aModeItem( nVal, EE_PARA_WRITINGDIR.Which() );
         pItemPool->SetPoolDefaultItem( aModeItem );
 
         SvxAdjustItem aAdjust( SvxAdjust::Left, EE_PARA_JUST );
diff --git a/sd/source/core/sdpage.cxx b/sd/source/core/sdpage.cxx
index 6d7358947ca6..7870627411c5 100644
--- a/sd/source/core/sdpage.cxx
+++ b/sd/source/core/sdpage.cxx
@@ -2022,8 +2022,8 @@ void SdPage::ScaleObjects(const Size& rNewPageSize, const ::tools::Rectangle& rN
                                     // of the BulletItems
                                     if (aTempSet.GetItemState(EE_PARA_BULLET) == SfxItemState::DEFAULT)
                                     {
-                                        SvxBulletItem aOldBulItem(static_cast<const SvxBulletItem&>( pOutlineSheet->GetItemSet().Get(EE_PARA_BULLET) ));
-                                        const SvxBulletItem& rNewBulItem = static_cast<const SvxBulletItem&>( aTempSet.Get(EE_PARA_BULLET) );
+                                        SvxBulletItem aOldBulItem( pOutlineSheet->GetItemSet().Get(EE_PARA_BULLET) );
+                                        const SvxBulletItem& rNewBulItem = aTempSet.Get(EE_PARA_BULLET);
                                         aOldBulItem.CopyValidProperties(rNewBulItem);
                                         aTempSet.Put(aOldBulItem);
                                     }
@@ -2149,7 +2149,7 @@ SdrObject* convertPresentationObjectImpl(SdPage& rPage, SdrObject* pSourceObj, P
             }
 
             // Remove LRSpace item
-            SfxItemSet aSet(pModel->GetPool(), svl::Items<EE_PARA_LRSPACE, EE_PARA_LRSPACE>{} );
+            SfxItemSet aSet(pModel->GetPool(), svl::Items<EE_PARA_LRSPACE.Which(), EE_PARA_LRSPACE.Which()>{} );
 
             aSet.Put(pNewObj->GetMergedItemSet());
 
@@ -2187,11 +2187,11 @@ SdrObject* convertPresentationObjectImpl(SdPage& rPage, SdrObject* pSourceObj, P
             pNewObj->SetEmptyPresObj(false);
 
             // reset left indent
-            SfxItemSet aSet(pModel->GetPool(), svl::Items<EE_PARA_LRSPACE, EE_PARA_LRSPACE>{} );
+            SfxItemSet aSet(pModel->GetPool(), svl::Items<EE_PARA_LRSPACE.Which(), EE_PARA_LRSPACE.Which()>{} );
 
             aSet.Put(pNewObj->GetMergedItemSet());
 
-            const SvxLRSpaceItem& rLRItem = static_cast<const SvxLRSpaceItem&>( aSet.Get(EE_PARA_LRSPACE) );
+            const SvxLRSpaceItem& rLRItem = aSet.Get(EE_PARA_LRSPACE);
             SvxLRSpaceItem aNewLRItem(rLRItem);
             aNewLRItem.SetTextLeft(0);
             aSet.Put(aNewLRItem);
diff --git a/sd/source/core/stlpool.cxx b/sd/source/core/stlpool.cxx
index 9e40da77990e..df43cb8c0535 100644
--- a/sd/source/core/stlpool.cxx
+++ b/sd/source/core/stlpool.cxx
@@ -210,7 +210,7 @@ void SdStyleSheetPool::CreateLayoutStyleSheets(const OUString& rLayoutName, bool
     OUString aName(STR_LAYOUT_OUTLINE);
     OUString aHelpFile;
 
-    SvxLRSpaceItem aSvxLRSpaceItem( EE_PARA_LRSPACE );
+    SvxLRSpaceItem aSvxLRSpaceItem( EE_PARA_LRSPACE.Which() );
     SvxULSpaceItem aSvxULSpaceItem( EE_PARA_ULSPACE );
 
     for( sal_Int32 nLevel = 1; nLevel < 10; nLevel++)
@@ -459,7 +459,7 @@ void SdStyleSheetPool::CreateLayoutStyleSheets(const OUString& rLayoutName, bool
         rNotesSet.Put( SvxCharReliefItem(FontRelief::NONE, EE_CHAR_RELIEF) );
         rNotesSet.Put( SvxColorItem( Color(COL_AUTO), EE_CHAR_COLOR ) );
         rNotesSet.Put( SvxBackgroundColorItem( Color(COL_AUTO), EE_CHAR_BKGCOLOR ) );
-        rNotesSet.Put( SvxLRSpaceItem( 0, 0, 600, -600, EE_PARA_LRSPACE  ) );
+        rNotesSet.Put( SvxLRSpaceItem( 0, 0, 600, -600, EE_PARA_LRSPACE.Which()  ) );
         // #i16874# enable kerning by default but only for new documents
         rNotesSet.Put( SvxAutoKernItem( true, EE_CHAR_PAIRKERNING ) );
 
@@ -1106,7 +1106,7 @@ void SdStyleSheetPool::PutNumBulletItem( SfxStyleSheetBase* pSheet,
                 aNumRule.SetLevel( i, aNumberFormat );
             }
 
-            rSet.Put( SvxNumBulletItem( aNumRule, EE_PARA_NUMBULLET ) );
+            rSet.Put( SvxNumBulletItem( aNumRule, EE_PARA_NUMBULLET.Which() ) );
             static_cast<SfxStyleSheet*>(pSheet)->Broadcast(SfxHint( SfxHintId::DataChanged ) );
         }
         break;
@@ -1117,8 +1117,7 @@ void SdStyleSheetPool::PutNumBulletItem( SfxStyleSheetBase* pSheet,
         {
             // Subtitle template
             SvxNumBulletItem const*const pItem(
-                static_cast<const SvxNumBulletItem*>(
-                    rSet.GetPool()->GetSecondaryPool()->GetPoolDefaultItem(EE_PARA_NUMBULLET)));
+                    rSet.GetPool()->GetSecondaryPool()->GetPoolDefaultItem(EE_PARA_NUMBULLET));
             SvxNumRule *const pDefaultRule = (pItem) ? pItem->GetNumRule() : nullptr;
             DBG_ASSERT( pDefaultRule, "Where is my default template? [CL]" );
 
@@ -1139,7 +1138,7 @@ void SdStyleSheetPool::PutNumBulletItem( SfxStyleSheetBase* pSheet,
                     aNumRule.SetLevel(i, aFrmt);
                 }
 
-                rSet.Put( SvxNumBulletItem( aNumRule, EE_PARA_NUMBULLET ) );
+                rSet.Put( SvxNumBulletItem( aNumRule, EE_PARA_NUMBULLET.Which() ) );
                 static_cast<SfxStyleSheet*>(pSheet)->Broadcast(SfxHint( SfxHintId::DataChanged ) );
             }
         }
@@ -1164,7 +1163,7 @@ void SdStyleSheetPool::PutNumBulletItem( SfxStyleSheetBase* pSheet,
                 aNumRule.SetLevel( i, aNumberFormat );
             }
 
-            rSet.Put( SvxNumBulletItem( aNumRule, EE_PARA_NUMBULLET ) );
+            rSet.Put( SvxNumBulletItem( aNumRule, EE_PARA_NUMBULLET.Which() ) );
             static_cast<SfxStyleSheet*>(pSheet)->Broadcast(SfxHint( SfxHintId::DataChanged ) );
         }
         break;
diff --git a/sd/source/core/stlsheet.cxx b/sd/source/core/stlsheet.cxx
index da1e75fa0d4e..edd71b9be94e 100644
--- a/sd/source/core/stlsheet.cxx
+++ b/sd/source/core/stlsheet.cxx
@@ -534,7 +534,7 @@ void SdStyleSheet::AdjustToFontHeight(SfxItemSet& rSet, bool bOnlyMissingItems)
 
         if (rSet.GetItemState(EE_PARA_BULLET) != SfxItemState::SET || !bOnlyMissingItems)
         {
-            const SvxBulletItem& rBItem = static_cast<const SvxBulletItem&>(pCurSet->Get(EE_PARA_BULLET));
+            const SvxBulletItem& rBItem = pCurSet->Get(EE_PARA_BULLET);
             double fBulletFraction = double(rBItem.GetWidth()) / nOldHeight;
             SvxBulletItem aNewBItem(rBItem);
             aNewBItem.SetWidth((sal_uInt32)(fBulletFraction * nNewHeight));
@@ -543,7 +543,7 @@ void SdStyleSheet::AdjustToFontHeight(SfxItemSet& rSet, bool bOnlyMissingItems)
 
         if (rSet.GetItemState(EE_PARA_LRSPACE) != SfxItemState::SET || !bOnlyMissingItems)
         {
-            const SvxLRSpaceItem& rLRItem = static_cast<const SvxLRSpaceItem&>(pCurSet->Get(EE_PARA_LRSPACE));
+            const SvxLRSpaceItem& rLRItem = pCurSet->Get(EE_PARA_LRSPACE);
             double fIndentFraction = double(rLRItem.GetTextLeft()) / nOldHeight;
             SvxLRSpaceItem aNewLRItem(rLRItem);
             aNewLRItem.SetTextLeft(fIndentFraction * nNewHeight);
diff --git a/sd/source/ui/dlg/dlgolbul.cxx b/sd/source/ui/dlg/dlgolbul.cxx
index 6764fa73595c..0f1fe5824910 100644
--- a/sd/source/ui/dlg/dlgolbul.cxx
+++ b/sd/source/ui/dlg/dlgolbul.cxx
@@ -103,7 +103,7 @@ OutlineBulletDlg::OutlineBulletDlg(
         }
 
         if( pItem == nullptr )
-            pItem = static_cast<const SvxNumBulletItem*>( aInputSet.GetPool()->GetSecondaryPool()->GetPoolDefaultItem(EE_PARA_NUMBULLET) );
+            pItem = aInputSet.GetPool()->GetSecondaryPool()->GetPoolDefaultItem(EE_PARA_NUMBULLET);
 
         DBG_ASSERT( pItem, "No EE_PARA_NUMBULLET in Pool! [CL]" );
 
@@ -120,7 +120,7 @@ OutlineBulletDlg::OutlineBulletDlg(
             SvxNumRule aNewRule( *pRule );
             aNewRule.SetFeatureFlag( SvxNumRuleFlags::NO_NUMBERS );
 
-            SvxNumBulletItem aNewItem( aNewRule, EE_PARA_NUMBULLET );
+            SvxNumBulletItem aNewItem( aNewRule, EE_PARA_NUMBULLET.Which() );
             aInputSet.Put(aNewItem);
         }
     }
diff --git a/sd/source/ui/func/fuolbull.cxx b/sd/source/ui/func/fuolbull.cxx
index f8be75ef3643..4565e0b5e81f 100644
--- a/sd/source/ui/func/fuolbull.cxx
+++ b/sd/source/ui/func/fuolbull.cxx
@@ -335,7 +335,7 @@ const SfxPoolItem* FuOutlineBullet::GetNumBulletItem(SfxItemSet& aNewAttr, sal_u
             }
 
             if( pItem == nullptr )
-                pItem = static_cast<const SvxNumBulletItem*>( aNewAttr.GetPool()->GetSecondaryPool()->GetPoolDefaultItem(EE_PARA_NUMBULLET) );
+                pItem = aNewAttr.GetPool()->GetSecondaryPool()->GetPoolDefaultItem(EE_PARA_NUMBULLET);
 
             //DBG_ASSERT( pItem, "No EE_PARA_NUMBULLET in the Pool!" );
 
@@ -344,14 +344,14 @@ const SfxPoolItem* FuOutlineBullet::GetNumBulletItem(SfxItemSet& aNewAttr, sal_u
 
             if(bTitle && aNewAttr.GetItemState(EE_PARA_NUMBULLET) == SfxItemState::SET )
             {
-                const SvxNumBulletItem* pBulletItem = static_cast<const SvxNumBulletItem*>( aNewAttr.GetItem(EE_PARA_NUMBULLET) );
+                const SvxNumBulletItem* pBulletItem = aNewAttr.GetItem(EE_PARA_NUMBULLET);
                 SvxNumRule* pLclRule = pBulletItem->GetNumRule();
                 if(pLclRule)
                 {
                     SvxNumRule aNewRule( *pLclRule );
                     aNewRule.SetFeatureFlag( SvxNumRuleFlags::NO_NUMBERS );
 
-                    SvxNumBulletItem aNewItem( aNewRule, EE_PARA_NUMBULLET );
+                    SvxNumBulletItem aNewItem( aNewRule, EE_PARA_NUMBULLET.Which() );
                     aNewAttr.Put(aNewItem);
                 }
             }
diff --git a/sd/source/ui/func/fupage.cxx b/sd/source/ui/func/fupage.cxx
index fa14378f2da0..059ff5e61102 100644
--- a/sd/source/ui/func/fupage.cxx
+++ b/sd/source/ui/func/fupage.cxx
@@ -218,7 +218,7 @@ const SfxItemSet* FuPage::ExecuteDialog( vcl::Window* pParent )
                         {SID_ATTR_BORDER_SHADOW, SID_ATTR_BORDER_SHADOW},
                         {XATTR_FILL_FIRST, XATTR_FILL_LAST},
                         {SID_ATTR_PAGE_COLOR,SID_ATTR_PAGE_FILLSTYLE},
-                        {EE_PARA_WRITINGDIR, EE_PARA_WRITINGDIR}});
+                        {EE_PARA_WRITINGDIR.Which(), EE_PARA_WRITINGDIR.Which()}});
 
     // Retrieve additional data for dialog
 
@@ -229,7 +229,7 @@ const SfxItemSet* FuPage::ExecuteDialog( vcl::Window* pParent )
 
     aNewAttr.Put( SvxFrameDirectionItem(
         mpDoc->GetDefaultWritingMode() == css::text::WritingMode_RL_TB ? SvxFrameDirection::Horizontal_RL_TB : SvxFrameDirection::Horizontal_LR_TB,
-        EE_PARA_WRITINGDIR ) );
+        EE_PARA_WRITINGDIR.Which() ) );
 
     // Retrieve page-data for dialog
 
diff --git a/sd/source/ui/func/fuparagr.cxx b/sd/source/ui/func/fuparagr.cxx
index 9600f35f89c7..36af7fa013b7 100644
--- a/sd/source/ui/func/fuparagr.cxx
+++ b/sd/source/ui/func/fuparagr.cxx
@@ -77,7 +77,7 @@ void FuParagraph::DoExecute( SfxRequest& rReq )
         aNewAttr.Put( aEditAttr );
 
         // left border is offset
-        const long nOff = static_cast<const SvxLRSpaceItem&>(aNewAttr.Get( EE_PARA_LRSPACE ) ).GetTextLeft();
+        const long nOff = aNewAttr.Get( EE_PARA_LRSPACE ).GetTextLeft();
         // conversion since TabulatorTabPage always uses Twips!
         SfxInt32Item aOff( SID_ATTR_TABSTOP_OFFSET, nOff );
         aNewAttr.Put( aOff );
diff --git a/sd/source/ui/func/futempl.cxx b/sd/source/ui/func/futempl.cxx
index ff7eaa096ea8..191cd65c362f 100644
--- a/sd/source/ui/func/futempl.cxx
+++ b/sd/source/ui/func/futempl.cxx
@@ -420,7 +420,7 @@ void FuTemplate::DoExecute( SfxRequest& rReq )
 
                                     if(pFirstStyleSheet)
                                     {
-                                        pFirstStyleSheet->GetItemSet().Put( SvxNumBulletItem( aRule, EE_PARA_NUMBULLET ));
+                                        pFirstStyleSheet->GetItemSet().Put( SvxNumBulletItem( aRule, EE_PARA_NUMBULLET.Which() ));
                                         SdStyleSheet* pRealSheet = static_cast<SdStyleSheet*>(pFirstStyleSheet)->GetRealStyleSheet();
                                         pRealSheet->Broadcast(SfxHint(SfxHintId::DataChanged));
                                     }
diff --git a/sd/source/ui/func/futext.cxx b/sd/source/ui/func/futext.cxx
index 2b4ca65526cb..3e3143f20dd6 100644
--- a/sd/source/ui/func/futext.cxx
+++ b/sd/source/ui/func/futext.cxx
@@ -843,8 +843,7 @@ bool FuText::MouseButtonUp(const MouseEvent& rMEvt)
                     // one of the default set items from ImpSetAttributesForNewTextObject
                     // needs to be adapted to non-block mode.
                     const SfxItemSet& rSet = mpView->GetDefaultAttr();
-                    SvxFrameDirection eDirection = static_cast<const SvxFrameDirectionItem&>(
-                            rSet.Get(EE_PARA_WRITINGDIR)).GetValue();
+                    SvxFrameDirection eDirection = rSet.Get(EE_PARA_WRITINGDIR).GetValue();
 
                     if(SvxFrameDirection::Horizontal_RL_TB == eDirection || SvxFrameDirection::Vertical_RL_TB == eDirection)
                     {
@@ -864,8 +863,7 @@ bool FuText::MouseButtonUp(const MouseEvent& rMEvt)
                     // Look in the object defaults if left-to-right is wanted. If
                     // yes, set text anchoring to right to let the box grow to left.
                     const SfxItemSet& rSet = mpView->GetDefaultAttr();
-                    SvxFrameDirection eDirection =
-                            static_cast<const SvxFrameDirectionItem&>(rSet.Get(EE_PARA_WRITINGDIR)).GetValue();
+                    SvxFrameDirection eDirection = rSet.Get(EE_PARA_WRITINGDIR).GetValue();
 
                     if(SvxFrameDirection::Horizontal_RL_TB == eDirection)
                     {
diff --git a/sd/source/ui/view/drtxtob.cxx b/sd/source/ui/view/drtxtob.cxx
index f28c5f10b82a..cfbe431edc98 100644
--- a/sd/source/ui/view/drtxtob.cxx
+++ b/sd/source/ui/view/drtxtob.cxx
@@ -477,7 +477,7 @@ void TextObjectBar::GetAttrState( SfxItemSet& rSet )
         }
 
         // paragraph justification
-        SvxLRSpaceItem aLR = static_cast<const SvxLRSpaceItem&>( aAttrSet.Get( EE_PARA_LRSPACE ) );
+        SvxLRSpaceItem aLR = aAttrSet.Get( EE_PARA_LRSPACE );
         rSet.Put(aLR);
         SvxAdjust eAdj = static_cast<const SvxAdjustItem&>( aAttrSet.Get( EE_PARA_JUST ) ).GetAdjust();
         switch( eAdj )
@@ -513,7 +513,7 @@ void TextObjectBar::GetAttrState( SfxItemSet& rSet )
         }
         else
         {
-            switch( static_cast<const SvxFrameDirectionItem&>( aAttrSet.Get( EE_PARA_WRITINGDIR ) ).GetValue() )
+            switch( aAttrSet.Get( EE_PARA_WRITINGDIR ).GetValue() )
             {
                 case SvxFrameDirection::Vertical_LR_TB:
                 case SvxFrameDirection::Vertical_RL_TB:

... etc. - the rest is truncated


More information about the Libreoffice-commits mailing list