Hi Andrew,

thank you *very* much indeed!

Your code gives much help already to save me a lot of research, so kudos to you! (E.g. from your code it is clear that one can use the same code for fetching constant and enum values, which is already very helpful per se!)

Will experiment a little bit before proceeding with the nutshell OLE/COM samples. Some abilities are not directly available in the context, if a script is run outside of AOO using OLE/COM such as GetDefaultContext(), however it is possible to fetch it from the service manager with serviceManager.DefaultContext(). Or it would not be possible to reference the enum values for the TypeClass in such a handy manner. However, it is very feasible to get at that information (and others) one way or the other.

Again, thank you very much!

---rony


On 17.06.2022 15:31, Andrew Pitonyak wrote:
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

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@openoffice.apache.org
For additional commands, e-mail: dev-h...@openoffice.apache.org

Reply via email to