summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--extensions/source/propctrlr/cellbindinghandler.cxx3
-rw-r--r--extensions/source/propctrlr/formcomponenthandler.cxx10
-rw-r--r--extensions/source/propctrlr/formmetadata.hxx1
-rw-r--r--extensions/source/propctrlr/formstrings.hxx1
-rw-r--r--forms/source/component/ComboBox.cxx17
-rw-r--r--forms/source/component/ListBox.cxx47
-rw-r--r--forms/source/component/entrylisthelper.cxx54
-rw-r--r--forms/source/component/entrylisthelper.hxx13
-rw-r--r--forms/source/inc/frm_strings.hxx1
-rw-r--r--forms/source/inc/property.hrc2
-rw-r--r--include/toolkit/helper/property.hxx1
-rw-r--r--offapi/UnoApi_offapi.mk1
-rw-r--r--offapi/com/sun/star/awt/UnoControlComboBoxModel.idl13
-rw-r--r--offapi/com/sun/star/awt/UnoControlListBoxModel.idl10
-rw-r--r--offapi/com/sun/star/form/binding/XListEntryTypedSource.idl47
-rw-r--r--sc/source/ui/unoobj/celllistsource.cxx83
-rw-r--r--sc/source/ui/unoobj/celllistsource.hxx12
-rw-r--r--toolkit/source/awt/vclxwindows.cxx2
-rw-r--r--toolkit/source/controls/unocontrolmodel.cxx7
-rw-r--r--toolkit/source/controls/unocontrols.cxx2
-rw-r--r--toolkit/source/helper/property.cxx1
21 files changed, 309 insertions, 19 deletions
diff --git a/extensions/source/propctrlr/cellbindinghandler.cxx b/extensions/source/propctrlr/cellbindinghandler.cxx
index 578339a5bc1a..3ac05914569c 100644
--- a/extensions/source/propctrlr/cellbindinghandler.cxx
+++ b/extensions/source/propctrlr/cellbindinghandler.cxx
@@ -162,7 +162,10 @@ namespace pcr
try
{
if ( !xSource.is() )
+ {
setPropertyValue( PROPERTY_STRINGITEMLIST, makeAny( Sequence< OUString >() ) );
+ setPropertyValue( PROPERTY_TYPEDITEMLIST, makeAny( Sequence< Any >() ) );
+ }
}
catch( const Exception& )
{
diff --git a/extensions/source/propctrlr/formcomponenthandler.cxx b/extensions/source/propctrlr/formcomponenthandler.cxx
index 9159e451977d..0bd51e8d3e1a 100644
--- a/extensions/source/propctrlr/formcomponenthandler.cxx
+++ b/extensions/source/propctrlr/formcomponenthandler.cxx
@@ -1547,11 +1547,13 @@ namespace pcr
// available list source values (tables or queries) might have changed
_rxInspectorUI->rebuildPropertyUI( PROPERTY_LISTSOURCE );
aDependentProperties.push_back( PROPERTY_ID_STRINGITEMLIST );
+ aDependentProperties.push_back( PROPERTY_ID_TYPEDITEMLIST );
aDependentProperties.push_back( PROPERTY_ID_BOUNDCOLUMN );
SAL_FALLTHROUGH;
// ----- StringItemList -----
case PROPERTY_ID_STRINGITEMLIST:
+ aDependentProperties.push_back( PROPERTY_ID_TYPEDITEMLIST );
aDependentProperties.push_back( PROPERTY_ID_SELECTEDITEMS );
aDependentProperties.push_back( PROPERTY_ID_DEFAULT_SELECT_SEQ );
break;
@@ -1559,6 +1561,7 @@ namespace pcr
// ----- ListSource -----
case PROPERTY_ID_LISTSOURCE:
aDependentProperties.push_back( PROPERTY_ID_STRINGITEMLIST );
+ aDependentProperties.push_back( PROPERTY_ID_TYPEDITEMLIST );
break;
// ----- DataField -----
@@ -1808,6 +1811,13 @@ namespace pcr
}
break; // case PROPERTY_ID_STRINGITEMLIST
+ // ----- TypedItemList -----
+ case PROPERTY_ID_TYPEDITEMLIST:
+ {
+ /* TODO: anything? */
+ }
+ break; // case PROPERTY_ID_TYPEDITEMLIST
+
// ----- BoundColumn -----
case PROPERTY_ID_BOUNDCOLUMN:
{
diff --git a/extensions/source/propctrlr/formmetadata.hxx b/extensions/source/propctrlr/formmetadata.hxx
index 7208a00676c1..0c9f36904249 100644
--- a/extensions/source/propctrlr/formmetadata.hxx
+++ b/extensions/source/propctrlr/formmetadata.hxx
@@ -326,6 +326,7 @@ namespace pcr
#define PROPERTY_ID_SCROLL_HEIGHT 204
#define PROPERTY_ID_SCROLL_TOP 205
#define PROPERTY_ID_SCROLL_LEFT 206
+ #define PROPERTY_ID_TYPEDITEMLIST 207
} // namespace pcr
diff --git a/extensions/source/propctrlr/formstrings.hxx b/extensions/source/propctrlr/formstrings.hxx
index c5e8145411fc..a4d8955b348d 100644
--- a/extensions/source/propctrlr/formstrings.hxx
+++ b/extensions/source/propctrlr/formstrings.hxx
@@ -63,6 +63,7 @@ namespace pcr
#define PROPERTY_BUTTONTYPE "ButtonType"
#define PROPERTY_XFORMS_BUTTONTYPE "XFormsButtonType"
#define PROPERTY_STRINGITEMLIST "StringItemList"
+ #define PROPERTY_TYPEDITEMLIST "TypedItemList"
#define PROPERTY_DEFAULT_TEXT "DefaultText"
#define PROPERTY_DEFAULT_STATE "DefaultState"
#define PROPERTY_FORMATKEY "FormatKey"
diff --git a/forms/source/component/ComboBox.cxx b/forms/source/component/ComboBox.cxx
index 57ff1e6b2122..dd419a171ff4 100644
--- a/forms/source/component/ComboBox.cxx
+++ b/forms/source/component/ComboBox.cxx
@@ -193,6 +193,10 @@ void OComboBoxModel::getFastPropertyValue(Any& _rValue, sal_Int32 _nHandle) cons
_rValue <<= comphelper::containerToSequence(getStringItemList());
break;
+ case PROPERTY_ID_TYPEDITEMLIST:
+ _rValue <<= getTypedItemList();
+ break;
+
default:
OBoundControlModel::getFastPropertyValue(_rValue, _nHandle);
}
@@ -247,6 +251,11 @@ void OComboBoxModel::setFastPropertyValue_NoBroadcast(sal_Int32 _nHandle, const
}
break;
+ // XXX NOTE: PROPERTY_ID_TYPEDITEMLIST not handled here because only
+ // set for external sources in which case not even
+ // setNewStringItemList() for PROPERTY_ID_STRINGITEMLIST above should
+ // had been called ...
+
default:
OBoundControlModel::setFastPropertyValue_NoBroadcast(_nHandle, _rValue);
}
@@ -304,6 +313,7 @@ void OComboBoxModel::describeAggregateProperties( Sequence< Property >& _rAggreg
// superseded properties:
RemoveProperty( _rAggregateProps, PROPERTY_STRINGITEMLIST );
+ RemoveProperty( _rAggregateProps, PROPERTY_TYPEDITEMLIST );
}
@@ -432,6 +442,7 @@ void SAL_CALL OComboBoxModel::read(const Reference<css::io::XObjectInputStream>&
)
{
setFastPropertyValue( PROPERTY_ID_STRINGITEMLIST, makeAny( css::uno::Sequence<OUString>() ) );
+ setFastPropertyValue( PROPERTY_ID_TYPEDITEMLIST, makeAny( css::uno::Sequence<css::uno::Any>() ) );
}
if (nVersion > 0x0004)
@@ -655,6 +666,8 @@ void OComboBoxModel::loadData( bool _bForce )
// Set String-Sequence at ListBox
setFastPropertyValue( PROPERTY_ID_STRINGITEMLIST, makeAny( comphelper::containerToSequence(aStringList) ) );
+ // Reset TypedItemList, no matching data.
+ setFastPropertyValue( PROPERTY_ID_TYPEDITEMLIST, makeAny( css::uno::Sequence<css::uno::Any>() ) );
}
@@ -765,6 +778,7 @@ bool OComboBoxModel::commitControlValueToDbColumn( bool _bPostReset )
aStringItemList.getArray()[ nOldLen ] = sNewValue;
setFastPropertyValue( PROPERTY_ID_STRINGITEMLIST, makeAny( aStringItemList ) );
+ setFastPropertyValue( PROPERTY_ID_TYPEDITEMLIST, makeAny( css::uno::Sequence<css::uno::Any>() ) );
}
}
}
@@ -810,7 +824,10 @@ Any OComboBoxModel::getDefaultForReset() const
void OComboBoxModel::stringItemListChanged( ControlModelLock& /*_rInstanceLock*/ )
{
if ( m_xAggregateSet.is() )
+ {
m_xAggregateSet->setPropertyValue( PROPERTY_STRINGITEMLIST, makeAny( comphelper::containerToSequence(getStringItemList()) ) );
+ m_xAggregateSet->setPropertyValue( PROPERTY_TYPEDITEMLIST, makeAny( getTypedItemList()) ) ;
+ }
}
diff --git a/forms/source/component/ListBox.cxx b/forms/source/component/ListBox.cxx
index 2b5426f23a6c..5fd3e9b96a0f 100644
--- a/forms/source/component/ListBox.cxx
+++ b/forms/source/component/ListBox.cxx
@@ -147,6 +147,7 @@ namespace frm
void OListBoxModel::init()
{
startAggregatePropertyListening( PROPERTY_STRINGITEMLIST );
+ startAggregatePropertyListening( PROPERTY_TYPEDITEMLIST );
}
@@ -286,6 +287,10 @@ namespace frm
_rValue <<= comphelper::containerToSequence(getStringItemList());
break;
+ case PROPERTY_ID_TYPEDITEMLIST:
+ _rValue <<= getTypedItemList();
+ break;
+
default:
OBoundControlModel::getFastPropertyValue(_rValue, _nHandle);
}
@@ -382,6 +387,10 @@ namespace frm
resetNoBroadcast();
break;
+ case PROPERTY_ID_TYPEDITEMLIST:
+ /* TODO: anything? */
+ break;
+
default:
OBoundControlModel::setFastPropertyValue_NoBroadcast(_nHandle, _rValue);
}
@@ -434,6 +443,10 @@ namespace frm
bModified = convertNewListSourceProperty( _rConvertedValue, _rOldValue, _rValue );
break;
+ case PROPERTY_ID_TYPEDITEMLIST:
+ /* TODO: anything? */
+ break;
+
default:
return OBoundControlModel::convertFastPropertyValue(_rConvertedValue, _rOldValue, _nHandle, _rValue);
}
@@ -505,6 +518,7 @@ namespace frm
// <----- SYNCHRONIZED
return;
}
+ // XXX NOTE: PROPERTY_TYPEDITEMLIST not handled, used only with external list source.
OBoundControlModel::_propertyChanged( i_rEvent );
}
@@ -515,6 +529,7 @@ namespace frm
// superseded properties:
RemoveProperty( _rAggregateProps, PROPERTY_STRINGITEMLIST );
+ RemoveProperty( _rAggregateProps, PROPERTY_TYPEDITEMLIST );
}
@@ -669,6 +684,7 @@ namespace frm
)
{
setFastPropertyValue( PROPERTY_ID_STRINGITEMLIST, makeAny( css::uno::Sequence<OUString>() ) );
+ setFastPropertyValue( PROPERTY_ID_TYPEDITEMLIST, makeAny( css::uno::Sequence<css::uno::Any>() ) );
}
if (nVersion > 3)
@@ -991,6 +1007,7 @@ namespace frm
setBoundValues(aValueList);
setFastPropertyValue( PROPERTY_ID_STRINGITEMLIST, makeAny( lcl_convertToStringSequence( aDisplayList ) ) );
+ setFastPropertyValue( PROPERTY_ID_TYPEDITEMLIST, makeAny( css::uno::Sequence<css::uno::Any>() ) );
}
@@ -1456,6 +1473,26 @@ namespace frm
};
+ Any lcl_getSingleSelectedEntryTyped( const Sequence< sal_Int16 >& _rSelectSequence, const Sequence<Any>& _rTypedList )
+ {
+ Any aReturn;
+
+ // by definition, multiple selected entries are transferred as NULL if the
+ // binding does not support lists
+ if ( _rSelectSequence.getLength() <= 1 )
+ {
+ if ( _rSelectSequence.getLength() == 1 )
+ {
+ sal_Int32 nIndex = _rSelectSequence[0];
+ if (0 <= nIndex && nIndex < _rTypedList.getLength())
+ aReturn = _rTypedList[nIndex];
+ }
+ }
+
+ return aReturn;
+ }
+
+
Any lcl_getSingleSelectedEntry( const Sequence< sal_Int16 >& _rSelectSequence, const std::vector< OUString >& _rStringList )
{
Any aReturn;
@@ -1586,7 +1623,14 @@ namespace frm
break;
case eEntry:
- aReturn = lcl_getSingleSelectedEntry( aSelectSequence, getStringItemList() );
+ {
+ const std::vector<OUString>& rStrings = getStringItemList();
+ const Sequence<Any>& rValues = getTypedItemList();
+ if (rStrings.size() == static_cast<size_t>(rValues.getLength()))
+ aReturn = lcl_getSingleSelectedEntryTyped( aSelectSequence, rValues );
+ else
+ aReturn = lcl_getSingleSelectedEntry( aSelectSequence, rStrings );
+ }
break;
}
@@ -1689,6 +1733,7 @@ namespace frm
try
{
m_xAggregateSet->setPropertyValue( PROPERTY_STRINGITEMLIST, makeAny( comphelper::containerToSequence(getStringItemList()) ) );
+ m_xAggregateSet->setPropertyValue( PROPERTY_TYPEDITEMLIST, makeAny( getTypedItemList() ) );
}
catch( const Exception& )
{
diff --git a/forms/source/component/entrylisthelper.cxx b/forms/source/component/entrylisthelper.cxx
index b306256463f9..4e9202be73da 100644
--- a/forms/source/component/entrylisthelper.cxx
+++ b/forms/source/component/entrylisthelper.cxx
@@ -23,6 +23,7 @@
#include <osl/diagnose.h>
#include <comphelper/sequence.hxx>
#include <comphelper/property.hxx>
+#include <com/sun/star/form/binding/XListEntryTypedSource.hpp>
#include <algorithm>
@@ -92,6 +93,8 @@ namespace frm
)
{
m_aStringItems[ _rEvent.Position ] = _rEvent.Entries[ 0 ];
+ if (m_aTypedItems.getLength())
+ m_aTypedItems = Sequence<Any>(); // doesn't match anymore
stringItemListChanged( aLock );
}
}
@@ -112,7 +115,8 @@ namespace frm
)
{
m_aStringItems.insert(m_aStringItems.begin() + _rEvent.Position, _rEvent.Entries.begin(), _rEvent.Entries.end());
-
+ if (m_aTypedItems.getLength())
+ m_aTypedItems = Sequence<Any>(); // doesn't match anymore
stringItemListChanged( aLock );
}
}
@@ -134,6 +138,26 @@ namespace frm
{
m_aStringItems.erase(m_aStringItems.begin() + _rEvent.Position,
m_aStringItems.begin() + _rEvent.Position + _rEvent.Count );
+ if (_rEvent.Position + _rEvent.Count <= m_aTypedItems.getLength())
+ {
+ Sequence<Any> aTmp( m_aTypedItems.getLength() - _rEvent.Count );
+ sal_Int32 nStop = _rEvent.Position;
+ sal_Int32 i = 0;
+ for ( ; i < nStop; ++i)
+ {
+ aTmp[i] = m_aTypedItems[i];
+ }
+ nStop = aTmp.getLength();
+ for (sal_Int32 j = _rEvent.Position + _rEvent.Count; i < nStop; ++i, ++j)
+ {
+ aTmp[i] = m_aTypedItems[j];
+ }
+ m_aTypedItems = aTmp;
+ }
+ else if (m_aTypedItems.getLength())
+ {
+ m_aTypedItems = Sequence<Any>(); // doesn't match anymore
+ }
stringItemListChanged( aLock );
}
}
@@ -184,10 +208,7 @@ namespace frm
void OEntryListHelper::impl_lock_refreshList( ControlModelLock& _rInstanceLock )
{
if ( hasExternalListSource() )
- {
- comphelper::sequenceToContainer(m_aStringItems, m_xListSource->getAllListEntries());
- stringItemListChanged( _rInstanceLock );
- }
+ obtainListSourceEntries( _rInstanceLock );
else
refreshInternalEntryList();
}
@@ -251,8 +272,7 @@ namespace frm
// be notified when the list changes ...
m_xListSource->addListEntryListener( this );
- comphelper::sequenceToContainer( m_aStringItems, m_xListSource->getAllListEntries() );
- stringItemListChanged( _rInstanceLock );
+ obtainListSourceEntries( _rInstanceLock );
// let derivees react on the new list source
connectedExternalListSource();
@@ -260,6 +280,24 @@ namespace frm
}
+ void OEntryListHelper::obtainListSourceEntries( ControlModelLock& _rInstanceLock )
+ {
+ Reference< XListEntryTypedSource > xTyped;
+ xTyped.set( m_xListSource, UNO_QUERY);
+ if (xTyped.is())
+ {
+ comphelper::sequenceToContainer( m_aStringItems, xTyped->getAllListEntriesTyped( m_aTypedItems));
+ }
+ else
+ {
+ comphelper::sequenceToContainer( m_aStringItems, m_xListSource->getAllListEntries());
+ if (m_aTypedItems.getLength())
+ m_aTypedItems = Sequence<Any>();
+ }
+ stringItemListChanged( _rInstanceLock );
+ }
+
+
bool OEntryListHelper::convertNewListSourceProperty( Any& _rConvertedValue,
Any& _rOldValue, const Any& _rValue )
{
@@ -277,6 +315,8 @@ namespace frm
css::uno::Sequence<OUString> aTmp;
OSL_VERIFY( _rValue >>= aTmp );
comphelper::sequenceToContainer(m_aStringItems, aTmp);
+ if (m_aTypedItems.getLength())
+ m_aTypedItems = Sequence<Any>(); // doesn't match anymore
stringItemListChanged( _rInstanceLock );
}
diff --git a/forms/source/component/entrylisthelper.hxx b/forms/source/component/entrylisthelper.hxx
index 3ae722c92e3e..3ad407c6fea7 100644
--- a/forms/source/component/entrylisthelper.hxx
+++ b/forms/source/component/entrylisthelper.hxx
@@ -53,6 +53,8 @@ namespace frm
m_xListSource; /// our external list source
std::vector< OUString >
m_aStringItems; /// "overridden" StringItemList property value
+ css::uno::Sequence< css::uno::Any >
+ m_aTypedItems; /// "overridden" TypedItemList property value
::comphelper::OInterfaceContainerHelper2
m_aRefreshListeners;
@@ -66,6 +68,10 @@ namespace frm
inline const std::vector< OUString >&
getStringItemList() const { return m_aStringItems; }
+ /// returns the current typed item list
+ inline const css::uno::Sequence< css::uno::Any >&
+ getTypedItemList() const { return m_aTypedItems; }
+
/// determines whether we actually have an external list source
inline bool hasExternalListSource( ) const { return m_xListSource.is(); }
@@ -161,6 +167,13 @@ namespace frm
ControlModelLock& _rInstanceLock
);
+ /** obtains list entries and possibly data values from list source
+
+ @precond
+ m_xListSource has to hold an external list source
+ */
+ void obtainListSourceEntries( ControlModelLock& _rInstanceLock );
+
/** refreshes our list entries
In case we have an external list source, its used to obtain the new entries, and then
diff --git a/forms/source/inc/frm_strings.hxx b/forms/source/inc/frm_strings.hxx
index 7415ebee90ea..868772abc744 100644
--- a/forms/source/inc/frm_strings.hxx
+++ b/forms/source/inc/frm_strings.hxx
@@ -70,6 +70,7 @@ namespace frm
#define PROPERTY_HIDDEN_VALUE "HiddenValue"
#define PROPERTY_BUTTONTYPE "ButtonType"
#define PROPERTY_STRINGITEMLIST "StringItemList"
+ #define PROPERTY_TYPEDITEMLIST "TypedItemList"
#define PROPERTY_DEFAULT_TEXT "DefaultText"
#define PROPERTY_DEFAULT_STATE "DefaultState"
#define PROPERTY_FORMATKEY "FormatKey"
diff --git a/forms/source/inc/property.hrc b/forms/source/inc/property.hrc
index 2086db0c94ed..57b6202d085e 100644
--- a/forms/source/inc/property.hrc
+++ b/forms/source/inc/property.hrc
@@ -292,6 +292,8 @@ namespace frm
#define PROPERTY_ID_CONTROL_TYPE_IN_MSO ( PROPERTY_ID_START + 261 )
#define PROPERTY_ID_OBJ_ID_IN_MSO ( PROPERTY_ID_START + 262 )
+#define PROPERTY_ID_TYPEDITEMLIST ( PROPERTY_ID_START + 263 ) // Sequence<Any>
+
// start ID fuer aggregierte Properties
#define PROPERTY_ID_AGGREGATE_ID (PROPERTY_ID_START + 10000)
diff --git a/include/toolkit/helper/property.hxx b/include/toolkit/helper/property.hxx
index d3a637dc46d4..34d8918e9573 100644
--- a/include/toolkit/helper/property.hxx
+++ b/include/toolkit/helper/property.hxx
@@ -207,6 +207,7 @@ namespace uno {
#define BASEPROPERTY_INACTIVE_SEL_BACKGROUND_COLOR 166
#define BASEPROPERTY_ACTIVE_SEL_TEXT_COLOR 167
#define BASEPROPERTY_INACTIVE_SEL_TEXT_COLOR 168
+#define BASEPROPERTY_TYPEDITEMLIST 169 // AnySequence
// These properties are not bound, they are always extracted from the BASEPROPERTY_FONTDESCRIPTOR property
diff --git a/offapi/UnoApi_offapi.mk b/offapi/UnoApi_offapi.mk
index a76f42aff91a..7c169a47b1eb 100644
--- a/offapi/UnoApi_offapi.mk
+++ b/offapi/UnoApi_offapi.mk
@@ -2524,6 +2524,7 @@ $(eval $(call gb_UnoApi_add_idlfiles,offapi,com/sun/star/form/binding,\
XListEntryListener \
XListEntrySink \
XListEntrySource \
+ XListEntryTypedSource \
XValueBinding \
))
$(eval $(call gb_UnoApi_add_idlfiles,offapi,com/sun/star/form/runtime,\
diff --git a/offapi/com/sun/star/awt/UnoControlComboBoxModel.idl b/offapi/com/sun/star/awt/UnoControlComboBoxModel.idl
index 2ee9d691906e..3a359eb393cc 100644
--- a/offapi/com/sun/star/awt/UnoControlComboBoxModel.idl
+++ b/offapi/com/sun/star/awt/UnoControlComboBoxModel.idl
@@ -192,6 +192,19 @@ published service UnoControlComboBoxModel
#StringItemList property.
*/
[optional] interface XItemList;
+
+ /** specifies the list of raw typed (not stringized) items.
+
+ <p>This list corresponds with the StringItemList and if given
+ has to be of the same length, the elements' positions matching
+ those of their string representation in StringItemList.</p>
+
+ <p>If a new value is entered via the ComboBox edit then this
+ list will be invalidated.</p>
+
+ @since LibreOffice 5.4
+ */
+ [optional, property] sequence<any> TypedItemList;
};
diff --git a/offapi/com/sun/star/awt/UnoControlListBoxModel.idl b/offapi/com/sun/star/awt/UnoControlListBoxModel.idl
index 8e577f838407..05a102b0591f 100644
--- a/offapi/com/sun/star/awt/UnoControlListBoxModel.idl
+++ b/offapi/com/sun/star/awt/UnoControlListBoxModel.idl
@@ -186,6 +186,16 @@ published service UnoControlListBoxModel
@since OOo 3.3
*/
[optional, property, maybevoid] short ItemSeparatorPos;
+
+ /** specifies the list of raw typed (not stringized) items.
+
+ <p>This list corresponds with the StringItemList and if given
+ has to be of the same length, the elements' positions matching
+ those of their string representation in StringItemList.</p>
+
+ @since LibreOffice 5.4
+ */
+ [optional, property] sequence<any> TypedItemList;
};
diff --git a/offapi/com/sun/star/form/binding/XListEntryTypedSource.idl b/offapi/com/sun/star/form/binding/XListEntryTypedSource.idl
new file mode 100644
index 000000000000..8f8003deb0f2
--- /dev/null
+++ b/offapi/com/sun/star/form/binding/XListEntryTypedSource.idl
@@ -0,0 +1,47 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef __com_sun_star_form_binding_XListEntryTypedSource_idl__
+#define __com_sun_star_form_binding_XListEntryTypedSource_idl__
+
+#include <com/sun/star/form/binding/XListEntrySource.idl>
+
+
+module com { module sun { module star { module form { module binding {
+
+
+/** specifies a source of string list entries with corresponding underlying data values
+
+ @see XListEntrySource
+
+ @since LibreOffice 5.4
+*/
+interface XListEntryTypedSource : com::sun::star::form::binding::XListEntrySource
+{
+ /** provides access to the entirety of all list entries, along with
+ the corresponding underlying data values.
+
+ @param DataValues
+ The sequence is used by
+ com::sun::star::form::component::ListBox for external
+ sources such as spreadsheets to return the resulting
+ data value if a listbox entry was selected, e.g. set it
+ at the specified bound cell using
+ com::sun::star::form::binding::XValueBinding::setValue().
+ */
+ sequence< string > getAllListEntriesTyped( [out] sequence< any > DataValues );
+
+};
+
+
+}; }; }; }; };
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/ui/unoobj/celllistsource.cxx b/sc/source/ui/unoobj/celllistsource.cxx
index b2dec388e63e..c78b86282ea9 100644
--- a/sc/source/ui/unoobj/celllistsource.cxx
+++ b/sc/source/ui/unoobj/celllistsource.cxx
@@ -161,16 +161,64 @@ namespace calc
return aAddress;
}
- OUString OCellListSource::getCellTextContent_noCheck( sal_Int32 _nRangeRelativeRow )
+ OUString OCellListSource::getCellTextContent_noCheck( sal_Int32 _nRangeRelativeRow, css::uno::Any* pAny )
{
+ OUString sText;
+
OSL_PRECOND( m_xRange.is(), "OCellListSource::getRangeAddress: invalid range!" );
+
+ if (!m_xRange.is())
+ return sText;
+
+ Reference< XCell > xCell( m_xRange->getCellByPosition( 0, _nRangeRelativeRow ));
+ if (!xCell.is())
+ {
+ if (pAny)
+ *pAny <<= sText;
+ return sText;
+ }
+
Reference< XTextRange > xCellText;
- if ( m_xRange.is() )
- xCellText.set(m_xRange->getCellByPosition( 0, _nRangeRelativeRow ), css::uno::UNO_QUERY);
+ xCellText.set( xCell, UNO_QUERY);
+
+ if (xCellText.is())
+ sText = xCellText->getString(); // formatted output string
+
+ if (pAny)
+ {
+ switch (xCell->getType())
+ {
+ case CellContentType_VALUE:
+ *pAny <<= xCell->getValue();
+ break;
+ case CellContentType_TEXT:
+ *pAny <<= sText;
+ break;
+ case CellContentType_FORMULA:
+ if (xCell->getError())
+ *pAny <<= sText; // Err:... or #...!
+ else
+ {
+ Reference< XPropertySet > xProp( xCell, UNO_QUERY);
+ if (xProp.is())
+ {
+ CellContentType eResultType;
+ if ((xProp->getPropertyValue("FormulaResultType") >>= eResultType) &&
+ eResultType == CellContentType_VALUE)
+ *pAny <<= xCell->getValue();
+ else
+ *pAny <<= sText;
+ }
+ }
+ break;
+ case CellContentType_EMPTY:
+ *pAny <<= OUString();
+ break;
+ default:
+ ; // nothing, if actually occurred it would result in #N/A being displayed if selected
+ }
+ }
- OUString sText;
- if ( xCellText.is() )
- sText = xCellText->getString();
return sText;
}
@@ -193,7 +241,7 @@ namespace calc
if ( _nPosition >= getListEntryCount() )
throw IndexOutOfBoundsException();
- return getCellTextContent_noCheck( _nPosition );
+ return getCellTextContent_noCheck( _nPosition, nullptr );
}
Sequence< OUString > SAL_CALL OCellListSource::getAllListEntries( )
@@ -206,7 +254,26 @@ namespace calc
OUString* pAllEntries = aAllEntries.getArray();
for ( sal_Int32 i = 0; i < aAllEntries.getLength(); ++i )
{
- *pAllEntries++ = getCellTextContent_noCheck( i );
+ *pAllEntries++ = getCellTextContent_noCheck( i, nullptr );
+ }
+
+ return aAllEntries;
+ }
+
+ Sequence< OUString > SAL_CALL OCellListSource::getAllListEntriesTyped( Sequence< Any >& rDataValues )
+ {
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed();
+ checkInitialized();
+
+ const sal_Int32 nCount = getListEntryCount();
+ Sequence< OUString > aAllEntries( nCount );
+ rDataValues = Sequence< Any >( nCount );
+ OUString* pAllEntries = aAllEntries.getArray();
+ Any* pDataValues = rDataValues.getArray();
+ for ( sal_Int32 i = 0; i < nCount; ++i )
+ {
+ *pAllEntries++ = getCellTextContent_noCheck( i, pDataValues++ );
}
return aAllEntries;
diff --git a/sc/source/ui/unoobj/celllistsource.hxx b/sc/source/ui/unoobj/celllistsource.hxx
index 2763c768bc2d..5444dfe60ca6 100644
--- a/sc/source/ui/unoobj/celllistsource.hxx
+++ b/sc/source/ui/unoobj/celllistsource.hxx
@@ -20,7 +20,7 @@
#ifndef INCLUDED_SC_SOURCE_UI_UNOOBJ_CELLLISTSOURCE_HXX
#define INCLUDED_SC_SOURCE_UI_UNOOBJ_CELLLISTSOURCE_HXX
-#include <com/sun/star/form/binding/XListEntrySource.hpp>
+#include <com/sun/star/form/binding/XListEntryTypedSource.hpp>
#include <cppuhelper/compbase4.hxx>
#include <cppuhelper/basemutex.hxx>
#include <comphelper/interfacecontainer2.hxx>
@@ -42,7 +42,7 @@ namespace calc
class OCellListSource;
// the base for our interfaces
- typedef ::cppu::WeakAggComponentImplHelper4 < css::form::binding::XListEntrySource
+ typedef ::cppu::WeakAggComponentImplHelper4 < css::form::binding::XListEntryTypedSource
, css::util::XModifyListener
, css::lang::XServiceInfo
, css::lang::XInitialization
@@ -91,6 +91,9 @@ namespace calc
virtual void SAL_CALL addListEntryListener( const css::uno::Reference< css::form::binding::XListEntryListener >& Listener ) override;
virtual void SAL_CALL removeListEntryListener( const css::uno::Reference< css::form::binding::XListEntryListener >& Listener ) override;
+ // XListEntryTypedSource
+ virtual css::uno::Sequence< OUString > SAL_CALL getAllListEntriesTyped( css::uno::Sequence< css::uno::Any >& rDataValues ) override;
+
// OComponentHelper/XComponent
virtual void SAL_CALL disposing() override;
@@ -130,12 +133,15 @@ namespace calc
/** retrievs the text of a cell within our range
@param _nRangeRelativeRow
the relative row index of the cell within our range
+ @param pAny
+ if not <NULL/> then the underlying data value is returned in the Any
@precond
our m_xRange is not <NULL/>
*/
OUString
getCellTextContent_noCheck(
- sal_Int32 _nRangeRelativeRow
+ sal_Int32 _nRangeRelativeRow,
+ css::uno::Any* pAny
);
void notifyModified();
diff --git a/toolkit/source/awt/vclxwindows.cxx b/toolkit/source/awt/vclxwindows.cxx
index e475b8ec655d..0759ee4f6538 100644
--- a/toolkit/source/awt/vclxwindows.cxx
+++ b/toolkit/source/awt/vclxwindows.cxx
@@ -1487,6 +1487,7 @@ void VCLXListBox::ImplGetPropertyIds( std::vector< sal_uInt16 > &rIds )
BASEPROPERTY_PRINTABLE,
BASEPROPERTY_SELECTEDITEMS,
BASEPROPERTY_STRINGITEMLIST,
+ BASEPROPERTY_TYPEDITEMLIST,
BASEPROPERTY_TABSTOP,
BASEPROPERTY_READONLY,
BASEPROPERTY_ALIGN,
@@ -4121,6 +4122,7 @@ void VCLXComboBox::ImplGetPropertyIds( std::vector< sal_uInt16 > &rIds )
BASEPROPERTY_PRINTABLE,
BASEPROPERTY_READONLY,
BASEPROPERTY_STRINGITEMLIST,
+ BASEPROPERTY_TYPEDITEMLIST,
BASEPROPERTY_TABSTOP,
BASEPROPERTY_TEXT,
BASEPROPERTY_HIDEINACTIVESELECTION,
diff --git a/toolkit/source/controls/unocontrolmodel.cxx b/toolkit/source/controls/unocontrolmodel.cxx
index 3a2cf610f651..876cb9e05eff 100644
--- a/toolkit/source/controls/unocontrolmodel.cxx
+++ b/toolkit/source/controls/unocontrolmodel.cxx
@@ -309,6 +309,13 @@ css::uno::Any UnoControlModel::ImplGetDefaultValue( sal_uInt16 nPropId ) const
}
break;
+ case BASEPROPERTY_TYPEDITEMLIST:
+ {
+ css::uno::Sequence< css::uno::Any > aAnySeq;
+ aDefault <<= aAnySeq;
+
+ }
+ break;
case BASEPROPERTY_SELECTEDITEMS:
{
css::uno::Sequence<sal_Int16> aINT16Seq;
diff --git a/toolkit/source/controls/unocontrols.cxx b/toolkit/source/controls/unocontrols.cxx
index 9a1e5cb65494..a529d33cb4bf 100644
--- a/toolkit/source/controls/unocontrols.cxx
+++ b/toolkit/source/controls/unocontrols.cxx
@@ -2277,6 +2277,8 @@ void UnoControlListBoxModel::ImplNormalizePropertySequence( const sal_Int32 _nCo
// dependencies we know:
// BASEPROPERTY_STRINGITEMLIST->BASEPROPERTY_SELECTEDITEMS
ImplEnsureHandleOrder( _nCount, _pHandles, _pValues, BASEPROPERTY_STRINGITEMLIST, BASEPROPERTY_SELECTEDITEMS );
+ // BASEPROPERTY_STRINGITEMLIST->BASEPROPERTY_TYPEDITEMLIST
+ ImplEnsureHandleOrder( _nCount, _pHandles, _pValues, BASEPROPERTY_STRINGITEMLIST, BASEPROPERTY_TYPEDITEMLIST );
UnoControlModel::ImplNormalizePropertySequence( _nCount, _pHandles, _pValues, _pValidHandles );
}
diff --git a/toolkit/source/helper/property.cxx b/toolkit/source/helper/property.cxx
index 9e8b544db346..2ea27d5d5a6d 100644
--- a/toolkit/source/helper/property.cxx
+++ b/toolkit/source/helper/property.cxx
@@ -221,6 +221,7 @@ ImplPropertyInfo* ImplGetPropertyInfos( sal_uInt16& rElementCount )
DECL_DEP_PROP_2 ( "State", STATE, sal_Int16, BOUND, MAYBEDEFAULT ),
DECL_PROP_2 ( "StrictFormat", STRICTFORMAT, bool, BOUND, MAYBEDEFAULT ),
DECL_PROP_2 ( "StringItemList", STRINGITEMLIST, Sequence< OUString >, BOUND, MAYBEDEFAULT ),
+ DECL_PROP_2 ( "TypedItemList", TYPEDITEMLIST, Sequence< Any >, BOUND, MAYBEDEFAULT ),
DECL_PROP_2 ( "VisualEffect", VISUALEFFECT, sal_Int16, BOUND, MAYBEDEFAULT ),
DECL_PROP_3 ( "SymbolColor", SYMBOL_COLOR, sal_Int32, BOUND, MAYBEDEFAULT, MAYBEVOID ),
DECL_PROP_3 ( "Tabstop", TABSTOP, bool, BOUND, MAYBEDEFAULT, MAYBEVOID ),