Inhoud

# SFWidgets.ContextMenu-service

Contextmenu's zijn vooraf gedefinieerd tijdens de installatie van LibreOffice. Ze kunnen worden aangepast in het dialoogvenster Extra - Aanpassen.

De ContextMenu-service biedt de volgende mogelijkheden:

- Tijdelijk alle menu-items van een specifiek contextmenu vervangen.

- Tijdelijk nieuwe menu-items toevoegen aan de onderkant van een vooraf gedefinieerd contextmenu.

- Het contextmenu tijdelijk uitschakelen.

De nieuwe menu-instellingen worden nergens opgeslagen. Noch in het document, noch in de instellingen van LibreOffice.

Een contextmenu wordt meestal geactiveerd door met de rechtermuisknop op een specifiek gedeelte van een document te klikken. Denk bijvoorbeeld aan het klikken in een cel of op een tabblad in een Calc-document.

## Service-aanroep

Voordat u de ContextMenu-service kunt gebruiken, moet de ScriptForge-bibliotheek geladen of geïmporteerd worden:

• Basic macro's kunnen de bibliotheek ScriptForge laden met de instructie:
GlobalScope.BasicLibraries.loadLibrary("ScriptForge")
• Python scripts kunnen de module scriptforge importeren met:
from scriptforge import CreateScriptService

##### In BASIC

De ContextMenu-service wordt geïnstantieerd vanuit de SF_Document.ContextMenus() en alleen SF_Datasheet.ContextMenus() methodes.

        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

Het uitvoeren van de hierboven gedefinieerde Sub herdefinieert het contextmenu dat betrekking heeft op een specifiek gebied in het document, in dit geval een cel die behoort tot een Calc-document.

De nieuwe definitie blijft actief totdat het document wordt gesloten of totdat het contextmenu opnieuw wordt gedefinieerd.

Gebruik de Dispose-methode om resources vrij te geven na het uitvoeren van het contextmenu.

##### In Python

Het bovenstaande voorbeeld kan als volgt in Python worden geschreven:

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

## Eigenschappen

Naam | Alleen-lezen | Type | Beschrijving
--- | --- | --- | ---
ParentDocument | Ja | Object | Het instantieobject van de bovenliggende documentklasse (of een van de subklassen daarvan).
ShortcutCharacter | Ja | String | Teken dat wordt gebruikt om de acceleratietoets van een menu-item te definiëren. Het standaardteken is ~.
SubmenuCharacter | Ja | String | Een teken of tekenreeks die bepaalt hoe menu-items genest zijn. Het standaardteken is >.

## Menu en submenu's

Om een contextmenu met submenu's te maken, gebruikt u het teken dat is gedefinieerd in de eigenschap SubmenuCharacter tijdens het aanmaken van het menu-item om te bepalen waar het moet worden geplaatst. Neem bijvoorbeeld de volgende menu-/submenu-hiërarchie.

        ' 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

De onderstaande code gebruikt het standaard submenu-teken > om de hierboven gedefinieerde menu-/submenu-hiërarchie te creëren:

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

De tekenreeks --- wordt gebruikt om scheidingslijnen in menu's of submenu's te definiëren.

## Pictogrammen gebruiken

In tegenstelling tot pop-upmenu's mogen items in een contextmenu geen pictogrammen bevatten.

## Methodes

Lijst met methodes in de ContextMenu-service
Activate | AddItem | RemoveAllItems

## Activate

Maak de toegevoegde items van het contextmenu dat in het document is opgeslagen beschikbaar voor uitvoering, of schakel ze juist uit, afhankelijk van het argument.

### Syntaxis:

svc.Activate(opt enable: bool = True)

### Parameters:

enable: Wanneer True (standaard), wordt het lokale menu dat in het document is opgeslagen, geactiveerd. Wanneer False, wordt het lokale menu genegeerd en heeft het globale menu dat is gedefinieerd op LibreOffice-niveau voorrang.

## AddItem

Voegt een menu-item toe aan het contextmenu.

### Syntaxis:

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

### Parameters:

menuitem: Definieert de tekst die in het menu wordt weergegeven. Dit argument definieert ook de hiërarchie van het item binnen het menu door gebruik te maken van het submenu-teken. Stel het laatste component in op "---" om een regelafscheider te definiëren.

command: De naam van het UNO-commando dat wordt uitgevoerd wanneer op het item wordt geklikt, zonder het voorvoegsel .uno:. Als de commandnaam niet bestaat of niet van toepassing is, gebeurt er niets.

script: De URI voor een Basic- of Python-script dat wordt uitgevoerd wanneer op het item wordt geklikt. Houd er rekening mee dat het opgegeven script geen argumenten mag bevatten.

### Voorbeeld:

##### 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 items verwijderen, beide

- vooraf gedefinieerd met Extra - Aanpassen en opgeslagen in het document

- toegevoegd met contextmenu.AddItem()

Deze actie kan alleen ongedaan worden gemaakt door het document te sluiten en opnieuw te openen.

Gebruik daarna, indien nodig, AddItem() om nieuwe menu-items toe te voegen.

### Syntaxis:

svc.RemoveAllItems()

### Voorbeeld:

Koppel de volgende Sub/def aan de rechtsklikgebeurtenis van een werkblad. Het aangepaste menu verschijnt wanneer u met de rechts klikt in kolom C van het Calc-werkblad; anders blijft het normale gedrag behouden.

##### 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-routines of variabelen die beginnen met een underscore "_" zijn voor intern gebruik. Gebruik deze niet in een Basic of Python-macro.

Verwante onderwerpen

Service SFWidgets.PopupMenu

SFWidgets.Menu-service

Help ons, alstublieft!