Macro OpenOffice Calc em Python - macro acionada pelo clique de um botão, como obter o nome desse botão?

Macro OpenOffice Calc em Python - macro acionada pelo clique de um botão, como obter o nome desse botão?

Eu sou realmente novo nisso e o Guia do Desenvolvedor do OpenOffice é muito difícil para eu entender ou eu me ajudaria.

Tenho um grande número de linhas com dados e em cada linha quero um botão que acione uma determinada macro rowMacro. Essa macro analisará/modificará os dados nessa linha específica. Para simplificar, digamos que ele apenas escreve uma string arbitrária em algum lugar da linha:

import uno
oDoc = XSCRIPTCONTEXT.getDocument()

def rowMacro(*args):
  oSheet = oDoc.CurrentController.ActiveSheet
  oCell1 = oSheet.getCellRangeByName("A4")
  CurContr=oDoc.getCurrentController().getSelection()
  oCell1.String = "Tada!"

Não quero criar uma dúzia de scripts separados quase idênticos para cada linha - portanto, não rowMacroRowAacionados por um botão específico na linha A, etc. Prefiro ter vários botões, todos acionando a mesma macro python. Essa macro precisa de alguma forma determinar qual botão foi usado (cada botão tem um nome exclusivo) e modificar apenas a linha apropriada. Então, preciso descobrir como obter o nome de um botão em python (saberei como lidar com isso a partir daí).

Eu tropecei em umpágina da Internetcom um trecho como este:

# get the sheet
accueil_sheet = model.Sheets.getByName("Accueil")
# access the draw page
oDrawPage = accueil_sheet.DrawPage
# count the number of form
oDrawPage.getForms().getCount()
# get the list box of the control element
ListBox = oDrawPage.getForms().getByIndex(0).getByName("Listbox")
# get the list box item list
ListBox.StringItemList
# get the list box controller
ListBoxCtrl = model.getCurrentController().getControl(ListBox)
# get the selected items:
ListBoxCtrl.SelectedItems

mas não sei como deduzir disso a solução do meu problema.

Para resumir:

  1. Como obter o nome de um botão que foi usado para acionar uma macro?
  2. Melhor ainda - como obter a sua posição, em particular uma linha? (este eu prefiro descobrir sozinho se você me empurrar na direção certa).

Responder1

O nome do botão pode ser determinado a partir doEvento de açãoque é passado como parâmetro. Para o exemplo abaixo, nomeei o botão btnRow4.

Conseguir a posição é mais difícil, mas é possível obtendo oXFormado botão do DrawPage. Aqui está o código que ilustra como tudo isso funciona:

def rowMacro(action_event=None):

    ## Get the button name.
    if action_event:
        button_name = action_event.Source.Model.getName()
    else:
        button_name = ''
    if button_name == 'btnRow4':
        rowname = "4"
    else:
        rowname = "5"

    ## Get the button position.
    oDoc = XSCRIPTCONTEXT.getDocument()
    oSheet = oDoc.CurrentController.ActiveSheet
    oDrawPage = oSheet.DrawPage
    oShape = None
    for i in range(oDrawPage.Count):
        aShape = oDrawPage.getByIndex(i)
        if aShape.supportsService("com.sun.star.drawing.ControlShape"):
            if aShape.getControl().getName() == button_name:
                oShape = aShape
    if oShape:
        ypos = oShape.getPosition().Y
    else:
        ypos = "(didn't click on a button)"

    ## Show results.
    oCell = oSheet.getCellRangeByName("A" + rowname)
    oCell.String = "Y Position: " + str(ypos)

Uma discussão sobre getPosition()está emhttps://forum.openoffice.org/en/forum/viewtopic.php?f=20&t=82422.

informação relacionada