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

Sub CreateObj()

'*************************************************************************
' COMPONENT: 
' toolkit.UnoControlTimeField
'*************************************************************************
On Error Goto ErrHndl
    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

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

    oShape1 = ToolkitTools.createUnoControlShape("TimeField", "UnoControlTimeField")
    oShape2 = ToolkitTools.createUnoControlShape("TimeField", "UnoControlTimeField")
    oShape3 = ToolkitTools.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>
