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

Bjoern Michaelsen (via logerrit) logerrit at kemper.freedesktop.org
Tue Aug 10 06:30:30 UTC 2021


 sw/inc/swtblfmt.hxx              |    7 
 sw/source/core/table/swtable.cxx |  312 ++++++++++++++++++---------------------
 2 files changed, 155 insertions(+), 164 deletions(-)

New commits:
commit fa5202f746b25ea444d120d746a0dc35b8f8cca5
Author:     Bjoern Michaelsen <bjoern.michaelsen at libreoffice.org>
AuthorDate: Sat Aug 7 11:38:03 2021 +0200
Commit:     Bjoern Michaelsen <bjoern.michaelsen at libreoffice.org>
CommitDate: Tue Aug 10 08:29:55 2021 +0200

    give SwTableBoxFormat::TableBoxAttributeChanged its own function
    
    - ... because at somewhere around growing past 100 LOC it deserved that.
    - also make the box a reference there as it should never be a nullptr
    
    Change-Id: Ia14cfb7a88e14fdd02f6011a745c2b008d94bc10
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/120159
    Tested-by: Jenkins
    Reviewed-by: Bjoern Michaelsen <bjoern.michaelsen at libreoffice.org>

diff --git a/sw/inc/swtblfmt.hxx b/sw/inc/swtblfmt.hxx
index 14b200164b5d..e61049919df1 100644
--- a/sw/inc/swtblfmt.hxx
+++ b/sw/inc/swtblfmt.hxx
@@ -46,16 +46,17 @@ public:
     virtual bool supportsFullDrawingLayerFillAttributeSet() const override;
 };
 
-class SAL_DLLPUBLIC_RTTI SwTableBoxFormat final : public SwFrameFormat
+class SAL_DLLPUBLIC_RTTI SwTableBoxFormat final: public SwFrameFormat
 {
     friend class SwDoc;
 
-    SwTableBoxFormat( SwAttrPool& rPool, SwFrameFormat *pDrvdFrame )
-        : SwFrameFormat( rPool, OUString(), pDrvdFrame, RES_FRMFMT, aTableBoxSetRange )
+    SwTableBoxFormat(SwAttrPool& rPool, SwFrameFormat* pDrvdFrame)
+        : SwFrameFormat(rPool, OUString(), pDrvdFrame, RES_FRMFMT, aTableBoxSetRange)
     {}
 
     // For recognition of changes (especially TableBoxAttribute).
     virtual void SwClientNotify(const SwModify&, const SfxHint&) override;
+    void BoxAttributeChanged(SwTableBox& rBox, const SwTableBoxNumFormat* pNewFormat, const SwTableBoxFormula* pNewFormula, const SwTableBoxValue* pNewValue, const sal_uLong nOldFormat);
 
 public:
     virtual bool supportsFullDrawingLayerFillAttributeSet() const override;
diff --git a/sw/source/core/table/swtable.cxx b/sw/source/core/table/swtable.cxx
index c750aa3d75f9..c17d6882b019 100644
--- a/sw/source/core/table/swtable.cxx
+++ b/sw/source/core/table/swtable.cxx
@@ -2116,11 +2116,153 @@ static void ChgNumToText( SwTableBox& rBox, sal_uLong nFormat )
     }
 
 }
+void SwTableBoxFormat::BoxAttributeChanged(SwTableBox& rBox, const SwTableBoxNumFormat* pNewFormat, const SwTableBoxFormula* pNewFormula, const SwTableBoxValue* pNewValue, sal_uLong nOldFormat)
+{
+    sal_uLong nNewFormat;
+    if(pNewFormat)
+    {
+        nNewFormat = pNewFormat->GetValue();
+        // new formatting
+        // is it newer or has the current been removed?
+        if( SfxItemState::SET != GetItemState(RES_BOXATR_VALUE, false))
+            pNewFormat = nullptr;
+    }
+    else
+    {
+        // fetch the current Item
+        (void)GetItemState(RES_BOXATR_FORMAT, false, reinterpret_cast<const SfxPoolItem**>(&pNewFormat));
+        nOldFormat = GetTableBoxNumFormat().GetValue();
+        nNewFormat = pNewFormat ? pNewFormat->GetValue() : nOldFormat;
+    }
+
+    // is it newer or has the current been removed?
+    if(pNewValue)
+    {
+        if(GetDoc()->GetNumberFormatter()->IsTextFormat(nNewFormat))
+            nOldFormat = 0;
+        else
+        {
+            if(SfxItemState::SET == GetItemState(RES_BOXATR_VALUE, false))
+                nOldFormat = getSwDefaultTextFormat();
+            else
+                nNewFormat = getSwDefaultTextFormat();
+        }
+    }
+
+    // Logic:
+    // Value change: -> "simulate" a format change!
+    // Format change:
+    // Text -> !Text or format change:
+    //          - align right for horizontal alignment, if LEFT or JUSTIFIED
+    //          - align bottom for vertical alignment, if TOP is set, or default
+    //          - replace text (color? negative numbers RED?)
+    // !Text -> Text:
+    //          - align left for horizontal alignment, if RIGHT
+    //          - align top for vertical alignment, if BOTTOM is set
+    SvNumberFormatter* pNumFormatr = GetDoc()->GetNumberFormatter();
+    bool bNewIsTextFormat = pNumFormatr->IsTextFormat(nNewFormat);
+
+    if((!bNewIsTextFormat && nOldFormat != nNewFormat) || pNewFormula)
+    {
+        bool bIsNumFormat = false;
+        OUString aOrigText;
+        bool bChgText = true;
+        double fVal = 0;
+        if(!pNewValue && SfxItemState::SET != GetItemState(RES_BOXATR_VALUE, false, reinterpret_cast<const SfxPoolItem**>(&pNewValue)))
+        {
+            // so far, no value has been set, so try to evaluate the content
+            sal_uLong nNdPos = rBox.IsValidNumTextNd();
+            if(ULONG_MAX != nNdPos)
+            {
+                sal_uInt32 nTmpFormatIdx = nNewFormat;
+                OUString aText(GetDoc()->GetNodes()[nNdPos] ->GetTextNode()->GetRedlineText());
+                aOrigText = aText;
+                if(aText.isEmpty())
+                    bChgText = false;
+                else
+                {
+                    // Keep Tabs
+                    lcl_TabToBlankAtSttEnd(aText);
+
+                    // JP 22.04.98: Bug 49659 -
+                    //  Special casing for percent
+                    if(SvNumFormatType::PERCENT == pNumFormatr->GetType(nNewFormat))
+                    {
+                        sal_uInt32 nTmpFormat = 0;
+                        if(GetDoc()->IsNumberFormat(aText, nTmpFormat, fVal))
+                        {
+                            if(SvNumFormatType::NUMBER == pNumFormatr->GetType( nTmpFormat))
+                                aText += "%";
+
+                            bIsNumFormat = GetDoc()->IsNumberFormat(aText, nTmpFormatIdx, fVal);
+                        }
+                    }
+                    else
+                        bIsNumFormat = GetDoc()->IsNumberFormat(aText, nTmpFormatIdx, fVal);
+
+                    if(bIsNumFormat)
+                    {
+                        // directly assign value - without Modify
+                        bool bIsLockMod = IsModifyLocked();
+                        LockModify();
+                        SetFormatAttr(SwTableBoxValue(fVal));
+                        if(!bIsLockMod)
+                            UnlockModify();
+                    }
+                }
+            }
+        }
+        else
+        {
+            fVal = pNewValue->GetValue();
+            bIsNumFormat = true;
+        }
+
+        // format contents with the new value assigned and write to paragraph
+        const Color* pCol = nullptr;
+        OUString sNewText;
+        if(DBL_MAX == fVal)
+        {
+            sNewText = SwViewShell::GetShellRes()->aCalc_Error;
+        }
+        else
+        {
+            if(bIsNumFormat)
+                pNumFormatr->GetOutputString(fVal, nNewFormat, sNewText, &pCol);
+            else
+            {
+                // Original text could not be parsed as
+                // number/date/time/..., so keep the text.
+#if 0
+                // Actually the text should be formatted
+                // according to the format, which may include
+                // additional text from the format, for example
+                // in {0;-0;"BAD: "@}. But other places when
+                // entering a new value or changing text or
+                // changing to a different format of type Text
+                // don't do this (yet?).
+                pNumFormatr->GetOutputString(aOrigText, nNewFormat, sNewText, &pCol);
+#else
+                sNewText = aOrigText;
+#endif
+            }
+
+            if(!bChgText)
+                sNewText.clear();
+        }
+
+        // across all boxes
+        ChgTextToNum(rBox, sNewText, pCol, GetDoc()->IsInsTableAlignNum());
+
+    }
+    else if(bNewIsTextFormat && nOldFormat != nNewFormat)
+        ChgNumToText(rBox, nNewFormat);
+}
 
 // for detection of modifications (mainly TableBoxAttribute)
 void SwTableBoxFormat::SwClientNotify(const SwModify& rMod, const SfxHint& rHint)
 {
-    if (rHint.GetId() != SfxHintId::SwLegacyModify)
+    if(rHint.GetId() != SfxHintId::SwLegacyModify)
         return;
     auto pLegacy = static_cast<const sw::LegacyModifyHint*>(&rHint);
     if(IsModifyLocked() || !GetDoc() || GetDoc()->IsInDtor())
@@ -2161,169 +2303,17 @@ void SwTableBoxFormat::SwClientNotify(const SwModify& rMod, const SfxHint& rHint
     {
         GetDoc()->getIDocumentFieldsAccess().SetFieldsDirty(true, nullptr, 0);
 
-        if( SfxItemState::SET == GetItemState( RES_BOXATR_FORMAT, false ) ||
-            SfxItemState::SET == GetItemState( RES_BOXATR_VALUE, false ) ||
-            SfxItemState::SET == GetItemState( RES_BOXATR_FORMULA, false ) )
+        if(SfxItemState::SET == GetItemState(RES_BOXATR_FORMAT, false) ||
+           SfxItemState::SET == GetItemState(RES_BOXATR_VALUE, false) ||
+           SfxItemState::SET == GetItemState(RES_BOXATR_FORMULA, false) )
         {
             // fetch the box
-            SwIterator<SwTableBox,SwFormat> aIter( *this );
+            SwIterator<SwTableBox,SwFormat> aIter(*this);
             SwTableBox* pBox = aIter.First();
-            if( pBox )
-            {
-                OSL_ENSURE( !aIter.Next(), "zero or more than one box at format" );
-
-                sal_uLong nNewFormat;
-                if( pNewFormat )
-                {
-                    nNewFormat = pNewFormat->GetValue();
-                    // new formatting
-                    // is it newer or has the current been removed?
-                    if( SfxItemState::SET != GetItemState( RES_BOXATR_VALUE, false ))
-                        pNewFormat = nullptr;
-                }
-                else
-                {
-                    // fetch the current Item
-                    (void)GetItemState(RES_BOXATR_FORMAT, false, reinterpret_cast<const SfxPoolItem**>(&pNewFormat));
-                    nOldFormat = GetTableBoxNumFormat().GetValue();
-                    nNewFormat = pNewFormat ? pNewFormat->GetValue() : nOldFormat;
-                }
-
-                // is it newer or has the current been removed?
-                if( pNewVal )
-                {
-                    if( GetDoc()->GetNumberFormatter()->IsTextFormat(nNewFormat) )
-                        nOldFormat = 0;
-                    else
-                    {
-                        if( SfxItemState::SET == GetItemState( RES_BOXATR_VALUE, false ))
-                            nOldFormat = getSwDefaultTextFormat();
-                        else
-                            nNewFormat = getSwDefaultTextFormat();
-                    }
-                }
-
-                // Logic:
-                // Value change: -> "simulate" a format change!
-                // Format change:
-                // Text -> !Text or format change:
-                //          - align right for horizontal alignment, if LEFT or JUSTIFIED
-                //          - align bottom for vertical alignment, if TOP is set, or default
-                //          - replace text (color? negative numbers RED?)
-                // !Text -> Text:
-                //          - align left for horizontal alignment, if RIGHT
-                //          - align top for vertical alignment, if BOTTOM is set
-                SvNumberFormatter* pNumFormatr = GetDoc()->GetNumberFormatter();
-                bool bNewIsTextFormat = pNumFormatr->IsTextFormat( nNewFormat );
-
-                if( (!bNewIsTextFormat && nOldFormat != nNewFormat) || pNewFormula )
-                {
-                    bool bIsNumFormat = false;
-                    OUString aOrigText;
-                    bool bChgText = true;
-                    double fVal = 0;
-                    if( !pNewVal && SfxItemState::SET != GetItemState(
-                        RES_BOXATR_VALUE, false, reinterpret_cast<const SfxPoolItem**>(&pNewVal) ))
-                    {
-                        // so far, no value has been set, so try to evaluate the content
-                        sal_uLong nNdPos = pBox->IsValidNumTextNd();
-                        if( ULONG_MAX != nNdPos )
-                        {
-                            sal_uInt32 nTmpFormatIdx = nNewFormat;
-                            OUString aText( GetDoc()->GetNodes()[ nNdPos ]
-                                            ->GetTextNode()->GetRedlineText());
-                            aOrigText = aText;
-                            if( aText.isEmpty() )
-                                bChgText = false;
-                            else
-                            {
-                                // Keep Tabs
-                                lcl_TabToBlankAtSttEnd( aText );
-
-                                // JP 22.04.98: Bug 49659 -
-                                //  Special casing for percent
-                                if( SvNumFormatType::PERCENT ==
-                                    pNumFormatr->GetType( nNewFormat ))
-                                {
-                                    sal_uInt32 nTmpFormat = 0;
-                                    if( GetDoc()->IsNumberFormat(
-                                                aText, nTmpFormat, fVal ))
-                                    {
-                                        if( SvNumFormatType::NUMBER ==
-                                            pNumFormatr->GetType( nTmpFormat ))
-                                            aText += "%";
-
-                                        bIsNumFormat = GetDoc()->IsNumberFormat(
-                                                    aText, nTmpFormatIdx, fVal );
-                                    }
-                                }
-                                else
-                                    bIsNumFormat = GetDoc()->IsNumberFormat(
-                                                    aText, nTmpFormatIdx, fVal );
-
-                                if( bIsNumFormat )
-                                {
-                                    // directly assign value - without Modify
-                                    bool bIsLockMod = IsModifyLocked();
-                                    LockModify();
-                                    SetFormatAttr( SwTableBoxValue( fVal ));
-                                    if( !bIsLockMod )
-                                        UnlockModify();
-                                }
-                            }
-                        }
-                    }
-                    else
-                    {
-                        fVal = pNewVal->GetValue();
-                        bIsNumFormat = true;
-                    }
-
-                    // format contents with the new value assigned and write to paragraph
-                    const Color* pCol = nullptr;
-                    OUString sNewText;
-                    if( DBL_MAX == fVal )
-                    {
-                        sNewText = SwViewShell::GetShellRes()->aCalc_Error;
-                    }
-                    else
-                    {
-                        if (bIsNumFormat)
-                            pNumFormatr->GetOutputString( fVal, nNewFormat, sNewText, &pCol );
-                        else
-                        {
-                            // Original text could not be parsed as
-                            // number/date/time/..., so keep the text.
-#if 0
-                            // Actually the text should be formatted
-                            // according to the format, which may include
-                            // additional text from the format, for example
-                            // in {0;-0;"BAD: "@}. But other places when
-                            // entering a new value or changing text or
-                            // changing to a different format of type Text
-                            // don't do this (yet?).
-                            pNumFormatr->GetOutputString( aOrigText, nNewFormat, sNewText, &pCol );
-#else
-                            sNewText = aOrigText;
-#endif
-                        }
-
-                        if( !bChgText )
-                        {
-                            sNewText.clear();
-                        }
-                    }
-
-                    // across all boxes
-                    ChgTextToNum( *pBox, sNewText, pCol,
-                                    GetDoc()->IsInsTableAlignNum() );
-
-                }
-                else if( bNewIsTextFormat && nOldFormat != nNewFormat )
-                {
-                    ChgNumToText( *pBox, nNewFormat );
-                }
-            }
+            SAL_INFO_IF(!pBox, "sw.core", "no box found at format");
+            SAL_WARN_IF(pBox && aIter.Next(), "sw.core", "more than one box found at format");
+            if(pBox)
+                BoxAttributeChanged(*pBox, pNewFormat, pNewFormula, pNewVal, nOldFormat);
         }
     }
     // call base class


More information about the Libreoffice-commits mailing list