Kaydet (Commit) 55a43f30 authored tarafından Tamás Zolnai's avatar Tamás Zolnai

tdf#112348: Pivot table: page field filtering is not imported from XLS

Change-Id: I3477cd17f679bdfefb9340656999630380713d3f
Reviewed-on: https://gerrit.libreoffice.org/42201Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarTamás Zolnai <tamas.zolnai@collabora.com>
üst 1ded401b
......@@ -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();
......
......@@ -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 )
......
......@@ -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;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment