Spis treści

# Usługa SFWidgets.ContextMenu

Menu kontekstowe są predefiniowane podczas instalacji LibreOffice. Można je dostosować w oknie dialogowym Narzędzia + Dostosuj.

Usługa ContextMenu zapewnia następujące możliwości:

- Tymczasowe zastąpienie wszystkich elementów menu określonego menu kontekstowego.

- Tymczasowe dodanie nowej pozycji menu na dole zdefiniowanego wcześniej menu kontekstowego.

- Tymczasowe wyłączenie menu kontekstowego.

Nowe ustawienia menu nie są nigdzie zapisywane. Ani w dokumencie, ani w ustawieniach LibreOffice.

Menu kontekstowe zazwyczaj uruchamia się po kliknięciu prawym przyciskiem myszy w określonym obszarze dokumentu. Rozważ kliknięcie w komórce lub na karcie arkusza w dokumencie Calc.

## Wywoływanie usługi

Przed użyciem usługi ContextMenu należy załadować lub zaimportować bibliotekę ScriptForge:

• Podstawowe makra wymagają załadowania biblioteki ScriptForge przy użyciu następującej instrukcji:
GlobalScope.BasicLibraries.loadLibrary("ScriptForge")
• Skrypty Pythona wymagają importu z modułu scriptforge:
from scriptforge import CreateScriptService

##### W języku Basic

Usługa ContextMenu jest tworzona wyłącznie na podstawie metod SF_Document.ContextMenus() i 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

Uruchomienie funkcji Sub określonej powyżej powoduje ponowne zdefiniowanie menu kontekstowego powiązanego z konkretnym obszarem w dokumencie, w tym przypadku komórką należącą do dokumentu Calc.

Nowa definicja pozostanie aktywna do momentu zamknięcia dokumentu lub ponownego zdefiniowania menu kontekstowego.

Użyj metody Dispose, aby zwolnić zasoby po wykonaniu menu kontekstowego.

##### W języku Python

Powyższy przykład można zapisać w języku Python w następujący sposób:

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

## Właściwości

Nazwa | Tylko do odczytu | Typ | Opis
--- | --- | --- | ---
ParentDocument | Tak | Object | Instancja klasy dokumentu nadrzędnego (lub jednej z jej podklas).
ShortcutCharacter | Tak | String | Znak używany do określenia klawisza skrótu dla elementu menu. Domyślnym znakiem jest ~.
SubmenuCharacter | Tak | String | Znak lub ciąg znaków określający sposób zagnieżdżenia elementów menu. Domyślnym znakiem jest >.

## Menu i podmenu

Aby utworzyć menu kontekstowe z podmenu, użyj znaku zdefiniowanego we właściwości SubmenuCharacter podczas tworzenia wpisu menu, aby określić jego miejsce umieszczenia. Rozważmy na przykład następującą hierarchię menu/podmenu.

        ' 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

Poniższy kod wykorzystuje domyślny znak podmenu > do utworzenia hierarchii menu/podmenu zdefiniowanej powyżej:

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

Ciąg --- służy do definiowania wiersza separatora w menu lub podmenu.

## Korzystanie z ikon

W przeciwieństwie do menu podręcznych, elementy menu kontekstowego nie mogą zawierać żadnych ikon.

## Metody

Lista metod w usłudze ContextMenu
Activate | AddItem | RemoveAllItems

## Activate

Udostępnij dodane elementy menu kontekstowego zapisanego w dokumencie do wykonania lub przeciwnie, wyłącz je w zależności od argumentu.

### Składnia:

svc.Activate(opt enable: bool = True)

### Parametry:

enable: gdy wartość wynosi True (domyślnie), menu lokalne zapisane w dokumencie jest aktywowane. Gdy wartość wynosi False, menu lokalne jest ignorowane, a pierwszeństwo ma menu globalne zdefiniowane na poziomie LibreOffice.

## AddItem

Wstawia wpis menu do menu kontekstowego.

### Składnia:

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

### Parametry:

menuitem: określa tekst wyświetlany w menu. Ten argument definiuje również hierarchię elementu w menu za pomocą znaku podmenu. Ustaw ostatni komponent na "---", aby zdefiniować separator wiersza.

command: nazwa polecenia UNO, które zostanie uruchomione po kliknięciu elementu, bez prefiksu .uno:. Jeśli nazwa polecenia nie istnieje lub jest nieodpowiednia, nic się nie stanie.

script: URI skryptu języka Basic lub Python, który zostanie wykonany po kliknięciu elementu. Należy pamiętać, że podany skrypt nie otrzyma żadnego argumentu.

### Przykład:

##### W języku 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")

##### W języku 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

Usuń wszystkie elementy, oba

- zdefiniowane wstępnie za pomocą Narzędzia + Dostosuj i zapisane w dokumencie,

- dodane za pomocą contextmenu.AddItem().

Tej czynności nie można cofnąć inaczej niż poprzez zamknięcie i ponowne otwarcie dokumentu.

Następnie, gdy będzie to konieczne, użyj AddItem(), aby wstawić nowe pozycje menu.

### Składnia:

svc.RemoveAllItems()

### Przykład:

Powiąż następnie Sub/def ze zdarzeniem kliknięcia arkusza prawym przyciskiem myszy. Menu niestandardowe pojawia się po kliknięciu prawym przyciskiem myszy w kolumnie C arkusza Calc, w przeciwnym razie normalne zachowanie jest zachowane.

##### W języku 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

##### W języku 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)

Wszystkie podstawowe procedury lub identyfikatory ScriptForge poprzedzone znakiem podkreślenia „_” są zarezerwowane do użytku wewnętrznego. Nie należy ich używać w makrach Basic ani skryptach Pythona.

Tematy pokrewne

Usługa SFWidgets.PopupMenu

Usługa SFWidgets.Menu

Prosimy o wsparcie!