Criar uma manipulador de caixas de diálogo

Para além de atribuir macros a eventos ou criar ouvintes de eventos, é possível utilizar manipuladores de diálogos, cujo princípio consiste em definir palavras-chave UNO, ou métodos, que são mapeados para os eventos a monitorizar. O manipulador de eventos é responsável por executar métodos utilizando o protocolo vnd.sun.star.UNO:<method_name>. Ao contrário dos ouvintes, que exigem a definição de todos os métodos suportados, mesmo que não sejam utilizados, os manipuladores de diálogo requerem apenas dois métodos, para além dos scripts de ligação de controlo pretendidos.

As vantagens desta abordagem são:

Este mecanismo é aqui ilustrado para as linguagens Basic e Python, utilizando uma cópia importada da caixa de diálogo Access2Base dlgTrace. O tratamento de exceções e a localização foram omitidos por uma questão de clareza.

Atribuição de métodos de diálogo

Exporte a caixa de diálogo Access2Base dlgTrace e importe-a para a biblioteca de aplicações MyLib.

No painel de propriedades do controlo do Dialog Editor, utilize o separador «Eventos» para substituir as atribuições de macros por atribuições de componentes e introduza os nomes dos métodos pretendidos:

As ações atribuídas aos eventos devem mencionar o protocolo vnd.sun.star.UNO:.

Criação do manipulador

O método createDialogWithHandler do serviço com.sun.star.awt.DialogProvider2 é utilizado para definir a caixa de diálogo e o seu manipulador. O manipulador é responsável por implementar a interface com.sun.star.awt.XDialogEventHandler.

Ícone de aviso

Todos os nomes dos métodos dos componentes devem ser declarados explicitamente ao utilizar um manipulador de caixas de diálogo.


Com Python

Neste exemplo, a caixa de diálogo encontra-se no computador.


      # -*- 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):
          """ Gestor da Consola Access2Base """
          ''' adaptado de « Créer un dialogue avec gestionnaire d'événements » by 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):
              """ Criar uma caixa de diálogo a partir da sua localização """
              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 Feia '''
          import msgbox
          mb = msgbox.MsgBox(uno.getComponentContext())
          mb.addButton('Howdy')
          mb.show(prompt,0,title)
          
      def ConsoleHandler():
          Console().show()
          
      g_exportedScripts = (ConsoleHandler,)
          
      
Ícone de nota

Como era de esperar, o método onOkHasFocus que não existe lança uma exceção.


Ícone da dica

Consulte a página Python calls to LibreOfficeDev Basic para obter a descrição da rotina getBasicScript e para obter detalhes sobre a execução de scripts entre linguagens.


Com LibreOfficeDev Basic

Neste exemplo, a caixa de diálogo está incorporada num documento e pode igualmente estar localizada no computador.


      ' <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)) ' se for uma caixa de diálogo incorporada no documento
          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, _
              método 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) se for uma caixa de diálogo no computador
              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
          
      ' adaptado de « Créer un dialogue avec gestionnaire d'événements » by JM Zambon
      ' https://wiki.openoffice.org/wiki/FR/Documentation/Python/Creating_Dialog_with_Handler
      
Ícone de nota

Como era de esperar, o método onOkHasFocus que não existe lança uma exceção.


Necessitamos da sua ajuda!

Necessitamos da sua ajuda!