Top > OOoBasic > Generic > TypeDescription

*TypeDescription [#v859b8d9]
UNO オブジェクトの型に関する情報を提供するサービス。どういったときに利用するかは[[リフレクション>OOoBasic/Generic/Reflection]]を参照。

Reflection ではオブジェクトが必要ですが、TypeDescription では名前で指定します。Reflection でも forName メソッドで名前指定で情報が取得出来ますが、あちらはオブジェクトを作成したりといった場合に利用されます。また、TypeDescription では constants group も情報が取得できます。

#contents
**TypeDescriptionサービス [#v5baf2ca]
TypeDescription サービスは singleton 存在します。

#code(python){{
ctx = XSCRIPTCONTEXT.getComponentContext()

tdm = ctx.getByName(
	u'/singletons/com.sun.star.reflection.theTypeDescriptionManager')
}}

**各種型情報 [#c6a676fa]

基本的に、上記で取得したサービスから getByHierachicalName メソッドで XTypeDescription インターフェースを取得してそこから各型情報を取得します。

#code(python){{
if tdm.hasByHierarchicalName(u'com.sun.star.awt.Key'):
    td = tdm.getByHierarchicalName(u'com.sun.star.awt.Key')
    
    typeClass = td.getTypeClass() # TypeClass value of the type
    typeName = td.getName() # name of the type
}}

XTypeDescription インターフェースのメソッドでは型および型名が取得できます。
TypeClass は com.sun.star.uno.TypeClass enum に定義されています。
取得されるインターフェースは一様ですが、TypeClass により大方 (.uno.TypeClass に定義された) 以下の型に分かれます。
**Module [#y81a3914]
モジュールに含まれるその他のコンポーネントのモジュール名および型情報が得られます。XModuleTypeDescription

#code(python){{
from com.sun.star.uno.TypeClass import MODULE as TC_MODULE

def tdm_module_test(ctx):
	tdm = ctx.getByName(
		u'/singletons/com.sun.star.reflection.theTypeDescriptionManager')
	
	if tdm.hasByHierarchicalName(u'com.sun.star.awt'):
		td = tdm.getByHierarchicalName(u'com.sun.star.awt')

		if td.getTypeClass() == TC_MODULE:
			members = td.getMembers()
			for member in members:
				print member.getName(),":", member.getTypeClass().value
}}
**Service [#h898ce9b]
必要なサービス、インターフェースやオプションで利用できるサービス、インターフェースの情報が得られます。また、そのサービスのプロパティに関する型情報も得られます。XServiceTypeDescription

サービスの型情報は XServiceTypeDescription、インターフェースの型情報は XInterfaceTypeDescription、プロパティは XPropertyTypeDescription です。
#code(python){{
from com.sun.star.uno.TypeClass import SERVICE as TC_SERVICE

def tdm_service_test(ctx):
	tdm = ctx.getByName(
		u'/singletons/com.sun.star.reflection.theTypeDescriptionManager')
	
	if tdm.hasByHierarchicalName(u'com.sun.star.frame.PopupMenuController'):
		td = tdm.getByHierarchicalName(u'com.sun.star.frame.PopupMenuController')
		
		if td.getTypeClass() == TC_SERVICE:
			print "Mandatory services: "
			MandatoryServices = td.getMandatoryServices()
			for service in MandatoryServices:
				print service.getName()
			
			print "Optional services:"
			OptionalServices = td.getOptionalServices()
			for service in OptionalServices:
				print service.getName()
			
			print "Mandatory interfaces:"
			MandatoryInterfaces = td.getMandatoryInterfaces()
			for interface in MandatoryInterfaces:
				print interface.getName()
			
			print "Optional interfaces: "
			OptionalInterfaces = td.getOptionalInterfaces()
			for interface in OptionalInterfaces:
				print interface.getName()
			
			print "Properties: "
			Properties = td.getProperties()
			for prop in Properties:
				prop.getName()
}}
**Singleton [#h8feedea]

**Exception [#r42f6147]
例外のベースの型やメンバーの型の情報が得られます。XCompoundTypeDescription
#code(python){{
from com.sun.star.uno.TypeClass import EXCEPTION as TC_EXCEPTION

def tdm_exception_test(ctx):
	tdm = ctx.getByName(
		u'/singletons/com.sun.star.reflection.theTypeDescriptionManager')
	
	if tdm.hasByHierarchicalName(u'com.sun.star.beans.UnknownPropertyException'):
		td = tdm.getByHierarchicalName(u'com.sun.star.beans.UnknownPropertyException')
		
		if td.getTypeClass() == TC_EXCEPTION:
			print td.getName()
			print "Base: %s" % td.getBaseType().getName()
			print "Members: "
			print td.getMemberNames()
			members = td.getMemberTypes()
}}
**Struct [#le3816d2]

**Enum [#b8216cf7]
Enum のデフォルト値や名前と値の情報が得られます。

#code(python){{
from com.sun.star.uno.TypeClass import ENUM as TC_ENUM

def tdm_enum_test(ctx):
	tdm = ctx.getByName(
		u'/singletons/com.sun.star.reflection.theTypeDescriptionManager')
	
	if tdm.hasByHierarchicalName(u'com.sun.star.awt.FontSlant'):
		td = tdm.getByHierarchicalName(u'com.sun.star.awt.FontSlant')
		
		if td.getTypeClass() == TC_ENUM:
			print "Enum: %s" % td.getName()
			print "Default Value: %s" % td.getDefaultEnumValue()
			print "Members:"
			names = td.getEnumNames()
			values = td.getEnumValues()
			for name, value in zip(names, values):
				print "%s: %s" % (name, value)
}}
**Interface [#qd7418f4]
インターフェースの型情報。直接継承しているインターフェース名や Attribute、メソッド名などが得られます。XInterfaceTypeDescription、XInterfaceTypeDescription2、XInterfaceMemberTypeDescription

#code(python){{
from com.sun.star.uno.TypeClass import INTERFACE as TC_INTERFACE

def tdm_test(ctx):
	tdm = ctx.getByName(
		u'/singletons/com.sun.star.reflection.theTypeDescriptionManager')
	
	name = u'com.sun.star.io.XTempFile'
	if tdm.hasByHierarchicalName(name):
		td = tdm.getByHierarchicalName(name)
		
		if td.getTypeClass() == TC_INTERFACE:
			print "Interface Name: %s" % td.getName()
			print "Base Types: "
			BaseTypes = td.getBaseTypes()
			for BaseType in BaseTypes:
				print BaseType.getName()
				
			print "Optional Base Type:"
			OptionalBaseTypes = td.getOptionalBaseTypes()
			for OptionalBaseTypes in OptionalBaseTypes:
				print OptionalBaseType.getName()
			
			print "Attributes and Methods:"
			members = td.getMembers()
			for member in members:
				print member.getMemberName()
}}
XTempFile インターフェースではメソッドがありませんが Attribute があります。
**Method [#q0975800]

#code(python){{
from com.sun.star.uno.TypeClass import INTERFACE as TC_INTERFACE
from com.sun.star.uno.TypeClass import INTERFACE_METHOD as TC_INTERFACE_METHOD, \
	INTERFACE_ATTRIBUTE as TC_INTERFACE_ATTRIBUTE

def tdm_test(ctx):
	tdm = ctx.getByName(
		u'/singletons/com.sun.star.reflection.theTypeDescriptionManager')
	
	name = u'com.sun.star.awt.XActionListener'
	if tdm.hasByHierarchicalName(name):
		td = tdm.getByHierarchicalName(name)
		
		if td.getTypeClass() == TC_INTERFACE:
			members = td.getMembers()
			for member in members:
				typeClass = member.getTypeClass()
				
				if typeClass == TC_INTERFACE_ATTRIBUTE:
					print "Attribute: %s %s" % (member.getType().getName(), member.getMemberName())
					
				elif typeClass == TC_INTERFACE_METHOD:
					print "Method: %s" % member.getMemberName()
					#parameters = member.getParameters()
					#for parameter in parameters:
					#	print parameter.getType().getName()
}}
**Property [#a75e9b32]
**Type Def [#f866935b]
**Constants Group [#s8c62a62]
定数の定数名および定数の値が取得できます。XConstantsTypeDescription および XConstantTypeDescription インターフェース。

#code(python){{
    from com.sun.star.uno.TypeClass import CONSTANTS as TC_CONSTANTS
    
    td = tdm.getByHierachcalName(u'com.sun.star.awt.Key')
    if td.getTypeClass() == TC_CONSTANTS:
        constants = td.getConstants()
        for const in constants:
            print "Name: %s, Value: %s" (const.getName(), const.getConstantValue() )
}}

Reload   New Lower page making Edit Freeze Diff Upload Copy Rename   Front page List of pages Search Recent changes Backup   Help   RSS of recent changes