_ModuleModel.xba 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd">
  3. <script:module xmlns:script="http://openoffice.org/2000/script" script:name="_ModuleModel" script:language="StarBasic" script:moduleType="normal">REM =======================================================================================================================
  4. REM === The ScriptForge library and its associated libraries are part of the LibreOffice project. ===
  5. REM === Full documentation is available on https://help.libreoffice.org/ ===
  6. REM =======================================================================================================================
  7. Option Compatible
  8. Option ClassModule
  9. &apos;Option Private Module
  10. Option Explicit
  11. &apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;
  12. &apos;&apos;&apos; ModuleModel (aka SF_Model)
  13. &apos;&apos;&apos; ===========
  14. &apos;&apos;&apos; Illustration of how the ScriptForge modules are structured
  15. &apos;&apos;&apos; Copy and paste this code in an empty Basic module to start a new service
  16. &apos;&apos;&apos; Comment in, comment out, erase what you want, but at the end respect the overall structure
  17. &apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;
  18. REM ================================================================== EXCEPTIONS
  19. &apos;&apos;&apos; FAKENEWSERROR
  20. REM ============================================================= PRIVATE MEMBERS
  21. Private [Me] As Object &apos; Should be initialized immediately after the New statement
  22. &apos; Dim obj As Object : Set obj = New SF_Model
  23. &apos; Set obj.[Me] = obj
  24. Private [_Parent] As Object &apos; To keep trace of the instance having created a sub-instance
  25. &apos; Set obj._Parent = [Me]
  26. Private ObjectType As String &apos; Must be UNIQUE
  27. REM ============================================================ MODULE CONSTANTS
  28. Private Const SOMECONSTANT = 1
  29. REM ====================================================== CONSTRUCTOR/DESTRUCTOR
  30. REM -----------------------------------------------------------------------------
  31. Private Sub Class_Initialize()
  32. Set [Me] = Nothing
  33. Set [_Parent] = Nothing
  34. ObjectType = &quot;MODEL&quot;
  35. End Sub &apos; ScriptForge.SF_Model Constructor
  36. REM -----------------------------------------------------------------------------
  37. Private Sub Class_Terminate()
  38. Call Class_Initialize()
  39. End Sub &apos; ScriptForge.SF_Model Destructor
  40. REM -----------------------------------------------------------------------------
  41. Public Function Dispose() As Variant
  42. Call Class_Terminate()
  43. Set Dispose = Nothing
  44. End Function &apos; ScriptForge.SF_Model Explicit Destructor
  45. REM ================================================================== PROPERTIES
  46. REM -----------------------------------------------------------------------------
  47. Property Get MyProperty() As Boolean
  48. &apos;&apos;&apos; Returns True or False
  49. &apos;&apos;&apos; Example:
  50. &apos;&apos;&apos; myModel.MyProperty
  51. MyProperty = _PropertyGet(&quot;MyProperty&quot;)
  52. End Property &apos; ScriptForge.SF_Model.MyProperty
  53. REM ===================================================================== METHODS
  54. REM -----------------------------------------------------------------------------
  55. Public Function GetProperty(Optional ByVal PropertyName As Variant) As Variant
  56. &apos;&apos;&apos; Return the actual value of the given property
  57. &apos;&apos;&apos; Args:
  58. &apos;&apos;&apos; PropertyName: the name of the property as a string
  59. &apos;&apos;&apos; Returns:
  60. &apos;&apos;&apos; The actual value of the property
  61. &apos;&apos;&apos; If the property does not exist, returns Null
  62. &apos;&apos;&apos; Exceptions:
  63. &apos;&apos;&apos; see the exceptions of the individual properties
  64. &apos;&apos;&apos; Examples:
  65. &apos;&apos;&apos; myModel.GetProperty(&quot;MyProperty&quot;)
  66. Const cstThisSub = &quot;Model.GetProperty&quot;
  67. Const cstSubArgs = &quot;&quot;
  68. If SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
  69. GetProperty = Null
  70. Check:
  71. If SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
  72. If Not SF_Utils._Validate(PropertyName, &quot;PropertyName&quot;, V_STRING, Properties()) Then GoTo Catch
  73. End If
  74. Try:
  75. GetProperty = _PropertyGet(PropertyName)
  76. Finally:
  77. SF_Utils._ExitFunction(cstThisSub)
  78. Exit Function
  79. Catch:
  80. GoTo Finally
  81. End Function &apos; ScriptForge.SF_Model.GetProperty
  82. REM -----------------------------------------------------------------------------
  83. Public Function Methods() As Variant
  84. &apos;&apos;&apos; Return the list of public methods of the Model service as an array
  85. Methods = Array( _
  86. &quot;MyFunction&quot; _
  87. , &quot;etc&quot; _
  88. )
  89. End Function &apos; ScriptForge.SF_Model.Methods
  90. REM -----------------------------------------------------------------------------
  91. Public Function MyFunction(Optional ByVal Arg1 As Variant _
  92. , Optional ByVal Arg2 As Variant _
  93. ) As Variant
  94. &apos;&apos;&apos; Fictive function that concatenates Arg1 Arg2 times
  95. &apos;&apos;&apos; Args:
  96. &apos;&apos;&apos; Arg1 String Text
  97. &apos;&apos;&apos; Arg2 Numeric Number of times (default = 2)
  98. &apos;&apos;&apos; Returns:
  99. &apos;&apos;&apos; The new string
  100. &apos;&apos;&apos; Exceptions:
  101. &apos;&apos;&apos; FAKENEWSERROR
  102. &apos;&apos;&apos; Examples:
  103. &apos;&apos;&apos; MyFunction(&quot;value1&quot;) returns &quot;value1value1&quot;
  104. Dim sOutput As String &apos; Output buffer
  105. Dim i As Integer
  106. Const cstThisSub = &quot;Model.myFunction&quot;
  107. Const cstSubArgs = &quot;Arg1, [Arg2=2]&quot;
  108. &apos; _ErrorHandling returns False when, for debugging, the standard error handling is preferred
  109. If SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
  110. myFunction = &quot;&quot;
  111. Check:
  112. If IsMissing(Arg2) Then Arg2 = 2
  113. &apos; _EnterFunction returns True when current method is invoked from a user script
  114. If SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
  115. &apos; Check Arg1 is a string and Arg2 is a number.
  116. &apos; Validation rules for scalars and arrays are described in SF_Utils
  117. If Not SF_Utils._Validate(Arg1, &quot;Arg1&quot;, V_STRING) Then GoTo Finally
  118. If Not SF_Utils._Validate(Arg2, &quot;Arg2&quot;, V_NUMERIC) Then GoTo Finally
  119. &apos; Fatal error ?
  120. If Arg2 &lt; 0 Then GoTo CatchFake
  121. End If
  122. Try:
  123. sOutput = &quot;&quot;
  124. For i = 0 To Arg2
  125. sOutput = sOutput &amp; Arg1
  126. Next i
  127. myFunction = sOutput
  128. Finally:
  129. &apos; _ExitFunction manages internal (On Local) errors
  130. SF_Utils._ExitFunction(cstThisSub)
  131. Exit Function
  132. Catch:
  133. GoTo Finally
  134. CatchFake:
  135. SF_Exception.RaiseFatal(&quot;FAKENEWSERROR&quot;, cstThisSub)
  136. GoTo Finally
  137. End Function &apos; ScriptForge.SF_Model.myFunction
  138. REM -----------------------------------------------------------------------------
  139. Public Function Properties() As Variant
  140. &apos;&apos;&apos; Return the list or properties of the Model class as an array
  141. Properties = Array( _
  142. &quot;MyProperty&quot; _
  143. , &quot;etc&quot; _
  144. )
  145. End Function &apos; ScriptForge.SF_Model.Properties
  146. REM =========================================================== PRIVATE FUNCTIONS
  147. REM -----------------------------------------------------------------------------
  148. Private Function _PropertyGet(Optional ByVal psProperty As String) As Variant
  149. &apos;&apos;&apos; Return the value of the named property
  150. &apos;&apos;&apos; Args:
  151. &apos;&apos;&apos; psProperty: the name of the property
  152. Dim cstThisSub As String
  153. Const cstSubArgs = &quot;&quot;
  154. cstThisSub = &quot;SF_Model.get&quot; &amp; psProperty
  155. SF_Utils._EnterFunction(cstThisSub, cstSubArgs)
  156. Select Case psProperty
  157. Case &quot;MyProperty&quot;
  158. _PropertyGet = TBD
  159. Case Else
  160. _PropertyGet = Null
  161. End Select
  162. Finally:
  163. SF_Utils._ExitFunction(cstThisSub)
  164. Exit Function
  165. End Function &apos; ScriptForge.SF_Model._PropertyGet
  166. REM -----------------------------------------------------------------------------
  167. Private Function _Repr() As String
  168. &apos;&apos;&apos; Convert the Model instance to a readable string, typically for debugging purposes (DebugPrint ...)
  169. &apos;&apos;&apos; Args:
  170. &apos;&apos;&apos; Return:
  171. &apos;&apos;&apos; &quot;[MODEL]: A readable string&quot;
  172. _Repr = &quot;[MODEL]: A readable string&quot;
  173. End Function &apos; ScriptForge.SF_Model._Repr
  174. REM ============================================ END OF SCRIPTFORGE.SF_MODEL
  175. </script:module>