# Se importa el UnoBridge para su uso con python

import uno

#----------------------------------------------------------------------------------------
# Este método permite ejecutar funciones propias de la hoja de cálculo pasando como
# argumentos el nombre de la función como texto y los argumentos de la función
# como un Array() por ejemplo: "SUM", Datos()

def getFunction(NombreFuncion, Datos):

	# Creando el Contexto
	Contexto=uno.getComponentContext()

	# Creando el ServiceManager
	Smgr=Contexto.getServiceManager()

	# Declarando el Statement
	Statement="com.sun.star.sheet.FunctionAccess"

	# Creando el Servicio
	Sfa=Smgr.createInstanceWithContext(Statement, Contexto)
	getFunction=Sfa.callFunction(NombreFuncion, Datos)

	return getFunction
#----------------------------------------------------------------------------------------
# Esta función permite definir una hoja pasando como argumento el nombre de la hoja

def isetSheet(SheetName):

    # Acceso al libro
    iBk=XSCRIPTCONTEXT.getDocument()

    # Acceso a la colección de hojas
    iSheets=iBk.getSheets()

    # Definición de la función
    isetSheet=iSheets.getByName(SheetName)

    # Devolución del resultado
    return isetSheet
#----------------------------------------------------------------------------------------
# Este médoto permite definir una celda o un rango de celdas pasando como argumentos
# la hoja como objeto y la referencia al rango o celda como texto.

def isetRange(ParentSheet, RangeReference):

    # Definición de la función
    isetRange=ParentSheet.getCellRangeByName(RangeReference)

    # Devolución del resultado
    return isetRange
#----------------------------------------------------------------------------------------
# Este método permite encontrar la última fila utilizada en un rango pasando como argumentos la hoja y una celda del rango como objetos ambos argumentos.

def LastRow(iSheet, iCell):

	#Se crea el cursor
    iCursor=iSheet.createCursorByRange(iCell)

    #Se envía el cursor al final del área utilizada
    iCursor.gotoEndOfUsedArea(True)

    #Se obtiene la fila de la última celda del área usada. Se ajusta en +1 porque
    #Las filas inician en cero
    LastRow=iCursor.RangeAddress.EndRow + 1

    #Devolución del resultado
    return LastRow
#---------------------------------------------------------------------------------------
# Este método permite ejecutar diversos comandos de la hoja de cálculo con solo parar el
# nombre interno del comando como texto y los argumentos como una tupla necesarios para
# ejecución. Se requiere conocer el nombre del comando y sus argumentos requeridos.
# Los argumentos pueden desarrollarse como una lista o tupla, pero para garantizar
# que el programa lo considera una tupla debe usarse la función tuple(). Por ejemplo
# DoCmd("Save", tuple(Args())

def DoCmd(CommandName, Args):

    # Acceso al libro
    iBk=XSCRIPTCONTEXT.getDocument()

    # Acceso al controller
    iController=iBk.CurrentController

    # Acceso al Frame
    iFrame=iController.Frame

    # Acceso al contexto
    iContext=uno.getComponentContext()

    # Acceso al ServiceManager
    Sgmr=iContext.getServiceManager()

    # Estableciendo el contexto
    Statement="com.sun.star.frame.DispatchHelper"

    # Creando el despachador
    Cmd=Sgmr.createInstanceWithContext(Statement, iContext)

    # Definiendo la función
    DoCmd=Cmd.executeDispatch(iFrame, ".uno:"+CommandName, "", 0, tuple([Args]))

    # Devolución del resultado
    return DoCmd
