<?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_UnoControlContainer" 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 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

Global oXControl1 as Object
Global oXControl2 as Object


Sub CreateObj()

'*************************************************************************
' COMPONENT: 
' toolkit.UnoControlContainer
'*************************************************************************
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 oCurrCtrl2 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 = createControlShape("CommandButton")
    oShape2 = createUnoControlShape("CommandButton", "UnoControlButton")
    oShape3 = createControlShape("TextField")

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

    oObj = createUnoService("com.sun.star.awt.UnoControlContainer")
    oComponentInstance = createUnoService("com.sun.star.awt.UnoControlContainer")

    oCurrCtrl = oDoc.getCurrentController()
    oXControl1 = oCurrCtrl.getControl(oShape1.getControl())
    oXControl2 = oCurrCtrl.getControl(oShape2.getControl())

    oModel = oShape1.getControl()
    oObj.setModel(oModel)
    oWin = oCurrCtrl.getControl(oModel).getPeer()
    oKit = oWin.getToolkit()
    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>
