Criar um manipulador de caixas de diálogo

Conteúdo

# 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:

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

- cancela a relação entre eventos e os nomes de macro, facilitando a manutenção ou atualização, em particular ao mover macros ou módulos.

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:

- Defina o nome do método do componente do botão da caixa de diálogo Gravar em ficheiro como _dump2File

- Opcionalmente, defina os nomes dos métodos dos componentes para os eventos de teclas pressionadas txtTracelog e botões do rato pressionados como _openHelp

- Opcionalmente, defina o nome do método do componente que recebe o evento de foco do botão Ok como onOkHasfocus

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.

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

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

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

### Com LibreOffice 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

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

Tópicos relacionados

Invocar macros Basic via Python

Abrir uma caixa de diálogo com Basic

Função CreateUnoListener

Criar ouvintes de evento

Abrir uma caixa de diálogo com Python

A escutar eventos do documento

Exemplos de programação em Python

Ajuda para os scripts Python no LibreOffice

Necessitamos da sua ajuda!