connectivity/source/commontools/FValue.cxx | 4 - forms/source/component/ListBox.cxx | 70 +++++++++++++++++++++++------ forms/source/component/ListBox.hxx | 11 ++++ 3 files changed, 69 insertions(+), 16 deletions(-)
New commits: commit 10e26364d33150a1f43bcc32a690a9523d792936 Author: Lionel Elie Mamane <[email protected]> Date: Thu Feb 16 13:24:58 2012 +0100 fdo#46163 convert bound values to bound column's type Signed-off-by: Petr Mladek <[email protected]> diff --git a/forms/source/component/ListBox.cxx b/forms/source/component/ListBox.cxx index d982e50..7d3b72b 100644 --- a/forms/source/component/ListBox.cxx +++ b/forms/source/component/ListBox.cxx @@ -326,7 +326,7 @@ namespace frm // propagate if ( m_eListSourceType == ListSourceType_VALUELIST ) { - m_aBoundValues = m_aListSourceValues; + setBoundValues(m_aListSourceValues); } else { @@ -556,7 +556,7 @@ namespace frm OSL_FAIL("OListBoxModel::read : invalid (means unknown) version !"); ValueList().swap(m_aListSourceValues); m_aBoundColumn <<= (sal_Int16)0; - ValueList().swap(m_aBoundValues); + clearBoundValues(); m_eListSourceType = ListSourceType_VALUELIST; m_aDefaultSelectSeq.realloc(0); defaultCommonProperties(); @@ -674,7 +674,7 @@ namespace frm // outta here if we don't have all pre-requisites if ( !xConnection.is() || !sListSource.getLength() ) { - ValueList().swap(m_aBoundValues); + clearBoundValues(); return; } @@ -925,7 +925,7 @@ namespace frm m_nNULLPos = 0; } - m_aBoundValues = aValueList; + setBoundValues(aValueList); setFastPropertyValue( PROPERTY_ID_STRINGITEMLIST, makeAny( lcl_convertToStringSequence( aDisplayList ) ) ); } @@ -949,7 +949,7 @@ namespace frm { if ( m_eListSourceType != ListSourceType_VALUELIST ) { - ValueList().swap(m_aBoundValues); + clearBoundValues(); m_nNULLPos = -1; m_nBoundColumnType = DataType::SQLNULL; @@ -961,19 +961,63 @@ namespace frm } //------------------------------------------------------------------------------ + void OListBoxModel::setBoundValues(const ValueList &l) + { + m_aConvertedBoundValues.clear(); + m_aBoundValues = l; + } + + //------------------------------------------------------------------------------ + void OListBoxModel::clearBoundValues() + { + ValueList().swap(m_aConvertedBoundValues); + ValueList().swap(m_aBoundValues); + } + + //------------------------------------------------------------------------------ + void OListBoxModel::convertBoundValues(const sal_Int32 nFieldType) const + { + m_aConvertedBoundValues.resize(m_aBoundValues.size()); + ValueList::const_iterator src = m_aBoundValues.begin(); + const ValueList::const_iterator end = m_aBoundValues.end(); + ValueList::iterator dst = m_aConvertedBoundValues.begin(); + for (; src != end; ++src, ++dst ) + { + *dst = *src; + dst->setTypeKind(nFieldType); + } + m_nConvertedBoundValuesType = nFieldType; + OSL_ENSURE(dst == m_aConvertedBoundValues.end(), "OListBoxModel::convertBoundValues expected to have overwritten all of m_aConvertedBoundValues, but did not."); + } + //------------------------------------------------------------------------------ + sal_Int32 OListBoxModel::getValueType() const + { + return impl_hasBoundComponent() ? m_nBoundColumnType : getFieldType(); + } + //------------------------------------------------------------------------------ ValueList OListBoxModel::impl_getValues() const { + const sal_Int32 nFieldType = getValueType(); + + if ( !m_aConvertedBoundValues.empty() && m_nConvertedBoundValuesType == nFieldType ) + return m_aConvertedBoundValues; + if ( !m_aBoundValues.empty() ) - return m_aBoundValues; + { + convertBoundValues(nFieldType); + return m_aConvertedBoundValues; + } Sequence< ::rtl::OUString > aStringItems( getStringItemList() ); ValueList aValues( aStringItems.getLength() ); - ::std::copy( - aStringItems.getConstArray(), - aStringItems.getConstArray() + aStringItems.getLength(), - aValues.begin() - ); - + ValueList::iterator dst = aValues.begin(); + const ::rtl::OUString *src (aStringItems.getConstArray()); + const ::rtl::OUString * const end = src + aStringItems.getLength(); + for (; src < end; ++src, ++dst ) + { + *dst = *src; + dst->setTypeKind(nFieldType); + } return aValues; } //------------------------------------------------------------------------------ @@ -1046,7 +1090,7 @@ namespace frm Sequence< sal_Int16 > aSelectionIndicies; ORowSetValue aCurrentValue; - aCurrentValue.fill( impl_hasBoundComponent() ? m_nBoundColumnType : getFieldType(), m_xColumn ); + aCurrentValue.fill( getValueType(), m_xColumn ); // reset selection for NULL values if ( aCurrentValue.isNull() ) diff --git a/forms/source/component/ListBox.hxx b/forms/source/component/ListBox.hxx index cd1302c..d64a5a8 100644 --- a/forms/source/component/ListBox.hxx +++ b/forms/source/component/ListBox.hxx @@ -79,7 +79,9 @@ class OListBoxModel :public OBoundControlModel ::com::sun::star::form::ListSourceType m_eListSourceType; // type der list source ::com::sun::star::uno::Any m_aBoundColumn; ValueList m_aListSourceValues; - ValueList m_aBoundValues; + ValueList m_aBoundValues; // do not write directly; use setBoundValues() + mutable ValueList m_aConvertedBoundValues; + mutable sal_Int32 m_nConvertedBoundValuesType; ::com::sun::star::uno::Sequence<sal_Int16> m_aDefaultSelectSeq; // DefaultSelected // </properties> @@ -181,8 +183,15 @@ private: */ void impl_refreshDbEntryList( bool _bForce ); + void setBoundValues(const ValueList&); + void clearBoundValues(); + ValueList impl_getValues() const; + sal_Int32 getValueType() const; + + void convertBoundValues(sal_Int32 nType) const; + bool impl_hasBoundComponent() const { return m_nBoundColumnType != ::com::sun::star::sdbc::DataType::SQLNULL; } }; commit b5f33bb8fa14afa17c4694d587215cab4756aa1f Author: Lionel Elie Mamane <[email protected]> Date: Thu Feb 16 09:06:26 2012 +0100 ORowSetValue::setTypeKind: correctly convert to (C)LOB/OBJECT/OTHER as opposed to crashing Signed-off-by: Petr Mladek <[email protected]> diff --git a/connectivity/source/commontools/FValue.cxx b/connectivity/source/commontools/FValue.cxx index bfa3b12..444e2bc 100644 --- a/connectivity/source/commontools/FValue.cxx +++ b/connectivity/source/commontools/FValue.cxx @@ -254,10 +254,10 @@ void ORowSetValue::setTypeKind(sal_Int32 _eType) case DataType::CLOB: case DataType::OBJECT: case DataType::OTHER: - (*this) = getAny(); + (*this) = makeAny(); break; default: - (*this) = getAny(); + (*this) = makeAny(); OSL_FAIL("ORowSetValue:operator==(): UNSPUPPORTED TYPE!"); } } _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
