Создание обработчика диалогового окна

После назначения макросов событиям или создания слушателей событий можно перейти к использованию обработчиков диалогового окна, основная задача которых заключается в определении ключевых слов UNO или методов, сопоставленных с отслеживаемыми событиями. Обработчик событий отвечает за исполнение методов с помощью протокола vnd.sun.star.UNO:<method_name>. В отличие от слушателей, которые должны включать определение всех поддерживаемых методов (даже неиспользуемых), обработчики диалоговых окон должны определять только два метода — помимо сценариев, привязанных к элементам управления.

Преимущества данного подхода:

Данный механизм представлен здесь на примере языков Basic и Python при помощи импортированной копии диалогового окна Access2Base dlgTrace. Обработка исключений и локализация опущены для наглядности.

Назначение методов диалогового окна

Выполните экспорт диалогового окна Access2Base dlgTrace и импортируйте его в библиотеку приложения MyLib.

В панели свойств элемента управления Редактора диалоговых окон на вкладке «События» прямое назначение макросов замените назначением через компонент и введите имена вызываемых методов:

В назначенных событиям действиях необходимо указать протокол vnd.sun.star.UNO:.

Создание обработчика

Метод createDialogWithHandler службы com.sun.star.awt.DialogProvider2 используется для создания диалогового окна и назначения ему обработчика. Обработчик отвечает за реализацию интерфейса com.sun.star.awt.XDialogEventHandler.

Значок предупреждения

При использовании обработчика диалогового окна все имена методов компонента должны объявляться явно.


С помощью Python

В примере ниже диалоговое окно размещается на компьютере.


      # -*- coding: utf-8 -*-
      from __future__ import unicode_literals
          
      import uno, unohelper
      from com.sun.star.awt import XDialogEventHandler
          
      _DLG_PROVIDER = "com.sun.star.awt.DialogProvider2"
          
      class Console(unohelper.Base, XDialogEventHandler):
          """ Обработчик консоли Access2Base """
          ''' основано на « Créer un dialogue avec gestionnaire d'événements » (Создание диалогового окна с обработчиком событий) от JM Zambon
          https://wiki.openoffice.org/wiki/FR/Documentation/Python/Creating_Dialog_with_Handler '''
          def show(self):
              dialog = self.getDialog("MyLib.dlgTrace", embedded=True)
              dialog.Title = "Konsole"
              dialog.execute()
          
          def callHandlerMethod(self, dialog, event, method):
              if method == '_dump2File':
                  event.Source.setLabel("dump requested")
                  scr = getBasicScript(script="_DumpToFile", module="Trace",
                      library='Access2Base')
                  scr.invoke((event,), (), ())
              elif method == '_openHelp':
                  _msgbox('Not yet implemented')
                  dialog.endDialog(1)
              else:
                  return False
          
          def getSupportedMethodNames(self):
              return ('_dump2File', '_openHelp')
          
          def getDialog(self, libr_dlg: str, embedded=False):
              """ Создание диалогового окна по его расположению """
              smgr = XSCRIPTCONTEXT.getComponentContext().ServiceManager
              if embedded:
                  model = XSCRIPTCONTEXT.getDocument()
                  dp = smgr.createInstanceWithArguments(_DLG_PROVIDER, (model,))
                  location = "?location=document"
              else:
                  dp = smgr.createInstanceWithContext(_DLG_PROVIDER, ctx)
                  location = "?location=application"
              dlg = dp.createDialogWithHandler("vnd.sun.star.script:"+libr_dlg+location, self)
              return dlg
          
      # def getBasicScript()  # see note
           
      def _msgbox(prompt='', title=''):
          ''' Обычный MsgBox '''
          import msgbox
          mb = msgbox.MsgBox(uno.getComponentContext())
          mb.addButton('Howdy')
          mb.show(prompt,0,title)
          
      def ConsoleHandler():
          Console().show()
          
      g_exportedScripts = (ConsoleHandler,)
          
      
Значок примечания

Как и ожидалось, отсутствие метода onOkHasFocus вызывает исключение.


Значок подсказки

См. страницу Вызовы Python кLibreOffice Basic для изучения описания процедуры getBasicScript и получения подробной информации о выполнении межъязыковых сценариев.


С помощью LibreOffice Basic

В этом примере диалоговое окно встроено в документ, а также может размещаться на компьютере.


      ' <MyLib>.<Handler> module
          
      Public Sub Console_Show()
          Dim dp as Object ' com.sun.star.awt.DialogProvider2
          Dim dialog As Object ' com.sun.star.awt.XDialog, com.sun.star.awt.XDialogEventHandler
          Dim eventHandler As Object ' com.sun.star.awt.XDialogEventHandler
          dp = CreateUnoService("com.sun.star.awt.DialogProvider2")
          dp.Initialize(Array(ThisComponent)) ' если диалоговое окно встроено в документ
          eventHandler = CreateUnoListener("Console_", "com.sun.star.awt.XDialogEventHandler")
          dialog = dp.createDialogWithHandler("vnd.sun.star.script:MyLib.dlgTrace?location=document", eventHandler)
          dialog.Title = "Konsole"
          dialog.execute()
      End Sub ' <Handler>.Console_Show()
          
      Private Function Console_callHandlerMethod(dialog as Object, _
              event As com.sun.star.document.DocumentEvent, _
              method As String) As Boolean
          ''' Intercept dialog events using .UNO protocol '''
          Console_callHandlerMethod = True
          Select Case method
              Case "_dump2File"
                  event.Source.setLabel("dump requested")
                  With GlobalScope.BasicLibraries
                      If Not .IsLibraryLoaded("Access2Base") Then .LoadLibrary("Access2Base")
                  End With
                  Access2Base.Trace._DumpToFile
              Case "_openHelp" 
                  MsgBox "Not yet implemented",0 , "Howdy"
                  'dialog.endDialog(1), если диалоговое окно размещается на компьютере
              Case Else : Console_callHandlerMethod = False
          End Select
      End Function ' <Handler>.Console_callHandlerMethod
          
      Private Function Console_getSupportedMethodNames()
          Console_getSupportedMethodNames = Array("_dump2File", "_openHelp")
      End Function ' <Handler>.Console _getSupportedMethodNames
          
      ' основано на « Créer un dialogue avec gestionnaire d'événements » (Создание диалогового окна с обработчиком событий) от JM Zambon
      ' https://wiki.openoffice.org/wiki/FR/Documentation/Python/Creating_Dialog_with_Handler
      
Значок примечания

Как и ожидалось, отсутствие метода onOkHasFocus вызывает исключение.


Пожалуйста, поддержите нас!

Пожалуйста, поддержите нас!