office-gobmx/wizards/source/sfwidgets/SF_ToolbarButton.xba
Jean-Pierre Ledure 8a4ee0fb39 ScriptForge (SFWidgets) new ContextMenu service
Complete a predefined context menu with new items
placed at its bottom.

A context menu is obtained by a right-click
on several areas of a document. Each area has
its own context menu.
Each component model has its own set of context menus.

A context menu is usually predefined at
LibreOffice installation. Customization is done
statically with the Tools + Customize dialog.
The actual new service provides a mean
to make temporary additions at the bottom of a
context menu. Those changes are lost when
the document is closed.

The name of a context menu is the last component
of the resource URL:
   "private:resource/popupmenu/the-name-here"

Context menu items are either usual items or
line separators. Checkboxes or radio buttons
are not supported.
Items run a command or a script when clicked.

The service implements 2 methods:
   AddItem() adds an entry in the menu hierarchy
   Activate() shows or hides the added entries

A context menu can be defined from both Basic
and Python user scripts.

An update of the documentation is required.

Change-Id: Id77f1f2565d75e36c09b13972330d0f83b3f1db4
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/172355
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
Tested-by: Jenkins
2024-08-24 18:29:12 +02:00

571 lines
No EOL
24 KiB
XML

<?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_ToolbarButton" 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_ToolbarButton
&apos;&apos;&apos; ================
&apos;&apos;&apos; Hide/show toolbar elements, read and update their current behaviour..
&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; Changes made by scripts to buttons belonging to toolbars stored in the application
&apos;&apos;&apos; are persistent. They are valid for all documents of the same type.
&apos;&apos;&apos;
&apos;&apos;&apos; The name of a toolbar button is either:
&apos;&apos;&apos; - in custom toolbars, a predefined name given at its creation,
&apos;&apos;&apos; - in standard toolbars, a localized name as read in the Tools + Customize ... dialog box
&apos;&apos;&apos;
&apos;&apos;&apos; Service invocation:
&apos;&apos;&apos; It is available only from an active Toolbar service.
&apos;&apos;&apos; Example:
&apos;&apos;&apos; Dim oCalc As Object, oToolbar As Object, oToolbarButton 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; Set oToolbarButton = oToolbar.ToolbarButtons(&quot;Find Next&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/toolbarcontrol.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 TOOLBARBUTTON
Private ServiceName As String
Private [_Parent] As Object &apos; SF_Toolbar instance owning the button
Private _Index As Long &apos; Entry number in buttons lists
Private _Label As String &apos; Label (static description)
Private _AccessibleName As String &apos; Name found in accessible context
Private _Element As Object &apos; com.sun.star.ui.XUIElement
Private _CommandURL As String &apos; Uno command or script
Private _Height As Long &apos; Height may be cached
Private _Width As Long &apos; Width may be cached
REM ============================================================ MODULE CONSTANTS
REM ====================================================== CONSTRUCTOR/DESTRUCTOR
REM -----------------------------------------------------------------------------
Private Sub Class_Initialize()
Set [Me] = Nothing
ObjectType = &quot;TOOLBARBUTTON&quot;
ServiceName = &quot;SFWidgets.ToolbarButton&quot;
Set [_Parent] = Nothing
_Index = -1
_Label = &quot;&quot;
_AccessibleName = &quot;&quot;
Set _Element = Nothing
_CommandURL = &quot;&quot;
_Height = 0
_Width = 0
End Sub &apos; SFWidgets.SF_ToolbarButton Constructor
REM -----------------------------------------------------------------------------
Private Sub Class_Terminate()
Call Class_Initialize()
End Sub &apos; SFWidgets.SF_ToolbarButton Destructor
REM -----------------------------------------------------------------------------
Public Function Dispose() As Variant
Call Class_Terminate()
Set Dispose = Nothing
End Function &apos; SFWidgets.SF_ToolbarButton Explicit Destructor
REM ================================================================== PROPERTIES
REM -----------------------------------------------------------------------------
Property Get Caption() As String
&apos;&apos;&apos; Returns the name of the button
&apos;&apos;&apos; Example:
&apos;&apos;&apos; MsgBox myButton.Caption
Caption = _PropertyGet(&quot;Caption&quot;)
End Property &apos; SFWidgets.SF_ToolbarButton.Caption (get)
REM -----------------------------------------------------------------------------
Property Get Height() As Long
&apos;&apos;&apos; Returns the height in pixels of the button
&apos;&apos;&apos; Example:
&apos;&apos;&apos; MsgBox myButton.Height
Height = _PropertyGet(&quot;Height&quot;)
End Property &apos; SFWidgets.SF_ToolbarButton.Height (get)
REM -----------------------------------------------------------------------------
Property Get Index() As Long
&apos;&apos;&apos; Returns the index of the button
&apos;&apos;&apos; - in the Settings (com.sun.star.container.XIndexAccess) of the parent toolbar
&apos;&apos;&apos; - in the AccessibleContext (com.sun.star.comp.toolkit.AccessibleToolBox) of the parent toolbar
&apos;&apos;&apos; Both should be identical: the range number of the button in the toolbar, hidden buttons and separators included.
&apos;&apos;&apos; Example:
&apos;&apos;&apos; MsgBox myButton.Index
Index = _PropertyGet(&quot;Index&quot;)
End Property &apos; SFWidgets.SF_ToolbarButton.Index (get)
REM -----------------------------------------------------------------------------
Property Get OnClick() As Variant
&apos;&apos;&apos; Returns the UNO command or the script (expressed in the scripting framework_URI notation) run when the button is clicked
&apos;&apos;&apos; Read https://wiki.documentfoundation.org/Documentation/DevGuide/Scripting_Framework#Scripting_Framework_URI_Specification
&apos;&apos;&apos; Note that no event object is passed to the script.
&apos;&apos;&apos; Example:
&apos;&apos;&apos; MsgBox myButton.OnClick
OnClick = _PropertyGet(&quot;OnClick&quot;)
End Property &apos; SFWidgets.SF_ToolbarButton.OnClick (get)
REM -----------------------------------------------------------------------------
Property Let OnClick(ByVal pvOnClick As Variant)
&apos;&apos;&apos; Sets the UNO command or the script (expressed in the scripting framework_URI notation) to trigger when the button is clicked
&apos;&apos;&apos; It is highly recommended to not modify standard buttons.
&apos;&apos;&apos; Example:
&apos;&apos;&apos; myButton.OnClick = &quot;.uno:About&quot;
&apos;&apos;&apos; myButton.OnClick = &quot;vnd.sun.star.script:XrayTool._Main.Xray?language=Basic&amp;location=application&quot;
_PropertySet(&quot;OnClick&quot;, pvOnClick)
End Property &apos; SFWidgets.SF_ToolbarButton.OnClick (let)
REM -----------------------------------------------------------------------------
Property Get Parent() As Object
&apos;&apos;&apos; Returns the parent toolbar as a SF_Toolbar object instance
&apos;&apos;&apos; Example:
&apos;&apos;&apos; Set oToolbar = myButton.Parent
Set Parent = _PropertyGet(&quot;Parent&quot;)
End Property &apos; SFWidgets.SF_ToolbarButton.Parent (get)
REM -----------------------------------------------------------------------------
Property Get TipText() As Variant
&apos;&apos;&apos; Specifies the text that appears in a screentip when you hold the mouse pointer over the button
&apos;&apos;&apos; Example:
&apos;&apos;&apos; MsgBox myButton.TipText
TipText = _PropertyGet(&quot;TipText&quot;)
End Property &apos; SFWidgets.SF_ToolbarButton.TipText (get)
REM -----------------------------------------------------------------------------
Property Let TipText(ByVal pvTipText As Variant)
&apos;&apos;&apos; Sets the screentip associated with the actual toolbar button
&apos;&apos;&apos; It is highly recommended to not modify standard buttons.
&apos;&apos;&apos; Example:
&apos;&apos;&apos; myButton.TipText = &quot;Click here&quot;
_PropertySet(&quot;TipText&quot;, pvTipText)
End Property &apos; SFWidgets.SF_ToolbarButton.TipText (let)
REM -----------------------------------------------------------------------------
Property Get Visible() As Variant
&apos;&apos;&apos; Returns True when the toolbar button is visible. Otherwise False.
&apos;&apos;&apos; Example:
&apos;&apos;&apos; MsgBox myButton.Visible
Visible = _PropertyGet(&quot;Visible&quot;)
End Property &apos; SFWidgets.SF_ToolbarButton.Visible (get)
REM -----------------------------------------------------------------------------
Property Let Visible(ByVal pvVisible As Variant)
&apos;&apos;&apos; Sets the visible status of the toolbar button.
&apos;&apos;&apos; Example:
&apos;&apos;&apos; myButton.Visible = True
_PropertySet(&quot;Visible&quot;, pvVisible)
End Property &apos; SFWidgets.SF_ToolbarButton.Visible (let)
REM -----------------------------------------------------------------------------
Property Get Width() As Long
&apos;&apos;&apos; Returns the width in pixels of the button
&apos;&apos;&apos; Example:
&apos;&apos;&apos; MsgBox myButton.Width
Width = _PropertyGet(&quot;Width&quot;)
End Property &apos; SFWidgets.SF_ToolbarButton.Width (get)
REM -----------------------------------------------------------------------------
Property Get X() As Long
&apos;&apos;&apos; Returns the X (horizontal) coordinate in pixels of the top-left corner of the button
&apos;&apos;&apos; Example:
&apos;&apos;&apos; MsgBox myButton.X
X = _PropertyGet(&quot;X&quot;)
End Property &apos; SFWidgets.SF_ToolbarButton.X (get)
REM -----------------------------------------------------------------------------
Property Get Y() As Long
&apos;&apos;&apos; Returns the Y (vertical) coordinate in pixels of the top-left corner of the button
&apos;&apos;&apos; Example:
&apos;&apos;&apos; MsgBox myButton.Y
Y = _PropertyGet(&quot;Y&quot;)
End Property &apos; SFWidgets.SF_ToolbarButton.Y (get)
REM ===================================================================== METHODS
REM -----------------------------------------------------------------------------
Public Function Execute() As Variant
&apos;&apos;&apos; Execute the command stored in the toolbar button.
&apos;&apos;&apos; The command can be a UNO command or a Basic/Python script (expressed in the scripting framework_URI notation)
&apos;&apos;&apos; Read https://wiki.documentfoundation.org/Documentation/DevGuide/Scripting_Framework#Scripting_Framework_URI_Specification
&apos;&apos;&apos; No argument is passed to the script to execute.
&apos;&apos;&apos; Args:
&apos;&apos;&apos; Returns:
&apos;&apos;&apos; The output of the script or Null
&apos;&apos;&apos; Examples:
&apos;&apos;&apos; result = myButton.Execute()
Dim vResult As Variant &apos; Return value
Dim sCommand As String &apos; Command associated with button
Dim oFrame As Object &apos; com.sun.star.comp.framework.Frame
Dim oDispatcher As Object &apos; com.sun.star.frame.DispatchHelper
Dim vScript As Variant &apos; Split command in script/argument
Dim oSession As Object : Set oSession = ScriptForge.SF_Services.CreateScriptService(&quot;ScriptForge.Session&quot;)
Dim oArgs() As new com.sun.star.beans.PropertyValue
Const cstUnoPrefix = &quot;.uno:&quot;
Const cstThisSub = &quot;SFWidgets.ToolbarButton.Execute&quot;
Const cstSubArgs = &quot;&quot;
If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
vResult = Null
Check:
ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs)
Try:
sCommand = GetProperty(&quot;OnClick&quot;)
If Len(sCommand) &gt; 0 Then
&apos; A button has been clicked necessarily in the current window (Document) or one of its subcomponents (FormDocument)
Set oFrame = StarDesktop.ActiveFrame
If oFrame.Frames.Count &gt; 0 Then Set oFrame = oFrame.getActiveFrame()
&apos; Command or script ?
If ScriptForge.SF_String.StartsWith(sCommand, cstUnoPrefix) Then
&apos; Execute uno command
Set oDispatcher = ScriptForge.SF_Utils._GetUNOService(&quot;DispatchHelper&quot;)
oDispatcher.executeDispatch(oFrame, sCommand, &quot;&quot;, 0, oArgs())
oFrame.activate()
Else
&apos; Execute script
vResult = oSession._ExecuteScript(sCommand)
End If
End If
Finally:
Execute = vResult
ScriptForge.SF_Utils._ExitFunction(cstThisSub)
Exit Function
Catch:
GoTo Finally
End Function &apos; SFWidgets.SF_ToolbarButton.Execute
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.ToolbarButton.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_ToolbarButton.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;Execute&quot; _
)
End Function &apos; SFWidgets.SF_ToolbarButton.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;Caption&quot; _
, &quot;Height&quot; _
, &quot;Index&quot; _
, &quot;OnClick&quot; _
, &quot;Parent&quot; _
, &quot;TipText&quot; _
, &quot;Visible&quot; _
, &quot;Width&quot; _
, &quot;X&quot; _
, &quot;Y&quot; _
)
End Function &apos; SFWidgets.SF_ToolbarButton.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.ToolbarButton.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_ToolbarButton.SetProperty
REM =========================================================== PRIVATE FUNCTIONS
REM -----------------------------------------------------------------------------
Private Function _GetPosition() As Object
&apos;&apos;&apos; Determine the position of the top-left corner of the actual button.
&apos;&apos;&apos; Returns:
&apos;&apos;&apos; a com.sun.star.awt.Rectangle structure
Dim oElement As Object &apos; com.sun.star.ui.XUIElement
Dim oAccessible As Object &apos; com.sun.star.comp.toolkit.AccessibleToolBoxItem
Dim oAccessibleButton As Object &apos; com.sun.star.comp.toolkit.AccessibleToolBoxItem
Dim oAccessibleParent As Object &apos; com.sun.star.comp.toolkit.AccessibleToolBoxItem
Dim oRect As Object &apos; Return value As com.sun.star.awt.Rectangle
Try:
Set oElement = _Element.GetSettings(True).getByIndex(_Index)
Set oRect = CreateUnoStruct(&quot;com.sun.star.awt.Rectangle&quot;)
If ScriptForge.SF_Utils._GetPropertyValue(oElement, &quot;IsVisible&quot;) Then
Set oAccessible = _Element.getRealInterface().getAccessibleContext() &apos; Toolbar level
Set oAccessibleParent = oAccessible.getAccessibleParent() &apos; Window level
Set oAccessibleButton = oAccessible.getAccessibleChild(_Index) &apos; Toolbar button level
&apos; The X and Y coordinates are always computed correctly when the toolbar is docked.
&apos; When the toolbar is floating, the Y ordinate may be overestimated with the height of
&apos; the tabbed bar or similar. However no mean has been found to get that height via code.
With oRect
.X = oAccessible.Location.X + oAccessibleButton.Location.X + oAccessibleParent.PosSize.X
.Y = oAccessible.Location.Y + oAccessibleButton.Location.Y + oAccessibleParent.PosSize.Y
.Height = oAccessibleButton.Size.Height
.Width = oAccessibleButton.Size.Width
End With
Else
With oRect
.X = -1 : .Y = -1 : .Height = 0 : .Width = 0
End With
End If
Finally:
Set _GetPosition = oRect
Exit Function
End Function &apos; SFWidgets.SF_ToolbarButton._GetPosition
REM -----------------------------------------------------------------------------
Public Sub _Initialize(ByRef poToolbarButton 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; poToolbarButton: the toolbar description as a ui._Toolbr object
Try:
&apos; Store the static description
With poToolbarButton
Set [_Parent] = .Toolbar
_Index = .Index
_Label = .Label
_AccessibleName = .AccessibleName
Set _Element = .Element
End With
&apos; Complement
_CommandURL = ScriptForge.SF_Utils._GetPropertyValue(_Element.getSettings(True).getByIndex(_Index), &quot;CommandURL&quot;)
Finally:
Exit Sub
End Sub &apos; SFWidgets.SF_ToolbarButton._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 sTooltip As String &apos; ToolTip text
Dim oElement As Object &apos; com.sun.star.ui.XUIElement
Dim cstThisSub As String
Const cstSubArgs = &quot;&quot;
cstThisSub = &quot;SFWidgets.ToolbarButton.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;Caption&quot;)
_PropertyGet = Iif(Len(_Label) &gt; 0, _Label, _AccessibleName)
Case UCase(&quot;Height&quot;)
If _Height &gt; 0 Then _PropertyGet = _Height else _PropertyGet = _GetPosition().Height
Case UCase(&quot;Index&quot;)
_PropertyGet = _Index
Case UCase(&quot;OnClick&quot;)
Set oElement = _Element.GetSettings(True).getByIndex(_Index)
_PropertyGet = ScriptForge.SF_Utils._GetPropertyValue(oElement, &quot;CommandURL&quot;)
Case UCase(&quot;Parent&quot;)
Set _PropertyGet = [_Parent]
Case UCase(&quot;TipText&quot;)
Set oElement = _Element.GetSettings(True).getByIndex(_Index)
sTooltip = ScriptForge.SF_Utils._GetPropertyValue(oElement, &quot;Tooltip&quot;)
If Len(sTooltip) &gt; 0 Then _PropertyGet = sTooltip Else _PropertyGet = Iif(Len(_Label) &gt; 0, _Label, _AccessibleName)
Case UCase(&quot;Visible&quot;)
Set oElement = _Element.GetSettings(True).getByIndex(_Index)
_PropertyGet = ScriptForge.SF_Utils._GetPropertyValue(oElement, &quot;IsVisible&quot;)
Case UCase(&quot;Width&quot;)
If _Width &gt; 0 Then _PropertyGet = _Width else _PropertyGet = _GetPosition().Width
Case UCase(&quot;X&quot;)
_PropertyGet = _GetPosition().X
Case UCase(&quot;Y&quot;)
_PropertyGet = _GetPosition().Y
Case Else
_PropertyGet = Null
End Select
Finally:
ScriptForge.SF_Utils._ExitFunction(cstThisSub)
Exit Function
Catch:
GoTo Finally
End Function &apos; SFWidgets.SF_ToolbarButton._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 oSettings As Object &apos; com.sun.star.container.XIndexAccess
Dim vProperties As Variant &apos; Array of PropertyValues
Dim bVisible As Boolean &apos; Actual Visible state
Dim cstThisSub As String
Const cstSubArgs = &quot;Value&quot;
Check:
If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
bSet = False
cstThisSub = &quot;SFWidgets.ToolbarButton.set&quot; &amp; psProperty
ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs)
Try:
bSet = True
Set oSettings = _Element.getSettings(True)
vProperties = oSettings.getByIndex(_Index)
Select Case UCase(psProperty)
Case UCase(&quot;OnClick&quot;)
If Not ScriptForge.SF_Utils._Validate(pvValue, &quot;Value&quot;, V_STRING) Then GoTo Catch
ScriptForge.SF_Utils._SetPropertyValue(vProperties, &quot;CommandURL&quot;, pvValue)
Case UCase(&quot;TipText&quot;)
If Not ScriptForge.SF_Utils._Validate(pvValue, &quot;Value&quot;, V_STRING) Then GoTo Catch
ScriptForge.SF_Utils._SetPropertyValue(vProperties, &quot;Tooltip&quot;, pvValue)
Case UCase(&quot;Visible&quot;)
If Not ScriptForge.SF_Utils._Validate(pvValue, &quot;Value&quot;, ScriptForge.V_BOOLEAN) Then GoTo Catch
ScriptForge.SF_Utils._SetPropertyValue(vProperties, &quot;IsVisible&quot;, pvValue)
Case Else
bSet = False
End Select
oSettings.replaceByIndex(_Index, vProperties)
_Element.setSettings(oSettings)
Finally:
_PropertySet = bSet
ScriptForge.SF_Utils._ExitFunction(cstThisSub)
Exit Function
Catch:
bSet = False
GoTo Finally
End Function &apos; SFWidgets.SF_ToolbarButton._PropertySet
REM -----------------------------------------------------------------------------
Private Function _Repr() As String
&apos;&apos;&apos; Convert the SF_ToolbarButton 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;[ToolbarButton]: &quot; &amp; Iif(Len(_Label) &gt; 0, _Label, _AccessibleName) &amp; &quot; - &quot; &amp; _CommandURL
End Function &apos; SFWidgets.SF_ToolbarButton._Repr
REM ============================================ END OF SFWIDGETS.SF_TOOLBARBUTTON
</script:module>