Sumário

# Criar um manipulador de caixa de diálogo

Em seguida a atribuir macros a eventos ou criar listeners de eventos, pode-se utilizar manipuladores de caixas de diálogo, cujo princípio é definir palavras chaves do UNO, ou métodos que são mapeados aos eventos a observar. O manipulador de eventos é responsável por executar métodos utilizando o protocolo vnd.sun.star.UNO:<method_name>. Diferente dos listeners que requerem definir todos os métodos suportados, mesmo que não utilizados, os manipuladores de caixa de diálogo requerem somente dois métodos a mais dos scripts de controle.

As vantagens dessa abordagem são:

- Empacota o código que manipula macros acionadas por eventos,

- Desacopla eventos de nomes de macro, o que facilita a manutenção ou atualização, em particular ao mover macros ou módulos.

Esse mecanismo é ilustrado aqui para as linguagens Python e Basic, utilizando uma copia importada da caixa de diálogo dlgTrace do Access2Base. O tratamento de exceções e da tradução foram omitidos por clareza.

## Métodos para atribuir diálogos.

Exportar a caixa de diálogo dlgTrace do Access2Base e importar na biblioteca da aplicação MyLib.

Dentro do painel das propriedades do controle do Editor de caixa de diálogo, utilize a aba Eventos para substituir a atribuição de macros por atribuição de componentes, e digite os nomes dos métodos:

- Defina o nome do método do componente botão do diálogo Despejar no arquivo para _dump2File

- Defina opcionalmente o nome do método do evento da tecla pressionada e botão do mouse txtTracelogcomo _openHelp

- Defina opcionalmente o botão Ok que recebe o foco do evento como onOkHasfocus

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

## Criar o manipulador

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

Ao usar um manipulador de diálogos, todos os nomes de componentes devem ser declarados explicitamente.

### Com Python

Neste exemplo, a caixa de diálogo está localizada 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):
              """ Manipulador de console do 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 um diálogo desde 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 horrível '''
              import msgbox
              mb = msgbox.MsgBox(uno.getComponentContext())
              mb.addButton('Howdy')
              mb.show(prompt,0,title)

          def ConsoleHandler():
              Console().show()

          g_exportedScripts = (ConsoleHandler,)

Conforme esperado, o método faltante onOkHasFocus lança uma exceção.

Consulte a página Chamadas do Python ao LibreOffice Basic para uma descrição da rotina getBasicScript e para detalhes sobre execução de scripts inter-linguagens.

### Com o LibreOffice Basic

Neste exemplo a caixa de diálogo está embutida no documento, e pode também estar 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)) ' no caso de diálogos embutidos 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, _
                  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) 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

Conforme esperado, o método faltante onOkHasFocus lança uma exceção.

Tópicos relacionados

Chamar macros Basic pelo Python

Abrir uma caixa de diálogo com Basic

Função CreateUnoListener

Criar listeners de evento

Abrir uma caixa de diálogo com Python

Acompanhar eventos de documento

Exemplos de programação em Python

Ajuda dos scripts Python do LibreOffice