Inhalte

# Dienst SFWidgets.ContextMenu

Kontextmenüs sind bei der Installation von LibreOffice vordefiniert. Sie können im Dialog unter Extras – Anpassen… angepasst werden.

Der Dienst ContextMenu bietet folgende Funktionen:

- Vorübergehend alle Menüpunkte eines bestimmten Kontextmenüs ersetzen.

- Neue Menüpunkte vorübergehend einem vordefinierten Kontextmenü unten hinzufügen.

- Das Kontextmenü vorübergehend deaktivieren.

Die neuen Menüeinstellungen werden nirgends gespeichert. Weder im Dokument noch in den LibreOffice-Einstellungen.

Ein Kontextmenü wird üblicherweise durch einen Rechtsklick auf einen bestimmten Bereich eines Dokuments aufgerufen. Beispielsweise durch Klicken in eine Zelle oder auf ein Tabellenregister in einem Calc-Dokument.

## Dienstaufruf

Bevor der Dienst ContextMenu verwendet werden kann, muss die Bibliothek ScriptForge geladen oder importiert werden:

• Grundlegende Makros erfordern das Laden der Bibliothek ScriptForge mit der folgenden Anweisung:
GlobalScope.BasicLibraries.loadLibrary("ScriptForge")
• Python-Skripte erfordern einen Import aus dem Modul scriptforge:
from scriptforge import CreateScriptService

##### In Basic

Der Dienst ContextMenu wird ausschließlich über die Methoden SF_Document.ContextMenus() und SF_Datasheet.ContextMenus() instanziiert.

        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

Durch Ausführen des oben definierten Sub wird das Kontextmenü für einen bestimmten Bereich im Dokument neu definiert, hier für eine Zelle, die zu einem Calc-Dokument gehört.

Die neue Definition bleibt so lange aktiv, bis das Dokument geschlossen oder das Kontextmenü erneut definiert wird.

Die Methode Dispose verwenden, um Ressourcen nach dem Aufruf des Kontextmenüs freizugeben.

##### In Python

Das obige Beispiel kann in Python wie folgt geschrieben werden:

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

## Eigenschaften

Name | Schreibgeschützt | Typ | Beschreibung
--- | --- | --- | ---
ParentDocument | Ja | Object | Die übergeordnete Dokumentklasse (oder eine ihrer Unterklassen) als Instanz.
ShortcutCharacter | Ja | String | Zu verwendendes Zeichen, um die Zugriffstaste eines Menüpunkts festzulegen. Das Standardzeichen ist ~.
SubmenuCharacter | Ja | String | Zeichen oder Zeichenfolge, die festlegt, wie Menüelemente verschachtelt sind. Das Standardzeichen ist >.

## Menü und Untermenüs

Um ein Kontextmenü mit Untermenüs zu erstellen, beim Erstellen des Menüeintrags das in der Eigenschaft SubmenuCharacter definierte Zeichen verwenden, um dessen Position festzulegen. Beispielsweise bei folgender Menü-/Untermenühierarchie.

        ' 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

Der folgende Code verwendet das standardmäßige Untermenüzeichen >, um die oben definierte Menü-/Untermenühierarchie zu erstellen:

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

Die Zeichenfolge --- wird verwendet, um Trennlinien in Menüs oder Untermenüs festzulegen.

## Symbole verwenden

Im Gegensatz zu Popup-Menüs dürfen Kontextmenüpunkte keine Symbole enthalten.

## Methoden

Liste der Methoden im Dienst „ContextMenu“
Activate | AddItem | RemoveAllItems

## Activate

Je nach Argument können die hinzugefügten Elemente des im Dokument gespeicherten Kontextmenüs zur Ausführung bereitgestellt oder deaktiviert werden.

### Syntax:

svc.Activate(opt enable: bool = True)

### Parameter:

enable: Wenn True (Standard), wird das im Dokument gespeicherte lokale Menü aktiviert. Wenn False, wird das lokale Menü ignoriert und das auf der Ebene LibreOffice definierte globale Menü hat Vorrang.

## AddItem

Fügt einen Menüeintrag in das Kontextmenü ein.

### Syntax:

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

### Parameter:

menuitem: Legt den im Menü anzuzeigenden Text fest. Dieses Argument legt außerdem die Hierarchie der Menüpunkte mithilfe des Untermenüzeichens fest. Die letzte Komponente auf "---" setzen, um einen Zeilenumbruch festzulegen.

command: Der Name des UNO-Befehls, der beim Anklicken des Elements ausgeführt wird, ohne das Präfix .uno:. Existiert der Befehlsname nicht oder ist er nicht anwendbar, geschieht nichts.

script: Die URI für ein Basic- oder Python-Skript, das beim Anklicken des Elements ausgeführt wird. Das angegebene Skript benötigt keine Argumente.

### Beispiel:

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

Alle Einträge entfernen, beide

- mit Extras – Anpassen… vordefiniert und im Dokument gespeichert

- hinzugefügt mit contextmenu.AddItem()

Diese Aktion kann nur durch Schließen und erneutes Öffnen des Dokuments rückgängig gemacht werden.

Anschließend können gegebenenfalls mit der Funktion AddItem() neue Menüpunkte eingefügt werden.

### Syntax:

svc.RemoveAllItems()

### Beispiel:

Das nächste Sub/def mit dem Rechtsklick-Ereignis einer Tabelle verknüpfen. Das benutzerdefinierte Menü wird beim Rechtsklick in Spalte C der Calc-Tabelle angezeigt; ansonsten bleibt das normale Verhalten erhalten.

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

Alle ScriptForge Basic-Routinen oder Bezeichner, denen ein Unterstrich "_" vorangestellt ist, sind für den internen Gebrauch reserviert. Sie sind nicht für die Verwendung in Basic-Makros oder Python-Skripten vorgesehen.

Verwandte Themen

Dienst SFWidgets.PopupMenu

Dienst SFWidgets.Menu

Bitte unterstützen Sie uns!