<?xml version="1.0" encoding="UTF-8"?>
<script:module xmlns:script="http://openoffice.org/2000/script" script:name="toolkit_AccessibleStatusBar" 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 oWin As Object


Sub CreateObj()

'*************************************************************************
' COMPONENT: 
' com.sun.star.toolkit.AccessibleStatusBar
'*************************************************************************
On Error Goto ErrHndl

    oDoc = utils.createDocument("swriter", cObjectName)

    Dim xController As Object
    xController = oDoc.getCurrentController()

    Dim xRoot As Object
    oWin = utils.at_getCurrentWindow(oDoc)
    xRoot = utils.at_getAccessibleObject(oWin)
    oObj = utils.at_getAccessibleObjectForRole(xRoot, com.sun.star.accessibility.AccessibleRole.STATUS_BAR)
    
Exit Sub
ErrHndl:
    Test.Exception()
End Sub

Sub fireEvent()
    Dim newPosSize as Variant
    newPosSize = oWin.getPosSize()
    newPosSize.Width = newPosSize.Width - 20
    newPosSize.Height = newPosSize.Height - 20
    newPosSize.X = newPosSize.X + 20
    newPosSize.Y = newPosSize.Y + 20
    oWin.setPosSize(newPosSize.X, newPosSize.Y, newPosSize.Width, _
                            newPosSize.Height, com.sun.star.awt.PosSize.POSSIZE)
End Sub
</script:module>
