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

Markus Mohrhard markus.mohrhard at googlemail.com
Sat Apr 8 01:22:35 UTC 2017


 sc/inc/attarray.hxx              |    1 
 sc/source/core/data/attarray.cxx |  269 ++++++++++++++++++++-------------------
 2 files changed, 140 insertions(+), 130 deletions(-)

New commits:
commit 7e03a22b690ff2fa9e2a1cf3a7b0f86ab48b10a4
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Fri Apr 7 15:05:06 2017 +0200

    ScAttrArray::HasAttrib needs to process the default pattern if none set
    
    Change-Id: I00f82387ce67ce7d6e8708c7def994767cd79b6f
    Reviewed-on: https://gerrit.libreoffice.org/36269
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Markus Mohrhard <markus.mohrhard at googlemail.com>

diff --git a/sc/inc/attarray.hxx b/sc/inc/attarray.hxx
index a78d77497541..e43ff9268866 100644
--- a/sc/inc/attarray.hxx
+++ b/sc/inc/attarray.hxx
@@ -101,6 +101,7 @@ friend class ScHorizontalAttrIterator;
     void RemoveCellCharAttribs( SCROW nStartRow, SCROW nEndRow,
                               const ScPatternAttr* pPattern, ScEditDataArray* pDataArray );
     void SetDefaultIfNotInit( SCSIZE nNeeded = 1 );
+    bool HasAttrib_Impl(const ScPatternAttr* pPattern, HasAttrFlags nMask, SCROW nRow1, SCROW nRow2, SCSIZE i) const;
 
     ScAttrArray(const ScAttrArray&) = delete;
     ScAttrArray& operator=(const ScAttrArray&) = delete;
diff --git a/sc/source/core/data/attarray.cxx b/sc/source/core/data/attarray.cxx
index a55f8dcfd260..bb81939ad342 100644
--- a/sc/source/core/data/attarray.cxx
+++ b/sc/source/core/data/attarray.cxx
@@ -1286,12 +1286,147 @@ void ScAttrArray::ApplyBlockFrame( const SvxBoxItem* pLineOuter, const SvxBoxInf
     }
 }
 
-// Test if field contains specific attribute
+bool ScAttrArray::HasAttrib_Impl(const ScPatternAttr* pPattern, HasAttrFlags nMask, SCROW nRow1, SCROW nRow2, SCSIZE i) const
+{
+    bool bFound = false;
+    if ( nMask & HasAttrFlags::Merged )
+    {
+        const ScMergeAttr* pMerge =
+            static_cast<const ScMergeAttr*>( &pPattern->GetItem( ATTR_MERGE ) );
+        if ( pMerge->GetColMerge() > 1 || pMerge->GetRowMerge() > 1 )
+            bFound = true;
+    }
+    if ( nMask & ( HasAttrFlags::Overlapped | HasAttrFlags::NotOverlapped | HasAttrFlags::AutoFilter ) )
+    {
+        const ScMergeFlagAttr* pMergeFlag =
+            static_cast<const ScMergeFlagAttr*>( &pPattern->GetItem( ATTR_MERGE_FLAG ) );
+        if ( (nMask & HasAttrFlags::Overlapped) && pMergeFlag->IsOverlapped() )
+            bFound = true;
+        if ( (nMask & HasAttrFlags::NotOverlapped) && !pMergeFlag->IsOverlapped() )
+            bFound = true;
+        if ( (nMask & HasAttrFlags::AutoFilter) && pMergeFlag->HasAutoFilter() )
+            bFound = true;
+    }
+    if ( nMask & HasAttrFlags::Lines )
+    {
+        const SvxBoxItem* pBox =
+            static_cast<const SvxBoxItem*>( &pPattern->GetItem( ATTR_BORDER ) );
+        if ( pBox->GetLeft() || pBox->GetRight() || pBox->GetTop() || pBox->GetBottom() )
+            bFound = true;
+    }
+    if ( nMask & HasAttrFlags::Shadow )
+    {
+        const SvxShadowItem* pShadow =
+            static_cast<const SvxShadowItem*>( &pPattern->GetItem( ATTR_SHADOW ) );
+        if ( pShadow->GetLocation() != SvxShadowLocation::NONE )
+            bFound = true;
+    }
+    if ( nMask & HasAttrFlags::Conditional )
+    {
+        bool bContainsCondFormat =
+            !static_cast<const ScCondFormatItem&>(pPattern->GetItem( ATTR_CONDITIONAL )).GetCondFormatData().empty();
+        if ( bContainsCondFormat )
+            bFound = true;
+    }
+    if ( nMask & HasAttrFlags::Protected )
+    {
+        const ScProtectionAttr* pProtect =
+            static_cast<const ScProtectionAttr*>( &pPattern->GetItem( ATTR_PROTECTION ) );
+        bool bFoundTemp = false;
+        if ( pProtect->GetProtection() || pProtect->GetHideCell() )
+            bFoundTemp = true;
+
+        bool bContainsCondFormat = pData &&
+            !static_cast<const ScCondFormatItem&>(pPattern->GetItem( ATTR_CONDITIONAL )).GetCondFormatData().empty();
+        if ( bContainsCondFormat && nCol != -1 ) // pDocument->GetCondResult() is valid only for real columns.
+        {
+            SCROW nRowStartCond = std::max<SCROW>( nRow1, i ? pData[i-1].nRow + 1: 0 );
+            SCROW nRowEndCond = std::min<SCROW>( nRow2, pData[i].nRow );
+            bool bFoundCond = false;
+            for(SCROW nRowCond = nRowStartCond; nRowCond <= nRowEndCond && !bFoundCond; ++nRowCond)
+            {
+                const SfxItemSet* pSet = pDocument->GetCondResult( nCol, nRowCond, nTab );
+
+                const SfxPoolItem* pItem;
+                if( pSet && pSet->GetItemState( ATTR_PROTECTION, true, &pItem ) == SfxItemState::SET )
+                {
+                    const ScProtectionAttr* pCondProtect = static_cast<const ScProtectionAttr*>(pItem);
+                    if( pCondProtect->GetProtection() || pCondProtect->GetHideCell() )
+                        bFoundCond = true;
+                    else
+                        break;
+                }
+                else
+                {
+                    // well it is not true that we found one
+                    // but existing one + cell where conditional
+                    // formatting does not remove it
+                    // => we should use the existing protection setting
+                    bFoundCond = bFoundTemp;
+                }
+            }
+            bFoundTemp = bFoundCond;
+        }
+
+        if(bFoundTemp)
+            bFound = true;
+    }
+    if ( nMask & HasAttrFlags::Rotate )
+    {
+        const SfxInt32Item* pRotate =
+            static_cast<const SfxInt32Item*>( &pPattern->GetItem( ATTR_ROTATE_VALUE ) );
+        // 90 or 270 degrees is former SvxOrientationItem - only look for other values
+        // (see ScPatternAttr::GetCellOrientation)
+        sal_Int32 nAngle = pRotate->GetValue();
+        if ( nAngle != 0 && nAngle != 9000 && nAngle != 27000 )
+            bFound = true;
+    }
+    if ( nMask & HasAttrFlags::NeedHeight )
+    {
+        if (pPattern->GetCellOrientation() != SVX_ORIENTATION_STANDARD)
+            bFound = true;
+        else if (static_cast<const SfxBoolItem&>(pPattern->GetItem( ATTR_LINEBREAK )).GetValue())
+            bFound = true;
+        else if ((SvxCellHorJustify)static_cast<const SvxHorJustifyItem&>(pPattern->
+                    GetItem( ATTR_HOR_JUSTIFY )).GetValue() == SvxCellHorJustify::Block)
+            bFound = true;
+
+        else if (!static_cast<const ScCondFormatItem&>(pPattern->GetItem(ATTR_CONDITIONAL)).GetCondFormatData().empty())
+            bFound = true;
+        else if (static_cast<const SfxInt32Item&>(pPattern->GetItem( ATTR_ROTATE_VALUE )).GetValue())
+            bFound = true;
+    }
+    if ( nMask & ( HasAttrFlags::ShadowRight | HasAttrFlags::ShadowDown ) )
+    {
+        const SvxShadowItem* pShadow =
+            static_cast<const SvxShadowItem*>( &pPattern->GetItem( ATTR_SHADOW ));
+        SvxShadowLocation eLoc = pShadow->GetLocation();
+        if ( nMask & HasAttrFlags::ShadowRight )
+            if ( eLoc == SvxShadowLocation::TopRight || eLoc == SvxShadowLocation::BottomRight )
+                bFound = true;
+        if ( nMask & HasAttrFlags::ShadowDown )
+            if ( eLoc == SvxShadowLocation::BottomLeft || eLoc == SvxShadowLocation::BottomRight )
+                bFound = true;
+    }
+    if ( nMask & HasAttrFlags::RightOrCenter )
+    {
+        //  called only if the sheet is LTR, so physical=logical alignment can be assumed
+        SvxCellHorJustify eHorJust = (SvxCellHorJustify)
+            static_cast<const SvxHorJustifyItem&>( pPattern->GetItem( ATTR_HOR_JUSTIFY )).GetValue();
+        if ( eHorJust == SvxCellHorJustify::Right || eHorJust == SvxCellHorJustify::Center )
+            bFound = true;
+    }
+
+    return bFound;
+}
 
+// Test if field contains specific attribute
 bool ScAttrArray::HasAttrib( SCROW nRow1, SCROW nRow2, HasAttrFlags nMask ) const
 {
-    if ( !pData )
-        return false;
+    if (!pData)
+    {
+        return HasAttrib_Impl(pDocument->GetDefPattern(), nMask, 0, MAXROW, 0);
+    }
 
     SCSIZE nStartIndex;
     SCSIZE nEndIndex;
@@ -1305,133 +1440,7 @@ bool ScAttrArray::HasAttrib( SCROW nRow1, SCROW nRow2, HasAttrFlags nMask ) cons
     for (SCSIZE i=nStartIndex; i<=nEndIndex && !bFound; i++)
     {
         const ScPatternAttr* pPattern = pData[i].pPattern;
-        if ( nMask & HasAttrFlags::Merged )
-        {
-            const ScMergeAttr* pMerge =
-                    static_cast<const ScMergeAttr*>( &pPattern->GetItem( ATTR_MERGE ) );
-            if ( pMerge->GetColMerge() > 1 || pMerge->GetRowMerge() > 1 )
-                bFound = true;
-        }
-        if ( nMask & ( HasAttrFlags::Overlapped | HasAttrFlags::NotOverlapped | HasAttrFlags::AutoFilter ) )
-        {
-            const ScMergeFlagAttr* pMergeFlag =
-                    static_cast<const ScMergeFlagAttr*>( &pPattern->GetItem( ATTR_MERGE_FLAG ) );
-            if ( (nMask & HasAttrFlags::Overlapped) && pMergeFlag->IsOverlapped() )
-                bFound = true;
-            if ( (nMask & HasAttrFlags::NotOverlapped) && !pMergeFlag->IsOverlapped() )
-                bFound = true;
-            if ( (nMask & HasAttrFlags::AutoFilter) && pMergeFlag->HasAutoFilter() )
-                bFound = true;
-        }
-        if ( nMask & HasAttrFlags::Lines )
-        {
-            const SvxBoxItem* pBox =
-                    static_cast<const SvxBoxItem*>( &pPattern->GetItem( ATTR_BORDER ) );
-            if ( pBox->GetLeft() || pBox->GetRight() || pBox->GetTop() || pBox->GetBottom() )
-                bFound = true;
-        }
-        if ( nMask & HasAttrFlags::Shadow )
-        {
-            const SvxShadowItem* pShadow =
-                    static_cast<const SvxShadowItem*>( &pPattern->GetItem( ATTR_SHADOW ) );
-            if ( pShadow->GetLocation() != SvxShadowLocation::NONE )
-                bFound = true;
-        }
-        if ( nMask & HasAttrFlags::Conditional )
-        {
-            bool bContainsCondFormat =
-                    !static_cast<const ScCondFormatItem&>(pPattern->GetItem( ATTR_CONDITIONAL )).GetCondFormatData().empty();
-            if ( bContainsCondFormat )
-                bFound = true;
-        }
-        if ( nMask & HasAttrFlags::Protected )
-        {
-            const ScProtectionAttr* pProtect =
-                    static_cast<const ScProtectionAttr*>( &pPattern->GetItem( ATTR_PROTECTION ) );
-            bool bFoundTemp = false;
-            if ( pProtect->GetProtection() || pProtect->GetHideCell() )
-                bFoundTemp = true;
-
-            bool bContainsCondFormat =
-                    !static_cast<const ScCondFormatItem&>(pPattern->GetItem( ATTR_CONDITIONAL )).GetCondFormatData().empty();
-            if ( bContainsCondFormat && nCol != -1 ) // pDocument->GetCondResult() is valid only for real columns.
-            {
-                SCROW nRowStartCond = std::max<SCROW>( nRow1, i ? pData[i-1].nRow + 1: 0 );
-                SCROW nRowEndCond = std::min<SCROW>( nRow2, pData[i].nRow );
-                bool bFoundCond = false;
-                for(SCROW nRowCond = nRowStartCond; nRowCond <= nRowEndCond && !bFoundCond; ++nRowCond)
-                {
-                    const SfxItemSet* pSet = pDocument->GetCondResult( nCol, nRowCond, nTab );
-
-                    const SfxPoolItem* pItem;
-                    if( pSet && pSet->GetItemState( ATTR_PROTECTION, true, &pItem ) == SfxItemState::SET )
-                    {
-                        const ScProtectionAttr* pCondProtect = static_cast<const ScProtectionAttr*>(pItem);
-                        if( pCondProtect->GetProtection() || pCondProtect->GetHideCell() )
-                            bFoundCond = true;
-                        else
-                            break;
-                    }
-                    else
-                    {
-                        // well it is not true that we found one
-                        // but existing one + cell where conditional
-                        // formatting does not remove it
-                        // => we should use the existing protection setting
-                        bFoundCond = bFoundTemp;
-                    }
-                }
-                bFoundTemp = bFoundCond;
-            }
-
-            if(bFoundTemp)
-                bFound = true;
-        }
-        if ( nMask & HasAttrFlags::Rotate )
-        {
-            const SfxInt32Item* pRotate =
-                    static_cast<const SfxInt32Item*>( &pPattern->GetItem( ATTR_ROTATE_VALUE ) );
-            // 90 or 270 degrees is former SvxOrientationItem - only look for other values
-            // (see ScPatternAttr::GetCellOrientation)
-            sal_Int32 nAngle = pRotate->GetValue();
-            if ( nAngle != 0 && nAngle != 9000 && nAngle != 27000 )
-                bFound = true;
-        }
-        if ( nMask & HasAttrFlags::NeedHeight )
-        {
-            if (pPattern->GetCellOrientation() != SVX_ORIENTATION_STANDARD)
-                bFound = true;
-            else if (static_cast<const SfxBoolItem&>(pPattern->GetItem( ATTR_LINEBREAK )).GetValue())
-                bFound = true;
-            else if ((SvxCellHorJustify)static_cast<const SvxHorJustifyItem&>(pPattern->
-                        GetItem( ATTR_HOR_JUSTIFY )).GetValue() == SvxCellHorJustify::Block)
-                bFound = true;
-
-            else if (!static_cast<const ScCondFormatItem&>(pPattern->GetItem(ATTR_CONDITIONAL)).GetCondFormatData().empty())
-                bFound = true;
-            else if (static_cast<const SfxInt32Item&>(pPattern->GetItem( ATTR_ROTATE_VALUE )).GetValue())
-                bFound = true;
-        }
-        if ( nMask & ( HasAttrFlags::ShadowRight | HasAttrFlags::ShadowDown ) )
-        {
-            const SvxShadowItem* pShadow =
-                    static_cast<const SvxShadowItem*>( &pPattern->GetItem( ATTR_SHADOW ));
-            SvxShadowLocation eLoc = pShadow->GetLocation();
-            if ( nMask & HasAttrFlags::ShadowRight )
-                if ( eLoc == SvxShadowLocation::TopRight || eLoc == SvxShadowLocation::BottomRight )
-                    bFound = true;
-            if ( nMask & HasAttrFlags::ShadowDown )
-                if ( eLoc == SvxShadowLocation::BottomLeft || eLoc == SvxShadowLocation::BottomRight )
-                    bFound = true;
-        }
-        if ( nMask & HasAttrFlags::RightOrCenter )
-        {
-            //  called only if the sheet is LTR, so physical=logical alignment can be assumed
-            SvxCellHorJustify eHorJust = (SvxCellHorJustify)
-                    static_cast<const SvxHorJustifyItem&>( pPattern->GetItem( ATTR_HOR_JUSTIFY )).GetValue();
-            if ( eHorJust == SvxCellHorJustify::Right || eHorJust == SvxCellHorJustify::Center )
-                bFound = true;
-        }
+        bFound = HasAttrib_Impl(pPattern, nMask, nRow1, nRow2, i);
     }
 
     return bFound;


More information about the Libreoffice-commits mailing list