diff options
Diffstat (limited to 'chart2/source/tools/PropertyHelper.cxx')
-rw-r--r-- | chart2/source/tools/PropertyHelper.cxx | 137 |
1 files changed, 76 insertions, 61 deletions
diff --git a/chart2/source/tools/PropertyHelper.cxx b/chart2/source/tools/PropertyHelper.cxx index cb3e860c0350..60c2b950a970 100644 --- a/chart2/source/tools/PropertyHelper.cxx +++ b/chart2/source/tools/PropertyHelper.cxx @@ -20,10 +20,13 @@ #include <PropertyHelper.hxx> #include <com/sun/star/container/XNameContainer.hpp> #include <com/sun/star/lang/XMultiServiceFactory.hpp> +#include <docmodel/uno/UnoGradientTools.hxx> #include <comphelper/sequence.hxx> #include <osl/diagnose.h> -#include <tools/diagnose_ex.h> +#include <comphelper/diagnose_ex.hxx> +#include <o3tl/string_view.hxx> +#include <utility> #include <vector> #include <algorithm> #include <iterator> @@ -37,8 +40,8 @@ namespace { struct lcl_EqualsElement { - explicit lcl_EqualsElement( const Any & rValue, const Reference< container::XNameAccess > & xAccess ) - : m_aValue( rValue ), m_xAccess( xAccess ) + explicit lcl_EqualsElement( Any rValue, const Reference< container::XNameAccess > & xAccess ) + : m_aValue(std::move( rValue )), m_xAccess( xAccess ) { OSL_ASSERT( m_xAccess.is()); } @@ -63,13 +66,13 @@ private: struct lcl_StringMatches { - explicit lcl_StringMatches( const OUString & rCmpStr ) : - m_aCmpStr( rCmpStr ) + explicit lcl_StringMatches( OUString aCmpStr ) : + m_aCmpStr(std::move( aCmpStr )) {} - bool operator() ( const OUString & rStr ) + bool operator() ( std::u16string_view rStr ) { - return rStr.match( m_aCmpStr ); + return o3tl::starts_with( rStr, m_aCmpStr ); } private: @@ -81,11 +84,11 @@ struct lcl_OUStringRestToInt32 explicit lcl_OUStringRestToInt32( sal_Int32 nPrefixLength ) : m_nPrefixLength( nPrefixLength ) {} - sal_Int32 operator() ( const OUString & rStr ) + sal_Int32 operator() ( std::u16string_view rStr ) { - if( m_nPrefixLength > rStr.getLength() ) + if( m_nPrefixLength > static_cast<sal_Int32>(rStr.size()) ) return 0; - return rStr.copy( m_nPrefixLength ).toInt32(); + return o3tl::toInt32(rStr.substr( m_nPrefixLength )); } private: sal_Int32 m_nPrefixLength; @@ -111,56 +114,68 @@ OUString lcl_addNamedPropertyUniqueNameToTable( const OUString & rPreferredName ) { if( ! xNameContainer.is() || - ! rValue.hasValue() || - ( rValue.getValueType() != xNameContainer->getElementType())) + ! rValue.hasValue() ) + return rPreferredName; + + Any aValue(rValue); + + if ( rValue.has<css::awt::Gradient>()) + { + // tdf#158421 the lists for Gradients needs awt::Gradient2 + // as type, convert input data if needed (and warn about it, + // the caller should be changed to offer the needed type) + SAL_WARN("chart2","input value needs to be awt::Gradient2"); + const basegfx::BGradient aTemp(model::gradient::getFromAny(rValue)); + aValue <<= model::gradient::createUnoGradient2(aTemp); + } + + if ( aValue.getValueType() != xNameContainer->getElementType()) return rPreferredName; try { Reference< container::XNameAccess > xNameAccess( xNameContainer, uno::UNO_QUERY_THROW ); - auto aNames( comphelper::sequenceToContainer<std::vector< OUString >>( xNameAccess->getElementNames())); - std::vector< OUString >::const_iterator aIt( - std::find_if( aNames.begin(), aNames.end(), lcl_EqualsElement( rValue, xNameAccess ))); + const uno::Sequence<OUString> aElementNames = xNameAccess->getElementNames(); + auto it = std::find_if( aElementNames.begin(), aElementNames.end(), lcl_EqualsElement( aValue, xNameAccess )); + + // element found => return name + if( it != aElementNames.end()) + return *it; // element not found in container - if( aIt == aNames.end()) + OUString aUniqueName; + + // check if preferred name is already used + if( !rPreferredName.isEmpty()) + { + auto aIt = std::find( aElementNames.begin(), aElementNames.end(), rPreferredName ); + if( aIt == aElementNames.end()) + aUniqueName = rPreferredName; + } + + if( aUniqueName.isEmpty()) { - OUString aUniqueName; - - // check if preferred name is already used - if( !rPreferredName.isEmpty()) - { - aIt = std::find( aNames.begin(), aNames.end(), rPreferredName ); - if( aIt == aNames.end()) - aUniqueName = rPreferredName; - } - - if( aUniqueName.isEmpty()) - { - // create a unique id using the prefix plus a number - std::vector< sal_Int32 > aNumbers; - std::vector< OUString >::iterator aNonConstIt( - std::partition( aNames.begin(), aNames.end(), lcl_StringMatches( rPrefix ))); - std::transform( aNames.begin(), aNonConstIt, - back_inserter( aNumbers ), - lcl_OUStringRestToInt32( rPrefix.getLength() )); - std::vector< sal_Int32 >::const_iterator aMaxIt( - std::max_element( aNumbers.begin(), aNumbers.end())); - - sal_Int32 nIndex = 1; - if( aMaxIt != aNumbers.end()) - nIndex = (*aMaxIt) + 1; - - aUniqueName = rPrefix + OUString::number( nIndex ); - } - - OSL_ASSERT( !aUniqueName.isEmpty()); - xNameContainer->insertByName( aUniqueName, rValue ); - return aUniqueName; + auto aNames( comphelper::sequenceToContainer<std::vector< OUString >>( aElementNames )); + // create a unique id using the prefix plus a number + std::vector< sal_Int32 > aNumbers; + std::vector< OUString >::iterator aNonConstIt( + std::partition( aNames.begin(), aNames.end(), lcl_StringMatches( rPrefix ))); + std::transform( aNames.begin(), aNonConstIt, + back_inserter( aNumbers ), + lcl_OUStringRestToInt32( rPrefix.getLength() )); + std::vector< sal_Int32 >::const_iterator aMaxIt( + std::max_element( aNumbers.begin(), aNumbers.end())); + + sal_Int32 nIndex = 1; + if( aMaxIt != aNumbers.end()) + nIndex = (*aMaxIt) + 1; + + aUniqueName = rPrefix + OUString::number( nIndex ); } - else - // element found => return name - return *aIt; + + OSL_ASSERT( !aUniqueName.isEmpty()); + xNameContainer->insertByName( aUniqueName, aValue ); + return aUniqueName; } catch( const uno::Exception & ) { @@ -183,11 +198,11 @@ OUString addLineDashUniqueNameToTable( if( xFact.is()) { Reference< container::XNameContainer > xNameCnt( - xFact->createInstance( "com.sun.star.drawing.DashTable"), + xFact->createInstance( u"com.sun.star.drawing.DashTable"_ustr), uno::UNO_QUERY ); if( xNameCnt.is()) return lcl_addNamedPropertyUniqueNameToTable( - rValue, xNameCnt, "ChartDash ", rPreferredName ); + rValue, xNameCnt, u"ChartDash "_ustr, rPreferredName ); } return OUString(); } @@ -200,11 +215,11 @@ OUString addGradientUniqueNameToTable( if( xFact.is()) { Reference< container::XNameContainer > xNameCnt( - xFact->createInstance( "com.sun.star.drawing.GradientTable"), + xFact->createInstance( u"com.sun.star.drawing.GradientTable"_ustr), uno::UNO_QUERY ); if( xNameCnt.is()) return lcl_addNamedPropertyUniqueNameToTable( - rValue, xNameCnt, "ChartGradient ", rPreferredName ); + rValue, xNameCnt, u"ChartGradient "_ustr, rPreferredName ); } return OUString(); } @@ -217,11 +232,11 @@ OUString addTransparencyGradientUniqueNameToTable( if( xFact.is()) { Reference< container::XNameContainer > xNameCnt( - xFact->createInstance( "com.sun.star.drawing.TransparencyGradientTable"), + xFact->createInstance( u"com.sun.star.drawing.TransparencyGradientTable"_ustr), uno::UNO_QUERY ); if( xNameCnt.is()) return lcl_addNamedPropertyUniqueNameToTable( - rValue, xNameCnt, "ChartTransparencyGradient ", rPreferredName ); + rValue, xNameCnt, u"ChartTransparencyGradient "_ustr, rPreferredName ); } return OUString(); } @@ -234,11 +249,11 @@ OUString addHatchUniqueNameToTable( if( xFact.is()) { Reference< container::XNameContainer > xNameCnt( - xFact->createInstance( "com.sun.star.drawing.HatchTable"), + xFact->createInstance( u"com.sun.star.drawing.HatchTable"_ustr), uno::UNO_QUERY ); if( xNameCnt.is()) return lcl_addNamedPropertyUniqueNameToTable( - rValue, xNameCnt, "ChartHatch ", rPreferredName ); + rValue, xNameCnt, u"ChartHatch "_ustr, rPreferredName ); } return OUString(); } @@ -251,11 +266,11 @@ OUString addBitmapUniqueNameToTable( if( xFact.is()) { Reference< container::XNameContainer > xNameCnt( - xFact->createInstance( "com.sun.star.drawing.BitmapTable"), + xFact->createInstance( u"com.sun.star.drawing.BitmapTable"_ustr), uno::UNO_QUERY ); if( xNameCnt.is()) return lcl_addNamedPropertyUniqueNameToTable( - rValue, xNameCnt, "ChartBitmap ", rPreferredName ); + rValue, xNameCnt, u"ChartBitmap "_ustr, rPreferredName ); } return OUString(); } |