<?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_AccessibleEdit" 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 readOnly as Boolean
Global hasChangeableAttrs As Boolean


Sub CreateObj()

'*************************************************************************
' COMPONENT: 
' toolkit.AccessibleEdit
'*************************************************************************
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()

    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)
        oObj = utils.at_getAccessibleObjectForRole(xRoot, com.sun.star.accessibility.AccessibleRole.TEXT)
        accButton = utils.at_getAccessibleObjectForRole(xRoot, com.sun.star.accessibility.AccessibleRole.PUSH_BUTTON,"Close")
        Out.Log("Implementation name: "+oObj.getImplementationName())

        ' because of auto adding http:// in edit field when focus lost
        oObj.setText("AccessibleEdit")
        wait(500)
        accButton.grabFocus()
        wait(500)
        oObj.grabFocus()
        accText = oObj.getText()

        hasChangeableAttrs = false
        readOnly = false
    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()
    accButton.grabFocus()
End Sub

</script:module>
