<?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="SF_FormDocument" script:language="StarBasic" script:moduleType="normal">REM =======================================================================================================================
REM ===			The ScriptForge library and its associated libraries are part of the LibreOffice project.				===
REM	===						The SFDocuments library is one of the associated libraries.									===
REM ===					Full documentation is available on https://help.libreoffice.org/								===
REM =======================================================================================================================

Option Compatible
Option ClassModule

Option Explicit

&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;
&apos;&apos;&apos;	SF_FormDocument
&apos;&apos;&apos;	===============
&apos;&apos;&apos;
&apos;&apos;&apos;		The SFDocuments library gathers a number of methods and properties making easy
&apos;&apos;&apos;		managing and manipulating LibreOffice documents
&apos;&apos;&apos;
&apos;&apos;&apos;		Some methods are generic for all types of documents: they are combined in the SF_Document module.
&apos;&apos;&apos;		Specific properties and methods are implemented in the concerned subclass(es) SF_Calc, SF_Writer, SF_Base, ...
&apos;&apos;&apos;
&apos;&apos;&apos;		To workaround the absence of class inheritance in LibreOffice Basic, some redundancy is necessary
&apos;&apos;&apos;		Each subclass MUST implement also the generic methods and properties, even if they only call
&apos;&apos;&apos;		the parent methods and properties.
&apos;&apos;&apos;		They should also duplicate some generic private members as a subset of their own set of members
&apos;&apos;&apos;
&apos;&apos;&apos;		The SF_FormDocument module is focused on :
&apos;&apos;&apos;			The orchestration of Base form documents (aka Base Forms, but this is confusing)
&apos;&apos;&apos;			and the identification of and the access to their controls.
&apos;&apos;&apos;			Form documents are always contained in a Base document.
&apos;&apos;&apos;			They should not be confused with Writer documents containing forms,
&apos;&apos;&apos;			even if it is easy to convert the former to the latter.
&apos;&apos;&apos;
&apos;&apos;&apos;		The current module is closely related to
&apos;&apos;&apos;			the &quot;Base&quot; service of the current library
&apos;&apos;&apos;			the &quot;Database&quot; service of the SFDatabases library
&apos;&apos;&apos;
&apos;&apos;&apos;		A form document may be opened either:
&apos;&apos;&apos;			via code or user interface from the Base file welcome page
&apos;&apos;&apos;			via code only, without having its Base container opened first
&apos;&apos;&apos;				The Base document remains hidden but the user might be prompted about the macro execution mode
&apos;&apos;&apos;		In any mode, a form document can be opened only in 1 single copy
&apos;&apos;&apos;
&apos;&apos;&apos;		Service invocation examples:
&apos;&apos;&apos;			1) From the Base service
&apos;&apos;&apos;				Dim oBase As Object, oFormDoc As Object
&apos;&apos;&apos;				&apos;	oBase is presumed to represent an open Base document
&apos;&apos;&apos;				Set oFormDoc = oBade.OpenFormDocument(&quot;Folder1/Form1&quot;)
&apos;&apos;&apos;			2) Directly without making the Base document visible
&apos;&apos;&apos;				Dim oDatabase As Object, oFormDoc As Object
&apos;&apos;&apos;				Set oDatabase = CreateScriptService(&quot;SFDatabases.Database&quot;, &quot;.../myFile.odb&quot;, ReadOnly := False)
&apos;&apos;&apos;				&apos; The substring &quot;SFDatabases.&quot; in the service name is optional
&apos;&apos;&apos;				Set oFormDoc = oDatabase.OpenFormDocument(&quot;Folder1/Form1&quot;)
&apos;&apos;&apos;
&apos;&apos;&apos;		Definitions: 
&apos;&apos;&apos;			None
&apos;&apos;&apos;
&apos;&apos;&apos;		Detailed user documentation:
&apos;&apos;&apos;			https://help.libreoffice.org/latest/en-US/text/sbasic/shared/03/sf_formdocument.html?DbPAR=BASIC
&apos;&apos;&apos;
&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;

REM ================================================================== EXCEPTIONS

Private Const BASEFORMNOTFOUNDERROR	=	&quot;BASEFORMNOTFOUNDERROR&quot;
Private Const DBCONNECTERROR		=	&quot;DBCONNECTERROR&quot;

REM ============================================================= PRIVATE MEMBERS

Private [Me]					As Object
Private [_Parent]				As Object		&apos;	Unused
Private [_Super]				As Object		&apos;	Document superclass, which the current instance is a subclass of
Private ObjectType				As String		&apos;	Must be FormDocument
Private ServiceName				As String

&apos;	Components
Private _Component				As Object		&apos;	com.sun.star.lang.XComponent
Private _BaseComponent			As Object		&apos;	com.sun.star.comp.dba.ODatabaseDocument
Private _FormDocument			As Object		&apos;	com.sun.star.comp.sdb.Content

&apos;	Form document description
Private _PersistentName			As String		&apos;	Typically Objxx
Private _HierarchicalName		As String
Private _DataSource				As Object		&apos;	com.sun.star.sdbc.XDataSource
Private _User					As String		&apos;	Credentials
Private _Password				As String

REM ============================================================ MODULE CONSTANTS

Const ISBASEFORM = 3				&apos;	Form is stored in a Form document

REM ====================================================== CONSTRUCTOR/DESTRUCTOR

REM -----------------------------------------------------------------------------
Private Sub Class_Initialize()
	Set [Me] = Nothing
	Set [_Parent] = Nothing
	Set [_Super] = Nothing
	ObjectType = &quot;FormDocument&quot;
	ServiceName = &quot;SFDocuments.FormDocument&quot;
	Set _Component = Nothing
	Set _BaseComponent = Nothing
	Set _FormDocument = Nothing
	Set _DataSource = Nothing
	_PersistentName = &quot;&quot;
	_HierarchicalName = &quot;&quot;
End Sub		&apos;	SFDocuments.SF_FormDocument Constructor

REM -----------------------------------------------------------------------------
Private Sub Class_Terminate()
	Call Class_Initialize()
End Sub		&apos;	SFDocuments.SF_FormDocument Destructor

REM -----------------------------------------------------------------------------
Public Function Dispose() As Variant
	If Not IsNull([_Super]) Then Set [_Super] = [_Super].Dispose()
	Call Class_Terminate()
	Set Dispose = Nothing
End Function	&apos;	SFDocuments.SF_FormDocument Explicit Destructor

REM ================================================================== PROPERTIES

REM ===================================================================== METHODS

REM -----------------------------------------------------------------------------
Public Function CloseDocument() As Boolean
&apos;&apos;&apos;	Close the form document and dispose the actual instance
&apos;&apos;&apos;	Args:
&apos;&apos;&apos;	Returns:
&apos;&apos;&apos;		True if closure is successful
&apos;&apos;&apos;	Example:
&apos;&apos;&apos;			myFormDoc.CloseDocument()

Dim bClose As Boolean			&apos;	Return value
Dim oContainer As Object		&apos;	com.sun.star.awt.XWindow
Const cstThisSub = &quot;SFDocuments.FormDocument.CloseDocument&quot;
Const cstSubArgs = &quot;&quot;

	If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
	bClose = False

Check:
	If ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
		If Not _IsStillAlive() Then GoTo Finally
	End If
Try:
	_FormDocument.close()
	Dispose()
	bClose = True

Finally:
	CloseDocument = bClose
	ScriptForge.SF_Utils._ExitFunction(cstThisSub)
	Exit Function
Catch:
	GoTo Finally
End Function	&apos;	SFDocuments.SF_FormDocument.CloseDocument

REM -----------------------------------------------------------------------------
Public Function Forms(Optional ByVal Form As Variant) As Variant
&apos;&apos;&apos;	Return either
&apos;&apos;&apos;		- the list of the Forms contained in the form document
&apos;&apos;&apos;		- a SFDocuments.Form object based on its name or its index
&apos;&apos;&apos;	Args:
&apos;&apos;&apos;		Form: a form stored in the document given by its name or its index
&apos;&apos;&apos;			When absent, the list of available forms is returned
&apos;&apos;&apos;			To get the first (unique ?) form stored in the form document, set Form = 0
&apos;&apos;&apos;	Exceptions:
&apos;&apos;&apos;		BASEFORMNOTFOUNDERROR		Form not found
&apos;&apos;&apos;	Returns:
&apos;&apos;&apos;		A zero-based array of strings if Form is absent
&apos;&apos;&apos;		An instance of the SF_Form class if Form exists
&apos;&apos;&apos;	Example:
&apos;&apos;&apos;			Dim myForm As Object, myList As Variant
&apos;&apos;&apos;				myList = oDoc.Forms()
&apos;&apos;&apos;				Set myForm = oDoc.Forms(&quot;myForm&quot;)

Dim oForm As Object					&apos;	The new Form class instance
Dim oMainForm As Object				&apos;	com.sun.star.comp.sdb.Content
Dim oXForm As Object				&apos;	com.sun.star.form.XForm
Dim vFormNames As Variant			&apos;	Array of form names
Dim oForms As Object				&apos;	Forms collection
Const cstDrawPage = 0				&apos;	Only 1 drawpage in a FormDocument document

Const cstThisSub = &quot;SFDocuments.FormDocument.Forms&quot;
Const cstSubArgs = &quot;[Form=&quot;&quot;&quot;&quot;]&quot;

	If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo Catch

Check:
	If IsMissing(Form) Or IsEmpty(Form) Then Form = &quot;&quot;
	If ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
		If Not _IsStillAlive() Then GoTo Finally
		If Not ScriptForge.SF_Utils._Validate(Form, &quot;Form&quot;, Array(V_STRING, ScriptForge.V_NUMERIC)) Then GoTo Finally
	End If

Try:
	&apos;	Start from the document component and go down to forms
	Set oForms = _Component.DrawPages(cstDrawPage).Forms
	vFormNames = oForms.getElementNames()

	If Len(Form) = 0 Then	&apos;	Return the list of valid form names
		Forms = vFormNames
	Else
		If VarType(Form) = V_STRING Then	&apos;	Find the form by name
			If Not ScriptForge.SF_Array.Contains(vFormNames, Form, CaseSensitive := True) Then GoTo CatchNotFound
			Set oXForm = oForms.getByName(Form)
		Else								&apos;	Find the form by index
			If Form &lt; 0 Or Form &gt;= oForms.Count Then GoTo CatchNotFound
			Set oXForm = oForms.getByIndex(Form)
		End If
		&apos;	Create the new Form class instance
		Set oForm = SF_Register._NewForm(oXForm)
		With oForm
			Set .[_Parent] = [Me]
			._FormType = ISBASEFORM
			Set ._Component = _Component
			Set ._BaseComponent = _BaseComponent
			._FormDocumentName = _HierarchicalName
			._FormDocument = _FormDocument
			._Initialize()
		End With
		Set Forms = oForm
	End If

Finally:
	ScriptForge.SF_Utils._ExitFunction(cstThisSub)
	Exit Function
Catch:
	GoTo Finally
CatchNotFound:
	ScriptForge.SF_Exception.RaiseFatal(BASEFORMNOTFOUNDERROR, Form, _FileIdent())
End Function	&apos;	SFDocuments.SF_FormDocument.Forms

REM -----------------------------------------------------------------------------
Public Function GetDatabase(Optional ByVal User As Variant _
								, Optional ByVal Password As Variant _
								) As Object
&apos;&apos;&apos;	Returns a Database instance (service = SFDatabases.Database) giving access
&apos;&apos;&apos;	to the execution of SQL commands on the database defined and/or stored in
&apos;&apos;&apos;	the actual form document
&apos;&apos;&apos;	Args:
&apos;&apos;&apos;		User, Password: the login parameters as strings. Defaults = &quot;&quot;
&apos;&apos;&apos;	Returns:
&apos;&apos;&apos;		A SFDatabases.Database instance or Nothing
&apos;&apos;&apos;	Exceptions:
&apos;&apos;&apos;		DBCONNECTERROR				The database could not be connected, credentials are probably wrong
&apos;&apos;&apos;	Example:
&apos;&apos;&apos;		Dim myDb As Object
&apos;&apos;&apos;			Set myDb = oFormDoc.GetDatabase()

Dim oDatabase As Object				&apos;	Return value
Const cstThisSub = &quot;SFDocuments.FormDocument.GetDatabase&quot;
Const cstSubArgs = &quot;[User=&quot;&quot;&quot;&quot;], [Password=&quot;&quot;&quot;&quot;]&quot;

	If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
	Set oDatabase = Nothing

Check:
	If IsMissing(User) Or IsEmpty(User) Then User = &quot;&quot;
	If IsMissing(Password) Or IsEmpty(Password) Then Password = &quot;&quot;
	If ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
		If Not _IsStillAlive(False) Then GoTo Finally
		If Not ScriptForge.SF_Utils._Validate(User, &quot;User&quot;, V_STRING) Then GoTo Finally
		If Not ScriptForge.SF_Utils._Validate(Password, &quot;Password&quot;, V_STRING) Then GoTo Finally
	End If

Try:
	If IsNull(_DataSource) Then GoTo CatchConnect
	Set oDatabase = ScriptForge.SF_Services.CreateScriptService(&quot;SFDatabases.DatabaseFromDocument&quot; _
						, _DataSource, Iif(User = &quot;&quot;, _User, User), Iif(Password = &quot;&quot;, _Password, Password))
	If IsNull(oDatabase) Then GoTo CatchConnect
	oDatabase._Location = _DataSource.Name

Finally:
	Set GetDatabase = oDatabase
	ScriptForge.SF_Utils._ExitFunction(cstThisSub)
	Exit Function
Catch:
	GoTo Finally
CatchConnect:
	ScriptForge.SF_Exception.RaiseFatal(DBCONNECTERROR, &quot;User&quot;, User, &quot;Password&quot;, Password, [_Super]._FileIdent())
	GoTo Finally
End Function	&apos;	SFDocuments.SF_FormDocument.GetDatabase

REM -----------------------------------------------------------------------------
Public Function GetProperty(Optional ByVal PropertyName As Variant _
								, Optional ObjectName As Variant _
								) As Variant
&apos;&apos;&apos;	Return the actual value of the given property
&apos;&apos;&apos;	Args:
&apos;&apos;&apos;		PropertyName: the name of the property as a string
&apos;&apos;&apos;		ObjectName: a sheet or range name
&apos;&apos;&apos;	Returns:
&apos;&apos;&apos;		The actual value of the property
&apos;&apos;&apos;	Exceptions:
&apos;&apos;&apos;		ARGUMENTERROR		The property does not exist

Const cstThisSub = &quot;SFDocuments.FormDocument.GetProperty&quot;
Const cstSubArgs = &quot;&quot;

	If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
	GetProperty = Null

Check:
	If IsMissing(ObjectName) Or IsEmpty(ObjectName) Then ObjectName = &quot;&quot;
	If ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
		If Not ScriptForge.SF_Utils._Validate(PropertyName, &quot;PropertyName&quot;, V_STRING, Properties()) Then GoTo Catch
		If Not ScriptForge.SF_Utils._Validate(ObjectName, &quot;ObjectName&quot;, V_STRING) Then GoTo Catch
	End If

Try:
	&apos;	Superclass or subclass property ?
	If ScriptForge.SF_Array.Contains([_Super].Properties(), PropertyName) Then
		GetProperty = [_Super].GetProperty(PropertyName)
	ElseIf Len(ObjectName) = 0 Then
		GetProperty = _PropertyGet(PropertyName)
	Else
		GetProperty = _PropertyGet(PropertyName, ObjectName)
	End If

Finally:
	ScriptForge.SF_Utils._ExitFunction(cstThisSub)
	Exit Function
Catch:
	GoTo Finally
End Function	&apos;	SFDocuments.SF_FormDocument.GetProperty

REM -----------------------------------------------------------------------------
Public Function Methods() As Variant
&apos;&apos;&apos;	Return the list of public methods of the FormDocument service as an array

	Methods = Array( _
					&quot;CloseDocument&quot; _
					, &quot;Forms&quot; _
					, &quot;GetDatabase&quot; _
					, &quot;PrintOut&quot; _
					)

End Function	&apos;	SFDocuments.SF_FormDocument.Methods

REM -----------------------------------------------------------------------------
Public Function PrintOut(Optional ByVal Pages As Variant _
							, Optional ByVal Copies As Variant _
							, Optional ByVal PrintBackground As Variant _
							, Optional ByVal PrintBlankPages As Variant _
							, Optional ByVal PrintEvenPages As Variant _
							, Optional ByVal PrintOddPages As Variant _
							, Optional ByVal PrintImages As Variant _
							) As Boolean
&apos;&apos;&apos; Send the content of the document to the printer.
&apos;&apos;&apos;	The printer might be defined previously by default, by the user or by the SetPrinter() method
&apos;&apos;&apos;	Args:
&apos;&apos;&apos;		Pages: the pages to print as a string, like in the user interface. Example: &quot;1-4;10;15-18&quot;. Default = all pages
&apos;&apos;&apos;		Copies: the number of copies
&apos;&apos;&apos;		PrintBackground: print the background image when True (default)
&apos;&apos;&apos;		PrintBlankPages: when False (default), omit empty pages
&apos;&apos;&apos;		PrintEvenPages: print the left pages when True (default)
&apos;&apos;&apos;		PrintOddPages: print the right pages when True (default)
&apos;&apos;&apos;		PrintImages: print the graphic objects when True (default)
&apos;&apos;&apos;	Returns:
&apos;&apos;&apos;		True when successful
&apos;&apos;&apos;	Examples:
&apos;&apos;&apos;		oDoc.PrintOut(&quot;1-4;10;15-18&quot;, Copies := 2, PrintImages := False)

Dim bPrint As Boolean				&apos;	Return value
Dim vPrintOptions As Variant		&apos;	com.sun.star.text.DocumentSettings

Const cstThisSub = &quot;SFDocuments.FormDocument.PrintOut&quot;
Const cstSubArgs = &quot;[Pages=&quot;&quot;&quot;&quot;], [Copies=1], [PrintBackground=True], [PrintBlankPages=False], [PrintEvenPages=True]&quot; _
						&amp; &quot;, [PrintOddPages=True], [PrintImages=True]&quot;

	If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
	bPrint = False

Check:
	If IsMissing(Pages) Or IsEmpty(Pages) Then Pages = &quot;&quot;
	If IsMissing(Copies) Or IsEmpty(Copies) Then Copies = 1
	If IsMissing(PrintBackground) Or IsEmpty(PrintBackground) Then PrintBackground = True
	If IsMissing(PrintBlankPages) Or IsEmpty(PrintBlankPages) Then PrintBlankPages = False
	If IsMissing(PrintEvenPages) Or IsEmpty(PrintEvenPages) Then PrintEvenPages = True
	If IsMissing(PrintOddPages) Or IsEmpty(PrintOddPages) Then PrintOddPages = True
	If IsMissing(PrintImages) Or IsEmpty(PrintImages) Then PrintImages = True
	
	If ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
		If Not _IsStillAlive() Then GoTo Finally
		If Not ScriptForge.SF_Utils._Validate(Pages, &quot;Pages&quot;, V_STRING) Then GoTo Finally
		If Not ScriptForge.SF_Utils._Validate(Copies, &quot;Copies&quot;, ScriptForge.V_NUMERIC) Then GoTo Finally
		If Not ScriptForge.SF_Utils._Validate(PrintBackground, &quot;PrintBackground&quot;, ScriptForge.V_BOOLEAN) Then GoTo Finally
		If Not ScriptForge.SF_Utils._Validate(PrintBlankPages, &quot;PrintBlankPages&quot;, ScriptForge.V_BOOLEAN) Then GoTo Finally
		If Not ScriptForge.SF_Utils._Validate(PrintEvenPages, &quot;PrintEvenPages&quot;, ScriptForge.V_BOOLEAN) Then GoTo Finally
		If Not ScriptForge.SF_Utils._Validate(PrintOddPages, &quot;PrintOddPages&quot;, ScriptForge.V_BOOLEAN) Then GoTo Finally
		If Not ScriptForge.SF_Utils._Validate(PrintImages, &quot;PrintImages&quot;, ScriptForge.V_BOOLEAN) Then GoTo Finally
	End If

Try:
	vPrintOptions = _Component.createInstance(&quot;com.sun.star.text.DocumentSettings&quot;)
	With vPrintOptions
		.PrintPageBackground = PrintBackground
		.PrintEmptyPages = PrintBlankPages
		.PrintLeftPages = PrintEvenPages
		.PrintRightPages = PrintOddPages
		.PrintGraphics = PrintImages
		.PrintDrawings = PrintImages
	End With

	bPrint = [_Super].PrintOut(Pages, Copies, _Component)

Finally:
	PrintOut = bPrint
	ScriptForge.SF_Utils._ExitFunction(cstThisSub)
	Exit Function
Catch:
	GoTo Finally
End Function   &apos;   SFDocuments.SF_FormDocument.PrintOut

REM -----------------------------------------------------------------------------
Public Function Properties() As Variant
&apos;&apos;&apos;	Return the list or properties of the FormDocument class as an array

	Properties = Array( _
					&quot;DocumentType&quot; _
					, &quot;FileSystem&quot; _
					, &quot;IsAlive&quot; _
					, &quot;IsBase&quot; _
					, &quot;IsCalc&quot; _
					, &quot;IsDraw&quot; _
					, &quot;IsFormDocument&quot; _
					, &quot;IsImpress&quot; _
					, &quot;IsMath&quot; _
					, &quot;MenuHeaders&quot; _
					, &quot;Readonly&quot; _
					, &quot;StyleFamilies&quot; _
					, &quot;XComponent&quot; _
					, &quot;XDocumentSettings&quot; _
					)

End Function	&apos;	SFDocuments.SF_FormDocument.Properties

REM ======================================================= SUPERCLASS PROPERTIES

REM -----------------------------------------------------------------------------
Property Get FileSystem() As String
	FileSystem = [_Super].GetProperty(&quot;FileSystem&quot;)
End Property	&apos;	SFDocuments.SF_FormDocument.FileSystem

REM -----------------------------------------------------------------------------
Property Get IsAlive() As Boolean
	IsAlive = [_Super].GetProperty(&quot;IsAlive&quot;)
End Property	&apos;	SFDocuments.SF_FormDocument.IsAlive

REM -----------------------------------------------------------------------------
Property Get IsBase() As Boolean
	IsBase = [_Super].GetProperty(&quot;IsBase&quot;)
End Property	&apos;	SFDocuments.SF_FormDocument.IsBase

REM -----------------------------------------------------------------------------
Property Get IsCalc() As Boolean
	IsCalc = [_Super].GetProperty(&quot;IsCalc&quot;)
End Property	&apos;	SFDocuments.SF_FormDocument.IsCalc

REM -----------------------------------------------------------------------------
Property Get IsDraw() As Boolean
	IsDraw = [_Super].GetProperty(&quot;IsDraw&quot;)
End Property	&apos;	SFDocuments.SF_FormDocument.IsDraw

REM -----------------------------------------------------------------------------
Property Get IsFormDocument() As Boolean
	IsFormDocument = [_Super].GetProperty(&quot;IsFormDocument&quot;)
End Property	&apos;	SFDocuments.SF_Writer.IsFormDocument

REM -----------------------------------------------------------------------------
Property Get IsImpress() As Boolean
	IsImpress = [_Super].GetProperty(&quot;IsImpress&quot;)
End Property	&apos;	SFDocuments.SF_FormDocument.IsImpress

REM -----------------------------------------------------------------------------
Property Get IsMath() As Boolean
	IsMath = [_Super].GetProperty(&quot;IsMath&quot;)
End Property	&apos;	SFDocuments.SF_FormDocument.IsMath

REM -----------------------------------------------------------------------------
Property Get MenuHeaders() As Variant
	MenuHeaders = [_Super].GetProperty(&quot;MenuHeaders&quot;)
End Property	&apos;	SFDocuments.SF_FormDocument.MenuHeaders

REM -----------------------------------------------------------------------------
Property Get Readonly() As Variant
	Readonly = [_Super].GetProperty(&quot;Readonly&quot;)
End Property	&apos;	SFDocuments.SF_FormDocument.Readonly

REM -----------------------------------------------------------------------------
Property Get StyleFamilies() As Variant
	StyleFamilies = [_Super].GetProperty(&quot;StyleFamilies&quot;)
End Property	&apos;	SFDocuments.SF_FormDocument.StyleFamilies

REM -----------------------------------------------------------------------------
Property Get XComponent() As Variant
	XComponent = [_Super].GetProperty(&quot;XComponent&quot;)
End Property	&apos;	SFDocuments.SF_FormDocument.XComponent

REM -----------------------------------------------------------------------------
Property Get XDocumentSettings() As Variant
	XDocumentSettings = [_Super].GetProperty(&quot;XDocumentSettings&quot;)
End Property	&apos;	SFDocuments.SF_FormDocument.XDocumentSettings

REM ========================================================== SUPERCLASS METHODS

REM -----------------------------------------------------------------------------
Public Function Activate() As Boolean
	Activate = [_Super].Activate()
End Function    &apos;   SFDocuments.SF_FormDocument.Activate

REM -----------------------------------------------------------------------------
Public Function ContextMenus(Optional ByVal ContextMenuName As Variant _
								, Optional ByVal SubmenuChar As Variant _
								) As Variant
	ContextMenus = [_Super].ContextMenus(ContextMenuName, SubmenuChar)
End Function	&apos;	SFDocuments.SF_FormDocument.ContextMenus

REM -----------------------------------------------------------------------------
Public Function CreateMenu(Optional ByVal MenuHeader As Variant _
								, Optional ByVal Before As Variant _
								, Optional ByVal SubmenuChar As Variant _
								) As Object
	Set CreateMenu = [_Super].CreateMenu(MenuHeader, Before, SubmenuChar)
End Function	&apos;	SFDocuments.SF_FormDocument.CreateMenu

REM -----------------------------------------------------------------------------
Public Sub Echo(Optional ByVal EchoOn As Variant _
						, Optional ByVal Hourglass As Variant _
						)
	[_Super].Echo(EchoOn, Hourglass)
End Sub		   &apos;   SFDocuments.SF_FormDocument.Echo

REM -----------------------------------------------------------------------------
Public Function ExportAsPDF(Optional ByVal FileName As Variant _
							, Optional ByVal Overwrite As Variant _
							, Optional ByVal Pages As Variant _
							, Optional ByVal Password As Variant _
							, Optional ByVal Watermark As Variant _
							) As Boolean
	ExportAsPDF = [_Super].ExportAsPDF(FileName, Overwrite, Pages, Password, Watermark)
End Function   &apos;   SFDocuments.SF_FormDocument.ExportAsPDF

REM -----------------------------------------------------------------------------
Public Function RemoveMenu(Optional ByVal MenuHeader As Variant) As Boolean
	RemoveMenu = [_Super].RemoveMenu(MenuHeader)
End Function	&apos;	SFDocuments.SF_FormDocument.RemoveMenu

REM -----------------------------------------------------------------------------
Public Sub RunCommand(Optional ByVal Command As Variant _
									, ParamArray Args As Variant _
									)
	[_Super].RunCommand(Command, Args)
End Sub		  &apos;   SFDocuments.SF_FormDocument.RunCommand

REM -----------------------------------------------------------------------------
Public Function SaveCopyAs(Optional ByVal FileName As Variant _
							, Optional ByVal Overwrite As Variant _
							, Optional ByVal Password As Variant _
							, Optional ByVal FilterName As Variant _
							, Optional ByVal FilterOptions As Variant _
							) As Boolean
	SaveCopyAs = [_Super].SaveCopyAs(FileName, Overwrite, Password, FilterName, FilterOptions)
End Function   &apos;   SFDocuments.SF_FormDocument.SaveCopyAs

REM -----------------------------------------------------------------------------
Public Function SetPrinter(Optional ByVal Printer As Variant _
							, Optional ByVal Orientation As Variant _
							, Optional ByVal PaperFormat As Variant _
							) As Boolean
	SetPrinter = [_Super].SetPrinter(Printer, Orientation, PaperFormat)
End Function	&apos;   SFDocuments.SF_FormDocument.SetPrinter

REM -----------------------------------------------------------------------------
Public Function Styles(Optional ByVal Family As Variant _
							, Optional ByVal NamePattern As variant _
							, Optional ByVal Used As variant _
							, Optional ByVal UserDefined As Variant _
							, Optional ByVal ParentStyle As Variant _
							, Optional ByVal Category As Variant _
							) As Variant
	Styles = [_Super].Styles(Family, NamePattern, Used, UserDefined, ParentStyle, Category)
End Function	&apos;   SFDocuments.SF_FormDocument.Styles

REM -----------------------------------------------------------------------------
Public Function Toolbars(Optional ByVal ToolbarName As Variant) As Variant
	Toolbars = [_Super].Toolbars(ToolbarName)
End Function	&apos;	SFDocuments.SF_FormDocument.Toolbars

REM -----------------------------------------------------------------------------
Public Function XStyle(Optional ByVal Family As Variant _
							, Optional ByVal StyleName As variant _
							) As Object
	Set XStyle = [_Super].XStyle(Family, StyleName)
End Function	&apos;	SFDocuments.SF_FormDocument.XStyle

REM =========================================================== PRIVATE FUNCTIONS

REM -----------------------------------------------------------------------------
Private Function _FileIdent() As String
&apos;&apos;&apos;	Returns a file identification from the information that is currently available
&apos;&apos;&apos;	Useful e.g. for display in error messages

	_FileIdent = [_Super]._FileIdent()

End Function	&apos;	SFDocuments.SF_FormDocument._FileIdent

REM -----------------------------------------------------------------------------
Public Sub _Initialize()
&apos;&apos;&apos;	Achieve the creation of a SF_Form instance
&apos;&apos;&apos;		- the database file
&apos;&apos;&apos;		- the database connection
&apos;&apos;&apos;	the internal and external names

Dim oBase As Object					&apos;	A temporary Base instance

	On Local Error GoTo Catch

Try:
	&apos;	Base file where form document is stored
	Set _BaseComponent = _Component.Parent

	&apos;	Connection arguments
	Set _DataSource = _BaseComponent.DataSource
	With _DataSource
		_User = .User
		_Password = .Password
	End With

	&apos;	External and internal names
	_PersistentName = ScriptForge.SF_Utils._GetPropertyValue(_Component.Args, &quot;HierarchicalDocumentName&quot;)
	Set oBase = New SF_Base		&apos;	Only to be able to call the _FindByPersistentName() method
	With oBase
		Set _FormDocument = ._FindByPersistentName(_BaseComponent.getFormDocuments(), _PersistentName)
		_HierarchicalName = _FormDocument.HierarchicalName
		Set oBase = .Dispose()
	End With

Finally:
	Exit Sub
Catch:
	On Local Error GoTo 0
	GoTo Finally
End Sub			&apos;	SFDocuments.SF_FormDocument._Initialize

REM -----------------------------------------------------------------------------
Private Function _IsStillAlive(Optional ByVal pbForUpdate As Boolean _
									, Optional ByVal pbError As Boolean _
									) As Boolean
&apos;&apos;&apos;	Returns True if the document has not been closed manually or incidentally since the last use
&apos;&apos;&apos;	If dead the actual instance is disposed. The execution is cancelled when pbError = True (default)
&apos;&apos;&apos;	Args:
&apos;&apos;&apos;		pbForUpdate: if True (default = False), check additionally if document is open for editing
&apos;&apos;&apos;		pbError: if True (default), raise a fatal error

Dim bAlive As Boolean			&apos;	Return value

	If IsMissing(pbForUpdate) Then pbForUpdate = False
	If IsMissing(pbError) Then pbError = True

Try:
	bAlive = [_Super]._IsStillAlive(pbForUpdate, pbError)

Finally:
	_IsStillAlive = bAlive
	Exit Function
End Function	&apos;	SFDocuments.SF_FormDocument._IsStillAlive

REM -----------------------------------------------------------------------------
Private Function _PropertyGet(Optional ByVal psProperty As String _
								, Optional ByVal pvArg As Variant _
								) As Variant
&apos;&apos;&apos;	Return the value of the named property
&apos;&apos;&apos;	Args:
&apos;&apos;&apos;		psProperty: the name of the property

Dim cstThisSub As String
Const cstSubArgs = &quot;&quot;

	_PropertyGet = False

	cstThisSub = &quot;SFDocuments.FormDocument.get&quot; &amp; psProperty
	ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs)
	If Not _IsStillAlive() Then GoTo Finally

	Select Case psProperty
		Case Else
			_PropertyGet = Null
	End Select

Finally:
	ScriptForge.SF_Utils._ExitFunction(cstThisSub)
	Exit Function
End Function	&apos;	SFDocuments.SF_FormDocument._PropertyGet

REM -----------------------------------------------------------------------------
Private Function _Repr() As String
&apos;&apos;&apos;	Convert the SF_FormDocument instance to a readable string, typically for debugging purposes (DebugPrint ...)
&apos;&apos;&apos;	Args:
&apos;&apos;&apos;	Return:
&apos;&apos;&apos;		&quot;[DOCUMENT]: Type/File&quot;

	_Repr = &quot;[FormDocument]: &quot; &amp; [_Super]._FileIdent()

End Function	&apos;	SFDocuments.SF_FormDocument._Repr

REM ============================================ END OF SFDOCUMENTS.SF_FORMDOCUMENT
</script:module>