Contenido

# Servicio SFWidgets.ContextMenu

Context menus are predefined at LibreOffice installation. They can be customized in the Tools + Customize dialog.

El servicio ContextMenu ofrece las funciones siguientes:

- Sustituye temporalmente todas las opciones de un menú contextual específico.

- Añade temporalmente opciones nuevas al final de un menú contextual predefinido.

- Desactiva temporalmente el menú contextual.

La configuración nueva del menú no se guarda en ningún sitio. Ni en el documento ni en la configuración de LibreOffice.

El menú contextual suele activarse al pulsar con el botón secundario del ratón en una zona concreta de un documento. Piense, por ejemplo, en pulsar en una celda o en la pestaña de una hoja en un documento de Calc.

## Invocación del servicio

Before using the ContextMenu service the ScriptForge library needs to be loaded or imported:

• Para cargar la biblioteca ScriptForge que necesitan las macros de Basic se debe usar la siguiente declaración:
GlobalScope.BasicLibraries.loadLibrary("ScriptForge")
• Los scripts de Python necesitan importar el módulo scriptforge:
from scriptforge import CreateScriptService

##### En BASIC

The ContextMenu service is instantiated from the SF_Document.ContextMenus() and SF_Datasheet.ContextMenus() methods only.

        Sub DefineContextMenu()
            GlobalScope.BasicLibraries.loadLibrary("ScriptForge")
            Dim calc As Object, menu As Object
            Set calc = CreateScriptService("Document", ThisComponent)
            Set menu = calc.ContextMenus("cell")  ' Right-click on a cell
            '  ... Define the context menu ...
            menu.Dispose()
        End Sub

Running the Sub defined above redefines the context menu related to a specific area in the document, here a cell belonging to a Calc document.

The new definition will remain active until the document is closed or until the context menu is redefined again.

Use the Dispose method to free resources after executing the context menu.

##### En Python

El ejemplo anterior se puede escribir en Python de la siguiente manera:

        from scriptforge import CreateScriptService

        def DefineContextMenu(args=None):
            basic = CreateScriptService("Basic")
            calc = CreateScriptService("Document", basic.ThisComponent)
            menu = calc.ContextMenus("cell")  # Right-click on a cell
            #  ... Define the context menu ...
            menu.Dispose()

## Propiedades

Nombre | De solo lectura | Tipo | Descripción
--- | --- | --- | ---
ParentDocument | Sí | Object | The parent document class (or one of its subclasses) instance.
ShortcutCharacter | Sí | String | Character used to define the access key of a menu item. The default character is ~.
SubmenuCharacter | Sí | String | Character or string that defines how menu items are nested. The default character is >.

## Menú y submenús

Para crear un menú contextual con submenús, utiliza el carácter definido en la propiedad SubmenuCharacter al crear la entrada del menú para definir dónde se colocará. Por ejemplo, fíjese en la siguiente jerarquía de menús y submenús.

        ' Item A
        ' Item B > Item B.1
        '          Item B.2
        ' ------ (line separator)
        ' Item C > Item C.1 > Item C.1.1
        '                     Item C.1.2
        ' Item C > Item C.2 > Item C.2.1
        '                     Item C.2.2
        '                     ------ (line separator)
        '                     Item C.2.3
        '                     Item C.2.4

El código siguiente utiliza el carácter predeterminado para submenús > para crear la jerarquía de menús y submenús definida anteriormente:

        menu.AddItem("Item A")
        menu.AddItem("Item B>Item B.1")
        menu.AddItem("Item B>Item B.2")
        menu.AddItem("---")
        menu.AddItem("Item C>Item C.1>Item C.1.1")
        menu.AddItem("Item C>Item C.1>Item C.1.2")
        menu.AddItem("Item C>Item C.2>Item C.2.1")
        menu.AddItem("Item C>Item C.2>Item C.2.2")
        menu.AddItem("Item C>Item C.2>---")
        menu.AddItem("Item C>Item C.2>Item C.2.3")
        menu.AddItem("Item C>Item C.2>Item C.2.4")

La cadena --- se utiliza para definir líneas separadoras en los menús y submenús.

## Uso de iconos

A diferencia de los menús emergentes, los elementos de los menús contextuales no deben contener iconos.

## Métodos

List of Methods in the ContextMenu Service
Activate | AddItem | RemoveAllItems

## Activate

Make the added items of the context menu stored in the document available for execution, or, at the opposite, disable them, depending on the argument.

### Sintaxis:

svc.Activate(opt enable: bool = True)

### Parámetros:

enable: When True (default), the local menu stored in the document is made active. When False, the local menu is ignored and the global menu defined at LibreOffice level takes the precedence.

## AddItem

Inserts a menu entry in the context menu.

### Sintaxis:

svc.AddItem(menuitem: str, opt command: str, opt script: str)

### Parámetros:

menuitem: Defines the text to be displayed in the menu. This argument also defines the hierarchy of the item inside the menu by using the submenu character. Set the last component to "---" to define a line separator.

command: The name of the UNO command that will be run when the item is clicked, without the .uno: prefix. If the command name does not exist or is not applicable, nothing will happen.

script: The URI for a Basic or Python script that will be executed when the item is clicked. Note that the given script will not get any argument.

### Ejemplo:

##### En BASIC

          menu.AddItem("Menu top>Item 1", command := "About")
          menu.AddItem("Menu top>Item 2", script := "vnd.sun.star.script:myLib.Module1.ThisSub?language=Basic&location=document")

##### En Python

          menu.AddItem('Menu top>Item 1', command = 'About')
          menu.AddItem('Menu top>Item 2', script = 'vnd.sun.star.script:Module1.py$thisdef?language=Python&location=document')

## RemoveAllItems

Remove all items, both

- predefined with Tools + Customize and saved in the document

- added with contextmenu.AddItem()

Esta acción no se puede deshacer, salvo cerrando y volviendo a abrir el documento.

Afterwards, when relevant, use AddItem() to insert new menu items.

### Sintaxis:

svc.RemoveAllItems()

### Ejemplo:

Associate next Sub/def with the on-right-click event of a sheet. The custom menu appears when right-clicking in column C of the Calc sheet, otherwise the normal behaviour is preserved.

##### En BASIC

          Sub OnRightClick1(Optional XRange)  '  Xrange is a com.sun.star.table.XCellRange object
          Dim calc As Object, menu As Object, in_column As Boolean
          Set calc = CreateScriptService("Calc", ThisComponent)
          Set menu = calc.ContextMenus("cell")
          menu.RemoveAllItems()
          in_column = ( Len(calc.Intersect("Sheet1.$C:$C", XRange.AbsoluteName)) > 0 )
          If in_column Then
              menu.AddItem("A", script := "vnd.sun.star.script:Standard.Module1.EnterA?language=Basic&location=document")
              ' ...
          End If
          menu.Activate(in_column)
          End Sub

##### En Python

            def OnRightClick1(XRange = None)  #  Xrange is a com.sun.star.table.XCellRange object
                basic = CreateScriptService('basic')
                calc = CreateScriptService('Calc', basic.ThisComponent)
                menu = calc.ContextMenus('cell')
                menu.RemoveAllItems()
                in_column = ( len(calc.Intersect("Sheet1.$C:$C", XRange.AbsoluteName)) > 0 )
                if in_column:
                    menu.AddItem('A', script = 'vnd.sun.star.script:Module1.py$EnterA?language=Python&location=document")
                    # ...
                menu.Activate(in_column)

Todas las rutinas o identificadores BASIC de ScriptForge precedidas por guion bajo «_» están reservadas para uso interno. No deben utilizarse en macros BASIC o secuencias Python.

Temas relacionados

Servicio SFWidgets.PopupMenu

Servicio SFWidgets.Menu

¡Necesitamos su ayuda!