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:

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:

Icona di nota

• 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.

Icona di suggerimento

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

Object

L'istanza alla classe del documento principale (o a una delle sue sottoclassi).

ShortcutCharacter

String

Carattere usato per definire il tasto di accesso alla voce del menu. Il carattere predefinito è ~.

SubmenuCharacter

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")
  
Icona di nota

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

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)
    
Icona di avvertenza

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.


Sostienici!

Sostienici!