<?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_UnoControlFixedText" 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.
'
'*************************************************************************






' REQUIRED VARIABLES for interface/service tests:
Global oComponentInstance As Object
Global oGraphics as Object
Global oContext as Object
Global oWinpeer as Object
Global oToolkit as Object
Global oModel as Object
  Global oXWindow as Object
  Global oCtrlShape as Object

Sub CreateObj()

'*************************************************************************
' COMPONENT: 
' toolkit.UnoControlFixedText
'*************************************************************************
On Error Goto ErrHndl

    Dim bOK As Boolean
    Dim oShape1 As Object
    Dim oShape2 As Object
    Dim oShape3 As Object
    Dim oCurrCtrl As Object
    Dim oWin As Object
    Dim oKit As Object
    Dim oDevice As Object
    Dim oDoc2 As Object

    bOK = true

    oDoc = utils.createDocument("swriter", cObjectName)
    oDoc2 = utils.createDocument("swriter", cObjectName &amp; "1")

    oShape1 = createUnoControlShape("FixedText", "UnoControlFixedText")
    oShape2 = createUnoControlShape("FixedText", "UnoControlFixedText")
    oShape3 = createControlShape("TextField")

    ToolkitTools.addShape(oShape1)
    ToolkitTools.addShape(oShape2)
    ToolkitTools.addShape(oShape3)

    oModel = oShape1.getControl()
    oCurrCtrl = oDoc.getCurrentController()
    oWin = oCurrCtrl.getControl(oModel).getPeer()
    oKit = oWin.getToolkit()
    oDevice = oKit.createScreenCompatibleDevice(200,200)
    oGraphics = oDevice.createGraphics()

    oObj = oCurrCtrl.getControl(oModel)
    oComponentInstance = oDoc.getCurrentcontroller.getControl(oShape2.getControl())
    oContext = oDoc
    oWinpeer = oWin
    oToolkit = oKit
    oXWindow =  oDoc2.getCurrentController().getFrame().getComponentWindow()
Exit Sub
ErrHndl:
    Test.Exception()
End Sub

Sub DisposeObj()
    'Re-open this document to close it successfully
    Dim oDoc2 As Object
    oDoc2 = utils.createDocument("swriter", cObjectName &amp; "1")
    oDoc2.Dispose()
End Sub
</script:module>
