diff options
author | Andreas Bregas <ab@openoffice.org> | 2010-08-12 08:40:35 +0200 |
---|---|---|
committer | Andreas Bregas <ab@openoffice.org> | 2010-08-12 08:40:35 +0200 |
commit | 20e2562e7be5ea6009e42d4cb9818642e9daa5f9 (patch) | |
tree | 5070bf0db67c60e025d399961362cfd13d8bdbc0 /basic | |
parent | 2987b20f9bfbd87eb28d49995bb32e013ffd7b93 (diff) |
mib18: #163254# Fixed instantiation of class modules for object members
Diffstat (limited to 'basic')
-rwxr-xr-x | basic/source/classes/sb.cxx | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/basic/source/classes/sb.cxx b/basic/source/classes/sb.cxx index d4520025953e..1427e7a74fdf 100755 --- a/basic/source/classes/sb.cxx +++ b/basic/source/classes/sb.cxx @@ -553,6 +553,35 @@ SbClassModuleObject::SbClassModuleObject( SbModule* pClassModule ) USHORT nFlags_ = pProp->GetFlags(); pProp->SetFlag( SBX_NO_BROADCAST ); SbxProperty* pNewProp = new SbxProperty( *pProp ); + + // Special handling for modules instances and collections, they need + // to be instantiated, otherwise all refer to the same base object + SbxDataType eVarType = pProp->GetType(); + if( eVarType == SbxOBJECT ) + { + SbxBase* pObjBase = pProp->GetObject(); + SbxObject* pObj = PTR_CAST(SbxObject,pObjBase); + if( pObj != NULL ) + { + String aObjClass = pObj->GetClassName(); + (void)aObjClass; + + SbClassModuleObject* pClassModuleObj = PTR_CAST(SbClassModuleObject,pObjBase); + if( pClassModuleObj != NULL ) + { + SbModule* pClassModule = pClassModuleObj->getClassModule(); + SbClassModuleObject* pNewObj = new SbClassModuleObject( pClassModule ); + pNewProp->PutObject( pNewObj ); + } + else if( aObjClass.EqualsIgnoreCaseAscii( "Collection" ) ) + { + String aCollectionName( RTL_CONSTASCII_USTRINGPARAM("Collection") ); + BasicCollection* pNewCollection = new BasicCollection( aCollectionName ); + pNewProp->PutObject( pNewCollection ); + } + } + } + pNewProp->ResetFlag( SBX_NO_BROADCAST ); pNewProp->SetParent( this ); pProps->PutDirect( pNewProp, i ); |