<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd">
<script:module xmlns:script="http://openoffice.org/2000/script" script:name="toolkit_AccessibleListItem" script:language="StarBasic">


'*************************************************************************
'
'  Licensed to the Apache Software Foundation (ASF) under one
'  or more contributor license agreements.  See the NOTICE file
'  distributed with this work for additional information
'  regarding copyright ownership.  The ASF licenses this file
'  to you under the Apache License, Version 2.0 (the
'  "License"); you may not use this file except in compliance
'  with the License.  You may obtain a copy of the License at
'  
'    http://www.apache.org/licenses/LICENSE-2.0
'  
'  Unless required by applicable law or agreed to in writing,
'  software distributed under the License is distributed on an
'  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
'  KIND, either express or implied.  See the License for the
'  specific language governing permissions and limitations
'  under the License.
'
'*************************************************************************





' Be sure that all variables are dimensioned:
option explicit


' REQUIRED VARIABLES for interface/service tests:
Global accText As String
Global accButton As Object
Global accList As Object
Global readOnly as Boolean

Sub CreateObj()

'*************************************************************************
' COMPONENT: 
' toolkit.AccessibleListItem
'*************************************************************************
On Error Goto ErrHndl
    Dim xController As Object, oWin As Object
    Dim xDispatcher As Object, xRoot As Object
    Dim tk As Object, urlTransformer As Object
    Dim url As New com.sun.star.util.URL
    Dim noProps()
    Dim xAccSel As Object

    oDoc = utils.createDocument("swriter", cObjectName)
    tk = createUNOService("com.sun.star.awt.Toolkit")
    wait(500)
    xController = oDoc.getCurrentController()
    urlTransformer = createUNOService("com.sun.star.util.URLTransformer")
    url.Complete = ".uno:HyperlinkDialog"
    urlTransformer.parseStrict(url)
    xDispatcher = xController.queryDispatch(url,"",0)

    if (NOT isNull(xDispatcher)) then 
        xDispatcher.dispatch(url, noProps())
        wait(500)
        oWin = tk.getActiveTopWindow
        xRoot = utils.at_getAccessibleObject(oWin)
        xAccSel = utils.at_getAccessibleObjectForRole(xRoot, com.sun.star.accessibility.AccessibleRole.TREE)
        xAccSel.selectAccessibleChild(3)
        wait(2000)
        accButton = utils.at_getAccessibleObjectForRole(xRoot, com.sun.star.accessibility.AccessibleRole.PUSH_BUTTON,"Close")
        oObj = utils.at_getAccessibleObjectForRole(xRoot, com.sun.star.accessibility.AccessibleRole.LIST_ITEM)
        Out.Log("Implementation name: "+oObj.getImplementationName())
        accText = oObj.getText()
        readOnly = true
    else
        Out.Log("QueryDispatch FAILED. Cannot open Hyperlink dialog...")
    End If

Exit Sub
ErrHndl:
    Test.Exception()
End Sub

Sub DisposeObj()
    if NOT isNull(accButton) then
        accButton.doAccessibleAction(0)
        wait(1000)
    End If
    utils.closeObject(oDoc)
End Sub

Sub fireEvent()
    oObj.grabFocus()
    'accList.selectAccessibleChild(1)
    'wait(500)
    'accList.selectAccessibleChild(0)
    'wait(500)
End Sub

</script:module>
