detect follow-on default member of default member object bnc#809017

Change-Id: I366c049fc342240081957b81d2f28bfcf8d4e331
This commit is contained in:
Noel Power
2013-03-15 17:11:16 +00:00
parent 5fbc90a6e2
commit c90373f98e
2 changed files with 29 additions and 0 deletions

View File

@@ -296,6 +296,10 @@ SbUnoObject* createOLEObject_Impl( const OUString& aType )
Any aAny;
aAny <<= xOLEObject;
pUnoObj = new SbUnoObject( aType, aAny );
::rtl::OUString sDfltPropName;
if ( SbUnoObject::getDefaultPropName( pUnoObj, sDfltPropName ) )
pUnoObj->SetDfltProperty( sDfltPropName );
}
}
return pUnoObj;

View File

@@ -43,6 +43,7 @@ using com::sun::star::uno::Reference;
SbxVariable* getVBAConstant( const OUString& rName );
SbxVariable* getDefaultProp( SbxVariable* pRef );
// the bits in the String-ID:
// 0x8000 - Argv is reserved
@@ -606,6 +607,30 @@ SbxVariable* SbiRuntime::CheckArray( SbxVariable* pElem )
}
else
{
// check if there isn't a default member between the current variable
// and the params, e.g.
// Dim rst1 As New ADODB.Recordset
// "
// val = rst1("FirstName")
// has the default 'Fields' member between rst1 and '("FirstName")'
SbxVariable* pDflt = getDefaultProp( pElem );
if ( pDflt )
{
pDflt->Broadcast( SBX_HINT_DATAWANTED );
SbxBaseRef pObj = (SbxBase*)pDflt->GetObject();
if( pObj )
{
if( pObj->ISA(SbUnoObject) )
{
pUnoObj = (SbUnoObject*)(SbxBase*)pObj;
Any aAny = pUnoObj->getUnoAny();
if( aAny.getValueType().getTypeClass() == TypeClass_INTERFACE )
x = *(Reference< XInterface >*)aAny.getValue();
pElem = pDflt;
}
}
}
OUString sDefaultMethod;
Reference< XDefaultMethod > xDfltMethod( x, UNO_QUERY );