1
0
Fork 0
libreoffice/wizards/source/sfdialogs/SF_Dialog.xba
Daniel Baumann 8e63e14cf6
Adding upstream version 4:25.2.3.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
2025-06-22 16:20:04 +02:00

3142 lines
No EOL
152 KiB
XML

<?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 constants
End Type
Private _PageManagement As Variant &apos; Array of _PageManager objects, one entry by involved control
Private _ItemListener As Object &apos; com.sun.star.awt.XItemListener
Private _ActionListener As Object &apos; com.sun.star.awt.XActionListener
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; 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 ITEMSTATECHANGED = 1
Private Const ACTIONPERFORMED = 2
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()
Set _ItemListener = Nothing
Set _ActionListener = 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 presumes 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 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
Dim oListener As Object &apos; com.sun.star.awt.XTopWindowListener
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 oListener = CreateUnoListener(&quot;_SFNONMODAL_&quot;, &quot;com.sun.star.awt.XTopWindowListener&quot;)
_DialogControl.addTopWindowListener(oListener)
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 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;CreateTextField&quot; _
, &quot;CreateTimeField&quot; _
, &quot;CreateTreeControl&quot; _
, &quot;EndExecute&quot; _
, &quot;Execute&quot; _
, &quot;GetTextsFromL10N&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;)
&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; Possible 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 control updates 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; Preset 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
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;_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;)
&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; 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 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 or a button
&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 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 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)
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
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>