<?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="forms_OTimeControl" 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:

' Required for  com.sun.star.awt.XView:
  Global oGraphics as Object

' Required for  com.sun.star.lang.XComponent:
  Global oComponentInstance As Object ' it will be disposed

' Required for  com.sun.star.awt.XControl:
  Global oContext As Object
  Global oWinpeer As Object
  Global oToolkit As Object
  Global oModel As Object

' Required for  com.sun.star.awt.XWindow:
  Global oXWindow as Object
  Global oCtrlShape As Variant



Sub CreateObj()

'*************************************************************************
' COMPONENT: 
' forms.OTimeControl
'*************************************************************************
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

    bOK = true

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

    oShape1 = toolkittools.addControlToDefaultForm("TimeField", 1000, 1000, 2000, 1000)
    oShape2 = toolkittools.addControlToDefaultForm("TimeField", 1000, 1000, 2000, 1000)
    oShape3 = toolkittools.addControlToDefaultForm("TextField", 1000, 1000, 2000, 1000)

    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 = oCurrCtrl.getControl(oShape2.getControl())
    oContext = oDoc
    oWinpeer = oWin
    oToolkit = oKit
    oXWindow =  oCurrCtrl.getControl(oShape3.getControl())
    oCtrlShape = oShape1


Exit Sub
ErrHndl:
    Test.Exception()
End Sub
</script:module>
