<?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_OComboBoxModel" 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:

' for XComponent
Global oComponentInstance As Object

' for XPersistObject
Global oPersistInstance As Object

' for XUpdateBroadcaster
Global bCustomUpdate As Boolean

' for relation function checkCommit
Global oForm As Object


Sub CreateObj()

'*************************************************************************
' COMPONENT: 
' forms.OComboBoxModel
'*************************************************************************
On Error Goto ErrHndl
    Dim bOK As Boolean
    Dim oCntrlShape As Object, oDrawPage As Object

    bOK = true
    ' --- create a document if needed

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


    oCntrlShape = toolkittools.addControlToDefaultForm("ComboBox", 1000, 1000, 2000, 1000)
    oObj = oCntrlShape.getControl()
    oCntrlShape = toolkittools.addControlToDefaultForm("ComboBox", 1000, 3000, 2000, 1000)
    oComponentInstance = oCntrlShape.getControl()
    oCntrlShape = toolkittools.addControlToDefaultForm("ComboBox", 1000, 5000, 2000, 1000)
    oPersistInstance = oCntrlShape.getControl()

    'get control from document
    oDrawPage = oDoc.DrawPage
    oForm = oDrawPage.Forms.getByName("Standard")
    
	oForm.DataSourceName = "Bibliography"
	oForm.Command = "biblio"
	oForm.CommandType = com.sun.star.sdb.CommandType.TABLE

    oObj.DataField = "Author"

    oForm.load()
    
    ' for XUpdateBroadcaster
    bCustomUpdate = true
    
Exit Sub
ErrHndl:
    Test.Exception()
End Sub

Global sChangedText As String

' for XBoundComponent
Sub prepareCommit() 
On Error Goto ErrHndl
    Out.Log("prepareCommit() called.")
    sChangedText = "_" + oObj.Text
    oObj.Text = sChangedText
    
    exit sub
ErrHndl:
    Test.Exception()
End Sub

' for XBoundComponent
Function checkCommit() As Boolean
On Error Goto ErrHndl
    Out.Log("checkCommit() called.")
    Dim rowText As Variant
    
    rowText = oForm.getString(oForm.findColumn("Author"))
    checkCommit() = (rowText = sChangedText)

    exit function
ErrHndl:
    Test.Exception()
End Function

' for XUpdateBroadcaster
Sub UpdateComponent()
    oObj.Text = "_" + oObj.Text
    oObj.commit()
End Sub
</script:module>
