diff options
author | Noel Power <noel.power@novell.com> | 2012-07-03 18:13:47 +0100 |
---|---|---|
committer | Noel Power <noel.power@novell.com> | 2012-07-04 20:13:45 +0100 |
commit | 1720641bf36306fc296635925e571556ced8a302 (patch) | |
tree | 15ba72c7a06f5a092c0bc50779f401f74a780ba8 /basic/source/inc | |
parent | 504e433331016004fb2edebdb29a85d69084b1d6 (diff) |
initial attempt at fdo#47263 allow direct access to nested uno structs
Diffstat (limited to 'basic/source/inc')
-rw-r--r-- | basic/source/inc/sbunoobj.hxx | 75 |
1 files changed, 72 insertions, 3 deletions
diff --git a/basic/source/inc/sbunoobj.hxx b/basic/source/inc/sbunoobj.hxx index f27e99a272ed..16b88df17358 100644 --- a/basic/source/inc/sbunoobj.hxx +++ b/basic/source/inc/sbunoobj.hxx @@ -44,6 +44,69 @@ #include <rtl/ustring.hxx> #include <boost/unordered_map.hpp> #include <vector> +#include <map> +#include <boost/shared_ptr.hpp> + +class StructRefInfo +{ + StructRefInfo(); + com::sun::star::uno::Any& maAny; + typelib_TypeDescription* mpTD; + sal_Int32 mnPos; +public: + StructRefInfo( com::sun::star::uno::Any& aAny, typelib_TypeDescription* pTD, sal_Int32 nPos ) : maAny( aAny ), mpTD( pTD ), mnPos( nPos ) {} + + sal_Int32 getPos() const { return mnPos; } + typelib_TypeDescription* getTD() const { return mpTD; } + rtl::OUString getTypeName() const; + com::sun::star::uno::Any& getRootAnyRef() { return maAny; }; + + com::sun::star::uno::TypeClass getTypeClass() const; + + void* getInst(); + bool isEmpty() { return (mnPos == -1); } + + ::com::sun::star::uno::Any getValue(); + void setValue( const ::com::sun::star::uno::Any& ); +}; + +class SbUnoStructRefObject: public SbxObject +{ + struct caseLessComp + { + bool operator() (const ::rtl::OUString& rProp, const ::rtl::OUString& rOtherProp ) const + { + return rProp.toAsciiUpperCase().compareTo( rOtherProp.toAsciiUpperCase() ) < 0; + } + }; + typedef ::std::map< rtl::OUString, StructRefInfo*, caseLessComp > StructFieldInfo; + StructFieldInfo maFields; + StructRefInfo maMemberInfo; + bool mbMemberCacheInit; + void implCreateAll(); + void implCreateDbgProperties(); + void initMemberCache(); + rtl::OUString Impl_DumpProperties(); + rtl::OUString getDbgObjectName(); +public: + TYPEINFO(); + StructRefInfo getStructMember( const rtl::OUString& rMember ); + StructRefInfo getStructInfo() { return maMemberInfo; } + SbUnoStructRefObject( const ::rtl::OUString& aName_, const StructRefInfo& rMemberInfo ); + ~SbUnoStructRefObject(); + + // Find overloaded to support e. g. NameAccess + virtual SbxVariable* Find( const String&, SbxClassType ); + + // Force creation of all properties for debugging + void createAllProperties( void ) + { implCreateAll(); } + + // give out value + ::com::sun::star::uno::Any getUnoAny(); + void SFX_NOTIFY( SfxBroadcaster&, const TypeId&, const SfxHint& rHint, const TypeId& ); +}; +SV_DECL_IMPL_REF(SbUnoStructRefObject); class SbUnoObject: public SbxObject { @@ -55,7 +118,7 @@ class SbUnoObject: public SbxObject sal_Bool bNeedIntrospection; sal_Bool bNativeCOMObject; ::com::sun::star::uno::Any maTmpUnoObj; // Only to save obj for doIntrospection! - + ::boost::shared_ptr< SbUnoStructRefObject > maStructInfo; // help method to establish the dbg_-properties void implCreateDbgProperties( void ); @@ -91,7 +154,6 @@ public: }; SV_DECL_IMPL_REF(SbUnoObject); - // #67781 delete return values of the uno-methods void clearUnoMethods( void ); void clearUnoMethodsForBasic( StarBASIC* pBasic ); @@ -130,9 +192,11 @@ public: }; + class SbUnoProperty : public SbxProperty { friend class SbUnoObject; + friend class SbUnoStructRefObject; ::com::sun::star::beans::Property aUnoProp; sal_Int32 nId; @@ -140,11 +204,16 @@ class SbUnoProperty : public SbxProperty bool mbInvocation; // Property is based on invocation SbxDataType mRealType; virtual ~SbUnoProperty(); + bool mbUnoStruct; + SbUnoProperty( const SbUnoProperty&); + SbUnoProperty& operator = ( const SbUnoProperty&); public: + TYPEINFO(); SbUnoProperty( const rtl::OUString& aName_, SbxDataType eSbxType, SbxDataType eRealSbxType, - const ::com::sun::star::beans::Property& aUnoProp_, sal_Int32 nId_, bool bInvocation ); + const ::com::sun::star::beans::Property& aUnoProp_, sal_Int32 nId_, bool bInvocation, bool bUnoStruct ); + bool isUnoStruct() { return mbUnoStruct; } bool isInvocationBased( void ) { return mbInvocation; } SbxDataType getRealType() { return mRealType; } |