123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464 |
- <?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
- '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
- ''' 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
- </script:module>
|