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 ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ''' SF_Base ''' ======= ''' ''' The SFDocuments library gathers a number of methods and properties making easy ''' the management and several manipulations of LibreOffice documents ''' ''' Some methods are generic for all types of documents: they are combined in the SF_Document module. ''' Specific properties and methods are implemented in the concerned subclass(es) SF_Calc, SF_Writer, ... ''' ''' To workaround the absence of class inheritance in LibreOffice Basic, some redundancy is necessary ''' Each subclass MUST implement also the generic methods and properties, even if they only call ''' the parent methods and properties. ''' They should also duplicate some generic private members as a subset of their own set of members ''' ''' The SF_Base module is provided only to block parent properties that are NOT applicable to Base documents ''' ''' The current module is closely related to the "UI" service of the ScriptForge library ''' ''' Service invocation examples: ''' 1) From the UI service ''' Dim ui As Object, oDoc As Object ''' Set ui = CreateScriptService("UI") ''' Set oDoc = ui.CreateBaseDocument("C:\Me\MyFile.odb", ...) ''' ' or Set oDoc = ui.OpenDocument("C:\Me\MyFile.odb") ''' 2) Directly if the document is already opened ''' Dim oDoc As Object ''' Set oDoc = CreateScriptService("SFDocuments.Base", "MyFile.odb") ''' ' The substring "SFDocuments." in the service name is optional ''' ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' REM ================================================================== EXCEPTIONS Private Const DBCONNECTERROR = "DBCONNECTERROR" REM ============================================================= PRIVATE MEMBERS Private [Me] As Object Private [_Parent] As Object Private [_Super] As Object ' Document superclass, which the current instance is a subclass of Private ObjectType As String ' Must be BASE Private ServiceName As String ' Window component Private _Component As Object ' com.sun.star.comp.dba.ODatabaseDocument Private _DataSource As Object ' com.sun.star.comp.dba.ODatabaseSource Private _Database As Object ' SFDatabases.Database service instance REM ============================================================ MODULE CONSTANTS REM ===================================================== CONSTRUCTOR/DESTRUCTOR REM ----------------------------------------------------------------------------- Private Sub Class_Initialize() Set [Me] = Nothing Set [_Parent] = Nothing Set [_Super] = Nothing ObjectType = "BASE" ServiceName = "SFDocuments.Base" Set _Component = Nothing Set _DataSource = Nothing Set _Database = Nothing End Sub ' SFDocuments.SF_Base Constructor REM ----------------------------------------------------------------------------- Private Sub Class_Terminate() Call Class_Initialize() End Sub ' 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 ' SFDocuments.SF_Base Explicit Destructor REM ================================================================== PROPERTIES REM ===================================================================== METHODS REM ----------------------------------------------------------------------------- Public Function CloseDocument(Optional ByVal SaveAsk As Variant) As Boolean ''' The closure of a Base document requires the closures of ''' 1) the connection => done in the CloseDatabase() method ''' 2) the data source ''' 3) the document itself => done in the superclass Const cstThisSub = "SFDocuments.Base.CloseDocument" Const cstSubArgs = "[SaveAsk=True]" 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, "SaveAsk", 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 ' SFDocuments.SF_Base.CloseDocument REM ----------------------------------------------------------------------------- Public Function GetDatabase(Optional ByVal User As Variant _ , Optional ByVal Password As Variant _ ) As Object ''' Returns a Database instance (service = SFDatabases.Database) giving access ''' to the execution of SQL commands on the database defined and/or stored in ''' the actual Base document ''' Args: ''' User, Password: the login parameters as strings. Defaults = "" ''' Returns: ''' A SFDatabases.Database instance or Nothing ''' Example: ''' Dim myDb As Object ''' Set myDb = oDoc.GetDatabase() Const cstThisSub = "SFDocuments.Base.GetDatabase" Const cstSubArgs = "[User=""""], [Password=""""]" If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo Catch Set GetDatabase = Nothing Check: If IsMissing(User) Or IsEmpty(User) Then User = "" If IsMissing(Password) Or IsEmpty(Password) Then Password = "" If ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then If Not [_Super]._IsStillAlive(True) Then GoTo Finally If Not ScriptForge.SF_Utils._Validate(User, "User", V_STRING) Then GoTo Finally If Not ScriptForge.SF_Utils._Validate(Password, "Password", V_STRING) Then GoTo Finally End If Try: If IsNull(_Database) Then ' 1st connection from the current document instance If IsNull(_DataSource) Then GoTo CatchConnect Set _Database = ScriptForge.SF_Services.CreateScriptService("SFDatabases.DatabaseFromDocument" _ , _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, "User", User, "Password", Password, [_Super]._FileIdent()) GoTo Finally End Function ' SFDocuments.SF_Base.GetDatabase REM ----------------------------------------------------------------------------- Public Function GetProperty(Optional ByVal PropertyName As Variant) As Variant ''' Return the actual value of the given property ''' Args: ''' PropertyName: the name of the property as a string ''' Returns: ''' The actual value of the property ''' Exceptions: ''' ARGUMENTERROR The property does not exist Const cstThisSub = "SFDocuments.Base.GetProperty" Const cstSubArgs = "" 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, "PropertyName", V_STRING, Properties()) Then GoTo Catch End If Try: ' 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 ' SFDocuments.SF_Base.GetProperty REM ----------------------------------------------------------------------------- Public Function Methods() As Variant ''' Return the list of public methods of the Model service as an array Methods = Array( _ "Activate" _ , "CloseDocument" _ , "GetDatabase" _ , "RunCommand" _ , "Save" _ , "SaveAs" _ , "SaveCopyAs" _ ) End Function ' SFDocuments.SF_Base.Methods REM ----------------------------------------------------------------------------- Public Function Properties() As Variant ''' Return the list or properties of the Timer class as an array Properties = Array( _ "DocumentType" _ , "IsBase" _ , "IsCalc" _ , "IsDraw " _ , "IsImpress" _ , "IsMath" _ , "IsWriter" _ , "XComponent" _ ) End Function ' SFDocuments.SF_Base.Properties REM ----------------------------------------------------------------------------- Public Function SetProperty(Optional ByVal PropertyName As Variant _ , Optional ByRef Value As Variant _ ) As Boolean ''' Set a new value to the given property ''' Args: ''' PropertyName: the name of the property as a string ''' Value: its new value ''' Exceptions ''' ARGUMENTERROR The property does not exist Const cstThisSub = "SFDocuments.Base.SetProperty" Const cstSubArgs = "PropertyName, Value" 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, "PropertyName", 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 ' SFDocuments.SF_Documents.SetProperty REM ======================================================= SUPERCLASS PROPERTIES REM ----------------------------------------------------------------------------- 'Property Get CustomProperties() As Variant ' CustomProperties = [_Super].GetProperty("CustomProperties") 'End Property ' SFDocuments.SF_Base.CustomProperties REM ----------------------------------------------------------------------------- 'Property Let CustomProperties(Optional ByVal pvCustomProperties As Variant) ' [_Super].CustomProperties = pvCustomProperties 'End Property ' SFDocuments.SF_Base.CustomProperties REM ----------------------------------------------------------------------------- 'Property Get Description() As Variant ' Description = [_Super].GetProperty("Description") 'End Property ' SFDocuments.SF_Base.Description REM ----------------------------------------------------------------------------- 'Property Let Description(Optional ByVal pvDescription As Variant) ' [_Super].Description = pvDescription 'End Property ' SFDocuments.SF_Base.Description REM ----------------------------------------------------------------------------- 'Property Get DocumentProperties() As Variant ' DocumentProperties = [_Super].GetProperty("DocumentProperties") 'End Property ' SFDocuments.SF_Base.DocumentProperties REM ----------------------------------------------------------------------------- Property Get DocumentType() As String DocumentType = [_Super].GetProperty("DocumentType") End Property ' SFDocuments.SF_Base.DocumentType REM ----------------------------------------------------------------------------- Property Get IsBase() As Boolean IsBase = [_Super].GetProperty("IsBase") End Property ' SFDocuments.SF_Base.IsBase REM ----------------------------------------------------------------------------- Property Get IsCalc() As Boolean IsCalc = [_Super].GetProperty("IsCalc") End Property ' SFDocuments.SF_Base.IsCalc REM ----------------------------------------------------------------------------- Property Get IsDraw() As Boolean IsDraw = [_Super].GetProperty("IsDraw") End Property ' SFDocuments.SF_Base.IsDraw REM ----------------------------------------------------------------------------- Property Get IsImpress() As Boolean IsImpress = [_Super].GetProperty("IsImpress") End Property ' SFDocuments.SF_Base.IsImpress REM ----------------------------------------------------------------------------- Property Get IsMath() As Boolean IsMath = [_Super].GetProperty("IsMath") End Property ' SFDocuments.SF_Base.IsMath REM ----------------------------------------------------------------------------- Property Get IsWriter() As Boolean IsWriter = [_Super].GetProperty("IsWriter") End Property ' SFDocuments.SF_Base.IsWriter REM ----------------------------------------------------------------------------- 'Property Get Keywords() As Variant ' Keywords = [_Super].GetProperty("Keywords") 'End Property ' SFDocuments.SF_Base.Keywords REM ----------------------------------------------------------------------------- 'Property Let Keywords(Optional ByVal pvKeywords As Variant) ' [_Super].Keywords = pvKeywords 'End Property ' SFDocuments.SF_Base.Keywords REM ----------------------------------------------------------------------------- 'Property Get Readonly() As Variant ' Readonly = [_Super].GetProperty("Readonly") 'End Property ' SFDocuments.SF_Base.Readonly REM ----------------------------------------------------------------------------- 'Property Get Subject() As Variant ' Subject = [_Super].GetProperty("Subject") 'End Property ' SFDocuments.SF_Base.Subject REM ----------------------------------------------------------------------------- 'Property Let Subject(Optional ByVal pvSubject As Variant) ' [_Super].Subject = pvSubject 'End Property ' SFDocuments.SF_Base.Subject REM ----------------------------------------------------------------------------- 'Property Get Title() As Variant ' Title = [_Super].GetProperty("Title") 'End Property ' SFDocuments.SF_Base.Title REM ----------------------------------------------------------------------------- 'Property Let Title(Optional ByVal pvTitle As Variant) ' [_Super].Title = pvTitle 'End Property ' SFDocuments.SF_Base.Title REM ----------------------------------------------------------------------------- Property Get XComponent() As Variant XComponent = [_Super].GetProperty("XComponent") End Property ' SFDocuments.SF_Base.XComponent REM ========================================================== SUPERCLASS METHODS REM ----------------------------------------------------------------------------- Public Function Activate() As Boolean Activate = [_Super].Activate() End Function ' SFDocuments.SF_Base.Activate REM ----------------------------------------------------------------------------- Public Sub RunCommand(Optional ByVal Command As Variant) [_Super].RunCommand(Command) End Sub ' SFDocuments.SF_Base.RunCommand REM ----------------------------------------------------------------------------- Public Function Save() As Boolean Save = [_Super].Save() End Function ' 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 ' 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 ' SFDocuments.SF_Base.SaveCopyAs REM =========================================================== PRIVATE FUNCTIONS REM ----------------------------------------------------------------------------- Private Function _PropertyGet(Optional ByVal psProperty As String _ , Optional ByVal pvArg As Variant _ ) As Variant ''' Return the value of the named property ''' Args: ''' psProperty: the name of the property Dim oProperties As Object ' Document or Custom properties Dim vLastCell As Variant ' Coordinates of last used cell in a sheet Dim oSelect As Object ' Current selection Dim vRanges As Variant ' List of selected ranges Dim i As Long Dim cstThisSub As String Const cstSubArgs = "" _PropertyGet = False cstThisSub = "SFDocuments.SF_Base.get" & 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 ' SFDocuments.SF_Base._PropertyGet REM ----------------------------------------------------------------------------- Private Function _Repr() As String ''' Convert the SF_Base instance to a readable string, typically for debugging purposes (DebugPrint ...) ''' Args: ''' Return: ''' "[Base]: Type/File" _Repr = "[Base]: " & [_Super]._FileIdent() End Function ' SFDocuments.SF_Base._Repr REM ============================================ END OF SFDOCUMENTS.SF_BASE