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

Tamás Zolnai tamas.zolnai at collabora.com
Tue Sep 12 13:41:56 UTC 2017


 sc/qa/unit/data/xls/pivottable_page_field_filter.xls |binary
 sc/qa/unit/subsequent_export-test.cxx                |   95 +++++++++++++++++++
 sc/source/filter/excel/xipivot.cxx                   |   71 ++++++++------
 sc/source/filter/inc/xipivot.hxx                     |    4 
 4 files changed, 141 insertions(+), 29 deletions(-)

New commits:
commit 55a43f30a54816e13eb6704a8ec5952a63b01a64
Author: Tamás Zolnai <tamas.zolnai at collabora.com>
Date:   Tue Sep 12 13:36:14 2017 +0200

    tdf#112348: Pivot table: page field filtering is not imported from XLS
    
    Change-Id: I3477cd17f679bdfefb9340656999630380713d3f
    Reviewed-on: https://gerrit.libreoffice.org/42201
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Tamás Zolnai <tamas.zolnai at collabora.com>

diff --git a/sc/qa/unit/data/xls/pivottable_page_field_filter.xls b/sc/qa/unit/data/xls/pivottable_page_field_filter.xls
new file mode 100755
index 000000000000..4f8a3b8ab650
Binary files /dev/null and b/sc/qa/unit/data/xls/pivottable_page_field_filter.xls differ
diff --git a/sc/qa/unit/subsequent_export-test.cxx b/sc/qa/unit/subsequent_export-test.cxx
index afe46cdd2947..0cccc54f026d 100644
--- a/sc/qa/unit/subsequent_export-test.cxx
+++ b/sc/qa/unit/subsequent_export-test.cxx
@@ -217,6 +217,7 @@ public:
     void testPivotTableBoolFieldFilter();
     void testPivotTableRowColPageFieldFilter();
     void testPivotTableEmptyItem();
+    void testPivotTablePageFieldFilter();
 
     CPPUNIT_TEST_SUITE(ScExportTest);
     CPPUNIT_TEST(test);
@@ -328,6 +329,7 @@ public:
     CPPUNIT_TEST(testPivotTableBoolFieldFilter);
     CPPUNIT_TEST(testPivotTableRowColPageFieldFilter);
     CPPUNIT_TEST(testPivotTableEmptyItem);
+    CPPUNIT_TEST(testPivotTablePageFieldFilter);
 
     CPPUNIT_TEST_SUITE_END();
 
@@ -4738,6 +4740,99 @@ void ScExportTest::testPivotTableEmptyItem()
     xDocSh->DoClose();
 }
 
+void ScExportTest::testPivotTablePageFieldFilter()
+{
+    ScDocShellRef xDocSh = loadDoc("pivottable_page_field_filter.", FORMAT_XLS);
+    CPPUNIT_ASSERT_MESSAGE("Failed to load file", xDocSh.is());
+    ScDocument& rDoc = xDocSh->GetDocument();
+    ScDPCollection* pDPs = rDoc.GetDPCollection();
+    CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), pDPs->GetCount());
+
+    // Reload and check filtering of row dimensions
+    xDocSh = saveAndReload( &(*xDocSh), FORMAT_XLS);
+    CPPUNIT_ASSERT_MESSAGE("Failed to load file", xDocSh.is());
+    ScDocument& rLoadedDoc = xDocSh->GetDocument();
+    pDPs = rLoadedDoc.GetDPCollection();
+    CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), pDPs->GetCount());
+    const ScDPObject* pDPObj = &(*pDPs)[0];
+    CPPUNIT_ASSERT(pDPObj);
+    ScDPSaveData* pSaveData = pDPObj->GetSaveData();
+    CPPUNIT_ASSERT(pSaveData);
+
+    // Only one item is selected (an empty item)
+    {
+        ScDPSaveDimension* pSaveDim = pSaveData->GetExistingDimensionByName("Product");
+        CPPUNIT_ASSERT(pSaveDim);
+        const ScDPSaveDimension::MemberList& rMembers = pSaveDim->GetMembers();
+        CPPUNIT_ASSERT_EQUAL(size_t(3), rMembers.size());
+        ScDPSaveMember* pMember = pSaveDim->GetExistingMemberByName("Banana");
+        CPPUNIT_ASSERT(pMember);
+        CPPUNIT_ASSERT(pMember->HasIsVisible() && !pMember->GetIsVisible());
+        pMember = pSaveDim->GetExistingMemberByName("Carrots");
+        CPPUNIT_ASSERT(pMember);
+        CPPUNIT_ASSERT(pMember->HasIsVisible() && !pMember->GetIsVisible());
+        pMember = pSaveDim->GetExistingMemberByName("");
+        CPPUNIT_ASSERT(pMember);
+        CPPUNIT_ASSERT(pMember->HasIsVisible() && pMember->GetIsVisible());
+    }
+
+    // More items are selected, but not all
+    {
+        ScDPSaveDimension* pSaveDim = pSaveData->GetExistingDimensionByName("Category");
+        CPPUNIT_ASSERT(pSaveDim);
+
+        const ScDPSaveDimension::MemberList& rMembers = pSaveDim->GetMembers();
+        CPPUNIT_ASSERT_EQUAL(size_t(3), rMembers.size());
+        ScDPSaveMember* pMember = pSaveDim->GetExistingMemberByName("Vegetables");
+        CPPUNIT_ASSERT(pMember);
+        CPPUNIT_ASSERT(pMember->HasIsVisible() && !pMember->GetIsVisible());
+        pMember = pSaveDim->GetExistingMemberByName("Fruit");
+        CPPUNIT_ASSERT(pMember);
+        CPPUNIT_ASSERT(pMember->HasIsVisible() && pMember->GetIsVisible());
+        pMember = pSaveDim->GetExistingMemberByName("");
+        CPPUNIT_ASSERT(pMember);
+        CPPUNIT_ASSERT(pMember->HasIsVisible() && pMember->GetIsVisible());
+    }
+
+    // All items are selected
+    {
+        ScDPSaveDimension* pSaveDim = pSaveData->GetExistingDimensionByName("Order ID");
+        CPPUNIT_ASSERT(pSaveDim);
+
+        const ScDPSaveDimension::MemberList& rMembers = pSaveDim->GetMembers();
+        CPPUNIT_ASSERT_EQUAL(size_t(3), rMembers.size());
+        ScDPSaveMember* pMember = pSaveDim->GetExistingMemberByName("1");
+        CPPUNIT_ASSERT(pMember);
+        CPPUNIT_ASSERT(pMember->HasIsVisible() && pMember->GetIsVisible());
+        pMember = pSaveDim->GetExistingMemberByName("2");
+        CPPUNIT_ASSERT(pMember);
+        CPPUNIT_ASSERT(pMember->HasIsVisible() && pMember->GetIsVisible());
+        pMember = pSaveDim->GetExistingMemberByName("3");
+        CPPUNIT_ASSERT(pMember);
+        CPPUNIT_ASSERT(pMember->HasIsVisible() && pMember->GetIsVisible());
+    }
+
+    // Only one item is selected (a non-empty item)
+    {
+        ScDPSaveDimension* pSaveDim = pSaveData->GetExistingDimensionByName("Country");
+        CPPUNIT_ASSERT(pSaveDim);
+
+        const ScDPSaveDimension::MemberList& rMembers = pSaveDim->GetMembers();
+        CPPUNIT_ASSERT_EQUAL(size_t(3), rMembers.size());
+        ScDPSaveMember* pMember = pSaveDim->GetExistingMemberByName("United States");
+        CPPUNIT_ASSERT(pMember);
+        CPPUNIT_ASSERT(pMember->HasIsVisible() && !pMember->GetIsVisible());
+        pMember = pSaveDim->GetExistingMemberByName("United Kingdom");
+        CPPUNIT_ASSERT(pMember);
+        CPPUNIT_ASSERT(pMember->HasIsVisible() && pMember->GetIsVisible());
+        pMember = pSaveDim->GetExistingMemberByName("");
+        CPPUNIT_ASSERT(pMember);
+        CPPUNIT_ASSERT(pMember->HasIsVisible() && !pMember->GetIsVisible());
+    }
+
+    xDocSh->DoClose();
+}
+
 CPPUNIT_TEST_SUITE_REGISTRATION(ScExportTest);
 
 CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/sc/source/filter/excel/xipivot.cxx b/sc/source/filter/excel/xipivot.cxx
index ae68e9fe016c..b382c6f088fe 100644
--- a/sc/source/filter/excel/xipivot.cxx
+++ b/sc/source/filter/excel/xipivot.cxx
@@ -882,26 +882,21 @@ const OUString* XclImpPTItem::GetItemName() const
     return nullptr;
 }
 
-void XclImpPTItem::ReadSxvi( XclImpStream& rStrm )
-{
-    rStrm >> maItemInfo;
-}
-
-void XclImpPTItem::ConvertItem( ScDPSaveDimension& rSaveDim, ScDPObject* pObj, const XclImpRoot& rRoot ) const
+std::pair<bool, OUString> XclImpPTItem::GetItemName(const ScDPSaveDimension& rSaveDim, ScDPObject* pObj, const XclImpRoot& rRoot) const
 {
     if(!mpCacheField)
-        return;
+        return std::pair<bool, OUString>(false, OUString());
 
     const XclImpPCItem* pCacheItem = mpCacheField->GetItem( maItemInfo.mnCacheIdx );
     if(!pCacheItem)
-        return;
+        return std::pair<bool, OUString>(false, OUString());
 
     OUString sItemName;
     if(pCacheItem->GetType() == EXC_PCITEM_TEXT || pCacheItem->GetType() == EXC_PCITEM_ERROR)
     {
         const OUString* pItemName = pCacheItem->GetText();
         if(!pItemName)
-            return;
+            return std::pair<bool, OUString>(false, OUString());
         sItemName = *pItemName;
     }
     else if (pCacheItem->GetType() == EXC_PCITEM_DOUBLE)
@@ -925,16 +920,30 @@ void XclImpPTItem::ConvertItem( ScDPSaveDimension& rSaveDim, ScDPObject* pObj, c
         // sItemName is an empty string
     }
     else // EXC_PCITEM_INVALID
-        return;
+        return std::pair<bool, OUString>(false, OUString());
+
+    return std::pair<bool, OUString>(true, sItemName);
+}
+
+void XclImpPTItem::ReadSxvi( XclImpStream& rStrm )
+{
+    rStrm >> maItemInfo;
+}
 
+void XclImpPTItem::ConvertItem( ScDPSaveDimension& rSaveDim, ScDPObject* pObj, const XclImpRoot& rRoot ) const
+{
     // Find member and set properties
-    ScDPSaveMember* pMember = rSaveDim.GetExistingMemberByName( sItemName );
-    if(pMember)
+    std::pair<bool, OUString> aReturnedName = GetItemName(rSaveDim, pObj, rRoot);
+    if(aReturnedName.first)
     {
-        pMember->SetIsVisible( !::get_flag( maItemInfo.mnFlags, EXC_SXVI_HIDDEN ) );
-        pMember->SetShowDetails( !::get_flag( maItemInfo.mnFlags, EXC_SXVI_HIDEDETAIL ) );
-        if (maItemInfo.HasVisName())
-            pMember->SetLayoutName(*maItemInfo.GetVisName());
+        ScDPSaveMember* pMember = rSaveDim.GetExistingMemberByName(aReturnedName.second);
+        if(pMember)
+        {
+            pMember->SetIsVisible( !::get_flag( maItemInfo.mnFlags, EXC_SXVI_HIDDEN ) );
+            pMember->SetShowDetails( !::get_flag( maItemInfo.mnFlags, EXC_SXVI_HIDEDETAIL ) );
+            if (maItemInfo.HasVisName())
+                pMember->SetLayoutName(*maItemInfo.GetVisName());
+        }
     }
 }
 
@@ -1016,12 +1025,7 @@ void XclImpPTField::SetPageFieldInfo( const XclPTPageFieldInfo& rPageInfo )
 void XclImpPTField::ConvertPageField( ScDPSaveData& rSaveData ) const
 {
     OSL_ENSURE( maFieldInfo.mnAxes & EXC_SXVD_AXIS_PAGE, "XclImpPTField::ConvertPageField - no page field" );
-    if( ScDPSaveDimension* pSaveDim = ConvertRCPField( rSaveData ) )
-    {
-        const OUString* pName = GetItemName( maPageInfo.mnSelItem );
-        if (pName)
-            pSaveDim->SetCurrentPage(pName);
-    }
+    ConvertRCPField( rSaveData );
 }
 
 // hidden fields --------------------------------------------------------------
@@ -1163,7 +1167,7 @@ ScDPSaveDimension* XclImpPTField::ConvertRCPField( ScDPSaveData& rSaveData ) con
     return &rSaveDim;
 }
 
-void XclImpPTField::ConvertFieldInfo( const ScDPSaveData& rSaveData, ScDPObject* pObj, const XclImpRoot& rRoot ) const
+void XclImpPTField::ConvertFieldInfo( const ScDPSaveData& rSaveData, ScDPObject* pObj, const XclImpRoot& rRoot, bool bPageField ) const
 {
     const OUString& rFieldName = GetFieldName();
     if( rFieldName.isEmpty() )
@@ -1173,13 +1177,24 @@ void XclImpPTField::ConvertFieldInfo( const ScDPSaveData& rSaveData, ScDPObject*
     if( !pCacheField || !pCacheField->IsSupportedField() )
         return;
 
-    ScDPSaveDimension* pTest = rSaveData.GetExistingDimensionByName(rFieldName);
-    if (!pTest)
+    ScDPSaveDimension* pSaveDim = rSaveData.GetExistingDimensionByName(rFieldName);
+    if (!pSaveDim)
         return;
 
-    pTest->SetShowEmpty( ::get_flag( maFieldExtInfo.mnFlags, EXC_SXVDEX_SHOWALL ) );
+    pSaveDim->SetShowEmpty( ::get_flag( maFieldExtInfo.mnFlags, EXC_SXVDEX_SHOWALL ) );
     for( XclImpPTItemVec::const_iterator aIt = maItems.begin(), aEnd = maItems.end(); aIt != aEnd; ++aIt )
-        (*aIt)->ConvertItem( *pTest, pObj, rRoot );
+        (*aIt)->ConvertItem( *pSaveDim, pObj, rRoot );
+
+    if(bPageField && maPageInfo.mnSelItem != EXC_SXPI_ALLITEMS)
+    {
+        const XclImpPTItem* pItem = GetItem( maPageInfo.mnSelItem );
+        if(pItem)
+        {
+            std::pair<bool, OUString> aReturnedName = pItem->GetItemName(*pSaveDim, pObj, rRoot);
+            if(aReturnedName.first)
+                pSaveDim->SetCurrentPage(&aReturnedName.second);
+        }
+    }
 }
 
 void XclImpPTField::ConvertDataField( ScDPSaveDimension& rSaveDim, const XclPTDataFieldInfo& rDataInfo ) const
@@ -1579,7 +1594,7 @@ void XclImpPivotTable::ApplyFieldInfo()
     // page fields
     for( auto aIt = maPageFields.begin(), aEnd = maPageFields.end(); aIt != aEnd; ++aIt )
         if( const XclImpPTField* pField = GetField( *aIt ) )
-            pField->ConvertFieldInfo( rSaveData, mpDPObj, *this );
+            pField->ConvertFieldInfo( rSaveData, mpDPObj, *this, true );
 
     // hidden fields
     for( sal_uInt16 nField = 0, nCount = GetFieldCount(); nField < nCount; ++nField )
diff --git a/sc/source/filter/inc/xipivot.hxx b/sc/source/filter/inc/xipivot.hxx
index ef58d20c4f8c..3fd656cee83a 100644
--- a/sc/source/filter/inc/xipivot.hxx
+++ b/sc/source/filter/inc/xipivot.hxx
@@ -202,6 +202,8 @@ public:
 
     /** Returns the internal name of the item or 0, if no name could be found. */
     const OUString* GetItemName() const;
+    /** Returns the internal name of the item. */
+    std::pair<bool, OUString> GetItemName(const ScDPSaveDimension& rSaveDim, ScDPObject* pObj, const XclImpRoot& rRoot) const;
 
     /** Reads an SXVI record containing data of this item. */
     void                ReadSxvi( XclImpStream& rStrm );
@@ -268,7 +270,7 @@ public:
     void                AddDataFieldInfo( const XclPTDataFieldInfo& rDataInfo );
     void                ConvertDataField( ScDPSaveData& rSaveData ) const;
 
-    void                ConvertFieldInfo( const ScDPSaveData& rSaveData, ScDPObject* pObj, const XclImpRoot& rRoot ) const;
+    void                ConvertFieldInfo( const ScDPSaveData& rSaveData, ScDPObject* pObj, const XclImpRoot& rRoot, bool bPageField = false ) const;
 
 private:
     ScDPSaveDimension*  ConvertRCPField( ScDPSaveData& rSaveData ) const;


More information about the Libreoffice-commits mailing list