Contenuto

# Servizio SFWidgets.ContextMenu

I menu contestuali sono predefiniti nell'installazione di LibreOffice. Possono essere personalizzati dalla finestra di dialogo Strumenti + Personalizza.

Il servizio ContextMenu fornisce le seguenti funzioni:

- Sostituisce temporaneamente tutte le voci di uno specifico menu contestuale.

- Aggiunge temporaneamente nuove voci di menu alla fine di un menu contestuale predefinito.

- Rende temporaneamente inattivo il menu contestuale.

Le nuove impostazioni non vengono salvate da nessuna parte, né nel documento né nelle impostazioni di LibreOffice.

Un menu contestuale viene solitamente attivato con un clic del pulsante destro del mouse su un'area specifica di un documento. Vengono presi in considerazione i clic su una cella o sulla linguetta di un foglio di un documento Calc.

## Invocazione del servizio

Prima di usare il servizio ContextMenu è necessario caricare o importare le librerie ScriptForge:

• Le macro in Basic richiedono il caricamento della libreria ScriptForge usando la seguente istruzione:
GlobalScope.BasicLibraries.loadLibrary("ScriptForge")
• Gli script in Python richiedono un'importazione dal modulo scriptforge:
from scriptforge import CreateScriptService

##### In Basic

Il servizio ContextMenu viene istanziato solo dai metodi SF_Document.ContextMenus() e SF_Datasheet.ContextMenus().

        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

L'esecuzione della Sub definita qui sopra ridefinisce il menu contestuale relativo a un'area specifica del documento, in questo caso una cella appartenente a un documento di Calc.

La nuova definizione resterà attiva fino alla chiusura del documento o fino a quando il menu contestuale viene ridefinito nuovamente.

Usare il metodo Dispose per liberare risorse dopo l'esecuzione del menu contestuale.

##### In Python

L'esempio precedente può essere scritto in Python come segue:

        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()

## Proprietà

Nome | Sola lettura | Tipo | Descrizione
--- | --- | --- | ---
ParentDocument | Sì | Object | L'istanza alla classe del documento principale (o a una delle sue sottoclassi).
ShortcutCharacter | Sì | String | Carattere usato per definire il tasto di accesso alla voce del menu. Il carattere predefinito è ~.
SubmenuCharacter | Sì | String | Carattere o stringa che definisce in quale modo le voci del menu sono nidificate. Il carattere predefinito è >.

## Menu e sottomenu

Per creare un menu contestuale con dei sottomenu, usare il carattere definito nella proprietà SubmenuCharacter durante la creazione della voce di menu, per definire il punto in cui verrà posizionata. Per esempio, prendendo in considerazione la seguente gerarchia di menu/sottomenu.

        ' 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

Il codice sottostante usa il carattere predefinito > per i sottomenu in modo da creare la gerarchia menu/sottomenu definita in precedenza:

        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 stringa --- è usata per definire delle linee di separazione nei menu o nei sottomenu.

## Uso di icone

Diversamente dai menu a comparsa, le voci dei menu contestuali non devono contenere icone.

## Metodi

Elenco dei metodi del servizio ContextMenu
Activate | AddItem | RemoveAllItems

## Activate

Rende le voci aggiunte del menu contestuale memorizzato nel documento disponibili per l'esecuzione, oppure, all'opposto, le disabilita, a seconda dell'argomento.

### Sintassi:

svc.Activate(opt enable: bool = True)

### Parametri:

enable: se è True (valore predefinito), viene attivato il menu locale memorizzato nel documento. Se è False, viene ignorato il menu locale e il menu globale, definito a livello di LibreOffice, ha la precedenza.

## AddItem

Inserisce una voce di menu nel menu contestuale.

### Sintassi:

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

### Parametri:

menuitem: definisce il testo da visualizzare nel menu. Questo argomento definisce anche la gerarchia della voce all'interno del menu usando il carattere che indica il sottomenu. Impostare l'ultimo componente a "---" per definire una linea di separazione.

command: il nome del comando UNO da eseguire quando si fa clic sulla voce, senza il prefisso .uno:. Se il nome del comando non esiste o non è applicabile, non accadrà nulla.

script: l'URI di uno script in Basic o Python che sarà eseguito quando si farà clic sulla voce. Va precisato che lo script indicato non riceverà alcun argomento.

### Esempio:

##### In 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")

##### In 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

Elimina tutte le voci, sia quelle

- predefinite con Strumenti + Personalizza e salvate nel documento

- aggiunte con contextmenu.AddItem()

Quest'azione può essere annullata solo chiudendo e riaprendo il documento.

Dopodiché, quando necessario, usare AddItem() per inserire nuove voci di menu.

### Sintassi:

svc.RemoveAllItems()

### Esempio:

Associare la seguente Sub/def all'evento "clic col pulsante destro" di un foglio. Il menu personalizzato menu appare quando si fa un clic con il pulsante destro nella colonna C del foglio di Calc, altrimenti viene mantenuto il comportamento normale.

##### In 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

##### In 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)

Tutte le routine e gli identificatori Basic di ScriptForge che iniziano con un carattere di sottolineatura "_" sono riservati per uso interno. Non è previsto il loro utilizzo nelle macro in Basic o negli script in Python.

Argomenti correlati

Servizio SFWidgets.PopupMenu

Servizio SFWidgets.Menu

Sostienici!