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

Global oForm As Object


Sub CreateObj()

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

    bOK = true

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

    oShape = toolkittools.addControlToDefaultForm("RadioButton", 1000, 1000, 2000, 1000)
    oObj = oShape.getControl()
    oShape = toolkittools.addControlToDefaultForm("RadioButton", 1000, 3000, 2000, 1000)
    oComponentInstance = oShape.getControl()
    oShape = toolkittools.addControlToDefaultForm("RadioButton", 1000, 5000, 2000, 1000)
    oPersistInstance = oShape.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 = "Custom3"

    oForm.load()
    
    ' for XUpdateBroadcaster
    bCustomUpdate = true

Exit Sub
ErrHndl:
    Test.Exception()
End Sub

Global aChangedVal As String

' for XBoundComponent
Sub prepareCommit() 
On Error Goto ErrHndl
    Out.Log("prepareCommit() called.")
    aChangedVal = 1 - oObj.State
    oObj.State = aChangedVal
    
    exit sub
ErrHndl:
    Test.Exception()
End Sub

' for XBoundComponent
Function checkCommit() As Boolean
On Error Goto ErrHndl
    Out.Log("checkCommit() called.")
    Dim rowVal As Variant
    
    rowVal = oForm.getBoolean(oForm.findColumn("Custom3"))
    if rowVal = true then
        checkCommit() = (aChangedVal = 1)  
    else
        checkCommit() = (aChangedVal = 0)
    end if

    exit function
ErrHndl:
    Test.Exception()
End Function

' for XUpdateBroadcaster
Sub UpdateComponent()
    oObj.State = 1 - oObj.State
    oObj.commit()
End Sub
</script:module>
