<?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="Form" script:language="StarBasic">REM =======================================================================================================================
REM ===					The Access2Base library is a part of the LibreOffice project.									===
REM ===					Full documentation is available on http://www.access2base.com									===
REM =======================================================================================================================

Option Compatible
Option ClassModule

Option Explicit

REM -----------------------------------------------------------------------------------------------------------------------
REM --- CLASS ROOT FIELDS 								        														---
REM -----------------------------------------------------------------------------------------------------------------------

Private	_Type					As String				&apos;	Must be FORM
Private	_Shortcut				As String
Private	_Name					As String
Private _DocEntry				As Integer				&apos;	Doc- and DbContainer entries in Root structure
Private _DbEntry				As Integer
Private	_IsLoaded				As Boolean
Private	_OpenArgs				As Variant
Private _OrderBy				As String
Public	Component				As Object				&apos;	com.sun.star.text.TextDocument
Public	ContainerWindow			As Object				&apos;	(No name)
Public	DatabaseForm			As Object				&apos;	com.sun.star.form.component.DataForm and com.sun.star.sdb.ResultSet (a.o.)

REM -----------------------------------------------------------------------------------------------------------------------
REM --- CONSTRUCTORS / DESTRUCTORS						        														---
REM -----------------------------------------------------------------------------------------------------------------------
Private Sub Class_Initialize()
	_Type = OBJFORM
	_Shortcut = &quot;&quot;
	_Name = &quot;&quot;
	_DocEntry = -1
	_DbEntry = -1
	_IsLoaded = False
	_OpenArgs = &quot;&quot;
	_OrderBy = &quot;&quot;
	Set Component = Nothing
	Set ContainerWindow = Nothing
	Set DatabaseForm = Nothing
End Sub		&apos;	Constructor

REM -----------------------------------------------------------------------------------------------------------------------
Private Sub Class_Terminate()
	On Local Error Resume Next
	Call Class_Initialize()
End Sub		&apos;	Destructor

REM -----------------------------------------------------------------------------------------------------------------------
Public Sub Dispose()
Dim ofForm As Object
	If Not IsLoaded(True) Then
		If Not IsNull(DatabaseForm) Then DatabaseForm.Dispose()
	End If
	Call Class_Terminate()
End Sub		&apos;	Explicit destructor

REM -----------------------------------------------------------------------------------------------------------------------
REM --- CLASS GET/LET/SET PROPERTIES					        														---
REM -----------------------------------------------------------------------------------------------------------------------
Property Get AllowAdditions() As Variant
	AllowAdditions = _PropertyGet(&quot;AllowAdditions&quot;)
End Property	&apos;	AllowAdditions (get)

Property Let AllowAdditions(ByVal pvValue As Variant)
	Call _PropertySet(&quot;AllowAdditions&quot;, pvValue)
End Property	&apos;	AllowAdditions (set)

REM -----------------------------------------------------------------------------------------------------------------------
Property Get AllowDeletions() As Variant
	AllowDeletions = _PropertyGet(&quot;AllowDeletions&quot;)
End Property	&apos;	AllowDeletions (get)

Property Let AllowDeletions(ByVal pvValue As Variant)
	Call _PropertySet(&quot;AllowDeletions&quot;, pvValue)
End Property	&apos;	AllowDeletions (set)

REM -----------------------------------------------------------------------------------------------------------------------
Property Get AllowEdits() As Variant
	AllowEdits = _PropertyGet(&quot;AllowEdits&quot;)
End Property	&apos;	AllowEdits (get)

Property Let AllowEdits(ByVal pvValue As Variant)
	Call _PropertySet(&quot;AllowEdits&quot;, pvValue)
End Property	&apos;	AllowEdits (set)

REM -----------------------------------------------------------------------------------------------------------------------
Property Get Bookmark() As Variant
	Bookmark = _PropertyGet(&quot;Bookmark&quot;)
End Property	&apos;	Bookmark (get)

Property Let Bookmark(ByVal pvValue As Variant)
	Call _PropertySet(&quot;Bookmark&quot;, pvValue)
End Property	&apos;	Bookmark (set)

REM -----------------------------------------------------------------------------------------------------------------------
Property Get Caption() As Variant
	Caption = _PropertyGet(&quot;Caption&quot;)
End Property	&apos;	Caption (get)

Property Let Caption(ByVal pvValue As Variant)
	Call _PropertySet(&quot;Caption&quot;, pvValue)
End Property	&apos;	Caption (set)

REM -----------------------------------------------------------------------------------------------------------------------
Property Get CurrentRecord() As Variant
	CurrentRecord = _PropertyGet(&quot;CurrentRecord&quot;)
End Property	&apos;	CurrentRecord (get)

Property Let CurrentRecord(ByVal pvValue As Variant)
	Call _PropertySet(&quot;CurrentRecord&quot;, pvValue)
End Property	&apos;	CurrentRecord (set)

REM -----------------------------------------------------------------------------------------------------------------------
Property Get Filter() As Variant
	Filter = _PropertyGet(&quot;Filter&quot;)
End Property	&apos;	Filter (get)

Property Let Filter(ByVal pvValue As Variant)
	Call _PropertySet(&quot;Filter&quot;, pvValue)
End Property	&apos;	Filter (set)

REM -----------------------------------------------------------------------------------------------------------------------
Property Get FilterOn() As Variant
	FilterOn = _PropertyGet(&quot;FilterOn&quot;)
End Property	&apos;	FilterOn (get)

Property Let FilterOn(ByVal pvValue As Variant)
	Call _PropertySet(&quot;FilterOn&quot;, pvValue)
End Property	&apos;	FilterOn (set)

REM -----------------------------------------------------------------------------------------------------------------------
Property Get Height() As Variant
	Height = _PropertyGet(&quot;Height&quot;)
End Property	&apos;	Height (get)

Property Let Height(ByVal pvValue As Variant)
	Call _PropertySet(&quot;Height&quot;, pvValue)
End Property	&apos;	Height (set)

REM -----------------------------------------------------------------------------------------------------------------------
Function IsLoaded(ByVal Optional pbForce As Boolean) As Boolean
&apos;Return True if form open
&apos;pbForce = True forbids bypass on value of _IsLoaded

	If _ErrorHandler() Then On Local Error Goto Error_Function
	Utils._SetCalledSub(&quot;Form.getIsLoaded&quot;)
	If IsMissing(pbForce) Then pbForce = False
	If ( Not pbForce ) And _IsLoaded Then			&apos;	For performance reasons, a form object, once detected as loaded, is presumed remaining loaded. Except if pbForce = True
		IsLoaded = True
		Goto Exit_Function
	End If
	IsLoaded = False
	
Dim oDoc As Object, oDatabase As Object, oEnum As Object, oDesk As Object, oComp As Object, bFound As Boolean
Dim i As Integer
	Set oDoc = _A2B_.CurrentDocument()
	Select Case oDoc.DbConnect
		Case DBCONNECTBASE
			Set oDesk = CreateUnoService(&quot;com.sun.star.frame.Desktop&quot;)
			Set oEnum = oDesk.Components().createEnumeration
			bFound = False
			Do While oEnum.hasMoreElements	And Not bFound			&apos;	Search in all open components if one corresponds with current form
				oComp = oEnum.nextElement
				If HasUnoInterfaces(oComp, &quot;com.sun.star.frame.XModule&quot;) Then
					If oComp.Identifier = &quot;com.sun.star.sdb.FormDesign&quot; Then
						For i = 0 To UBound(oComp.Args())
							If oComp.Args(i).Name = &quot;DocumentTitle&quot; Then
								bFound = ( oComp.Args(i).Value = _Name )
								If bFound Then
									_IsLoaded = True
									Set Component = oComp
									Exit For
								End If
							End If
						Next i
					End If
				End If
			Loop
		Case DBCONNECTFORM
			Set Component = oDoc.Document	&apos;	Form
			_IsLoaded = True				&apos;	Interactive form always loaded by design
	End Select
	Set oComp = Nothing
	IsLoaded = _IsLoaded

Exit_Function:
	Utils._ResetCalledSub(&quot;Form.getIsLoaded&quot;)
	Exit Function
Error_Function:
	TraceError(TRACEABORT, Err, &quot;Form.getIsLoaded&quot;, Erl)
	GoTo Exit_Function
End Function	&apos;	IsLoaded	V1.1.0

REM -----------------------------------------------------------------------------------------------------------------------
Property Get Name() As String
	Name = _PropertyGet(&quot;Name&quot;)
End Property	&apos;	Name (get)

Public Function pName() As String		&apos;	For compatibility with &lt; V0.9.0
	pName = _PropertyGet(&quot;Name&quot;)
End Function	&apos;	pName (get)

REM -----------------------------------------------------------------------------------------------------------------------
Property Get ObjectType() As String
	ObjectType = _PropertyGet(&quot;ObjectType&quot;)
End Property		&apos;	ObjectType (get)

REM -----------------------------------------------------------------------------------------------------------------------
Property Get OpenArgs() As Variant
	OpenArgs = _PropertyGet(&quot;OpenArgs&quot;)
End Property	&apos;	OpenArgs (get)

REM -----------------------------------------------------------------------------------------------------------------------
Property Get OrderBy() As Variant
	OrderBy = _PropertyGet(&quot;OrderBy&quot;)
End Property	&apos;	OrderBy (get) V1.2.0

Property Let OrderBy(ByVal pvValue As Variant)
	Call _PropertySet(&quot;OrderBy&quot;, pvValue)
End Property	&apos;	OrderBy (set)

REM -----------------------------------------------------------------------------------------------------------------------
Property Get OrderByOn() As Variant
	OrderByOn = _PropertyGet(&quot;OrderByOn&quot;)
End Property	&apos;	OrderByOn (get) V1.2.0

Property Let OrderByOn(ByVal pvValue As Variant)
	Call _PropertySet(&quot;OrderByOn&quot;, pvValue)
End Property	&apos;	OrderByOn (set)

REM -----------------------------------------------------------------------------------------------------------------------
Public Function OptionGroup(ByVal Optional pvGroupName As Variant) As Variant
&apos;	Return either an error or an object of type OPTIONGROUP based on its name

Const cstThisSub = &quot;Form.OptionGroup&quot;
Dim ogGroup As Object
	Utils._SetCalledSub(cstThisSub)
	If IsMissing(pvGroupName) Then Call _TraceArguments()
	If _ErrorHandler() Then On Local Error Goto Error_Function
	
	Set ogGroup = _OptionGroup(pvGroupName, CTLPARENTISFORM, Component, DatabaseForm)
	If Not IsNull(ogGroup) Then
		ogGroup._DocEntry = _DocEntry
		ogGroup._DbEntry = _DbEntry
	End If
	Set OptionGroup = ogGroup
	
Exit_Function:
	Utils._ResetCalledSub(cstThisSub)
	Exit Function
Error_Function:
	TraceError(TRACEABORT, Err, Form.OptionGroup, Erl)
	GoTo Exit_Function
End Function		&apos;	OptionGroup	V1.1.0

REM -----------------------------------------------------------------------------------------------------------------------
Public Function Properties(ByVal Optional pvIndex As Variant) As Variant
&apos;	Return
&apos;		a Collection object if pvIndex absent
&apos;		a Property object otherwise

Dim vProperty As Variant, vPropertiesList() As Variant, sObject As String
	vPropertiesList = _PropertiesList()
	sObject = Utils._PCase(_Type)
	If IsMissing(pvIndex) Then
		vProperty = PropertiesGet._Properties(sObject, _Name, vPropertiesList)
	Else
		vProperty = PropertiesGet._Properties(sObject, _Name, vPropertiesList, pvIndex)
		vProperty._Value = _PropertyGet(vPropertiesList(pvIndex))
	End If
	
Exit_Function:
	Set Properties = vProperty
	Exit Function
End Function	&apos;	Properties

REM -----------------------------------------------------------------------------------------------------------------------
Property Get Recordset() As Object
	Recordset = _PropertyGet(&quot;Recordset&quot;)
End Property		&apos;	Recordset (get)	V0.9.5

REM -----------------------------------------------------------------------------------------------------------------------
Property Get RecordSource() As Variant
	RecordSource = _PropertyGet(&quot;RecordSource&quot;)
End Property	&apos;	RecordSource (get)

Property Let RecordSource(ByVal pvValue As Variant)
	Call _PropertySet(&quot;RecordSource&quot;, pvValue)
End Property	&apos;	RecordSource (set)

REM -----------------------------------------------------------------------------------------------------------------------
Property Get Visible() As Variant
	Visible = _PropertyGet(&quot;Visible&quot;)
End Property	&apos;	Visible (get)

Property Let Visible(ByVal pvValue As Variant)
	Call _PropertySet(&quot;Visible&quot;, pvValue)
End Property	&apos;	Visible (set)

REM -----------------------------------------------------------------------------------------------------------------------
Property Get Width() As Variant
	Width = _PropertyGet(&quot;Width&quot;)
End Property	&apos;	Width (get)

Property Let Width(ByVal pvValue As Variant)
	Call _PropertySet(&quot;Width&quot;, pvValue)
End Property	&apos;	Width (set)

REM -----------------------------------------------------------------------------------------------------------------------
REM --- CLASS METHODS	 								        														---
REM -----------------------------------------------------------------------------------------------------------------------

Public Function mClose() As Variant
&apos;	Close the form

If _ErrorHandler() Then On Local Error Goto Error_Function
	Utils._SetCalledSub(&quot;Form.Close&quot;)
	mClose = False
Dim oDatabase As Object, oController As Object
	Set oDatabase = Application._CurrentDb()
	If oDatabase._DbConnect &lt;&gt; DBCONNECTBASE Then Goto Error_NotApplicable

	Set oController = oDatabase.Document.getFormDocuments.getByName(_Name)
	oController.close()
	Dispose()
	mClose = True

Exit_Function:
	Utils._ResetCalledSub(&quot;Form.Close&quot;)
	Exit Function
Error_NotApplicable:
	TraceError(TRACEFATAL, ERRMETHOD, Utils._CalledSub(), 0, 1, cstThisSub)
	Goto Exit_Function
Error_Function:
	TraceError(TRACEABORT, Err, &quot;Form.Close&quot;, Erl)
	GoTo Exit_Function
End Function

REM -----------------------------------------------------------------------------------------------------------------------
Public Function Controls(Optional ByVal pvIndex As Variant) As Variant
&apos;	Return a Control object with name or index = pvIndex

If _ErrorHandler() Then On Local Error Goto Error_Function
	Utils._SetCalledSub(&quot;Form.Controls&quot;)

Dim ocControl As Variant, sParentShortcut As String, iControlCount As Integer
Dim oCounter As Variant, sControls() As Variant, i As Integer, bFound As Boolean, sIndex As String
Dim j As Integer

	Set ocControl = Nothing
	If Not IsLoaded Then Goto Trace_Error_NotOpen
	Set ocControl = New Control
	ocControl._ParentType = CTLPARENTISFORM
	sParentShortcut = _Shortcut
	iControlCount = DatabaseForm.getCount()
	
	If IsMissing(pvIndex) Then					&apos;	No argument, return Collection pseudo-object
		Set oCounter = New Collect
		oCounter._CollType = COLLCONTROLS
		oCounter._ParentType = OBJFORM
		oCounter._ParentName = _Name
		oCounter._Count = iControlCount
		Set Controls = oCounter
		Goto Exit_Function
	End If
	
	If Not Utils._CheckArgument(pvIndex, 1, Utils._AddNumeric(vbString)) Then Goto Exit_Function
				
	&apos;	Start building the ocControl object
	&apos;	Determine exact name
	sControls() = DatabaseForm.getElementNames()
	
	Select Case VarType(pvIndex)
		Case vbInteger, vbLong, vbSingle, vbDouble, vbCurrency, vbBigint, vbDecimal
			If pvIndex &lt; 0 Or pvIndex &gt; iControlCount - 1 Then Goto Trace_Error_Index
			ocControl._Name = sControls(pvIndex)
		Case vbString			&apos;	Check control name validity (non case sensitive)
			bFound = False
			sIndex = UCase(Utils._Trim(pvIndex))
			For i = 0 To iControlCount - 1
				If UCase(sControls(i)) = sIndex Then
					bFound = True
					Exit For
				End If
			Next i
			If bFound Then ocControl._Name = sControls(i) Else Goto Trace_NotFound
	End Select

	ocControl._Shortcut = sParentShortcut &amp; &quot;!&quot; &amp; Utils._Surround(ocControl._Name)
	Set ocControl.ControlModel = DatabaseForm.getByName(ocControl._Name)
	ocControl._ImplementationName = ocControl.ControlModel.getImplementationName()
	ocControl._FormComponent = Component
	If Utils._hasUNOProperty(ocControl.ControlModel, &quot;ClassId&quot;) Then ocControl._ClassId = ocControl.ControlModel.ClassId
	If ocControl._ClassId &gt; 0 And ocControl._ClassId &lt;&gt; acHiddenControl Then
		Set ocControl.ControlView = Component.CurrentController.getControl(ocControl.ControlModel)
	End If

	ocControl._Initialize()
	ocControl._DocEntry = _DocEntry
	ocControl._DbEntry = _DbEntry
	Set Controls = ocControl
	
Exit_Function:
	Utils._ResetCalledSub(&quot;Form.Controls&quot;)
	Exit Function
Trace_Error_NotOpen:
	TraceError(TRACEFATAL, ERRFORMNOTOPEN, Utils._CalledSub(), 0, , _Name)
	Set Controls = Nothing
	Goto Exit_Function
Trace_Error_Index:
	TraceError(TRACEFATAL, ERRCOLLECTION, Utils._CalledSub(), 0, 1)
	Set Controls = Nothing
	Goto Exit_Function
Trace_NotFound:
	TraceError(TRACEFATAL, ERRCONTROLNOTFOUND, Utils._CalledSub(), 0, , Array(pvIndex, pvIndex))
	Set Controls = Nothing
	Goto Exit_Function
Error_Function:
	TraceError(TRACEABORT, Err, &quot;Form.Controls&quot;, Erl)
	Set Controls = Nothing
	GoTo Exit_Function
End Function		&apos;	Controls

REM -----------------------------------------------------------------------------------------------------------------------
Public Function CurrentDb() As Object
&apos;	Returns Database object related to current form

Const cstThisSub = &quot;Form.CurrentDb&quot;
	Utils._SetCalledSub(cstThisSub)

	Set CurrentDb = Application._CurrentDb(_DocEntry, _DbEntry)

Exit_Function:
	Utils._ResetCalledSub(cstThisSub)
	Exit Function
End Function	&apos;	CurrentDb		V1.1.0

REM -----------------------------------------------------------------------------------------------------------------------
Public Function getProperty(Optional ByVal pvProperty As Variant) As Variant
&apos;	Return property value of psProperty property name

	Utils._SetCalledSub(&quot;Form.getProperty&quot;)
	If IsMissing(pvProperty) Then Call _TraceArguments()
	getProperty = _PropertyGet(pvProperty)
	Utils._ResetCalledSub(&quot;Form.getProperty&quot;)
	
End Function		&apos;	getProperty

REM -----------------------------------------------------------------------------------------------------------------------
Public Function hasProperty(ByVal Optional pvProperty As Variant) As Boolean
&apos;	Return True if object has a valid property called pvProperty (case-insensitive comparison !)

	If IsMissing(pvProperty) Then hasProperty = PropertiesGet._hasProperty(_Type, _PropertiesList()) Else hasProperty = PropertiesGet._hasProperty(_Type, _PropertiesList(), pvProperty)
	Exit Function
	
End Function	&apos;	hasProperty

REM -----------------------------------------------------------------------------------------------------------------------
Public Function Move(	  ByVal Optional pvLeft As Variant _
						, ByVal Optional pvTop As Variant _
						, ByVal Optional pvWidth As Variant _
						, ByVal Optional pvHeight As Variant _
						) As Variant
&apos;	Execute Move method
	Utils._SetCalledSub(&quot;Form.Move&quot;)
	If IsMissing(pvLeft) Then Call _TraceArguments()
	If _ErrorHandler() Then On Local Error Goto Error_Function
	Move = False
Dim iArgNr As Integer
	Select Case UCase(_A2B_.CalledSub)
		Case UCase(&quot;Move&quot;)				:	iArgNr = 1
		Case UCase(&quot;Form.Move&quot;)			:	iArgNr = 0
	End Select
	If IsMissing(pvLeft) Then Call _TraceArguments()
	If IsMissing(pvTop) Then pvTop = -1
	If IsMissing(pvWidth) Then pvWidth = -1
	If IsMissing(pvHeight) Then pvHeight = -1
	If Not Utils._CheckArgument(pvLeft,	iArgNr + 1, Utils._AddNumeric()) Then Goto Exit_Function
	If Not Utils._CheckArgument(pvTop,	iArgNr + 2, Utils._AddNumeric()) Then Goto Exit_Function
	If Not Utils._CheckArgument(pvWidth,	iArgNr + 3, Utils._AddNumeric()) Then Goto Exit_Function
	If Not Utils._CheckArgument(pvHeight, iArgNr + 4, Utils._AddNumeric()) Then Goto Exit_Function
	
Dim iArg As Integer, iWrong As Integer		&apos;	Check arguments values
	iArg = 0
	If pvHeight &lt; -1 Then
		iArg = 4		:		iWrong = pvHeight
	ElseIf pvWidth &lt; -1 Then
		iArg = 3		:		iWrong = pvWidth
	ElseIf pvTop &lt; -1 Then
		iArg = 2		:		iWrong = pvTop
	ElseIf pvLeft &lt; -1 Then
		iArg = 1		:		iWrong = pvLeft
	End If
	If iArg &gt; 0 Then
		TraceError(TRACEFATAL, ERRWRONGARGUMENT, Utils._CalledSub(), 0, 1, Array(iArgNr + iArg, iWrong))
		Goto Exit_Function
	End If
	
Dim iPosSize As Integer
	iPosSize = 0
	If pvLeft &gt;= 0		Then iPosSize = iPosSize + com.sun.star.awt.PosSize.X
	If pvTop &gt;= 0		Then iPosSize = iPosSize + com.sun.star.awt.PosSize.Y
	If pvWidth &gt; 0		Then iPosSize = iPosSize + com.sun.star.awt.PosSize.WIDTH
	If pvHeight &gt; 0		Then iPosSize = iPosSize + com.sun.star.awt.PosSize.HEIGHT
	If iPosSize &gt; 0 Then
		If Utils._hasUNOProperty(ContainerWindow, &quot;IsMaximized&quot;) Then	&apos;	Ignored when &lt;= OO3.2
			ContainerWindow.IsMaximized = False
			ContainerWindow.IsMinimized = False
		End If
		ContainerWindow.setPosSize(pvLeft, pvTop, pvWidth, pvHeight, iPosSize)
	End If
	Move = True
	
Exit_Function:
	Utils._ResetCalledSub(&quot;Form.Move&quot;)
	Exit Function
Error_Function:
	TraceError(TRACEABORT, Err, &quot;Form.Move&quot;, Erl)
	GoTo Exit_Function
End Function		&apos;	Move

REM -----------------------------------------------------------------------------------------------------------------------
Public Function Refresh() As Boolean
&apos;	Refresh data with its most recent value in the database in a form or subform
	Utils._SetCalledSub(&quot;Form.Refresh&quot;)
	If _ErrorHandler() Then On Local Error Goto Error_Function
	Refresh = False

Dim oSet As Object	
	Set oSet = DatabaseForm.createResultSet()
	If Not IsNull(oSet) Then
		oSet.refreshRow()
		Refresh = True
	End If

Exit_Function:
	Set oSet = Nothing
	Utils._ResetCalledSub(&quot;Form.Refresh&quot;)
	Exit Function
Error_Function:
	TraceError(TRACEABORT, Err, &quot;SubForm.Refresh&quot;, Erl)
	GoTo Exit_Function
End Function	&apos;	Refresh

REM -----------------------------------------------------------------------------------------------------------------------
Public Function Requery() As Boolean
&apos;	Refresh data displayed in a form, subform, combobox or listbox
	Utils._SetCalledSub(&quot;Form.Requery&quot;)
	If _ErrorHandler() Then On Local Error Goto Error_Function
	Requery = False

	DatabaseForm.reload()
	Requery = True	

Exit_Function:
	Utils._ResetCalledSub(&quot;Form.Requery&quot;)
	Exit Function
Error_Function:
	TraceError(TRACEABORT, Err, &quot;Form.Requery&quot;, Erl)
	GoTo Exit_Function
End Function	&apos;	Requery

REM -----------------------------------------------------------------------------------------------------------------------
Public Function setFocus() As Boolean
&apos;	Execute setFocus method
Const cstThisSub = &quot;Form.setFocus&quot;
	Utils._SetCalledSub(cstThisSub)
	If _ErrorHandler() Then On Local Error Goto Error_Function
	setFocus = False

	With ContainerWindow
		If .isVisible() = False Then .setVisible(True)
		.IsMinimized = False
		.setFocus()
		.setEnable(True)		&apos;	Added to try to bypass desynchro issue in Linux
		.toFront()				&apos;	Added to force window change in Linux
	End With
	setFocus = True
	
Exit_Function:
	Utils._ResetCalledSub(cstThisSub)
	Exit Function
Error_Function:
	TraceError(TRACEABORT, Err, cstThisSub, Erl)
	Goto Exit_Function
End Function	&apos;	setFocus	V1.1.0

REM -----------------------------------------------------------------------------------------------------------------------
Public Function setProperty(ByVal Optional psProperty As String, ByVal Optional pvValue As Variant) As Boolean
&apos;	Return True if property setting OK
	Utils._SetCalledSub(&quot;Form.setProperty&quot;)
	setProperty = _PropertySet(psProperty, pvValue)
	Utils._ResetCalledSub(&quot;Form.setProperty&quot;)
End Function

REM -----------------------------------------------------------------------------------------------------------------------
REM --- PRIVATE FUNCTIONS 								        														---
REM -----------------------------------------------------------------------------------------------------------------------
Public Sub _Initialize(psName As String)
&apos;	Set pointers to UNO objects

Dim oDoc As Object, oFormsCollection As Object, oDatabase As Object
	If _ErrorHandler() Then On Local Error Goto Trace_Error
	_Name = psName
	_Shortcut = &quot;Forms!&quot; &amp; Utils._Surround(psName)
	If IsLoaded Then
		Set oDoc = _A2B_.CurrentDocument()
		Select Case oDoc.DbConnect
			Case DBCONNECTBASE
				If Not IsNull(Component.CurrentController) Then		&apos;	A form opened then closed afterwards keeps a Component attribute
					Set ContainerWindow = Component.CurrentController.Frame.ContainerWindow
					Set oFormsCollection = Component.getDrawPage.Forms
					If oFormsCollection.hasByName(&quot;MainForm&quot;) Then
						Set DatabaseForm = oFormsCollection.getByName(&quot;MainForm&quot;)
					ElseIf oFormsCollection.hasByName(&quot;Form&quot;) Then
						Set DatabaseForm = oFormsCollection.getByName(&quot;Form&quot;)
					ElseIf oFormsCollection.hasByName(_Name) Then
						Set DatabaseForm = oFormsCollection.getByName(_Name)
					Else
						Goto Trace_Internal_Error
					End If
				End If
			Case DBCONNECTFORM
				Set ContainerWindow = oDoc.Document.CurrentController.Frame.ContainerWindow
				Set oDatabase = Application._CurrentDb(_DocEntry, _DbEntry)
				With oDatabase
					Set DatabaseForm = .Form
					If IsNull(.Connection) Then
						Set .Connection = DatabaseForm.ActiveConnection
						If Not IsNull(.Connection) Then
							Set .MetaData = .Connection.MetaData
							oDatabase._ReadOnly = .Connection.isReadOnly()
						End If
					End If
				End With
		End Select
		_OrderBy = DatabaseForm.Order
	Else
		Set Component = Nothing
		Set ContainerWindow = Nothing
		Set DatabaseForm = Nothing
	End If
	
Exit_Sub:
	Exit Sub
Trace_Error:
	TraceError(TRACEABORT, Err, &quot;Form.Initialize&quot;, Erl)
	Goto Exit_Sub
Trace_Internal_Error:
	TraceError(TRACEABORT, ERRFORMNOTIDENTIFIED, Utils._CalledSub(), 0, , _Name)
	Goto Exit_Sub
End Sub			&apos;	_Initialize		V1.1.0

REM -----------------------------------------------------------------------------------------------------------------------
Private Function _PropertiesList() As Variant

	If IsLoaded Then
		_PropertiesList =  Array(&quot;AllowAdditions&quot;, &quot;AllowDeletions&quot;, &quot;AllowEdits&quot;, &quot;Bookmark&quot; _
										, &quot;Caption&quot;, &quot;CurrentRecord&quot;, &quot;Filter&quot;, &quot;FilterOn&quot;, &quot;Height&quot;, &quot;IsLoaded&quot; _
										, &quot;Name&quot;, &quot;ObjectType&quot;, &quot;OpenArgs&quot;, &quot;OrderBy&quot;, &quot;OrderByOn&quot; _
										, &quot;RecordSource&quot;, &quot;Visible&quot;, &quot;Width&quot; _
									)	&apos;	Recordset removed
	Else
		 _PropertiesList = Array(&quot;IsLoaded&quot;, &quot;Name&quot; _
									)
	End If
	
End Function	&apos;	_PropertiesList

REM -----------------------------------------------------------------------------------------------------------------------
Private Function _PropertyGet(ByVal psProperty As String) As Variant
&apos;	Return property value of the psProperty property name

	If _ErrorHandler() Then On Local Error Goto Error_Function
	Utils._SetCalledSub(&quot;Form.get&quot; &amp; psProperty)
	
&apos;Execute
Dim oDatabase As Object, vBookmark As Variant, vEMPTY As Variant
Dim oObject As Object
	_PropertyGet = vEMPTY

	Select Case UCase(psProperty)
		Case UCase(&quot;Name&quot;), UCase(&quot;IsLoaded&quot;)
		Case Else		:	If Not IsLoaded Then Goto Trace_Error_Form
	End Select
	Select Case UCase(psProperty)
		Case UCase(&quot;AllowAdditions&quot;)
			_PropertyGet = DatabaseForm.AllowInserts
		Case UCase(&quot;AllowDeletions&quot;)
			_PropertyGet = DatabaseForm.AllowDeletes
		Case UCase(&quot;AllowEdits&quot;)
			_PropertyGet = DatabaseForm.AllowUpdates
		Case UCase(&quot;Bookmark&quot;)
			On Local Error Resume Next			&apos;	Disable error handler because bookmarking does not always react well in events ...
			If DatabaseForm.IsBookmarkable Then vBookmark = DatabaseForm.getBookmark() Else vBookmark = Nothing
			If _ErrorHandler() Then On Local Error Goto Error_Function Else On Local Error Goto 0
			If IsNull(vBookmark) Then Goto Trace_Error
			_PropertyGet = vBookmark
		Case UCase(&quot;Caption&quot;)
			Set odatabase = Application._CurrentDb(_DocEntry, _DbEntry)
			Select Case oDatabase._DbConnect
				Case DBCONNECTFORM		:	_PropertyGet = oDatabase.Document.CurrentController.Frame.Title
				Case DBCONNECTBASE		:	_PropertyGet = Component.CurrentController.Frame.Title
			End Select
		Case UCase(&quot;CurrentRecord&quot;)
			_PropertyGet = DatabaseForm.Row
		Case UCase(&quot;Filter&quot;)
			_PropertyGet = DatabaseForm.Filter
		Case UCase(&quot;FilterOn&quot;)
			_PropertyGet = DatabaseForm.ApplyFilter
		Case UCase(&quot;Height&quot;)
			_PropertyGet = ContainerWindow.getPosSize().Height
		Case UCase(&quot;IsLoaded&quot;)		&apos;	Only for indirect access from property object
			_PropertyGet = IsLoaded
		Case UCase(&quot;Name&quot;)
			_PropertyGet = _Name
		Case UCase(&quot;ObjectType&quot;)
			_PropertyGet = _Type
		Case UCase(&quot;OpenArgs&quot;)
			_PropertyGet = _OpenArgs
		Case UCase(&quot;OrderBy&quot;)
			_PropertyGet = _OrderBy
		Case UCase(&quot;OrderByOn&quot;)
			If DatabaseForm.Order = &quot;&quot; Then _PropertyGet = False Else _PropertyGet = True
		Case UCase(&quot;Recordset&quot;)
			If DatabaseForm.Command = &quot;&quot; Then Goto Trace_Error		&apos;	No underlying data ??
			Set oObject = New Recordset
			With DatabaseForm
				oObject._CommandType = .CommandType
				oObject._Command = .Command
				oObject._ParentName = _Name
				oObject._ParentType = _Type
				Set oDatabase = Application._CurrentDb(_DocEntry, _DbEntry)
				Set oObject._ParentDatabase = oDatabase
				Set oObject._ParentDatabase.Connection = .ActiveConnection
				oObject._ForwardOnly = ( .ResultSetType = com.sun.star.sdbc.ResultSetType.FORWARD_ONLY )
				oObject._PassThrough = ( .EscapeProcessing = False )
				oObject._ReadOnly = ( .ResultSetConcurrency = com.sun.star.sdbc.ResultSetConcurrency.READ_ONLY )
				Call oObject._Initialize()
			End With
			With oDatabase
				.RecordsetMax = .RecordsetMax + 1
				oObject._Name = Format(.RecordsetMax, &quot;0000000&quot;)
				.RecordsetsColl.Add(oObject, UCase(oObject._Name))
			End With
			If Not ( oObject._BOF And oObject._EOF ) Then oObject.MoveFirst()		&apos;	Do nothing if resultset empty
			Set _PropertyGet = oObject
		Case UCase(&quot;RecordSource&quot;)
			_PropertyGet = DatabaseForm.ActiveCommand
		Case UCase(&quot;Visible&quot;)
			_PropertyGet = ContainerWindow.IsVisible()
		Case UCase(&quot;Width&quot;)
			_PropertyGet = ContainerWindow.getPosSize().Width
		Case Else
			Goto Trace_Error
	End Select
	
Exit_Function:
	Utils._ResetCalledSub(&quot;Form.get&quot; &amp; psProperty)
	Exit Function
Trace_Error:
	TraceError(TRACEWARNING, ERRPROPERTY, Utils._CalledSub(), 0, 1, psProperty)
	_PropertyGet = vEMPTY
	Goto Exit_Function
Trace_Error_Form:
	TraceError(TRACEFATAL, ERRFORMNOTOPEN, Utils._CalledSub(), 0, 1, _Name)
	_PropertyGet = vEMPTY
	Goto Exit_Function
Error_Function:
	TraceError(TRACEABORT, Err, &quot;Form._PropertyGet&quot;, Erl)
	_PropertyGet = vEMPTY
	GoTo Exit_Function
End Function		&apos;	_PropertyGet

REM -----------------------------------------------------------------------------------------------------------------------
Private Function _PropertySet(ByVal psProperty As String, ByVal pvValue As Variant) As Boolean

	Utils._SetCalledSub(&quot;Form.set&quot; &amp; psProperty)
	If _ErrorHandler() Then On Local Error Goto Error_Function
	_PropertySet = True

&apos;Execute
Dim iArgNr As Integer
Dim oDatabase As Object

	If _Isleft(_A2B_.CalledSub, &quot;Form.&quot;) Then iArgNr = 1 Else iArgNr = 2
	If Not IsLoaded Then Goto Trace_Error_Form
	Select Case UCase(psProperty)
		Case UCase(&quot;AllowAdditions&quot;)
			If Not Utils._CheckArgument(pvValue, iArgNr, vbBoolean, , False) Then Goto Trace_Error_Value
			DatabaseForm.AllowInserts = pvValue
			DatabaseForm.reload()
		Case UCase(&quot;AllowDeletions&quot;)
			If Not Utils._CheckArgument(pvValue,iArgNr, vbBoolean, , False) Then Goto Trace_Error_Value
			DatabaseForm.AllowDeletes = pvValue
			DatabaseForm.reload()
		Case UCase(&quot;AllowEdits&quot;)
			If Not Utils._CheckArgument(pvValue, iArgNr, vbBoolean, , False) Then Goto Trace_Error_Value
			DatabaseForm.AllowUpdates = pvValue
			DatabaseForm.reload()
		Case UCase(&quot;Bookmark&quot;)
			If Not Utils._CheckArgument(pvValue, iArgNr, Utils._AddNumeric(vbObject), , False) Then Goto Trace_Error_Value
			If IsNull(pvValue) Then Goto Trace_Error_Value
			DatabaseForm.MoveToBookmark(pvValue)
		Case UCase(&quot;Caption&quot;)
			If Not Utils._CheckArgument(pvValue, iArgNr, vbString, , False) Then Goto Trace_Error_Value
			Set oDatabase = Application._CurrentDb(_DocEntry, _DbEntry)
			Select Case oDatabase._DbConnect
				Case DBCONNECTFORM		:	oDatabase.Document.CurrentController.Frame.Title = pvValue
				Case DBCONNECTBASE		:	Component.CurrentController.Frame.Title = pvValue
			End Select
		Case UCase(&quot;CurrentRecord&quot;)
			If Not Utils._CheckArgument(pvValue, iArgNr, Utils._AddNumeric(), , False) Then Goto Trace_Error_Value
			If pvValue &lt; 1 Then Goto Trace_Error_Value
			DatabaseForm.absolute(pvValue)
		Case UCase(&quot;Filter&quot;)
			If Not Utils._CheckArgument(pvValue, iArgNr, vbString, , False) Then Goto Trace_Error_Value
			DatabaseForm.Filter = Application._CurrentDb(_DocEntry, _DbEntry)._ReplaceSquareBrackets(pvValue)
		Case UCase(&quot;FilterOn&quot;)
			If Not Utils._CheckArgument(pvValue, iArgNr, vbBoolean, , False) Then Goto Trace_Error_Value
			DatabaseForm.ApplyFilter = pvValue
			DatabaseForm.reload()
		Case UCase(&quot;Height&quot;)
			If Not Utils._CheckArgument(pvValue, iArgNr, Utils._AddNumeric(), , False) Then Goto Trace_Error_Value
			If Utils._hasUNOProperty(ContainerWindow, &quot;IsMaximized&quot;) Then	&apos;	Ignored when &lt;= OO3.2
				ContainerWindow.IsMaximized = False
				ContainerWindow.IsMinimized = False
			End If
			ContainerWindow.setPosSize(0, 0, 0, pvValue, com.sun.star.awt.PosSize.HEIGHT)
		Case UCase(&quot;OrderBy&quot;)
			If Not Utils._CheckArgument(pvValue, iArgNr, vbString, , False) Then Goto Trace_Error_Value
			_OrderBy = Application._CurrentDb(_DocEntry, _DbEntry)._ReplaceSquareBrackets(pvValue)
		Case UCase(&quot;OrderByOn&quot;)
			If Not Utils._CheckArgument(pvValue, iArgNr, vbBoolean, , False) Then Goto Trace_Error_Value
			If pvValue Then DatabaseForm.Order = _OrderBy Else DatabaseForm.Order = &quot;&quot;
			DatabaseForm.reload()
		Case UCase(&quot;RecordSource&quot;)
			If Not Utils._CheckArgument(pvValue, iArgNr, vbString, , False) Then Goto Trace_Error_Value
			DatabaseForm.Command = Application._CurrentDb(_DocEntry, _DbEntry)._ReplaceSquareBrackets(pvValue)
			DatabaseForm.CommandType = com.sun.star.sdb.CommandType.COMMAND
			DatabaseForm.Filter = &quot;&quot;
			DatabaseForm.reload()
		Case UCase(&quot;Visible&quot;)
			If Not Utils._CheckArgument(pvValue, iArgNr, vbBoolean, , False) Then Goto Trace_Error_Value
			ContainerWindow.setVisible(pvValue)
		Case UCase(&quot;Width&quot;)
			If Not Utils._CheckArgument(pvValue, iArgNr, Utils._AddNumeric()) Then Goto Trace_Error_Value
			If Utils._hasUNOProperty(ContainerWindow, &quot;IsMaximized&quot;) Then	&apos;	Ignored when &lt;= OO3.2
				ContainerWindow.IsMaximized = False
				ContainerWindow.IsMinimized = False
			End If
			ContainerWindow.setPosSize(0, 0,  pvValue, 0, com.sun.star.awt.PosSize.WIDTH)
		Case Else
			Goto Trace_Error
	End Select

Exit_Function:
	Utils._ResetCalledSub(&quot;Form.set&quot; &amp; psProperty)
	Exit Function
Trace_Error_Form:
	TraceError(TRACEFATAL, ERRFORMNOTOPEN, Utils._CalledSub(), 0, 1, _Name)
	_PropertySet = False
	Goto Exit_Function
Trace_Error:
	TraceError(TRACEFATAL, ERRPROPERTY, Utils._CalledSub(), 0, 1, psProperty)
	_PropertySet = False
	Goto Exit_Function
Trace_Error_Value:
	TraceError(TRACEFATAL, ERRPROPERTYVALUE, Utils._CalledSub(), 0, 1, Array(pvValue, psProperty))
	_PropertySet = False
	Goto Exit_Function
Error_Function:
	TraceError(TRACEABORT, Err, &quot;Form._PropertySet&quot;, Erl)
	_PropertySet = False
	GoTo Exit_Function
End Function		&apos;	_PropertySet
</script:module>