<?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_Dialog" script:language="StarBasic" script:moduleType="normal">REM =======================================================================================================================
REM ===			The ScriptForge library and its associated libraries are part of the LibreOffice project.				===
REM	===						The SFDialogs 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_Dialog
&apos;&apos;&apos;	=========
&apos;&apos;&apos;		Management of dialogs. They may be defined with the Basic IDE or built from scratch
&apos;&apos;&apos;		Each instance of the current class represents a single dialog box displayed to the user
&apos;&apos;&apos;
&apos;&apos;&apos;		A dialog box can be displayed in modal or in non-modal modes
&apos;&apos;&apos;
&apos;&apos;&apos;			In modal mode, the box is displayed and the execution of the macro process is suspended
&apos;&apos;&apos;			until one of the OK or Cancel buttons is pressed. In the meantime, other user actions
&apos;&apos;&apos;			executed on the box can trigger specific actions.
&apos;&apos;&apos;
&apos;&apos;&apos;			In non-modal mode, the dialog box is &quot;floating&quot; on the user desktop and the execution
&apos;&apos;&apos;			of the macro process continues normally
&apos;&apos;&apos;			A dialog box disappears from memory after its explicit termination.
&apos;&apos;&apos;
&apos;&apos;&apos;		Service invocation and usage:
&apos;&apos;&apos;
&apos;&apos;&apos;		1) when the dialog exists in some dialog libraries (= pre-defined with the Basic IDE):
&apos;&apos;&apos;			Dim myDialog As Object, lButton As Long
&apos;&apos;&apos;				Set myDialog = CreateScriptService(&quot;SFDialogs.Dialog&quot;, Container, Library, DialogName)
&apos;&apos;&apos;					&apos;	Args:
&apos;&apos;&apos;					&apos;		Container:	&quot;GlobalScope&quot; for preinstalled libraries
&apos;&apos;&apos;					&apos;					A window name (see its definition in the ScriptForge.UI service)
&apos;&apos;&apos;					&apos;					&quot;&quot; (default) = the current document
&apos;&apos;&apos;					&apos;		Library:	The (case-sensitive) name of a library contained in the container
&apos;&apos;&apos;					&apos;					Default = &quot;Standard&quot;
&apos;&apos;&apos;					&apos;		DialogName:	a case-sensitive string designating the dialog where it is about
&apos;&apos;&apos;				&apos;	... Initialize controls ...
&apos;&apos;&apos;				lButton = myDialog.Execute()	&apos;	Default mode = Modal
&apos;&apos;&apos;				If lButton = myDialog.OKBUTTON Then
&apos;&apos;&apos;					&apos;	... Process controls and do what is needed
&apos;&apos;&apos;				End If
&apos;&apos;&apos;				myDialog.Terminate()
&apos;&apos;&apos;
&apos;&apos;&apos;		2) when the dialog is fully defined by code:
&apos;&apos;&apos;			Dim myDialog As Object, oButton As Object lExec As Long
&apos;&apos;&apos;				Set myDialog = CreateScriptService(&quot;SFDialogs.NewDialog&quot;, DialogName, Place)
&apos;&apos;&apos;					&apos;	Args:
&apos;&apos;&apos;					&apos;		DialogName:	a case-sensitive string designating the dialog
&apos;&apos;&apos;							Place: either
&apos;&apos;&apos;							- an array with 4 elements: (X, Y, Width, Height)
&apos;&apos;&apos;							- a com.sun.star.awt.Rectangle [X, Y, Width, Height]
&apos;&apos;&apos;	 							(All elements are expressed in &quot;Map AppFont&quot; units).
&apos;&apos;&apos;				&apos;	... Create controls with the CreateXXX(...) methods ..., e.g.
&apos;&apos;&apos;				Set oButton = myDialog.CreateButton(&quot;OKButton&quot;, Place := Array(100, 100, 20, 10), Push := &quot;OK&quot;)
&apos;&apos;&apos;				lExec = myDialog.Execute()	&apos;	Default mode = Modal
&apos;&apos;&apos;				If lExec = myDialog.OKBUTTON Then
&apos;&apos;&apos;					&apos;	... Process controls and do what is needed
&apos;&apos;&apos;				End If
&apos;&apos;&apos;				myDialog.Terminate()
&apos;&apos;&apos;
&apos;&apos;&apos;
&apos;&apos;&apos;		Detailed user documentation:
&apos;&apos;&apos;			https://help.libreoffice.org/latest/en-US/text/sbasic/shared/03/sf_dialog.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 DIALOGDEADERROR		=	&quot;DIALOGDEADERROR&quot;
Private Const PAGEMANAGERERROR		=	&quot;PAGEMANAGERERROR&quot;
Private Const DUPLICATECONTROLERROR	=	&quot;DUPLICATECONTROLERROR&quot;

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

Private [Me]				As Object
Private [_Parent]			As Object
Private ObjectType			As String		&apos; Must be DIALOG
Private ServiceName			As String

&apos;	Dialog location
Private _Container			As String
Private _Library			As String
Private _BuiltFromScratch	As Boolean		&apos; When True, dialog is not stored in a library
Private _BuiltInPython		As Boolean		&apos; Used only when _BuiltFromScratch = True
Private _Name				As String
Private _CacheIndex			As Long			&apos; Index in cache storage

&apos;	Dialog UNO references
Private _DialogProvider		As Object		&apos; com.sun.star.io.XInputStreamProvider
Private _DialogControl		As Object		&apos; com.sun.star.awt.XControl - stardiv.Toolkit.UnoDialogControl
Private _DialogModel		As Object		&apos; com.sun.star.awt.XControlModel - stardiv.Toolkit.UnoControlDialogModel

&apos;	Dialog attributes
Private _Displayed			As Boolean		&apos; True after Execute()
Private _Modal				As Boolean		&apos; Set by Execute()

&apos;	Dialog initial position and dimensions in APPFONT units
Private _Left				As Long
Private _Top				As Long
Private _Width				As Long
Private _Height				As Long

&apos;	Page management
Type _PageManager
	ControlName As String					&apos; Case-sensitive name of control involved in page management
	PageMgtType As Integer					&apos; One of the PILOTCONTROL, TABCONTROL, NEXTCONTROL, BACKCONTROL constants
	PageNumber As Long						&apos; When &gt; 0, the page to activate for tab controls
	ListenerType As Integer					&apos; One of the ITEMSTATECHANGED, ACTIONPERFORMED or TABSELECTED constants
End Type

Private _PageManagement		As Variant		&apos; Array of _PageManager objects, one entry by involved control
Private _TabPageContainer	As String		&apos; The name of the unique tab page container control
Private _ItemListener		As Object		&apos; com.sun.star.awt.XItemListener
Private _ActionListener		As Object		&apos; com.sun.star.awt.XActionListener
Private _TabPageContainerListener	As Object
											&apos; com.sun.star.awt.tab.XTabPageContainerListener
Private _LastPage			As Long			&apos; When &gt; 0, the last page in a tabbed dialog

&apos;	Updatable events
&apos;		Next identifiers MUST be identical in both SF_Dialog and SF_DialogControl class modules
Private _FocusListener		As Object		&apos; com.sun.star.awt.XFocusListener
Private _OnFocusGained		As String		&apos; Script to invoke when dialog gets focus
Private _OnFocusLost		As String		&apos; Script to invoke when dialog loses focus
Private _FocusCounter		As Integer		&apos; Counts the number of events set on the listener
&apos; ---
Private _KeyListener		As Object		&apos; com.sun.star.awt.XKeyListener
Private _OnKeyPressed		As String		&apos; Script to invoke when Key clicked in dialog
Private _OnKeyReleased		As String		&apos; Script to invoke when Key released in dialog
Private _KeyCounter			As Integer		&apos; Counts the number of events set on the listener
&apos; ---
Private _MouseListener		As Object		&apos; com.sun.star.awt.XMouseListener
Private _OnMouseEntered		As String		&apos; Script to invoke when mouse enters dialog
Private _OnMouseExited		As String		&apos; Script to invoke when mouse leaves dialog
Private _OnMousePressed		As String		&apos; Script to invoke when mouse clicked in dialog
Private _OnMouseReleased	As String		&apos; Script to invoke when mouse released in dialog
Private _MouseCounter		As Integer		&apos; Counts the number of events set on the listener
&apos; ---
Private _MouseMotionListener As Object		&apos; com.sun.star.awt.XMouseMotionListener
Private _OnMouseDragged		As String		&apos; Script to invoke when mouse is dragged from the dialog
Private _OnMouseMoved		As String		&apos; Script to invoke when mouse is moved across the dialog
Private _MouseMotionCounter	As Integer		&apos; Counts the number of events set on the listener
&apos; ---
Private _TopWindowListener	As Object		&apos; com.sun.star.awt.XTopWindowListener

&apos;	Persistent storage for controls
Private _ControlCache		As Variant		&apos; Array of control objects sorted like ElementNames of the Dialog model

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

&apos;	Dialog usual buttons
Private Const cstOKBUTTON		= 1
Private Const cstCANCELBUTTON	= 0

&apos;	Page management
Private Const PILOTCONTROL		= 1
Private Const TABCONTROL		= 2
Private Const BACKCONTROL		= 3
Private Const NEXTCONTROL		= 4
Private Const TABPAGE			= 5
Private Const ITEMSTATECHANGED	= 1
Private Const ACTIONPERFORMED	= 2
Private Const TABSELECTED		= 3

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

REM -----------------------------------------------------------------------------
Private Sub Class_Initialize()
	Set [Me] = Nothing
	Set [_Parent] = Nothing
	ObjectType = &quot;DIALOG&quot;
	ServiceName = &quot;SFDialogs.Dialog&quot;
	_Container = &quot;&quot;
	_Library = &quot;&quot;
	_BuiltFromScratch = False
	_BuiltInPython = False
	_Name = &quot;&quot;
	_CacheIndex = -1
	Set _DialogProvider = Nothing
	Set _DialogControl = Nothing
	Set _DialogModel = Nothing
	_Displayed = False
	_Modal = True

	_Left = SF_DialogUtils.MINPOSITION
	_Top = SF_DialogUtils.MINPOSITION
	_Width = -1
	_Height = -1

	_PageManagement = Array()
	_TabPageContainer = &quot;&quot;
	Set _ItemListener = Nothing
	Set _ActionListener = Nothing
	Set _TabPageContainerListener = Nothing
	_LastPage = 0

	Set _FocusListener = Nothing
	_OnFocusGained = &quot;&quot;
	_OnFocusLost = &quot;&quot;
	_FocusCounter = 0
	Set _KeyListener = Nothing
	_OnKeyPressed = &quot;&quot;
	_OnKeyReleased = &quot;&quot;
	_KeyCounter = 0
	Set _MouseListener = Nothing
	_OnMouseEntered = &quot;&quot;
	_OnMouseExited = &quot;&quot;
	_OnMousePressed = &quot;&quot;
	_OnMouseReleased = &quot;&quot;
	_MouseCounter = 0
	Set _MouseMotionListener = Nothing
	_OnMouseDragged = &quot;&quot;
	_OnMouseMoved = &quot;&quot;
	_MouseMotionCounter = 0
	_ControlCache = Array()
End Sub		&apos;	SFDialogs.SF_Dialog Constructor

REM -----------------------------------------------------------------------------
Private Sub Class_Terminate()
	Call Class_Initialize()
End Sub		&apos;	SFDialogs.SF_Dialog Destructor

REM -----------------------------------------------------------------------------
Public Function Dispose() As Variant
	If _CacheIndex &gt;= 0 Then Terminate()
	Call Class_Terminate()
	Set Dispose = Nothing
End Function	&apos;	SFDialogs.SF_Dialog Explicit Destructor

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

REM -----------------------------------------------------------------------------
Property Get CANCELBUTTON() As Variant
	CANCELBUTTON = cstCANCELBUTTON
End Property	&apos;	SFDialogs.SF_Dialog.CANCELBUTTON (get)

REM -----------------------------------------------------------------------------
Property Get Caption() As Variant
&apos;&apos;&apos;	The Caption property refers to the title of the dialog
	Caption = _PropertyGet(&quot;Caption&quot;)
End Property	&apos;	SFDialogs.SF_Dialog.Caption (get)

REM -----------------------------------------------------------------------------
Property Let Caption(Optional ByVal pvCaption As Variant)
&apos;&apos;&apos;	Set the updatable property Caption
	_PropertySet(&quot;Caption&quot;, pvCaption)
End Property	&apos;	SFDialogs.SF_Dialog.Caption (let)

REM -----------------------------------------------------------------------------
Property Get Height() As Variant
&apos;&apos;&apos;	The Height property refers to the height of the dialog box
	Height = _PropertyGet(&quot;Height&quot;)
End Property	&apos;	SFDialogs.SF_Dialog.Height (get)

REM -----------------------------------------------------------------------------
Property Let Height(Optional ByVal pvHeight As Variant)
&apos;&apos;&apos;	Set the updatable property Height
	_PropertySet(&quot;Height&quot;, pvHeight)
End Property	&apos;	SFDialogs.SF_Dialog.Height (let)

REM -----------------------------------------------------------------------------
Property Get IsAlive() As Boolean
&apos;&apos;&apos;	Returns True when the dialog has not been closed by the user
	IsAlive = _PropertyGet(&quot;IsAlive&quot;)
End Property	&apos;	SFDocuments.SF_Dialog.IsAlive

REM -----------------------------------------------------------------------------
Property Get Modal() As Boolean
&apos;&apos;&apos;	The Modal property specifies if the dialog box has been executed in modal mode
	Modal = _PropertyGet(&quot;Modal&quot;)
End Property	&apos;	SFDialogs.SF_Dialog.Modal (get)

REM -----------------------------------------------------------------------------
Property Get Name() As String
&apos;&apos;&apos;	Return the name of the actual dialog
	Name = _PropertyGet(&quot;Name&quot;)
End Property	&apos;	SFDialogs.SF_Dialog.Name

REM -----------------------------------------------------------------------------
Property Get OKBUTTON() As Variant
	OKBUTTON = cstOKBUTTON
End Property	&apos;	SFDialogs.SF_Dialog.OKBUTTON (get)

REM -----------------------------------------------------------------------------
Property Get OnFocusGained() As Variant
&apos;&apos;&apos;	Get the script associated with the OnFocusGained event
	OnFocusGained = _PropertyGet(&quot;OnFocusGained&quot;)
End Property	&apos;	SFDialogs.SF_Dialog.OnFocusGained (get)

REM -----------------------------------------------------------------------------
Property Let OnFocusGained(Optional ByVal pvOnFocusGained As Variant)
&apos;&apos;&apos;	Set the updatable property OnFocusGained
	_PropertySet(&quot;OnFocusGained&quot;, pvOnFocusGained)
End Property	&apos;	SFDialogs.SF_Dialog.OnFocusGained (let)

REM -----------------------------------------------------------------------------
Property Get OnFocusLost() As Variant
&apos;&apos;&apos;	Get the script associated with the OnFocusLost event
	OnFocusLost = _PropertyGet(&quot;OnFocusLost&quot;)
End Property	&apos;	SFDialogs.SF_Dialog.OnFocusLost (get)

REM -----------------------------------------------------------------------------
Property Let OnFocusLost(Optional ByVal pvOnFocusLost As Variant)
&apos;&apos;&apos;	Set the updatable property OnFocusLost
	_PropertySet(&quot;OnFocusLost&quot;, pvOnFocusLost)
End Property	&apos;	SFDialogs.SF_Dialog.OnFocusLost (let)

REM -----------------------------------------------------------------------------
Property Get OnKeyPressed() As Variant
&apos;&apos;&apos;	Get the script associated with the OnKeyPressed event
	OnKeyPressed = _PropertyGet(&quot;OnKeyPressed&quot;)
End Property	&apos;	SFDialogs.SF_Dialog.OnKeyPressed (get)

REM -----------------------------------------------------------------------------
Property Let OnKeyPressed(Optional ByVal pvOnKeyPressed As Variant)
&apos;&apos;&apos;	Set the updatable property OnKeyPressed
	_PropertySet(&quot;OnKeyPressed&quot;, pvOnKeyPressed)
End Property	&apos;	SFDialogs.SF_Dialog.OnKeyPressed (let)

REM -----------------------------------------------------------------------------
Property Get OnKeyReleased() As Variant
&apos;&apos;&apos;	Get the script associated with the OnKeyReleased event
	OnKeyReleased = _PropertyGet(&quot;OnKeyReleased&quot;)
End Property	&apos;	SFDialogs.SF_Dialog.OnKeyReleased (get)

REM -----------------------------------------------------------------------------
Property Let OnKeyReleased(Optional ByVal pvOnKeyReleased As Variant)
&apos;&apos;&apos;	Set the updatable property OnKeyReleased
	_PropertySet(&quot;OnKeyReleased&quot;, pvOnKeyReleased)
End Property	&apos;	SFDialogs.SF_Dialog.OnKeyReleased (let)

REM -----------------------------------------------------------------------------
Property Get OnMouseDragged() As Variant
&apos;&apos;&apos;	Get the script associated with the OnMouseDragged event
	OnMouseDragged = _PropertyGet(&quot;OnMouseDragged&quot;)
End Property	&apos;	SFDialogs.SF_Dialog.OnMouseDragged (get)

REM -----------------------------------------------------------------------------
Property Let OnMouseDragged(Optional ByVal pvOnMouseDragged As Variant)
&apos;&apos;&apos;	Set the updatable property OnMouseDragged
	_PropertySet(&quot;OnMouseDragged&quot;, pvOnMouseDragged)
End Property	&apos;	SFDialogs.SF_Dialog.OnMouseDragged (let)

REM -----------------------------------------------------------------------------
Property Get OnMouseEntered() As Variant
&apos;&apos;&apos;	Get the script associated with the OnMouseEntered event
	OnMouseEntered = _PropertyGet(&quot;OnMouseEntered&quot;)
End Property	&apos;	SFDialogs.SF_Dialog.OnMouseEntered (get)

REM -----------------------------------------------------------------------------
Property Let OnMouseEntered(Optional ByVal pvOnMouseEntered As Variant)
&apos;&apos;&apos;	Set the updatable property OnMouseEntered
	_PropertySet(&quot;OnMouseEntered&quot;, pvOnMouseEntered)
End Property	&apos;	SFDialogs.SF_Dialog.OnMouseEntered (let)

REM -----------------------------------------------------------------------------
Property Get OnMouseExited() As Variant
&apos;&apos;&apos;	Get the script associated with the OnMouseExited event
	OnMouseExited = _PropertyGet(&quot;OnMouseExited&quot;)
End Property	&apos;	SFDialogs.SF_Dialog.OnMouseExited (get)

REM -----------------------------------------------------------------------------
Property Let OnMouseExited(Optional ByVal pvOnMouseExited As Variant)
&apos;&apos;&apos;	Set the updatable property OnMouseExited
	_PropertySet(&quot;OnMouseExited&quot;, pvOnMouseExited)
End Property	&apos;	SFDialogs.SF_Dialog.OnMouseExited (let)

REM -----------------------------------------------------------------------------
Property Get OnMouseMoved() As Variant
&apos;&apos;&apos;	Get the script associated with the OnMouseMoved event
	OnMouseMoved = _PropertyGet(&quot;OnMouseMoved&quot;)
End Property	&apos;	SFDialogs.SF_Dialog.OnMouseMoved (get)

REM -----------------------------------------------------------------------------
Property Let OnMouseMoved(Optional ByVal pvOnMouseMoved As Variant)
&apos;&apos;&apos;	Set the updatable property OnMouseMoved
	_PropertySet(&quot;OnMouseMoved&quot;, pvOnMouseMoved)
End Property	&apos;	SFDialogs.SF_Dialog.OnMouseMoved (let)

REM -----------------------------------------------------------------------------
Property Get OnMousePressed() As Variant
&apos;&apos;&apos;	Get the script associated with the OnMousePressed event
	OnMousePressed = _PropertyGet(&quot;OnMousePressed&quot;)
End Property	&apos;	SFDialogs.SF_Dialog.OnMousePressed (get)

REM -----------------------------------------------------------------------------
Property Let OnMousePressed(Optional ByVal pvOnMousePressed As Variant)
&apos;&apos;&apos;	Set the updatable property OnMousePressed
	_PropertySet(&quot;OnMousePressed&quot;, pvOnMousePressed)
End Property	&apos;	SFDialogs.SF_Dialog.OnMousePressed (let)

REM -----------------------------------------------------------------------------
Property Get OnMouseReleased() As Variant
&apos;&apos;&apos;	Get the script associated with the OnMouseReleased event
	OnMouseReleased = _PropertyGet(&quot;OnMouseReleased&quot;)
End Property	&apos;	SFDialogs.SF_Dialog.OnMouseReleased (get)

REM -----------------------------------------------------------------------------
Property Let OnMouseReleased(Optional ByVal pvOnMouseReleased As Variant)
&apos;&apos;&apos;	Set the updatable property OnMouseReleased
	_PropertySet(&quot;OnMouseReleased&quot;, pvOnMouseReleased)
End Property	&apos;	SFDialogs.SF_Dialog.OnMouseReleased (let)

REM -----------------------------------------------------------------------------
Property Get Page() As Variant
&apos;&apos;&apos;	A dialog may have several pages that can be traversed by the user step by step.
&apos;&apos;&apos;	The Page property of the Dialog object defines which page of the dialog is active.
&apos;&apos;&apos;	The Page property of a control defines the page of the dialog on which the control is visible.
&apos;&apos;&apos;	For example, if a control has a page value of 1, it is only visible on page 1 of the dialog.
&apos;&apos;&apos;	If the page value of the dialog is increased from 1 to 2, then all controls with a page value of 1 disappear
&apos;&apos;&apos;	and all controls with a page value of 2 become visible.
	Page = _PropertyGet(&quot;Page&quot;)
End Property	&apos;	SFDialogs.SF_Dialog.Page (get)

REM -----------------------------------------------------------------------------
Property Let Page(Optional ByVal pvPage As Variant)
&apos;&apos;&apos;	Set the updatable property Page
	_PropertySet(&quot;Page&quot;, pvPage)
End Property	&apos;	SFDialogs.SF_Dialog.Page (let)

REM -----------------------------------------------------------------------------
Property Get Visible() As Variant
&apos;&apos;&apos;	The Visible property is False before the Execute() statement
	Visible = _PropertyGet(&quot;Visible&quot;)
End Property	&apos;	SFDialogs.SF_Dialog.Visible (get)

REM -----------------------------------------------------------------------------
Property Let Visible(Optional ByVal pvVisible As Variant)
&apos;&apos;&apos;	Set the updatable property Visible
	_PropertySet(&quot;Visible&quot;, pvVisible)
End Property	&apos;	SFDialogs.SF_Dialog.Visible (let)

REM -----------------------------------------------------------------------------
Property Get Width() As Variant
&apos;&apos;&apos;	The Width property refers to the Width of the dialog box
	Width = _PropertyGet(&quot;Width&quot;)
End Property	&apos;	SFDialogs.SF_Dialog.Width (get)

REM -----------------------------------------------------------------------------
Property Let Width(Optional ByVal pvWidth As Variant)
&apos;&apos;&apos;	Set the updatable property Width
	_PropertySet(&quot;Width&quot;, pvWidth)
End Property	&apos;	SFDialogs.SF_Dialog.Width (let)

REM -----------------------------------------------------------------------------
Property Get XDialogModel() As Object
&apos;&apos;&apos;	The XDialogModel property returns the model UNO object of the dialog
	XDialogModel = _PropertyGet(&quot;XDialogModel&quot;)
End Property	&apos;	SFDialogs.SF_Dialog.XDialogModel (get)

REM -----------------------------------------------------------------------------
Property Get XDialogView() As Object
&apos;&apos;&apos;	The XDialogView property returns the view UNO object of the dialog
	XDialogView = _PropertyGet(&quot;XDialogView&quot;)
End Property	&apos;	SFDialogs.SF_Dialog.XDialogView (get)

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

REM -----------------------------------------------------------------------------
Public Function Activate() As Boolean
&apos;&apos;&apos;	Set the focus on the current dialog instance
&apos;&apos;&apos;	Probably called from after an event occurrence or to focus on a non-modal dialog
&apos;&apos;&apos;	Args:
&apos;&apos;&apos;	Returns:
&apos;&apos;&apos;		True if focusing is successful
&apos;&apos;&apos;	Example:
&apos;&apos;&apos;		Dim oDlg As Object
&apos;&apos;&apos;			Set oDlg = CreateScriptService(,, &quot;myDialog&quot;)	&apos;	Dialog stored in current document&apos;s standard library
&apos;&apos;&apos;			oDlg.Activate()

Dim bActivate As Boolean		&apos;	Return value
Const cstThisSub = &quot;SFDialogs.Dialog.Activate&quot;
Const cstSubArgs = &quot;&quot;

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

Check:
	If ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
		If Not _IsStillAlive() Then GoTo Finally
	End If
Try:
	If Not IsNull(_DialogControl) Then
		_DialogControl.setVisible(True)
		_DialogControl.setFocus()
		bActivate = True
	End If

Finally:
	Activate = bActivate
	ScriptForge.SF_Utils._ExitFunction(cstThisSub)
	Exit Function
Catch:
	GoTo Finally
End Function	&apos;	SFDialogs.SF_Dialog.Activate

REM -----------------------------------------------------------------------------
Public Function Center(Optional ByRef Parent As Variant) As Boolean
&apos;&apos;&apos;	Center the actual dialog instance in the middle of a parent window
&apos;&apos;&apos;	Without arguments, the method centers the dialog in the middle of the current window
&apos;&apos;&apos;	Args:
&apos;&apos;&apos;		Parent: an object, either
&apos;&apos;&apos;			- a ScriptForge dialog object
&apos;&apos;&apos;			- a ScriptForge document (Calc, Base, ...) object
&apos;&apos;&apos;	Returns:
&apos;&apos;&apos;		True when successful
&apos;&apos;&apos;	Examples:
&apos;&apos;&apos;		Sub TriggerEvent(oEvent As Object)
&apos;&apos;&apos;		Dim oDialog1 As Object, oDialog2 As Object, lExec As Long
&apos;&apos;&apos;		Set oDialog1 = CreateScriptService(&quot;DialogEvent&quot;, oEvent)	&apos;	The dialog having caused the event
&apos;&apos;&apos;		Set oDialog2 = CreateScriptService(&quot;Dialog&quot;, ...)			&apos;	Open a second dialog
&apos;&apos;&apos;		oDialog2.Center(oDialog1)
&apos;&apos;&apos;		lExec = oDialog2.Execute()
&apos;&apos;&apos;		Select Case lExec
&apos;&apos;&apos;			...
&apos;&apos;&apos;		End Sub

Dim bCenter As Boolean				&apos;	Return value
Dim oUi As Object					&apos;	ScriptForge.SF_UI
Dim oObjDesc As Object				&apos;	_ObjectDescriptor type
Dim sObjectType As String			&apos;	Can be uno or sf object type
Dim oParent As Object				&apos;	UNO alias of parent
Dim oParentPosSize As Object		&apos;	Parent com.sun.star.awt.Rectangle
Dim lParentX As Long				&apos;	X position of parent dialog
Dim lParentY As Long				&apos;	Y position of parent dialog
Dim oPosSize As Object				&apos;	Dialog com.sun.star.awt.Rectangle
Const cstThisSub = &quot;SFDialogs.Dialog.Center&quot;
Const cstSubArgs = &quot;[Parent]&quot;

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

Check:
	If IsMissing(Parent) Or IsEmpty(Parent) Then Set Parent = Nothing
	If ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
		If Not ScriptForge.SF_Utils._Validate(Parent, &quot;Parent&quot;, ScriptForge.V_OBJECT) Then GoTo Finally
	End If

	Set oParentPosSize = Nothing
	lParentX = 0	:	lParentY = 0
	If IsNull(Parent) Then
		Set oUi = CreateScriptService(&quot;UI&quot;)
		Set oParentPosSize = oUi._PosSize()	&apos;	Return the position and dimensions of the active window
	Else
		&apos;	Determine the object type
		Set oObjDesc = ScriptForge.SF_Utils._VarTypeObj(Parent)
		If oObjDesc.iVarType = ScriptForge.V_SFOBJECT Then		&apos;	ScriptForge object
			sObjectType = oObjDesc.sObjectType
			&apos;	Document or dialog ?
			If Not ScriptForge.SF_Array.Contains(Array(&quot;BASE&quot;, &quot;CALC&quot;, &quot;DIALOG&quot;, &quot;DOCUMENT&quot;, &quot;WRITER&quot;), sObjectType, CaseSensitive := True) Then GoTo Finally
			If sObjectType = &quot;DIALOG&quot; Then
				Set oParent = Parent._DialogControl
				Set oParentPosSize = oParent.getPosSize()
				lParentX = oParentPosSize.X
				lParentY = oParentPosSize.Y
			Else
				Set oParent = Parent._Component.getCurrentController().Frame.getComponentWindow()
				Set oParentPosSize = oParent.getPosSize()
			End If
		Else
			GoTo Finally		&apos;	UNO object, do nothing
		End If
	End If
	If IsNull(oParentPosSize) Then GoTo Finally

Try:
	Set oPosSize = _DialogControl.getPosSize()
	With oPosSize
		_DialogControl.setPosSize( _
					lParentX + CLng((oParentPosSize.Width - .Width) \ 2) _
					, lParentY + CLng((oParentPosSize.Height - .Height) \ 2) _
					, .Width _
					, .Height _
					, com.sun.star.awt.PosSize.POSSIZE)
	End With
	bCenter = True

Finally:
	Center = bCenter
	ScriptForge.SF_Utils._ExitFunction(cstThisSub)
	Exit Function
Catch:
	GoTo Finally
End Function	&apos;	SF_Documents.SF_Dialog.Center

REM -----------------------------------------------------------------------------
Public Function CloneControl(Optional ByVal SourceName As Variant _
								, Optional ByVal ControlName As Variant _
								, Optional ByVal Left As Variant _
								, Optional ByVal Top As Variant _
								) As Object
&apos;&apos;&apos;	Duplicate an existing control of any type in the actual dialog.
&apos;&apos;&apos;	The duplicated control is left unchanged. The new control can be relocated.
&apos;&apos;&apos;	Specific args:
&apos;&apos;&apos;		SourceName: the name of the control to duplicate
&apos;&apos;&apos;		ControlName: the name of the new control. It must not exist yet
&apos;&apos;&apos;		Left, Top: the coordinates of the new control expressed in &quot;Map AppFont&quot; units
&apos;&apos;&apos;	Returns:
&apos;&apos;&apos;		an instance of the SF_DialogControl class or Nothing
&apos;&apos;&apos;	Example:
&apos;&apos;&apos;		Set myButton2 = dialog.CloneControl(&quot;Button1&quot;, &quot;Button2&quot;, 30, 30)

Dim oControl As Object			&apos;	Return value
Dim oSourceModel As Object		&apos;	com.sun.star.awt.XControlModel of the source
Dim oControlModel As Object		&apos;	com.sun.star.awt.XControlModel of the new control
Const cstThisSub = &quot;SFDialogs.Dialog.CloneControl&quot;
Const cstSubArgs = &quot;SourceName, ControlName, [Left=1], [Top=1]&quot;

Check:
	Set oControl = Nothing

	If IsMissing(Left) Or IsEmpty(Left) Then Left = 1
	If IsMissing(Top) Or IsEmpty(Top) Then Top = 1

	If Not _CheckNewControl(cstThisSub, cstSubArgs, ControlName, Place := Null) Then GoTo Finally

	If Not ScriptForge.SF_Utils._Validate(SourceName, &quot;SourceName&quot;, V_STRING, _DialogModel.getElementNames(), True) Then GoTo Finally
	If Not ScriptForge.SF_Utils._Validate(Left, &quot;Left&quot;, ScriptForge.V_NUMERIC) Then GoTo Finally
	If Not ScriptForge.SF_Utils._Validate(Top, &quot;Top&quot;, ScriptForge.V_NUMERIC) Then GoTo Finally

Try:
	&apos;	All control types are presumed cloneable
	Set oSourceModel = _DialogModel.getByName(SourceName)
	Set oControlModel = oSourceModel.createClone()
	oControlModel.Name = ControlName

	&apos;	Create the control
	Set oControl = _CreateNewControl(oControlModel, ControlName, Array(Left, Top))

Finally:
	Set CloneControl = oControl
	ScriptForge.SF_Utils._ExitFunction(cstThisSub)
	Exit Function
Catch:
	GoTo Finally
End Function	&apos;	SFDialogs.SF_Dialog.CloneControl

REM -----------------------------------------------------------------------------
Public Function Controls(Optional ByVal ControlName As Variant) As Variant
&apos;&apos;&apos;	Return either
&apos;&apos;&apos;		- the list of the controls contained in the dialog
&apos;&apos;&apos;		- a dialog control object based on its name
&apos;&apos;&apos;	Args:
&apos;&apos;&apos;		ControlName: a valid control name as a case-sensitive string. If absent the list is returned
&apos;&apos;&apos;	Returns:
&apos;&apos;&apos;		A zero-base array of strings if ControlName is absent
&apos;&apos;&apos;		An instance of the SF_DialogControl class if ControlName exists
&apos;&apos;&apos;	Exceptions:
&apos;&apos;&apos;		ControlName is invalid
&apos;&apos;&apos;	Example:
&apos;&apos;&apos;			Dim myDialog As Object, myList As Variant, myControl As Object
&apos;&apos;&apos;				Set myDialog = CreateScriptService(&quot;SFDialogs.Dialog&quot;, Container, Library, DialogName)
&apos;&apos;&apos;				myList = myDialog.Controls()
&apos;&apos;&apos;				Set myControl = myDialog.Controls(&quot;myTextBox&quot;)

Dim oControl As Object				&apos;	The new control class instance
Dim lIndexOfNames As Long			&apos;	Index in ElementNames array. Used to access _ControlCache
Dim vControl As Variant				&apos;	Alias of _ControlCache entry
Const cstThisSub = &quot;SFDialogs.Dialog.Controls&quot;
Const cstSubArgs = &quot;[ControlName]&quot;

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

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

Try:
	If Len(ControlName) = 0 Then
		Controls = _DialogModel.getElementNames()
	Else
		If Not _DialogModel.hasByName(ControlName) Then GoTo CatchNotFound
		lIndexOfNames = ScriptForge.IndexOf(_DialogModel.getElementNames(), ControlName, CaseSensitive := True)
		&apos;	Reuse cache when relevant
		vControl = _ControlCache(lIndexOfNames)
		If IsEmpty(vControl) Then
			&apos;	Create the new dialog control class instance
			Set oControl = New SF_DialogControl
			With oControl
				._Name = ControlName
				Set .[Me] = oControl
				Set .[_Parent] = [Me]
				._IndexOfNames = ScriptForge.IndexOf(_DialogModel.getElementNames(), ControlName, CaseSensitive := True)
				._DialogName = _Name
				Set ._ControlModel = _DialogModel.getByName(ControlName)
				Set ._ControlView = _DialogControl.getControl(ControlName)
				._ControlView.setModel(._ControlModel)
				._Initialize()
			End With
		Else
			Set oControl = vControl
		End If
		Set Controls = oControl
	End If

Finally:
	ScriptForge.SF_Utils._ExitFunction(cstThisSub)
	Exit Function
Catch:
	GoTo Finally
CatchNotFound:
	ScriptForge.SF_Utils._Validate(ControlName, &quot;ControlName&quot;, V_STRING, _DialogModel.getElementNames(), True)
	GoTo Finally
End Function	&apos;	SFDialogs.SF_Dialog.Controls

&apos;&apos;&apos;	CreateXXX functions:
&apos;&apos;&apos;	-------------------
&apos;&apos;&apos;		Common arguments:
&apos;&apos;&apos;			ControlName: the name of the new control. It must not exist yet.
&apos;&apos;&apos;			Place: either
&apos;&apos;&apos;				- an array with 4 elements: (X, Y, Width, Height)
&apos;&apos;&apos;				- a com.sun.star.awt.Rectangle [X, Y, Width, Height]
&apos;&apos;&apos;				All elements are expressed in &quot;Map AppFont&quot; units.

REM -----------------------------------------------------------------------------
Public Function CreateButton(Optional ByVal ControlName As Variant _
								, Optional ByRef Place As Variant _
								, Optional ByVal Toggle As Variant _
								, Optional ByVal Push As Variant _
								) As Object
&apos;&apos;&apos;	Create a new control of type Button in the actual dialog.
&apos;&apos;&apos;	Specific args:
&apos;&apos;&apos;		Toggle: when True a Toggle button is created. Default = False
&apos;&apos;&apos;		Push: &quot;OK&quot;, &quot;CANCEL&quot; or &quot;&quot; (default)
&apos;&apos;&apos;	Returns:
&apos;&apos;&apos;		an instance of the SF_DialogControl class or Nothing
&apos;&apos;&apos;	Example:
&apos;&apos;&apos;		Set myButton = dialog.CreateButton(&quot;Button1&quot;, Array(20, 20, 60, 15))

Dim oControl As Object			&apos;	Return value
Dim iPush As Integer			&apos;	Alias of Push
Dim vPropNames As Variant		&apos;	Array of names of specific arguments
Dim vPropValues As Variant		&apos;	Array of values of specific arguments
Const cstThisSub = &quot;SFDialogs.Dialog.CreateButton&quot;
Const cstSubArgs = &quot;ControlName, Place, [Toggle=False], [Push=&quot;&quot;&quot;&quot;|&quot;&quot;OK&quot;&quot;|&quot;&quot;CANCEL&quot;&quot;]&quot;

Check:
	Set oControl = Nothing
	If Not _CheckNewControl(cstThisSub, cstSubArgs, ControlName, Place) Then GoTo Finally

	If IsMissing(Toggle) Or IsEmpty(Toggle) Then Toggle = False
	If IsMissing(Push) Or IsEmpty(Push) Then Push = &quot;&quot;
	If Not ScriptForge.SF_Utils._Validate(Toggle, &quot;Toggle&quot;, ScriptForge.V_BOOLEAN) Then GoTo Finally
	If Not ScriptForge.SF_Utils._Validate(Push, &quot;Push&quot;, V_STRING, Array(&quot;&quot;, &quot;OK&quot;, &quot;CANCEL&quot;)) Then GoTo Finally

Try:
	&apos;	Handle specific arguments
	Select Case UCase(Push)
		Case &quot;&quot;			:	iPush = com.sun.star.awt.PushButtonType.STANDARD
		Case &quot;OK&quot;		:	iPush = com.sun.star.awt.PushButtonType.OK
		Case &quot;CANCEL&quot;	:	iPush = com.sun.star.awt.PushButtonType.CANCEL
	End Select
	vPropNames = Array(&quot;Toggle&quot;, &quot;PushButtonType&quot;)
	vPropValues = Array(CBool(Toggle), iPush)

	&apos;	Create the control
	Set oControl = _CreateNewControl(&quot;UnoControlButtonModel&quot;, ControlName, Place, vPropNames, vPropValues)

Finally:
	Set CreateButton = oControl
	ScriptForge.SF_Utils._ExitFunction(cstThisSub)
	Exit Function
End Function	&apos;	SFDialogs.SF_Dialog.CreateButton

REM -----------------------------------------------------------------------------
Public Function CreateCheckBox(Optional ByVal ControlName As Variant _
								, Optional ByRef Place As Variant _
								, Optional ByVal MultiLine As Variant _
								) As Object
&apos;&apos;&apos;	Create a new control of type CheckBox in the actual dialog.
&apos;&apos;&apos;	Specific args:
&apos;&apos;&apos;		MultiLine: When True (default = False), the caption may be displayed on more than one line
&apos;&apos;&apos;	Returns:
&apos;&apos;&apos;		an instance of the SF_DialogControl class or Nothing
&apos;&apos;&apos;	Example:
&apos;&apos;&apos;		Set myCheckBox = dialog.CreateCheckBox(&quot;CheckBox1&quot;, Array(20, 20, 60, 15), MultiLine := True)

Dim oControl As Object			&apos;	Return value
Dim vPropNames As Variant		&apos;	Array of names of specific arguments
Dim vPropValues As Variant		&apos;	Array of values of specific arguments
Const cstThisSub = &quot;SFDialogs.Dialog.CreateCheckBox&quot;
Const cstSubArgs = &quot;ControlName, Place, [MultiLine=False]&quot;

Check:
	Set oControl = Nothing
	If Not _CheckNewControl(cstThisSub, cstSubArgs, ControlName, Place) Then GoTo Finally

	If IsMissing(MultiLine) Or IsEmpty(MultiLine) Then MultiLine = False
	If Not ScriptForge.SF_Utils._Validate(MultiLine, &quot;MultiLine&quot;, ScriptForge.V_BOOLEAN) Then GoTo Finally

Try:
	&apos;	Manage specific properties
	vPropNames = Array(&quot;VisualEffect&quot;, &quot;MultiLine&quot;)
	vPropValues = Array(1, CBool(MultiLine))

	&apos;	Create the control
	Set oControl = _CreateNewControl(&quot;UnoControlCheckBoxModel&quot;, ControlName, Place, vPropNames, vPropValues)

Finally:
	Set CreateCheckBox = oControl
	ScriptForge.SF_Utils._ExitFunction(cstThisSub)
	Exit Function
End Function	&apos;	SFDialogs.SF_Dialog.CreateCheckBox

REM -----------------------------------------------------------------------------
Public Function CreateComboBox(Optional ByVal ControlName As Variant _
								, Optional ByRef Place As Variant _
								, Optional ByVal Border As Variant _
								, Optional ByVal Dropdown As Variant _
								, Optional ByVal LineCount As Variant _
								) As Object
&apos;&apos;&apos;	Create a new control of type ComboBox in the actual dialog.
&apos;&apos;&apos;	Specific args:
&apos;&apos;&apos;		Border: &quot;3D&quot; (default) or &quot;FLAT&quot; or &quot;NONE&quot;
&apos;&apos;&apos;		Dropdown: When True (default), a drop down button is displayed
&apos;&apos;&apos;		LineCount: Specifies the maximum line count displayed in the drop down (default = 5)
&apos;&apos;&apos;	Returns:
&apos;&apos;&apos;		an instance of the SF_DialogControl class or Nothing
&apos;&apos;&apos;	Example:
&apos;&apos;&apos;		Set myComboBox = dialog.CreateComboBox(&quot;ComboBox1&quot;, Array(20, 20, 60, 15), Dropdown := True)

Dim oControl As Object			&apos;	Return value
Dim iBorder As Integer			&apos;	Alias of border
Dim vPropNames As Variant		&apos;	Array of names of specific arguments
Dim vPropValues As Variant		&apos;	Array of values of specific arguments
Const cstThisSub = &quot;SFDialogs.Dialog.CreateComboBox&quot;
Const cstSubArgs = &quot;ControlName, Place, [Border=&quot;&quot;3D&quot;&quot;|&quot;&quot;FLAT&quot;&quot;|&quot;&quot;NONE&quot;&quot;], [Dropdown=True], [LineCount=5]&quot;

Check:
	Set oControl = Nothing
	If Not _CheckNewControl(cstThisSub, cstSubArgs, ControlName, Place) Then GoTo Finally

	If IsMissing(Border) Or IsEmpty(Border) Then Border = &quot;3D&quot;
	If IsMissing(Dropdown) Or IsEmpty(Dropdown) Then Dropdown = True
	If IsMissing(LineCount) Or IsEmpty(LineCount) Then LineCount = 5

	If Not ScriptForge.SF_Utils._Validate(Border, &quot;Border&quot;, V_STRING, Array(&quot;3D&quot;, &quot;FLAT&quot;, &quot;NONE&quot;)) Then GoTo Finally
	If Not ScriptForge.SF_Utils._Validate(Dropdown, &quot;Dropdown&quot;, ScriptForge.V_BOOLEAN) Then GoTo Finally
	If Not ScriptForge.SF_Utils._Validate(LineCount, &quot;LineCount&quot;, ScriptForge.V_NUMERIC) Then GoTo Finally

Try:
	&apos;	Manage specific properties
	iBorder = ScriptForge.SF_Array.IndexOf(Array(&quot;NONE&quot;, &quot;3D&quot;, &quot;FLAT&quot;), Border)
	vPropNames = Array(&quot;Border&quot;, &quot;Dropdown&quot;, &quot;LineCount&quot;)
	vPropValues = Array(iBorder, CBool(Dropdown), CInt(LineCount))

	&apos;	Create the control
	Set oControl = _CreateNewControl(&quot;UnoControlComboBoxModel&quot;, ControlName, Place, vPropNames, vPropValues)

Finally:
	Set CreateComboBox = oControl
	ScriptForge.SF_Utils._ExitFunction(cstThisSub)
	Exit Function
End Function	&apos;	SFDialogs.SF_Dialog.CreateComboBox

REM -----------------------------------------------------------------------------
Public Function CreateCurrencyField(Optional ByVal ControlName As Variant _
								, Optional ByRef Place As Variant _
								, Optional ByVal Border As Variant _
								, Optional ByVal SpinButton As Variant _
								, Optional ByVal MinValue As Variant _
								, Optional ByVal MaxValue As Variant _
								, Optional ByVal Increment As Variant _
								, Optional ByVal Accuracy As Variant _
								) As Object
&apos;&apos;&apos;	Create a new control of type CurrencyField in the actual dialog.
&apos;&apos;&apos;	Specific args:
&apos;&apos;&apos;		Border: &quot;3D&quot; (default) or &quot;FLAT&quot; or &quot;NONE&quot;
&apos;&apos;&apos;		SpinButton:: when True (default = False), a spin button is present
&apos;&apos;&apos;		MinValue: the smallest value that can be entered in the control. Default = -1000000
&apos;&apos;&apos;		MaxValue: the largest value that can be entered in the control. Default = +1000000
&apos;&apos;&apos;		Increment: the step when the spin button is pressed. Default = 1
&apos;&apos;&apos;		Accuracy: specifies the decimal accuracy. Default = 2 decimal digits
&apos;&apos;&apos;	Returns:
&apos;&apos;&apos;		an instance of the SF_DialogControl class or Nothing
&apos;&apos;&apos;	Example:
&apos;&apos;&apos;		Set myCurrencyField = dialog.CreateCurrencyField(&quot;CurrencyField1&quot;, Array(20, 20, 60, 15), SpinButton := True)

Dim oControl As Object			&apos;	Return value
Dim iBorder As Integer			&apos;	Alias of border
Dim vPropNames As Variant		&apos;	Array of names of specific arguments
Dim vPropValues As Variant		&apos;	Array of values of specific arguments
Const cstThisSub = &quot;SFDialogs.Dialog.CreateCurrencyField&quot;
Const cstSubArgs = &quot;ControlName, Place, [Border=&quot;&quot;3D&quot;&quot;|&quot;&quot;FLAT&quot;&quot;|&quot;&quot;NONE&quot;&quot;], [Dropdown=False], [SpinButton=False]&quot; _
						&amp; &quot;, [MinValue=-1000000], MaxValue=+1000000], [Increment=1], [Accuracy=2]&quot;

Check:
	Set oControl = Nothing
	If Not _CheckNewControl(cstThisSub, cstSubArgs, ControlName, Place) Then GoTo Finally

	If IsMissing(Border) Or IsEmpty(Border) Then Border = &quot;3D&quot;
	If IsMissing(SpinButton) Or IsEmpty(SpinButton) Then SpinButton = False
	If IsMissing(MinValue) Or IsEmpty(MinValue) Then MinValue = -1000000.00
	If IsMissing(MaxValue) Or IsEmpty(MaxValue) Then MaxValue = +1000000.00
	If IsMissing(Increment) Or IsEmpty(Increment) Then Increment = 1.00
	If IsMissing(Accuracy) Or IsEmpty(Accuracy) Then Accuracy = 2
	
	If Not ScriptForge.SF_Utils._Validate(Border, &quot;Border&quot;, V_STRING, Array(&quot;3D&quot;, &quot;FLAT&quot;, &quot;NONE&quot;)) Then GoTo Finally
	If Not ScriptForge.SF_Utils._Validate(SpinButton, &quot;SpinButton&quot;, ScriptForge.V_BOOLEAN) Then GoTo Finally
	If Not ScriptForge.SF_Utils._Validate(MinValue, &quot;MinValue&quot;, ScriptForge.V_NUMERIC) Then GoTo Finally
	If Not ScriptForge.SF_Utils._Validate(MaxValue, &quot;MaxValue&quot;, ScriptForge.V_NUMERIC) Then GoTo Finally
	If Not ScriptForge.SF_Utils._Validate(Increment, &quot;Increment&quot;, ScriptForge.V_NUMERIC) Then GoTo Finally
	If Not ScriptForge.SF_Utils._Validate(Accuracy, &quot;Accuracy&quot;, ScriptForge.V_NUMERIC) Then GoTo Finally

Try:
	&apos;	Manage specific properties
	iBorder = ScriptForge.SF_Array.IndexOf(Array(&quot;NONE&quot;, &quot;3D&quot;, &quot;FLAT&quot;), Border)
	vPropNames = Array(&quot;Border&quot;, &quot;Spin&quot;, &quot;ValueMin&quot;, &quot;ValueMax&quot;, &quot;ValueStep&quot;, &quot;DecimalAccuracy&quot;)
	vPropValues = Array(iBorder, CBool(SpinButton), CDbl(MinValue), CDbl(MaxValue), CDbl(Increment), CInt(Accuracy))

	&apos;	Create the control
	Set oControl = _CreateNewControl(&quot;UnoControlCurrencyFieldModel&quot;, ControlName, Place, vPropNames, vPropValues)

Finally:
	Set CreateCurrencyField = oControl
	ScriptForge.SF_Utils._ExitFunction(cstThisSub)
	Exit Function
End Function	&apos;	SFDialogs.SF_Dialog.CreateCurrencyField

REM -----------------------------------------------------------------------------
Public Function CreateDateField(Optional ByVal ControlName As Variant _
								, Optional ByRef Place As Variant _
								, Optional ByVal Border As Variant _
								, Optional ByVal Dropdown As Variant _
								, Optional ByVal MinDate As Variant _
								, Optional ByVal MaxDate As Variant _
								) As Object
&apos;&apos;&apos;	Create a new control of type DateField in the actual dialog.
&apos;&apos;&apos;	Specific args:
&apos;&apos;&apos;		Border: &quot;3D&quot; (default) or &quot;FLAT&quot; or &quot;NONE&quot;
&apos;&apos;&apos;		Dropdown:: when True (default = False), a dropdown button is shown
&apos;&apos;&apos;		MinDate: the smallest date that can be entered in the control. Default = 1900-01-01
&apos;&apos;&apos;		MaxDate: the largest Date that can be entered in the control. Default = 2200-12-31
&apos;&apos;&apos;	Returns:
&apos;&apos;&apos;		an instance of the SF_DialogControl class or Nothing
&apos;&apos;&apos;	Example:
&apos;&apos;&apos;		Set myDateField = dialog.CreateDateField(&quot;DateField1&quot;, Array(20, 20, 60, 15), Dropdown := True)

Dim oControl As Object			&apos;	Return Date
Dim iBorder As Integer			&apos;	Alias of border
Dim oMinDate As New com.sun.star.util.Date
Dim oMaxDate As New com.sun.star.util.Date
Dim vFormats As Variant			&apos;	List of available date formats
Dim vPropNames As Variant		&apos;	Array of names of specific arguments
Dim vPropValues As Variant		&apos;	Array of values of specific arguments
Const cstThisSub = &quot;SFDialogs.Dialog.CreateDateField&quot;
Const cstSubArgs = &quot;ControlName, Place, [Border=&quot;&quot;3D&quot;&quot;|&quot;&quot;FLAT&quot;&quot;|&quot;&quot;NONE&quot;&quot;], [Dropdown=False]&quot; _
						&amp; &quot;, [MinDate=DateSerial(1900, 1, 1)], [MaxDate=DateSerial(2200, 12, 31)]&quot;

Check:
	Set oControl = Nothing
	If Not _CheckNewControl(cstThisSub, cstSubArgs, ControlName, Place) Then GoTo Finally

	If IsMissing(Border) Or IsEmpty(Border) Then Border = &quot;3D&quot;
	If IsMissing(Dropdown) Or IsEmpty(Dropdown) Then Dropdown = False
	If IsMissing(MinDate) Or IsEmpty(MinDate) Then MinDate = DateSerial(1900, 1, 1)
	If IsMissing(MaxDate) Or IsEmpty(MaxDate) Then MaxDate = DateSerial(2200, 12, 31)
	
	If Not ScriptForge.SF_Utils._Validate(Border, &quot;Border&quot;, V_STRING, Array(&quot;3D&quot;, &quot;FLAT&quot;, &quot;NONE&quot;)) Then GoTo Finally
	If Not ScriptForge.SF_Utils._Validate(Dropdown, &quot;Dropdown&quot;, ScriptForge.V_BOOLEAN) Then GoTo Finally
	If Not ScriptForge.SF_Utils._Validate(MinDate, &quot;MinDate&quot;, ScriptForge.V_DATE) Then GoTo Finally
	If Not ScriptForge.SF_Utils._Validate(MaxDate, &quot;MaxDate&quot;, ScriptForge.V_DATE) Then GoTo Finally
	vFormats = SF_DialogUtils._FormatsList(&quot;DateField&quot;)

Try:
	&apos;	Manage specific properties
	iBorder = ScriptForge.SF_Array.IndexOf(Array(&quot;NONE&quot;, &quot;3D&quot;, &quot;FLAT&quot;), Border)
	With oMinDate
		.Year = Year(MinDate)	:	.Month = Month(MinDate)	:	.Day = Day(MinDate)
	End With
	With oMaxDate
		.Year = Year(MaxDate)	:	.Month = Month(MaxDate)	:	.Day = Day(MaxDate)
	End With
	vPropNames = Array(&quot;Border&quot;, &quot;Dropdown&quot;, &quot;DateMin&quot;, &quot;DateMax&quot;, &quot;DateFormat&quot;)
	vPropValues = Array(iBorder, CBool(Dropdown), oMinDate, oMaxDate, CInt(ScriptForge.SF_Array.IndexOf(vFormats(), &quot;Standard (short)&quot;)))

	&apos;	Create the control
	Set oControl = _CreateNewControl(&quot;UnoControlDateFieldModel&quot;, ControlName, Place, vPropNames, vPropValues)

Finally:
	Set CreateDateField = oControl
	ScriptForge.SF_Utils._ExitFunction(cstThisSub)
	Exit Function
End Function	&apos;	SFDialogs.SF_Dialog.CreateDateField

REM -----------------------------------------------------------------------------
Public Function CreateFileControl(Optional ByVal ControlName As Variant _
								, Optional ByRef Place As Variant _
								, Optional ByVal Border As Variant _
								) As Object
&apos;&apos;&apos;	Create a new control of type FileControl in the actual dialog.
&apos;&apos;&apos;	Specific args:
&apos;&apos;&apos;		Border: &quot;3D&quot; (default) or &quot;FLAT&quot; or &quot;NONE&quot;
&apos;&apos;&apos;	Returns:
&apos;&apos;&apos;		an instance of the SF_DialogControl class or Nothing
&apos;&apos;&apos;	Example:
&apos;&apos;&apos;		Set myFileControl = dialog.CreateFileControl(&quot;FileControl1&quot;, Array(20, 20, 60, 15))

Dim oControl As Object			&apos;	Return value
Dim iBorder As Integer			&apos;	Alias of border
Dim vPropNames As Variant		&apos;	Array of names of specific arguments
Dim vPropValues As Variant		&apos;	Array of values of specific arguments
Const cstThisSub = &quot;SFDialogs.Dialog.CreateFileControl&quot;
Const cstSubArgs = &quot;ControlName, Place, [Border=&quot;&quot;3D&quot;&quot;|&quot;&quot;FLAT&quot;&quot;|&quot;&quot;NONE&quot;&quot;]&quot;

Check:
	Set oControl = Nothing
	If Not _CheckNewControl(cstThisSub, cstSubArgs, ControlName, Place) Then GoTo Finally

	If IsMissing(Border) Or IsEmpty(Border) Then Border = &quot;3D&quot;
	If Not ScriptForge.SF_Utils._Validate(Border, &quot;Border&quot;, V_STRING, Array(&quot;3D&quot;, &quot;FLAT&quot;, &quot;NONE&quot;)) Then GoTo Finally

Try:
	&apos;	Manage specific properties
	iBorder = ScriptForge.SF_Array.IndexOf(Array(&quot;NONE&quot;, &quot;3D&quot;, &quot;FLAT&quot;), Border)
	vPropNames = Array(&quot;Border&quot;)
	vPropValues = Array(iBorder)

	&apos;	Create the control
	Set oControl = _CreateNewControl(&quot;UnoControlFileControlModel&quot;, ControlName, Place, vPropNames, vPropValues)

Finally:
	Set CreateFileControl = oControl
	ScriptForge.SF_Utils._ExitFunction(cstThisSub)
	Exit Function
Catch:
	GoTo Finally
End Function	&apos;	SFDialogs.SF_Dialog.CreateFileControl

REM -----------------------------------------------------------------------------
Public Function CreateFixedLine(Optional ByVal ControlName As Variant _
								, Optional ByRef Place As Variant _
								, Optional ByVal Orientation As Variant _
								) As Object
&apos;&apos;&apos;	Create a new control of type FixedLine in the actual dialog.
&apos;&apos;&apos;	Specific args:
&apos;&apos;&apos;		Orientation: &quot;H[orizontal]&quot; or &quot;V[ertical]&quot;.
&apos;&apos;&apos;	Returns:
&apos;&apos;&apos;		an instance of the SF_DialogControl class or Nothing
&apos;&apos;&apos;	Example:
&apos;&apos;&apos;		Set myFixedLine = dialog.CreateFixedLine(&quot;FixedLine1&quot;, Array(20, 20, 60, 15), Orientation := &quot;vertical&quot;)

Dim oControl As Object			&apos;	Return value
Dim vPropNames As Variant		&apos;	Array of names of specific arguments
Dim vPropValues As Variant		&apos;	Array of values of specific arguments
Const cstThisSub = &quot;SFDialogs.Dialog.CreateFixedLine&quot;
Const cstSubArgs = &quot;ControlName, Place, Orientation=&quot;&quot;H&quot;&quot;|&quot;&quot;Horizontal&quot;&quot;|&quot;&quot;V&quot;&quot;|&quot;&quot;Vertical&quot;&quot;&quot;

Check:
	Set oControl = Nothing
	If Not _CheckNewControl(cstThisSub, cstSubArgs, ControlName, Place) Then GoTo Finally

	If Not ScriptForge.SF_Utils._Validate(Orientation, &quot;Orientation&quot;, V_STRING, Array(&quot;H&quot;, &quot;Horizontal&quot;, &quot;V&quot;, &quot;Vertical&quot;)) Then GoTo Finally

Try:
	&apos;	Manage specific properties
	vPropNames = Array(&quot;Orientation&quot;)
	vPropValues = Array(CLng(Iif(Left(UCase(Orientation), 1) = &quot;V&quot;, 1, 0)))

	&apos;	Create the control
	Set oControl = _CreateNewControl(&quot;UnoControlFixedLineModel&quot;, ControlName, Place, vPropNames, vPropValues)

Finally:
	Set CreateFixedLine = oControl
	ScriptForge.SF_Utils._ExitFunction(cstThisSub)
	Exit Function
End Function	&apos;	SFDialogs.SF_Dialog.CreateFixedLine

REM -----------------------------------------------------------------------------
Public Function CreateFixedText(Optional ByVal ControlName As Variant _
								, Optional ByRef Place As Variant _
								, Optional ByVal Border As Variant _
								, Optional ByVal MultiLine As Variant _
								, Optional ByVal Align As Variant _
								, Optional ByVal VerticalAlign As Variant _
								) As Object
&apos;&apos;&apos;	Create a new control of type FixedText in the actual dialog.
&apos;&apos;&apos;	Specific args:
&apos;&apos;&apos;		Border: &quot;NONE&quot; (default) or &quot;FLAT&quot; or &quot;3D&quot;
&apos;&apos;&apos;		MultiLine: When True (default = False), the caption may be displayed on more than one line
&apos;&apos;&apos;		Align: horizontal alignment, &quot;LEFT&quot; (default) or &quot;CENTER&quot; or &quot;RIGHT&quot;
&apos;&apos;&apos;		VerticalAlign: vertical alignment, &quot;TOP&quot; (default) or &quot;MIDDLE&quot; or &quot;BOTTOM&quot;
&apos;&apos;&apos;	Returns:
&apos;&apos;&apos;		an instance of the SF_DialogControl class or Nothing
&apos;&apos;&apos;	Example:
&apos;&apos;&apos;		Set myFixedText = dialog.CreateFixedText(&quot;FixedText1&quot;, Array(20, 20, 60, 15), MultiLine := True)

Dim oControl As Object			&apos;	Return value
Dim iBorder As Integer			&apos;	Alias of border
Dim iAlign As Integer			&apos;	Alias of Align
Dim iVerticalAlign As Integer	&apos;	Alias of VerticalAlign
Dim vPropNames As Variant		&apos;	Array of names of specific arguments
Dim vPropValues As Variant		&apos;	Array of values of specific arguments
Const cstThisSub = &quot;SFDialogs.Dialog.CreateFixedText&quot;
Const cstSubArgs = &quot;ControlName, Place, [MultiLine=False], [Border=&quot;&quot;NONE&quot;&quot;|&quot;&quot;FLAT&quot;&quot;|&quot;&quot;3D&quot;&quot;]&quot; _
						&amp; &quot;, [Align=&quot;&quot;LEFT&quot;&quot;|&quot;&quot;CENTER&quot;&quot;|&quot;&quot;RIGHT&quot;&quot;], [VerticalAlign=&quot;&quot;TOP&quot;&quot;|&quot;&quot;MIDDLE&quot;&quot;|&quot;&quot;BOTTOM&quot;&quot;]&quot;

Check:
	Set oControl = Nothing
	If Not _CheckNewControl(cstThisSub, cstSubArgs, ControlName, Place) Then GoTo Finally

	If IsMissing(Border) Or IsEmpty(Border) Then Border = &quot;NONE&quot;
	If IsMissing(MultiLine) Or IsEmpty(MultiLine) Then MultiLine = False
	If IsMissing(Align) Or IsEmpty(Align) Then Align = &quot;LEFT&quot;
	If IsMissing(VerticalAlign) Or IsEmpty(VerticalAlign) Then VerticalAlign = &quot;TOP&quot;

	If Not ScriptForge.SF_Utils._Validate(Border, &quot;Border&quot;, V_STRING, Array(&quot;3D&quot;, &quot;FLAT&quot;, &quot;NONE&quot;)) Then GoTo Finally
	If Not ScriptForge.SF_Utils._Validate(MultiLine, &quot;MultiLine&quot;, ScriptForge.V_BOOLEAN) Then GoTo Finally
	If Not ScriptForge.SF_Utils._Validate(Align, &quot;Align&quot;, V_STRING, Array(&quot;LEFT&quot;, &quot;CENTER&quot;, &quot;RIGHT&quot;)) Then GoTo Finally
	If Not ScriptForge.SF_Utils._Validate(VerticalAlign, &quot;VerticalAlign&quot;, V_STRING, Array(&quot;TOP&quot;, &quot;MIDDLE&quot;, &quot;BOTTOM&quot;)) Then GoTo Finally

Try:
	&apos;	Manage specific properties
	iBorder = ScriptForge.SF_Array.IndexOf(Array(&quot;NONE&quot;, &quot;3D&quot;, &quot;FLAT&quot;), Border)
	iAlign = ScriptForge.SF_Array.IndexOf(Array(&quot;LEFT&quot;, &quot;CENTER&quot;, &quot;BOTTOM&quot;), Align)
	Select Case UCase(VerticalAlign)
		Case &quot;TOP&quot;		:	iVerticalAlign = com.sun.star.style.VerticalAlignment.TOP
		Case &quot;MIDDLE&quot;	:	iVerticalAlign = com.sun.star.style.VerticalAlignment.MIDDLE
		Case &quot;BOTTOM&quot;	:	iVerticalAlign = com.sun.star.style.VerticalAlignment.BOTTOM
	End Select
	vPropNames = Array(&quot;Border&quot;, &quot;MultiLine&quot;, &quot;Align&quot;, &quot;VerticalAlign&quot;)
	vPropValues = Array(iBorder, CBool(MultiLine), iAlign, iVerticalAlign)

	&apos;	Create the control
	Set oControl = _CreateNewControl(&quot;UnoControlFixedTextModel&quot;, ControlName, Place, vPropNames, vPropValues)

Finally:
	Set CreateFixedText = oControl
	ScriptForge.SF_Utils._ExitFunction(cstThisSub)
	Exit Function
End Function	&apos;	SFDialogs.SF_Dialog.CreateFixedText

REM -----------------------------------------------------------------------------
Public Function CreateFormattedField(Optional ByVal ControlName As Variant _
								, Optional ByRef Place As Variant _
								, Optional ByVal Border As Variant _
								, Optional ByVal SpinButton As Variant _
								, Optional ByVal MinValue As Variant _
								, Optional ByVal MaxValue As Variant _
								) As Object
&apos;&apos;&apos;	Create a new control of type FormattedField in the actual dialog.
&apos;&apos;&apos;	Specific args:
&apos;&apos;&apos;		Border: &quot;3D&quot; (default) or &quot;FLAT&quot; or &quot;NONE&quot;
&apos;&apos;&apos;		SpinButton:: when True (default = False), a spin button is present
&apos;&apos;&apos;		MinValue: the smallest value that can be entered in the control. Default = -1000000
&apos;&apos;&apos;		MaxValue: the largest value that can be entered in the control. Default = +1000000
&apos;&apos;&apos;	Returns:
&apos;&apos;&apos;		an instance of the SF_DialogControl class or Nothing
&apos;&apos;&apos;	Example:
&apos;&apos;&apos;		Set myFormattedField = dialog.CreateFormattedField(&quot;FormattedField1&quot;, Array(20, 20, 60, 15), SpinButton := True)
&apos;&apos;&apos;		myFormattedField.Format = &quot;##0,00E+00&quot;

Dim oControl As Object			&apos;	Return value
Dim iBorder As Integer			&apos;	Alias of border
Dim vPropNames As Variant		&apos;	Array of names of specific arguments
Dim vPropValues As Variant		&apos;	Array of values of specific arguments
Const cstThisSub = &quot;SFDialogs.Dialog.CreateFormattedField&quot;
Const cstSubArgs = &quot;ControlName, Place, [Border=&quot;&quot;3D&quot;&quot;|&quot;&quot;FLAT&quot;&quot;|&quot;&quot;NONE&quot;&quot;], [SpinButton=False]&quot; _
						&amp; &quot;, [MinValue=-1000000], MaxValue=+1000000]&quot;

Check:
	Set oControl = Nothing
	If Not _CheckNewControl(cstThisSub, cstSubArgs, ControlName, Place) Then GoTo Finally

	If IsMissing(Border) Or IsEmpty(Border) Then Border = &quot;3D&quot;
	If IsMissing(SpinButton) Or IsEmpty(SpinButton) Then SpinButton = False
	If IsMissing(MinValue) Or IsEmpty(MinValue) Then MinValue = -1000000.00
	If IsMissing(MaxValue) Or IsEmpty(MaxValue) Then MaxValue = +1000000.00
	
	If Not ScriptForge.SF_Utils._Validate(Border, &quot;Border&quot;, V_STRING, Array(&quot;3D&quot;, &quot;FLAT&quot;, &quot;NONE&quot;)) Then GoTo Finally
	If Not ScriptForge.SF_Utils._Validate(SpinButton, &quot;SpinButton&quot;, ScriptForge.V_BOOLEAN) Then GoTo Finally
	If Not ScriptForge.SF_Utils._Validate(MinValue, &quot;MinValue&quot;, ScriptForge.V_NUMERIC) Then GoTo Finally
	If Not ScriptForge.SF_Utils._Validate(MaxValue, &quot;MaxValue&quot;, ScriptForge.V_NUMERIC) Then GoTo Finally

Try:
	&apos;	Manage specific properties
	iBorder = ScriptForge.SF_Array.IndexOf(Array(&quot;NONE&quot;, &quot;3D&quot;, &quot;FLAT&quot;), Border)
	vPropNames = Array(&quot;FormatsSupplier&quot;, &quot;Border&quot;, &quot;Spin&quot;, &quot;EffectiveMin&quot;, &quot;EffectiveMax&quot;)
	vPropValues = Array(CreateUnoService(&quot;com.sun.star.util.NumberFormatsSupplier&quot;) _
						, iBorder, CBool(SpinButton), CDbl(MinValue), CDbl(MaxValue))

	&apos;	Create the control
	Set oControl = _CreateNewControl(&quot;UnoControlFormattedFieldModel&quot;, ControlName, Place, vPropNames, vPropValues)

Finally:
	Set CreateFormattedField = oControl
	ScriptForge.SF_Utils._ExitFunction(cstThisSub)
	Exit Function
Catch:
	GoTo Finally
End Function	&apos;	SFDialogs.SF_Dialog.CreateFormattedField

REM -----------------------------------------------------------------------------
Public Function CreateGroupBox(Optional ByVal ControlName As Variant _
								, Optional ByRef Place As Variant _
								) As Object
&apos;&apos;&apos;	Create a new control of type GroupBox in the actual dialog.
&apos;&apos;&apos;	Specific args:
&apos;&apos;&apos;		Orientation: &quot;H[orizontal]&quot; or &quot;V[ertical]&quot;
&apos;&apos;&apos;	Returns:
&apos;&apos;&apos;		an instance of the SF_DialogControl class or Nothing
&apos;&apos;&apos;	Example:
&apos;&apos;&apos;		Set myGroupBox = dialog.CreateGroupBox(&quot;GroupBox1&quot;, Array(20, 20, 60, 15))

Dim oControl As Object			&apos;	Return value
Dim vPropNames As Variant		&apos;	Array of names of specific arguments
Dim vPropValues As Variant		&apos;	Array of values of specific arguments
Const cstThisSub = &quot;SFDialogs.Dialog.CreateGroupBox&quot;
Const cstSubArgs = &quot;ControlName, Place&quot;

Check:
	Set oControl = Nothing
	If Not _CheckNewControl(cstThisSub, cstSubArgs, ControlName, Place) Then GoTo Finally

Try:
	&apos;	Manage specific properties
	vPropNames = Array()
	vPropValues = Array()

	&apos;	Create the control
	Set oControl = _CreateNewControl(&quot;UnoControlGroupBoxModel&quot;, ControlName, Place, vPropNames, vPropValues)

Finally:
	Set CreateGroupBox = oControl
	ScriptForge.SF_Utils._ExitFunction(cstThisSub)
	Exit Function
Catch:
	GoTo Finally
End Function	&apos;	SFDialogs.SF_Dialog.CreateGroupBox

REM -----------------------------------------------------------------------------
Public Function CreateHyperlink(Optional ByVal ControlName As Variant _
								, Optional ByRef Place As Variant _
								, Optional ByVal Border As Variant _
								, Optional ByVal MultiLine As Variant _
								, Optional ByVal Align As Variant _
								, Optional ByVal VerticalAlign As Variant _
								) As Object
&apos;&apos;&apos;	Create a new control of type Hyperlink in the actual dialog.
&apos;&apos;&apos;	Specific args:
&apos;&apos;&apos;		Border: &quot;NONE&quot; (default) or &quot;FLAT&quot; or &quot;3D&quot;
&apos;&apos;&apos;		MultiLine: When True (default = False), the caption may be displayed on more than one line
&apos;&apos;&apos;		Align: horizontal alignment, &quot;LEFT&quot; (default) or &quot;CENTER&quot; or &quot;RIGHT&quot;
&apos;&apos;&apos;		VerticalAlign: vertical alignment, &quot;TOP&quot; (default) or &quot;MIDDLE&quot; or &quot;BOTTOM&quot;
&apos;&apos;&apos;	Returns:
&apos;&apos;&apos;		an instance of the SF_DialogControl class or Nothing
&apos;&apos;&apos;	Example:
&apos;&apos;&apos;		Set myHyperlink = dialog.CreateHyperlink(&quot;Hyperlink1&quot;, Array(20, 20, 60, 15), MultiLine := True)

Dim oControl As Object			&apos;	Return value
Dim iBorder As Integer			&apos;	Alias of border
Dim iAlign As Integer			&apos;	Alias of Align
Dim iVerticalAlign As Integer	&apos;	Alias of VerticalAlign
Dim vPropNames As Variant		&apos;	Array of names of specific arguments
Dim vPropValues As Variant		&apos;	Array of values of specific arguments
Const cstThisSub = &quot;SFDialogs.Dialog.CreateHyperlink&quot;
Const cstSubArgs = &quot;ControlName, Place, [MultiLine=False], [Border=&quot;&quot;NONE&quot;&quot;|&quot;&quot;FLAT&quot;&quot;|&quot;&quot;3D&quot;&quot;]&quot; _
						&amp; &quot;, [Align=&quot;&quot;LEFT&quot;&quot;|&quot;&quot;CENTER&quot;&quot;|&quot;&quot;RIGHT&quot;&quot;], [VerticalAlign=&quot;&quot;TOP&quot;&quot;|&quot;&quot;MIDDLE&quot;&quot;|&quot;&quot;BOTTOM&quot;&quot;]&quot;

Check:
	Set oControl = Nothing
	If Not _CheckNewControl(cstThisSub, cstSubArgs, ControlName, Place) Then GoTo Finally

	If IsMissing(Border) Or IsEmpty(Border) Then Border = &quot;NONE&quot;
	If IsMissing(MultiLine) Or IsEmpty(MultiLine) Then MultiLine = False
	If IsMissing(Align) Or IsEmpty(Align) Then Align = &quot;LEFT&quot;
	If IsMissing(VerticalAlign) Or IsEmpty(VerticalAlign) Then VerticalAlign = &quot;TOP&quot;

	If Not ScriptForge.SF_Utils._Validate(Border, &quot;Border&quot;, V_STRING, Array(&quot;3D&quot;, &quot;FLAT&quot;, &quot;NONE&quot;)) Then GoTo Finally
	If Not ScriptForge.SF_Utils._Validate(MultiLine, &quot;MultiLine&quot;, ScriptForge.V_BOOLEAN) Then GoTo Finally
	If Not ScriptForge.SF_Utils._Validate(Align, &quot;Align&quot;, V_STRING, Array(&quot;LEFT&quot;, &quot;CENTER&quot;, &quot;RIGHT&quot;)) Then GoTo Finally
	If Not ScriptForge.SF_Utils._Validate(VerticalAlign, &quot;VerticalAlign&quot;, V_STRING, Array(&quot;TOP&quot;, &quot;MIDDLE&quot;, &quot;BOTTOM&quot;)) Then GoTo Finally

Try:
	&apos;	Manage specific properties
	iBorder = ScriptForge.SF_Array.IndexOf(Array(&quot;NONE&quot;, &quot;3D&quot;, &quot;FLAT&quot;), Border)
	iAlign = ScriptForge.SF_Array.IndexOf(Array(&quot;LEFT&quot;, &quot;CENTER&quot;, &quot;BOTTOM&quot;), Align)
	Select Case UCase(VerticalAlign)
		Case &quot;TOP&quot;		:	iVerticalAlign = com.sun.star.style.VerticalAlignment.TOP
		Case &quot;MIDDLE&quot;	:	iVerticalAlign = com.sun.star.style.VerticalAlignment.MIDDLE
		Case &quot;BOTTOM&quot;	:	iVerticalAlign = com.sun.star.style.VerticalAlignment.BOTTOM
	End Select
	vPropNames = Array(&quot;Border&quot;, &quot;MultiLine&quot;, &quot;Align&quot;, &quot;VerticalAlign&quot;)
	vPropValues = Array(iBorder, CBool(MultiLine), iAlign, iVerticalAlign)

	&apos;	Create the control
	Set oControl = _CreateNewControl(&quot;UnoControlFixedHyperlinkModel&quot;, ControlName, Place, vPropNames, vPropValues)

Finally:
	Set CreateHyperlink = oControl
	ScriptForge.SF_Utils._ExitFunction(cstThisSub)
	Exit Function
End Function	&apos;	SFDialogs.SF_Dialog.CreateHyperlink

REM -----------------------------------------------------------------------------
Public Function CreateImageControl(Optional ByVal ControlName As Variant _
								, Optional ByRef Place As Variant _
								, Optional ByVal Border As Variant _
								, Optional ByVal Scale As Variant _
								) As Object
&apos;&apos;&apos;	Create a new control of type ImageControl in the actual dialog.
&apos;&apos;&apos;	Specific args:
&apos;&apos;&apos;		Border: &quot;3D&quot; (default) or &quot;FLAT&quot; or &quot;NONE&quot;
&apos;&apos;&apos;		Scale: One of next values: &quot;FITTOSIZE&quot; (default), &quot;KEEPRATIO&quot; or &quot;NO&quot;
&apos;&apos;&apos;	Returns:
&apos;&apos;&apos;		an instance of the SF_DialogControl class or Nothing
&apos;&apos;&apos;	Example:
&apos;&apos;&apos;		Set myImageControl = dialog.CreateImageControl(&quot;ImageControl1&quot;, Array(20, 20, 60, 15))

Dim oControl As Object			&apos;	Return value
Dim iBorder As Integer			&apos;	Alias of border
Dim iScale As Integer			&apos;	Alias of Scale
Dim bScale As Boolean			&apos;	When False, no scaling
Dim vPropNames As Variant		&apos;	Array of names of specific arguments
Dim vPropValues As Variant		&apos;	Array of values of specific arguments
Const cstThisSub = &quot;SFDialogs.Dialog.CreateImageControl&quot;
Const cstSubArgs = &quot;ControlName, Place, [Border=&quot;&quot;3D&quot;&quot;|&quot;&quot;FLAT&quot;&quot;|&quot;&quot;NONE&quot;&quot;], [Scale=&quot;&quot;FITTOSIZE&quot;&quot;|&quot;&quot;KEEPRATIO&quot;&quot;|&quot;&quot;NO&quot;&quot;]&quot;

Check:
	Set oControl = Nothing
	If Not _CheckNewControl(cstThisSub, cstSubArgs, ControlName, Place) Then GoTo Finally

	If IsMissing(Border) Or IsEmpty(Border) Then Border = &quot;3D&quot;
	If IsMissing(Scale) Or IsEmpty(Scale) Then Scale = &quot;FITTOSIZE&quot;
	If Not ScriptForge.SF_Utils._Validate(Border, &quot;Border&quot;, V_STRING, Array(&quot;3D&quot;, &quot;FLAT&quot;, &quot;NONE&quot;)) Then GoTo Finally
	If Not ScriptForge.SF_Utils._Validate(Scale, &quot;Scale&quot;, V_STRING, Array(&quot;FITTOSIZE&quot;, &quot;KEEPRATIO&quot;, &quot;NO&quot;)) Then GoTo Finally

Try:
	&apos;	Manage specific properties
	iBorder = ScriptForge.SF_Array.IndexOf(Array(&quot;NONE&quot;, &quot;3D&quot;, &quot;FLAT&quot;), Border)
	Select Case UCase(Scale)
		Case &quot;NO&quot;			:	iScale = com.sun.star.awt.ImageScaleMode.NONE			:	bScale = False
		Case &quot;FITTOSIZE&quot;	:	iScale = com.sun.star.awt.ImageScaleMode.ANISOTROPIC	:	bScale = True
		Case &quot;KEEPRATIO&quot;	:	iScale = com.sun.star.awt.ImageScaleMode.ISOTROPIC		:	bScale = True
	End Select
	vPropNames = Array(&quot;Border&quot;, &quot;ScaleImage&quot;, &quot;ScaleMode&quot;)
	vPropValues = Array(iBorder, bScale, iScale)

	&apos;	Create the control
	Set oControl = _CreateNewControl(&quot;UnoControlImageControlModel&quot;, ControlName, Place, vPropNames, vPropValues)

Finally:
	Set CreateImageControl = oControl
	ScriptForge.SF_Utils._ExitFunction(cstThisSub)
	Exit Function
Catch:
	GoTo Finally
End Function	&apos;	SFDialogs.SF_Dialog.CreateImageControl

REM -----------------------------------------------------------------------------
Public Function CreateListBox(Optional ByVal ControlName As Variant _
								, Optional ByRef Place As Variant _
								, Optional ByVal Border As Variant _
								, Optional ByVal Dropdown As Variant _
								, Optional ByVal LineCount As Variant _
								, Optional ByVal MultiSelect As Variant _
								) As Object
&apos;&apos;&apos;	Create a new control of type ListBox in the actual dialog.
&apos;&apos;&apos;	Specific args:
&apos;&apos;&apos;		Border: &quot;3D&quot; (default) or &quot;FLAT&quot; or &quot;NONE&quot;
&apos;&apos;&apos;		Dropdown: When True (default), a drop down button is displayed
&apos;&apos;&apos;		LineCount: Specifies the maximum line count displayed in the drop down (default = 5)
&apos;&apos;&apos;		MultiSelect: When True, more than 1 entry may be selected. Default = False
&apos;&apos;&apos;	Returns:
&apos;&apos;&apos;		an instance of the SF_DialogControl class or Nothing
&apos;&apos;&apos;	Example:
&apos;&apos;&apos;		Set myListBox = dialog.CreateListBox(&quot;ListBox1&quot;, Array(20, 20, 60, 15), Dropdown := True, MultiSelect := True)

Dim oControl As Object			&apos;	Return value
Dim iBorder As Integer			&apos;	Alias of border
Dim vPropNames As Variant		&apos;	Array of names of specific arguments
Dim vPropValues As Variant		&apos;	Array of values of specific arguments
Const cstThisSub = &quot;SFDialogs.Dialog.CreateListBox&quot;
Const cstSubArgs = &quot;ControlName, Place, [Border=&quot;&quot;3D&quot;&quot;|&quot;&quot;FLAT&quot;&quot;|&quot;&quot;NONE&quot;&quot;], [Dropdown=True], [LineCount=5], [MultiSelect=False]&quot;

Check:
	Set oControl = Nothing
	If Not _CheckNewControl(cstThisSub, cstSubArgs, ControlName, Place) Then GoTo Finally

	If IsMissing(Border) Or IsEmpty(Border) Then Border = &quot;3D&quot;
	If IsMissing(Dropdown) Or IsEmpty(Dropdown) Then Dropdown = True
	If IsMissing(LineCount) Or IsEmpty(LineCount) Then LineCount = 5
	If IsMissing(MultiSelect) Or IsEmpty(MultiSelect) Then MultiSelect = True

	If Not ScriptForge.SF_Utils._Validate(Border, &quot;Border&quot;, V_STRING, Array(&quot;3D&quot;, &quot;FLAT&quot;, &quot;NONE&quot;)) Then GoTo Finally
	If Not ScriptForge.SF_Utils._Validate(Dropdown, &quot;Dropdown&quot;, ScriptForge.V_BOOLEAN) Then GoTo Finally
	If Not ScriptForge.SF_Utils._Validate(LineCount, &quot;LineCount&quot;, ScriptForge.V_NUMERIC) Then GoTo Finally
	If Not ScriptForge.SF_Utils._Validate(MultiSelect, &quot;MultiSelect&quot;, ScriptForge.V_BOOLEAN) Then GoTo Finally

Try:
	&apos;	Manage specific properties
	iBorder = ScriptForge.SF_Array.IndexOf(Array(&quot;NONE&quot;, &quot;3D&quot;, &quot;FLAT&quot;), Border)
	vPropNames = Array(&quot;Border&quot;, &quot;Dropdown&quot;, &quot;LineCount&quot;, &quot;MultiSelection&quot;)
	vPropValues = Array(iBorder, CBool(Dropdown), CInt(LineCount), CBool(MultiSelect))

	&apos;	Create the control
	Set oControl = _CreateNewControl(&quot;UnoControlListBoxModel&quot;, ControlName, Place, vPropNames, vPropValues)

Finally:
	Set CreateListBox = oControl
	ScriptForge.SF_Utils._ExitFunction(cstThisSub)
	Exit Function
End Function	&apos;	SFDialogs.SF_Dialog.CreateListBox

REM -----------------------------------------------------------------------------
Public Function CreateNumericField(Optional ByVal ControlName As Variant _
								, Optional ByRef Place As Variant _
								, Optional ByVal Border As Variant _
								, Optional ByVal SpinButton As Variant _
								, Optional ByVal MinValue As Variant _
								, Optional ByVal MaxValue As Variant _
								, Optional ByVal Increment As Variant _
								, Optional ByVal Accuracy As Variant _
								) As Object
&apos;&apos;&apos;	Create a new control of type NumericField in the actual dialog.
&apos;&apos;&apos;	Specific args:
&apos;&apos;&apos;		Border: &quot;3D&quot; (default) or &quot;FLAT&quot; or &quot;NONE&quot;
&apos;&apos;&apos;		SpinButton:: when True (default = False), a spin button is present
&apos;&apos;&apos;		MinValue: the smallest value that can be entered in the control. Default = -1000000
&apos;&apos;&apos;		MaxValue: the largest value that can be entered in the control. Default = +1000000
&apos;&apos;&apos;		Increment: the step when the spin button is pressed. Default = 1
&apos;&apos;&apos;		Accuracy: specifies the decimal accuracy. Default = 2 decimal digits
&apos;&apos;&apos;	Returns:
&apos;&apos;&apos;		an instance of the SF_DialogControl class or Nothing
&apos;&apos;&apos;	Example:
&apos;&apos;&apos;		Set myNumericField = dialog.CreateNumericField(&quot;NumericField1&quot;, Array(20, 20, 60, 15), SpinButton := True)

Dim oControl As Object			&apos;	Return value
Dim iBorder As Integer			&apos;	Alias of border
Dim vPropNames As Variant		&apos;	Array of names of specific arguments
Dim vPropValues As Variant		&apos;	Array of values of specific arguments
Const cstThisSub = &quot;SFDialogs.Dialog.CreateNumericField&quot;
Const cstSubArgs = &quot;ControlName, Place, [Border=&quot;&quot;3D&quot;&quot;|&quot;&quot;FLAT&quot;&quot;|&quot;&quot;NONE&quot;&quot;], [SpinButton=False]&quot; _
						&amp; &quot;, [MinValue=-1000000], MaxValue=+1000000], [Increment=1], [Accuracy=2]&quot;

Check:
	Set oControl = Nothing
	If Not _CheckNewControl(cstThisSub, cstSubArgs, ControlName, Place) Then GoTo Finally

	If IsMissing(Border) Or IsEmpty(Border) Then Border = &quot;3D&quot;
	If IsMissing(SpinButton) Or IsEmpty(SpinButton) Then SpinButton = False
	If IsMissing(MinValue) Or IsEmpty(MinValue) Then MinValue = -1000000.00
	If IsMissing(MaxValue) Or IsEmpty(MaxValue) Then MaxValue = +1000000.00
	If IsMissing(Increment) Or IsEmpty(Increment) Then Increment = 1.00
	If IsMissing(Accuracy) Or IsEmpty(Accuracy) Then Accuracy = 2
	
	If Not ScriptForge.SF_Utils._Validate(Border, &quot;Border&quot;, V_STRING, Array(&quot;3D&quot;, &quot;FLAT&quot;, &quot;NONE&quot;)) Then GoTo Finally
	If Not ScriptForge.SF_Utils._Validate(SpinButton, &quot;SpinButton&quot;, ScriptForge.V_BOOLEAN) Then GoTo Finally
	If Not ScriptForge.SF_Utils._Validate(MinValue, &quot;MinValue&quot;, ScriptForge.V_NUMERIC) Then GoTo Finally
	If Not ScriptForge.SF_Utils._Validate(MaxValue, &quot;MaxValue&quot;, ScriptForge.V_NUMERIC) Then GoTo Finally
	If Not ScriptForge.SF_Utils._Validate(Increment, &quot;Increment&quot;, ScriptForge.V_NUMERIC) Then GoTo Finally
	If Not ScriptForge.SF_Utils._Validate(Accuracy, &quot;Accuracy&quot;, ScriptForge.V_NUMERIC) Then GoTo Finally

Try:
	&apos;	Manage specific properties
	iBorder = ScriptForge.SF_Array.IndexOf(Array(&quot;NONE&quot;, &quot;3D&quot;, &quot;FLAT&quot;), Border)
	vPropNames = Array(&quot;Border&quot;, &quot;Spin&quot;, &quot;ValueMin&quot;, &quot;ValueMax&quot;, &quot;ValueStep&quot;, &quot;DecimalAccuracy&quot;)
	vPropValues = Array(iBorder, CBool(SpinButton), CDbl(MinValue), CDbl(MaxValue), CDbl(Increment), CInt(Accuracy))

	&apos;	Create the control
	Set oControl = _CreateNewControl(&quot;UnoControlNumericFieldModel&quot;, ControlName, Place, vPropNames, vPropValues)

Finally:
	Set CreateNumericField = oControl
	ScriptForge.SF_Utils._ExitFunction(cstThisSub)
	Exit Function
End Function	&apos;	SFDialogs.SF_Dialog.CreateNumericField

REM -----------------------------------------------------------------------------
Public Function CreatePatternField(Optional ByVal ControlName As Variant _
								, Optional ByRef Place As Variant _
								, Optional ByVal Border As Variant _
								, Optional ByVal EditMask As Variant _
								, Optional ByVal LiteralMask As Variant _
								) As Object
&apos;&apos;&apos;	Create a new control of type PatternField in the actual dialog.
&apos;&apos;&apos;	Specific args:
&apos;&apos;&apos;		Border: &quot;3D&quot; (default) or &quot;FLAT&quot; or &quot;NONE&quot;
&apos;&apos;&apos;		Editmask: a character code that determines what the user may enter
&apos;&apos;&apos;		LiteralMask: contains the initial values that are displayed in the pattern field
&apos;&apos;&apos;			More details on https://wiki.documentfoundation.org/Documentation/DevGuide/Graphical_User_Interfaces#Pattern_Field
&apos;&apos;&apos;	Returns:
&apos;&apos;&apos;		an instance of the SF_DialogControl class or Nothing
&apos;&apos;&apos;	Example:
&apos;&apos;&apos;		Set myPatternField = dialog.CreatePatternField(&quot;PatternField1&quot;, Array(20, 20, 60, 15), EditMask := &quot;NNLNNLLLLL&quot;, LiteralMask := &quot;__.__.2002&quot;)

Dim oControl As Object			&apos;	Return value
Dim iBorder As Integer			&apos;	Alias of border
Dim vPropNames As Variant		&apos;	Array of names of specific arguments
Dim vPropValues As Variant		&apos;	Array of values of specific arguments
Const cstThisSub = &quot;SFDialogs.Dialog.CreatePatternField&quot;
Const cstSubArgs = &quot;ControlName, Place, [Border=&quot;&quot;3D&quot;&quot;|&quot;&quot;FLAT&quot;&quot;|&quot;&quot;NONE&quot;&quot;], [EditMask=&quot;&quot;&quot;&quot;], [LiteralMask=&quot;&quot;&quot;&quot;]&quot;

Check:
	Set oControl = Nothing
	If Not _CheckNewControl(cstThisSub, cstSubArgs, ControlName, Place) Then GoTo Finally

	If IsMissing(Border) Or IsEmpty(Border) Then Border = &quot;3D&quot;
	If IsMissing(EditMask) Or IsEmpty(EditMask) Then EditMask = &quot;&quot;
	If IsMissing(LiteralMask) Or IsEmpty(LiteralMask) Then LiteralMask = &quot;&quot;

	If Not ScriptForge.SF_Utils._Validate(Border, &quot;Border&quot;, V_STRING, Array(&quot;3D&quot;, &quot;FLAT&quot;, &quot;NONE&quot;)) Then GoTo Finally
	If Not ScriptForge.SF_Utils._Validate(EditMask, &quot;EditMask&quot;, V_STRING) Then GoTo Finally
	If Not ScriptForge.SF_Utils._Validate(LiteralMask, &quot;LiteralMask&quot;, V_STRING) Then GoTo Finally

Try:
	&apos;	Manage specific properties
	iBorder = ScriptForge.SF_Array.IndexOf(Array(&quot;NONE&quot;, &quot;3D&quot;, &quot;FLAT&quot;), Border)
	vPropNames = Array(&quot;Border&quot;, &quot;EditMask&quot;, &quot;LiteralMask&quot;)
	vPropValues = Array(iBorder, EditMask, LiteralMask)

	&apos;	Create the control
	Set oControl = _CreateNewControl(&quot;UnoControlPatternFieldModel&quot;, ControlName, Place, vPropNames, vPropValues)

Finally:
	Set CreatePatternField = oControl
	ScriptForge.SF_Utils._ExitFunction(cstThisSub)
	Exit Function
Catch:
	GoTo Finally
End Function	&apos;	SFDialogs.SF_Dialog.CreatePatternField

REM -----------------------------------------------------------------------------
Public Function CreateProgressBar(Optional ByVal ControlName As Variant _
								, Optional ByRef Place As Variant _
								, Optional ByVal Border As Variant _
								, Optional ByVal MinValue As Variant _
								, Optional ByVal MaxValue As Variant _
								) As Object
&apos;&apos;&apos;	Create a new control of type ProgressBar in the actual dialog.
&apos;&apos;&apos;	Specific args:
&apos;&apos;&apos;		Border: &quot;3D&quot; (default) or &quot;FLAT&quot; or &quot;NONE&quot;
&apos;&apos;&apos;		MinValue: the smallest value that can be entered in the control. Default = 0
&apos;&apos;&apos;		MaxValue: the largest value that can be entered in the control. Default = 100
&apos;&apos;&apos;	Returns:
&apos;&apos;&apos;		an instance of the SF_DialogControl class or Nothing
&apos;&apos;&apos;	Example:
&apos;&apos;&apos;		Set myProgressBar = dialog.CreateProgressBar(&quot;ProgressBar1&quot;, Array(20, 20, 60, 15), MaxValue := 1000)

Dim oControl As Object			&apos;	Return value
Dim iBorder As Integer			&apos;	Alias of border
Dim vPropNames As Variant		&apos;	Array of names of specific arguments
Dim vPropValues As Variant		&apos;	Array of values of specific arguments
Const cstThisSub = &quot;SFDialogs.Dialog.CreateProgressBar&quot;
Const cstSubArgs = &quot;ControlName, Place, [Border=&quot;&quot;3D&quot;&quot;|&quot;&quot;FLAT&quot;&quot;|&quot;&quot;NONE&quot;&quot;], [MinValue=0], MaxValue=100]&quot;

Check:
	Set oControl = Nothing
	If Not _CheckNewControl(cstThisSub, cstSubArgs, ControlName, Place) Then GoTo Finally

	If IsMissing(Border) Or IsEmpty(Border) Then Border = &quot;3D&quot;
	If IsMissing(MinValue) Or IsEmpty(MinValue) Then MinValue = 0
	If IsMissing(MaxValue) Or IsEmpty(MaxValue) Then MaxValue = 100
	
	If Not ScriptForge.SF_Utils._Validate(Border, &quot;Border&quot;, V_STRING, Array(&quot;3D&quot;, &quot;FLAT&quot;, &quot;NONE&quot;)) Then GoTo Finally
	If Not ScriptForge.SF_Utils._Validate(MinValue, &quot;MinValue&quot;, ScriptForge.V_NUMERIC) Then GoTo Finally
	If Not ScriptForge.SF_Utils._Validate(MaxValue, &quot;MaxValue&quot;, ScriptForge.V_NUMERIC) Then GoTo Finally

Try:
	&apos;	Manage specific properties
	iBorder = ScriptForge.SF_Array.IndexOf(Array(&quot;NONE&quot;, &quot;3D&quot;, &quot;FLAT&quot;), Border)
	vPropNames = Array(&quot;Border&quot;, &quot;ProgressValueMin&quot;, &quot;ProgressValueMax&quot;)
	vPropValues = Array(iBorder, CLng(MinValue), CLng(MaxValue))

	&apos;	Create the control
	Set oControl = _CreateNewControl(&quot;UnoControlProgressBarModel&quot;, ControlName, Place, vPropNames, vPropValues)

Finally:
	Set CreateProgressBar = oControl
	ScriptForge.SF_Utils._ExitFunction(cstThisSub)
	Exit Function
End Function	&apos;	SFDialogs.SF_Dialog.CreateProgressBar

REM -----------------------------------------------------------------------------
Public Function CreateRadioButton(Optional ByVal ControlName As Variant _
								, Optional ByRef Place As Variant _
								, Optional ByVal MultiLine As Variant _
								) As Object
&apos;&apos;&apos;	Create a new control of type RadioButton in the actual dialog.
&apos;&apos;&apos;	Specific args:
&apos;&apos;&apos;		MultiLine: When True (default = False), the caption may be displayed on more than one line
&apos;&apos;&apos;	Returns:
&apos;&apos;&apos;		an instance of the SF_DialogControl class or Nothing
&apos;&apos;&apos;	Example:
&apos;&apos;&apos;		Set myRadioButton = dialog.CreateRadioButton(&quot;RadioButton1&quot;, Array(20, 20, 60, 15), MultiLine := True)

Dim oControl As Object			&apos;	Return value
Dim vPropNames As Variant		&apos;	Array of names of specific arguments
Dim vPropValues As Variant		&apos;	Array of values of specific arguments
Const cstThisSub = &quot;SFDialogs.Dialog.CreateRadioButton&quot;
Const cstSubArgs = &quot;ControlName, Place, [MultiLine=False]&quot;

Check:
	Set oControl = Nothing
	If Not _CheckNewControl(cstThisSub, cstSubArgs, ControlName, Place) Then GoTo Finally

	If IsMissing(MultiLine) Or IsEmpty(MultiLine) Then MultiLine = False
	If Not ScriptForge.SF_Utils._Validate(MultiLine, &quot;MultiLine&quot;, ScriptForge.V_BOOLEAN) Then GoTo Finally

Try:
	&apos;	Manage specific properties
	vPropNames = Array(&quot;VisualEffect&quot;, &quot;MultiLine&quot;)
	vPropValues = Array(1, CBool(MultiLine))

	&apos;	Create the control
	Set oControl = _CreateNewControl(&quot;UnoControlRadioButtonModel&quot;, ControlName, Place, vPropNames, vPropValues)

Finally:
	Set CreateRadioButton = oControl
	ScriptForge.SF_Utils._ExitFunction(cstThisSub)
	Exit Function
End Function	&apos;	SFDialogs.SF_Dialog.CreateRadioButton

REM -----------------------------------------------------------------------------
Public Function CreateScrollBar(Optional ByVal ControlName As Variant _
								, Optional ByRef Place As Variant _
								, Optional ByVal Orientation As Variant _
								, Optional ByVal Border As Variant _
								, Optional ByVal MinValue As Variant _
								, Optional ByVal MaxValue As Variant _
								) As Object
&apos;&apos;&apos;	Create a new control of type ScrollBar in the actual dialog.
&apos;&apos;&apos;	Specific args:
&apos;&apos;&apos;		Orientation: H[orizontal] or V[ertical]
&apos;&apos;&apos;		Border: &quot;3D&quot; (default) or &quot;FLAT&quot; or &quot;NONE&quot;
&apos;&apos;&apos;		MinValue: the smallest value that can be entered in the control. Default = 0
&apos;&apos;&apos;		MaxValue: the largest value that can be entered in the control. Default = 100
&apos;&apos;&apos;	Returns:
&apos;&apos;&apos;		an instance of the SF_DialogControl class or Nothing
&apos;&apos;&apos;	Example:
&apos;&apos;&apos;		Set myScrollBar = dialog.CreateScrollBar(&quot;ScrollBar1&quot;, Array(20, 20, 60, 15), MaxValue := 1000)

Dim oControl As Object			&apos;	Return value
Dim iBorder As Integer			&apos;	Alias of border
Dim vPropNames As Variant		&apos;	Array of names of specific arguments
Dim vPropValues As Variant		&apos;	Array of values of specific arguments
Const cstThisSub = &quot;SFDialogs.Dialog.CreateScrollBar&quot;
Const cstSubArgs = &quot;ControlName, Place, Orientation=&quot;&quot;H&quot;&quot;|&quot;&quot;Horizontal&quot;&quot;|&quot;&quot;V&quot;&quot;|&quot;&quot;Vertical&quot;&quot;&quot; _
					&amp; &quot;, [Border=&quot;&quot;3D&quot;&quot;|&quot;&quot;FLAT&quot;&quot;|&quot;&quot;NONE&quot;&quot;], [MinValue=0], MaxValue=100]&quot;

Check:
	Set oControl = Nothing
	If Not _CheckNewControl(cstThisSub, cstSubArgs, ControlName, Place) Then GoTo Finally

	If IsMissing(Border) Or IsEmpty(Border) Then Border = &quot;3D&quot;
	If IsMissing(MinValue) Or IsEmpty(MinValue) Then MinValue = 0
	If IsMissing(MaxValue) Or IsEmpty(MaxValue) Then MaxValue = 100
	
	If Not ScriptForge.SF_Utils._Validate(Orientation, &quot;Orientation&quot;, V_STRING, Array(&quot;H&quot;, &quot;Horizontal&quot;, &quot;V&quot;, &quot;Vertical&quot;)) Then GoTo Finally
	If Not ScriptForge.SF_Utils._Validate(Border, &quot;Border&quot;, V_STRING, Array(&quot;3D&quot;, &quot;FLAT&quot;, &quot;NONE&quot;)) Then GoTo Finally
	If Not ScriptForge.SF_Utils._Validate(MinValue, &quot;MinValue&quot;, ScriptForge.V_NUMERIC) Then GoTo Finally
	If Not ScriptForge.SF_Utils._Validate(MaxValue, &quot;MaxValue&quot;, ScriptForge.V_NUMERIC) Then GoTo Finally

Try:
	&apos;	Manage specific properties
	iBorder = ScriptForge.SF_Array.IndexOf(Array(&quot;NONE&quot;, &quot;3D&quot;, &quot;FLAT&quot;), Border)
	vPropNames = Array(&quot;Border&quot;, &quot;Orientation&quot;, &quot;ScrollValueMin&quot;, &quot;ScrollValueMax&quot;)
	vPropValues = Array(iBorder, CLng(Iif(Left(UCase(Orientation), 1) = &quot;V&quot;, 1, 0)), CLng(MinValue), CLng(MaxValue))

	&apos;	Create the control
	Set oControl = _CreateNewControl(&quot;UnoControlScrollBarModel&quot;, ControlName, Place, vPropNames, vPropValues)

Finally:
	Set CreateScrollBar = oControl
	ScriptForge.SF_Utils._ExitFunction(cstThisSub)
	Exit Function
End Function	&apos;	SFDialogs.SF_Dialog.CreateScrollBar

REM -----------------------------------------------------------------------------
Public Function CreateTableControl(Optional ByVal ControlName As Variant _
								, Optional ByRef Place As Variant _
								, Optional ByVal Border As Variant _
								, Optional ByVal RowHeaders As Variant _
								, Optional ByVal ColumnHeaders As Variant _
								, Optional ByVal ScrollBars As Variant _
								, Optional ByVal GridLines As Variant _
								) As Object
&apos;&apos;&apos;	Create a new control of type TableControl in the actual dialog.
&apos;&apos;&apos;	To fill the table with data, use the SetTableData() method
&apos;&apos;&apos;	Specific args:
&apos;&apos;&apos;		Border: &quot;3D&quot; (default) or &quot;FLAT&quot; or &quot;NONE&quot;
&apos;&apos;&apos;		RowHeaders: when True (default), the row headers are shown
&apos;&apos;&apos;		ColumnHeaders: when True (default), the column headers are shown
&apos;&apos;&apos;		ScrollBars: H[orizontal] or V[ertical] or B[oth] or N[one] (default)
&apos;&apos;&apos;			Note that scrollbars always appear dynamically when they are needed
&apos;&apos;&apos;		GridLines: when True (default = False) horizontal and vertical lines are painted between the grid cells
&apos;&apos;&apos;	Returns:
&apos;&apos;&apos;		an instance of the SF_DialogControl class or Nothing
&apos;&apos;&apos;	Example:
&apos;&apos;&apos;		Set myTableControl = dialog.CreateTableControl(&quot;TableControl1&quot;, Array(20, 20, 60, 15), ScrollBars := &quot;B&quot;)

Dim oControl As Object			&apos;	Return value
Dim iBorder As Integer			&apos;	Alias of border
Dim vPropNames As Variant		&apos;	Array of names of specific arguments
Dim vPropValues As Variant		&apos;	Array of values of specific arguments
Const cstThisSub = &quot;SFDialogs.Dialog.CreateTableControl&quot;
Const cstSubArgs = &quot;ControlName, Place, [Border=&quot;&quot;3D&quot;&quot;|&quot;&quot;FLAT&quot;&quot;|&quot;&quot;NONE&quot;&quot;], [RowHeaders=True], [ColumnHeaders=True]&quot; _
					&amp; &quot;, [ScrollBars=&quot;&quot;N&quot;&quot;|&quot;&quot;None&quot;&quot;|&quot;&quot;B&quot;&quot;|&quot;&quot;Both&quot;&quot;|&quot;&quot;H&quot;&quot;|&quot;&quot;Horizontal&quot;&quot;|&quot;&quot;V&quot;&quot;|&quot;&quot;Vertical&quot;&quot;&quot;

Check:
	Set oControl = Nothing
	If Not _CheckNewControl(cstThisSub, cstSubArgs, ControlName, Place) Then GoTo Finally

	If IsMissing(Border) Or IsEmpty(Border) Then Border = &quot;3D&quot;
	If IsMissing(RowHeaders) Or IsEmpty(RowHeaders) Then RowHeaders = True
	If IsMissing(ColumnHeaders) Or IsEmpty(ColumnHeaders) Then ColumnHeaders = True
	If IsMissing(ScrollBars) Or IsEmpty(ScrollBars) Then ScrollBars = &quot;None&quot;
	If IsMissing(GridLines) Or IsEmpty(GridLines) Then GridLines = False
	
	If Not ScriptForge.SF_Utils._Validate(Border, &quot;Border&quot;, V_STRING, Array(&quot;3D&quot;, &quot;FLAT&quot;, &quot;NONE&quot;)) Then GoTo Finally
	If Not ScriptForge.SF_Utils._Validate(RowHeaders, &quot;RowHeaders&quot;, ScriptForge.V_BOOLEAN) Then GoTo Finally
	If Not ScriptForge.SF_Utils._Validate(ColumnHeaders, &quot;ColumnHeaders&quot;, ScriptForge.V_BOOLEAN) Then GoTo Finally
	If Not ScriptForge.SF_Utils._Validate(ScrollBars, &quot;ScrollBars&quot;, V_STRING, Array(&quot;N&quot;, &quot;None&quot;, &quot;B&quot;, &quot;Both&quot;, &quot;H&quot;, &quot;Horizontal&quot;, &quot;V&quot;, &quot;Vertical&quot;)) Then GoTo Finally
	If Not ScriptForge.SF_Utils._Validate(GridLines, &quot;GridLines&quot;, ScriptForge.V_BOOLEAN) Then GoTo Finally

Try:
	&apos;	Manage specific properties
	iBorder = ScriptForge.SF_Array.IndexOf(Array(&quot;NONE&quot;, &quot;3D&quot;, &quot;FLAT&quot;), Border)
	vPropNames = Array(&quot;Border&quot;, &quot;ShowRowHeader&quot;, &quot;ShowColumnHeader&quot;, &quot;VScroll&quot;, &quot;HScroll&quot;, &quot;UseGridLines&quot;)
	vPropValues = Array(iBorder, CBool(RowHeaders), CBool(ColumnHeaders) _
							, Left(ScrollBars, 1) = &quot;B&quot; Or Left(ScrollBars, 1) = &quot;V&quot; _
							, Left(ScrollBars, 1) = &quot;B&quot; Or Left(ScrollBars, 1) = &quot;H&quot; _
							, CBool(GridLines) _
							)

	&apos;	Create the control
	Set oControl = _CreateNewControl(&quot;grid.UnoControlGridModel&quot;, ControlName, Place, vPropNames, vPropValues)

Finally:
	Set CreateTableControl = oControl
	ScriptForge.SF_Utils._ExitFunction(cstThisSub)
	Exit Function
End Function	&apos;	SFDialogs.SF_Dialog.CreateTableControl

REM -----------------------------------------------------------------------------
Public Function CreateTabPageContainer(Optional ByVal ControlName As Variant _
									, Optional ByRef Place As Variant _
									, Optional ByRef TabHeaders As Variant _
									, Optional ByVal Border As Variant _
									) As Object
&apos;&apos;&apos;	Create a new control of type TabPageContainer in the actual dialog.
&apos;&apos;&apos;	Only one such creation is allowed per dialog.
&apos;&apos;&apos;	A TabPageContainer control will be automatically coupled with a PageManager setup.
&apos;&apos;&apos;
&apos;&apos;&apos;	This type of control has no equivalent in the Basic IDE. The actual method
&apos;&apos;&apos;	may nevertheless be applied to a dialog built in the IDE.
&apos;&apos;&apos;
&apos;&apos;&apos;	It is recommended for control stacking reasons to define a tab container
&apos;&apos;&apos;	control AFTER all or most other editable controls.
&apos;&apos;&apos;
&apos;&apos;&apos;	The creation request is ignored if the dialog is already displayed.
&apos;&apos;&apos;
&apos;&apos;&apos;	Specific args:
&apos;&apos;&apos;			TabHeaders: an array of strings to define the texts displayed in each individual tabs
1&apos;&apos;&apos;		Border: &quot;3D&quot; (default) or &quot;FLAT&quot; or &quot;NONE&quot;
&apos;&apos;&apos;	Returns:
&apos;&apos;&apos;		an instance of the SF_DialogControl class or Nothing
&apos;&apos;&apos;	Example:
&apos;&apos;&apos;		Set myTabContainer = dialog.CreateTabPageContainer(&quot;TabContainer1&quot;, Array(20, 20, 60, 15), _
&apos;&apos;&apos;				TabHeaders := Array(&quot;Modules&quot;, &quot;Dialogs&quot;, &quot;Libraries&quot;))

Dim oControl As Object			&apos;	Return value
Dim iBorder As Integer			&apos;	Alias of border
Dim vPropNames As Variant		&apos;	Array of names of specific arguments
Dim vPropValues As Variant		&apos;	Array of values of specific arguments
Dim oTabPageModel As Object		&apos;	stardiv.Toolkit.UnoControlTabPageModel
Dim oToolkit As Object			&apos;	com.sun.star.awt.Toolkit
Dim iPage As Integer			&apos;	Actual page number
Dim i As Integer

Const cstThisSub = &quot;SFDialogs.Dialog.CreateTabContainer&quot;
Const cstSubArgs = &quot;ControlName, Place, TabHeaders, [Border=&quot;&quot;3D&quot;&quot;|&quot;&quot;FLAT&quot;&quot;|&quot;&quot;NONE&quot;&quot;]&quot;

Check:
	Set oControl = Nothing
	If Not _CheckNewControl(cstThisSub, cstSubArgs, ControlName, Place) Then GoTo Finally

	If IsMissing(Border) Or IsEmpty(Border) Then Border = &quot;3D&quot;
	If Not ScriptForge.SF_Utils._ValidateArray(TabHeaders, &quot;TabHeaders&quot;, 1, V_STRING, True) Then GoTo Finally
	If Not ScriptForge.SF_Utils._Validate(Border, &quot;Border&quot;, V_STRING, Array(&quot;3D&quot;, &quot;FLAT&quot;, &quot;NONE&quot;)) Then GoTo Finally

	If _Displayed Then GoTo Finally		&apos;	Ignore the call when dialog is displayed to enable peer creation below
	If Len(_TabPageContainer) &gt; 0 Then GoTo Finally		&apos;	A tab page container must be unique in a dialog

Try:
	&apos;	Handle specific arguments
	iBorder = ScriptForge.SF_Array.IndexOf(Array(&quot;NONE&quot;, &quot;3D&quot;, &quot;FLAT&quot;), Border)
	vPropNames = Array(&quot;Border&quot;)
	vPropValues = Array(iBorder)

	&apos;	Create the control
	Set oControl = _CreateNewControl(&quot;tab.UnoControlTabPageContainerModel&quot;, ControlName, Place, vPropNames, vPropValues)

	&apos;	Create the peer dialog window, preamble of the determination of the ActiveTabPageID
	_DialogControl.setVisible(False)	&apos;	Differ the display of the dialog later than at createPeer()
	Set oToolkit = CreateUnoService(&quot;com.sun.star.awt.Toolkit&quot;)
	_DialogControl.createPeer(oToolkit, Null)

	With oControl
		&apos;	Store the tab headers
		._TabHeaders = TabHeaders
		&apos;	Insert the individual tab pages
		For i = LBound(TabHeaders) To UBound(TabHeaders)
			Set oTabPageModel = _DialogModel.createInstance(&quot;com.sun.star.awt.tab.UnoControlTabPageModel&quot;)
			oTabPageModel.initialize (Array (i - LBound(TabHeaders) + 1))		&apos;	TabPageID&apos;s start at 1
			oTabPageModel.Title = TabHeaders(i)
			._ControlModel.insertByIndex(i - LBound(TabHeaders), oTabPageModel)
		Next i
		&apos;	Determine the default tab page
		iPage = _DialogModel.Step
		._ControlView.ActiveTabPageID = Iif(iPage = 0, 1, iPage)
	End With

	&apos;	Register the unique tab page container
	_TabPageContainer = ControlName

Finally:
	Set CreateTabPageContainer = oControl
	ScriptForge.SF_Utils._ExitFunction(cstThisSub)
	Exit Function
End Function	&apos;	SFDialogs.SF_Dialog.CreateTabPageContainer

REM -----------------------------------------------------------------------------
Public Function CreateTextField(Optional ByVal ControlName As Variant _
								, Optional ByRef Place As Variant _
								, Optional ByVal Border As Variant _
								, Optional ByVal MultiLine As Variant _
								, Optional ByVal MaximumLength As Variant _
								, Optional ByVal PasswordCharacter As Variant _
								) As Object
&apos;&apos;&apos;	Create a new control of type TextField in the actual dialog.
&apos;&apos;&apos;	Specific args:
&apos;&apos;&apos;		Border: &quot;3D&quot; (default) or &quot;FLAT&quot; or &quot;NONE&quot;
&apos;&apos;&apos;		MultiLine: When True (default = False), the caption may be displayed on more than one line
&apos;&apos;&apos;		MaximumLength: the maximum character count (default = 0 meaning unlimited)
&apos;&apos;&apos;		PasswordCharacter: a single character specifying the echo for a password text field (default = &quot;&quot;)
&apos;&apos;&apos;			MultiLine must be False to have PasswordCharacter being applied
&apos;&apos;&apos;	Returns:
&apos;&apos;&apos;		an instance of the SF_DialogControl class or Nothing
&apos;&apos;&apos;	Example:
&apos;&apos;&apos;		Set myTextField = dialog.CreateTextField(&quot;TextField1&quot;, Array(20, 20, 120, 50), MultiLine := True)

Dim oControl As Object			&apos;	Return value
Dim iBorder As Integer			&apos;	Alias of border
Dim iPassword As Integer		&apos;	Integer alias of PasswordCharacter
Dim vPropNames As Variant		&apos;	Array of names of specific arguments
Dim vPropValues As Variant		&apos;	Array of values of specific arguments
Const cstThisSub = &quot;SFDialogs.Dialog.CreateTextField&quot;
Const cstSubArgs = &quot;ControlName, Place, [Border=&quot;&quot;3D&quot;&quot;|&quot;&quot;FLAT&quot;&quot;|&quot;&quot;NONE&quot;&quot;], [MultiLine=False], [MaximumLength=0, [PasswordCharacter=&quot;&quot;&quot;&quot;]&quot;

Check:
	Set oControl = Nothing
	If Not _CheckNewControl(cstThisSub, cstSubArgs, ControlName, Place) Then GoTo Finally

	If IsMissing(Border) Or IsEmpty(Border) Then Border = &quot;3D&quot;
	If IsMissing(MultiLine) Or IsEmpty(MultiLine) Then MultiLine = False
	If IsMissing(MaximumLength) Or IsEmpty(MaximumLength) Then MaximumLength = 0
		If IsMissing(PasswordCharacter) Or IsEmpty(PasswordCharacter) Then PasswordCharacter = &quot;&quot;

	If Not ScriptForge.SF_Utils._Validate(Border, &quot;Border&quot;, V_STRING, Array(&quot;3D&quot;, &quot;FLAT&quot;, &quot;NONE&quot;)) Then GoTo Finally
	If Not ScriptForge.SF_Utils._Validate(MultiLine, &quot;MultiLine&quot;, ScriptForge.V_BOOLEAN) Then GoTo Finally
	If Not ScriptForge.SF_Utils._Validate(MaximumLength, &quot;MaximumLength&quot;, ScriptForge.V_NUMERIC) Then GoTo Finally
	If Not ScriptForge.SF_Utils._Validate(PasswordCharacter, &quot;PasswordCharacter&quot;, V_STRING) Then GoTo Finally

	&apos;	MultiLine has precedence over Password
	If MultiLine Then PasswordCharacter = &quot;&quot;

Try:
	&apos;	Manage specific properties
	iBorder = ScriptForge.SF_Array.IndexOf(Array(&quot;NONE&quot;, &quot;3D&quot;, &quot;FLAT&quot;), Border)
	If Len(PasswordCharacter) &gt; 0 Then iPassword = Asc(Left(PasswordCharacter, 1)) Else iPassword = 0
	vPropNames = Array(&quot;Border&quot;, &quot;MultiLine&quot;, &quot;MaxTextLen&quot;, &quot;EchoChar&quot;, &quot;AutoVScroll&quot;)	&apos;	AutoHScroll not implemented ??
	vPropValues = Array(iBorder, CBool(MultiLine), CInt(MaximumLength), iPassword, True)

	&apos;	Create the control
	Set oControl = _CreateNewControl(&quot;UnoControlEditModel&quot;, ControlName, Place, vPropNames, vPropValues)

Finally:
	Set CreateTextField = oControl
	ScriptForge.SF_Utils._ExitFunction(cstThisSub)
	Exit Function
End Function	&apos;	SFDialogs.SF_Dialog.CreateTextField

REM -----------------------------------------------------------------------------
Public Function CreateTimeField(Optional ByVal ControlName As Variant _
								, Optional ByRef Place As Variant _
								, Optional ByVal Border As Variant _
								, Optional ByVal MinTime As Variant _
								, Optional ByVal MaxTime As Variant _
								) As Object
&apos;&apos;&apos;	Create a new control of type TimeField in the actual dialog.
&apos;&apos;&apos;	Specific args:
&apos;&apos;&apos;		Border: &quot;3D&quot; (default) or &quot;FLAT&quot; or &quot;NONE&quot;
&apos;&apos;&apos;		MinTime: the smallest time that can be entered in the control. Default = 0
&apos;&apos;&apos;		MaxTime: the largest time that can be entered in the control. Default = 24h
&apos;&apos;&apos;	Returns:
&apos;&apos;&apos;		an instance of the SF_DialogControl class or Nothing
&apos;&apos;&apos;	Example:
&apos;&apos;&apos;		Set myTimeField = dialog.CreateTimeField(&quot;TimeField1&quot;, Array(20, 20, 60, 15))

Dim oControl As Object			&apos;	Return Time
Dim iBorder As Integer			&apos;	Alias of border
Dim oMinTime As New com.sun.star.util.Time
Dim oMaxTime As New com.sun.star.util.Time
Dim vFormats As Variant			&apos;	List of available time formats
Dim vPropNames As Variant		&apos;	Array of names of specific arguments
Dim vPropValues As Variant		&apos;	Array of values of specific arguments
Const cstThisSub = &quot;SFDialogs.Dialog.CreateTimeField&quot;
Const cstSubArgs = &quot;ControlName, Place, [Border=&quot;&quot;3D&quot;&quot;|&quot;&quot;FLAT&quot;&quot;|&quot;&quot;NONE&quot;&quot;]&quot; _
						&amp; &quot;, [MinTime=TimeSerial(0, 0, 0)], [MaxTime=TimeSerial(23, 59, 59)]&quot;

Check:
	Set oControl = Nothing
	If Not _CheckNewControl(cstThisSub, cstSubArgs, ControlName, Place) Then GoTo Finally

	If IsMissing(Border) Or IsEmpty(Border) Then Border = &quot;3D&quot;
	If IsMissing(MinTime) Or IsEmpty(MinTime) Then MinTime = TimeSerial(0, 0, 0)
	If IsMissing(MaxTime) Or IsEmpty(MaxTime) Then MaxTime = TimeSerial(23, 59, 59)
	
	If Not ScriptForge.SF_Utils._Validate(Border, &quot;Border&quot;, V_STRING, Array(&quot;3D&quot;, &quot;FLAT&quot;, &quot;NONE&quot;)) Then GoTo Finally
	If Not ScriptForge.SF_Utils._ValiDate(MinTime, &quot;MinTime&quot;, ScriptForge.V_DATE) Then GoTo Finally
	If Not ScriptForge.SF_Utils._ValiDate(MaxTime, &quot;MaxTime&quot;, ScriptForge.V_DATE) Then GoTo Finally
	vFormats = SF_DialogUtils._FormatsList(&quot;TimeField&quot;)

Try:
	&apos;	Manage specific properties
	iBorder = ScriptForge.SF_Array.IndexOf(Array(&quot;NONE&quot;, &quot;3D&quot;, &quot;FLAT&quot;), Border)
	With oMinTime
		.Hours = Hour(MinTime)	:	.Minutes = Minute(MinTime)	:	.Seconds = Second(MinTime)
	End With
	With oMaxTime
		.Hours = Hour(MaxTime)	:	.Minutes = Minute(MaxTime)	:	.Seconds = Second(MaxTime)
	End With
	vPropNames = Array(&quot;Border&quot;, &quot;TimeMin&quot;, &quot;TimeMax&quot;, &quot;TimeFormat&quot;)
	vPropValues = Array(iBorder, oMinTime, oMaxTime, CInt(ScriptForge.SF_Array.IndexOf(vFormats(), &quot;24h short&quot;)))

	&apos;	Create the control
	Set oControl = _CreateNewControl(&quot;UnoControlTimeFieldModel&quot;, ControlName, Place, vPropNames, vPropValues)

Finally:
	Set CreateTimeField = oControl
	ScriptForge.SF_Utils._ExitFunction(cstThisSub)
	Exit Function
End Function	&apos;	SFDialogs.SF_Dialog.CreateTimeField

REM -----------------------------------------------------------------------------
Public Function CreateTreeControl(Optional ByVal ControlName As Variant _
								, Optional ByRef Place As Variant _
								, Optional ByVal Border As Variant _
								) As Object
&apos;&apos;&apos;	Create a new control of type TreeControl in the actual dialog.
&apos;&apos;&apos;	Specific args:
&apos;&apos;&apos;		Border: &quot;3D&quot; (default) or &quot;FLAT&quot; or &quot;NONE&quot;
&apos;&apos;&apos;	Returns:
&apos;&apos;&apos;		an instance of the SF_DialogControl class or Nothing
&apos;&apos;&apos;	Example:
&apos;&apos;&apos;		Set myTreeControl = dialog.CreateTreeControl(&quot;TreeControl1&quot;, Array(20, 20, 60, 15))

Dim oControl As Object			&apos;	Return value
Dim iBorder As Integer			&apos;	Alias of border
Dim vPropNames As Variant		&apos;	Array of names of specific arguments
Dim vPropValues As Variant		&apos;	Array of values of specific arguments
Const cstThisSub = &quot;SFDialogs.Dialog.CreateTreeControl&quot;
Const cstSubArgs = &quot;ControlName, Place, [Border=&quot;&quot;3D&quot;&quot;|&quot;&quot;FLAT&quot;&quot;|&quot;&quot;NONE&quot;&quot;]&quot;

Check:
	Set oControl = Nothing
	If Not _CheckNewControl(cstThisSub, cstSubArgs, ControlName, Place) Then GoTo Finally

	If IsMissing(Border) Or IsEmpty(Border) Then Border = &quot;3D&quot;
	If Not ScriptForge.SF_Utils._Validate(Border, &quot;Border&quot;, V_STRING, Array(&quot;3D&quot;, &quot;FLAT&quot;, &quot;NONE&quot;)) Then GoTo Finally

Try:
	&apos;	Manage specific properties
	iBorder = ScriptForge.SF_Array.IndexOf(Array(&quot;NONE&quot;, &quot;3D&quot;, &quot;FLAT&quot;), Border)
	vPropNames = Array(&quot;Border&quot;, &quot;SelectionType&quot;, &quot;Editable&quot;, &quot;ShowsHandles&quot;, &quot;ShowsRootHandles&quot;)
	vPropValues = Array(iBorder, com.sun.star.view.SelectionType.SINGLE, False, True, True)

	&apos;	Create the control
	Set oControl = _CreateNewControl(&quot;tree.TreeControlModel&quot;, ControlName, Place, vPropNames, vPropValues)

Finally:
	Set CreateTreeControl = oControl
	ScriptForge.SF_Utils._ExitFunction(cstThisSub)
	Exit Function
Catch:
	GoTo Finally
End Function	&apos;	SFDialogs.SF_Dialog.CreateTreeControl

REM -----------------------------------------------------------------------------
Public Sub EndExecute(Optional ByVal ReturnValue As Variant)
&apos;&apos;&apos;	Ends the display of a modal dialog and gives back the argument
&apos;&apos;&apos;	as return value for the current Execute() action
&apos;&apos;&apos;	EndExecute is usually contained in the processing of a macro
&apos;&apos;&apos;	triggered by a dialog or control event
&apos;&apos;&apos;	Args:
&apos;&apos;&apos;		ReturnValue: must be numeric. The value passed to the running Execute() method
&apos;&apos;&apos;	Example:
&apos;&apos;&apos;		Sub OnEvent(poEvent As Variant)
&apos;&apos;&apos;		Dim oDlg As Object
&apos;&apos;&apos;			Set oDlg = CreateScriptService(&quot;SFDialogs.DialogEvent&quot;, poEvent)
&apos;&apos;&apos;			oDlg.EndExecute(25)
&apos;&apos;&apos;		End Sub

Dim lExecute As Long			&apos;	Alias of ReturnValue
Const cstThisSub = &quot;SFDialogs.Dialog.EndExecute&quot;
Const cstSubArgs = &quot;ReturnValue&quot;

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

Check:
	If ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
		If Not _IsStillAlive() Then GoTo Finally
		If Not ScriptForge.SF_Utils._Validate(ReturnValue, &quot;ReturnValue&quot;, V_NUMERIC) Then GoTo Finally
	End If

Try:
	lExecute = CLng(ReturnValue)
	Call _DialogControl.endDialog(lExecute)

Finally:
	ScriptForge.SF_Utils._ExitFunction(cstThisSub)
	Exit Sub
Catch:
	GoTo Finally
End Sub			&apos;	SFDialogs.SF_Dialog.EndExecute

REM -----------------------------------------------------------------------------
Public Function Execute(Optional ByVal Modal As Variant) As Long
&apos;&apos;&apos;	Display the dialog and wait for its termination by the user
&apos;&apos;&apos;	When the window Close button is clicked:
&apos;&apos;&apos;		- a modal dialog is stopped as if a Cancel button was pressed
&apos;&apos;&apos;		- a non-modal dialog is made hidden
&apos;&apos;&apos;	Termination and disposal of the dialog instance are roles of user scripts
&apos;&apos;&apos;	Args:
&apos;&apos;&apos;		Modal: False when non-modal dialog. Default = True
&apos;&apos;&apos;	Returns:
&apos;&apos;&apos;		0 = Cancel button pressed
&apos;&apos;&apos;		1 = OK button pressed
&apos;&apos;&apos;		Otherwise: the dialog stopped with an EndExecute statement executed from a dialog or control event
&apos;&apos;&apos;	Example:
&apos;&apos;&apos;		Dim oDlg As Object, lReturn As Long
&apos;&apos;&apos;			Set oDlg = CreateScriptService(,, &quot;myDialog&quot;)	&apos;	Dialog stored in current document&apos;s standard library
&apos;&apos;&apos;			lReturn = oDlg.Execute()
&apos;&apos;&apos;			Select Case lReturn

Dim lExecute As Long			&apos;	Return value
Const cstThisSub = &quot;SFDialogs.Dialog.Execute&quot;
Const cstSubArgs = &quot;[Modal=True]&quot;

	If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
	lExecute = -1

Check:
	If IsMissing(Modal) Or IsEmpty(Modal) Then Modal = True
	If ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
		If Not _IsStillAlive() Then GoTo Finally
		If Not ScriptForge.SF_Utils._Validate(Modal, &quot;Modal&quot;, V_BOOLEAN) Then GoTo Finally
	End If

Try:
	If Modal Then
		_Modal = True
		_Displayed = True
		&apos;	In dynamic dialogs, injection of sizes and positions from model to view is done with setVisible()
		_DialogControl.setVisible(True)
		lExecute = _DialogControl.execute()
		Select Case lExecute
			Case 1		:	lExecute = OKBUTTON
			Case 0		:	lExecute = CANCELBUTTON
			Case Else
		End Select
		_Displayed = False
	Else
		_Modal = False
		_Displayed = True
		&apos;	To make visible an on-the-fly designed dialog when macro triggered from Python
		_DialogModel.DesktopAsParent = Not ( _BuiltFromScratch And _BuiltInPython )
		_DialogControl.setVisible(True)
		&apos;	Watch the window Close button
		Set _TopWindowListener = CreateUnoListener(&quot;SFDialogs.SF_DialogListener._SFNONMODAL_&quot; _
											, &quot;com.sun.star.awt.XTopWindowListener&quot;)
		_DialogControl.addTopWindowListener(_TopWindowListener)
		&apos;	Default return code
		lExecute = 0
	End If

Finally:
	Execute = lExecute
	ScriptForge.SF_Utils._ExitFunction(cstThisSub)
	Exit Function
Catch:
	&apos;	When an error is caused by an event error, the location is unknown
	SF_Exception.Raise(, &quot;?&quot;)
	GoTo Finally
End Function	&apos;	SFDialogs.SF_Dialog.Execute

REM -----------------------------------------------------------------------------
Public Function GetProperty(Optional ByVal PropertyName 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;	Returns:
&apos;&apos;&apos;		The actual value of the property
&apos;&apos;&apos;	Exceptions:
&apos;&apos;&apos;		ARGUMENTERROR		The property does not exist
&apos;&apos;&apos;	Examples:
&apos;&apos;&apos;		oDlg.GetProperty(&quot;Caption&quot;)

Const cstThisSub = &quot;SFDialogs.Dialog.GetProperty&quot;
Const cstSubArgs = &quot;&quot;

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

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

Try:
	GetProperty = _PropertyGet(PropertyName)

Finally:
	SF_Utils._ExitFunction(cstThisSub)
	Exit Function
Catch:
	GoTo Finally
End Function	&apos;	SFDialogs.SF_Dialog.GetProperty

REM -----------------------------------------------------------------------------
Public Function GetTextsFromL10N(Optional ByRef L10N As Variant) As Boolean
&apos;&apos;&apos; Replace all fixed text strings of a dialog by their localized version
&apos;&apos;&apos;	Replaced texts are:
&apos;&apos;&apos;		- the title of the dialog
&apos;&apos;&apos;		- the caption associated with next control types: Button, CheckBox, FixedLine, FixedText, GroupBox and RadioButton
&apos;&apos;&apos;		- the content of list- and comboboxes
&apos;&apos;&apos;		- the tip- or helptext displayed when the mouse is hovering the control
&apos;&apos;&apos;	The current method has a twin method ScriptForge.SF_L10N.AddTextsFromDialog
&apos;&apos;&apos;	The current method is probably run before the Execute() method
&apos;&apos;&apos;	Args:
&apos;&apos;&apos;		L10N : a &quot;L10N&quot; service instance created with CreateScriptService(&quot;L10N&quot;)
&apos;&apos;&apos;	Returns:
&apos;&apos;&apos;		True when successful
&apos;&apos;&apos;	Examples:
&apos;&apos;&apos;		Dim myPO As Object, oDlg As Object
&apos;&apos;&apos;		Set oDlg = CreateScriptService(&quot;Dialog&quot;, &quot;GlobalScope&quot;, &quot;XrayTool&quot;, &quot;DlgXray&quot;)
&apos;&apos;&apos;		Set myPO = CreateScriptService(&quot;L10N&quot;, &quot;C:\myPOFiles\&quot;, &quot;fr-BE&quot;)
&apos;&apos;&apos;		oDlg.GetTextsFromL10N(myPO)

Dim bGet As Boolean					&apos;	Return value
Dim vControls As Variant			&apos;	Array of control names
Dim sControl As String				&apos;	A single control name
Dim oControl As Object				&apos;	SFDialogs.DialogControl
Dim sText As String					&apos;	The text found in the dialog
Dim sTranslation As String			&apos;	The translated text got from the dictionary
Dim vSource As Variant				&apos;	RowSource property of dialog control as an array
Dim bChanged As Boolean				&apos;	True when at least 1 item of a RowSource is modified
Dim i As Long

Const cstThisSub = &quot;SFDialogs.Dialog.GetTextsFromL10N&quot;
Const cstSubArgs = &quot;L10N&quot;

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

Check:
	If SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
		If Not SF_Utils._Validate(L10N, &quot;L10N&quot;, V_OBJECT, , , &quot;L10N&quot;) Then GoTo Finally
	End If

Try:
	&apos;	Get the dialog title
	sText = Caption
	If Len(sText) &gt; 0 Then
		sTranslation = L10N._(sText)
		If sText &lt;&gt; sTranslation Then Caption = sTranslation
	End If
	&apos;	Scan all controls
	vControls = Controls()
	For Each sControl In vControls
		Set oControl = Controls(sControl)
		With oControl
			&apos;	Extract fixed texts
			sText = .Caption
			If Len(sText) &gt; 0 Then
				sTranslation = L10N._(sText)
				If sText &lt;&gt; sTranslation Then .Caption = sTranslation
			End If
			vSource = .RowSource	&apos;	List and comboboxes only
			If IsArray(vSource) Then
				bChanged = False
				For i = 0 To UBound(vSource)
					If Len(vSource(i)) &gt; 0 Then
						sTranslation = L10N._(vSource(i))
						If sTranslation &lt;&gt; vSource(i) Then
							bChanged = True
							vSource(i) = sTranslation
						End If
					End If
				Next i
				&apos;	Rewrite if at least 1 item has been modified by the translation process
				If bChanged Then .RowSource = vSource
			End If
			sText = .TipText
			If Len(sText) &gt; 0 Then
				sTranslation = L10N._(sText)
				If sText &lt;&gt; sTranslation Then .TipText = sTranslation
			End If
		End With
	Next sControl

	bGet = True

Finally:
	GetTextsFromL10N = bGet
	SF_Utils._ExitFunction(cstThisSub)
	Exit Function
Catch:
	GoTo Finally
End Function    &apos;   SFDialogs.SF_Dialog.GetTextsFromL10N

REM -----------------------------------------------------------------------------
Public Function ImportControl(Optional ByRef SourceDialog As Variant _
								, Optional ByVal SourceName As Variant _
								, Optional ByVal ControlName As Variant _
								, Optional ByVal Page As Variant _
								, Optional ByVal OffsetX As Variant _
								, Optional ByVal OffsetY As Variant _
								, Optional ByVal IncludeOnProperties As Variant _
								) As Object
&apos;&apos;&apos;	Import and duplicate an existing control of any type from one dialog to the actual dialog.
&apos;&apos;&apos;	The duplicated control is left unchanged. The new control can be renamed and relocated.
&apos;&apos;&apos;	The events, when defined, may optionally be imported too.
&apos;&apos;&apos;	Specific args:
&apos;&apos;&apos;		SourceDialog: a SF_Dialog class instance.
&apos;&apos;&apos;			The dialog must be at least &quot;created&quot; (with CreateScriptService).
&apos;&apos;&apos;		SourceName: the name of the control to import
&apos;&apos;&apos;		ControlName: the name of the new control. It must not exist yet. Default = SourceName
&apos;&apos;&apos;		Page: the page number of the new control. Default = 0
&apos;&apos;&apos;		OffsetX, OffsetY: the number of pixels to add to the source control coordinates in &quot;Map AppFont&quot; units.
&apos;&apos;&apos;			The default = 0. May be negative.
&apos;&apos;&apos;		IncludeOnProperties: when True (default = False) include the OnXXX event properties.
&apos;&apos;&apos;	Returns:
&apos;&apos;&apos;		an instance of the SF_DialogControl class or Nothing
&apos;&apos;&apos;	Example:
&apos;&apos;&apos;		Set myButton2 = dialog.ImportControl(otherdialog, &quot;Button01&quot;, &quot;Button2&quot;, OffsetX := 30, OffsetY := 30)

Dim oControl As Object			&apos;	Return value
Dim oSourceModel As Object		&apos;	com.sun.star.awt.XControlModel of the source
Dim oControlModel As Object		&apos;	com.sun.star.awt.XControlModel of the new control
Dim vProperties As Variant		&apos;	Array of property names
Dim sProperty As String			&apos;	A single item in vProperties
Dim oSourceControl As Object	&apos;	The SF_DialogControl instance representing the input control
Dim sOnEvent As String			&apos;	An OnEvent property

Const cstThisSub = &quot;SFDialogs.Dialog.ImportControl&quot;
Const cstSubArgs = &quot;SourceDialog, SourceName, [ControlName=&quot;&quot;&quot;&quot;], [Page=0], &quot; _
					&amp; &quot;[OffsetX=0], [OffsetY=0], [IncludeOnProperties=False]&quot;

Check:
	Set oControl = Nothing

	If IsMissing(ControlName) Or IsEmpty(ControlName) Then ControlName = SourceName
	If VarType(ControlName) = V_STRING Then			&apos;	Typically a Python call will pass a zero-length string
		If ControlName = &quot;&quot; Then ControlName = SourceName
	End If
	If IsMissing(Page) Or IsEmpty(Page) Then Page = 0
	If IsMissing(OffsetX) Or IsEmpty(OffsetX) Then OffsetX = 0
	If IsMissing(OffsetY) Or IsEmpty(OffsetY) Then OffsetY = 0
	If IsMissing(IncludeOnProperties) Or IsEmpty(IncludeOnProperties) Then IncludeOnProperties = False

	If Not _CheckNewControl(cstThisSub, cstSubArgs, ControlName, Place := Null) Then GoTo Finally

	If Not ScriptForge.SF_Utils._Validate(SourceDialog, &quot;SourceDialog&quot;, ScriptForge.V_OBJECT, , , &quot;DIALOG&quot;) Then GoTo Finally
	If Not ScriptForge.SF_Utils._Validate(SourceName, &quot;SourceName&quot;, V_STRING, SourceDialog._DialogModel.getElementNames(), True) Then GoTo Finally
	If Not ScriptForge.SF_Utils._Validate(Page, &quot;Page&quot;, ScriptForge.V_NUMERIC) Then GoTo Finally
	If Not ScriptForge.SF_Utils._Validate(OffsetX, &quot;OffsetX&quot;, ScriptForge.V_NUMERIC) Then GoTo Finally
	If Not ScriptForge.SF_Utils._Validate(OffsetY, &quot;OffsetY&quot;, ScriptForge.V_NUMERIC) Then GoTo Finally
	If Not ScriptForge.SF_Utils._Validate(IncludeOnProperties, &quot;IncludeOnProperties&quot;, ScriptForge.V_BOOLEAN) Then GoTo Finally

Try:
	&apos;	All control types are presumed Importable
	Set oSourceModel = SourceDialog._DialogModel.getByName(SourceName)
	Set oControlModel = oSourceModel.createClone()
	oControlModel.Name = ControlName

	&apos;	Create the control
	Set oControl = _CreateNewControl(oControlModel, ControlName, _
						Array(oSourceModel.PositionX + OffsetX, oSourceModel.PositionY + OffsetY))

	&apos;	Display the control in the requested page
	oControl.Page = Page

	&apos;	Copy the OnEvent properties
	If IncludeOnProperties Then
		vProperties = oControl.Properties()
		Set oSourceControl = SourceDialog.Controls(SourceName)
		For Each sProperty In vProperties
			If Left(sProperty, 2) = &quot;On&quot; Then
				sOnEvent = oSourceControl._PropertyGet(sProperty, &quot;&quot;)	&apos;	Default = zero-length string
				If Len(sOnEvent) &gt; 0 Then oControl._PropertySet(sProperty, sOnEvent)
			End If
		Next sProperty
	End If

Finally:
	Set ImportControl = oControl
	ScriptForge.SF_Utils._ExitFunction(cstThisSub)
	Exit Function
Catch:
	GoTo Finally
End Function	&apos;	SFDialogs.SF_Dialog.ImportControl

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

	Methods = Array( _
					&quot;Activate&quot; _
					, &quot;Center&quot; _
					, &quot;CloneControl&quot; _
					, &quot;Controls&quot; _
					, &quot;CreateButton&quot; _
					, &quot;CreateCheckBox&quot; _
					, &quot;CreateComboBox&quot; _
					, &quot;CreateCurrencyField&quot; _
					, &quot;CreateDateField&quot; _
					, &quot;CreateFileControl&quot; _
					, &quot;CreateFixedLine&quot; _
					, &quot;CreateFixedText&quot; _
					, &quot;CreateFormattedField&quot; _
					, &quot;CreateGroupBox&quot; _
					, &quot;CreateHyperlink&quot; _
					, &quot;CreateImageControl&quot; _
					, &quot;CreateListBox&quot; _
					, &quot;CreateNumericField&quot; _
					, &quot;CreatePatternField&quot; _
					, &quot;CreateProgressBar&quot; _
					, &quot;CreateRadioButton&quot; _
					, &quot;CreateScrollBar&quot; _
					, &quot;CreateTableControl&quot; _
					, &quot;CreateTabPageContainer&quot; _
					, &quot;CreateTextField&quot; _
					, &quot;CreateTimeField&quot; _
					, &quot;CreateTreeControl&quot; _
					, &quot;EndExecute&quot; _
					, &quot;Execute&quot; _
					, &quot;GetTextsFromL10N&quot; _
					, &quot;ImportControl&quot; _
					, &quot;OrderTabs&quot; _
					, &quot;Resize&quot; _
					, &quot;SetPageManager&quot; _
					, &quot;Terminate&quot; _
					)

End Function	&apos;	SFDialogs.SF_Dialog.Methods

REM -----------------------------------------------------------------------------
Public Function OrderTabs(ByRef Optional TabsList As Variant _
							, ByVal Optional Start As Variant _
							, ByVal Optional Increment As Variant _
							) As Boolean
&apos;&apos;&apos;	Set the tabulation index f a series of controls.
&apos;&apos;&apos;	The sequence of controls are given as an array of control names from the first to the last.
&apos;&apos;&apos;	Next controls will not be accessible (anymore ?) via the TAB key if &gt;=1 of next conditions is met:
&apos;&apos;&apos;		- if they are not in the given list
&apos;&apos;&apos;		- if their type is FixedLine, GroupBox or ProgressBar
&apos;&apos;&apos;		- if the control is disabled
&apos;&apos;&apos;	Args:
&apos;&apos;&apos;		TabsList: an array of valid control names in the order of tabulation
&apos;&apos;&apos;		Start: the tab index to be assigned to the 1st control in the list. Default = 1
&apos;&apos;&apos;		Increment: the difference between 2 successive tab indexes. Default = 1
&apos;&apos;&apos;	Returns:
&apos;&apos;&apos;		True when successful
&apos;&apos;&apos;	Example:
&apos;&apos;&apos;		dialog.OredrTabs(Array(&quot;myListBox&quot;, &quot;myTextField&quot;, &quot;myNumericField&quot;), Start := 10)

Dim bOrder As Boolean			&apos;	Return value
Dim vControlNames As Variant	&apos;	List of control names in the dialog
Dim oControl As Object			&apos;	A SF_DialogControl instance
Dim bValid As Boolean			&apos;	When True, the considered control deserves a tab stop
Dim iTabIndex As Integer		&apos;	The tab index to be set
Dim vWrongTypes As Variant		&apos;	List of rejected control types
Dim i As Long

Const cstThisSub = &quot;SFDialogs.Dialog.OrderTabs&quot;
Const cstSubArgs = &quot;TabsList, [Start=1], Încrement=1]&quot;

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

Check:
	If IsMissing(Start) Or IsEmpty(Start) Then Start = 1
	If IsMissing(Increment) Or IsEmpty(Increment) Then Increment = 1
	If SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
		If Not ScriptForge.SF_Utils._ValidateArray(TabsList, &quot;TabsList&quot;, 1, V_STRING, True) Then GoTo Finally
		If Not SF_Utils._Validate(Start, &quot;Start&quot;, ScriptForge.V_NUMERIC) Then GoTo Finally
		If Not SF_Utils._Validate(Increment, &quot;Increment&quot;, ScriptForge.V_NUMERIC) Then GoTo Finally
	End If

Try:
	vWrongTypes = Array(&quot;FixedLine&quot;, &quot;GroupBox&quot;, &quot;ProgressBar&quot;, &quot;TabPageContainer&quot;)

	&apos;	Remove all existing tabulations
	vControlNames = _DialogModel.getElementNames()
	For i = 0 To UBound(vControlNames)
		Set oControl = Controls(vControlNames(i))
		With oControl._ControlModel
			If Not ScriptForge.SF_Array.Contains(vWrongTypes, oControl._ControlType) Then
				.TabStop = False
				.TabIndex = -1
			End If
		End With
	Next i

	iTabIndex = Start

	&apos;	Go through the candidate controls for being tabulated and set tabs
	For i = LBound(TabsList) To UBound(TabsList)
		Set oControl = Controls(TabsList(i))	&apos;	Error checking on input names happens here
		With oControl._ControlModel
			bValid = Not ScriptForge.SF_Array.Contains(vWrongTypes, oControl._ControlType)
			If bValid Then bValid = .Enabled
			If bValid Then
				.TabStop = True
				.TabIndex = iTabIndex
				iTabIndex = iTabIndex + Increment
			End If
		End With
	Next i

	bOrder = True

Finally:
	OrderTabs = bOrder
	SF_Utils._ExitFunction(cstThisSub)
	Exit Function
Catch:
	GoTo Finally
End Function	&apos;	SFDialogs.SF_Dialog.OrderTabls

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

	Properties = Array( _
					&quot;Caption&quot; _
					, &quot;Height&quot; _
					, &quot;IsAlive&quot; _
					, &quot;Modal&quot; _
					, &quot;Name&quot; _
					, &quot;OnFocusGained&quot; _
					, &quot;OnFocusLost&quot; _
					, &quot;OnKeyPressed&quot; _
					, &quot;OnKeyReleased&quot; _
					, &quot;OnMouseDragged&quot; _
					, &quot;OnMouseEntered&quot; _
					, &quot;OnMouseExited&quot; _
					, &quot;OnMouseMoved&quot; _
					, &quot;OnMousePressed&quot; _
					, &quot;OnMouseReleased&quot; _
					, &quot;Page&quot; _
					, &quot;Visible&quot; _
					, &quot;Width&quot; _
					, &quot;XDialogModel&quot; _
					, &quot;XDialogView&quot; _
					)

End Function	&apos;	SFDialogs.SF_Dialog.Properties

REM -----------------------------------------------------------------------------
Public Function Resize(Optional ByVal Left As Variant _
								, Optional ByVal Top As Variant _
								, Optional ByVal Width As Variant _
								, Optional ByVal Height As Variant _
								) As Boolean
&apos;&apos;&apos;	Move the top-left corner of the dialog to new coordinates and/or modify its dimensions
&apos;&apos;&apos;	Without arguments, the method resets the initial dimensions
&apos;&apos;&apos;	Attributes denoting the position and size of a dialog are expressed in &quot;Map AppFont&quot; units.
&apos;&apos;&apos;	Map AppFont units are device and resolution independent.
&apos;&apos;&apos;	One Map AppFont unit is equal to one eighth of the average character (Systemfont) height and one quarter of the average character width.
&apos;&apos;&apos;	The dialog editor (= the Basic IDE) also uses Map AppFont units.
&apos;&apos;&apos;	Args:
&apos;&apos;&apos;		Left : the horizontal distance from the top-left corner. It may be negative.
&apos;&apos;&apos;		Top : the vertical distance from the top-left corner. It may be negative.
&apos;&apos;&apos;		Width : the horizontal width of the rectangle containing the Dialog. It must be positive.
&apos;&apos;&apos;		Height : the vertical height of the rectangle containing the Dialog. It must be positive.
&apos;&apos;&apos;		Missing arguments are left unchanged.
&apos;&apos;&apos;	Returns:
&apos;&apos;&apos;		True when successful
&apos;&apos;&apos;	Examples:
&apos;&apos;&apos;		oDialog.Resize(100, 200, Height := 600)	&apos;	Width is not changed

Try:
	Resize = SF_DialogUtils._Resize([Me], Left, Top, Width, Height)

End Function	&apos;	SFDialogss.SF_Dialog.Resize

REM -----------------------------------------------------------------------------
Public Function SetPageManager(Optional ByVal PilotControls As Variant _
									, Optional ByVal TabControls As Variant _
									, Optional ByVal WizardControls As Variant _
									, Optional ByVal LastPage As variant _
									) As Boolean
&apos;&apos;&apos;	Define how the dialog displays pages. The page manager is an alternative to the
&apos;&apos;&apos;	direct use of the Page property of the dialog and dialogcontrol objects.
&apos;&apos;&apos;
&apos;&apos;&apos;	A dialog may have several pages that can be traversed by the user step by step.
&apos;&apos;&apos;	The Page property of the Dialog object defines which page of the dialog is active.
&apos;&apos;&apos;	The Page property of a control defines the page of the dialog on which the control is visible.
&apos;&apos;&apos;	For example, if a control has a page value of 1, it is only visible on page 1 of the dialog.
&apos;&apos;&apos;	If the page value of the dialog is increased from 1 to 2, then all controls with a page value of 1 disappear
&apos;&apos;&apos;	and all controls with a page value of 2 become visible.
&apos;&apos;&apos;
&apos;&apos;&apos;	The arguments define which controls are involved in the orchestration of the displayed pages.
&apos;&apos;&apos;	If any, the predefined TabPageContainer control is implicitly part of the process.
&apos;&apos;&apos;	Possible additional options:
&apos;&apos;&apos;		- select a value in a list- or combobox
&apos;&apos;&apos;		- select an item in a group of radio buttons
&apos;&apos;&apos;		- select a button linked to a page - placed side-by-side the buttons can simulate a tabbed interface
&apos;&apos;&apos;		- press a NEXT or BACK button like in many wizards
&apos;&apos;&apos;	Those options may be combined. The updates of all the involved controls will be synchronized.
&apos;&apos;&apos;	The method will set the actual page number to 1. Afterwards the Page property may be used to display any other page
&apos;&apos;&apos;	
&apos;&apos;&apos;	The SetPageManager() method is to be run only once and before the Execute() statement.
&apos;&apos;&apos;	If invoked several times, subsequent calls will be ignored.
&apos;&apos;&apos;	The method will define new listeners on the concerned controls, addressing generic routines.
&apos;&apos;&apos;	The corresponding events will be fired during the dialog execution.
&apos;&apos;&apos;	Predefined events (in the Basic IDE) will be preserved and executed immediately AFTER the page change.
&apos;&apos;&apos;	The listeners will be removed at dialog termination.
&apos;&apos;&apos;
&apos;&apos;&apos;	Args:
&apos;&apos;&apos;		PilotControls: a comma-separated list of listbox, combobox or radiobutton controls
&apos;&apos;&apos;			For radio buttons, provide the first in the group
&apos;&apos;&apos;		TabControls: a comma-separated list of button controls in ascending order
&apos;&apos;&apos;		WizardControls: a comma-separated list of 2 controls, a BACK button and a NEXT button
&apos;&apos;&apos;		LastPage: the index of the last available page. Recommended when use of WizardControls
&apos;&apos;&apos;	Returns:
&apos;&apos;&apos;		True when successful
&apos;&apos;&apos;	Examples:
&apos;&apos;&apos;		dialog.SetPageManager(PilotControls := &quot;aListBox,aComboBox&quot;)	&apos;	2 controls may cause page changes
&apos;&apos;&apos;			or
&apos;&apos;&apos;		Set oTabs = dialog.CreateTabPageContainer(...)
&apos;&apos;&apos;		dialog.SetPageManager()		&apos;	Only the TabPageContainer is involved

Dim bManager As Boolean				&apos;	Return value
Dim vControls As Variant			&apos;	Array of involved controls
Dim oControl As Object				&apos;	A DialogControl object
Dim i As Long
Const cstPrefix = &quot;SFDialogs.SF_DialogListener._SFTAB_&quot;
							&apos;	Prefix of Subs to trigger when involved controls are clicked
Const cstComma = &quot;,&quot;

Const cstThisSub = &quot;SFDialogs.Dialog.SetPageManager&quot;
Const cstSubArgs = &quot;[PilotControls=&quot;&quot;&quot;&quot;], [TabControls=&quot;&quot;&quot;&quot;], [WizardControls=&quot;&quot;&quot;&quot;]&quot;

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

Check:
	If IsMissing(PilotControls) Or IsEmpty(PilotControls) Then PilotControls = &quot;&quot;
	If IsMissing(TabControls) Or IsEmpty(TabControls) Then TabControls = &quot;&quot;
	If IsMissing(WizardControls) Or IsEmpty(WizardControls) Then WizardControls = &quot;&quot;
	If IsMissing(LastPage) Or IsEmpty(LastPage) Then LastPage = 0
	If ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
		If Not ScriptForge.SF_Utils._Validate(PilotControls, &quot;PilotControls&quot;, V_STRING) Then GoTo Finally
		If Not ScriptForge.SF_Utils._Validate(TabControls, &quot;TabControls&quot;, V_STRING) Then GoTo Finally
		If Not ScriptForge.SF_Utils._Validate(WizardControls, &quot;WizardControls&quot;, V_STRING) Then GoTo Finally
		If Not ScriptForge.SF_Utils._Validate(LastPage, &quot;LastPage&quot;, ScriptForge.V_NUMERIC) Then GoTo Finally
	End If
	&apos;	Ignore the call if already done before
	If UBound(_PageManagement) &gt;= 0 Then GoTo Finally

Try:
	&apos;	Common listeners to all involved controls
	Set _ItemListener = CreateUnoListener(cstPrefix, &quot;com.sun.star.awt.XItemListener&quot;)
	Set _ActionListener	= CreateUnoListener(cstPrefix, &quot;com.sun.star.awt.XActionListener&quot;)
	Set _TabPageContainerListener = CreateUnoListener(cstPrefix, &quot;com.sun.star.awt.tab.XTabPageContainerListener&quot;)

	&apos;	Register the arguments in the _PageManagement array, control by control
	&apos;	Pilot controls
	If Len(PilotControls) &gt; 0 Then
		vControls = Split(PilotControls, cstComma)
		For i = 0 To UBound(vControls)
			If Not _RegisterPageListener(Trim(vControls(i)), &quot;ListBox,ComboBox,RadioButton&quot;, PILOTCONTROL, 0, ITEMSTATECHANGED) Then GoTo Catch
		Next i
	End If
	&apos;	Tab controls
	If Len(TabControls) &gt; 0 Then
		vControls = Split(TabControls, cstComma)
		For i = 0 To UBound(vControls)
			If Not _RegisterPageListener(Trim(vControls(i)), &quot;Button&quot;, TABCONTROL, i + 1, ACTIONPERFORMED) Then GoTo Catch
		Next i
	End If
	&apos;	Wizard controls
	If Len(WizardControls) &gt; 0 Then
		vControls = Split(WizardControls, cstComma)
		For i = 0 To UBound(vControls)
			If Not _RegisterPageListener(Trim(vControls(i)), &quot;Button&quot;, Iif(i = 0, BACKCONTROL, NEXTCONTROL), 0, ACTIONPERFORMED) Then GoTo Catch
		Next i
	End If
	&apos;	Tab page container
	If Len(_TabPageContainer) &gt; 0 Then
		If Not _RegisterPageListener(_TabPageContainer, &quot;TabPageContainer&quot;, TABPAGE, 0, TABSELECTED) Then GoTo Catch
	End If

	&apos;	Set the initial page to 1
	Page = 1
	_LastPage = LastPage

Finally:
	SetPageManager = bManager
	ScriptForge.SF_Utils._ExitFunction(cstThisSub)
	Exit Function
Catch:
	ScriptForge.SF_Exception.RaiseFatal(PAGEMANAGERERROR, &quot;PilotControls&quot;, PilotControls, &quot;TabControls&quot;, TabControls _
				, &quot;WizardControls&quot;, WizardControls)
	GoTo Finally
End Function	&apos;	SFDialogs.SF_Dialog.SetPageManager

REM -----------------------------------------------------------------------------
Public Function SetProperty(Optional ByVal PropertyName As Variant _
								, Optional ByRef Value As Variant _
								) As Boolean
&apos;&apos;&apos;	Set a new value to the given property
&apos;&apos;&apos;	Args:
&apos;&apos;&apos;		PropertyName: the name of the property as a string
&apos;&apos;&apos;		Value: its new value
&apos;&apos;&apos;	Exceptions
&apos;&apos;&apos;		ARGUMENTERROR		The property does not exist

Const cstThisSub = &quot;SFDialogs.Dialog.SetProperty&quot;
Const cstSubArgs = &quot;PropertyName, Value&quot;

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

Check:
	If SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
		If Not SF_Utils._Validate(PropertyName, &quot;PropertyName&quot;, V_STRING, Properties()) Then GoTo Catch
	End If

Try:
	SetProperty = _PropertySet(PropertyName, Value)

Finally:
	SF_Utils._ExitFunction(cstThisSub)
	Exit Function
Catch:
	GoTo Finally
End Function	&apos;	SFDialogs.SF_Dialog.SetProperty

REM -----------------------------------------------------------------------------
Public Function Terminate() As Boolean
&apos;&apos;&apos;	Terminate the dialog service for the current dialog instance
&apos;&apos;&apos;	After termination any action on the current instance will be ignored
&apos;&apos;&apos;	Args:
&apos;&apos;&apos;	Returns:
&apos;&apos;&apos;		True if termination is successful
&apos;&apos;&apos;	Example:
&apos;&apos;&apos;		Dim oDlg As Object, lReturn As Long
&apos;&apos;&apos;			Set oDlg = CreateScriptService(,, &quot;myDialog&quot;)	&apos;	Dialog stored in current document&apos;s standard library
&apos;&apos;&apos;			lreturn = oDlg.Execute()
&apos;&apos;&apos;			Select Case lReturn
&apos;&apos;&apos;					&apos;	...
&apos;&apos;&apos;			End Select
&apos;&apos;&apos;			oDlg.Terminate()

Dim bTerminate As Boolean		&apos;	Return value
Const cstThisSub = &quot;SFDialogs.Dialog.Terminate&quot;
Const cstSubArgs = &quot;&quot;

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

Check:
	If ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
		If Not _IsStillAlive() Then GoTo Finally
	End If

Try:
	_RemoveAllListeners()
	_DialogControl.dispose()
	Set _DialogControl = Nothing
	SF_Register._CleanCacheEntry(_CacheIndex)
	_CacheIndex = -1
	Dispose()
	
	bTerminate = True

Finally:
	Terminate = bTerminate
	ScriptForge.SF_Utils._ExitFunction(cstThisSub)
	Exit Function
Catch:
	GoTo Finally
End Function	&apos;	SFDialogs.SF_Dialog.Terminate

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

REM -----------------------------------------------------------------------------
Private Function _CheckNewControl(cstThisSub As String, cstSubArgs As String _
									, Optional ByVal ControlName As Variant _
									, ByRef Place As Variant _
									) As Boolean
&apos;&apos;&apos;	Check the generic arguments of a CreateXXX() method for control creation.
&apos;&apos;&apos;	Called by the CreateButton, CreateCheckBox, ... specific methods
&apos;&apos;&apos;	Args:
&apos;&apos;&apos;		cstThisSub, cstSubArgs: caller routine and its arguments. Used to formulate an error message, if any.
&apos;&apos;&apos;		ControlName: the name of the new control. It must not exist yet
&apos;&apos;&apos;		Place: the size and position expressed in APPFONT units, either
&apos;&apos;&apos;			- an array (X, Y, Width, Height) or Array(x, Y)
&apos;&apos;&apos;			- a com.sun.star.awt.Rectangle structure
&apos;&apos;&apos;	Exceptions:
&apos;&apos;&apos;		DUPLICATECONTROLERROR		A control with the same name exists already
&apos;&apos;&apos;	Returns:
&apos;&apos;&apos;		True when arguments passed the check

Dim bCheck As Boolean				&apos;	Return value

	bCheck = False

Check:
	If ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
		If Not _IsStillAlive() Then GoTo Finally
		If Not ScriptForge.SF_Utils._Validate(ControlName, &quot;ControlName&quot;, V_STRING) Then GoTo Finally
		If IsArray(Place) Then
			If Not ScriptForge.SF_Utils._ValidateArray(Place, &quot;Place&quot;, 1, ScriptForge.V_NUMERIC, True) Then GoTo Finally
		ElseIf Not IsNull(Place) Then
			If Not ScriptForge.SF_Utils._Validate(Place, &quot;Place&quot;, ScriptForge.V_OBJECT) Then GoTo Finally
		End If
	End If
	If _DialogModel.hasByName(ControlName) Then GoTo CatchDuplicate

	bCheck = True

Finally:
	_CheckNewControl = bCheck
	&apos;	Call to _ExitFunction is done in the caller to allow handling of specific arguments
	Exit Function
CatchDuplicate:
	ScriptForge.SF_Exception.RaiseFatal(DUPLICATECONTROLERROR, &quot;ControlName&quot;, ControlName, _Name)
	GoTo Finally
End Function	&apos;	SFDialogs.SF_Dialog._CheckNewControl

REM -----------------------------------------------------------------------------
Private Function _CreateNewControl(ByVal pvModel As Variant _
									, ByVal ControlName As Variant _
									, ByRef Place As Variant _
									, Optional ByRef ArgNames As Variant _
									, Optional ByRef ArgValues As Variant _
									) As Object
&apos;&apos;&apos;	Generic creation of a new control.
&apos;&apos;&apos;	Called by the CreateButton, CreateCheckBox, ... specific methods
&apos;&apos;&apos;	Args:
&apos;&apos;&apos;		pvModel: one of the UnoControlxxx control models (as a string)
&apos;&apos;&apos;			or such a model as a UNO class instance (cloned from an existing control)
&apos;&apos;&apos;		ControlName: the name of the new control. It must not exist yet
&apos;&apos;&apos;		Place: the size and position expressed in APPFONT units, either
&apos;&apos;&apos;			- an array (X, Y, Width, Height)
&apos;&apos;&apos;			- a com.sun.star.awt.Rectangle structure
&apos;&apos;&apos;		ArgNames: the list of the specific arguments linked to the given pvModel
&apos;&apos;&apos;		ArgValues: their values
&apos;&apos;&apos;	Returns:
&apos;&apos;&apos;		A new SF_DialogControl class instance or Nothing if creation failed

Dim oControl As Object				&apos;	Return value
Dim oControlModel As Object			&apos;	com.sun.star.awt.XControlModel
Dim vPlace As Variant				&apos;	Alias of Place when object to avoid &quot;Object variable not set&quot; error
Dim lCache As Long					&apos;	Number of elements in the controls cache
Static oSession As Object

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

	If IsNull(oSession) Then Set oSession = ScriptForge.SF_Services.CreateScriptService(&quot;Session&quot;)

	If IsMissing(ArgNames) Or IsEmpty(ArgNames) Then ArgNames = Array()
	If IsMissing(ArgValues) Or IsEmpty(ArgValues) Then ArgValues = Array()

Try:
	&apos;	When the model is a string, create a new (empty) model instance
	Select Case VarType(pvModel)
		Case V_STRING				:	Set oControlModel = _DialogModel.createInstance(&quot;com.sun.star.awt.&quot; &amp; pvModel)
		Case ScriptForge.V_OBJECT	:	Set oControlModel = pvModel
	End Select

	oControlModel.Name = ControlName

	&apos;	Set dimension and position
	With oControlModel
		If IsArray(Place) Then
			&apos;	Ignore width and height when new control is cloned from an existing one
			If UBound(Place) &gt;= 1 Then
				.PositionX = Place(0)
				.PositionY = Place(1)
			End If
			If UBound(Place) &gt;= 3 Then
				.Width = Place(2)
				.Height = Place(3)
			End If
		ElseIf oSession.UnoObjectType(Place) = &quot;com.sun.star.awt.Rectangle&quot; Then
			Set vPlace = Place
			.PositionX = vPlace.X
			.PositionY = vPlace.Y
			.Width = vPlace.Width
			.Height = vPlace.Height
		Else
			&apos;Leave everything to zero
		End If
	End With

	&apos;	Store the specific properties in the model
	If UBound(ArgNames) &gt;= 0 Then oControlModel.setPropertyValues(ArgNames, ArgValues)

	&apos;	Insert the new completed control model in the dialog
	_DialogModel.insertByName(ControlName, oControlModel)

	&apos;	Update controls cache - existing cache is presumed unchanged: new control is added at the end of Model.ElementNames
	lCache = UBound(_ControlCache)
	If lCache &lt; 0 Then
		ReDim _ControlCache(0 To 0)
	Else
		ReDim Preserve _ControlCache(0 To lCache + 1)
	End If

	&apos;	Now the UNO control exists, build the SF_DialogControl instance as usual
	Set oControl = Controls(ControlName)

Finally:
	Set _CreateNewControl = oControl
	Exit Function
Catch:
	GoTo Finally
End Function	&apos;	SFDialogs.SF_Dialog._CreateNewControl

REM -----------------------------------------------------------------------------
Private Function _FindRadioSiblings(ByVal psRadioButton As String) As String
&apos;&apos;&apos;	Given the name of the first radio button of a group, return all the names of the group
&apos;&apos;&apos;	For dialogs, radio buttons are considered of the same group
&apos;&apos;&apos;	when their tab indexes are contiguous.
&apos;&apos;&apos;	Args:
&apos;&apos;&apos;		psRadioButton: the exact name of the 1st radio button of the group
&apos;&apos;&apos;	Returns:
&apos;&apos;&apos;		A comma-separated list of the names of the 1st and the next radio buttons
&apos;&apos;&apos;		belonging to the same group in their tabindex order.
&apos;&apos;&apos;		The input argument when not a radio button


Dim sList As String				&apos;	Return value
Dim oRadioControl As Object		&apos;	DialogControl instance corresponding with the argument
Dim oControl As Object			&apos;	DialogControl instance
Dim vRadioList As Variant		&apos;	Array of all radio buttons having a tab index &gt; tab index of argument
								&apos;	1st column = name of radio button, 2nd = its tab index
Dim iRadioTabIndex As Integer	&apos;	Tab index of the argument
Dim iTabIndex As Integer		&apos;	Any tab index
Dim vControlNames As Variant	&apos;	Array of control names
Dim sControlName As String		&apos;	A single item in vControlNames()
Dim i As Long
Const cstComma = &quot;,&quot;

Check:
	On Local Error GoTo Catch
	sList = psRadioButton
	vRadioList = Array()

Try:
	Set oRadioControl = Controls(psRadioButton)
	If oRadioControl.ControlType &lt;&gt; &quot;RadioButton&quot; Then GoTo Finally
	iRadioTabIndex = oRadioControl._ControlModel.Tabindex
	vRadioList = ScriptForge.SF_Array.AppendRow(vRadioList, Array(psRadioButton, iRadioTabIndex))

	&apos;	Scan all controls. Store radio buttons having tab index &gt; 1st radio button
	vControlNames = Controls()
	For Each sControlName In vControlNames
		Set oControl = Controls(sControlName)
		With oControl
			If .Name &lt;&gt; psRadioButton Then
				If .ControlType = &quot;RadioButton&quot; Then
					iTabIndex = ._ControlModel.Tabindex
					If iTabIndex &gt; iRadioTabIndex Then
						vRadioList = ScriptForge.SF_Array.AppendRow(vRadioList, Array(.Name, iTabIndex))
					End If
				End If
			End If
		End With
	Next sControlName

	vRadioList = ScriptForge.SF_Array.SortRows(vRadioList, 1)
	&apos;	Retain contiguous tab indexes
	For i = 1 To UBound(vRadioList, 1)	&apos;	First row = argument
		If vRadioList(i, 1) = iRadioTabIndex + i Then sList = sList &amp; cstComma &amp; vRadioList(i, 0)
	Next i

Finally:
	_FindRadioSiblings = sList
	Exit Function
Catch:
	sList = psRadioButton
	GoTo Finally
End Function	&apos;	SFDialogs.SF_Dialog._FindRadioSiblings

REM -----------------------------------------------------------------------------
Public Function _GetEventName(ByVal psProperty As String) As String
&apos;&apos;&apos;	Return the LO internal event name derived from the SF property name
&apos;&apos;&apos;	The SF property name is not case sensitive, while the LO name is case-sensitive
&apos;	Corrects the typo on ErrorOccur(r?)ed, if necessary

Dim vProperties As Variant			&apos;	Array of class properties
Dim sProperty As String				&apos;	Correctly cased property name

	vProperties = Properties()
	sProperty = vProperties(ScriptForge.SF_Array.IndexOf(vProperties, psProperty, SortOrder := &quot;ASC&quot;))

	_GetEventName = LCase(Mid(sProperty, 3, 1)) &amp; Right(sProperty, Len(sProperty) - 3)
	
End Function	&apos;	SFDialogs.SF_Dialog._GetEventName

REM -----------------------------------------------------------------------------
Private Function _GetListener(ByVal psEventName As String) As String
&apos;&apos;&apos;	Getting/Setting macros triggered by events requires a Listener-EventName pair
&apos;&apos;&apos;	Return the X...Listener corresponding with the event name in argument

	Select Case UCase(psEventName)
		Case UCase(&quot;OnFocusGained&quot;), UCase(&quot;OnFocusLost&quot;)
			_GetListener = &quot;XFocusListener&quot;
		Case UCase(&quot;OnKeyPressed&quot;), UCase(&quot;OnKeyReleased&quot;)
			_GetListener = &quot;XKeyListener&quot;
		Case UCase(&quot;OnMouseDragged&quot;), UCase(&quot;OnMouseMoved&quot;)
			_GetListener = &quot;XMouseMotionListener&quot;
		Case UCase(&quot;OnMouseEntered&quot;), UCase(&quot;OnMouseExited&quot;), UCase(&quot;OnMousePressed&quot;), UCase(&quot;OnMouseReleased&quot;)
			_GetListener = &quot;XMouseListener&quot;
		Case Else
			_GetListener = &quot;&quot;
	End Select
	
End Function	&apos;	SFDialogs.SF_Dialog._GetListener

REM -----------------------------------------------------------------------------
Public Sub _Initialize()
&apos;&apos;&apos;	Complete the object creation process:
&apos;&apos;&apos;		- Initialization of private members
&apos;&apos;&apos;		- Creation of the dialog graphical interface
&apos;&apos;&apos;		- Addition of the new object in the Dialogs buffer
&apos;&apos;&apos;		- Initialisation of persistent storage for controls

Dim lControls As Long		&apos;	Number of controls at dialog creation
Try:
	&apos;	Keep reference to model
	Set _DialogModel = _DialogControl.Model

	&apos;	Store initial position and dimensions
	With _DialogModel
		_Left = .PositionX
		_Top = .PositionY
		_Width = .Width
		_Height = .Height
	End With

	&apos;	Add dialog reference to cache
	_CacheIndex = SF_Register._AddDialogToCache(_DialogControl, [Me])

	&apos;	Size the persistent storage
	_ControlCache = Array()
	lControls = UBound(_DialogModel.getElementNames())
	If lControls &gt;= 0 Then ReDim _ControlCache(0 To lControls)

Finally:
	Exit Sub
End Sub			&apos;	SFDialogs.SF_Dialog._Initialize

REM -----------------------------------------------------------------------------
Private Function _IsStillAlive(Optional ByVal pbError As Boolean) As Boolean
&apos;&apos;&apos;	Return True if the dialog service is still active
&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;		pbError: if True (default), raise a fatal error

Dim bAlive As Boolean		&apos;	Return value
Dim sDialog As String		&apos;	Alias of DialogName

Check:
	On Local Error GoTo Catch		&apos;	Anticipate DisposedException errors or alike
	If IsMissing(pbError) Then pbError = True

Try:
	bAlive = ( Not IsNull(_DialogProvider) Or _BuiltFromScratch )
	If bAlive Then bAlive = Not IsNull(_DialogControl)
	If Not bAlive Then GoTo Catch

Finally:
	_IsStillAlive = bAlive
	Exit Function
Catch:
	bAlive = False
	On Error GoTo 0
	sDialog = _Name
	Dispose()
	If pbError Then ScriptForge.SF_Exception.RaiseFatal(DIALOGDEADERROR, sDialog)
	GoTo Finally
End Function	&apos;	SFDialogs.SF_Dialog._IsStillAlive

REM -----------------------------------------------------------------------------
Private Sub _JumpToPage(ByVal plPage As Long)
&apos;&apos;&apos;	Called when the Page property is set to a new value
&apos;&apos;&apos;	The rules defined in the _pageManagement array are applied here

Dim oPageManager As Object		&apos;	A single entry in _PageManagement of type _PageManager
Dim oControl As Object			&apos;	DialogControl instance
Dim lPage As Long				&apos;	A dialog page number

Check:
	On Local Error GoTo Finally
&apos;	ControlName As String					&apos; Case-sensitive name of control involved in page management
&apos;	PageMgtType As Integer					&apos; One of the PILOTCONTROL, TABCONTROL, BACKCONTROL, NEXTCONTROL constants
&apos;	PageNumber As Long						&apos; When &gt; 0, the page to activate for tab controls
&apos;	ListenerType As Integer					&apos; One of the ITEMSTATECHANGED, ACTIONPERFORMED constants

	If plPage &lt;= 0 Or (_LastPage &gt; 0 And plPage &gt; _LastPage) Then Exit Sub
	If UBound(_PageManagement) &lt; 0 Then Exit Sub

Try:
	&apos;	Controls listed in the array must be synchronized with the page #
	&apos;		Listboxes and comboboxes must be set to the corresponding value
	&apos;		The right radio button must be selected
	&apos;		One corresponding button must be dimmed, other must be enabled
	&apos;		The Next button must be dimmed when last page otherwise enabled
	For Each oPageManager In _PageManagement
		With oPageManager
			lPage = .PageNumber
			Set oControl = Controls(.ControlName)
			With oControl
				Select Case .ControlType
					Case &quot;ListBox&quot;, &quot;ComboBox&quot;
						If plPage &lt;= .ListCount Then .ListIndex = plPage - 1	&apos;	ListIndex is zero-based
					Case &quot;RadioButton&quot;
						.Value = ( plPage = lPage )
					Case &quot;Button&quot;
						Select Case oPageManager.PageMgtType
							Case TABCONTROL
								.Value = ( plPage = lPage )
							Case BACKCONTROL
								.Enabled = ( plPage &lt;&gt; 1 )
							Case NEXTCONTROL
								.Enabled = ( _LastPage = 0 Or plPage &lt; _LastPage )
							Case Else
						End Select
					Case &quot;TabPageContainer&quot;
						._ControlView.ActiveTabPageID = plPage
					Case Else
				End Select
			End With
		End With
	Next oPageManager

Finally:
	Exit Sub
End Sub			&apos;	SFDialogs.SF_Dialog._JumpToPage

REM -----------------------------------------------------------------------------
Private Function _PropertyGet(Optional ByVal psProperty As String) 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

Static oSession As Object					&apos;	Alias of SF_Session
Dim oPosSize As Object						&apos;	com.sun.star.awt.Rectangle
Dim oDialogEvents As Object					&apos;	com.sun.star.container.XNameContainer
Dim sEventName As String					&apos;	Internal event name
Dim cstThisSub As String
Const cstSubArgs = &quot;&quot;

	cstThisSub = &quot;SFDialogs.Dialog.get&quot; &amp; psProperty
	If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo Catch

	ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs)
	If UCase(psProperty) &lt;&gt; UCase(&quot;IsAlive&quot;) Then
		If Not _IsStillAlive() Then GoTo Finally
	End If

	If IsNull(oSession) Then Set oSession = ScriptForge.SF_Services.CreateScriptService(&quot;Session&quot;)
	Select Case UCase(psProperty)
		Case UCase(&quot;Caption&quot;)
			If oSession.HasUNOProperty(_DialogModel, &quot;Title&quot;) Then _PropertyGet = _DialogModel.Title
		Case UCase(&quot;Height&quot;)
			If _Displayed Then	&apos;	Convert PosSize view property from pixels to APPFONT units
				_PropertyGet = SF_DialogUtils._ConvertToAppFont(_DialogControl, False).Height
			Else
				If oSession.HasUNOProperty(_DialogModel, &quot;Height&quot;) Then _PropertyGet = _DialogModel.Height
			End If			
		Case UCase(&quot;IsAlive&quot;)
			_PropertyGet = _IsStillAlive(False)
		Case UCase(&quot;Modal&quot;)
			_PropertyGet = _Modal
		Case UCase(&quot;Name&quot;)
			_PropertyGet = _Name
		Case UCase(&quot;OnFocusGained&quot;), UCase(&quot;OnFocusLost&quot;), UCase(&quot;OnKeyPressed&quot;), UCase(&quot;OnKeyReleased&quot;) _
				, UCase(&quot;OnMouseDragged&quot;), UCase(&quot;OnMouseEntered&quot;), UCase(&quot;OnMouseExited&quot;), UCase(&quot;OnMouseMoved&quot;) _
				, UCase(&quot;OnMousePressed&quot;), UCase(&quot;OnMouseReleased&quot;)
			&apos;	Check OnEvents set statically in Basic IDE
			Set oDialogEvents = _DialogModel.getEvents()
			sEventName = &quot;com.sun.star.awt.&quot; &amp; _GetListener(psProperty) &amp; &quot;::&quot; &amp; _GetEventName(psProperty)
			If oDialogEvents.hasByName(sEventName) Then
				_PropertyGet = oDialogEvents.getByName(sEventName).ScriptCode
			Else
				&apos;	Check OnEvents set dynamically by code
				Select Case UCase(psProperty)
					Case UCase(&quot;OnFocusGained&quot;)		:	_PropertyGet = _OnFocusGained
					Case UCase(&quot;OnFocusLost&quot;)		:	_PropertyGet = _OnFocusLost
					Case UCase(&quot;OnKeyPressed&quot;)		:	_PropertyGet = _OnKeyPressed
					Case UCase(&quot;OnKeyReleased&quot;)		:	_PropertyGet = _OnKeyReleased
					Case UCase(&quot;OnMouseDragged&quot;)	:	_PropertyGet = _OnMouseDragged
					Case UCase(&quot;OnMouseEntered&quot;)	:	_PropertyGet = _OnMouseEntered
					Case UCase(&quot;OnMouseExited&quot;)		:	_PropertyGet = _OnMouseExited
					Case UCase(&quot;OnMouseMoved&quot;)		:	_PropertyGet = _OnMouseMoved
					Case UCase(&quot;OnMousePressed&quot;)	:	_PropertyGet = _OnMousePressed
					Case UCase(&quot;OnMouseReleased&quot;)	:	_PropertyGet = _OnMouseReleased
					Case Else						:	_PropertyGet = &quot;&quot;
				End Select
			End If
		Case UCase(&quot;Page&quot;)
			If oSession.HasUNOProperty(_DialogModel, &quot;Step&quot;) Then _PropertyGet = _DialogModel.Step
		Case UCase(&quot;Visible&quot;)
			If oSession.HasUnoMethod(_DialogControl, &quot;isVisible&quot;) Then _PropertyGet = CBool(_DialogControl.isVisible())
		Case UCase(&quot;Width&quot;)
			If _Displayed Then	&apos;	Convert PosSize view property from pixels to APPFONT units
				_PropertyGet = SF_DialogUtils._ConvertToAppFont(_DialogControl, False).Width
			Else
				If oSession.HasUNOProperty(_DialogModel, &quot;Width&quot;) Then _PropertyGet = _DialogModel.Width
			End If			
		Case UCase(&quot;XDialogModel&quot;)
			Set _PropertyGet = _DialogModel
		Case UCase(&quot;XDialogView&quot;)
			Set _PropertyGet = _DialogControl
		Case Else
			_PropertyGet = Null
	End Select

Finally:
	ScriptForge.SF_Utils._ExitFunction(cstThisSub)
	Exit Function
Catch:
	GoTo Finally
End Function	&apos;	SFDialogs.SF_Dialog._PropertyGet

REM -----------------------------------------------------------------------------
Private Function _PropertySet(Optional ByVal psProperty As String _
								, Optional ByVal pvValue As Variant _
								) As Boolean
&apos;&apos;&apos;	Set the new value of the named property
&apos;&apos;&apos;	Args:
&apos;&apos;&apos;		psProperty: the name of the property
&apos;&apos;&apos;		pvValue: the new value of the given property
&apos;&apos;&apos;	Returns:
&apos;&apos;&apos;		True if successful

Dim bSet As Boolean							&apos;	Return value
Static oSession As Object					&apos;	Alias of SF_Session
Dim cstThisSub As String
Const cstSubArgs = &quot;Value&quot;

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

	cstThisSub = &quot;SFDialogs.Dialog.set&quot; &amp; psProperty
	ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs)
	If Not _IsStillAlive() Then GoTo Finally

	If IsNull(oSession) Then Set oSession = ScriptForge.SF_Services.CreateScriptService(&quot;Session&quot;)
	bSet = True
	Select Case UCase(psProperty)
		Case UCase(&quot;Caption&quot;)
			If Not ScriptForge.SF_Utils._Validate(pvValue, &quot;Caption&quot;, V_STRING) Then GoTo Catch
			If oSession.HasUNOProperty(_DialogModel, &quot;Title&quot;) Then _DialogModel.Title = pvValue
		Case UCase(&quot;Height&quot;)
			If Not ScriptForge.SF_Utils._Validate(pvValue, &quot;Height&quot;, ScriptForge.V_NUMERIC) Then GoTo Catch
			bSet = Resize(Height := pvValue)
		Case UCase(&quot;OnFocusGained&quot;), UCase(&quot;OnFocusLost&quot;), UCase(&quot;OnKeyPressed&quot;), UCase(&quot;OnKeyReleased&quot;) _
				, UCase(&quot;OnMouseDragged&quot;), UCase(&quot;OnMouseEntered&quot;), UCase(&quot;OnMouseExited&quot;), UCase(&quot;OnMouseMoved&quot;) _
				, UCase(&quot;OnMousePressed&quot;), UCase(&quot;OnMouseReleased&quot;)
			If Not ScriptForge.SF_Utils._Validate(pvValue, psProperty, V_STRING) Then GoTo Catch
			bSet = SF_DialogListener._SetOnProperty([Me], psProperty, pvValue)
		Case UCase(&quot;Page&quot;)
			If Not ScriptForge.SF_Utils._Validate(pvValue, &quot;Page&quot;, ScriptForge.V_NUMERIC) Then GoTo Catch
			If oSession.HasUNOProperty(_DialogModel, &quot;Step&quot;) Then
				_DialogModel.Step = CLng(pvValue)
				&apos;	Execute the page manager instructions
				_JumpToPage(pvValue)
			End If
		Case UCase(&quot;Visible&quot;)
			If Not ScriptForge.SF_Utils._Validate(pvValue, &quot;Visible&quot;, ScriptForge.V_BOOLEAN) Then GoTo Catch
			If oSession.HasUnoMethod(_DialogControl, &quot;setVisible&quot;) Then _DialogControl.setVisible(pvValue)
		Case UCase(&quot;Width&quot;)
			If Not ScriptForge.SF_Utils._Validate(pvValue, &quot;Width&quot;, ScriptForge.V_NUMERIC) Then GoTo Catch
			bSet = Resize(Width := pvValue)
		Case Else
			bSet = False
	End Select

Finally:
	_PropertySet = bSet
	ScriptForge.SF_Utils._ExitFunction(cstThisSub)
	Exit Function
Catch:
	bSet = False
	GoTo Finally
End Function	&apos;	SFDialogs.SF_Dialog._PropertySet

REM -----------------------------------------------------------------------------
Private Function _RegisterPageListener(ByVal psControlName As String _
											, ByVal psControlTypes As String _
											, ByVal piMgtType As Integer _
											, ByVal plPageNumber As Long _
											, ByVal piListener As Integer _
											) As Boolean
&apos;&apos;&apos;	Insert a new entry in the _PageManagement array when 1st argument is a listbox, a combobox,
&apos;&apos;&apos;	a button or a tabpagecontainer.
&apos;&apos;&apos;	or insert a new entry in the _PageManagement array by radio button in the same group as the 1st argument
&apos;&apos;&apos;	Args:
&apos;&apos;&apos;		psControlName: name of the involved control
&apos;&apos;&apos;		psControlTypes: comma-separated list of allowed control types
&apos;&apos;&apos;		piMgtType: one of the PILOTCONTROL, TABCONTROL, BACKCONTROL, NEXTCONTROL, TABPAGE constants
&apos;&apos;&apos;		plPageNumber: when &gt; 0 the page to jump to when control is clicked
&apos;&apos;&apos;		piListener: one of the ACTIONPERFORMED, ITEMSTATECHANGED, TABSELECTED constants

Dim bRegister As Boolean			&apos;	Return value
Dim oControl As Object				&apos;	A DialogControl object
Dim oControl2 As Object				&apos;	An alternative DialogControl object for radio buttons
Dim vControls As Variant			&apos;	Array of involved controls - mostly 1 item, more when radio button
Dim oPageManager As Object			&apos;	Type _PageManager
Dim bRadio As Boolean				&apos;	True when argument is a radio button
Dim sName As String					&apos;	Control name
Dim i As Long

Check:
	On Local Error GoTo Catch
	bRegister = False

Try:
	Set oControl = Controls(psControlName)
	With oControl
	&apos;	Check the type of control otherwise return False
		If InStr(psControlTypes, .ControlType) = 0 Then GoTo Catch
		&apos;	Are there siblings ? Siblings are returned as a comma-separated list of names
		bRadio = ( .ControlType = &quot;RadioButton&quot;)
		If bRadio Then vControls = Split(_FindRadioSiblings(.Name), &quot;,&quot;) Else vControls = Array(.Name)
		&apos;	Several loops when radio buttons
		For i = 0 To UBound(vControls)
			sName = vControls(i)
			&apos;	Prepare the next entry in the _PageManagement array
			Set oPageManager = New _PageManager
			With oPageManager
				.ControlName = sName
				.PageMgtType = piMgtType
				.PageNumber = Iif(bRadio, i + 1, plPageNumber)
				.ListenerType = piListener
			End With
			_PageManagement = ScriptForge.SF_Array.Append(_PageManagement, oPageManager)
			&apos;	Activate the listener
			&apos;	Use alternative control for radio buttons &gt; first
			If i = 0 Then Set oControl2 = oControl Else Set oControl2 = Controls(sName)
			With oControl2
				If piListener = ACTIONPERFORMED Then
					._ControlView.addActionListener(_ActionListener)
				ElseIf piListener = ITEMSTATECHANGED Then
					._ControlView.addItemListener(_ItemListener)
				ElseIf piListener = TABSELECTED Then
					._ControlView.addTabPageContainerListener(_TabPageContainerListener)
				End If
			End With
		Next i
	End With

	bRegister = True
			
Finally:
	_RegisterPageListener = bRegister
	Exit Function
Catch:
	GoTo Finally
End Function	&apos;	SFDialogs.SF_Dialog._RegisterPageListener

REM -----------------------------------------------------------------------------
Private Sub _RemoveAllListeners()
&apos;&apos;&apos;	Executed at dialog termination to drop at once all listeners set
&apos;&apos;&apos;	either by the page manager or by an On-property setting

Dim oPageManager As Object		&apos;	Item of _PageManagement array of _PageManager type
Dim oControl As Object			&apos;	DialogControl instance
Dim i As Long

	On Local Error GoTo Finally		&apos;	Never interrupt

Try:
	&apos;	Scan the _PageManagement array containing the actual settings of the page manager
	For Each oPageManager In _PageManagement
		With oPageManager
			If .ListenerType &gt; 0 Then
				Set oControl = Controls(.ControlName)
				If .ListenerType =  ACTIONPERFORMED Then
					oControl._ControlView.removeActionListener(_ActionListener)
				ElseIf .ListenerType = ITEMSTATECHANGED Then
					oControl._ControlView.removeItemListener(_ItemListener)
				End If
			End If
		End With
	Next oPageManager

	Set _ActionListener = Nothing
	Set _ItemListener = Nothing

	&apos;	Clean listeners linked to On properties
	With _DialogControl
		If Not IsNull(_FocusListener) Then .removeFocusListener(_FocusListener)
		If Not IsNull(_KeyListener) Then .removeKeyListener(_KeyListener)
		If Not IsNull(_MouseListener) Then .removeMouseListener(_MouseListener)
		If Not IsNull(_MouseMotionListener) Then .removeMouseMotionListener(_MouseMotionListener)
	End With

	Set _FocusListener = Nothing
	Set _KeyListener = Nothing
	Set _MouseListener = Nothing
	Set _MouseMotionListener = Nothing

	&apos;	Clean close listener for non-modal dialog
	If Not IsNull(_TopWindowListener) Then _DialogControl.removeTopWindowListener(_TopWindowListener)

Finally:
	Exit Sub	
End Sub			&apos;	SFDialogs.SF_Dialog._RemoveAllListeners
REM -----------------------------------------------------------------------------
Private Function _Repr() As String
&apos;&apos;&apos;	Convert the Model instance to a readable string, typically for debugging purposes (DebugPrint ...)
&apos;&apos;&apos;	Args:
&apos;&apos;&apos;	Return:
&apos;&apos;&apos;		&quot;[DIALOG]: Container.Library.Name&quot;

	_Repr = &quot;[DIALOG]: &quot; &amp; _Container &amp; &quot;.&quot; &amp; _Library &amp; &quot;.&quot; &amp; _Name

End Function	&apos;	SFDialogs.SF_Dialog._Repr

REM ============================================ END OF SFDIALOGS.SF_DIALOG
</script:module>