ເນື້ອໃນ

# ບໍລິການ SFWidgets.ContextMenu

ເມນູຄລິກຂວາ (Context menus) ຖືກກຳນົດໄວ້ລ່ວງໜ້າຕັ້ງແຕ່ຕອນຕິດຕັ້ງ LibreOffice. ທ່ານສາມາດປັບແຕ່ງພວກມັນໄດ້ໃນກ່ອງໂຕ້ຕອບ Tools + Customize.

ບໍລິການ ContextMenu ມີຄວາມສາມາດດັ່ງນີ້:

- ປ່ຽນແທນລາຍການເມນູທັງໝົດຂອງເມນູຄລິກຂວາໃດໜຶ່ງເປັນການຊົ່ວຄາວ.

- ເພີ່ມລາຍການເມນູໃໝ່ໄວ້ທາງລຸ່ມຂອງເມນູຄລິກຂວາທີ່ກຳນົດໄວ້ລ່ວງໜ້າເປັນການຊົ່ວຄາວ.

- ເຮັດໃຫ້ເມນູຄລິກຂວາຢຸດເຮັດວຽກຊົ່ວຄາວ.

ການຕັ້ງຄ່າເມນູໃໝ່ຈະບໍ່ຖືກບັນທຶກໄວ້ໃນບ່ອນໃດ. ທັງໃນເອກະສານ ແລະ ໃນການຕັ້ງຄ່າຂອງ LibreOffice.

ເມນູຄລິກຂວາປົກກະຕິຈະຖືກຮຽກໃຊ້ໂດຍການຄລິກຂວາໃສ່ພື້ນທີ່ສະເພາະຂອງເອກະສານ. ເຊັ່ນ: ການຄລິກໃສ່ເຊລ ຫຼື ແຖບແຜ່ນງານໃນເອກະສານ Calc.

## ການຮຽກໃຊ້ບໍລິການ

ກ່ອນທີ່ຈະໃຊ້ບໍລິການ ContextMenu, ຫ້ອງສະໝຸດ ScriptForge ຈຳເປັນຕ້ອງຖືກໂຫຼດ ຫຼື ນຳເຂົ້າມາກ່ອນ:

• ມາໂຄຣ Basic ຕ້ອງມີການໂຫຼດຄັງສຳນວນ ScriptForge ໂດຍໃຊ້ຄຳສັ່ງດັ່ງນີ້:
GlobalScope.BasicLibraries.loadLibrary("ScriptForge")
• ສະຄຣິບ Python ຕ້ອງມີການນຳເຂົ້າຈາກໂມດູນ scriptforge:
from scriptforge import CreateScriptService

##### ໃນ Basic

ບໍລິການ ContextMenu ຖືກສ້າງຂຶ້ນຈາກວິທີການ SF_Document.ContextMenus() ແລະ 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

ການເຮັດວຽກຂອງ Sub ທີ່ກຳນົດຂ້າງເທິງ ຈະເປັນການກຳນົດເມນູຄລິກຂວາໃໝ່ທີ່ກ່ຽວຂ້ອງກັບພື້ນທີ່ສະເພາະໃນເອກະສານ, ໃນທີ່ນີ້ແມ່ນເຊລໃນເອກະສານ Calc.

ການກຳນົດຄ່າໃໝ່ນີ້ຈະຍັງຄົງຢູ່ຈົນກວ່າເອກະສານຈະຖືກປິດ ຫຼື ຈົນກວ່າຈະມີການກຳນົດເມນູຄລິກຂວາໃໝ່ອີກຄັ້ງ.

ໃຊ້ວິທີການ Dispose ເພື່ອຄືນຄ່າຊັບພະຍາກອນ (free resources) ຫຼັງຈາກໃຊ້ງານເມນູຄລິກຂວາສຳເລັດ.

##### ໃນ Python

ຕົວຢ່າງຂ້າງເທິງສາມາດຂຽນໃນ Python ໄດ້ດັ່ງນີ້:

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

## ຄຸນສົມບັດ

ຊື່ | ອ່ານຢ່າງດຽວ | ປະເພດ | ຄຳອະທິບາຍ
--- | --- | --- | ---
ParentDocument | ແມ່ນ | Object | ອິນສະແຕນ (instance) ຂອງຄລາດເອກະສານແມ່ (ຫຼື ໜຶ່ງໃນຄລາດຍ່ອຍຂອງມັນ).
ShortcutCharacter | ແມ່ນ | String | ຕົວອັກສອນທີ່ໃຊ້ເພື່ອລະບຸປຸ່ມເຂົ້າເຖິງຂອງລາຍການເມນູ. ຕົວອັກສອນເລີ່ມຕົ້ນແມ່ນ ~.
SubmenuCharacter | ແມ່ນ | String | ຕົວອັກສອນ ຫຼື ສະຕຣິງທີ່ກຳນົດວ່າລາຍການເມນູຈະຖືກຈັດຊັ້ນແນວໃດ. ຕົວອັກສອນເລີ່ມຕົ້ນແມ່ນ >.

## ເມນູ ແລະ ເມນູຍ່ອຍ

ເພື່ອສ້າງເມນູຄລິກຂວາທີ່ມີເມນູຍ່ອຍ, ໃຫ້ໃຊ້ຕົວອັກສອນທີ່ກຳນົດໃນຄຸນສົມບັດ SubmenuCharacter ໃນຂະນະທີ່ສ້າງລາຍການເມນູເພື່ອລະບຸຕຳແໜ່ງທີ່ມັນຈະຢູ່. ຕົວຢ່າງ: ໃຫ້ພິຈາລະນາລຳດັບຊັ້ນຂອງເມນູ/ເມນູຍ່ອຍຕໍ່ໄປນີ້.

        ' 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

ໂຄດຂ້າງລຸ່ມນີ້ໃຊ້ຕົວອັກສອນເມນູຍ່ອຍເລີ່ມຕົ້ນ > ເພື່ອສ້າງລຳດັບຊັ້ນເມນູ/ເມນູຍ່ອຍຕາມທີ່ກຳນົດຂ້າງເທິງ:

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

ສະຕຣິງ --- ແມ່ນໃຊ້ເພື່ອສ້າງເສັ້ນຂັ້ນໃນເມນູ ຫຼື ເມນູຍ່ອຍ.

## ການໃຊ້ໄອຄອນ

ຕ່າງຈາກເມນູປ໊ອບອັບ, ລາຍການເມນູຄລິກຂວາ (context menu) ຕ້ອງບໍ່ມີໄອຄອນໃດໆ.

## ວິທີການ

ລາຍຊື່ວິທີການໃນບໍລິການ ContextMenu
Activate | AddItem | RemoveAllItems

## Activate

ເຮັດໃຫ້ ລາຍການທີ່ເພີ່ມເຂົ້າ ຂອງ ເມນູຄລິກຂວາທີ່ເກັບໄວ້ໃນເອກະສານ ສາມາດໃຊ້ງານໄດ້ ຫຼື ປິດການໃຊ້ງານ, ຂຶ້ນກັບອາຄິວເມນ.

### ໄວຍາກອນ:

svc.Activate(opt enable: bool = True)

### ພາຣາມິເຕີ:

enable: ເມື່ອເປັນ True (ຄ່າເລີ່ມຕົ້ນ), ເມນູທ້ອງຖິ່ນທີ່ເກັບໄວ້ໃນເອກະສານຈະຖືກເປີດໃຊ້. ເມື່ອເປັນ False, ເມນູທ້ອງຖິ່ນຈະຖືກລະເລີຍ ແລະ ເມນູສ່ວນກາງທີ່ກຳນົດໃນລະດັບ LibreOffice ຈະຖືກນຳມາໃຊ້ແທນ.

## AddItem

ແຊກລາຍການເມນູລົງໃນເມນູຄລິກຂວາ.

### ໄວຍາກອນ:

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

### ພາຣາມິເຕີ:

menuitem: ກຳນົດຂໍ້ຄວາມທີ່ຈະສະແດງໃນເມນູ. ອາຄິວເມນນີ້ຍັງກຳນົດລຳດັບຊັ້ນຂອງລາຍການພາຍໃນເມນູໂດຍໃຊ້ຕົວອັກສອນເມນູຍ່ອຍ. ກຳນົດສ່ວນປະກອບສຸດທ້າຍເປັນ "---" ເພື່ອສ້າງເສັ້ນຂັ້ນ.

command: ຊື່ຂອງຄຳສັ່ງ UNO ທີ່ຈະຖືກເອີ້ນໃຊ້ເມື່ອຄລິກລາຍການນັ້ນ, ໂດຍບໍ່ຕ້ອງມີຄຳນຳໜ້າ .uno:. ຖ້າບໍ່ມີຊື່ຄຳສັ່ງນັ້ນ ຫຼື ບໍ່ສາມາດໃຊ້ໄດ້, ຈະບໍ່ມີຫຍັງເກີດຂຶ້ນ.

script: ທີ່ຢູ່ URI ສຳລັບສະຄຣິບ Basic ຫຼື Python ທີ່ຈະຖືກເອີ້ນໃຊ້ເມື່ອຄລິກລາຍການນັ້ນ. ສັງເກດວ່າສະຄຣິບທີ່ໃຫ້ມາຈະບໍ່ໄດ້ຮັບອາຄິວເມນໃດໆ.

### ຕົວຢ່າງ:

##### ໃນ 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")

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

ລຶບລາຍການທັງໝົດອອກ, ທັງ

- ທີ່ກຳນົດໄວ້ລ່ວງໜ້າດ້ວຍ Tools + Customize ແລະ ບັນທຶກໄວ້ໃນເອກະສານ

- ທີ່ເພີ່ມເຂົ້າດ້ວຍ contextmenu.AddItem()

ການດຳເນີນການນີ້ບໍ່ສາມາດກັບຄືນໄດ້ ຍົກເວັ້ນແຕ່ຈະປິດ ແລະ ເປີດເອກະສານຄືນໃໝ່.

ຫຼັງຈາກນັ້ນ, ເມື່ອຕ້ອງການ, ໃຫ້ໃຊ້ AddItem() ເພື່ອແຊກລາຍການເມນູໃໝ່.

### ໄວຍາກອນ:

svc.RemoveAllItems()

### ຕົວຢ່າງ:

ເຊື່ອມໂຍງ Sub/def ຖັດໄປກັບເຫດການຄລິກຂວາຂອງແຜ່ນງານ. ເມນູທີ່ປັບແຕ່ງເອງຈະປະກົດຂຶ້ນເມື່ອຄລິກຂວາໃນຖັນ C ຂອງແຜ່ນງານ Calc, ຖ້າບໍ່ດັ່ງນັ້ນຈະຍັງຄົງຮັກສາພຶດຕິກຳປົກກະຕິໄວ້.

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

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

ຣູທີນ ຫຼື ຕົວລະບຸ Basic ຂອງ ScriptForge ທັງໝົດທີ່ຂຶ້ນຕົ້ນດ້ວຍເຄື່ອງໝາຍຂີດກ້ອງ "_" ແມ່ນສະຫງວນໄວ້ສຳລັບໃຊ້ພາຍໃນ. ພວກມັນບໍ່ໄດ້ມີໄວ້ໃຫ້ໃຊ້ໃນມາໂຄຣ Basic ຫຼື ສະຄຣິບ Python.

ຫົວຂໍ້ທີ່ກ່ຽວຂ້ອງ

ບໍລິການ SFWidgets.PopupMenu

ບໍລິການ SFWidgets.Menu

ກະລຸນາສະໜັບສະໜູນພວກເຮົາ!