[Libreoffice-commits] .: 2 commits - sc/inc sc/source

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Thu Sep 6 09:56:35 PDT 2012


 sc/inc/globstr.hrc               |    4 +++-
 sc/source/core/data/attarray.cxx |   34 ++++++++++++++++++++++++++++++++++
 sc/source/core/data/fillinfo.cxx |   21 ++++++++++++++++-----
 sc/source/core/data/table2.cxx   |    3 ++-
 sc/source/ui/src/globstr.src     |    4 ++++
 sc/source/ui/view/cellsh1.cxx    |   12 ++++++++++++
 6 files changed, 71 insertions(+), 7 deletions(-)

New commits:
commit 24712398aa28b5a612a9a2bdeecd51d3eb9535e8
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Thu Sep 6 18:52:12 2012 +0200

    handle protection in conditional formats correctly, fdo#51636
    
    Change-Id: I81d7369218ae8e361f15d811952a8f690a32df96

diff --git a/sc/source/core/data/attarray.cxx b/sc/source/core/data/attarray.cxx
index 6cf487f..bcba4de 100644
--- a/sc/source/core/data/attarray.cxx
+++ b/sc/source/core/data/attarray.cxx
@@ -1189,7 +1189,41 @@ bool ScAttrArray::HasAttrib( SCROW nRow1, SCROW nRow2, sal_uInt16 nMask ) const
         {
             const ScProtectionAttr* pProtect =
                     (const ScProtectionAttr*) &pPattern->GetItem( ATTR_PROTECTION );
+            bool bFoundTemp = false;
             if ( pProtect->GetProtection() || pProtect->GetHideCell() )
+                bFoundTemp = true;
+
+            const SfxUInt32Item* pConditional =
+                    (const SfxUInt32Item*) &pPattern->GetItem( ATTR_CONDITIONAL );
+            if ( pConditional->GetValue() != 0 )
+            {
+                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 ) == SFX_ITEM_SET )
+                    {
+                        const ScProtectionAttr* pCondProtect = static_cast<const ScProtectionAttr*>(pItem);
+                        if( pCondProtect->GetProtection() || pProtect->GetHideCell() )
+                            bFoundCond = true;
+                    }
+                    else
+                    {
+                        // well it is not true that we found one
+                        // but existing one + cell where conditional
+                        // formatting does not remove it
+                        // => we have a protected cell
+                        bFoundCond = true;
+                    }
+                }
+                bFoundTemp = bFoundCond;
+            }
+
+            if(bFoundTemp)
                 bFound = true;
         }
         if ( nMask & HASATTR_ROTATE )
diff --git a/sc/source/core/data/fillinfo.cxx b/sc/source/core/data/fillinfo.cxx
index 743aa26..1ee5a51 100644
--- a/sc/source/core/data/fillinfo.cxx
+++ b/sc/source/core/data/fillinfo.cxx
@@ -533,11 +533,6 @@ void ScDocument::FillInfo( ScTableInfo& rTabInfo, SCCOL nX1, SCROW nY1, SCCOL nX
                                     pThisRowInfo->bEmptyBack = false;
                                 }
 
-                                if (bHidden || ( bFormulaMode && bHideFormula && pInfo->pCell
-                                                    && pInfo->pCell->GetCellType()
-                                                        == CELLTYPE_FORMULA ))
-                                    pInfo->bEmptyCellText = true;
-
                                 if ( pCondForm )
                                 {
                                     ScCondFormatData aData = pCondForm->GetData( pInfo->pCell,
@@ -551,6 +546,17 @@ void ScDocument::FillInfo( ScTableInfo& rTabInfo, SCCOL nX1, SCROW nY1, SCCOL nX
                                             //! Style-Sets cachen !!!
                                             pInfo->pConditionSet = &pStyleSheet->GetItemSet();
                                             bAnyCondition = true;
+
+                                            // we need to check already here for protected cells
+                                            const SfxPoolItem* pItem;
+                                            if ( bTabProtect && pInfo->pConditionSet->GetItemState( ATTR_PROTECTION, true, &pItem ) == SFX_ITEM_SET )
+                                            {
+                                                const ScProtectionAttr* pProtAttr = static_cast<const ScProtectionAttr*>(pItem);
+                                                bHidden = pProtAttr->GetHideCell();
+                                                bHideFormula = pProtAttr->GetHideFormula();
+
+                                            }
+
                                         }
                                         // if style is not there, treat like no condition
                                     }
@@ -565,6 +571,11 @@ void ScDocument::FillInfo( ScTableInfo& rTabInfo, SCCOL nX1, SCROW nY1, SCCOL nX
                                     }
                                 }
 
+                                if (bHidden || ( bFormulaMode && bHideFormula && pInfo->pCell
+                                                    && pInfo->pCell->GetCellType()
+                                                        == CELLTYPE_FORMULA ))
+                                    pInfo->bEmptyCellText = true;
+
                                 ++nArrY;
                             }
                             else if (bRowHidden && nLastHiddenRow >= 0)
diff --git a/sc/source/core/data/table2.cxx b/sc/source/core/data/table2.cxx
index afb9c6b..48cff65 100644
--- a/sc/source/core/data/table2.cxx
+++ b/sc/source/core/data/table2.cxx
@@ -1909,7 +1909,8 @@ bool ScTable::IsBlockEditable( SCCOL nCol1, SCROW nRow1, SCCOL nCol2,
         bIsEditable = false;
     else if ( IsProtected() && !pDocument->IsScenario(nTab) )
     {
-        if((bIsEditable = !HasAttrib( nCol1, nRow1, nCol2, nRow2, HASATTR_PROTECTED )) != false)
+        bIsEditable = !HasAttrib( nCol1, nRow1, nCol2, nRow2, HASATTR_PROTECTED );
+        if(bIsEditable)
         {
             // If Sheet is protected and cells are not protected then
             // check the active scenario protect flag if this range is
commit 8ebc294b5bbcbfe27db3718453fbfcf129329b90
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Thu Sep 6 17:02:44 2012 +0200

    no conditional format changes i protected sheets, related fdo#51636
    
    Change-Id: I228ca76c34e3e18ea4d4f2197db20222319ebbd0

diff --git a/sc/inc/globstr.hrc b/sc/inc/globstr.hrc
index 0694946..42d8c1e 100644
--- a/sc/inc/globstr.hrc
+++ b/sc/inc/globstr.hrc
@@ -600,7 +600,9 @@
 #define STR_COND_UNIQUE             475
 #define STR_COND_DUPLICATE          476
 
-#define STR_COUNT                   477
+#define STR_ERR_CONDFORMAT_PROTECTED 477
+
+#define STR_COUNT                   478
 
 
 #endif
diff --git a/sc/source/ui/src/globstr.src b/sc/source/ui/src/globstr.src
index 0b25b8c..a58f5b6 100644
--- a/sc/source/ui/src/globstr.src
+++ b/sc/source/ui/src/globstr.src
@@ -1895,5 +1895,9 @@ Resource RID_GLOBSTR
     {
         Text [ en-US ] = "Formula is";
     };
+    String STR_ERR_CONDFORMAT_PROTECTED
+    {
+        Text [ en-US ] = "Conditional Formats can not be created, deleted or changed in protected sheets!";
+    };
 };
 
diff --git a/sc/source/ui/view/cellsh1.cxx b/sc/source/ui/view/cellsh1.cxx
index 90e3dfe..c7f0ef8 100644
--- a/sc/source/ui/view/cellsh1.cxx
+++ b/sc/source/ui/view/cellsh1.cxx
@@ -2044,6 +2044,12 @@ void ScCellShell::ExecuteEdit( SfxRequest& rReq )
                 pData->GetMarkData().FillRangeListWithMarks(&aRangeList, false);
                 ScDocument* pDoc = pData->GetDocument();
 
+                if(pDoc->IsTabProtected(pData->GetTabNo()))
+                {
+                    pTabViewShell->ErrorMessage( STR_ERR_CONDFORMAT_PROTECTED );
+                    break;
+                }
+
                 ScAddress aPos(pData->GetCurX(), pData->GetCurY(), pData->GetTabNo());
                 if(aRangeList.empty())
                 {
@@ -2084,6 +2090,12 @@ void ScCellShell::ExecuteEdit( SfxRequest& rReq )
                 pData->GetMarkData().FillRangeListWithMarks(&aRangeList, false);
                 ScDocument* pDoc = pData->GetDocument();
 
+                if(pDoc->IsTabProtected(pData->GetTabNo()))
+                {
+                    pTabViewShell->ErrorMessage( STR_ERR_CONDFORMAT_PROTECTED );
+                    break;
+                }
+
                 ScAddress aPos(pData->GetCurX(), pData->GetCurY(), pData->GetTabNo());
                 if(aRangeList.empty())
                 {


More information about the Libreoffice-commits mailing list