This commit is contained in:
Jane
2024-07-16 15:55:31 +08:00
parent 8f4ec86367
commit 29bc31ade5
12411 changed files with 8139339 additions and 0 deletions

View File

@@ -0,0 +1,598 @@
<?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_Menu" 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_Menu
&apos;&apos;&apos; ============
&apos;&apos;&apos; Display a menu in the menubar of a document or a form document.
&apos;&apos;&apos; After use, the menu will not be saved neither in the application settings, nor in the document.
&apos;&apos;&apos;
&apos;&apos;&apos; The menu will be displayed, as usual, when its header in the menubar is clicked.
&apos;&apos;&apos; When one of its items is selected, there are 3 alternative options:
&apos;&apos;&apos; - a UNO command (like &quot;.uno:About&quot;) is triggered
&apos;&apos;&apos; - a user script is run receiving a standard argument defined in this service
&apos;&apos;&apos; - one of above combined with a toggle of the status of the item
&apos;&apos;&apos;
&apos;&apos;&apos; The menu is described from top to bottom. Each menu item receives a numeric and a string identifier.
&apos;&apos;&apos;
&apos;&apos;&apos; Menu items are either:
&apos;&apos;&apos; - usual items
&apos;&apos;&apos; - checkboxes
&apos;&apos;&apos; - radio buttons
&apos;&apos;&apos; - a menu separator
&apos;&apos;&apos; Menu items can be decorated with icons and tooltips.
&apos;&apos;&apos;
&apos;&apos;&apos; Definitions:
&apos;&apos;&apos; SubmenuCharacter: the character or the character string that identifies how menus are cascading
&apos;&apos;&apos; Default = &quot;&gt;&quot;
&apos;&apos;&apos; Can be set when invoking the Menu service
&apos;&apos;&apos; ShortcutCharacter: the underline access key character
&apos;&apos;&apos; Default = &quot;~&quot;
&apos;&apos;&apos;
&apos;&apos;&apos; Menus and submenus
&apos;&apos;&apos; To create a menu with submenus, use the character defined in the
&apos;&apos;&apos; SubmenuCharacter property while creating the menu entry to define where it will be
&apos;&apos;&apos; placed. For instance, consider the following menu/submenu hierarchy.
&apos;&apos;&apos; Item A
&apos;&apos;&apos; Item B &gt; Item B.1
&apos;&apos;&apos; Item B.2
&apos;&apos;&apos; ------ (line separator)
&apos;&apos;&apos; Item C &gt; Item C.1 &gt; Item C.1.1
&apos;&apos;&apos; Item C.1.2
&apos;&apos;&apos; Item C &gt; Item C.2 &gt; Item C.2.1
&apos;&apos;&apos; Item C.2.2
&apos;&apos;&apos; Next code will create the menu/submenu hierarchy
&apos;&apos;&apos; With myMenu
&apos;&apos;&apos; .AddItem(&quot;Item A&quot;)
&apos;&apos;&apos; .AddItem(&quot;Item B&gt;Item B.1&quot;)
&apos;&apos;&apos; .AddItem(&quot;Item B&gt;Item B.2&quot;)
&apos;&apos;&apos; .AddItem(&quot;---&quot;)
&apos;&apos;&apos; .AddItem(&quot;Item C&gt;Item C.1&gt;Item C.1.1&quot;)
&apos;&apos;&apos; .AddItem(&quot;Item C&gt;Item C.1&gt;Item C.1.2&quot;)
&apos;&apos;&apos; .AddItem(&quot;Item C&gt;Item C.2&gt;Item C.2.1&quot;)
&apos;&apos;&apos; .AddItem(&quot;Item C&gt;Item C.2&gt;Item C.2.2&quot;)
&apos;&apos;&apos; End With
&apos;&apos;&apos;
&apos;&apos;&apos; Service invocation:
&apos;&apos;&apos; Dim ui As Object, oDoc As Object, myMenu As Object
&apos;&apos;&apos; Set ui = CreateScriptService(&quot;UI&quot;)
&apos;&apos;&apos; Set oDoc = ui.GetDocument(ThisComponent)
&apos;&apos;&apos; Set myMenu = oDoc.CreateMenu(&quot;My own menu&quot;)
&apos;&apos;&apos;
&apos;&apos;&apos; Detailed user documentation:
&apos;&apos;&apos; https://help.libreoffice.org/latest/en-US/text/sbasic/shared/03/SF_Menu.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 MENU
Private ServiceName As String
&apos; Menu descriptors
Private Component As Object &apos; the com.sun.star.lang.XComponent hosting the menu in its menubar
Private MenuBar As Object &apos; com.sun.star.awt.XMenuBar or stardiv.Toolkit.VCLXMenuBar
Private SubmenuChar As String &apos; Delimiter in menu trees
Private MenuHeader As String &apos; Header of the menu
Private MenuId As Integer &apos; Menu numeric identifier in the menubar
Private MenuPosition As Integer &apos; Position of the menu on the menubar &gt;= 1
Private PopupMenu As Object &apos; The underlying popup menu as a SF_PopupMenu object
REM ============================================================ MODULE CONSTANTS
Private Const _UnderlineAccessKeyChar = &quot;~&quot;
Private Const _DefaultSubmenuChar = &quot;&gt;&quot;
Private Const cstUnoPrefix = &quot;.uno:&quot;
Private Const cstScriptArg = &quot;:::&quot;
Private Const cstNormal = &quot;N&quot;
Private Const cstCheck = &quot;C&quot;
Private Const cstRadio = &quot;R&quot;
REM ====================================================== CONSTRUCTOR/DESTRUCTOR
REM -----------------------------------------------------------------------------
Private Sub Class_Initialize()
Set [Me] = Nothing
ObjectType = &quot;MENU&quot;
ServiceName = &quot;SFWidgets.Menu&quot;
Set Component = Nothing
Set MenuBar = Nothing
SubmenuChar = _DefaultSubmenuChar
MenuHeader = &quot;&quot;
MenuId = -1
MenuPosition = 0
Set PopupMenu = Nothing
End Sub &apos; SFWidgets.SF_Menu Constructor
REM -----------------------------------------------------------------------------
Private Sub Class_Terminate()
Call Class_Initialize()
End Sub &apos; SFWidgets.SF_Menu Destructor
REM -----------------------------------------------------------------------------
Public Function Dispose() As Variant
PopupMenu.Dispose()
Call Class_Terminate()
Set Dispose = Nothing
End Function &apos; SFWidgets.SF_Menu Explicit Destructor
REM ================================================================== PROPERTIES
REM -----------------------------------------------------------------------------
Property Get ShortcutCharacter() As Variant
&apos;&apos;&apos; The ShortcutCharacter property specifies character preceding the underline access key
ShortcutCharacter = _PropertyGet(&quot;ShortcutCharacter&quot;)
End Property &apos; SFWidgets.SF_Menu.ShortcutCharacter (get)
REM -----------------------------------------------------------------------------
Property Get SubmenuCharacter() As Variant
&apos;&apos;&apos; The SubmenuCharacter property specifies the character string indicating
&apos;&apos;&apos; a sub-menu in a popup menu item
SubmenuCharacter = _PropertyGet(&quot;SubmenuCharacter&quot;)
End Property &apos; SFWidgets.SF_Menu.SubmenuCharacter (get)
REM ===================================================================== METHODS
REM -----------------------------------------------------------------------------
Public Function AddCheckBox(Optional ByVal MenuItem As Variant _
, Optional ByVal Name As Variant _
, Optional ByVal Status As Variant _
, Optional ByVal Icon As Variant _
, Optional ByVal Tooltip As Variant _
, Optional ByVal Command As Variant _
, Optional ByVal Script As Variant _
) As Integer
&apos;&apos;&apos; Insert in the popup menu a new entry as a checkbox
&apos;&apos;&apos; Args:
&apos;&apos;&apos; MenuItem: The text to be displayed in the menu entry.
&apos;&apos;&apos; It determines also the hierarchy of the popup menu
&apos;&apos;&apos; It is made up of all the components (separated by the &quot;SubmenuCharacter&quot;) of the menu branch
&apos;&apos;&apos; Example: A&gt;B&gt;C means &quot;C&quot; is a new entry in submenu &quot;A =&gt; B =&gt;&quot;
&apos;&apos;&apos; If the last component is equal to the &quot;SeparatorCharacter&quot;, a line separator is inserted
&apos;&apos;&apos; Name: The name identifying the item. Default = the last component of MenuItem.
&apos;&apos;&apos; Status: when True the item is selected. Default = False
&apos;&apos;&apos; Icon: The path name of the icon to be displayed, without leading path separator
&apos;&apos;&apos; The icons are stored in one of the &lt;install folder&gt;/share/config/images_*.zip files
&apos;&apos;&apos; The exact file depends on the user options about the current icon set
&apos;&apos;&apos; Use the (normal) slash &quot;/&quot; as path separator
&apos;&apos;&apos; Example: &quot;cmd/sc_cut.png&quot;
&apos;&apos;&apos; Tooltip: The help text to be displayed as a tooltip
&apos;&apos;&apos; Command: A menu command like &quot;.uno:About&quot;. The validity of the command is not checked.
&apos;&apos;&apos; Script: a Basic or Python script (determined by its URI notation) to be run when the item is clicked
&apos;&apos;&apos; Read https://wiki.documentfoundation.org/Documentation/DevGuide/Scripting_Framework#Scripting_Framework_URI_Specification
&apos;&apos;&apos; Next string argument will be passed to the called script : a comma-separated string of 4 components:
&apos;&apos;&apos; - the menu header
&apos;&apos;&apos; - the name of the clicked menu item
&apos;&apos;&apos; - the numeric identifier of the clicked menu item
&apos;&apos;&apos; - &quot;1&quot; when the status is &quot;checked&quot;, otherwise &quot;0&quot;
&apos;&apos;&apos; Arguments Command and Script are mutually exclusive.
&apos;&apos;&apos; Returns:
&apos;&apos;&apos; The numeric identification of the newly inserted item
&apos;&apos;&apos; Examples:
&apos;&apos;&apos; Dim iId As Integer
&apos;&apos;&apos; iId = myMenu.AddCheckBox(&quot;Menu top&gt;Checkbox item&quot;, Status := True, Command := &quot;Bold&quot;)
Dim iId As Integer &apos; Return value
Dim sCommand As String &apos; Alias of either Command or Script
Const cstThisSub = &quot;SFWidgets.Menu.AddCheckBox&quot;
Const cstSubArgs = &quot;MenuItem, [Name=&quot;&quot;&quot;&quot;], [Status=False], [Icon=&quot;&quot;&quot;&quot;], [Tooltip=&quot;&quot;&quot;&quot;], [Command=&quot;&quot;&quot;&quot;], [Script=&quot;&quot;&quot;&quot;]&quot;
If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
iId = 0
Check:
If IsMissing(Name) Or IsEmpty(Name) Then Name = &quot;&quot;
If IsMissing(Status) Or IsEmpty(Status) Then Status = False
If IsMissing(Icon) Or IsEmpty(Icon) Then Icon = &quot;&quot;
If IsMissing(Tooltip) Or IsEmpty(Tooltip) Then Tooltip = &quot;&quot;
If IsMissing(Command) Or IsEmpty(Command) Then Command = &quot;&quot;
If IsMissing(Script) Or IsEmpty(Script) Then Script = &quot;&quot;
If ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
If Not ScriptForge.SF_Utils._Validate(MenuItem, &quot;MenuItem&quot;, V_STRING) Then GoTo Catch
If Not ScriptForge.SF_Utils._Validate(Name, &quot;Name&quot;, V_STRING) Then GoTo Catch
If Not ScriptForge.SF_Utils._Validate(Status, &quot;Status&quot;, ScriptForge.V_BOOLEAN) Then GoTo Catch
If Not ScriptForge.SF_Utils._Validate(Icon, &quot;Icon&quot;, V_STRING) Then GoTo Catch
If Not ScriptForge.SF_Utils._Validate(Tooltip, &quot;Tooltip&quot;, V_STRING) Then GoTo Catch
If Not ScriptForge.SF_Utils._Validate(Command, &quot;Command&quot;, V_STRING) Then GoTo Catch
If Not ScriptForge.SF_Utils._Validate(Script, &quot;Script&quot;, V_STRING) Then GoTo Catch
End If
If Len(Command) &gt; 0 Then
If Left(Command, Len(cstUnoPrefix)) = cstUnoPrefix Then sCommand = Command Else sCommand = cstUnoPrefix &amp; Command
Else
sCommand = Script &amp; cstScriptArg &amp; MenuHeader
End If
Try:
iId = PopupMenu._AddItem(MenuItem, Name, cstCheck, Status, Icon, Tooltip, sCommand)
Finally:
AddCheckBox = iId
ScriptForge.SF_Utils._ExitFunction(cstThisSub)
Exit Function
Catch:
GoTo Finally
End Function &apos; SFWidgets.SF_Menu.AddCheckBox
REM -----------------------------------------------------------------------------
Public Function AddItem(Optional ByVal MenuItem As Variant _
, Optional ByVal Name As Variant _
, Optional ByVal Icon As Variant _
, Optional ByVal Tooltip As Variant _
, Optional ByVal Command As Variant _
, Optional ByVal Script As Variant _
) As Integer
&apos;&apos;&apos; Insert in the popup menu a new entry
&apos;&apos;&apos; Args:
&apos;&apos;&apos; MenuItem: The text to be displayed in the menu entry.
&apos;&apos;&apos; It determines also the hierarchy of the popup menu
&apos;&apos;&apos; It is made up of all the components (separated by the &quot;SubmenuCharacter&quot;) of the menu branch
&apos;&apos;&apos; Example: A&gt;B&gt;C means &quot;C&quot; is a new entry in submenu &quot;A =&gt; B =&gt;&quot;
&apos;&apos;&apos; If the last component is equal to &quot;---&quot;, a line separator is inserted and all other arguments are ignored
&apos;&apos;&apos; Name: The name identifying the item. Default = the last component of MenuItem.
&apos;&apos;&apos; Icon: The path name of the icon to be displayed, without leading path separator
&apos;&apos;&apos; The icons are stored in one of the &lt;install folder&gt;/share/config/images_*.zip files
&apos;&apos;&apos; The exact file depends on the user options about the current icon set
&apos;&apos;&apos; Use the (normal) slash &quot;/&quot; as path separator
&apos;&apos;&apos; Example: &quot;cmd/sc_cut.png&quot;
&apos;&apos;&apos; Tooltip: The help text to be displayed as a tooltip
&apos;&apos;&apos; Command: A menu command like &quot;.uno:About&quot;. The validity of the command is not checked.
&apos;&apos;&apos; Script: a Basic or Python script (determined by its URI notation) to be run when the item is clicked
&apos;&apos;&apos; Read https://wiki.documentfoundation.org/Documentation/DevGuide/Scripting_Framework#Scripting_Framework_URI_Specification
&apos;&apos;&apos; Next string argument will be passed to the called script : a comma-separated string of 4 components:
&apos;&apos;&apos; - the menu header
&apos;&apos;&apos; - the name of the clicked menu item
&apos;&apos;&apos; - the numeric identifier of the clicked menu item
&apos;&apos;&apos; - &quot;0&quot;
&apos;&apos;&apos; Arguments Command and Script are mutually exclusive.
&apos;&apos;&apos; Returns:
&apos;&apos;&apos; The numeric identification of the newly inserted item
&apos;&apos;&apos; Examples:
&apos;&apos;&apos; Dim iId1 As Integer, iId2 As Integer
&apos;&apos;&apos; iId1 = myMenu.AddItem(&quot;Menu top&gt;Normal item 1&quot;, Icon := &quot;cmd.sc_cut.png&quot;, Command := &quot;About&quot;)
&apos;&apos;&apos; iId2 = myMenu.AddItem(&quot;Menu top&gt;Normal item 2&quot;, Script := &quot;vnd.sun.star.script:myLib.Module1.ThisSub?language=Basic&amp;location=document&quot;)
Dim iId As Integer &apos; Return value
Dim sCommand As String &apos; Alias of either Command or Script
Const cstThisSub = &quot;SFWidgets.Menu.AddItem&quot;
Const cstSubArgs = &quot;MenuItem, [Name=&quot;&quot;&quot;&quot;], [Icon=&quot;&quot;&quot;&quot;], [Tooltip=&quot;&quot;&quot;&quot;], [Command=&quot;&quot;&quot;&quot;], [Script=&quot;&quot;&quot;&quot;]&quot;
If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
iId = 0
Check:
If IsMissing(Name) Or IsEmpty(Name) Then Name = &quot;&quot;
If IsMissing(Icon) Or IsEmpty(Icon) Then Icon = &quot;&quot;
If IsMissing(Tooltip) Or IsEmpty(Tooltip) Then Tooltip = &quot;&quot;
If IsMissing(Command) Or IsEmpty(Command) Then Command = &quot;&quot;
If IsMissing(Script) Or IsEmpty(Script) Then Script = &quot;&quot;
If ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
If Not ScriptForge.SF_Utils._Validate(MenuItem, &quot;MenuItem&quot;, V_STRING) Then GoTo Catch
If Not ScriptForge.SF_Utils._Validate(Name, &quot;Name&quot;, V_STRING) Then GoTo Catch
If Not ScriptForge.SF_Utils._Validate(Icon, &quot;Icon&quot;, V_STRING) Then GoTo Catch
If Not ScriptForge.SF_Utils._Validate(Tooltip, &quot;Tooltip&quot;, V_STRING) Then GoTo Catch
If Not ScriptForge.SF_Utils._Validate(Command, &quot;Command&quot;, V_STRING) Then GoTo Catch
If Not ScriptForge.SF_Utils._Validate(Script, &quot;Script&quot;, V_STRING) Then GoTo Catch
End If
If Len(Command) &gt; 0 Then
If Left(Command, Len(cstUnoPrefix)) = cstUnoPrefix Then sCommand = Command Else sCommand = cstUnoPrefix &amp; Command
Else
sCommand = Script &amp; cstScriptArg &amp; MenuHeader
End If
Try:
iId = PopupMenu._AddItem(MenuItem, Name, cstNormal, False, Icon, Tooltip, sCommand)
Finally:
AddItem = iId
ScriptForge.SF_Utils._ExitFunction(cstThisSub)
Exit Function
Catch:
GoTo Finally
End Function &apos; SFWidgets.SF_Menu.AddItem
REM -----------------------------------------------------------------------------
Public Function AddRadioButton(Optional ByVal MenuItem As Variant _
, Optional ByVal Name As Variant _
, Optional ByVal Status As Variant _
, Optional ByVal Icon As Variant _
, Optional ByVal Tooltip As Variant _
, Optional ByVal Command As Variant _
, Optional ByVal Script As Variant _
) As Integer
&apos;&apos;&apos; Insert in the popup menu a new entry as a radio button
&apos;&apos;&apos; Args:
&apos;&apos;&apos; MenuItem: The text to be displayed in the menu entry.
&apos;&apos;&apos; It determines also the hieAddCheckBoxrarchy of the popup menu
&apos;&apos;&apos; It is made up of all the components (separated by the &quot;SubmenuCharacter&quot;) of the menu branch
&apos;&apos;&apos; Example: A&gt;B&gt;C means &quot;C&quot; is a new entry in submenu &quot;A =&gt; B =&gt;&quot;
&apos;&apos;&apos; If the last component is equal to the &quot;SeparatorCharacter&quot;, a line separator is inserted
&apos;&apos;&apos; Name: The name identifying the item. Default = the last component of MenuItem.
&apos;&apos;&apos; Status: when True the item is selected. Default = False
&apos;&apos;&apos; Icon: The path name of the icon to be displayed, without leading path separator
&apos;&apos;&apos; The icons are stored in one of the &lt;install folder&gt;/share/config/images_*.zip files
&apos;&apos;&apos; The exact file depends on the user options about the current icon set
&apos;&apos;&apos; Use the (normal) slash &quot;/&quot; as path separator
&apos;&apos;&apos; Example: &quot;cmd/sc_cut.png&quot;
&apos;&apos;&apos; Tooltip: The help text to be displayed as a tooltip
&apos;&apos;&apos; Command: A menu command like &quot;.uno:About&quot;. The validity of the command is not checked.
&apos;&apos;&apos; Script: a Basic or Python script (determined by its URI notation) to be run when the item is clicked
&apos;&apos;&apos; Read https://wiki.documentfoundation.org/Documentation/DevGuide/Scripting_Framework#Scripting_Framework_URI_Specification
&apos;&apos;&apos; Next string argument will be passed to the called script : a comma-separated string of 4 components:
&apos;&apos;&apos; - the menu header
&apos;&apos;&apos; - the name of the clicked menu item
&apos;&apos;&apos; - the numeric identifier of theclicked menu item
&apos;&apos;&apos; - &quot;1&quot; when the status is &quot;checked&quot;, otherwise &quot;0&quot;
&apos;&apos;&apos; Arguments Command and Script are mutually exclusive.
&apos;&apos;&apos; Returns:
&apos;&apos;&apos; The numeric identification of the newly inserted item
&apos;&apos;&apos; Examples:
&apos;&apos;&apos; Dim iId As Integer
&apos;&apos;&apos; iId = myMenu.AddRadioButton(&quot;Menu top&gt;Radio item&quot;, Status := True, Command := &quot;Bold&quot;)
Dim iId As Integer &apos; Return value
Dim sCommand As String &apos; Alias of either Command or Script
Const cstThisSub = &quot;SFWidgets.Menu.AddRadioButton&quot;
Const cstSubArgs = &quot;MenuItem, [Name=&quot;&quot;&quot;&quot;], [Status=False], [Icon=&quot;&quot;&quot;&quot;], [Tooltip=&quot;&quot;&quot;&quot;], [Command=&quot;&quot;&quot;&quot;], [Script=&quot;&quot;&quot;&quot;]&quot;
If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
iId = 0
Check:
If IsMissing(Name) Or IsEmpty(Name) Then Name = &quot;&quot;
If IsMissing(Status) Or IsEmpty(Status) Then Status = False
If IsMissing(Icon) Or IsEmpty(Icon) Then Icon = &quot;&quot;
If IsMissing(Tooltip) Or IsEmpty(Tooltip) Then Tooltip = &quot;&quot;
If IsMissing(Command) Or IsEmpty(Command) Then Command = &quot;&quot;
If IsMissing(Script) Or IsEmpty(Script) Then Script = &quot;&quot;
If ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
If Not ScriptForge.SF_Utils._Validate(MenuItem, &quot;MenuItem&quot;, V_STRING) Then GoTo Catch
If Not ScriptForge.SF_Utils._Validate(Name, &quot;Name&quot;, V_STRING) Then GoTo Catch
If Not ScriptForge.SF_Utils._Validate(Status, &quot;Status&quot;, ScriptForge.V_BOOLEAN) Then GoTo Catch
If Not ScriptForge.SF_Utils._Validate(Icon, &quot;Icon&quot;, V_STRING) Then GoTo Catch
If Not ScriptForge.SF_Utils._Validate(Tooltip, &quot;Tooltip&quot;, V_STRING) Then GoTo Catch
If Not ScriptForge.SF_Utils._Validate(Command, &quot;Command&quot;, V_STRING) Then GoTo Catch
If Not ScriptForge.SF_Utils._Validate(Script, &quot;Script&quot;, V_STRING) Then GoTo Catch
End If
If Len(Command) &gt; 0 Then
If Left(Command, Len(cstUnoPrefix)) = cstUnoPrefix Then sCommand = Command Else sCommand = cstUnoPrefix &amp; Command
Else
sCommand = Script &amp; cstScriptArg &amp; MenuHeader
End If
Try:
iId = PopupMenu._AddItem(MenuItem, Name, cstRadio, Status, Icon, Tooltip, sCommand)
Finally:
AddRadioButton = iId
ScriptForge.SF_Utils._ExitFunction(cstThisSub)
Exit Function
Catch:
GoTo Finally
End Function &apos; SFWidgets.SF_Menu.AddRadioButton
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; myModel.GetProperty(&quot;MyProperty&quot;)
Const cstThisSub = &quot;SFWidgets.Menu.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_Menu.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;AddCheckBox&quot; _
, &quot;AddItem&quot; _
, &quot;AddRadioButton&quot; _
)
End Function &apos; SFWidgets.SF_Menu.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;ShortcutCharacter&quot; _
, &quot;SubmenuCharacter&quot; _
)
End Function &apos; SFWidgets.SF_Menu.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.Menu.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_Menu.SetProperty
REM =========================================================== PRIVATE FUNCTIONS
REM -----------------------------------------------------------------------------
Public Sub _Initialize(ByRef poComponent As Object _
, psMenuHeader As String _
, psBefore As String _
, piBefore As Integer _
, psSubmenuChar As String _
)
&apos;&apos;&apos; Complete the object creation process:
&apos;&apos;&apos; - Initialize the internal properties
&apos;&apos;&apos; - Initialize the menubar
&apos;&apos;&apos; - Determine the position and the internal id of the new menu
&apos;&apos;&apos; - Create the menu and its attached popup menu
&apos;&apos;&apos; Args:
&apos;&apos;&apos; poComponent: the parent component where the menubar is to be searched for
&apos;&apos;&apos; psMenuHeader: the header of the new menu. May or not contain a tilde &quot;~&quot;
&apos;&apos;&apos; psBefore, piBefore: the menu before which to create the new menu, as a string or as a number
&apos;&apos;&apos; psSubmenuChar: the submenus separator
Dim oLayout As Object &apos; com.sun.star.comp.framework.LayoutManager
Dim sName As String &apos; Menu name
Dim iMenuId As Integer &apos; Menu identifier
Dim oWindow As Object &apos; ui.Window type
Dim oUi As Object : Set oUi = ScriptForge.SF_Services.CreateScriptService(&quot;ScriptForge.UI&quot;)
Dim i As Integer
Const cstTilde = &quot;~&quot;
Check:
&apos; How does the window look on top of which a menu is requested ?
Set oWindow = oUi._IdentifyWindow(poComponent)
With oWindow
If Not IsNull(.Frame) Then Set oLayout = .Frame.LayoutManager Else GoTo Finally
End With
Try:
&apos; Initialize the menubar
Set MenuBar = oLayout.getElement(&quot;private:resource/menubar/menubar&quot;).XMenuBar
&apos; Determine the new menu identifier and its position
&apos; Identifier = largest current identifier + 1
MenuHeader = psMenuHeader
With MenuBar
For i = 0 To .ItemCount - 1
iMenuId = .getItemId(i)
If iMenuId &gt;= MenuId Then MenuId = iMenuId + 1
If piBefore &gt; 0 And piBefore = i + 1 Then
MenuPosition = piBefore
Else
sName = .getItemText(iMenuId)
If sName = psBefore Or Replace(sName, cstTilde, &quot;&quot;) = psBefore Then MenuPosition = i + 1
End If
Next i
If MenuPosition = 0 Then MenuPosition = .ItemCount + 1
End With
&apos; Store the submenu character
If Len(psSubmenuChar) &gt; 0 Then SubmenuChar = psSubmenuChar
&apos; Create the menu and the attached top popup menu
MenuBar.insertItem(MenuId, MenuHeader, 0, MenuPosition - 1)
PopupMenu = SFWidgets.SF_Register._NewPopupMenu(Array(Nothing, 0, 0, SubmenuChar))
PopupMenu.MenubarMenu = True &apos; Special indicator for menus depending on menubar
MenuBar.setPopupMenu(MenuId, PopupMenu.MenuRoot)
&apos; Initialize the listener on the top branch
SFWidgets.SF_MenuListener.SetMenuListener(PopupMenu.MenuRoot)
Finally:
Exit Sub
End Sub &apos; SFWidgets.SF_Menu._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 cstThisSub As String
Const cstSubArgs = &quot;&quot;
cstThisSub = &quot;SFWidgets.Menu.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;ShortcutCharacter&quot;)
_PropertyGet = _UnderlineAccessKeyChar
Case UCase(&quot;SubmenuCharacter&quot;)
_PropertyGet = SubmenuChar
Case Else
_PropertyGet = Null
End Select
Finally:
ScriptForge.SF_Utils._ExitFunction(cstThisSub)
Exit Function
Catch:
GoTo Finally
End Function &apos; SFWidgets.SF_Menu._PropertyGet
REM -----------------------------------------------------------------------------
Private Function _Repr() As String
&apos;&apos;&apos; Convert the SF_Menu instance to a readable string, typically for debugging purposes (DebugPrint ...)
&apos;&apos;&apos; Args:
&apos;&apos;&apos; Return:
&apos;&apos;&apos; &quot;[Menu]: Name, Type (dialogname)
_Repr = &quot;[Menu]: &quot; &amp; SF_String.Represent(PopupMenu.MenuTree.Keys()) &amp; &quot;, &quot; &amp; SF_String.Represent(PopupMenu.MenuIdentification.Items())
End Function &apos; SFWidgets.SF_Menu._Repr
REM ============================================ END OF SFWIDGETS.SF_MENU
</script:module>

View File

@@ -0,0 +1,128 @@
<?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_MenuListener" 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 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_MenuListener
&apos;&apos;&apos; ===============
&apos;&apos;&apos; The current module is dedicated to the management of menu events + listeners, triggered by user actions,
&apos;&apos;&apos; which cannot be defined with the Basic IDE
&apos;&apos;&apos;
&apos;&apos;&apos; Concerned listeners:
&apos;&apos;&apos; com.sun.star.awt.XMenuListener
&apos;&apos;&apos; allowing a user to select a menu command in user menus preset in the menubar
&apos;&apos;&apos;
&apos;&apos;&apos; The described events/listeners are processed by UNO listeners
&apos;&apos;&apos;
&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&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 ============================================================= PRIVATE MEMBERS
Dim MenuListener As Object &apos; com.sun.star.awt.XMenuListener
REM =========================================================== PRIVATE CONSTANTS
Private Const _MenuListenerPrefix = &quot;_SFMENU_&quot;
Private Const _MenuListener = &quot;com.sun.star.awt.XMenuListener&quot;
Private Const cstUnoPrefix = &quot;.uno:&quot;
Private Const cstScriptArg = &quot;:::&quot;
REM ================================================================== EXCEPTIONS
REM ============================================================== PUBLIC METHODS
REM -----------------------------------------------------------------------------
Public Sub SetMenuListener(poSubmenu As Object)
&apos;&apos;&apos; Arm a menu listener on a submenu
&apos;&apos;&apos; Args:
&apos;&apos;&apos; poSubmenu: the targeted submenu
Try:
If IsNull(MenuListener) Then Set MenuListener = CreateUnoListener(_MenuListenerPrefix, _MenuListener)
poSubmenu.addMenuListener(MenuListener)
Finally:
Exit Sub
End Sub &apos; SFWidgets.SF_MenuListener.SetMenuListener
REM ============================================================= PRIVATE METHODS
REM -----------------------------------------------------------------------------
Sub _SFMENU_itemSelected(Optional poEvent As Object) &apos; com.sun.star.awt.MenuEvent
&apos;&apos;&apos; Execute the command or the script associated with the actually selected item
&apos;&apos;&apos; When a script, next argument is provided:
&apos;&apos;&apos; a comma-separated string with 4 components
&apos;&apos;&apos; - the menu header
&apos;&apos;&apos; - the name of the selected menu entry (without tilde &quot;~&quot;)
&apos;&apos;&apos; - the numeric identifier of the selected menu entry
&apos;&apos;&apos; - the new status of the selected menu entry (&quot;0&quot; or &quot;1&quot;). Always &quot;0&quot; for usual items.
Dim iMenuId As Integer
Dim oMenu As Object &apos; stardiv.Toolkit.VCLXPopupMenu
Dim sCommand As String &apos; Command associated with menu entry
Dim bType As Boolean &apos; True when status is meaningful: item is radio button or checkbox
Dim bStatus As Boolean &apos; Status of the menu item, always False for normal items
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
On Local Error GoTo Catch &apos; Avoid stopping event scripts
Try:
iMenuId = poEvent.MenuId
oMenu = poEvent.Source
With oMenu
&apos; Collect command (script or menu command) and status radiobuttons and checkboxes
sCommand = .getCommand(iMenuId)
bStatus = .isItemChecked(iMenuId)
End With
If Len(sCommand) &gt; 0 Then
Set oFrame = StarDesktop.ActiveFrame &apos; A menu has been clicked necessarily in the current window
If Left(sCommand, Len(cstUnoPrefix)) = 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
vScript = Split(sCommand, cstScriptArg)
oSession._ExecuteScript(vScript(0), vScript(1) &amp; &quot;,&quot; &amp; Iif(bStatus, &quot;1&quot;, &quot;0&quot;)) &apos; Return value is ignored
End If
End If
Finally:
Exit Sub
Catch:
GoTo Finally
End Sub &apos; SFWidgets.SF_MenuListener._SFMENU_itemSelected
REM -----------------------------------------------------------------------------
Sub _SFMENU_itemHighlighted(Optional poEvent As Object) &apos; com.sun.star.awt.MenuEvent
Exit Sub
End Sub &apos; SFWidgets.SF_MenuListener._SFMENU_itemHighlighted
Sub _SFMENU_itemActivated(Optional poEvent As Object) &apos; com.sun.star.awt.MenuEvent
Exit Sub
End Sub &apos; SFWidgets.SF_MenuListener._SFMENU_itemActivated
Sub _SFMENU_itemDeactivated(Optional poEvent As Object) &apos; com.sun.star.awt.MenuEvent
Exit Sub
End Sub &apos; SFWidgets.SF_MenuListener._SFMENU_itemDeactivated
Sub _SFMENU_disposing(Optional poEvent As Object) &apos; com.sun.star.awt.MenuEvent
Exit Sub
End Sub &apos; SFWidgets.SF_MenuListener._SFMENU_disposing
REM ============================================ END OF SFDIALOGS.SF_DIALOGLISTENER
</script:module>

View File

@@ -0,0 +1,801 @@
<?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_PopupMenu" 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_PopupMenu
&apos;&apos;&apos; ============
&apos;&apos;&apos; Display a popup menu anywhere and any time
&apos;&apos;&apos;
&apos;&apos;&apos; A popup menu is usually triggered by a mouse action (typically a right-click) on a dialog, a form
&apos;&apos;&apos; or one of their controls. In this case the menu will be displayed below the clicked area.
&apos;&apos;&apos; When triggered by other events, including in the normal flow of a user script, the script should
&apos;&apos;&apos; provide the coordinates of the topleft edge of the menu versus the actual component.
&apos;&apos;&apos;
&apos;&apos;&apos; The menu is described from top to bottom. Each menu item receives a numeric and a string identifier.
&apos;&apos;&apos; The Execute() method returns the item selected by the user.
&apos;&apos;&apos;
&apos;&apos;&apos; Menu items are either:
&apos;&apos;&apos; - usual items
&apos;&apos;&apos; - checkboxes
&apos;&apos;&apos; - radio buttons
&apos;&apos;&apos; - a menu separator
&apos;&apos;&apos; Menu items can be decorated with icons and tooltips.
&apos;&apos;&apos;
&apos;&apos;&apos; Definitions:
&apos;&apos;&apos; SubmenuCharacter: the character or the character string that identifies how menus are cascading
&apos;&apos;&apos; Default = &quot;&gt;&quot;
&apos;&apos;&apos; Can be set when invoking the PopupMenu service
&apos;&apos;&apos; ShortcutCharacter: the underline access key character
&apos;&apos;&apos; Default = &quot;~&quot;
&apos;&apos;&apos;
&apos;&apos;&apos; Service invocation:
&apos;&apos;&apos; Sub OpenMenu(Optional poMouseEvent As Object)
&apos;&apos;&apos; Dim myMenu As Object
&apos;&apos;&apos; Set myMenu = CreateScriptService(&quot;SFWidgets.PopupMenu&quot;, poMouseEvent, , , &quot;&gt;&gt;&quot;) &apos; Usual case
&apos;&apos;&apos; &apos; or
&apos;&apos;&apos; Set myMenu = CreateScriptService(&quot;SFWidgets.PopupMenu&quot;, , X, Y, &quot; | &quot;) &apos; Use X and Y coordinates to place the menu
&apos;&apos;&apos;
&apos;&apos;&apos; Menus and submenus
&apos;&apos;&apos; To create a popup menu with submenus, use the character defined in the
&apos;&apos;&apos; SubmenuCharacter property while creating the menu entry to define where it will be
&apos;&apos;&apos; placed. For instance, consider the following menu/submenu hierarchy.
&apos;&apos;&apos; Item A
&apos;&apos;&apos; Item B &gt; Item B.1
&apos;&apos;&apos; Item B.2
&apos;&apos;&apos; ------ (line separator)
&apos;&apos;&apos; Item C &gt; Item C.1 &gt; Item C.1.1
&apos;&apos;&apos; Item C.1.2
&apos;&apos;&apos; Item C &gt; Item C.2 &gt; Item C.2.1
&apos;&apos;&apos; Item C.2.2
&apos;&apos;&apos; Next code will create the menu/submenu hierarchy
&apos;&apos;&apos; With myMenu
&apos;&apos;&apos; .AddItem(&quot;Item A&quot;)
&apos;&apos;&apos; .AddItem(&quot;Item B&gt;Item B.1&quot;)
&apos;&apos;&apos; .AddItem(&quot;Item B&gt;Item B.2&quot;)
&apos;&apos;&apos; .AddItem(&quot;---&quot;)
&apos;&apos;&apos; .AddItem(&quot;Item C&gt;Item C.1&gt;Item C.1.1&quot;)
&apos;&apos;&apos; .AddItem(&quot;Item C&gt;Item C.1&gt;Item C.1.2&quot;)
&apos;&apos;&apos; .AddItem(&quot;Item C&gt;Item C.2&gt;Item C.2.1&quot;)
&apos;&apos;&apos; .AddItem(&quot;Item C&gt;Item C.2&gt;Item C.2.2&quot;)
&apos;&apos;&apos; End With
&apos;&apos;&apos;
&apos;&apos;&apos; Example 1: simulate a subset of the View menu in the menubar of the Basic IDE
&apos;&apos;&apos; Sub OpenMenu(Optional poMouseEvent As Object)
&apos;&apos;&apos; Dim myMenu As Object, vChoice As Variant
&apos;&apos;&apos; Set myMenu = CreateScriptService(&quot;SFWidgets.PopupMenu&quot;, poMouseEvent)
&apos;&apos;&apos; With myMenu
&apos;&apos;&apos; .AddCheckBox(&quot;View&gt;Toolbars&gt;Dialog&quot;)
&apos;&apos;&apos; .AddCheckBox(&quot;View&gt;Toolbars&gt;Find&quot;, Status := True)
&apos;&apos;&apos; .AddCheckBox(&quot;View&gt;Status Bar&quot;, Status := True)
&apos;&apos;&apos; .AddItem(&quot;View&gt;Full Screen&quot;, Name := &quot;FULLSCREEN&quot;)
&apos;&apos;&apos; vChoice = .Execute(False) &apos; When 1st checkbox is clicked, return &quot;Dialog&quot;
&apos;&apos;&apos; &apos; When last item is clicked, return &quot;FULLSCREEN&quot;
&apos;&apos;&apos; .Dispose()
&apos;&apos;&apos; End With
&apos;&apos;&apos;
&apos;&apos;&apos; Example 2: jump to another sheet of a Calc document
&apos;&apos;&apos; &apos; Link next Sub to the &quot;Mouse button released&quot; event of a form control of a Calc sheet
&apos;&apos;&apos; Sub JumpToSheet(Optional poEvent As Object)
&apos;&apos;&apos; Dim myMenu As Object, sChoice As String, myDoc As Object, vSheets As Variant, sSheet As String
&apos;&apos;&apos; Set myMenu = CreateScriptService(&quot;SFWidgets.PopupMenu&quot;, poEvent)
&apos;&apos;&apos; Set myDoc = CreateScriptService(&quot;Calc&quot;, ThisComponent)
&apos;&apos;&apos; vSheets = myDoc.Sheets
&apos;&apos;&apos; For Each sSheet In vSheets
&apos;&apos;&apos; myMenu.AddItem(sSheet)
&apos;&apos;&apos; Next sSheet
&apos;&apos;&apos; sChoice = myMenu.Execute(False) &apos; Return sheet name, not sheet index
&apos;&apos;&apos; If sChoice &lt;&gt; &quot;&quot; Then myDoc.Activate(sChoice)
&apos;&apos;&apos; myDoc.Dispose()
&apos;&apos;&apos; myMenu.Dispose()
&apos;&apos;&apos; End Sub
&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/sf_popupmenu.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 POPUPMENU
Private ServiceName As String
&apos; Menu descriptors
Private MenuTree As Variant &apos; Dictionary treename - XPopupMenu pair
Private MenuIdentification As Variant &apos; Dictionary item ID - item name
Private SubmenuChar As String &apos; Delimiter in menu trees
Private MenuRoot As Object &apos; stardiv.vcl.PopupMenu or com.sun.star.awt.XPopupMenu
Private LastItem As Integer &apos; Every item has its entry number. This is the last one
Private Rectangle As Object &apos; com.sun.star.awt.Rectangle
Private PeerWindow As Object &apos; com.sun.star.awt.XWindowPeer
Private MenubarMenu As Boolean &apos; When True, the actual popup menu depends on a menubar item
REM ============================================================ MODULE CONSTANTS
Private Const _UnderlineAccessKeyChar = &quot;~&quot;
Private Const _DefaultSubmenuChar = &quot;&gt;&quot;
Private Const _SeparatorChar = &quot;---&quot;
Private Const _IconsDirectory = &quot;private:graphicrepository/&quot; &apos; Refers to &lt;install folder&gt;/share/config/images_*.zip.
Private Const cstUnoPrefix = &quot;.uno:&quot;
Private Const cstNormal = &quot;N&quot;
Private Const cstCheck = &quot;C&quot;
Private Const cstRadio = &quot;R&quot;
REM ====================================================== CONSTRUCTOR/DESTRUCTOR
REM -----------------------------------------------------------------------------
Private Sub Class_Initialize()
Set [Me] = Nothing
ObjectType = &quot;POPUPMENU&quot;
ServiceName = &quot;SFWidgets.PopupMenu&quot;
Set MenuTree = Nothing
Set MenuIdentification = Nothing
SubmenuChar = _DefaultSubmenuChar
Set MenuRoot = Nothing
LastItem = 0
Set Rectangle = Nothing
Set PeerWindow = Nothing
MenubarMenu = False
End Sub &apos; SFWidgets.SF_PopupMenu Constructor
REM -----------------------------------------------------------------------------
Private Sub Class_Terminate()
Call Class_Initialize()
End Sub &apos; SFWidgets.SF_PopupMenu Destructor
REM -----------------------------------------------------------------------------
Public Function Dispose() As Variant
If Not IsNull(MenuTree) Then Set MenuTree = MenuTree.Dispose()
If Not IsNull(MenuIdentification) Then Set MenuIdentification = MenuIdentification.Dispose()
Call Class_Terminate()
Set Dispose = Nothing
End Function &apos; SFWidgets.SF_PopupMenu Explicit Destructor
REM ================================================================== PROPERTIES
REM -----------------------------------------------------------------------------
Property Get ShortcutCharacter() As Variant
&apos;&apos;&apos; The ShortcutCharacter property specifies character preceding the underline access key
ShortcutCharacter = _PropertyGet(&quot;ShortcutCharacter&quot;)
End Property &apos; SFWidgets.SF_PopupMenu.ShortcutCharacter (get)
REM -----------------------------------------------------------------------------
Property Get SubmenuCharacter() As Variant
&apos;&apos;&apos; The SubmenuCharacter property specifies the character string indicating
&apos;&apos;&apos; a sub-menu in a popup menu item
SubmenuCharacter = _PropertyGet(&quot;SubmenuCharacter&quot;)
End Property &apos; SFWidgets.SF_PopupMenu.SubmenuCharacter (get)
REM ===================================================================== METHODS
REM -----------------------------------------------------------------------------
Public Function AddCheckBox(Optional ByVal MenuItem As Variant _
, Optional ByVal Name As Variant _
, Optional ByVal Status As Variant _
, Optional ByVal Icon As Variant _
, Optional ByVal Tooltip As Variant _
) As Integer
&apos;&apos;&apos; Insert in the popup menu a new entry
&apos;&apos;&apos; Args:
&apos;&apos;&apos; MenuItem: The text to be displayed in the menu entry.
&apos;&apos;&apos; It determines also the hierarchy of the popup menu
&apos;&apos;&apos; It is made up of all the components (separated by the &quot;SubmenuCharacter&quot;) of the menu branch
&apos;&apos;&apos; Example: A&gt;B&gt;C means &quot;C&quot; is a new entry in submenu &quot;A =&gt; B =&gt;&quot;
&apos;&apos;&apos; If the last component is equal to the &quot;SeparatorCharacter&quot;, a line separator is inserted
&apos;&apos;&apos; Name: The name to be returned by the Execute() method if this item is clicked
&apos;&apos;&apos; Default = the last component of MenuItem
&apos;&apos;&apos; Status: when True the item is selected. Default = False
&apos;&apos;&apos; Icon: The path name of the icon to be displayed, without leading path separator
&apos;&apos;&apos; The icons are stored in one of the &lt;install folder&gt;/share/config/images_*.zip files
&apos;&apos;&apos; The exact file depends on the user options about the current icon set
&apos;&apos;&apos; Use the (normal) slash &quot;/&quot; as path separator
&apos;&apos;&apos; Example: &quot;cmd/sc_cut.png&quot;
&apos;&apos;&apos; Tooltip: The help text to be displayed as a tooltip
&apos;&apos;&apos; Returns:
&apos;&apos;&apos; The numeric identification of the newly inserted item
&apos;&apos;&apos; Examples:
&apos;&apos;&apos; Dim myMenu As Object, iId As Integer
&apos;&apos;&apos; Set myMenu = CreateScriptService(&quot;SFWidgets.PopupMenu&quot;, poEvent)
&apos;&apos;&apos; iId = myMenu.AddCheckBox(&quot;Menu top&gt;Checkbox item&quot;, Status := True)
Dim iId As Integer &apos; Return value
Const cstThisSub = &quot;SFWidgets.PopupMenu.AddCheckBox&quot;
Const cstSubArgs = &quot;MenuItem, [Name=&quot;&quot;&quot;&quot;], [Status=False], [Icon=&quot;&quot;&quot;&quot;], [Tooltip=&quot;&quot;&quot;&quot;]&quot;
If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
iId = 0
Check:
If IsMissing(Name) Or IsEmpty(Name) Then Name = &quot;&quot;
If IsMissing(Status) Or IsEmpty(Status) Then Status = False
If IsMissing(Icon) Or IsEmpty(Icon) Then Icon = &quot;&quot;
If IsMissing(Tooltip) Or IsEmpty(Tooltip) Then Tooltip = &quot;&quot;
If ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
If Not ScriptForge.SF_Utils._Validate(MenuItem, &quot;MenuItem&quot;, V_STRING) Then GoTo Catch
If Not ScriptForge.SF_Utils._Validate(Name, &quot;Name&quot;, V_STRING) Then GoTo Catch
If Not ScriptForge.SF_Utils._Validate(Status, &quot;Status&quot;, ScriptForge.V_BOOLEAN) Then GoTo Catch
If Not ScriptForge.SF_Utils._Validate(Icon, &quot;Icon&quot;, V_STRING) Then GoTo Catch
If Not ScriptForge.SF_Utils._Validate(Tooltip, &quot;Tooltip&quot;, V_STRING) Then GoTo Catch
End If
Try:
iId = _AddItem(MenuItem, Name, cstCheck, Status, Icon, Tooltip)
Finally:
AddCheckBox = iId
ScriptForge.SF_Utils._ExitFunction(cstThisSub)
Exit Function
Catch:
GoTo Finally
End Function &apos; SFWidgets.SF_PopupMenu.AddCheckBox
REM -----------------------------------------------------------------------------
Public Function AddItem(Optional ByVal MenuItem As Variant _
, Optional ByVal Name As Variant _
, Optional ByVal Icon As Variant _
, Optional ByVal Tooltip As Variant _
) As Integer
&apos;&apos;&apos; Insert in the popup menu a new entry
&apos;&apos;&apos; Args:
&apos;&apos;&apos; MenuItem: The text to be displayed in the menu entry.
&apos;&apos;&apos; It determines also the hierarchy of the popup menu
&apos;&apos;&apos; It is made up of all the components (separated by the &quot;SubmenuCharacter&quot;) of the menu branch
&apos;&apos;&apos; Example: A&gt;B&gt;C means &quot;C&quot; is a new entry in submenu &quot;A =&gt; B =&gt;&quot;
&apos;&apos;&apos; If the last component is equal to &quot;---&quot;, a line separator is inserted and all other arguments are ignored
&apos;&apos;&apos; Name: The name to be returned by the Execute() method if this item is clicked
&apos;&apos;&apos; Default = the last component of MenuItem
&apos;&apos;&apos; Icon: The path name of the icon to be displayed, without leading path separator
&apos;&apos;&apos; The icons are stored in one of the &lt;install folder&gt;/share/config/images_*.zip files
&apos;&apos;&apos; The exact file depends on the user options about the current icon set
&apos;&apos;&apos; Use the (normal) slash &quot;/&quot; as path separator
&apos;&apos;&apos; Example: &quot;cmd/sc_cut.png&quot;
&apos;&apos;&apos; Tooltip: The help text to be displayed as a tooltip
&apos;&apos;&apos; Returns:
&apos;&apos;&apos; The numeric identification of the newly inserted item
&apos;&apos;&apos; Examples:
&apos;&apos;&apos; Dim myMenu As Object, iId As Integer
&apos;&apos;&apos; Set myMenu = CreateScriptService(&quot;SFWidgets.PopupMenu&quot;, poEvent)
&apos;&apos;&apos; iId = myMenu.AddItem(&quot;Menu top&gt;Normal item&quot;, Icon := &quot;cmd.sc_cut.png&quot;)
Dim iId As Integer &apos; Return value
Const cstThisSub = &quot;SFWidgets.PopupMenu.AddItem&quot;
Const cstSubArgs = &quot;MenuItem, [Name=&quot;&quot;&quot;&quot;], [Icon=&quot;&quot;&quot;&quot;], [Tooltip=&quot;&quot;&quot;&quot;]&quot;
If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
iId = 0
Check:
If IsMissing(Name) Or IsEmpty(Name) Then Name = &quot;&quot;
If IsMissing(Icon) Or IsEmpty(Icon) Then Icon = &quot;&quot;
If IsMissing(Tooltip) Or IsEmpty(Tooltip) Then Tooltip = &quot;&quot;
If ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
If Not ScriptForge.SF_Utils._Validate(MenuItem, &quot;MenuItem&quot;, V_STRING) Then GoTo Catch
If Not ScriptForge.SF_Utils._Validate(Name, &quot;Name&quot;, V_STRING) Then GoTo Catch
If Not ScriptForge.SF_Utils._Validate(Icon, &quot;Icon&quot;, V_STRING) Then GoTo Catch
If Not ScriptForge.SF_Utils._Validate(Tooltip, &quot;Tooltip&quot;, V_STRING) Then GoTo Catch
End If
Try:
iId = _AddItem(MenuItem, Name, cstNormal, False, Icon, Tooltip)
Finally:
AddItem = iId
ScriptForge.SF_Utils._ExitFunction(cstThisSub)
Exit Function
Catch:
GoTo Finally
End Function &apos; SFWidgets.SF_PopupMenu.AddItem
REM -----------------------------------------------------------------------------
Public Function AddRadioButton(Optional ByVal MenuItem As Variant _
, Optional ByVal Name As Variant _
, Optional ByVal Status As Variant _
, Optional ByVal Icon As Variant _
, Optional ByVal Tooltip As Variant _
) As Integer
&apos;&apos;&apos; Insert in the popup menu a new entry as a radio button
&apos;&apos;&apos; Args:
&apos;&apos;&apos; MenuItem: The text to be displayed in the menu entry.
&apos;&apos;&apos; It determines also the hieAddCheckBoxrarchy of the popup menu
&apos;&apos;&apos; It is made up of all the components (separated by the &quot;SubmenuCharacter&quot;) of the menu branch
&apos;&apos;&apos; Example: A&gt;B&gt;C means &quot;C&quot; is a new entry in submenu &quot;A =&gt; B =&gt;&quot;
&apos;&apos;&apos; If the last component is equal to the &quot;SeparatorCharacter&quot;, a line separator is inserted
&apos;&apos;&apos; Name: The name to be returned by the Execute() method if this item is clicked
&apos;&apos;&apos; Default = the last component of MenuItem
&apos;&apos;&apos; Status: when True the item is selected. Default = False
&apos;&apos;&apos; Icon: The path name of the icon to be displayed, without leading path separator
&apos;&apos;&apos; The icons are stored in one of the &lt;install folder&gt;/share/config/images_*.zip files
&apos;&apos;&apos; The exact file depends on the user options about the current icon set
&apos;&apos;&apos; Use the (normal) slash &quot;/&quot; as path separator
&apos;&apos;&apos; Example: &quot;cmd/sc_cut.png&quot;
&apos;&apos;&apos; Tooltip: The help text to be displayed as a tooltip
&apos;&apos;&apos; Returns:
&apos;&apos;&apos; The numeric identification of the newly inserted item
&apos;&apos;&apos; Examples:
&apos;&apos;&apos; Dim myMenu As Object, iId As Integer
&apos;&apos;&apos; Set myMenu = CreateScriptService(&quot;SFWidgets.PopupMenu&quot;, poEvent)
&apos;&apos;&apos; iId = myMenu.AddRadioButton(&quot;Menu top&gt;Radio item&quot;, Status := True)
Dim iId As Integer &apos; Return value
Const cstThisSub = &quot;SFWidgets.PopupMenu.AddRadioButton&quot;
Const cstSubArgs = &quot;MenuItem, [Name=&quot;&quot;&quot;&quot;], [Status=False], [Icon=&quot;&quot;&quot;&quot;], [Tooltip=&quot;&quot;&quot;&quot;]&quot;
If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
iId = 0
Check:
If IsMissing(Name) Or IsEmpty(Name) Then Name = &quot;&quot;
If IsMissing(Status) Or IsEmpty(Status) Then Status = False
If IsMissing(Icon) Or IsEmpty(Icon) Then Icon = &quot;&quot;
If IsMissing(Tooltip) Or IsEmpty(Tooltip) Then Tooltip = &quot;&quot;
If ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
If Not ScriptForge.SF_Utils._Validate(MenuItem, &quot;MenuItem&quot;, V_STRING) Then GoTo Catch
If Not ScriptForge.SF_Utils._Validate(Name, &quot;Name&quot;, V_STRING) Then GoTo Catch
If Not ScriptForge.SF_Utils._Validate(Status, &quot;Status&quot;, ScriptForge.V_BOOLEAN) Then GoTo Catch
If Not ScriptForge.SF_Utils._Validate(Icon, &quot;Icon&quot;, V_STRING) Then GoTo Catch
If Not ScriptForge.SF_Utils._Validate(Tooltip, &quot;Tooltip&quot;, V_STRING) Then GoTo Catch
End If
Try:
iId = _AddItem(MenuItem, Name, cstRadio, Status, Icon, Tooltip)
Finally:
AddRadioButton = iId
ScriptForge.SF_Utils._ExitFunction(cstThisSub)
Exit Function
Catch:
GoTo Finally
End Function &apos; SFWidgets.SF_PopupMenu.AddRadioButton
REM -----------------------------------------------------------------------------
Public Function Execute(Optional ByVal ReturnId As Variant) As Variant
&apos;&apos;&apos; Display the popup menu and return the menu item clicked by the user
&apos;&apos;&apos; Args:
&apos;&apos;&apos; ReturnId: When True (default), return the unique ID of the clicked item, otherwise return its name
&apos;&apos;&apos; Returns:
&apos;&apos;&apos; The numeric identification of clicked item or its name
&apos;&apos;&apos; The returned value is 0 or &quot;&quot; (depending on ReturnId) when the menu is cancelled
&apos;&apos;&apos; Examples:
&apos;&apos;&apos; Sub OpenMenu(Optional poMouseEvent As Object)
&apos;&apos;&apos; Dim myMenu As Object, vChoice As Variant
&apos;&apos;&apos; Set myMenu = CreateScriptService(&quot;SFWidgets.PopupMenu&quot;, poMouseEvent)
&apos;&apos;&apos; With myMenu
&apos;&apos;&apos; .AddCheckBox(&quot;View&gt;Toolbars&gt;Dialog&quot;)
&apos;&apos;&apos; .AddCheckBox(&quot;View&gt;Toolbars&gt;Find&quot;, STatus := True)
&apos;&apos;&apos; .AddCheckBox(&quot;View&gt;Status Bar&quot;, STatus := True)
&apos;&apos;&apos; .AddItem(&quot;View&gt;Full Screen&quot;, Name := &quot;FULLSCREEN&quot;)
&apos;&apos;&apos; vChoice = .Execute(False) &apos; When 1st checkbox is clicked, return &quot;Dialog&quot;
&apos;&apos;&apos; &apos; When last item is clicked, return &quot;FULLSCREEN&quot;
&apos;&apos;&apos; End With
Dim vMenuItem As Variant &apos; Return value
Const cstThisSub = &quot;SFWidgets.PopupMenu.Execute&quot;
Const cstSubArgs = &quot;[ReturnId=True]&quot;
If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
vMenuItem = 0
Check:
If IsMissing(ReturnId) Or IsEmpty(ReturnId) Then ReturnId = True
If ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
If Not ScriptForge.SF_Utils._Validate(ReturnId, &quot;ReturnId&quot;, ScriptForge.V_BOOLEAN) Then GoTo Catch
End If
If Not ReturnId Then vMenuItem = &quot;&quot;
Try:
vMenuItem = MenuRoot.Execute(PeerWindow, Rectangle, com.sun.star.awt.PopupMenuDirection.EXECUTE_DEFAULT)
If Not ReturnId Then vMenuItem = MenuIdentification.Item(CStr(vMenuItem))
Finally:
Execute = vMenuItem
ScriptForge.SF_Utils._ExitFunction(cstThisSub)
Exit Function
Catch:
GoTo Finally
End Function &apos; SFWidgets.SF_PopupMenu.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; myModel.GetProperty(&quot;MyProperty&quot;)
Const cstThisSub = &quot;SFWidgets.PopupMenu.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_PopupMenu.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;AddCheckBox&quot; _
, &quot;AddItem&quot; _
, &quot;AddRadioButton&quot; _
, &quot;Execute&quot; _
)
End Function &apos; SFWidgets.SF_PopupMenu.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;ShortcutCharacter&quot; _
, &quot;SubmenuCharacter&quot; _
)
End Function &apos; SFWidgets.SF_PopupMenu.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.PopupMenu.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_PopupMenu.SetProperty
REM =========================================================== PRIVATE FUNCTIONS
REM -----------------------------------------------------------------------------
Public Function _AddItem(ByVal MenuItem As String _
, ByVal Name As String _
, ByVal ItemType As String _
, ByVal Status As Boolean _
, ByVal Icon As String _
, ByVal Tooltip As String _
, Optional ByVal Command As String _
) As Integer
&apos;&apos;&apos; Insert in the popup menu a new entry
&apos;&apos;&apos; Args:
&apos;&apos;&apos; MenuItem: The text to be displayed in the menu entry.
&apos;&apos;&apos; It determines also the hierarchy of the popup menu
&apos;&apos;&apos; It is made up of all the components (separated by the &quot;SubmenuCharacter&quot;) of the menu branch
&apos;&apos;&apos; Example: A&gt;B&gt;C means &quot;C&quot; is a new entry in submenu &quot;A =&gt; B =&gt;&quot;
&apos;&apos;&apos; If the last component is equal to the &quot;SeparatorCharacter&quot;, a line separator is inserted
&apos;&apos;&apos; Name: The name to be returned by the Execute() method if this item is clicked
&apos;&apos;&apos; Default = the last component of MenuItem
&apos;&apos;&apos; ItemType: &quot;N&quot;(ormal, &quot;C&quot;(heck) or &quot;R&quot;(adio)
&apos;&apos;&apos; Status: when True the item is selected
&apos;&apos;&apos; Icon: The path name of the icon to be displayed, without leading path separator
&apos;&apos;&apos; The icons are stored in one of the &lt;install folder&gt;/share/config/images_*.zip files
&apos;&apos;&apos; The exact file depends on the user options about the current icon set
&apos;&apos;&apos; Use the (normal) slash &quot;/&quot; as path separator
&apos;&apos;&apos; Example: &quot;cmd/sc_cut.png&quot;
&apos;&apos;&apos; Tooltip: The help text to be displayed as a tooltip
&apos;&apos;&apos; Command: only for menubar menus
&apos;&apos;&apos; Either a uo command like &quot;.uno:About&quot;
&apos;&apos;&apos; or a script to be run: script URI ::: string argument to be passed to the script
&apos;&apos;&apos; Returns:
&apos;&apos;&apos; The numeric identification of the newly inserted item
Dim iId As Integer &apos; Return value
Dim vSplit As Variant &apos; Split menu item
Dim sMenu As String &apos; Submenu where to attach the new item, as a string
Dim oMenu As Object &apos; Submenu where to attach the new item, as an object
Dim sName As String &apos; The text displayed in the menu box
Dim oImage As Object &apos; com.sun.star.graphic.XGraphic
Dim sCommand As String &apos; Alias of Command completed with arguments
Const cstCommandSep = &quot;,&quot;
On Local Error GoTo Catch
iId = 0
If IsMissing(Command) Then Command = &quot;&quot;
Try:
&apos; Run through the upper menu tree
vSplit = _SplitMenuItem(MenuItem)
&apos; Create and determine the menu to which to attach the new item
sMenu = vSplit(0)
Set oMenu = _GetPopupMenu(sMenu) &apos; Run through the upper menu tree and retain the last branch
&apos; Insert the new item
LastItem = LastItem + 1
sName = vSplit(1)
With oMenu
If sName = _SeparatorChar Then
.insertSeparator(-1)
Else
Select Case ItemType
Case cstNormal
.insertItem(LastItem, sName, 0, -1)
Case cstCheck
.insertItem(LastItem, sName, com.sun.star.awt.MenuItemStyle.CHECKABLE + com.sun.star.awt.MenuItemStyle.AUTOCHECK, -1)
.checkItem(LastItem, Status)
Case cstRadio
.insertItem(LastItem, sName, com.sun.star.awt.MenuItemStyle.RADIOCHECK + com.sun.star.awt.MenuItemStyle.AUTOCHECK, -1)
.checkItem(LastItem, Status)
End Select
&apos; Store the ID - Name relation
If Len(Name) = 0 Then Name = Replace(sName, _UnderlineAccessKeyChar, &quot;&quot;)
MenuIdentification.Add(CStr(LastItem), Name)
&apos; Add the icon when relevant
If Len(Icon) &gt; 0 Then
Set oImage = _GetImageFromUrl(_IconsDirectory &amp; Icon)
If Not IsNull(oImage) Then .setItemImage(LastItem, oImage, False)
End If
&apos; Add the tooltip when relevant
If Len(Tooltip) &gt; 0 Then .setTipHelpText(LastItem, Tooltip)
&apos; Add the command: UNO command or script to run - menubar menus only
If Len(Command) &gt; 0 Then
If Left(Command, Len(cstUnoPrefix)) = cstUnoPrefix Then
sCommand = Command
Else
sCommand = Command &amp; cstCommandSep &amp; Name &amp; cstCommandSep &amp; CStr(LastItem)
End If
.setCommand(LastItem, sCommand)
End If
End If
End With
iId = LastItem
Finally:
_AddItem = iId
Exit Function
Catch:
GoTo Finally
End Function &apos; SFWidgets.SF_PopupMenu._AddItem
REM -----------------------------------------------------------------------------
Private Function _GetImageFromURL(ByVal psUrl as String) As Object
&apos;&apos;&apos; Returns a com.sun.star.graphic.XGraphic instance based on the given URL
&apos;&apos;&apos; The returned object is intended to be inserted as an icon in the popup menu
&apos;&apos;&apos; Derived from &quot;Useful Macro Information For OpenOffice&quot; By Andrew Pitonyak
Dim vMediaProperties As Variant &apos; Array of com.sun.star.beans.PropertyValue
Dim oGraphicProvider As Object &apos; com.sun.star.graphic.GraphicProvider
Dim oImage As Object &apos; Return value
On Local Error GoTo Catch &apos; Ignore errors
Set oImage = Nothing
Try:
&apos; Create graphic provider instance to load images from files.
Set oGraphicProvider = CreateUnoService(&quot;com.sun.star.graphic.GraphicProvider&quot;)
&apos; Set the URL property so graphic provider is able to load the image
Set vMediaProperties = Array(ScriptForge.SF_Utils._MakePropertyValue(&quot;URL&quot;, psURL))
&apos; Retrieve the com.sun.star.graphic.XGraphic instance
Set oImage = oGraphicProvider.queryGraphic(vMediaProperties)
Finally:
Set _GetImageFromUrl = oImage
Exit Function
Catch:
GoTo Finally
End Function &apos; SFWidgets.SF_PopupMenu._GetImageFromUrl
REM -----------------------------------------------------------------------------
Private Function _GetPopupMenu(ByVal psSubmenu As String) As Object
&apos;&apos;&apos; Get the com.sun.star.awt.XPopupMenu object corresponding with the string in argument
&apos;&apos;&apos; If the menu exists, it is found in the MenuTree dictionary
&apos;&apos;&apos; If it does not exist, it is created recursively.
&apos;&apos;&apos; Args:
&apos;&apos;&apos; psSubmenu: a string like &quot;A&gt;B&quot;
&apos;&apos;&apos; Returns
&apos;&apos;&apos; A com.sun.star.awt.XpopupMenu object
&apos;&apos;&apos; Example
&apos;&apos;&apos; If psSubmenu = &quot;A&gt;B&gt;C&gt;D&quot;, and only the root menu exists,
&apos;&apos;&apos; - &quot;A&quot;, &quot;A&gt;B&quot;, &quot;A&gt;B&gt;C&quot;, &quot;A&gt;B&gt;C&gt;D&quot; should be created
&apos;&apos;&apos; - the popup menu corresponding with &quot;A&gt;B&gt;C&gt;D&quot; should be returned
Dim oPopup As Object &apos; Return value
Dim vSplit As Variant &apos; An array as returned by _SplitMenuItem()
Dim sMenu As String &apos; The left part of psSubmenu
Dim oMenu As Object &apos; com.sun.star.awt.XpopupMenu
Dim oLastMenu As Object &apos; com.sun.star.awt.XpopupMenu
Dim i As Long
Set oPopup = Nothing
Set oLastMenu = MenuRoot
Try:
If Len(psSubmenu) = 0 Then &apos; Menu starts at the root
Set oPopup = MenuRoot
ElseIf MenuTree.Exists(psSubmenu) Then &apos; Shortcut: if the submenu exists, get it directly
Set oPopup = MenuTree.Item(psSubmenu)
Else &apos; Build the tree
vSplit = Split(psSubmenu, SubmenuChar)
&apos; Search the successive submenus in the MenuTree dictionary, If not found, create a new entry
For i = 0 To UBound(vSplit)
sMenu = Join(ScriptForge.SF_Array.Slice(vSplit, 0, i), SubmenuChar)
If MenuTree.Exists(sMenu) Then
Set oLastMenu = MenuTree.Item(sMenu)
Else
&apos; Insert the new menu tree item
LastItem = LastItem + 1
oLastMenu.insertItem(LastItem, vSplit(i), 0, -1)
Set oMenu = CreateUnoService(&quot;stardiv.vcl.PopupMenu&quot;)
If MenubarMenu Then SFWidgets.SF_MenuListener.SetMenuListener(oMenu)
MenuTree.Add(sMenu, oMenu)
oLastMenu.setPopupMenu(LastItem, oMenu)
Set oLastMenu = oMenu
End If
Next i
Set oPopup = oLastMenu
End If
Finally:
Set _GetPopupMenu = oPopup
Exit Function
End Function &apos; SFWidgets.SF_PopupMenu._GetPopupMenu
REM -----------------------------------------------------------------------------
Public Sub _Initialize(ByRef poPeer As Object _
, plXPos As Long _
, plYPos As Long _
, psSubmenuChar As String _
)
&apos;&apos;&apos; Complete the object creation process:
&apos;&apos;&apos; - Initialize the dictionaries
&apos;&apos;&apos; - initialize the root popup menu
&apos;&apos;&apos; - initialize the display area
&apos;&apos;&apos; - store the arguments for later use
&apos;&apos;&apos; Args:
&apos;&apos;&apos; poPeer: a peer window
&apos;&apos;&apos; plXPos, plYPos: the coordinates
Try:
&apos; Initialize the dictionaries
With ScriptForge.SF_Services
Set MenuTree = .CreateScriptService(&quot;Dictionary&quot;)
Set MenuIdentification = .CreateScriptService(&quot;Dictionary&quot;)
End With
&apos; Initialize the root of the menu tree
Set MenuRoot = CreateUnoService(&quot;stardiv.vcl.PopupMenu&quot;)
&apos; Setup the display area
Set Rectangle = New com.sun.star.awt.Rectangle
Rectangle.X = plXPos
Rectangle.Y = plYPos
&apos; Keep the targeted window
Set PeerWindow = poPeer
&apos; Store the submenu character
If Len(psSubmenuChar) &gt; 0 Then SubmenuChar = psSubmenuChar
Finally:
Exit Sub
End Sub &apos; SFWidgets.SF_PopupMenu._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 cstThisSub As String
Const cstSubArgs = &quot;&quot;
cstThisSub = &quot;SFWidgets.PopupMenu.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;ShortcutCharacter&quot;)
_PropertyGet = _UnderlineAccessKeyChar
Case UCase(&quot;SubmenuCharacter&quot;)
_PropertyGet = SubmenuChar
Case Else
_PropertyGet = Null
End Select
Finally:
ScriptForge.SF_Utils._ExitFunction(cstThisSub)
Exit Function
Catch:
GoTo Finally
End Function &apos; SFWidgets.SF_PopupMenu._PropertyGet
REM -----------------------------------------------------------------------------
Private Function _Repr() As String
&apos;&apos;&apos; Convert the SF_PopupMenu instance to a readable string, typically for debugging purposes (DebugPrint ...)
&apos;&apos;&apos; Args:
&apos;&apos;&apos; Return:
&apos;&apos;&apos; &quot;[PopupMenu]: Name, Type (dialogname)
_Repr = &quot;[PopupMenu]: &quot; &amp; SF_String.Represent(MenuTree.Keys()) &amp; &quot;, &quot; &amp; SF_String.Represent(MenuIdentification.Items())
End Function &apos; SFWidgets.SF_PopupMenu._Repr
REM -----------------------------------------------------------------------------
Private Function _SplitMenuItem(ByVal psMenuItem As String ) As Variant
&apos;&apos;&apos; Split a menu item given as a string and delimited by the submenu character
&apos;&apos;&apos; Args:
&apos;&apos;&apos; psMenuItem: a string like &quot;A&gt;B&gt;C&quot;
&apos;&apos;&apos; Returns:
&apos;&apos;&apos; An array: [0] = &quot;A&gt;B&quot;
&apos;&apos;&apos; [1] = &quot;C&quot;
Dim vReturn(0 To 1) As String &apos; Return value
Dim vMenus() As Variant &apos; Array of menus
Try:
vMenus = Split(psMenuItem, SubmenuChar)
vReturn(1) = vMenus(UBound(vMenus))
vReturn(0) = Left(psMenuItem, Len(psMenuItem) - Iif(UBound(vMenus) &gt; 0, Len(SubmenuChar), 0) - Len(vReturn(1)))
Finally:
_SplitMenuItem = vReturn
End Function &apos; SFWidgets.SF_PopupMenu._SplitMenuItem
REM ============================================ END OF SFWIDGETS.SF_POPUPMENU
</script:module>

View File

@@ -0,0 +1,190 @@
<?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_Register" 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 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_Register
&apos;&apos;&apos; ===========
&apos;&apos;&apos; The ScriptForge framework includes
&apos;&apos;&apos; the master ScriptForge library
&apos;&apos;&apos; a number of &quot;associated&quot; libraries SF*
&apos;&apos;&apos; any user/contributor extension wanting to fit into the framework
&apos;&apos;&apos;
&apos;&apos;&apos; The main methods in this module allow the current library to cling to ScriptForge
&apos;&apos;&apos; - RegisterScriptServices
&apos;&apos;&apos; Register the list of services implemented by the current library
&apos;&apos;&apos; - _NewMenu
&apos;&apos;&apos; Create a new menu service instance.
&apos;&apos;&apos; Called from SFDocuments services with CreateMenu()
&apos;&apos;&apos; - _NewPopupMenu
&apos;&apos;&apos; Create a new popup menu service instance.
&apos;&apos;&apos; Called from CreateScriptService()
&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&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 ================================================================= DEFINITIONS
REM ============================================================== PUBLIC METHODS
REM -----------------------------------------------------------------------------
Public Sub RegisterScriptServices() As Variant
&apos;&apos;&apos; Register into ScriptForge the list of the services implemented by the current library
&apos;&apos;&apos; Each library pertaining to the framework must implement its own version of this method
&apos;&apos;&apos;
&apos;&apos;&apos; It consists in successive calls to the RegisterService() and RegisterEventManager() methods
&apos;&apos;&apos; with 2 arguments:
&apos;&apos;&apos; ServiceName: the name of the service as a case-insensitive string
&apos;&apos;&apos; ServiceReference: the reference as an object
&apos;&apos;&apos; If the reference refers to a module, then return the module as an object:
&apos;&apos;&apos; GlobalScope.Library.Module
&apos;&apos;&apos; If the reference is a class instance, then return a string referring to the method
&apos;&apos;&apos; containing the New statement creating the instance
&apos;&apos;&apos; &quot;libraryname.modulename.function&quot;
With GlobalScope.ScriptForge.SF_Services
.RegisterService(&quot;Menu&quot;, &quot;SFWidgets.SF_Register._NewMenu&quot;) &apos; Reference to the function initializing the service
.RegisterService(&quot;PopupMenu&quot;, &quot;SFWidgets.SF_Register._NewPopupMenu&quot;) &apos; id.
End With
End Sub &apos; SFWidgets.SF_Register.RegisterScriptServices
REM =========================================================== PRIVATE FUNCTIONS
REM -----------------------------------------------------------------------------
Public Function _NewMenu(Optional ByVal pvArgs As Variant) As Object
&apos;&apos;&apos; Create a new instance of the SF_Menu class
&apos;&apos;&apos; [called internally from SFDocuments.Document.CreateMenu() ONLY]
&apos;&apos;&apos; Args:
&apos;&apos;&apos; Component: the com.sun.star.lang.XComponent where to find the menubar to plug the new menu in
&apos;&apos;&apos; Header: the name/header of the menu
&apos;&apos;&apos; Before: the place where to put the new menu on the menubar (string or number &gt;= 1)
&apos;&apos;&apos; When not found =&gt; last position
&apos;&apos;&apos; SubmenuChar: the delimiter used in menu trees. Default = &quot;&gt;&quot;
&apos;&apos;&apos; Returns: the instance or Nothing
Dim oMenu As Object &apos; Return value
Dim oComponent As Object &apos; The document or formdocument&apos;s component - com.sun.star.lang.XComponent
Dim sHeader As String &apos; Menu header
Dim sBefore As String &apos; Position of menu as a string
Dim iBefore As Integer &apos; as a number
Dim sSubmenuChar As String &apos; Delimiter in menu trees
If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
Set oMenu = Nothing
Check:
&apos; Types and number of arguments are not checked because internal call only
Set oComponent = pvArgs(0)
sHeader = pvArgs(1)
Select Case VarType(pvArgs(2))
Case V_STRING : sBefore = pvArgs(2)
iBefore = 0
Case Else : sBefore = &quot;&quot;
iBefore = pvArgs(2)
End Select
sSubmenuChar = pvArgs(3)
Try:
If Not IsNull(oComponent) Then
Set oMenu = New SF_Menu
With oMenu
Set .[Me] = oMenu
._Initialize(oComponent, sHeader, sBefore, iBefore, sSubmenuChar)
End With
End If
Finally:
Set _NewMenu = oMenu
Exit Function
Catch:
GoTo Finally
End Function &apos; SFWidgets.SF_Register._NewMenu
REM -----------------------------------------------------------------------------
Public Function _NewPopupMenu(Optional ByVal pvArgs As Variant) As Object
&apos;&apos;&apos; Create a new instance of the SF_PopupMenu class
&apos;&apos;&apos; Args:
&apos;&apos;&apos; Event: a mouse event
&apos;&apos;&apos; If the event has no source or is not a mouse event, the menu is displayed above the actual window
&apos;&apos;&apos; X, Y: forced coordinates
&apos;&apos;&apos; SubmenuChar: Delimiter used in menu trees
&apos;&apos;&apos; Returns: the instance or Nothing
Dim oMenu As Object &apos; Return value
Dim Event As Variant &apos; Mouse event
Dim X As Long &apos; Mouse click coordinates
Dim Y As Long
Dim SubmenuChar As String &apos; Delimiter in menu trees
Dim vUno As Variant &apos; UNO type split into an array
Dim sEventType As String &apos; Event type, must be &quot;MouseEvent&quot;
Dim oControl As Object &apos; The dialog or form control view which triggered the event
Dim oWindow As Object &apos; ui.Window type
Dim oSession As Object : Set oSession = ScriptForge.SF_Services.CreateScriptService(&quot;ScriptForge.Session&quot;)
Dim oUi As Object : Set oUi = ScriptForge.SF_Services.CreateScriptService(&quot;ScriptForge.UI&quot;)
If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
Check:
&apos; Check and get arguments, their number may vary
If IsMissing(pvArgs) Or IsEmpty(pvArgs) Then pvArgs = Array()
If Not IsArray(pvArgs) Then pvArgs = Array(pvArgs)
If UBound(pvArgs) &gt;= 0 Then Event = pvArgs(0) Else Event = Nothing
If IsEmpty(Event) Then Event = Nothing
If UBound(pvArgs) &gt;= 1 Then X = pvArgs(1) Else X = 0
If UBound(pvArgs) &gt;= 2 Then Y = pvArgs(2) Else Y = 0
If UBound(pvArgs) &gt;= 3 Then SubmenuChar = pvArgs(3) Else SubmenuChar = &quot;&quot;
If Not ScriptForge.SF_Utils._Validate(Event, &quot;Event&quot;, ScriptForge.V_OBJECT) Then GoTo Finally
If Not ScriptForge.SF_Utils._Validate(X, &quot;X&quot;, ScriptForge.V_NUMERIC) Then GoTo Finally
If Not ScriptForge.SF_Utils._Validate(Y, &quot;Y&quot;, ScriptForge.V_NUMERIC) Then GoTo Finally
If Not ScriptForge.SF_Utils._Validate(SubmenuChar, &quot;SubmenuChar&quot;, V_STRING) Then GoTo Finally
Set oMenu = Nothing
Try:
&apos; Find and identify the control that triggered the popup menu
Set oControl = Nothing
If Not IsNull(Event) Then
&apos; Determine the X, Y coordinates
vUno = Split(oSession.UnoObjectType(Event), &quot;.&quot;)
sEventType = vUno(UBound(vUno))
If UCase(sEventType) = &quot;MOUSEEVENT&quot; Then
X = Event.X
Y = Event.Y
&apos; Determine the window peer target
If oSession.HasUnoProperty(Event, &quot;Source&quot;) Then Set oControl = Event.Source.Peer
End If
End If
&apos; If not a mouse event, if no control, find what can be decent alternatives: (a menu header in) the actual window
If IsNull(oControl) Then
Set oWindow = oUi._IdentifyWindow(StarDesktop.getCurrentComponent()) &apos; A menu has been clicked necessarily in the current window
With oWindow
If Not IsNull(.Frame) Then Set oControl = .Frame.getContainerWindow()
End With
End If
If Not IsNull(oControl) Then
Set oMenu = New SF_PopupMenu
With oMenu
Set .[Me] = oMenu
._Initialize(oControl, X, Y, SubmenuChar)
End With
Else
Set oMenu = Nothing
End If
Finally:
Set _NewPopupMenu = oMenu
Exit Function
Catch:
GoTo Finally
End Function &apos; SFWidgets.SF_Register._NewPopupMenu
REM ============================================== END OF SFWidgets.SF_REGISTER
</script:module>

View File

@@ -0,0 +1,26 @@
<?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="__License" script:language="StarBasic" script:moduleType="normal">
&apos;&apos;&apos; Copyright 2019-2022 Jean-Pierre LEDURE, Rafael LIMA, Alain ROMEDENNE
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 =======================================================================================================================
&apos;&apos;&apos; ScriptForge is distributed in the hope that it will be useful,
&apos;&apos;&apos; but WITHOUT ANY WARRANTY; without even the implied warranty of
&apos;&apos;&apos; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
&apos;&apos;&apos; ScriptForge is free software; you can redistribute it and/or modify it under the terms of either (at your option):
&apos;&apos;&apos; 1) The Mozilla Public License, v. 2.0. If a copy of the MPL was not
&apos;&apos;&apos; distributed with this file, you can obtain one at http://mozilla.org/MPL/2.0/ .
&apos;&apos;&apos; 2) The GNU Lesser General Public License as published by
&apos;&apos;&apos; the Free Software Foundation, either version 3 of the License, or
&apos;&apos;&apos; (at your option) any later version. If a copy of the LGPL was not
&apos;&apos;&apos; distributed with this file, see http://www.gnu.org/licenses/ .
</script:module>

View File

@@ -0,0 +1,3 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE library:library PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "library.dtd">
<library:library xmlns:library="http://openoffice.org/2000/library" library:name="SFWidgets" library:readonly="false" library:passwordprotected="false"/>

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE library:library PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "library.dtd">
<library:library xmlns:library="http://openoffice.org/2000/library" library:name="SFWidgets" library:readonly="false" library:passwordprotected="false">
<library:element library:name="__License"/>
<library:element library:name="SF_Register"/>
<library:element library:name="SF_PopupMenu"/>
<library:element library:name="SF_Menu"/>
<library:element library:name="SF_MenuListener"/>
</library:library>