https://bugs.documentfoundation.org/show_bug.cgi?id=170929
Bug ID: 170929
Summary: Property or method not found: getAccessibleContext() -
Regression in LibreOffice 26.2
Product: LibreOffice
Version: 26.2.0.3 release
Hardware: All
OS: All
Status: UNCONFIRMED
Severity: normal
Priority: medium
Component: BASIC
Assignee: [email protected]
Reporter: [email protected]
Description:
In my TexMaths extension, I need to test if the visible cursor is within a text
box or not. In Impress and Draw, this test uses the getAccessibleContext()
function. This doesn't work anymore in LibreOffice 26.2 because the
getAccessibleContext() is not found.
Steps to Reproduce:
In Impress or Draw, position the cursor within a tex box (or elsewhere) and run
the following isCursorInTextBox macro:
' In Writer, Impress or Draw, test if the visible cursor is in a text box
' Can be used in Writer, Calc, Draw or Impress
' Based on the following posts on the Openoffice forum
' https://forum.openoffice.org/en/forum/viewtopic.php?t=101034
' https://forum.openoffice.org/en/forum/viewtopic.php?t=81353
Sub isCursorInTextBox
Dim oDoc As Variant
Dim oController As Variant
oDoc = ThisComponent
oDocCtrl = oDoc.getCurrentController()
' Writer or Calc document (transferable is only supported in Writer or
Calc)
If oDoc.SupportsService("com.sun.star.text.TextDocument") Then
Dim Transferable as Variant
Transferable = oDocCtrl.getTransferable()
Dim DataFlavor as new com.sun.star.datatransfer.DataFlavor
DataFlavor.mimetype = "text/plain;charset=utf-16"
If Not Transferable.isDataFlavorSupported(DataFlavor) Then
msgbox "Writer => Cursor is NOT in a text box"
else
msgbox "Writer => Cursor is in a tex box"
End If
' Other document type (Impress or Draw)
' Use a method based on the accessible context tree
Else
' Get list of commands
Dim oList as Variant
GlobalScope.BasicLibraries.LoadLibrary("Tools")
oList =
GetRegistryKeyContent("org.openoffice.Office.UI.GenericCommands")
' Get localized context label of Insert Symbol command (remove
tilde character if present)
Dim contextLabel as String
contextLabel = RemoveTilde(
oList.getByName("UserInterface").getByName("Commands").getByName(".uno:InsertSymbol").ContextLabel
)
' Accessible context
Dim oAccessibleContext as Variant
oAccessibleContext =
oDocCtrl.getFrame().getComponentWindow().getAccessibleContext().getAccessibleParent().getAccessibleContext()
' Recursive function that traverses the accessible context tree
Dim inTextBox as Boolean
inTextBox = MenuItemStatus(oAccessibleContext, contextLabel)
If inTextBox = FALSE Then
msgbox "Impress or Draw => Cursor is NOT in a text box"
Else
msgbox "Impress or Draw => Cursor is in a text box"
End If
End If
End Sub
' In Writer, Impress or Draw, test if the visible cursor' Remove tilde
characters in String
Function RemoveTilde( ByVal str as String ) as String
Dim result as String
Dim c as String
Dim i as Integer
result = ""
For i = 1 To Len( str )
c = Mid( str, i, 1 )
If c <> "~" Then result = result & c
Next
RemoveTilde = result
End Function
' Recursive function used by IsInTextbox()
Function MenuItemStatus(oAccessibleContext as Variant, contextLabel as String)
as Boolean
Dim oChild as Variant, oChildAccessibleContext as Variant
Dim i as Integer, n as Integer
' Initialize result
MenuItemStatus = TRUE
' Loop on childs
n = oAccessibleContext.AccessibleChildCount
For i = 0 to n - 1
' Child and its accessible context
On Error GoTo EndFunc
oChild = oAccessibleContext.getAccessibleChild(i)
oChildAccessibleContext = oChild.getAccessibleContext()
' Recurse if there is still childs
If oChildAccessibleContext.AccessibleChildCount > 0 Then
' End recursion if menu item found
If MenuItemStatus(oChildAccessibleContext, contextLabel) = FALSE
Then
MenuItemStatus = FALSE
Exit For
End If
End If
' Restrict to menu items
If oChildAccessibleContext.getAccessibleRole() =
com.sun.star.accessibility.AccessibleRole.MENU_ITEM Then
If oChildAccessibleContext.getAccessibleName() = contextLabel
Then
' Check state
Dim val as Integer
val =
oChildAccessibleContext.AccessibleStateSet And
com.sun.star.accessibility.AccessibleStateType.ENABLED
If val = 0 Then
MenuItemStatus = FALSE
Exit For
End If
End If
End If
Next i
EndFunc:
End Function
Actual Results:
The macro crashes with the message: Property or method not found:
getAccessibleContext().
Expected Results:
In LibreOffice pre 26.2 version, the macro should display a message that says
if the visible cursor is within a text box or not.
Reproducible: Always
User Profile Reset: Yes
Additional Info:
The macro still works in Writer because the getAccessibleContext() function is
not used in this case.
The TexMaths extension needs to test if the visible cursor is within a text box
or not. Indeed, when the cursor is in a text box, generated equations are text
and not graphic images. So this test is crucial for TexMaths.
TexMaths is used by many teachers and searchers.
--
You are receiving this mail because:
You are the assignee for the bug.