wizards/source/sfdocuments/SF_Base.xba     |  464 ++++
 wizards/source/sfdocuments/SF_Calc.xba     | 2843 +++++++++++++++++++++++++++++
 wizards/source/sfdocuments/SF_Document.xba | 1010 ++++++++++
 wizards/source/sfdocuments/SF_Register.xba |  198 ++
 wizards/source/sfdocuments/__License.xba   |   26 
 wizards/source/sfdocuments/dialog.xlb      |    3 
 wizards/source/sfdocuments/script.xlb      |    9 
 7 files changed, 4553 insertions(+)

New commits:
commit cdedc00ff579980c73b3cdb5fee0c78c1e111361
Author:     Jean-Pierre Ledure <j...@ledure.be>
AuthorDate: Thu Nov 5 16:28:52 2020 +0100
Commit:     Jean-Pierre Ledure <j...@ledure.be>
CommitDate: Thu Nov 5 16:28:52 2020 +0100

    ScriptForge - SFDocuments library
    
    Additional "LibreOffice Macros & Dialogs" library
    
    Change-Id: I1eadae02d2bbd5d549d9a5bbcec2b83682c7c2ab

diff --git a/wizards/source/sfdocuments/SF_Base.xba 
b/wizards/source/sfdocuments/SF_Base.xba
new file mode 100644
index 000000000000..166b717919d3
--- /dev/null
+++ b/wizards/source/sfdocuments/SF_Base.xba
@@ -0,0 +1,464 @@
+<?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_Base" script:language="StarBasic" 
script:moduleType="normal">REM 
=======================================================================================================================
+REM ===                        The ScriptForge library and its associated 
libraries are part of the LibreOffice project.                               ===
+REM    ===                                             The SFDocuments library 
is one of the associated libraries.                                             
                        ===
+REM ===                                        Full documentation is available 
on https://help.libreoffice.org/                                                
                ===
+REM 
=======================================================================================================================
+
+Option Compatible
+Option ClassModule
+
+Option Explicit
+
+&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;
+&apos;&apos;&apos;     SF_Base
+&apos;&apos;&apos;     =======
+&apos;&apos;&apos;
+&apos;&apos;&apos;             The SFDocuments library gathers a number of 
methods and properties making easy
+&apos;&apos;&apos;             the management and several manipulations of 
LibreOffice documents
+&apos;&apos;&apos;
+&apos;&apos;&apos;             Some methods are generic for all types of 
documents: they are combined in the SF_Document module.
+&apos;&apos;&apos;             Specific properties and methods are implemented 
in the concerned subclass(es) SF_Calc, SF_Writer, ...
+&apos;&apos;&apos;
+&apos;&apos;&apos;             To workaround the absence of class inheritance 
in LibreOffice Basic, some redundancy is necessary
+&apos;&apos;&apos;             Each subclass MUST implement also the generic 
methods and properties, even if they only call
+&apos;&apos;&apos;             the parent methods and properties.
+&apos;&apos;&apos;             They should also duplicate some generic private 
members as a subset of their own set of members
+&apos;&apos;&apos;
+&apos;&apos;&apos;             The SF_Base module is provided only to block 
parent properties that are NOT applicable to Base documents
+&apos;&apos;&apos;
+&apos;&apos;&apos;             The current module is closely related to the 
&quot;UI&quot; service of the ScriptForge library
+&apos;&apos;&apos;
+&apos;&apos;&apos;             Service invocation examples:
+&apos;&apos;&apos;             1) From the UI service
+&apos;&apos;&apos;                     Dim ui As Object, oDoc As Object
+&apos;&apos;&apos;                     Set ui = 
CreateScriptService(&quot;UI&quot;)
+&apos;&apos;&apos;                     Set oDoc = 
ui.CreateBaseDocument(&quot;C:\Me\MyFile.odb&quot;, ...)
+&apos;&apos;&apos;                             &apos; or Set oDoc = 
ui.OpenDocument(&quot;C:\Me\MyFile.odb&quot;)
+&apos;&apos;&apos;             2) Directly if the document is already opened
+&apos;&apos;&apos;                     Dim oDoc As Object
+&apos;&apos;&apos;                     Set oDoc = 
CreateScriptService(&quot;SFDocuments.Base&quot;, &quot;MyFile.odb&quot;)
+&apos;&apos;&apos;                     &apos; The substring 
&quot;SFDocuments.&quot; in the service name is optional
+&apos;&apos;&apos;
+&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&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 DBCONNECTERROR                   =       
&quot;DBCONNECTERROR&quot;
+
+REM ============================================================= PRIVATE 
MEMBERS
+
+Private [Me]                                   As Object
+Private [_Parent]                              As Object
+Private [_Super]                               As Object               &apos;  
Document superclass, which the current instance is a subclass of
+Private ObjectType                             As String               &apos;  
Must be BASE
+Private ServiceName                            As String
+
+&apos; Window component
+Private _Component                             As Object               &apos;  
com.sun.star.comp.dba.ODatabaseDocument
+Private _DataSource                            As Object               &apos;  
com.sun.star.comp.dba.ODatabaseSource
+Private _Database                              As Object               &apos;  
SFDatabases.Database service instance
+
+REM ============================================================ MODULE 
CONSTANTS
+
+REM ===================================================== 
CONSTRUCTOR/DESCTRUCTOR
+
+REM 
-----------------------------------------------------------------------------
+Private Sub Class_Initialize()
+       Set [Me] = Nothing
+       Set [_Parent] = Nothing
+       Set [_Super] = Nothing
+       ObjectType = &quot;BASE&quot;
+       ServiceName = &quot;SFDocuments.Base&quot;
+       Set _Component = Nothing
+       Set _DataSource = Nothing
+       Set _Database = Nothing
+End Sub                &apos;  SFDocuments.SF_Base Constructor
+
+REM 
-----------------------------------------------------------------------------
+Private Sub Class_Terminate()
+       Call Class_Initialize()
+End Sub                &apos;  SFDocuments.SF_Base Destructor
+
+REM 
-----------------------------------------------------------------------------
+Public Function Dispose() As Variant
+       If Not IsNull([_Super]) Then Set [_Super] = [_Super].Dispose()
+       Call Class_Terminate()
+       Set Dispose = Nothing
+End Function   &apos;  SFDocuments.SF_Base Explicit Destructor
+
+REM ================================================================== 
PROPERTIES
+
+REM ===================================================================== 
METHODS
+
+REM 
-----------------------------------------------------------------------------
+Public Function CloseDocument(Optional ByVal SaveAsk As Variant) As Boolean
+&apos;&apos;&apos;     The closure of a Base document requires the closures of
+&apos;&apos;&apos;             1) the connection =&gt; done in the 
CloseDatabase() method
+&apos;&apos;&apos;             2) the data source
+&apos;&apos;&apos;             3) the document itself =&gt; done in the 
superclass
+
+Const cstThisSub = &quot;SFDocuments.Base.CloseDocument&quot;
+Const cstSubArgs = &quot;[SaveAsk=True]&quot;
+
+       If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
+
+Check:
+       If IsMissing(SaveAsk) Or IsEmpty(SaveAsk) Then SaveAsk = True
+       If ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
+               If Not [_Super]._IsStillAlive(True) Then GoTo Finally
+               If Not ScriptForge.SF_Utils._Validate(SaveAsk, 
&quot;SaveAsk&quot;, V_BOOLEAN) Then GoTo Finally
+       End If
+
+Try:
+       If Not IsNull(_Database) Then _Database.CloseDatabase()
+       If Not IsNull(_DataSource) Then _DataSource.dispose()
+       CloseDocument = [_Super].CloseDocument(SaveAsk)
+
+Finally:
+       ScriptForge.SF_Utils._ExitFunction(cstThisSub)
+       Exit Function
+Catch:
+       GoTo Finally
+End Function   &apos;   SFDocuments.SF_Base.CloseDocument
+
+REM 
-----------------------------------------------------------------------------
+Public Function GetDatabase(Optional ByVal User As Variant _
+                                                               , Optional 
ByVal Password As Variant _
+                                                               ) As Object
+&apos;&apos;&apos;     Returns a Database instance (service = 
SFDatabases.Database) giving access
+&apos;&apos;&apos;     to the execution of SQL commands on the database 
defined and/or stored in
+&apos;&apos;&apos;     the actual Base document
+&apos;&apos;&apos;     Args:
+&apos;&apos;&apos;             User, Password: the login parameters as 
strings. Defaults = &quot;&quot;
+&apos;&apos;&apos;     Returns:
+&apos;&apos;&apos;             A SFDatabases.Database instance or Nothing
+&apos;&apos;&apos;     Example:
+&apos;&apos;&apos;             Dim myDb As Object
+&apos;&apos;&apos;                     Set myDb = oDoc.GetDatabase()
+
+Const cstThisSub = &quot;SFDocuments.Base.GetDatabase&quot;
+Const cstSubArgs = &quot;[User=&quot;&quot;&quot;&quot;], 
[Password=&quot;&quot;&quot;&quot;]&quot;
+
+       If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
+       Set GetDatabase = Nothing
+
+Check:
+       If IsMissing(User) Or IsEmpty(User) Then User = &quot;&quot;
+       If IsMissing(Password) Or IsEmpty(Password) Then Password = &quot;&quot;
+       If ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
+               If Not [_Super]._IsStillAlive(True) Then GoTo Finally
+               If Not ScriptForge.SF_Utils._Validate(User, &quot;User&quot;, 
V_STRING) Then GoTo Finally
+               If Not ScriptForge.SF_Utils._Validate(Password, 
&quot;Password&quot;, V_STRING) Then GoTo Finally
+       End If
+
+Try:
+       If IsNull(_Database) Then               &apos;  1st connection from the 
current document instance
+               If IsNull(_DataSource) Then GoTo CatchConnect
+               Set _Database = 
ScriptForge.SF_Services.CreateScriptService(&quot;SFDatabases.DatabaseFromDocument&quot;
 _
+                                                       , _DataSource, User, 
Password)
+               If IsNull(_Database) Then GoTo CatchConnect
+               _Database._Location = [_Super]._WindowFileName
+       EndIf
+
+Finally:
+       Set GetDatabase = _Database
+       ScriptForge.SF_Utils._ExitFunction(cstThisSub)
+       Exit Function
+Catch:
+       GoTo Finally
+CatchConnect:
+       ScriptForge.SF_Exception.RaiseFatal(DBCONNECTERROR, &quot;User&quot;, 
User, &quot;Password&quot;, Password, [_Super]._FileIdent())
+       GoTo Finally
+End Function   &apos;  SFDocuments.SF_Base.GetDatabase
+
+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
+
+Const cstThisSub = &quot;SFDocuments.Base.GetProperty&quot;
+Const cstSubArgs = &quot;&quot;
+
+       If ScriptForge.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:
+       &apos;  Superclass or subclass property ?
+       If ScriptForge.SF_Array.Contains([_Super].Properties(), PropertyName) 
Then
+               GetProperty = [_Super].GetProperty(PropertyName)
+       Else
+               GetProperty = _PropertyGet(PropertyName)
+       End If
+
+Finally:
+       ScriptForge.SF_Utils._ExitFunction(cstThisSub)
+       Exit Function
+Catch:
+       GoTo Finally
+End Function   &apos;  SFDocuments.SF_Base.GetProperty
+
+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;CloseDocument&quot; _
+                                       , &quot;GetDatabase&quot; _
+                                       , &quot;RunCommand&quot; _
+                                       , &quot;Save&quot; _
+                                       , &quot;SaveAs&quot; _
+                                       , &quot;SaveCopyAs&quot; _
+                                       )
+
+End Function   &apos;  SFDocuments.SF_Base.Methods
+
+REM 
-----------------------------------------------------------------------------
+Public Function Properties() As Variant
+&apos;&apos;&apos;     Return the list or properties of the Timer class as an 
array
+
+       Properties = Array( _
+                                       &quot;DocumentType&quot; _
+                                       , &quot;IsBase&quot; _
+                                       , &quot;IsCalc&quot; _
+                                       , &quot;IsDraw &quot; _
+                                       , &quot;IsImpress&quot; _
+                                       , &quot;IsMath&quot; _
+                                       , &quot;IsWriter&quot; _
+                                       , &quot;XComponent&quot; _
+                                       )
+
+End Function   &apos;  SFDocuments.SF_Base.Properties
+
+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;SFDocuments.Base.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:
+       Select Case UCase(PropertyName)
+               Case Else
+       End Select
+
+Finally:
+       SF_Utils._ExitFunction(cstThisSub)
+       Exit Function
+Catch:
+       GoTo Finally
+End Function   &apos;  SFDocuments.SF_Documents.SetProperty
+
+REM ======================================================= SUPERCLASS 
PROPERTIES
+
+REM 
-----------------------------------------------------------------------------
+&apos;Property Get CustomProperties() As Variant
+&apos; CustomProperties = [_Super].GetProperty(&quot;CustomProperties&quot;)
+&apos;End Property     &apos;  SFDocuments.SF_Base.CustomProperties
+
+REM 
-----------------------------------------------------------------------------
+&apos;Property Let CustomProperties(Optional ByVal pvCustomProperties As 
Variant)
+&apos; [_Super].CustomProperties = pvCustomProperties
+&apos;End Property     &apos;  SFDocuments.SF_Base.CustomProperties
+
+REM 
-----------------------------------------------------------------------------
+&apos;Property Get Description() As Variant
+&apos; Description = [_Super].GetProperty(&quot;Description&quot;)
+&apos;End Property     &apos;  SFDocuments.SF_Base.Description
+
+REM 
-----------------------------------------------------------------------------
+&apos;Property Let Description(Optional ByVal pvDescription As Variant)
+&apos; [_Super].Description = pvDescription
+&apos;End Property     &apos;  SFDocuments.SF_Base.Description
+
+REM 
-----------------------------------------------------------------------------
+&apos;Property Get DocumentProperties() As Variant
+&apos; DocumentProperties = 
[_Super].GetProperty(&quot;DocumentProperties&quot;)
+&apos;End Property     &apos;  SFDocuments.SF_Base.DocumentProperties
+
+REM 
-----------------------------------------------------------------------------
+Property Get DocumentType() As String
+       DocumentType = [_Super].GetProperty(&quot;DocumentType&quot;)
+End Property   &apos;  SFDocuments.SF_Base.DocumentType
+
+REM 
-----------------------------------------------------------------------------
+Property Get IsBase() As Boolean
+       IsBase = [_Super].GetProperty(&quot;IsBase&quot;)
+End Property   &apos;  SFDocuments.SF_Base.IsBase
+
+REM 
-----------------------------------------------------------------------------
+Property Get IsCalc() As Boolean
+       IsCalc = [_Super].GetProperty(&quot;IsCalc&quot;)
+End Property   &apos;  SFDocuments.SF_Base.IsCalc
+
+REM 
-----------------------------------------------------------------------------
+Property Get IsDraw() As Boolean
+       IsDraw = [_Super].GetProperty(&quot;IsDraw&quot;)
+End Property   &apos;  SFDocuments.SF_Base.IsDraw
+
+REM 
-----------------------------------------------------------------------------
+Property Get IsImpress() As Boolean
+       IsImpress = [_Super].GetProperty(&quot;IsImpress&quot;)
+End Property   &apos;  SFDocuments.SF_Base.IsImpress
+
+REM 
-----------------------------------------------------------------------------
+Property Get IsMath() As Boolean
+       IsMath = [_Super].GetProperty(&quot;IsMath&quot;)
+End Property   &apos;  SFDocuments.SF_Base.IsMath
+
+REM 
-----------------------------------------------------------------------------
+Property Get IsWriter() As Boolean
+       IsWriter = [_Super].GetProperty(&quot;IsWriter&quot;)
+End Property   &apos;  SFDocuments.SF_Base.IsWriter
+
+REM 
-----------------------------------------------------------------------------
+&apos;Property Get Keywords() As Variant
+&apos; Keywords = [_Super].GetProperty(&quot;Keywords&quot;)
+&apos;End Property     &apos;  SFDocuments.SF_Base.Keywords
+
+REM 
-----------------------------------------------------------------------------
+&apos;Property Let Keywords(Optional ByVal pvKeywords As Variant)
+&apos; [_Super].Keywords = pvKeywords
+&apos;End Property     &apos;  SFDocuments.SF_Base.Keywords
+
+REM 
-----------------------------------------------------------------------------
+&apos;Property Get Readonly() As Variant
+&apos; Readonly = [_Super].GetProperty(&quot;Readonly&quot;)
+&apos;End Property     &apos;  SFDocuments.SF_Base.Readonly
+
+REM 
-----------------------------------------------------------------------------
+&apos;Property Get Subject() As Variant
+&apos; Subject = [_Super].GetProperty(&quot;Subject&quot;)
+&apos;End Property     &apos;  SFDocuments.SF_Base.Subject
+
+REM 
-----------------------------------------------------------------------------
+&apos;Property Let Subject(Optional ByVal pvSubject As Variant)
+&apos; [_Super].Subject = pvSubject
+&apos;End Property     &apos;  SFDocuments.SF_Base.Subject
+
+REM 
-----------------------------------------------------------------------------
+&apos;Property Get Title() As Variant
+&apos; Title = [_Super].GetProperty(&quot;Title&quot;)
+&apos;End Property     &apos;  SFDocuments.SF_Base.Title
+
+REM 
-----------------------------------------------------------------------------
+&apos;Property Let Title(Optional ByVal pvTitle As Variant)
+&apos; [_Super].Title = pvTitle
+&apos;End Property     &apos;  SFDocuments.SF_Base.Title
+
+REM 
-----------------------------------------------------------------------------
+Property Get XComponent() As Variant
+       XComponent = [_Super].GetProperty(&quot;XComponent&quot;)
+End Property   &apos;  SFDocuments.SF_Base.XComponent
+
+REM ========================================================== SUPERCLASS 
METHODS
+
+REM 
-----------------------------------------------------------------------------
+Public Function Activate() As Boolean
+       Activate = [_Super].Activate()
+End Function    &apos;   SFDocuments.SF_Base.Activate
+
+REM 
-----------------------------------------------------------------------------
+Public Sub RunCommand(Optional ByVal Command As Variant)
+       [_Super].RunCommand(Command)
+End Sub                  &apos;   SFDocuments.SF_Base.RunCommand
+
+REM 
-----------------------------------------------------------------------------
+Public Function Save() As Boolean
+       Save = [_Super].Save()
+End Function   &apos;   SFDocuments.SF_Base.Save
+
+REM 
-----------------------------------------------------------------------------
+Public Function SaveAs(Optional ByVal FileName As Variant _
+                                                       , Optional ByVal 
Overwrite As Variant _
+                                                       , Optional ByVal 
Password As Variant _
+                                                       , Optional ByVal 
FilterName As Variant _
+                                                       , Optional ByVal 
FilterOptions As Variant _
+                                                       ) As Boolean
+       SaveAs = [_Super].SaveAs(FileName, Overwrite, Password, FilterName, 
FilterOptions)
+End Function   &apos;   SFDocuments.SF_Base.SaveAs
+
+REM 
-----------------------------------------------------------------------------
+Public Function SaveCopyAs(Optional ByVal FileName As Variant _
+                                                       , Optional ByVal 
Overwrite As Variant _
+                                                       , Optional ByVal 
Password As Variant _
+                                                       , Optional ByVal 
FilterName As Variant _
+                                                       , Optional ByVal 
FilterOptions As Variant _
+                                                       ) As Boolean
+       SaveCopyAs = [_Super].SaveCopyAs(FileName, Overwrite, Password, 
FilterName, FilterOptions)
+End Function   &apos;   SFDocuments.SF_Base.SaveCopyAs
+
+REM =========================================================== PRIVATE 
FUNCTIONS
+
+REM 
-----------------------------------------------------------------------------
+Private Function _PropertyGet(Optional ByVal psProperty As String _
+                                                               , Optional 
ByVal pvArg As Variant _
+                                                               ) As Variant
+&apos;&apos;&apos;     Return the value of the named property
+&apos;&apos;&apos;     Args:
+&apos;&apos;&apos;             psProperty: the name of the property
+
+Dim oProperties As Object                      &apos;  Document or Custom 
properties
+Dim vLastCell As Variant                       &apos;  Coordinates of last 
used cell in a sheet
+Dim oSelect As Object                          &apos;  Current selection
+Dim vRanges As Variant                         &apos;  List of selected ranges
+Dim i As Long
+Dim cstThisSub As String
+Const cstSubArgs = &quot;&quot;
+
+       _PropertyGet = False
+
+       cstThisSub = &quot;SFDocuments.SF_Base.get&quot; &amp; psProperty
+       ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs)
+       If Not [_Super]._IsStillAlive() Then GoTo Finally
+
+       Select Case psProperty
+               Case Else
+                       _PropertyGet = Null
+       End Select
+
+Finally:
+       ScriptForge.SF_Utils._ExitFunction(cstThisSub)
+       Exit Function
+End Function   &apos;  SFDocuments.SF_Base._PropertyGet
+
+REM 
-----------------------------------------------------------------------------
+Private Function _Repr() As String
+&apos;&apos;&apos;     Convert the SF_Base instance to a readable string, 
typically for debugging purposes (DebugPrint ...)
+&apos;&apos;&apos;     Args:
+&apos;&apos;&apos;     Return:
+&apos;&apos;&apos;             &quot;[Base]: Type/File&quot;
+
+       _Repr = &quot;[Base]: &quot; &amp; [_Super]._FileIdent()
+
+End Function   &apos;  SFDocuments.SF_Base._Repr
+
+REM ============================================ END OF SFDOCUMENTS.SF_BASE
+</script:module>
\ No newline at end of file
diff --git a/wizards/source/sfdocuments/SF_Calc.xba 
b/wizards/source/sfdocuments/SF_Calc.xba
new file mode 100644
index 000000000000..5c897e2dbd14
--- /dev/null
+++ b/wizards/source/sfdocuments/SF_Calc.xba
@@ -0,0 +1,2843 @@
+<?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_Calc" script:language="StarBasic" 
script:moduleType="normal">REM 
=======================================================================================================================
+REM ===                        The ScriptForge library and its associated 
libraries are part of the LibreOffice project.                               ===
+REM    ===                                             The SFDocuments library 
is one of the associated libraries.                                             
                        ===
+REM ===                                        Full documentation is available 
on https://help.libreoffice.org/                                                
                ===
+REM 
=======================================================================================================================
+
+Option Compatible
+Option ClassModule
+
+Option Explicit
+
+&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;
+&apos;&apos;&apos;     SF_Calc
+&apos;&apos;&apos;     =======
+&apos;&apos;&apos;
+&apos;&apos;&apos;             The SFDocuments library gathers a number of 
methods and properties making easy
+&apos;&apos;&apos;             the management and several manipulations of 
LibreOffice documents
+&apos;&apos;&apos;
+&apos;&apos;&apos;             Some methods are generic for all types of 
documents: they are combined in the SF_Document module.
+&apos;&apos;&apos;             Specific properties and methods are implemented 
in the concerned subclass(es) SF_Calc, SF_Writer, ...
+&apos;&apos;&apos;
+&apos;&apos;&apos;             To workaround the absence of class inheritance 
in LibreOffice Basic, some redundancy is necessary
+&apos;&apos;&apos;             Each subclass MUST implement also the generic 
methods and properties, even if they only call
+&apos;&apos;&apos;             the parent methods and properties.
+&apos;&apos;&apos;             They should also duplicate some generic private 
members as a subset of their own set of members
+&apos;&apos;&apos;
+&apos;&apos;&apos;             The SF_Calc module is focused on :
+&apos;&apos;&apos;                     - management (copy, insert, move, ...) 
of sheets within a Calc document
+&apos;&apos;&apos;                     - exchange of data between Basic data 
structures and Calc ranges of values
+&apos;&apos;&apos;
+&apos;&apos;&apos;             The current module is closely related to the 
&quot;UI&quot; service of the ScriptForge library
+&apos;&apos;&apos;
+&apos;&apos;&apos;             Service invocation examples:
+&apos;&apos;&apos;             1) From the UI service
+&apos;&apos;&apos;                     Dim ui As Object, oDoc As Object
+&apos;&apos;&apos;                     Set ui = 
CreateScriptService(&quot;UI&quot;)
+&apos;&apos;&apos;                     Set oDoc = 
ui.CreateDocument(&quot;Calc&quot;, ...)
+&apos;&apos;&apos;                             &apos; or Set oDoc = 
ui.OpenDocument(&quot;C:\Me\MyFile.ods&quot;)
+&apos;&apos;&apos;             2) Directly if the document is already opened
+&apos;&apos;&apos;                     Dim oDoc As Object
+&apos;&apos;&apos;                     Set oDoc = 
CreateScriptService(&quot;SFDocuments.Calc&quot;, &quot;Untitled 1&quot;)    
&apos;  Default = ActiveWindow
+&apos;&apos;&apos;                             &apos; or Set oDoc = 
CreateScriptService(&quot;SFDocuments.Calc&quot;, &quot;Untitled 1&quot;)  
&apos;  Untitled 1 is presumed a Calc document
+&apos;&apos;&apos;                     &apos; The substring 
&quot;SFDocuments.&quot; in the service name is optional
+&apos;&apos;&apos;
+&apos;&apos;&apos;             Definitions: 
+&apos;&apos;&apos;                     Many methods require a 
&quot;Sheet&quot; or a &quot;Range&quot; as argument. (NB: a single cell is 
considered as a special case of a Range)
+&apos;&apos;&apos;                     Usually, within a specific Calc 
instance, sheets and ranges are given as a string: &quot;SheetX&quot; and 
&quot;D2:F6&quot;
+&apos;&apos;&apos;                     Multiple ranges are not supported in 
this context.
+&apos;&apos;&apos;                     Additionally, the .Sheet and .Range 
methods return a reference that may be used
+&apos;&apos;&apos;                     as argument of a method called from 
another instance of the Calc service
+&apos;&apos;&apos;                     Example:
+&apos;&apos;&apos;                             Dim oDocA As Object     :       
Set oDocA = ui.OpenDocument(&quot;C:\FileA.ods&quot;, Hidden := True, ReadOnly 
:= True)
+&apos;&apos;&apos;                             Dim oDocB As Object     :       
Set oDocB = ui.OpenDocument(&quot;C:\FileB.ods&quot;)
+&apos;&apos;&apos;                             
oDocB.CopyToRange(oDocA.Range(&quot;SheetX.D4:F8&quot;), &quot;D2:F6&quot;)     
&apos; CopyToRange(source, target)
+&apos;&apos;&apos;
+&apos;&apos;&apos;                     Sheet: the sheet name as a string or an 
object produced by .Sheet()
+&apos;&apos;&apos;                                             &quot;~&quot; = 
current sheet
+&apos;&apos;&apos;                     Range: a string designating a set of 
contiguous cells located in a sheet of the current instance
+&apos;&apos;&apos;                                             &quot;~&quot; = 
current selection (if multiple selections, its 1st component)
+&apos;&apos;&apos;                                     or an object produced 
by .Range()
+&apos;&apos;&apos;                             The sheet name is optional 
(default = active sheet). Surrounding quotes and $ signs are optional
+&apos;&apos;&apos;                                     ~.~, ~                  
                                The current selection in the active sheet
+&apos;&apos;&apos;                                     &apos;$SheetX&apos;.D2 
or $D$2                  A single cell
+&apos;&apos;&apos;                                     
&apos;$SheetX&apos;.D2:F6, D2:D10                       Multiple cells
+&apos;&apos;&apos;                                     &apos;$SheetX&apos;.A:A 
or 3:5                  All cells in the same column or row up to the last 
active cell
+&apos;&apos;&apos;                                     SheetX.*                
                                All cells up to the last active cell
+&apos;&apos;&apos;                                     myRange                 
                                A range name at spreadsheet level
+&apos;&apos;&apos;                                     ~.yourRange, 
SheetX.someRange   A range name at sheet level
+&apos;&apos;&apos;                                     
myDoc.Range(&quot;SheetX.D2:F6&quot;)
+&apos;&apos;&apos;                                                             
                        A range within the sheet SheetX in file associated with 
the myDoc Calc instance
+&apos;&apos;&apos;
+&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&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 UNKNOWNFILEERROR         =       &quot;UNKNOWNFILEERROR&quot;
+Private Const BASEDOCUMENTOPENERROR    =       
&quot;BASEDOCUMENTOPENERROR&quot;
+Private Const CALCADDRESSERROR         =       &quot;CALCADDRESSERROR&quot;
+Private Const DUPLICATESHEETERROR      =       &quot;DUPLICATESHEETERROR&quot;
+Private Const OFFSETADDRESSERROR       =       &quot;OFFSETADDRESSERROR&quot;
+
+REM ============================================================= PRIVATE 
MEMBERS
+
+Private [Me]                                   As Object
+Private [_Parent]                              As Object
+Private [_Super]                               As Object               &apos;  
Document superclass, which the current instance is a subclass of
+Private ObjectType                             As String               &apos;  
Must be CALC
+Private ServiceName                            As String
+
+&apos; Window component
+Private _Component                             As Object               &apos;  
com.sun.star.lang.XComponent
+
+Type _Address
+       ObjectType                                      As String               
&apos;  Must be &quot;SF_CalcReference&quot;
+       RawAddress                                      As String
+       Component                                       As Object               
&apos;  com.sun.star.lang.XComponent
+       SheetName                                       As String
+       SheetIndex                                      As Integer
+       RangeName                                       As String
+       Height                                          As Long
+       Width                                           As Long
+       XSpreadSheet                            As Object               &apos;  
com.sun.star.sheet.XSpreadsheet
+       XCellRange                                      As Object               
&apos;  com.sun.star.table.XCellRange
+End Type
+
+REM ============================================================ MODULE 
CONSTANTS
+
+Private Const cstSHEET                 = 1
+Private Const cstRANGE                 = 2
+
+Private Const MAXCOLS                  = 2^10                                  
&apos;  Max number of colums in a sheet
+Private Const MAXROWS                  = 2^20                                  
&apos;  Max number of rows in a sheet
+
+Private Const CALCREFERENCE            = &quot;SF_CalcReference&quot;  &apos;  
Object type of _Address
+
+REM ===================================================== 
CONSTRUCTOR/DESCTRUCTOR
+
+REM 
-----------------------------------------------------------------------------
+Private Sub Class_Initialize()
+       Set [Me] = Nothing
+       Set [_Parent] = Nothing
+       Set [_Super] = Nothing
+       ObjectType = &quot;CALC&quot;
+       ServiceName = &quot;SFDocuments.Calc&quot;
+       Set _Component = Nothing
+End Sub                &apos;  SFDocuments.SF_Calc Constructor
+
+REM 
-----------------------------------------------------------------------------
+Private Sub Class_Terminate()
+       Call Class_Initialize()
+End Sub                &apos;  SFDocuments.SF_Calc Destructor
+
+REM 
-----------------------------------------------------------------------------
+Public Function Dispose() As Variant
+       If Not IsNull([_Super]) Then Set [_Super] = [_Super].Dispose()
+       Call Class_Terminate()
+       Set Dispose = Nothing
+End Function   &apos;  SFDocuments.SF_Calc Explicit Destructor
+
+REM ================================================================== 
PROPERTIES
+
+REM 
-----------------------------------------------------------------------------
+Property Get CurrentSelection() As Variant
+&apos;&apos;&apos;     Returns as a string the currently selected range or as 
an array the list of the currently selected ranges
+       CurrentSelection = _PropertyGet(&quot;CurrentSelection&quot;)
+End Property   &apos;  SFDocuments.SF_Calc.CurrentSelection (get)
+
+REM 
-----------------------------------------------------------------------------
+Property Let CurrentSelection(Optional ByVal pvSelection As Variant)
+&apos;&apos;&apos;     Set the selection to a single or a multiple range
+&apos;&apos;&apos;     The argument is a string or an array of strings
+
+Dim sRange As String                   &apos;  A single selection
+Dim oCellRanges        As Object               &apos;  
com.sun.star.sheet.SheetCellRanges
+Dim vRangeAddresses As Variant &apos;  Array of 
com.sun.star.table.CellRangeAddress
+Dim i As Long
+Const cstThisSub = &quot;SFDocuments.Calc.setCurrentSelection&quot;
+Const cstSubArgs = &quot;Selection&quot;
+
+       On Local Error GoTo Catch
+
+Check:
+       If ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
+               If Not [_Super]._IsStillAlive(True) Then GoTo Finally
+               If IsArray(pvSelection) Then
+                       If Not ScriptForge.SF_Utils._ValidateArray(pvSelection, 
&quot;pvSelection&quot;, 1, V_STRING, True)  Then GoTo Finally
+               Else
+                       If Not ScriptForge.SF_Utils._Validate(pvSelection, 
&quot;pvSelection&quot;, V_STRING) Then GoTo Finally
+               End If
+       End If
+
+Try:
+       If IsArray(pvSelection) Then
+               Set oCellRanges = 
_Component.createInstance(&quot;com.sun.star.sheet.SheetCellRanges&quot;)
+               vRangeAddresses = Array()
+               ReDim vRangeAddresses(0 To UBound(pvSelection))
+               For i = 0 To UBound(pvSelection)
+                       vRangeAddresses(i) = 
Range(pvSelection(i)).XCellRange.RangeAddress
+               Next i
+               oCellRanges.addRangeAddresses(vRangeAddresses, False)
+               _Component.CurrentController.select(oCellRanges)
+       Else
+               
_Component.CurrentController.select(_ParseAddress(pvSelection).XCellRange)
+       End If
+
+Finally:
+       ScriptForge.SF_Utils._ExitFunction(cstThisSub)
+       Exit Property
+Catch:
+       GoTo Finally
+End Property   &apos;  SFDocuments.SF_Calc.CurrentSelection (let)
+
+REM 
-----------------------------------------------------------------------------
+Property Get Height(Optional ByVal RangeName As Variant) As Long
+&apos;&apos;&apos;     Returns the height in # of rows of the given range
+       Height = _PropertyGet(&quot;Height&quot;, RangeName)
+End Property   &apos;  SFDocuments.SF_Calc.Height
+
+REM 
-----------------------------------------------------------------------------
+Property Get LastCell(Optional ByVal SheetName As Variant) As String
+&apos;&apos;&apos;     Returns the last used cell in a given sheet
+       LastCell = _PropertyGet(&quot;LastCell&quot;, SheetName)
+End Property   &apos;  SFDocuments.SF_Calc.LastCell
+
+REM 
-----------------------------------------------------------------------------
+Property Get LastColumn(Optional ByVal SheetName As Variant) As Long
+&apos;&apos;&apos;     Returns the last used column in a given sheet
+       LastColumn = _PropertyGet(&quot;LastColumn&quot;, SheetName)
+End Property   &apos;  SFDocuments.SF_Calc.LastColumn
+
+REM 
-----------------------------------------------------------------------------
+Property Get LastRow(Optional ByVal SheetName As Variant) As Long
+&apos;&apos;&apos;     Returns the last used column in a given sheet
+       LastRow = _PropertyGet(&quot;LastRow&quot;, SheetName)
+End Property   &apos;  SFDocuments.SF_Calc.LastRow
+
+REM 
-----------------------------------------------------------------------------
+Property Get Range(Optional ByVal RangeName As Variant) As Variant
+&apos;&apos;&apos;     Returns a (internal) range object
+       Range = _PropertyGet(&quot;Range&quot;, RangeName)
+End Property   &apos;  SFDocuments.SF_Calc.Range
+
+REM 
-----------------------------------------------------------------------------
+Property Get Sheet(Optional ByVal SheetName As Variant) As Variant
+&apos;&apos;&apos;     Returns a (internal) sheet object
+       Sheet = _PropertyGet(&quot;Sheet&quot;, SheetName)
+End Property   &apos;  SFDocuments.SF_Calc.Sheet
+
+REM 
-----------------------------------------------------------------------------
+Property Get Sheets() As Variant
+&apos;&apos;&apos;     Returns an array listing the existing sheet names
+       Sheets = _PropertyGet(&quot;Sheets&quot;)
+End Property   &apos;  SFDocuments.SF_Calc.Sheets
+
+REM 
-----------------------------------------------------------------------------
+Property Get Width(Optional ByVal RangeName As Variant) As Long
+&apos;&apos;&apos;     Returns the width in # of columns of the given range
+       Width = _PropertyGet(&quot;Width&quot;, RangeName)
+End Property   &apos;  SFDocuments.SF_Calc.Width
+
+REM 
-----------------------------------------------------------------------------
+Property Get XCellRange(Optional ByVal RangeName As Variant) As Variant
+&apos;&apos;&apos;     Returns a UNO object of type 
com.sun.star.Table.CellRange
+       XCellRange = _PropertyGet(&quot;XCellRange&quot;, RangeName)
+End Property   &apos;  SFDocuments.SF_Calc.XCellRange
+
+REM 
-----------------------------------------------------------------------------
+Property Get XSpreadsheet(Optional ByVal SheetName As Variant) As Variant
+&apos;&apos;&apos;     Returns a UNO object of type 
com.sun.star.sheet.XSpreadsheet
+       XSpreadsheet = _PropertyGet(&quot;XSpreadsheet&quot;, SheetName)
+End Property   &apos;  SFDocuments.SF_Calc.XSpreadsheet
+
+REM ===================================================================== 
METHODS
+
+REM 
-----------------------------------------------------------------------------
+Public Function Activate(Optional ByVal SheetName As Variant) As Boolean
+&apos;&apos;&apos; Make the current document or the given sheet active
+&apos;&apos;&apos;     Args:
+&apos;&apos;&apos;             SheetName: Default = the Calc document as a 
whole
+&apos;&apos;&apos;     Returns:
+&apos;&apos;&apos;             True if the document or the sheet could be made 
active
+&apos;&apos;&apos;             Otherwise, there is no change in the actual 
user interface
+&apos;&apos;&apos;     Examples:
+&apos;&apos;&apos;             oDoc.Activate(&quot;SheetX&quot;)
+
+Dim bActive As Boolean                         &apos;  Return value
+Dim oSheet As Object                           &apos;  Reference to sheet
+Const cstThisSub = &quot;SFDocuments.Calc.Activate&quot;
+Const cstSubArgs = &quot;[SheetName]&quot;
+
+       If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
+       bActive = False
+
+Check:
+       If IsMissing(SheetName) Or IsEmpty(SheetName) Then SheetName = 
&quot;&quot;
+       If ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
+               If Not [_Super]._IsStillAlive() Then GoTo Finally
+               If Not _ValidateSheet(SheetName, &quot;SheetName&quot;, , , 
True) Then GoTo Finally
+       End If
+
+Try:
+       &apos;  Sheet activation, to do only when meaningful, precedes document 
activation
+       If Len(SheetName) &gt; 0 Then
+               With _Component
+                       Set oSheet = .getSheets.getByName(SheetName)
+                       Set .CurrentController.ActiveSheet = oSheet
+               End With
+       End If
+       bActive = [_Super].Activate()
+
+Finally:
+       Activate = bActive
+       ScriptForge.SF_Utils._ExitFunction(cstThisSub)
+       Exit Function
+Catch:
+       GoTo Finally
+End Function    &apos;   SFDocuments.SF_Calc.Activate
+
+REM 
-----------------------------------------------------------------------------
+Public Sub ClearAll(Optional ByVal Range As Variant) As String
+&apos;&apos;&apos;     Clear entirely the given range
+&apos;&apos;&apos;     Args:
+&apos;&apos;&apos;             Range : the cell or the range as a string that 
should be cleared
+&apos;&apos;&apos;     Examples:
+&apos;&apos;&apos;             oDoc.ClearAll(&quot;SheetX&quot;)               
&apos; Clears the used area of the sheet
+
+Dim lClear As Long                             &apos;  The elements to clear
+Dim oRange As Object                   &apos;  Alias of Range
+Const cstThisSub = &quot;SFDocuments.Calc.ClearAll&quot;
+Const cstSubArgs = &quot;Range&quot;
+
+       If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
+
+Check:
+       If ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
+               If Not [_Super]._IsStillAlive() Then GoTo Finally
+               If Not ScriptForge.SF_Utils._Validate(Range, &quot;Range&quot;, 
V_STRING) Then GoTo Finally
+       End If
+
+Try:
+       With com.sun.star.sheet.CellFlags
+               lClear = 0 _
+                                       + .VALUE _
+                                       + .DATETIME _
+                                       + .STRING _
+                                       + .ANNOTATION _
+                                       + .FORMULA _
+                                       + .HARDATTR _
+                                       + .STYLES _
+                                       + .OBJECTS _
+                                       + .EDITATTR _
+                                       + .FORMATTED
+               Set oRange = _ParseAddress(Range)
+               oRange.XCellRange.clearContents(lClear)
+       End With
+
+Finally:
+       ScriptForge.SF_Utils._ExitFunction(cstThisSub)
+       Exit Sub
+Catch:
+       GoTo Finally
+End Sub        &apos;  SF_Documents.SF_Calc.ClearAll
+
+REM 
-----------------------------------------------------------------------------
+Public Sub ClearFormats(Optional ByVal Range As Variant) As String
+&apos;&apos;&apos;     Clear all the formatting elements of the given range
+&apos;&apos;&apos;     Args:
+&apos;&apos;&apos;             Range : the cell or the range as a string that 
should be cleared
+&apos;&apos;&apos;     Examples:
+&apos;&apos;&apos;             oDoc.ClearFormats(&quot;SheetX:A1:E100&quot;)   
        &apos; Clear the formats of the given range
+
+Dim lClear As Long                             &apos;  The elements to clear
+Dim oRange As Object                   &apos;  Alias of Range
+Const cstThisSub = &quot;SFDocuments.Calc.ClearFormats&quot;
+Const cstSubArgs = &quot;Range&quot;
+
+       If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
+
+Check:
+       If ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
+               If Not [_Super]._IsStillAlive() Then GoTo Finally
+               If Not ScriptForge.SF_Utils._Validate(Range, &quot;Range&quot;, 
V_STRING) Then GoTo Finally
+       End If
+
+Try:
+       With com.sun.star.sheet.CellFlags
+               lClear = 0 _
+                                       + .HARDATTR _
+                                       + .STYLES _
+                                       + .EDITATTR _
+                                       + .FORMATTED
+               Set oRange = _ParseAddress(Range)
+               oRange.XCellRange.clearContents(lClear)
+       End With
+
+Finally:
+       ScriptForge.SF_Utils._ExitFunction(cstThisSub)
+       Exit Sub
+Catch:
+       GoTo Finally
+End Sub        &apos;  SF_Documents.SF_Calc.ClearFormats
+
+REM 
-----------------------------------------------------------------------------
+Public Sub ClearValues(Optional ByVal Range As Variant) As String
+&apos;&apos;&apos;     Clear values and formulas in the given range
+&apos;&apos;&apos;     Args:
+&apos;&apos;&apos;             Range : the cell or the range as a string that 
should be cleared
+&apos;&apos;&apos;     Examples:
+&apos;&apos;&apos;             oDoc.ClearValues(&quot;SheetX:*&quot;)          
&apos; Clears the used area of the sheet
+
+Dim lClear As Long                             &apos;  The elements to clear
+Dim oRange As Object                   &apos;  Alias of Range
+Const cstThisSub = &quot;SFDocuments.Calc.ClearValues&quot;
+Const cstSubArgs = &quot;Range&quot;
+
+       If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
+
+Check:
+       If ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
+               If Not [_Super]._IsStillAlive() Then GoTo Finally
+               If Not ScriptForge.SF_Utils._Validate(Range, &quot;Range&quot;, 
V_STRING) Then GoTo Finally
+       End If
+
+Try:
+       With com.sun.star.sheet.CellFlags
+               lClear = 0 _
+                                       + .VALUE _
+                                       + .DATETIME _
+                                       + .STRING _
+                                       + .FORMULA
+               Set oRange = _ParseAddress(Range)
+               oRange.XCellRange.clearContents(lClear)
+       End With
+
+Finally:
+       ScriptForge.SF_Utils._ExitFunction(cstThisSub)
+       Exit Sub
+Catch:
+       GoTo Finally
+End Sub        &apos;  SF_Documents.SF_Calc.ClearValues
+
+REM 
-----------------------------------------------------------------------------
+Public Function CopySheet(Optional ByVal SheetName As Variant _
+                                                               , Optional 
ByVal NewName As Variant _
+                                                               , Optional 
ByVal BeforeSheet As Variant _
+                                                               ) As Boolean
+&apos;&apos;&apos; Copy a specified sheet before an existing sheet or at the 
end of the list of sheets
+&apos;&apos;&apos;     The sheet to copy may be inside any open Calc document
+&apos;&apos;&apos;     Args:
+&apos;&apos;&apos;             SheetName: The name of the sheet to copy or its 
reference
+&apos;&apos;&apos;             NewName: Must not exist
+&apos;&apos;&apos;             BeforeSheet: The name (string) or index 
(numeric, starting from 1) of the sheet before which to insert
+&apos;&apos;&apos;     Returns:
+&apos;&apos;&apos;             True if the sheet could be copied successfully
+&apos;&apos;&apos;     Exceptions:
+&apos;&apos;&apos;             DUPLICATESHEETERROR             A sheet with 
the given name exists already
+&apos;&apos;&apos;     Examples:
+&apos;&apos;&apos;             oDoc.CopySheet(&quot;SheetX&quot;, 
&quot;SheetY&quot;)
+&apos;&apos;&apos;                     &apos;  Copy within the same document
+&apos;&apos;&apos;             Dim oDocA As Object             :       Set 
oDocA = ui.OpenDocument(&quot;C:\Temp\FileA.ods&quot;, Hidden := True, ReadOnly 
:= True)
+&apos;&apos;&apos;             Dim oDocB As Object             :       Set 
oDocB = ui.OpenDocument(&quot;C:\Temp\FileB.ods&quot;)
+&apos;&apos;&apos;             
oDocB.CopySheet(oDocA.Sheet(&quot;SheetX&quot;), &quot;SheetY&quot;)
+&apos;&apos;&apos;                     &apos;  Copy from 1 file to another and 
put the new sheet at the end
+
+Dim bCopy As Boolean                           &apos;  Return value
+Dim oSheets As Object                          &apos;  
com.sun.star.sheet.XSpreadsheets
+Dim vSheets As Variant                         &apos;  List of existing sheets
+Dim lSheetIndex As Long                                &apos;  Index of a sheet
+Dim oSheet As Object                           &apos;  Alias of SheetName as 
reference
+Dim lRandom As Long                                    &apos;  Output of 
random number generator
+Dim sRandom                                                    &apos;  Random 
sheet name
+Const cstThisSub = &quot;SFDocuments.Calc.CopySheet&quot;
+Const cstSubArgs = &quot;SheetName, NewName, 
[BeforeSheet=&quot;&quot;&quot;&quot;]&quot;
+
+       If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
+       bCopy = False
+
+Check:
+       If IsMissing(BeforeSheet) Or IsEmpty(BeforeSheet) Then BeforeSheet = 
32768
+       If ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
+               If Not [_Super]._IsStillAlive(True) Then GoTo Finally
+               If Not _ValidateSheet(SheetName, &quot;SheetName&quot;, , True, 
, , True) Then GoTo Finally
+               If Not _ValidateSheet(NewName, &quot;NewName&quot;, True) Then 
GoTo Finally
+               If Not _ValidateSheet(BeforeSheet, &quot;BeforeSheet&quot;, , 
True, , True) Then GoTo Finally
+       End If
+
+Try:
+       &apos;  Determine the index of the sheet before which to insert the copy
+       Set oSheets = _Component.getSheets
+       vSheets = oSheets.getElementNames()
+       If VarType(BeforeSheet) = V_STRING Then
+               lSheetIndex = ScriptForge.SF_Array.IndexOf(vSheets, BeforeSheet)
+       Else
+               lSheetIndex = BeforeSheet - 1
+               If lSheetIndex &lt; 0 Then lSheetIndex = 0
+               If lSheetIndex &gt; UBound(vSheets) Then lSheetIndex = 
UBound(vSheets) + 1
+       End If
+
+       &apos;  Copy sheet inside the same document OR import from another 
document
+       If VarType(SheetName) = V_STRING Then
+               _Component.getSheets.copyByName(SheetName, NewName, lSheetIndex)
+       Else
+               Set oSheet = SheetName
+               With oSheet
+                       &apos;  If a sheet with same name as input exists in 
the target sheet, rename it first with a random name
+                       sRandom = &quot;&quot;
+                       If ScriptForge.SF_Array.Contains(vSheets, .SheetName) 
Then
+                               lRandom = 
ScriptForge.SF_Session.ExecuteCalcFunction(&quot;RANDBETWEEN&quot;, 1, 9999999)
+                               sRandom = &quot;SF_&quot; &amp; 
Right(&quot;0000000&quot; &amp; lRandom, 7)
+                               oSheets.getByName(.SheetName).setName(sRandom)
+                       End If
+                       &apos;  Import i.o. Copy
+                       oSheets.importSheet(oSheet.Component, .SheetName, 
lSheetIndex)
+                       &apos;  Rename to new sheet name
+                       oSheets.getByName(.SheetName).setName(NewName)
+                       &apos;  Reset random name
+                       If Len(sRandom) &gt; 0 Then 
oSheets.getByName(srandom).setName(.SheetName)
+               End With
+       End If
+       bCopy = True
+
+Finally:
+       CopySheet = bCopy
+       ScriptForge.SF_Utils._ExitFunction(cstThisSub)
+       Exit Function
+Catch:
+       GoTo Finally
+CatchDuplicate:
+       ScriptForge.SF_Exception.RaiseFatal(DUPLICATESHEETERROR, 
&quot;NewName&quot;, NewName, &quot;Document&quot;, [_Super]._FileIdent())
+       GoTo Finally
+End Function    &apos;   SFDocuments.SF_Calc.CopySheet
+
+REM 
-----------------------------------------------------------------------------
+Public Function CopySheetFromFile(Optional ByVal FileName As Variant _
+                                                               , Optional 
ByVal SheetName As Variant _
+                                                               , Optional 
ByVal NewName As Variant _
+                                                               , Optional 
ByVal BeforeSheet As Variant _
+                                                               ) As Boolean
+&apos;&apos;&apos; Copy a specified sheet before an existing sheet or at the 
end of the list of sheets
+&apos;&apos;&apos;     The sheet to copy is located inside any closed Calc 
document
+&apos;&apos;&apos;     Args:
+&apos;&apos;&apos;             FileName: Identifies the file to open. It must 
follow the SF_FileSystem.FileNaming notation
+&apos;&apos;&apos;                     The file must not be protected with a 
password
+&apos;&apos;&apos;             SheetName: The name of the sheet to copy or its 
reference
+&apos;&apos;&apos;             NewName: Must not exist
+&apos;&apos;&apos;             BeforeSheet: The name (string) or index 
(numeric, starting from 1) of the sheet before which to insert
+&apos;&apos;&apos;     Returns:
+&apos;&apos;&apos;             True if the sheet could be created
+&apos;&apos;&apos;             The created sheet is blank when the input file 
is not a Calc file
+&apos;&apos;&apos;             The created sheet contains an error message 
when the input sheet was not found
+&apos;&apos;&apos;     Exceptions:
+&apos;&apos;&apos;             DUPLICATESHEETERROR             A sheet with 
the given name exists already
+&apos;&apos;&apos;             UNKNOWNFILEERROR                The input file 
is unknown
+&apos;&apos;&apos;     Examples:
+&apos;&apos;&apos;             
oDoc.CopySheetFromFile(&quot;C:\MyFile.ods&quot;, &quot;SheetX&quot;, 
&quot;SheetY&quot;, 3)
+
+Dim bCopy As Boolean                           &apos;  Return value
+Dim oSheet As Object                           &apos;  
com.sun.star.sheet.XSpreadsheet
+Dim sFileName As String                                &apos;  URL alias of 
FileName
+Dim FSO As Object                                      &apos;  SF_FileSystem
+Const cstThisSub = &quot;SFDocuments.Calc.CopySheetFromFile&quot;
+Const cstSubArgs = &quot;FileName, SheetName, NewName, 
[BeforeSheet=&quot;&quot;&quot;&quot;]&quot;
+
+       If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
+       bCopy = False
+
+Check:
+       If IsMissing(BeforeSheet) Or IsEmpty(BeforeSheet) Then BeforeSheet = 
32768
+       If ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
+               If Not [_Super]._IsStillAlive(True) Then GoTo Finally
+               If Not ScriptForge.SF_Utils._ValidateFile(FileName, 
&quot;FileName&quot;) Then GoTo Finally
+               If Not ScriptForge.SF_Utils._Validate(SheetName, 
&quot;SheetName&quot;, V_STRING) Then GoTo Finally
+               If Not _ValidateSheet(NewName, &quot;NewName&quot;, True) Then 
GoTo Finally
+               If Not _ValidateSheet(BeforeSheet, &quot;BeforeSheet&quot;, , 
True, , True) Then GoTo Finally
+       End If
+
+Try:
+       Set FSO = ScriptForge.SF_FileSystem
+       &apos;  Does the input file exist ?
+       If Not FSO.FileExists(FileName) Then GoTo CatchNotExists
+       sFileName = FSO._ConvertToUrl(FileName)
+
+       &apos;  Insert a blank new sheet and import sheet from file va link 
setting and deletion
+       If Not InsertSheet(Newname, BeforeSheet) Then GoTo Finally
+       Set oSheet = _Component.getSheets.getByName(NewName)
+       With oSheet
+               .link(sFileName,SheetName, &quot;&quot;, &quot;&quot;, 
com.sun.star.sheet.SheetLinkMode.NORMAL)
+               .LinkMode = com.sun.star.sheet.SheetLinkMode.NONE
+       .LinkURL = &quot;&quot;
+       End With
+       bCopy = True
+
+Finally:
+       CopySheetFromFile = bCopy
+       ScriptForge.SF_Utils._ExitFunction(cstThisSub)
+       Exit Function
+Catch:
+       GoTo Finally
+CatchNotExists:
+       ScriptForge.SF_Exception.RaiseFatal(UNKNOWNFILEERROR, 
&quot;FileName&quot;, FileName)
+       GoTo Finally
+End Function    &apos;   SFDocuments.SF_Calc.CopySheetFromFile
+
+REM 
-----------------------------------------------------------------------------
+Public Function CopyToCell(Optional ByVal SourceRange As Variant _
+                                                               , Optional 
ByVal DestinationCell As Variant _
+                                                               ) As String
+&apos;&apos;&apos; Copy a specified source range to a destination range or cell
+&apos;&apos;&apos;     The source range may belong to another open document
+&apos;&apos;&apos;     The method imitates the behaviour of a Copy/Paste from 
a range to a single cell
+&apos;&apos;&apos;     Args:
+&apos;&apos;&apos;             SourceRange: the source range as a string if it 
belongs to the same document
+&apos;&apos;&apos;                     or as a reference if it belongs to 
another open Calc document
+&apos;&apos;&apos;             DestinationCell: the destination of the copied 
range of cells, as a string
+&apos;&apos;&apos;                     If given as range, the destination will 
be reduced to its top-left cell
+&apos;&apos;&apos;     Returns:
+&apos;&apos;&apos;             A string representing the modified range of 
cells
+&apos;&apos;&apos;             The modified area depends only on the size of 
the source area
+&apos;&apos;&apos;     Examples:
+&apos;&apos;&apos;             oDoc.CopyToCell(&quot;SheetX.A1:F10&quot;, 
&quot;SheetY.C5&quot;)
+&apos;&apos;&apos;                     &apos;  Copy within the same document
+&apos;&apos;&apos;             Dim oDocA As Object             :       Set 
oDocA = ui.OpenDocument(&quot;C:\Temp\FileA.ods&quot;, Hidden := True, ReadOnly 
:= True)
+&apos;&apos;&apos;             Dim oDocB As Object             :       Set 
oDocB = ui.OpenDocument(&quot;C:\Temp\FileB.ods&quot;)
+&apos;&apos;&apos;             
oDocB.CopyToCell(oDocA.Range(&quot;SheetX.A1:F10&quot;), &quot;SheetY.C5&quot;)
+&apos;&apos;&apos;                     &apos;  Copy from 1 file to another
+
+Dim sCopy As String                            &apos;  Return value
+Dim oSource As Object                  &apos;  Alias of SourceRange to avoid 
&quot;Object variable not set&quot; run-time error
+Dim oSourceAddress As Object   &apos;  com.sun.star.table.CellRangeAddress
+Dim oDestRange As Object               &apos;  Destination as a range
+Dim oDestAddress As Object             &apos;  
com.sun.star.table.CellRangeAddress
+Dim oDestCell As Object                        &apos;  
com.sun.star.table.CellAddress
+Dim oSelect As Object                  &apos;  Current selection in source
+Dim oClipboard As Object               &apos;  
com.sun.star.datatransfer.XTransferable
+
+Const cstThisSub = &quot;SFDocuments.Calc.CopyToCell&quot;
+Const cstSubArgs = &quot;SourceRange, DestinationCell&quot;
+
+       If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
+       sCopy = &quot;&quot;
+
+Check:
+       If ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
+               If Not [_Super]._IsStillAlive(True) Then GoTo Finally
+               If Not ScriptForge.SF_Utils._Validate(SourceRange, 
&quot;SourceRange&quot;, Array(V_STRING, ScriptForge.V_OBJECT), , , 
CALCREFERENCE) Then GoTo Finally
+               If Not ScriptForge.SF_Utils._Validate(DestinationCell, 
&quot;DestinationCell&quot;, V_STRING) Then GoTo Finally
+       End If
+
+Try:
+       If VarType(SourceRange) = V_STRING Then         &apos;  Same document - 
Use UNO copyRange method
+               Set oSourceAddress = 
_ParseAddress(SourceRange).XCellRange.RangeAddress
+               Set oDestRange = _ParseAddress(DestinationCell)
+               Set oDestAddress = oDestRange.XCellRange.RangeAddress
+               Set oDestCell = New com.sun.star.table.CellAddress
+               With oDestAddress
+                       oDestCell.Sheet = .Sheet
+                       oDestCell.Column = .StartColumn
+                       oDestCell.Row = .StartRow
+               End With
+               oDestRange.XSpreadsheet.copyRange(oDestCell, oSourceAddress)
+       Else                    &apos;  Use clipboard to copy - current 
selection in Source should be preserved
+               Set oSource = SourceRange
+               With oSource
+                       &apos;  Keep current selection in source document
+                       Set oSelect = 
.Component.CurrentController.getSelection()
+                       &apos;  Select, copy the source range and paste in the 
top-left cell of the destination
+                       .Component.CurrentController.select(.XCellRange)
+                       Set oClipboard = 
.Component.CurrentController.getTransferable()
+                       
_Component.CurrentController.select(_Offset(DestinationCell, 0, 0, 1, 
1).XCellRange)
+                       
_Component.CurrentController.insertTransferable(oClipBoard)
+                       &apos;  Restore previous selection in Source
+                       _RestoreSelections(.Component, oSelect)
+                       Set oSourceAddress = .XCellRange.RangeAddress
+               End With
+       End If
+
+       With oSourceAddress
+               sCopy = _Offset(DestinationCell, 0, 0, .EndRow - .StartRow + 1, 
.EndColumn - .StartColumn + 1).RangeName
+       End With
+
+Finally:
+       CopyToCell = sCopy
+       ScriptForge.SF_Utils._ExitFunction(cstThisSub)
+       Exit Function
+Catch:
+       GoTo Finally
+End Function    &apos;   SFDocuments.SF_Calc.CopyToCell
+
+REM 
-----------------------------------------------------------------------------
+Public Function CopyToRange(Optional ByVal SourceRange As Variant _
+                                                               , Optional 
ByVal DestinationRange As Variant _
+                                                               ) As String
+&apos;&apos;&apos; Copy downwards and/or rightwards a specified source range 
to a destination range
+&apos;&apos;&apos;     The source range may belong to another open document
+&apos;&apos;&apos;     The method imitates the behaviour of a Copy/Paste from 
a range to a larger range
+&apos;&apos;&apos;             If the height (resp. width) of the destination 
area is &gt; 1 row (resp. column)
+&apos;&apos;&apos;             then the height (resp. width) of the source 
must be &lt;= the height (resp. width)
+&apos;&apos;&apos;             of the destination. Otherwise nothing happens
+&apos;&apos;&apos;             If the height (resp.width) of the destination 
is = 1 then the destination
+&apos;&apos;&apos;             is expanded downwards (resp. rightwards) up to 
the height (resp. width)
+&apos;&apos;&apos;             of the source range
+&apos;&apos;&apos;     Args:
+&apos;&apos;&apos;             SourceRange: the source range as a string if it 
belongs to the same document
+&apos;&apos;&apos;                     or as a reference if it belongs to 
another open Calc document
+&apos;&apos;&apos;             DestinationRange: the destination of the copied 
range of cells, as a string
+&apos;&apos;&apos;     Returns:
+&apos;&apos;&apos;             A string representing the modified range of 
cells
+&apos;&apos;&apos;     Examples:
+&apos;&apos;&apos;             oDoc.CopyToRange(&quot;SheetX.A1:F10&quot;, 
&quot;SheetY.C5:J5&quot;)
+&apos;&apos;&apos;                     &apos;  Copy within the same document
+&apos;&apos;&apos;                     &apos;  Returned range: 
$SheetY.$C$5:$J$14
+&apos;&apos;&apos;             Dim oDocA As Object             :       Set 
oDocA = ui.OpenDocument(&quot;C:\Temp\FileA.ods&quot;, Hidden := True, ReadOnly 
:= True)
+&apos;&apos;&apos;             Dim oDocB As Object             :       Set 
oDocB = ui.OpenDocument(&quot;C:\Temp\FileB.ods&quot;)
+&apos;&apos;&apos;             
oDocB.CopyToRange(oDocA.Range(&quot;SheetX.A1:F10&quot;), 
&quot;SheetY.C5:J5&quot;)
+&apos;&apos;&apos;                     &apos;  Copy from 1 file to another
+
+Dim sCopy As String                            &apos;  Return value
+Dim oSource As Object                  &apos;  Alias of SourceRange to avoid 
&quot;Object variable not set&quot; run-time error
+Dim oDestRange As Object               &apos;  Destination as a range
+Dim oDestCell As Object                        &apos;  
com.sun.star.table.CellAddress
+Dim oSelect As Object                  &apos;  Current selection in source
+Dim oClipboard As Object               &apos;  
com.sun.star.datatransfer.XTransferable
+Dim bSameDocument As Boolean   &apos;  True when source in same document as 
destination
+Dim lHeight As Long                            &apos;  Height of destination
+Dim lWidth As Long                             &apos;  Width of destination
+
+Const cstThisSub = &quot;SFDocuments.Calc.CopyToRange&quot;
+Const cstSubArgs = &quot;SourceRange, DestinationRange&quot;
+
+       If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
+       sCopy = &quot;&quot;
+
+Check:
+       If ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
+               If Not [_Super]._IsStillAlive(True) Then GoTo Finally
+               If Not ScriptForge.SF_Utils._Validate(SourceRange, 
&quot;SourceRange&quot;, Array(V_STRING, ScriptForge.V_OBJECT), , , 
CALCREFERENCE) Then GoTo Finally
+               If Not ScriptForge.SF_Utils._Validate(DestinationRange, 
&quot;DestinationRange&quot;, V_STRING) Then GoTo Finally
+       End If
+
+Try:
+       &apos;  Copy done via clipboard
+
+       &apos;  Check Height/Width destination = 1 or &gt; Height/Width of 
source
+       bSameDocument = ( VarType(SourceRange) = V_STRING )
+       If bSameDocument Then Set oSource = _ParseAddress(SourceRange) Else Set 
oSource = SourceRange
+       Set oDestRange = _ParseAddress(DestinationRange)
+       With oDestRange
+               lHeight = .Height
+               lWidth = .Width
+               If lHeight = 1 Then
+                       lHeight = oSource.Height                &apos;  Future 
height
+               ElseIf lHeight &lt; oSource.Height Then
+                       GoTo Finally
+               End If
+               If lWidth = 1 Then
+                       lWidth = oSource.Width  &apos;  Future width
+               ElseIf lWidth &lt; oSource.Width Then
+                       GoTo Finally
+               End If
+       End With
+
+       With oSource
+               &apos;  Store actual selection in source
+               Set oSelect = .Component.CurrentController.getSelection()
+               &apos;  Select, copy the source range and paste in the 
destination
+               .Component.CurrentController.select(.XCellRange)
+               Set oClipboard = .Component.CurrentController.getTransferable()
+               _Component.CurrentController.select(oDestRange.XCellRange)
+               _Component.CurrentController.insertTransferable(oClipBoard)
+               &apos;  Restore selection in source
+               _RestoreSelections(.Component, oSelect)
+       End With
+       
+       sCopy = _Offset(oDestRange, 0, 0, lHeight, lWidth).RangeName
+
+Finally:
+       CopyToRange = sCopy
+       ScriptForge.SF_Utils._ExitFunction(cstThisSub)
+       Exit Function
+Catch:
+       GoTo Finally
+End Function    &apos;   SFDocuments.SF_Calc.CopyToRange
+
+REM 
-----------------------------------------------------------------------------
+Public Function DAvg(Optional ByVal Range As Variant) As Double
+&apos;&apos;&apos;     Get the average of the numeric values stored in the 
given range
+&apos;&apos;&apos;     Args:
+&apos;&apos;&apos;             Range : the range as a string where to get the 
values from
+&apos;&apos;&apos;     Returns:
+&apos;&apos;&apos;             The average of the numeric values as a double
+&apos;&apos;&apos;     Examples:
+&apos;&apos;&apos;             Val = oDoc.DAvg(&quot;~.A1:A1000&quot;)
+
+Try:
+       DAvg = _DFunction(&quot;DAvg&quot;, Range)
+
+Finally:
+       Exit Function
+End Function   &apos;  SF_Documents.SF_Calc.DAvg
+
+REM 
-----------------------------------------------------------------------------
+Public Function DCount(Optional ByVal Range As Variant) As Long
+&apos;&apos;&apos;     Get the number of numeric values stored in the given 
range
+&apos;&apos;&apos;     Args:
+&apos;&apos;&apos;             Range : the range as a string where to get the 
values from
+&apos;&apos;&apos;     Returns:
+&apos;&apos;&apos;             The number of numeric values a Long
+&apos;&apos;&apos;     Examples:
+&apos;&apos;&apos;             Val = oDoc.DCount(&quot;~.A1:A1000&quot;)
+
+Try:
+       DCount = _DFunction(&quot;DCount&quot;, Range)
+
+Finally:
+       Exit Function
+End Function   &apos;  SF_Documents.SF_Calc.DCount
+
+REM 
-----------------------------------------------------------------------------
+Public Function DMax(Optional ByVal Range As Variant) As Double
+&apos;&apos;&apos;     Get the greatest of the numeric values stored in the 
given range
+&apos;&apos;&apos;     Args:
+&apos;&apos;&apos;             Range : the range as a string where to get the 
values from
+&apos;&apos;&apos;     Returns:
+&apos;&apos;&apos;             The greatest of the numeric values as a double
+&apos;&apos;&apos;     Examples:
+&apos;&apos;&apos;             Val = oDoc.DMax(&quot;~.A1:A1000&quot;)
+
+Try:
+       DMax = _DFunction(&quot;DMax&quot;, Range)
+
+Finally:
+       Exit Function
+End Function   &apos;  SF_Documents.SF_Calc.DMax
+
+REM 
-----------------------------------------------------------------------------
+Public Function DMin(Optional ByVal Range As Variant) As Double
+&apos;&apos;&apos;     Get the smallest of the numeric values stored in the 
given range
+&apos;&apos;&apos;     Args:
+&apos;&apos;&apos;             Range : the range as a string where to get the 
values from
+&apos;&apos;&apos;     Returns:
+&apos;&apos;&apos;             The smallest of the numeric values as a double
+&apos;&apos;&apos;     Examples:
+&apos;&apos;&apos;             Val = oDoc.DMin(&quot;~.A1:A1000&quot;)
+
+Try:
+       DMin = _DFunction(&quot;DMin&quot;, Range)
+
+Finally:
+       Exit Function
+End Function   &apos;  SF_Documents.SF_Calc.DMin
+
+REM 
-----------------------------------------------------------------------------
+Public Function DSum(Optional ByVal Range As Variant) As Double
+&apos;&apos;&apos;     Get sum of the numeric values stored in the given range
+&apos;&apos;&apos;     Args:
+&apos;&apos;&apos;             Range : the range as a string where to get the 
values from
+&apos;&apos;&apos;     Returns:
+&apos;&apos;&apos;             The sum of the numeric values as a double
+&apos;&apos;&apos;     Examples:
+&apos;&apos;&apos;             Val = oDoc.DSum(&quot;~.A1:A1000&quot;)
+
+Try:
+       DSum = _DFunction(&quot;DSum&quot;, Range)
+
+Finally:
+       Exit Function
+End Function   &apos;  SF_Documents.SF_Calc.DSum
+
+REM 
-----------------------------------------------------------------------------
+Function GetColumnName(Optional ByVal ColumnNumber As Variant) As String
+&apos;&apos;&apos;     Convert a column number (range 1, 2,..1024) into its 
letter counterpart (range &apos;A&apos;, &apos;B&apos;,..&apos;AMJ&apos;).
+&apos;&apos;&apos;     Args:
+&apos;&apos;&apos;             ColumnNumber: the column number, must be in the 
interval 1 ... 1024
+&apos;&apos;&apos;     Returns:
+&apos;&apos;&apos;             a string representation of the column name, in 
range &apos;A&apos;..&apos;AMJ&apos;
+&apos;&apos;&apos;             If ColumnNumber is not in the allowed range, 
returns a zero-length string
+&apos;&apos;&apos;     Example:
+&apos;&apos;&apos;             MsgBox oDoc.GetColumnName(1022) &apos;  
&quot;AMH&quot;
+&apos;&apos;&apos;     Adapted from a Python function by sundar nataraj 
+&apos;&apos;&apos;     
http://stackoverflow.com/questions/23861680/convert-spreadsheet-number-to-column-letter
+
+Dim sCol As String                     &apos;  Return value
+Const cstThisSub = &quot;SFDocuments.Calc.GetColumnName&quot;
+Const cstSubArgs = &quot;ColumnNumber&quot;
+
+       If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
+       sCol = &quot;&quot;
+
+Check:
+       If ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
+               If Not SF_Utils._Validate(ColumnNumber, 
&quot;ColumnNumber&quot;, V_NUMERIC) Then GoTo Finally
+       End If
+
+Try:
+       If (ColumnNumber &gt; 0) And (ColumnNumber &lt;= MAXCOLS) Then sCol = 
_GetColumnName(ColumnNumber)
+
+Finally:
+       GetColumnName = sCol
+       ScriptForge.SF_Utils._ExitFunction(cstThisSub)
+       Exit Function
+Catch:
+       GoTo Finally
+End Function   &apos;  SFDocuments.SF_Calc.GetColumnName
+
+REM 
-----------------------------------------------------------------------------
+Public Function GetFormula(Optional ByVal Range As Variant) As Variant
+&apos;&apos;&apos;     Get the formula(e) stored in the given range of cells
+&apos;&apos;&apos;     Args:
+&apos;&apos;&apos;             Range : the range as a string where to get the 
formula from
+&apos;&apos;&apos;     Returns:
+&apos;&apos;&apos;             A scalar, a zero-based 1D array or a zero-based 
2D array of strings
+&apos;&apos;&apos;     Examples:
+&apos;&apos;&apos;             Val = oDoc.GetFormula(&quot;~.A1:A1000&quot;)
+
+Dim vGet As Variant                                    &apos;  Return value
+Dim oAddress As Object                         &apos;  Alias of Range
+Dim vDataArray As Variant                      &apos;  DataArray compatible 
with .DataArray UNO property
+Const cstThisSub = &quot;SFDocuments.Calc.GetFormula&quot;
+Const cstSubArgs = &quot;Range&quot;
+
+       If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
+       vGet = Empty
+
+Check:
+       If ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
+               If Not [_Super]._IsStillAlive() Then GoTo Finally
+               If Not ScriptForge.SF_Utils._Validate(Range, &quot;Range&quot;, 
V_STRING) Then GoTo Finally
+       End If
+
+Try:
+       &apos;  Get the data
+       Set oAddress = _ParseAddress(Range)
+       vDataArray = oAddress.XCellRange.getFormulaArray()
+
+       &apos;  Convert the data array to scalar, vector or array
+       vGet = _ConvertFromDataArray(vDataArray)
+
+Finally:
+       GetFormula = vGet
+       ScriptForge.SF_Utils._ExitFunction(cstThisSub)
+       Exit Function
+Catch:
+       GoTo Finally
+End Function   &apos;  SF_Documents.SF_Calc.GetFormula
+
+REM 
-----------------------------------------------------------------------------
+Public Function GetProperty(Optional ByVal PropertyName As Variant _
+                                                               , Optional 
ObjectName As Variant _
+                                                               ) As Variant
+&apos;&apos;&apos;     Return the actual value of the given property
+&apos;&apos;&apos;     Args:
+&apos;&apos;&apos;             PropertyName: the name of the property as a 
string
+&apos;&apos;&apos;             ObjectName: a sheet or range name
+&apos;&apos;&apos;     Returns:
+&apos;&apos;&apos;             The actual value of the property
+&apos;&apos;&apos;     Exceptions:
+&apos;&apos;&apos;             ARGUMENTERROR           The property does not 
exist
+
+Const cstThisSub = &quot;SFDocuments.Calc.GetProperty&quot;
+Const cstSubArgs = &quot;&quot;
+
+       If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
+       GetProperty = Null
+
+Check:
+       If IsMissing(ObjectName) Or IsEMpty(ObjectName) Then ObjectName = 
&quot;&quot;
+       If ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
+               If Not ScriptForge.SF_Utils._Validate(PropertyName, 
&quot;PropertyName&quot;, V_STRING, Properties()) Then GoTo Catch
+               If Not ScriptForge.SF_Utils._Validate(ObjectName, 
&quot;ObjectName&quot;, V_STRING) Then GoTo Catch
+       End If
+
+Try:
+       &apos;  Superclass or subclass property ?
+       If ScriptForge.SF_Array.Contains([_Super].Properties(), PropertyName) 
Then
+               GetProperty = [_Super].GetProperty(PropertyName)
+       Else
+               GetProperty = _PropertyGet(PropertyName)
+       End If
+
+Finally:
+       ScriptForge.SF_Utils._ExitFunction(cstThisSub)
+       Exit Function
+Catch:
+       GoTo Finally
+End Function   &apos;  SFDocuments.SF_Calc.GetProperty
+
+REM 
-----------------------------------------------------------------------------
+Public Function GetValue(Optional ByVal Range As Variant) As Variant
+&apos;&apos;&apos;     Get the value(s) stored in the given range of cells
+&apos;&apos;&apos;     Args:
+&apos;&apos;&apos;             Range : the range as a string where to get the 
value from
+&apos;&apos;&apos;     Returns:
+&apos;&apos;&apos;             A scalar, a zero-based 1D array or a zero-based 
2D array of strings and doubles
+&apos;&apos;&apos;             To convert doubles to dates, use the CDate 
builtin function
+&apos;&apos;&apos;     Examples:
+&apos;&apos;&apos;             Val = oDoc.GetValue(&quot;~.A1:A1000&quot;)
+
+Dim vGet As Variant                                    &apos;  Return value
+Dim oAddress As Object                         &apos;  Alias of Range
+Dim vDataArray As Variant                      &apos;  DataArray compatible 
with .DataArray UNO property
+Const cstThisSub = &quot;SFDocuments.Calc.GetValue&quot;
+Const cstSubArgs = &quot;Range&quot;
+
+       If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
+       vGet = Empty
+
+Check:
+       If ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
+               If Not [_Super]._IsStillAlive() Then GoTo Finally
+               If Not ScriptForge.SF_Utils._Validate(Range, &quot;Range&quot;, 
V_STRING) Then GoTo Finally
+       End If
+
+Try:
+       &apos;  Get the data
+       Set oAddress = _ParseAddress(Range)
+       vDataArray = oAddress.XCellRange.getDataArray()
+
+       &apos;  Convert the data array to scalar, vector or array
+       vGet = _ConvertFromDataArray(vDataArray)
+
+Finally:
+       GetValue = vGet
+       ScriptForge.SF_Utils._ExitFunction(cstThisSub)
+       Exit Function
+Catch:
+       GoTo Finally
+End Function   &apos;  SF_Documents.SF_Calc.GetValue
+
+REM 
-----------------------------------------------------------------------------
+Public Function ImportFromCSVFile(Optional ByVal FileName As Variant _
+                                                               , Optional 
ByVal DestinationCell As Variant _
+                                                               , Optional 
ByVal FilterOptions As Variant _
+                                                               ) As String
+&apos;&apos;&apos; Import the content of a CSV-formatted text file starting 
from a given cell
+&apos;&apos;&apos;     Beforehands the destination area will be cleared from 
any content and format
+&apos;&apos;&apos;     Args:
+&apos;&apos;&apos;             FileName: Identifies the file to open. It must 
follow the SF_FileSystem.FileNaming notation
+&apos;&apos;&apos;             DestinationCell: the destination of the copied 
range of cells, as a string
+&apos;&apos;&apos;                     If given as range, the destination will 
be reduced to its top-left cell
+&apos;&apos;&apos;             FilterOptions: The arguments of the CSV input 
filter.
+&apos;&apos;&apos;                     Read 
https://wiki.openoffice.org/wiki/Documentation/DevGuide/Spreadsheets/Filter_Options#Filter_Options_for_the_CSV_Filter
+&apos;&apos;&apos;                     Default:        input file encoding is 
UTF8
+&apos;&apos;&apos;                                             separator = 
comma, semi-colon or tabulation
+&apos;&apos;&apos;                                             string 
delimiter = double quote
+&apos;&apos;&apos;                                             all lines are 
included
+&apos;&apos;&apos;                                             quoted strings 
are formatted as texts
+&apos;&apos;&apos;                                             special numbers 
are detected
+&apos;&apos;&apos;                                             all columns are 
presumed texts
+&apos;&apos;&apos;                                             language = 
english/US =&gt; decimal separator is &quot;.&quot;, thousands separator = 
&quot;,&quot;
+&apos;&apos;&apos;     Returns:
+&apos;&apos;&apos;             A string representing the modified range of 
cells
+&apos;&apos;&apos;             The modified area depends only on the content 
of the source file
+&apos;&apos;&apos;     Exceptions:
+&apos;&apos;&apos;             DOCUMENTOPENERROR                       The csv 
file could not be opened
+&apos;&apos;&apos;     Examples:
+&apos;&apos;&apos;             
oDoc.ImportFromCSVFile(&quot;C:\Temp\myCsvFile.csv&quot;, &quot;SheetY.C5&quot;)
+
+Dim sImport As String                  &apos;  Return value
+Dim oUI As Object                              &apos;  UI service
+Dim oSource As Object                  &apos;  New Calc document with csv 
loaded
+Dim oSelect As Object                  &apos;  Current selection in destination
+
+Const cstFilter = &quot;Text - txt - csv (StarCalc)&quot;
+Const cstFilterOptions = &quot;9/44/59/MRG,34,76,1,,1033,true,true&quot;
+Const cstThisSub = &quot;SFDocuments.Calc.ImportFromCSVFile&quot;
+Const cstSubArgs = &quot;FileName, DestinationCell, 
[FilterOptions]=&quot;&quot;9/44/59/MRG,34,76,1,,1033,true,true&quot;&quot;&quot;
+
+&apos; If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
+       sImport = &quot;&quot;
+
+Check:
+       If IsMissing(FilterOptions) Or IsEmpty(FilterOptions) Then 
FilterOptions = cstFilterOptions
+       If ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
+               If Not [_Super]._IsStillAlive(True) Then GoTo Finally
+               If Not ScriptForge.SF_Utils._ValidateFile(FileName, 
&quot;FileName&quot;) Then GoTo Finally
+               If Not ScriptForge.SF_Utils._Validate(DestinationCell, 
&quot;DestinationCell&quot;, V_STRING) Then GoTo Finally
+       End If
+
+Try:
+       &apos;  Input file is loaded in an empty worksheet. Data are copied to 
destination cell
+       Set oUI = CreateScriptService(&quot;UI&quot;)
+       Set oSource = oUI.OpenDocument(FileName _
+                                               , ReadOnly := True _
+                                               , Hidden := True _
+                                               , FilterName := cstFilter _
+                                               , FilterOptions := 
FilterOptions _
+                                               )
+       &apos;  Remember current selection and restore it after copy
+       Set oSelect = _Component.CurrentController.getSelection()
+       sImport = CopyToCell(oSource.Range(&quot;*&quot;), DestinationCell)
+       _RestoreSelections(_Component, oSelect)
+
+Finally:
+       If Not IsNull(oSource) Then oSource.CloseDocument(False)
+       ImportFromCSVFile = sImport
+       ScriptForge.SF_Utils._ExitFunction(cstThisSub)
+       Exit Function
+Catch:
+       GoTo Finally
+End Function    &apos;   SFDocuments.SF_Calc.ImportFromCSVFile
+
+REM 
-----------------------------------------------------------------------------
+Public Sub ImportFromDatabase(Optional ByVal FileName As Variant _
+                                                               , Optional 
ByVal RegistrationName As Variant _
+                                                               , Optional 
ByVal DestinationCell As Variant _
+                                                               , Optional 
ByVal SQLCommand As Variant _
+                                                               , Optional 
ByVal DirectSQL As Variant _
+                                                               )
+&apos;&apos;&apos; Import the content of a database table, query or resultset, 
i.e. the result of a SELECT SQL command,
+&apos;&apos;&apos;     starting from a given cell
+&apos;&apos;&apos;     Beforehands the destination area will be cleared from 
any content and format
+&apos;&apos;&apos;     The modified area depends only on the content of the 
source data
+&apos;&apos;&apos;     Args:
+&apos;&apos;&apos;             FileName: Identifies the file to open. It must 
follow the SF_FileSystem.FileNaming notation
+&apos;&apos;&apos;             RegistrationName: the name of a registered 
database
+&apos;&apos;&apos;                     It is ignored if FileName &lt;&gt; 
&quot;&quot;
+&apos;&apos;&apos;             DestinationCell: the destination of the copied 
range of cells, as a string
+&apos;&apos;&apos;                     If given as range, the destination will 
be reduced to its top-left cell
+&apos;&apos;&apos;             SQLCommand: either a table or query name 
(without square brackets)
+&apos;&apos;&apos;                     or a full SQL commands where table and 
fieldnames are preferably surrounded with square brackets
+&apos;&apos;&apos;     Returns:
+&apos;&apos;&apos;             Implemented as a Sub because the doImport UNO 
method does not return any error
+&apos;&apos;&apos;     Exceptions:
+&apos;&apos;&apos;             BASEDOCUMENTOPENERROR                   The 
database file could not be opened
+&apos;&apos;&apos;     Examples:
+&apos;&apos;&apos;             
oDoc.ImportFromDatabase(&quot;C:\Temp\myDbFile.odb&quot;, , 
&quot;SheetY.C5&quot;, &quot;SELECT * FROM [Employees] ORDER BY 
[LastName]&quot;)
+
+Dim oDBContext As Object               &apos;  com.sun.star.sdb.DatabaseContext
+Dim oDatabase As Object                        &apos;  SFDatabases.Database 
service
+Dim lCommandType As Long               &apos;  A 
com.sun.star.sheet.DataImportMode.xxx constant
+Dim oQuery As Object                   &apos;  com.sun.star.ucb.XContent
+Dim bDirect As Boolean                 &apos;  Alias of DirectSQL
+Dim oDestRange As Object               &apos;  Destination as a range
+Dim oDestAddress As Object             &apos;  
com.sun.star.table.CellRangeAddress
+Dim oDestCell As Object                        &apos;  com.sun.star.table.XCell
+Dim oSelect As Object                  &apos;  Current selection in destination
+Dim vImportOptions As Variant  &apos;  Array of PropertyValues
+
+Const cstThisSub = &quot;SFDocuments.Calc.ImportFromDatabase&quot;
+Const cstSubArgs = &quot;[FileName=&quot;&quot;&quot;&quot;], 
[RegistrationName=&quot;&quot;&quot;&quot;], DestinationCell, SQLCommand, 
[DirectSQL=False]&quot;
+
+&apos; If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
+
+Check:
+       
+       If IsMissing(FileName) Or IsEmpty(FileName) Then FileName = &quot;&quot;
+       If IsMissing(RegistrationName) Or IsEmpty(RegistrationName) Then 
RegistrationName = &quot;&quot;
+       If IsMissing(DirectSQL) Or IsEmpty(DirectSQL) Then DirectSQL = False
+       If ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
+               If Not [_Super]._IsStillAlive(True) Then GoTo Finally
+               If Not ScriptForge.SF_Utils._ValidateFile(FileName, 
&quot;FileName&quot;, , True) Then GoTo Finally
+               If Not ScriptForge.SF_Utils._Validate(DestinationCell, 
&quot;DestinationCell&quot;, V_STRING) Then GoTo Finally
+               If Not ScriptForge.SF_Utils._Validate(SQLCommand, 
&quot;SQLCommand&quot;, V_STRING) Then GoTo Finally
+               If Not ScriptForge.SF_Utils._Validate(DirectSQL, 
&quot;DirectSQL&quot;, ScriptForge.V_BOOLEAN) Then GoTo Finally
+       End If
+
+       &apos;  Check the existence of FileName
+       If Len(FileName) = 0 Then       &apos;  FileName has precedence over 
RegistrationName
+               If Len(RegistrationName) = 0 Then GoTo CatchError
+               Set oDBContext = 
ScriptForge.SF_Utils._GetUNOService(&quot;DatabaseContext&quot;)
+               If Not oDBContext.hasRegisteredDatabase(RegistrationName) Then 
GoTo CatchError
+               FileName = 
ScriptForge.SF_FileSystem._ConvertFromUrl(oDBContext.getDatabaseLocation(RegistrationName))
+       End If  
+       If Not ScriptForge.SF_FileSystem.FileExists(FileName) Then GoTo 
CatchError
+       
+Try:
+       &apos;  Check command type
+       Set oDatabase = 
ScriptForge.SF_Services.CreateScriptService(&quot;SFDatabases.Database&quot;, 
FileName, , True) &apos;  Read-only
+       If IsNull(oDatabase) Then GoTo CatchError
+       With oDatabase
+               If ScriptForge.SF_Array.Contains(.Tables, SQLCommand) Then
+                       bDirect = True
+                       lCommandType = com.sun.star.sheet.DataImportMode.TABLE
+               ElseIf ScriptForge.SF_Array.Contains(.Queries, SQLCommand) Then
+                       Set oQuery = .XConnection.Queries.getByName(SQLCommand)
+                       bDirect = Not oQuery.EscapeProcessing
+                       lCommandType = com.sun.star.sheet.DataImportMode.QUERY
+               Else
+                       bDirect = DirectSQL
+                       lCommandType = com.sun.star.sheet.DataImportMode.SQL
+                       SQLCommand = ._ReplaceSquareBrackets(SQLCommand)
+               End If
+               .CloseDatabase()
+               Set oDatabase = oDatabase.Dispose()
+       End With
+
+       &apos;  Determine the destination cell as the top-left coordinates of 
the given range
+       Set oDestRange = _ParseAddress(DestinationCell)
+       Set oDestAddress = oDestRange.XCellRange.RangeAddress
+       Set oDestCell = 
oDestRange.XSpreadsheet.getCellByPosition(oDestAddress.StartColumn, 
oDestAddress.StartRow)
+
+       &apos;  Remember current selection
+       Set oSelect = _Component.CurrentController.getSelection()
+       &apos;  Import arguments
+       vImportOptions = Array(_
+                       
ScriptForge.SF_Utils._MakePropertyValue(&quot;DatabaseName&quot;, 
ScriptForge.SF_FileSystem._ConvertToUrl(FileName)) _
+                       , 
ScriptForge.SF_Utils._MakePropertyValue(&quot;SourceObject&quot;, SQLCommand) _
+                       , 
ScriptForge.SF_Utils._MakePropertyValue(&quot;SourceType&quot;, lCommandType) _
+                       , 
ScriptForge.SF_Utils._MakePropertyValue(&quot;IsNative&quot;, bDirect) _
+                       )
+       oDestCell.doImport(vImportOptions)
+       &apos;  Restore selection after import_
+       _RestoreSelections(_Component, oSelect)
+
+Finally:
+       ScriptForge.SF_Utils._ExitFunction(cstThisSub)
+       Exit Sub
+Catch:
+       GoTo Finally
+CatchError:
+       SF_Exception.RaiseFatal(BASEDOCUMENTOPENERROR, &quot;FileName&quot;, 
FileName, &quot;RegistrationName&quot;, RegistrationName)
+       GoTo Finally
+End Sub                    &apos;   SFDocuments.SF_Calc.ImportFromDatabase
+
+REM 
-----------------------------------------------------------------------------
+Public Function InsertSheet(Optional ByVal SheetName As Variant _
+                                                               , Optional 
ByVal BeforeSheet As Variant _
+                                                               ) As Boolean
+&apos;&apos;&apos; Insert a new empty sheet before an existing sheet or at the 
end of the list of sheets
+&apos;&apos;&apos;     Args:
+&apos;&apos;&apos;             SheetName: The name of the new sheet
+&apos;&apos;&apos;             BeforeSheet: The name (string) or index 
(numeric, starting from 1) of the sheet before which to insert
+&apos;&apos;&apos;     Returns:
+&apos;&apos;&apos;             True if the sheet could be inserted successfully
+&apos;&apos;&apos;     Examples:
+&apos;&apos;&apos;             oDoc.InsertSheet(&quot;SheetX&quot;, 
&quot;SheetY&quot;)
+
+Dim bInsert As Boolean                         &apos;  Return value
+Dim vSheets As Variant                         &apos;  List of existing sheets
+Dim lSheetIndex As Long                                &apos;  Index of a sheet
+Const cstThisSub = &quot;SFDocuments.Calc.InsertSheet&quot;
+Const cstSubArgs = &quot;SheetName, 
[BeforeSheet=&quot;&quot;&quot;&quot;]&quot;
+
+       If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
+       bInsert = False
+
+Check:
+       If IsMissing(BeforeSheet) Or IsEmpty(BeforeSheet) Then BeforeSheet = 
32768
+       If ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
+               If Not [_Super]._IsStillAlive(True) Then GoTo Finally
+               If Not _ValidateSheet(SheetName, &quot;SheetName&quot;, True) 
Then GoTo Finally
+               If Not _ValidateSheet(BeforeSheet, &quot;BeforeSheet&quot;, , 
True, , True) Then GoTo Finally
+       End If
+       vSheets = _Component.getSheets.getElementNames()
+
+Try:
+       If VarType(BeforeSheet) = V_STRING Then
+               lSheetIndex = ScriptForge.SF_Array.IndexOf(vSheets, BeforeSheet)
+       Else
+               lSheetIndex = BeforeSheet - 1
+               If lSheetIndex &lt; 0 Then lSheetIndex = 0
+               If lSheetIndex &gt; UBound(vSheets) Then lSheetIndex = 
UBound(vSheets) + 1
+       End If
+       _Component.getSheets.insertNewByName(SheetName, lSheetIndex)
+       bInsert = True
+
+Finally:
+       InsertSheet = binsert
+       ScriptForge.SF_Utils._ExitFunction(cstThisSub)
+       Exit Function
+Catch:
+       GoTo Finally
+End Function    &apos;   SFDocuments.SF_Calc.InsertSheet
+
+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;ClearAll&quot; _
+                                       , &quot;ClearFormats&quot; _
+                                       , &quot;ClearValues&quot; _
+                                       , &quot;CloseDocument&quot; _
+                                       , &quot;CopySheet&quot; _
+                                       , &quot;CopySheetFromFile&quot; _
+                                       , &quot;CopyToCell&quot; _
+                                       , &quot;CopyToRange&quot; _
+                                       , &quot;DAvg&quot; _
+                                       , &quot;DCount&quot; _
+                                       , &quot;DMax&quot; _
+                                       , &quot;DMin&quot; _
+                                       , &quot;DSum&quot; _
+                                       , &quot;GetColumnName&quot; _
+                                       , &quot;GetFormula&quot; _
+                                       , &quot;GetValue&quot; _
+                                       , &quot;ImportFromCSVFile&quot; _
+                                       , &quot;ImportFromDatabase&quot; _
+                                       , &quot;InsertSheet&quot; _
+                                       , &quot;MoveRange&quot; _
+                                       , &quot;MoveSheet&quot; _
+                                       , &quot;Offset&quot; _
+                                       , &quot;RemoveSheet&quot; _
+                                       , &quot;RenameSheet&quot; _
+                                       , &quot;RunCommand&quot; _
+                                       , &quot;Save&quot; _
+                                       , &quot;SaveAs&quot; _
+                                       , &quot;SaveCopyAs&quot; _
+                                       , &quot;SetArray&quot; _
+                                       , &quot;SetCellStyle&quot; _
+                                       , &quot;SetFormula&quot; _
+                                       , &quot;SetValue&quot; _
+                                       , &quot;SortRange&quot; _
+                                       )
+
+End Function   &apos;  SFDocuments.SF_Calc.Methods
+
+REM 
-----------------------------------------------------------------------------
+Public Function MoveRange(Optional ByVal Source As Variant _
+                                                               , Optional 
ByVal Destination As Variant _
+                                                               ) As String
+&apos;&apos;&apos; Move a specified source range to a destination range
+&apos;&apos;&apos;     Args:
+&apos;&apos;&apos;             Source: the source range of cells as a string
+&apos;&apos;&apos;             Destination: the destination of the moved range 
of cells, as a string
+&apos;&apos;&apos;     Returns:
+&apos;&apos;&apos;             A string representing the modified range of 
cells
+&apos;&apos;&apos;             The modified area depends only on the size of 
the source area
+&apos;&apos;&apos;     Examples:
+&apos;&apos;&apos;             oDoc.MoveRange(&quot;SheetX.A1:F10&quot;, 
&quot;SheetY.C5&quot;)
+
+Dim sMove As String                            &apos;  Return value
+Dim oSource As Object                  &apos;  Alias of Source to avoid 
&quot;Object variable not set&quot; run-time error
+Dim oSourceAddress As Object   &apos;  com.sun.star.table.CellRangeAddress
+Dim oDestRange As Object               &apos;  Destination as a range
+Dim oDestAddress As Object             &apos;  
com.sun.star.table.CellRangeAddress
+Dim oDestCell As Object                        &apos;  
com.sun.star.table.CellAddress
+Dim oSelect As Object                  &apos;  Current selection in source
+Dim oClipboard As Object               &apos;  
com.sun.star.datatransfer.XTransferable
+Dim oCellRanges As Object              &apos;  
com.sun.star.sheet.SheetCellRanges
+Dim vRangeAddresses As Variant &apos;  Array of 
com.sun.star.table.CellRangeAddress
+Dim i As Long
+
+Const cstThisSub = &quot;SFDocuments.Calc.MoveRange&quot;
+Const cstSubArgs = &quot;Source, Destination&quot;
+
+       If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
+       sMove = &quot;&quot;
+
+Check:
+       If ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
+               If Not [_Super]._IsStillAlive(True) Then GoTo Finally
+               If Not _Validate(Source, &quot;Source&quot;, V_STRING) Then 
GoTo Finally
+               If Not _Validate(Destination, &quot;Destination&quot;, 
V_STRING) Then GoTo Finally
+       End If
+
+Try:
+       Set oSourceAddress = _ParseAddress(Source).XCellRange.RangeAddress
+       Set oDestRange = _ParseAddress(Destination)
+       Set oDestAddress = oDestRange.XCellRange.RangeAddress
+       Set oDestCell = New com.sun.star.table.CellAddress
+       With oDestAddress
+               oDestCell.Sheet = .Sheet
+               oDestCell.Column = .StartColumn
+               oDestCell.Row = .StartRow
+       End With
+       oDestRange.XSpreadsheet.moveRange(oDestCell, oSourceAddress)
+
+       With oSourceAddress
+               sMove = _Offset(Destination, 0, 0, .EndRow - .StartRow + 1, 
.EndColumn - .StartColumn + 1).RangeName
+       End With
+
+Finally:
+       MoveRange = sMove
+       ScriptForge.SF_Utils._ExitFunction(cstThisSub)
+       Exit Function
+Catch:
+       GoTo Finally
+End Function    &apos;   SFDocuments.SF_Calc.MoveRange
+
+REM 
-----------------------------------------------------------------------------
+Public Function MoveSheet(Optional ByVal SheetName As Variant _
+                                                               , Optional 
ByVal BeforeSheet As Variant _
+                                                               ) As Boolean
+&apos;&apos;&apos; Move a sheet before an existing sheet or at the end of the 
list of sheets
+&apos;&apos;&apos;     Args:
+&apos;&apos;&apos;             SheetName: The name of the sheet to move
+&apos;&apos;&apos;             BeforeSheet: The name (string) or index 
(numeric, starting from 1) of the sheet before which to move the sheet
+&apos;&apos;&apos;     Returns:
+&apos;&apos;&apos;             True if the sheet could be moved successfully
+&apos;&apos;&apos;     Examples:
+&apos;&apos;&apos;             oDoc.MoveSheet(&quot;SheetX&quot;, 
&quot;SheetY&quot;)
+
+Dim bMove As Boolean                           &apos;  Return value
+Dim vSheets As Variant                         &apos;  List of existing sheets
+Dim lSheetIndex As Long                                &apos;  Index of a sheet
+Const cstThisSub = &quot;SFDocuments.Calc.MoveSheet&quot;
+Const cstSubArgs = &quot;SheetName, 
[BeforeSheet=&quot;&quot;&quot;&quot;]&quot;
+
+       If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
+       bMove = False
+
+Check:
+       If IsMissing(BeforeSheet) Or IsEmpty(BeforeSheet) Then BeforeSheet = 
32768
+       If ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
+               If Not [_Super]._IsStillAlive(True) Then GoTo Finally
+               If Not _ValidateSheet(SheetName, &quot;SheetName&quot;, , True) 
Then GoTo Finally
+               If Not _ValidateSheet(BeforeSheet, &quot;BeforeSheet&quot;, , 
True, , True) Then GoTo Finally
+       End If
+       vSheets = _Component.getSheets.getElementNames()
+
+Try:
+       If VarType(BeforeSheet) = V_STRING Then
+               lSheetIndex = ScriptForge.SF_Array.IndexOf(vSheets, BeforeSheet)
+       Else
+               lSheetIndex = BeforeSheet - 1
+               If lSheetIndex &lt; 0 Then lSheetIndex = 0
+               If lSheetIndex &gt; UBound(vSheets) Then lSheetIndex = 
UBound(vSheets) + 1
+       End If
+       _Component.getSheets.MoveByName(SheetName, lSheetIndex)
+       bMove = True
+
+Finally:
+       MoveSheet = bMove
+       ScriptForge.SF_Utils._ExitFunction(cstThisSub)
+       Exit Function
+Catch:
+       GoTo Finally
+End Function    &apos;   SFDocuments.SF_Calc.MoveSheet
+
+REM 
-----------------------------------------------------------------------------
+Public Function Offset(Optional ByRef Range As Variant _
+                                                               , Optional 
ByVal Rows As Variant _
+                                                               , Optional 
ByVal Columns As Variant _
+                                                               , Optional 
ByVal Height As Variant _
+                                                               , Optional 
ByVal Width As Variant _
+                                                               ) As String
+&apos;&apos;&apos;     Returns a new range offset by a certain number of rows 
and columns from a given range
+&apos;&apos;&apos;     Args:
+&apos;&apos;&apos;             Range : the range, as a string, from which the 
function searches for the new range
+&apos;&apos;&apos;             Rows : the number of rows by which the 
reference was corrected up (negative value) or down.
+&apos;&apos;&apos;                             Use 0 (default) to stay in the 
same row.
+&apos;&apos;&apos;             Columns : the number of columns by which the 
reference was corrected to the left (negative value) or to the right.
+&apos;&apos;&apos;                             Use 0 (default) to stay in the 
same column
+&apos;&apos;&apos;             Height : the vertical height for an area that 
starts at the new reference position.
+&apos;&apos;&apos;                             Default = no vertical resizing
+&apos;&apos;&apos;             Width : the horizontal width for an area that 
starts at the new reference position.
+&apos;&apos;&apos;                             Default - no horizontal resizing
+&apos;&apos;&apos;             Arguments Rows and Columns must not lead to 
zero or negative start row or column.
+&apos;&apos;&apos;             Arguments Height and Width must not lead to 
zero or negative count of rows or columns.
+&apos;&apos;&apos;     Returns:
+&apos;&apos;&apos;             A new range as a string
+&apos;&apos;&apos;     Exceptions:
+&apos;&apos;&apos;             OFFSETADDRESSERROR              The computed 
range of cells falls beyond the sheet boundaries
+&apos;&apos;&apos;     Examples:
+&apos;&apos;&apos;             oDoc.Offset(&quot;A1&quot;, 2, 2)       &apos;  
&quot;&apos;SheetX&apos;.$C$3&quot; (A1 moved by two rows and two columns down)
+&apos;&apos;&apos;             oDoc.Offset(&quot;A1&quot;, 2, 2, 5, 6) &apos;  
&quot;&apos;SheetX&apos;.$C$3:$H$7&quot;
+
+Dim sOffset As String                          &apos;  Return value
+Dim oAddress As Object                         &apos;  Alias of Range
+Const cstThisSub = &quot;SFDocuments.Calc.Offset&quot;
+Const cstSubArgs = &quot;Range, [Rows=0], [Columns=0], [Height], [Width]&quot;
+
+       If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
+       sOffset = &quot;&quot;
+
+Check:
+       If IsMissing(Rows) Or IsEmpty(Rows) Then Rows = 0
+       If IsMissing(Columns) Or IsEmpty(Columns) Then Columns = 0
+       If IsMissing(Height) Or IsEmpty(Height) Then Height = 0
+       If IsMissing(Width) Or IsEmpty(Width) Then Width = 0
+       If ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
+               If Not [_Super]._IsStillAlive() Then GoTo Finally
+               If Not ScriptForge.SF_Utils._Validate(Range, &quot;Range&quot;, 
V_STRING) Then GoTo Finally
+               If Not ScriptForge.SF_Utils._Validate(Rows, &quot;Rows&quot;, 
ScriptForge.V_NUMERIC) Then GoTo Finally
+               If Not ScriptForge.SF_Utils._Validate(Columns, 
&quot;Columns&quot;, ScriptForge.V_NUMERIC) Then GoTo Finally
+               If Not ScriptForge.SF_Utils._Validate(Height, 
&quot;Height&quot;, ScriptForge.V_NUMERIC) Then GoTo Finally
+               If Not ScriptForge.SF_Utils._Validate(Width, &quot;Width&quot;, 
ScriptForge.V_NUMERIC) Then GoTo Finally
+       End If
+
+Try:
+       &apos;  Define the new range string
+       Set oAddress = _Offset(Range, Rows, Columns, Height, Width)
+       sOffset = oAddress.RangeName
+
+Finally:
+       Offset = sOffset
+       ScriptForge.SF_Utils._ExitFunction(cstThisSub)
+       Exit Function
+Catch:
+       GoTo Finally
+End Function   &apos;  SF_Documents.SF_Calc.Offset
+
+REM 
-----------------------------------------------------------------------------
+Public Function Properties() As Variant
+&apos;&apos;&apos;     Return the list or properties of the Timer class as an 
array
+
+       Properties = Array( _
+                                       &quot;CurrentSelection&quot; _
+                                       , &quot;CustomProperties&quot; _
+                                       , &quot;Description&quot; _
+                                       , &quot;DocumentProperties&quot; _
+                                       , &quot;DocumentType&quot; _
+                                       , &quot;Height&quot; _
+                                       , &quot;IsBase&quot; _
+                                       , &quot;IsCalc&quot; _
+                                       , &quot;IsDraw &quot; _
+                                       , &quot;IsImpress&quot; _
+                                       , &quot;IsMath&quot; _
+                                       , &quot;IsWriter&quot; _
+                                       , &quot;Keywords&quot; _
+                                       , &quot;LastCell&quot; _
+                                       , &quot;LastColumn&quot; _
+                                       , &quot;LastRow&quot; _
+                                       , &quot;Range&quot; _
+                                       , &quot;Readonly&quot; _
+                                       , &quot;Sheet&quot; _
+                                       , &quot;Sheets&quot; _
+                                       , &quot;Subject&quot; _
+                                       , &quot;Title&quot; _
+                                       , &quot;Width&quot; _
+                                       , &quot;XCellRange&quot; _
+                                       , &quot;XComponent&quot; _
+                                       , &quot;XSpreadsheet&quot; _
+                                       )
+
+End Function   &apos;  SFDocuments.SF_Calc.Properties
+
+REM 
-----------------------------------------------------------------------------
+Public Function RemoveSheet(Optional ByVal SheetName As Variant) As Boolean
+&apos;&apos;&apos; Remove an existing sheet from the document
+&apos;&apos;&apos;     Args:
+&apos;&apos;&apos;             SheetName: The name of the sheet to remove
+&apos;&apos;&apos;     Returns:
+&apos;&apos;&apos;             True if the sheet could be removed successfully
+&apos;&apos;&apos;     Examples:
+&apos;&apos;&apos;             oDoc.RemoveSheet(&quot;SheetX&quot;)
+
+Dim bRemove As Boolean                         &apos;  Return value
+Const cstThisSub = &quot;SFDocuments.Calc.RemoveSheet&quot;
+Const cstSubArgs = &quot;SheetName&quot;
+
+       If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
+       bRemove = False
+
+Check:
+       If ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
+               If Not [_Super]._IsStillAlive(True) Then GoTo Finally
+               If Not _ValidateSheet(SheetName, &quot;SheetName&quot;, , True) 
Then GoTo Finally
+       End If
+
+Try:
+        _Component.getSheets.RemoveByName(SheetName)
+       bRemove = True
+
+Finally:
+       RemoveSheet = bRemove
+       ScriptForge.SF_Utils._ExitFunction(cstThisSub)
+       Exit Function
+Catch:
+       GoTo Finally
+End Function    &apos;   SFDocuments.SF_Calc.RemoveSheet
+
+REM 
-----------------------------------------------------------------------------
+Public Function RenameSheet(Optional ByVal SheetName As Variant _
+                                                               , Optional 
ByVal NewName As Variant _
+                                                               ) As Boolean
+&apos;&apos;&apos; Rename a specified sheet
+&apos;&apos;&apos;     Args:
+&apos;&apos;&apos;             SheetName: The name of the sheet to rename
+&apos;&apos;&apos;             NewName: Must not exist
+&apos;&apos;&apos;     Returns:
+&apos;&apos;&apos;             True if the sheet could be renamed successfully
+&apos;&apos;&apos;     Exceptions:
+&apos;&apos;&apos;             DUPLICATESHEETERROR             A sheet with 
the given name exists already
+&apos;&apos;&apos;     Examples:
+&apos;&apos;&apos;             oDoc.RenameSheet(&quot;SheetX&quot;, 
&quot;SheetY&quot;)
+
+Dim bRename As Boolean                         &apos;  Return value
+Const cstThisSub = &quot;SFDocuments.Calc.RenameSheet&quot;
+Const cstSubArgs = &quot;SheetName, NewName&quot;
+
+       If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
+       bRename = False
+
+Check:
+       If ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
+               If Not [_Super]._IsStillAlive(True) Then GoTo Finally
+               If Not _ValidateSheet(SheetName, &quot;SheetName&quot;, , True) 
Then GoTo Finally
+               If Not _ValidateSheet(NewName, &quot;NewName&quot;, True) Then 
GoTo Finally
+       End If
+
+Try:
+       _Component.getSheets.getByName(SheetName).setName(NewName)
+       bRename = True
+
+Finally:
+       RenameSheet = bRename
+       ScriptForge.SF_Utils._ExitFunction(cstThisSub)
+       Exit Function
+Catch:
+       GoTo Finally
+End Function    &apos;   SFDocuments.SF_Calc.RenameSheet
+
+REM 
-----------------------------------------------------------------------------
+Public Function SetArray(Optional ByVal TargetCell As Variant _
+                                                               , Optional 
ByRef Value As Variant _
+                                                               ) As String
+&apos;&apos;&apos;     Set the given (array of) values starting from the 
target cell
+&apos;&apos;&apos;     The updated area expands itself from the target cell or 
from the top-left corner of the given range
+&apos;&apos;&apos;     as far as determined by the size of the input Value.
+&apos;&apos;&apos;     Vectors are always expanded vertically
+&apos;&apos;&apos;     Args:
+&apos;&apos;&apos;             TargetCell : the cell or the range as a string 
that should receive a new value
+&apos;&apos;&apos;             Value: a scalar, a vector or an array with the 
new values
+&apos;&apos;&apos;                     The new values should be strings, 
numeric values or dates. Other types empty the corresponding cell
+&apos;&apos;&apos;     Returns:
+&apos;&apos;&apos;             A string representing the updated range
+&apos;&apos;&apos;     Exceptions:
+&apos;&apos;&apos;             OFFSETADDRESSERROR              The computed 
range of cells falls beyond the sheet boundaries
+&apos;&apos;&apos;     Examples:
+&apos;&apos;&apos;             oDoc.SetArray(&quot;SheetX.A1&quot;, 
SF_Array.RangeInit(1, 1000))
+
+Dim sSet As String                                     &apos;  Return value
+Dim oSet As Object                                     &apos;  _Address alias 
of sSet
+Dim vDataArray As Variant                      &apos;  DataArray compatible 
with .DataArray UNO property
+Const cstThisSub = &quot;SFDocuments.Calc.SetArray&quot;
+Const cstSubArgs = &quot;TargetCell, Value&quot;
+
+       If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
+       sSet = &quot;&quot;
+
+Check:
+       If ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
+               If Not [_Super]._IsStillAlive() Then GoTo Finally
+               If Not ScriptForge.SF_Utils._Validate(TargetCell, 
&quot;TargetCell&quot;, V_STRING) Then GoTo Finally
+               If IsArray(Value) Then
+                       If Not ScriptForge.SF_Utils._ValidateArray(Value, 
&quot;Value&quot;) Then GoTo Finally
+               Else
+                       If Not ScriptForge.SF_Utils._Validate(Value, 
&quot;Value&quot;) Then GoTo Finally
+               End If
+       End If
+
+Try:
+       &apos;  Convert argument to data array and derive new range from its 
size
+       vDataArray = _ConvertToDataArray(Value)
+       If UBound(vDataArray) &lt; LBound(vDataArray) Then GoTo Finally
+       Set oSet = _Offset(TargetCell, 0, 0, plHeight := UBound(vDataArray) + 
1, plWidth := UBound(vDataArray(0)) + 1)  &apos;  +1 : vDataArray is zero-based
+       With oSet
+               .XCellRange.setDataArray(vDataArray)
+               sSet = .RangeName
+       End With
+
+Finally:
+       SetArray = sSet
+       ScriptForge.SF_Utils._ExitFunction(cstThisSub)
+       Exit Function
+Catch:
+       GoTo Finally
+End Function   &apos;  SF_Documents.SF_Calc.SetArray
+
+REM 
-----------------------------------------------------------------------------
+Public Function SetCellStyle(Optional ByVal TargetRange As Variant _
+                                                               , Optional 
ByVal Style As Variant _
+                                                               ) As String
+&apos;&apos;&apos;     Apply the given cell style in the given range
+&apos;&apos;&apos;     The full range is updated and the remainder of the 
sheet is left untouched
+&apos;&apos;&apos;     If the cell style does not exist, an error is raised
+&apos;&apos;&apos;     Args:
+&apos;&apos;&apos;             TargetRange : the range as a string that should 
receive a new cell style
+&apos;&apos;&apos;             Style: the style name as a string
+&apos;&apos;&apos;     Returns:
+&apos;&apos;&apos;             A string representing the updated range
+&apos;&apos;&apos;     Examples:
+&apos;&apos;&apos;             oDoc.SetCellStyle(&quot;A1:F1&quot;, 
&quot;Heading 2&quot;)
+
+Dim sSet As String                                     &apos;  Return value
+Dim oAddress As _Address                               &apos;  Alias of 
TargetRange
+Dim oStyleFamilies As Object           &apos;  
com.sun.star.container.XNameAccess
+Dim vStyles As Variant                         &apos;  Array of existing cell 
styles
+Const cstStyle = &quot;CellStyles&quot;
+Const cstThisSub = &quot;SFDocuments.Calc.SetCellStyle&quot;
+Const cstSubArgs = &quot;TargetRange, Style&quot;
+
+       If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
+       sSet = &quot;&quot;
+
+Check:
+       If ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
+               If Not [_Super]._IsStillAlive() Then GoTo Finally
+               If Not ScriptForge.SF_Utils._Validate(TargetRange, 
&quot;TargetRange&quot;, V_STRING) Then GoTo Finally
+               Set oStyleFamilies = _Component.StyleFamilies
+               If oStyleFamilies.hasByName(cstStyle) Then vStyles = 
oStyleFamilies.getByName(cstStyle).getElementNames() Else vStyles = Array()

... etc. - the rest is truncated
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to