<?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_Toolbar" script:language="StarBasic" script:moduleType="normal">REM =======================================================================================================================
REM ===			The ScriptForge library and its associated libraries are part of the LibreOffice project.				===
REM	===						The SFWidgets 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_Toolbar
&apos;&apos;&apos;	==========
&apos;&apos;&apos;		Hide/show a toolbar related to a component/document.
&apos;&apos;&apos;
&apos;&apos;&apos;		Each component has its own set of toolbars, depending on the component type
&apos;&apos;&apos;		(Calc, Writer, Basic IDE, ...).
&apos;&apos;&apos;		In the context of the actual class, a toolbar is presumed defined statically:
&apos;&apos;&apos;			- either by the application
&apos;&apos;&apos;			- or by a customization done by the user.
&apos;&apos;&apos;		The definition of a toolbar can be stored in the application configuration files
&apos;&apos;&apos;		or in a specific document.
&apos;&apos;&apos;		Changes made by scripts to toolbars stored in the application are persistent.
&apos;&apos;&apos;		They are valid for all documents of the same type.
&apos;&apos;&apos;
&apos;&apos;&apos;		Note that the menubar and the statusbar are not considered toolbars in this context.
&apos;&apos;&apos;
&apos;&apos;&apos;		A toolbar consists in a series of graphical controls to trigger actions.
&apos;&apos;&apos;		The &quot;Toolbar&quot; service gives access to the &quot;ToolbarButton&quot; service to manage
&apos;&apos;&apos;		the individual buttons belonging to the toolbar.
&apos;&apos;&apos;
&apos;&apos;&apos;		The name of a toolbar is either:
&apos;&apos;&apos;			- its so-called UIName when it is available,
&apos;&apos;&apos;			- or the last component of the resource URL: &quot;private:resource/toolbar/the-name-here&quot;
&apos;&apos;&apos;
&apos;&apos;&apos;		Service invocation:
&apos;&apos;&apos;			The Toolbars() method returns the list of available toolbar names
&apos;&apos;&apos;			The Toolbars(toolbarname) returns a Toolbar service
&apos;&apos;&apos;			It is available from
&apos;&apos;&apos;				- the UI service to access the toolbars of the Basic IDE (&quot;BASICIDE&quot;),
&apos;&apos;&apos;				  the start center (&quot;WELCOMESCREEN&quot;) or the active window
&apos;&apos;&apos;				- the Document, Calc, Writer, Datasheet, FormDocument services to access
&apos;&apos;&apos;				  their respective set of toolbars.
&apos;&apos;&apos;			Example:
&apos;&apos;&apos;				Dim oCalc As Object, oToolbar As Object
&apos;&apos;&apos;				Set oCalc = CreateScriptService(&quot;Calc&quot;, &quot;myFile.ods&quot;)
&apos;&apos;&apos;				Set oToolbar = oCalc.Toolbars(&quot;findbar&quot;)
&apos;&apos;&apos;
&apos;&apos;&apos;
&apos;&apos;&apos;		Detailed user documentation:
&apos;&apos;&apos;			https://help.libreoffice.org/latest/en-US/text/sbasic/shared/03/toolbar.html?DbPAR=BASIC
&apos;&apos;&apos;
&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;

REM ================================================================== EXCEPTIONS

REM ============================================================= PRIVATE MEMBERS

Private [Me]					As Object
Private ObjectType				As String		&apos; Must be TOOLBAR
Private ServiceName 			As String

Private _Component				As Object		&apos; com.sun.star.lang.XComponent
Private _ResourceURL			As String		&apos; Toolbar internal name
Private _UIName					As String		&apos; Toolbar external name, may be &quot;&quot;
Private _UIConfigurationManager	As Object		&apos; com.sun.star.ui.XUIConfigurationManager
Private _ElementsInfoIndex		As Long			&apos; Index of the toolbar in the UIConfigurationManager.getElementsInfo(0) array
Private _Storage				As Long			&apos; One of the toolbar location constants
Private _LayoutManager			As Object		&apos; com.sun.star.comp.framework.LayoutManager

Private _ToolbarButtons			As Object		&apos; SF_Dictionary of toolbar buttons

Type _ToolbarButton
	Toolbar						As Object		&apos; The actual SF_Toolbar object instance
	Index						As Long			&apos; Entry number in buttons lists
	Label						As String		&apos; Label (static description)
	AccessibleName				As String		&apos; Name found in accessible context
	Element						As Object		&apos; com.sun.star.ui.XUIElement
End Type

REM ============================================================ MODULE CONSTANTS

&apos;	Toolbar locations
Private Const cstBUILTINTOOLBAR			= 0		&apos; Standard toolbar
Private Const cstCUSTOMTOOLBAR			= 1		&apos; Toolbar added by user and stored in the LibreOffice application
Private Const cstCUSTOMDOCTOOLBAR		= 2		&apos; Toolbar added by user solely for a single document

REM ====================================================== CONSTRUCTOR/DESTRUCTOR

REM -----------------------------------------------------------------------------
Private Sub Class_Initialize()
	Set [Me] = Nothing
	ObjectType = &quot;TOOLBAR&quot;
	ServiceName = &quot;SFWidgets.Toolbar&quot;
	Set _Component = Nothing
	_ResourceURL = &quot;&quot;
	_UIName = &quot;&quot;
	Set _UIConfigurationManager = Nothing
	_ElementsInfoIndex = -1
	_Storage = 0
	Set _LayoutManager = Nothing
	Set _ToolbarButtons = Nothing
End Sub		&apos;	SFWidgets.SF_Toolbar Constructor

REM -----------------------------------------------------------------------------
Private Sub Class_Terminate()
	Call Class_Initialize()
End Sub		&apos;	SFWidgets.SF_Toolbar Destructor

REM -----------------------------------------------------------------------------
Public Function Dispose() As Variant
	Call Class_Terminate()
	Set Dispose = Nothing
End Function	&apos;	SFWidgets.SF_Toolbar Explicit Destructor

REM ================================================================== PROPERTIES

REM -----------------------------------------------------------------------------
Property Get BuiltIn() As Boolean
&apos;&apos;&apos;	Returns True when the toolbar is part of the set of standard toolbars shipped with the application.
&apos;&apos;&apos;	Example:
&apos;&apos;&apos;		MsgBox myToolbar.BuiltIn

	BuiltIn = _PropertyGet(&quot;BuiltIn&quot;)

End Property	&apos;	SFWidgets.SF_Toolbar.BuiltIn (get)

REM -----------------------------------------------------------------------------
Property Get Docked() As Variant
&apos;&apos;&apos;	Returns True when the toolbar is active in the window and Docked.
&apos;&apos;&apos;	Example:
&apos;&apos;&apos;		MsgBox myToolbar.Docked

	Docked = _PropertyGet(&quot;Docked&quot;)

End Property	&apos;	SFWidgets.SF_Toolbar.Docked (get)

REM -----------------------------------------------------------------------------
Property Get HasGlobalScope() As Boolean
&apos;&apos;&apos;	Returns True when the toolbar is available in all documents of the same type
&apos;&apos;&apos;	Example:
&apos;&apos;&apos;		MsgBox myToolbar.HasGlobalScope

	HasGlobalScope = _PropertyGet(&quot;HasGlobalScope&quot;)

End Property	&apos;	SFWidgets.SF_Toolbar.HasGlobalScope (get)

REM -----------------------------------------------------------------------------
Property Get Name() As String
&apos;&apos;&apos;	Returns the name of the toolbar
&apos;&apos;&apos;	Example:
&apos;&apos;&apos;		MsgBox myToolbar.Name

	Name = _PropertyGet(&quot;Name&quot;)

End Property	&apos;	SFWidgets.SF_Toolbar.Name (get)

REM -----------------------------------------------------------------------------
Property Get ResourceURL() As String
&apos;&apos;&apos;	Returns URL of the toolbar, in the form private:toolbar/xxx
&apos;&apos;&apos;	Example:
&apos;&apos;&apos;		MsgBox myToolbar.ResourceURL

	ResourceURL = _PropertyGet(&quot;ResourceURL&quot;)

End Property	&apos;	SFWidgets.SF_Toolbar.ResourceURL (get)

REM -----------------------------------------------------------------------------
Property Get Visible() As Variant
&apos;&apos;&apos;	Returns True when the toolbar is active in the window and visible.
&apos;&apos;&apos;	Example:
&apos;&apos;&apos;		MsgBox myToolbar.Visible

	Visible = _PropertyGet(&quot;Visible&quot;)

End Property	&apos;	SFWidgets.SF_Toolbar.Visible (get)

REM -----------------------------------------------------------------------------
Property Let Visible(ByVal pvVisible As Variant)
&apos;&apos;&apos;	Sets the visible status of the toolbar.
&apos;&apos;&apos;	When the toolbar is not yet active i the window, it is first created.
&apos;&apos;&apos;	Example:
&apos;&apos;&apos;		myToolbar.Visible = True

	_PropertySet(&quot;Visible&quot;, pvVisible)

End Property	&apos;	SFWidgets.SF_Toolbar.Visible (let)

REM -----------------------------------------------------------------------------
Property Get XUIElement() As Variant
&apos;&apos;&apos;	Returns the com.sun.star.ui.XUIElement UNO object corresponding with the toolbar
&apos;&apos;&apos;	Example:
&apos;&apos;&apos;		MsgBox myToolbar.XUIElement

	XUIElement = _PropertyGet(&quot;XUIElement&quot;)

End Property	&apos;	SFWidgets.SF_Toolbar.XUIElement (get)

REM ===================================================================== METHODS

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;		If the property does not exist, returns Null
&apos;&apos;&apos;	Exceptions:
&apos;&apos;&apos;		see the exceptions of the individual properties
&apos;&apos;&apos;	Examples:
&apos;&apos;&apos;		myToolbar.GetProperty(&quot;Visible&quot;)

Const cstThisSub = &quot;SFWidgets.Toolbar.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:
	GetProperty = _PropertyGet(PropertyName)

Finally:
	ScriptForge.SF_Utils._ExitFunction(cstThisSub)
	Exit Function
Catch:
	GoTo Finally
End Function	&apos;	SFWidgets.SF_Toolbar.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;ToolbarButtons&quot; _
					)

End Function	&apos;	SFWidgets.SF_Toolbar.Methods

REM -----------------------------------------------------------------------------
Public Function Properties() As Variant
&apos;&apos;&apos;	Return the list or properties of the Timer a.AddItem(&quot;B&gt;B1&quot;)class as an array

	Properties = Array( _
					&quot;BuiltIn&quot; _
					, &quot;Docked&quot; _
					, &quot;HasGlobalScope&quot; _
					, &quot;Name&quot; _
					, &quot;ResourceURL&quot; _
					, &quot;Visible&quot; _
					, &quot;XUIElement&quot; _
					)

End Function	&apos;	SFWidgets.SF_Toolbar.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;SFWidgets.Toolbar.SetProperty&quot;
Const cstSubArgs = &quot;PropertyName, Value&quot;

	If SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
	SetProperty = False

Check:
	If SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
		If Not SF_Utils._Validate(PropertyName, &quot;PropertyName&quot;, V_STRING, Properties()) Then GoTo Catch
	End If

Try:
	SetProperty = _PropertySet(PropertyName, Value)

Finally:
	SF_Utils._ExitFunction(cstThisSub)
	Exit Function
Catch:
	GoTo Finally
End Function	&apos;	SFWidgets.SF_Toolbar.SetProperty

REM -----------------------------------------------------------------------------
Public Function ToolbarButtons(Optional ByVal ButtonName As Variant) As Variant
&apos;&apos;&apos;	Returns either a list of the available toolbar button names in the actual toolbar
&apos;&apos;&apos;	or a ToolbarButton object instance.
&apos;&apos;&apos;	Args:
&apos;&apos;&apos;		ButtonName: the usual name of one of the available buttons in the actual toolbar
&apos;&apos;&apos;	Returns:
&apos;&apos;&apos;		A zero-based array of button names when the argument is absent,
&apos;&apos;&apos;		or a new ToolbarButton object instance.
&apos;&apos;&apos;		An inactive toolbar has no buttons =&gt; the actual method forces the toolbar to be made visible first.

Const cstThisSub = &quot;SFWidgets.Toolbar.ToolbarButtons&quot;
Const cstSubArgs = &quot;[ButtonName=&quot;&quot;&quot;&quot;]&quot;

	If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo Catch

Check:
	If IsMissing(ButtonName) Or IsEmpty(ButtonName) Then ButtonName = &quot;&quot;
	&apos;	Store button descriptions in cache
	_CollectAllButtons()
	If ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
		If VarType(ButtonName) = V_STRING Then
			If Len(ButtonName) &gt; 0 Then
				If Not ScriptForge.SF_Utils._Validate(ButtonName, &quot;ButtonName&quot;, V_STRING, _ToolbarButtons.Keys()) Then GoTo Finally
			End If
		Else
			If Not ScriptForge.SF_Utils._Validate(ButtonName, &quot;ButtonName&quot;, V_STRING) Then GoTo Finally	&apos;	Manage here the VarType error
		End If
	End If

Try:
	If Len(ButtonName) = 0 Then
		ToolbarButtons = _ToolbarButtons.Keys()
	Else
		ToolbarButtons = CreateScriptService(&quot;SFWidgets.ToolbarButton&quot;, _ToolbarButtons.Item(ButtonName))
	End If

Finally:
	ScriptForge.SF_Utils._ExitFunction(cstThisSub)
	Exit Function
Catch:
	GoTo Finally
End Function	&apos;	SFWidgets.SF_Toolbar.ToolbarButtons

REM =========================================================== PRIVATE FUNCTIONS

REM -----------------------------------------------------------------------------
Private Sub _CollectAllButtons()
&apos;&apos;&apos;	Stores a SF_Dictionary object instance, with
&apos;&apos;&apos;		- key = name of the button
&apos;&apos;&apos;		- item = a _ButtonDesc object type
&apos;&apos;&apos;	into _ToolbarButtons, a cache for all buttons.
&apos;&apos;&apos;	The toolbar is made visible before collecting the buttons.
&apos;&apos;&apos;
&apos;&apos;&apos;	The name of the buttons is derived either from:
&apos;&apos;&apos;		- the Label property of the static toolbar and toolbar buttons  definitions
&apos;&apos;&apos;		- or the AccessibleName property of the AccessibleContext of the button
&apos;&apos;&apos;	whichever is found first.
&apos;&apos;&apos;	Separators are skipped.
&apos;&apos;&apos;	If there are homonyms (&gt;= 2 buttons having the same name), only the 1st one is retained.

Dim oElement As Object				&apos;	com.sun.star.ui.XUIElement
Dim oSettings As Object				&apos;	com.sun.star.container.XIndexAccess
Dim vProperties() As Variant		&apos;	Array of property values
Dim iType As Integer				&apos;	Separators have type = 1, others have Type = 0
Dim oAccessibleContext As Object	&apos;	Toolbar&apos;s com.sun.star.accessibility.XAccessibleContext
Dim oAccessible As Object			&apos;	com.sun.star.accessibility.XAccessible
Dim sLabel As String				&apos;	Label in static description
Dim sAccessibleName As String		&apos;	Name in AccessibleContext
Dim sButtonName As String			&apos;	Key part in dictionary entry
Dim oButton As Object				&apos;	Item part in dictionary entry
Dim i As Long

	On Local Error GoTo Catch
	If Not IsNull(_ToolbarButtons) Then GoTo Finally		&apos;	Do not redo the job if already done

Try:
	&apos;	Force the visibility of the toolbar
	Visible = True

	Set _ToolbarButtons = ScriptForge.SF_Services.CreateScriptService(&quot;ScriptForge.Dictionary&quot;, True)	&apos;	with case-sensitive comparison of keys

	&apos;	Find the com.sun.star.ui.XUIElement of the toolbar
	Set oElement = _LayoutManager.getElement(_ResourceURL)

	&apos;	Determine the accessible context of the toolbar
	Set oAccessibleContext = _GetAccessibleContext(oElement)
	If IsNull(oAccessibleContext) Then GoTo Catch

	&apos;	The settings contain the info that we need
	Set oSettings = oElement.getSettings(True)

	With oSettings
		For i = 0 To .Count - 1
			vProperties = .getByIndex(i)
			iType = ScriptForge.SF_Utils._GetPropertyValue(vProperties, &quot;Type&quot;)
			If iType = 0 Then		&apos;	Usual button
				sLabel = ScriptForge.SF_Utils._GetPropertyValue(vProperties, &quot;Label&quot;)
				If Len(sLabel) = 0 Then
					Set oAccessible = oAccessibleContext.getAccessibleChild(i)
					sAccessibleName = oAccessible.AccessibleName
				Else
					sAccessibleName = &quot;&quot;
				End If
				&apos;	Store in dictionary
				sButtonName = sLabel &amp; sAccessibleName		&apos;	At least 1 of them is blank
				If Len(sButtonName) &gt; 0 Then
					Set oButton = New _ToolbarButton
					With oButton
						Set .Toolbar = [Me]
						.Index = i
						.Label = sLabel
						.AccessibleName = sAccessibleName
						Set .Element = oElement
					End With
					With _ToolbarButtons
						If Not .Exists(sButtonName) Then .Add(sButtonName, oButton)
					End With
				End If
			End If
		Next i
	End With

Finally:
	Exit Sub
Catch:
	&apos;	_ToolbarButtons is left unchanged
	GoTo Finally
End Sub			&apos;	SFWidgets.SF_Toolbar._CollectAllButtons

REM -----------------------------------------------------------------------------
Public Function _GetAccessibleContext(poElement As Object) As Object
&apos;&apos;&apos;	Determine the accessible context of the toolbar
&apos;&apos;&apos;		See bug https://bugs.documentfoundation.org/show_bug.cgi?id=168409
&apos;&apos;&apos;		Finding the accessible context is release-dependent due to phase-out of unpublished API
&apos;&apos;&apos;	Args:
&apos;&apos;&apos;		poElement: the com.sun.star.ui.XUIElement describing the toolbar

Dim dVersion As Single				&apos;	LibreOffice release number
Dim oElement As Object				&apos;	com.sun.star.ui.XUIElement
Dim bFloating As Boolean			&apos;	True when poElement is not docked
Dim lIndex As Long					&apos;	Index of the toolbar in the LayoutManager.getElements array
Dim oAccessibleContext As Object	&apos;	Toolbar&apos;s com.sun.star.accessibility.XAccessibleContext

Check:
	On Local Error GoTo Catch
	Set oAccessibleContext = Nothing
	If IsNull(poElement) Then GoTo Catch

Try:
	dVersion = ScriptForge.SF_Platform._GetProductName(True)	&apos;	Get a sortable release number

	With poElement.RealInterface
		Select Case dVersion
			Case &lt;= 25.2	:	Set oAccessibleContext = .AccessibleContext
			Case 25.8
				&apos;	Find the com.sun.star.ui.XUIElement of the toolbar and its index in the list
				lIndex = -1
				bFloating = poElement.RealInterface.isFloating()
				For Each oElement In _LayoutManager.getElements()
					&apos;	When undocked, count undocked elements only, otherwise count all elements
					If bFloating Then
						If oElement.RealInterface.isFloating() Then lIndex = lIndex + 1
					Else
						lIndex = lIndex + 1
					End If
					If oElement.ResourceURL = _ResourceURL Then Exit For
				Next oElement
				Set oAccessibleContext = .AccessibleContext.AccessibleParent.AccessibleContext.getAccessibleChild(lIndex)
			Case &gt;= 26.2	:	Set oAccessibleContext = .getProperty(&quot;XAccessible&quot;)
			Case Else		:	GoTo Catch
		End Select
	End With

Finally:
	Set _GetAccessibleContext = oAccessibleContext
	Exit Function
Catch:
	GoTo Finally
End Function	&apos;	&apos;	SFWidgets.SF_Toolbar._GetAccessibleContext

REM -----------------------------------------------------------------------------
Public Sub _Initialize(ByRef poToolbar As Object)
&apos;&apos;&apos;	Complete the object creation process:
&apos;&apos;&apos;		- Initialize the toolbar descriptioner use
&apos;&apos;&apos;	Args:
&apos;&apos;&apos;		poToolbar: the toolbar description as a ui._Toolbar object

Try:
	&apos;	Store the static description
	With poToolbar
		_Component = .Component
		_ResourceURL = .ResourceURL
		_UIName = .UIName
		_UIConfigurationManager = .UIConfigurationManager
		_ElementsInfoIndex = .ElementsInfoIndex
		_Storage = .Storage
	End With

	&apos;	Complement
	If Len(_UIName) = 0 Then _UIName = Split(_ResourceURL, &quot;/&quot;)(2)
	Set _LayoutManager = _Component.CurrentController.Frame.LayoutManager

Finally:
	Exit Sub
End Sub			&apos;	SFWidgets.SF_Toolbar._Initialize

REM -----------------------------------------------------------------------------
Private Function _PropertyGet(Optional ByVal psProperty As String) As Variant
&apos;&apos;&apos;	Return the value of the named property
&apos;&apos;&apos;	Args:
&apos;&apos;&apos;		psProperty: the name of the property

Dim vGet As Variant							&apos;	Return value
Dim oElement As Object						&apos;	com.sun.star.ui.XUIElement
Dim cstThisSub As String
Const cstSubArgs = &quot;&quot;

	cstThisSub = &quot;SFWidgets.Toolbar.get&quot; &amp; psProperty
	If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo Catch

	ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs)
	_PropertyGet = Null

	Select Case UCase(psProperty)
		Case UCase(&quot;BuiltIn&quot;)
			_PropertyGet = ( _Storage = cstBUILTINTOOLBAR )
		Case UCase(&quot;Docked&quot;)
			Set oElement = _LayoutManager.getElement(_ResourceURL)
			If Not IsNull(oElement) Then _PropertyGet = _LayoutManager.isElementDocked(_ResourceURL) Else _PropertyGet = False
		Case UCase(&quot;HasGlobalScope&quot;)
			_PropertyGet = ( _Storage = cstBUILTINTOOLBAR Or _Storage = cstCUSTOMTOOLBAR )
		Case UCase(&quot;Name&quot;)
			_PropertyGet = _UIName
		Case UCase(&quot;ResourceURL&quot;)
			_PropertyGet = _ResourceURL
		Case UCase(&quot;Visible&quot;)
			Set oElement = _LayoutManager.getElement(_ResourceURL)
			If Not IsNull(oElement) Then _PropertyGet = _LayoutManager.isElementVisible(_ResourceURL) Else _PropertyGet = False
		Case UCase(&quot;XUIElement&quot;)
			_PropertyGet = _LayoutManager.getElement(_ResourceURL)
		Case Else
			_PropertyGet = Null
	End Select

Finally:
	ScriptForge.SF_Utils._ExitFunction(cstThisSub)
	Exit Function
Catch:
	GoTo Finally
End Function	&apos;	SFWidgets.SF_Toolbar._PropertyGet

REM -----------------------------------------------------------------------------
Private Function _PropertySet(Optional ByVal psProperty As String _
								, Optional ByVal pvValue As Variant _
								) As Boolean
&apos;&apos;&apos;	Set the new value of the named property
&apos;&apos;&apos;	Args:
&apos;&apos;&apos;		psProperty: the name of the property
&apos;&apos;&apos;		pvValue: the new value of the given property

Dim bSet As Boolean							&apos;	Return value
Dim oElement As Object						&apos;	com.sun.star.ui.XUIElement
Dim bVisible As Boolean						&apos;	Actual Visible state

Dim cstThisSub As String
Const cstSubArgs = &quot;Value&quot;

	If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
	bSet = False

	cstThisSub = &quot;SFWidgets.Toolbar.set&quot; &amp; psProperty
	ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs)

	bSet = True
	Select Case UCase(psProperty)
		Case UCase(&quot;Visible&quot;)
			If Not ScriptForge.SF_Utils._Validate(pvValue, &quot;Value&quot;, ScriptForge.V_BOOLEAN) Then GoTo Catch
			With _LayoutManager
				Set oElement = .getElement(_ResourceURL)
				If Not IsNull(oElement) Then bVisible = .isElementVisible(_ResourceURL) Else bVisible = False
				&apos;	If there is no change, do nothing
				If Not bVisible = pvValue Then
					If IsNull(oElement) And pvValue Then .createElement(_ResourceURL)
					If pvValue Then .showElement(_ResourceURL) Else .hideElement(_ResourceURL)
				End If
			End With
		Case Else
			bSet = False
	End Select

Finally:
	_PropertySet = bSet
	ScriptForge.SF_Utils._ExitFunction(cstThisSub)
	Exit Function
Catch:
	bSet = False
	GoTo Finally
End Function	&apos;	SFWidgets.SF_Toolbar._PropertySet

REM -----------------------------------------------------------------------------
Private Function _Repr() As String
&apos;&apos;&apos;	Convert the SF_Toolbar instance to a readable string, typically for debugging purposes (DebugPrint ...)
&apos;&apos;&apos;	Args:
&apos;&apos;&apos;	Return:
&apos;&apos;&apos;		&quot;[Toolbar]: Name, Type (dialogname)
	_Repr = &quot;[Toolbar]: &quot; &amp; _UIName &amp; &quot; - &quot; &amp; _ResourceURL

End Function	&apos;	SFWidgets.SF_Toolbar._Repr

REM ============================================ END OF SFWIDGETS.SF_TOOLBAR
</script:module>