This is how I get the manager using Basic:
Get the type description manager from the default context; see section 10.4
Context, which also shows how to enumerate all of the singleton objects
available.
Function GetTypeDescriptionManager()
Dim sTDMName$ ' Name of the type description manager.
sTDMName = "/singletons/com.sun.star.reflection.theTypeDescriptionManager"
GetTypeDescriptionManager() = GetDefaultContext().getValueByName(sTDMName)
End Function
The following method enumerates all “things” in the com.sun.star.awt module.
Sub EnumerateTypesTest
Dim oTDM ' Type Description Manager.
Dim oTDE ' Type Description Enumerations.
Dim oTD ' One Type Description.
Dim typeArray ' Types for which descriptions are returned.
Dim s$ ' Utility string variable.
REM All supported types.
typeArray = Array(com.sun.star.uno.TypeClass.VOID, _
com.sun.star.uno.TypeClass.CHAR, _
com.sun.star.uno.TypeClass.BOOLEAN, _
com.sun.star.uno.TypeClass.BYTE, _
com.sun.star.uno.TypeClass.SHORT, _
com.sun.star.uno.TypeClass.UNSIGNED_SHORT, _
com.sun.star.uno.TypeClass.LONG, _
com.sun.star.uno.TypeClass.UNSIGNED_LONG, _
com.sun.star.uno.TypeClass.HYPER, _
com.sun.star.uno.TypeClass.UNSIGNED_HYPER, _
com.sun.star.uno.TypeClass.FLOAT, _
com.sun.star.uno.TypeClass.DOUBLE, _
com.sun.star.uno.TypeClass.STRING, _
com.sun.star.uno.TypeClass.TYPE, _
com.sun.star.uno.TypeClass.ANY, _
com.sun.star.uno.TypeClass.ENUM, _
com.sun.star.uno.TypeClass.TYPEDEF, _
com.sun.star.uno.TypeClass.STRUCT, _
com.sun.star.uno.TypeClass.UNION, _
com.sun.star.uno.TypeClass.EXCEPTION, _
com.sun.star.uno.TypeClass.SEQUENCE, _
com.sun.star.uno.TypeClass.ARRAY, _
com.sun.star.uno.TypeClass.INTERFACE, _
com.sun.star.uno.TypeClass.SERVICE, _
com.sun.star.uno.TypeClass.MODULE, _
com.sun.star.uno.TypeClass.INTERFACE_METHOD, _
com.sun.star.uno.TypeClass.INTERFACE_ATTRIBUTE, _
com.sun.star.uno.TypeClass.UNKNOWN, _
com.sun.star.uno.TypeClass.PROPERTY, _
com.sun.star.uno.TypeClass.CONSTANT, _
com.sun.star.uno.TypeClass.CONSTANTS, _
com.sun.star.uno.TypeClass.SINGLETON)
oTDM = GetTypeDescriptionManager()
Dim sBaseName$ : sBaseName = "com.sun.star.awt"
' Change com.sun.star.reflection.TypeDescriptionSearchDepth.ONE
' to com.sun.star.reflection.TypeDescriptionSearchDepth.INFINITE
' to traverse more than a single level.
oTDE = oTDM.createTypeDescriptionEnumeration(sBaseName, _
typeArray, _
com.sun.star.reflection.TypeDescriptionSearchDepth.ONE)
While oTDE.hasMoreElements()
oTD = oTDE.nextTypeDescription()
s$ = s & oTD.Name & CHR$(10)
Wend
MsgBox s
End Sub
To get the information on a specific fully qualified type, use the following
macro (adapted from an example by Bernard Marcelly):
Function GetOOoConst(constString)
Dim sTDMName$
Dim oTDM
sTDMName = "/singletons/com.sun.star.reflection.theTypeDescriptionManager"
oTDM = GetDefaultContext().getValueByName(sTDMName)
If oTDM.hasByHierarchicalName(constString) Then
GetOOoConst = oTDM.getByHierarchicalName(constString)
Else
MsgBox "Unrecognized name : " & constString, 16, "OOo API constant or enum"
End If
End Function
The method is usable to obtain constant and enumeration values from a text
string
Print GetOOoConst("com.sun.star.awt.FontSlant.ITALIC")
This can also return an object that describes the type. This can be used to
enumerate the values and the strings.
Sub EnumerateEnumerations(sName$)
Dim oTD ' One Type Description.
Dim oTDE ' Element enumeration
Dim s$ ' Utility string variable.
Dim sNames
Dim lValues
Dim i As Long
Dim iCount As Integer
oTD = GetOOoConst(sName)
If IsNull(oTD) OR IsEmpty(oTD) Then
Exit Sub
End If
If HasUnoInterfaces(oTD, "com.sun.star.reflection.XEnumTypeDescription") Then
'MsgBox Join( oTD.getEnumNames(), CHR$(10))
sNames = oTD.getEnumNames()
lValues = otd.getEnumValues()
For i = LBound(sNames) To UBound(sNames)
iCount = iCount + 1
If (iCount > 40) Then
MsgBox(s)
s = ""
End If
s = s & lValues(i) & CHR$(9) & sNames(i) & CHR$(10)
Next
ElseIf HasUnoInterfaces(oTD,
"com.sun.star.reflection.XConstantsTypeDescription") Then
lValues = oTD.getConstants()
For i = LBound(lValues) To UBound(lValues)
iCount = iCount + 1
If (iCount > 40) Then
MsgBox(s)
s = ""
End If
s = s & lValues(i).getConstantValue() & CHR$(9) & lValues(i).getName() &
CHR$(10)
Next
Else
'Inspect oTD
MsgBox "Unsupported type " & sName
Exit Sub
End If
MsgBox s
End Sub
This can be used to see enumerations.
EnumerateEnumerations("com.sun.star.awt.FontSlant")
This can be used to see constant groups.
EnumerateEnumerations("com.sun.star.awt.FontWeight")
Hope this helps a little!
On Friday, June 17, 2022 07:36 EDT, "Rony G. Flatscher (Apache)"
<r...@apache.org> wrote:
OK, it is possible using
"/singletons/com.sun.star.reflection.theTypeDescriptionManager". (Will have
to look further into it to maybe use it also for UNO_ENUM and the like.)
---rony
On 17.06.2022 12:46, Rony G. Flatscher wrote:
In the process of creating a few nutshell examples using OLE/COM.
One open problem is how to get to the UNO_CONSTANTS via the OLE/COM bridge.
Here a snippet and its
output (the tilde is the message operator in ooRexx and could be replaced by a
dot for JScript and
the like; .nil is the singleton object with the string value "The NIL object"
to represent null):
factory = .OLEObject~new('com.sun.star.ServiceManager')
coreReflection =
factory~createInstance("com.sun.star.reflection.CoreReflection")
clzName="com.sun.star.table.CellHoriJustify"
say clzName":" "(UNO_ENUM)"
type=coreReflection~forName(clzName)
say "type:" type "type~getName:" type~getname "(forName)"
do f over type~getFields -- iterate over all fields
say f~getName":" f~get(.nil) -- show name and get the value
end
say
type=coreReflection~getType(clzName)
say "type:" type "type~getName:" type~getname "(getType)"
say "-"~copies(79)
say
clzName="com.sun.star.awt.FontWeight"
say clzName":" "(UNO_CONSTANTS)"
type=coreReflection~forName(clzName)
say "type:" type "(forName)"
say
type=coreReflection~getType(clzName)
say "type:" type "type~getName:" type~getname "(getType)"
The output is:
com.sun.star.table.CellHoriJustify: (UNO_ENUM)
type: an OLEObject type~getName: com.sun.star.table.CellHoriJustify
(forName)
STANDARD: 0
LEFT: 1
CENTER: 2
RIGHT: 3
BLOCK: 4
REPEAT: 5
type: an OLEObject type~getName: string (getType)
-------------------------------------------------------------------------------
com.sun.star.awt.FontWeight: (UNO_CONSTANTS)
type: The NIL object (forName)
type: an OLEObject type~getName: string (getType)
So using CoreReflection does not allow one to reflect UNO_CONSTANTS (forName()
returns null).
Using getType() will return "string" for both, UNO_ENUM and UNO_CONSTANTS.
---
Would anyone have an idea how to use OLE/COM to get at the fields and values
for UNO_CONSTANTS
like FontWeight (getting the UNO_CONSTANT value for BOLD other than manually via
<https://www.openoffice.org/api/docs/common/ref/com/sun/star/awt/FontWeight.html>)?
---rony
P.S.: In the process of creating OLE/COM nutshell examples for scalc, swriter
and simpress.
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@openoffice.apache.org
For additional commands, e-mail: dev-h...@openoffice.apache.org