diff --git chart2/source/tools/ExplicitCategoriesProvider.cxx chart2/source/tools/ExplicitCategoriesProvider.cxx index acd9585..92ce516 100644 --- chart2/source/tools/ExplicitCategoriesProvider.cxx +++ chart2/source/tools/ExplicitCategoriesProvider.cxx @@ -34,6 +34,10 @@ #include "ExplicitCategoriesProvider.hxx" #include "DiagramHelper.hxx" #include "CommonConverters.hxx" +#include "macros.hxx" + +#include +#include //............................................................................. namespace chart @@ -45,6 +49,8 @@ using namespace ::com::sun::star::chart2; using ::com::sun::star::uno::Reference; using ::com::sun::star::uno::Sequence; using rtl::OUString; +using ::std::hash_set; +using ::std::vector; ExplicitCategoriesProvider::ExplicitCategoriesProvider( const Reference< chart2::XCoordinateSystem >& xCooSysModel ) : m_bDirty(true) @@ -63,15 +69,59 @@ ExplicitCategoriesProvider::~ExplicitCategoriesProvider() { } +static void lcl_removeHiddenIndices(Sequence& rCategories, const Sequence& rHiddenValues) +{ + hash_set aIndices; + sal_Int32 n = rHiddenValues.getLength(); + for (sal_Int32 i = 0; i < n; ++i) + aIndices.insert(rHiddenValues[i]); + + vector aNewCatsVector; + n = rCategories.getLength(); + aNewCatsVector.reserve(n); + for (sal_Int32 i = 0; i < n; ++i) + { + if (aIndices.count(i)) + // skip this value. + continue; + + aNewCatsVector.push_back(rCategories[i]); + } + + n = aNewCatsVector.size(); + rCategories.realloc(n); + for (size_t i = 0; i < n; ++i) + rCategories[i] = aNewCatsVector[i]; +} + //XTextualDataSequence Sequence< ::rtl::OUString > SAL_CALL ExplicitCategoriesProvider::getTextualData() throw( uno::RuntimeException) { if( m_bDirty ) { - if( m_xCategories.is() ) - m_aExplicitCategories = DataSequenceToStringSequence(m_xCategories->getValues()); - if(!m_aExplicitCategories.getLength()) - m_aExplicitCategories = DiagramHelper::generateAutomaticCategories( uno::Reference< chart2::XCoordinateSystem >( m_xCooSysModel.get(), uno::UNO_QUERY ) ); + if (!m_xCategories.is()) + return m_aExplicitCategories; + + uno::Reference< data::XDataSequence > xValues = m_xCategories->getValues(); + uno::Reference< beans::XPropertySet > xProp(xValues, uno::UNO_QUERY); + bool bIsHidden = false; + Sequence aHiddenValues; + if (xProp.is()) + { + xProp->getPropertyValue( C2U( "IsHidden" ) ) >>= bIsHidden; + xProp->getPropertyValue( C2U( "HiddenValues" ) ) >>= aHiddenValues; + } + + if (!bIsHidden) + { + m_aExplicitCategories = DataSequenceToStringSequence(xValues); + lcl_removeHiddenIndices(m_aExplicitCategories, aHiddenValues); + + if(!m_aExplicitCategories.getLength()) + m_aExplicitCategories = DiagramHelper::generateAutomaticCategories( + uno::Reference< chart2::XCoordinateSystem >( m_xCooSysModel.get(), uno::UNO_QUERY ) ); + } + m_bDirty = false; } return m_aExplicitCategories; diff --git chart2/source/view/main/VDataSeries.cxx chart2/source/view/main/VDataSeries.cxx index 7fdddce..608f548 100644 --- chart2/source/view/main/VDataSeries.cxx +++ chart2/source/view/main/VDataSeries.cxx @@ -108,7 +108,7 @@ namespace void VDataSequence::init( const uno::Reference< data::XDataSequence >& xModel ) { - bool bDisplayHiddenCells = true; //todo: make this configurable in future + bool bDisplayHiddenCells = false; //todo: make this configurable in future bool bIsHidden = false; uno::Sequence< sal_Int32 > aHiddenValues; if( !bDisplayHiddenCells )