".uno:VersionDialog"

Desarrollo de Macros y programación en UNO, usar las API, llamar programas externos...
Responder
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

".uno:VersionDialog"

Mensaje por Longi »

Buenas!

Quisiera saber los argumentos que es posible usar y su valor para el array de condiciones a usar en el cuadro de diálogo de versiones anteriores de un documento (Writer, por ejemplo), de tal manera que lo podamos ejecutar sin que aparezca dicho diálogo, o sea, abrir una versión guardada previamente con el siguiente código:

Código: Seleccionar todo

Function HacerVersion (Doc)

    dim document   as object
    dim dispatcher as object
    document   = Doc.CurrentController.Frame
    dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
    dim args1(0) as new com.sun.star.beans.PropertyValue
    args1(0).Name = "VersionComment"
    args1(0).Value = ""
    dispatcher.executeDispatch(document, ".uno:Save", "", 0, args1())
 
End Function
Y en otro momento aplicar

Código: Seleccionar todo

Function RecuperarVersion(Doc)
    dim document   as object
    dim dispatcher as object
    document   = Doc.CurrentController.Frame
    dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
    dim args1(1) as new com.sun.star.beans.PropertyValue
    dispatcher.executeDispatch(document, ".uno:VersionDialog", "", 0, args1())
End Function
Es decir, los args1() que determinan la forma de ejecutarse el dispatcher de esta última función, para que abra la última versión disponible, sin que aparezca el cuadro de diálogo (si fuese posible).
También se admiten métodos alternativos.
He buscado por allá donde Google ha sabido, y no he encontrado nada.
Gracias y un saludo!
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
Avatar de Usuario
fornelasa
Mensajes: 3268
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: ".uno:VersionDialog"

Mensaje por fornelasa »

Longi escribió:para que abra la última versión disponible, sin que aparezca el cuadro de diálogo
Si hubiera entendido bien aquí un ejemplo; cambia a tu ruta:

Código: Seleccionar todo

Sub Main
Doc = ConvertToURL("C:\Users\Federico\Downloads\prueba.ods") 
RecuperarVersion Doc
End Sub


Sub RecuperarVersion(Doc)
    Dim Args1(1) As New com.sun.star.beans.PropertyValue    
     args1(0).Name = "Version"
     args1(0).Value = 0
        oDoc = StarDesktop.loadComponentFromURL(Doc, "_blank", 0, Args1())    
End sub
lo 6.2.0 | aoo 4.1.6 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: ".uno:VersionDialog"

Mensaje por Longi »

Gracias por la respuesta, pero pasa lo habitual: ¡Soy de ciencias!, por lo que me explico entre regular y bastante mal.
Te pongo el ejemplo completo par a que veas como va:
Pretendo poner un icono en la barra de herramientas que llame a una macro cuando queramos aplicarla. Esta macro tiene como función la modificación de textos en cuanto a su tamaño de letra, interlineado, imágenes, marcos de texto, marcos, tablas, y todo lo que se nos pueda imaginar (por lo que tendrá tantos fallos como nos podamos imaginar), con la intención de ajustar el tamaño del documento al tamaño de página.
Al 'poder' tener resultados inesperados o no deseados, quisiera tener una copia de seguridad del documento inicial para volver a ella si el resultado no es el deseado.
Encontré que el sistema de copia del documento (nos quedaría en el portapapeles) no respeta membretes , y me lié con esto de las versiones.
También intenté hacer la copia y después pegar los formatos, con lo que los membretes respondían bien, pero a la hora de hacer reducción o ampliación de texto dentro de un cuadro de texto me salía un bug que me hizo aparcar esa vía

Añado un documento en el que se explica el porqué y el cómo de la macro (es un poco largo), y aquí te dejo todo el código, para que veas que para mí es difícl aplicar tu solución, ya que no tengo manera de saber la ruta de la versión que deseo recuperar(seguramente solo es ignorancia) para sustituir el documento al que la macro le llevó.

Código: Seleccionar todo

Sub AjustarTexto(Distancia)
    '---------------------------------------------------------------------
    ' Modificaciones sobre procedimiento publicado por Christoph Lutz 
    Dim objSize as New com.sun.star.awt.Size

    '--------------------------------------------------------------------
    ' Variables que pueden ser modificadas según conveniencia
  
    Minimo= 5000                                                                      ' Constante de distancia
    Maximo= 27000                                                                     ' Constante de distancia
    Medio = 10000                                                                     ' Constante de distancia
    MedioAmpliado= 15000                                                              ' Constante de distancia
    Paglim=4                                                                          ' Páginas a partir de las cuales cambian los criterios
    scaleinc=0.005                                                                    ' Cambia la escala en pasos del 0,005%
    '--------------------------------------------------------------------------
    ' 1º Contamos las páginas y tomamos el control del texto                                            
   
    Doc= ThisComponent                                                                ' Documento a manejar
    document   = ThisComponent.CurrentController.Frame                                ' Control del documento
    odispatcher = createUnoService("com.sun.star.frame.DispatchHelper")               ' Despachador
    User= Environ("USERNAME")                                                         ' Usuario del programa
    paginas=ThisComponent.getCurrentController().getPropertyValue("PageCount")        ' Número de páginas
    if paginas=1 Then Exit sub                                                        ' Si es una página nos echa
    HacerVersion (Doc)                                                                ' Hacemos una versión de respaldo del documento original

    oText = doc.getText()                                                             ' Tomamos el control del texto del documento
    oCursor = oText.createTextCursor()                                                ' Creamos un cursor de texto
    oCursor.gotoStart(False)                                                          ' Vamos al inicio del texto
    oCursor.goToEnd (False)                                                           ' Vamos al final del texto, seleccionándolo
    '---------------------------------------------------------------
    ' 2º Ponemos una forma (rectángulo) al final del texto (tamaño minúsculo y sería transparente, por lo que al final no se vería)
 
    oShape = doc.createInstance("com.sun.star.drawing.RectangleShape")                ' Vamos a insertar un rectángulo
    Objsize.Width = 1                                                                 ' Anchura del rectángulo
    Objsize.Height = 1                                                                ' Altura del rectángulo
    oShape.setSize(Objsize)                                                           ' Tamaño de la forma
    oShape.name="Auxiliar"
    oShape.LineColor=RGB (255,255,255)                                                ' Color blanco
    oShape.LineWidth= 1                                                               ' Grosor de la línea
    oText.insertTextContent( oCursor, oShape, False )                                 ' Inserción del rectángulo
    oShape.AnchorType = com.sun.star.text.TextContentAnchorType.AS_CHARACTER          ' Lo ancoramos como carácter
    oShape.Surround = com.sun.star.text.WrapTextMode.THROUGHT                         ' NONE, THROUGHT, DYNAMIC, PARALLEL, LEFT, RIGHT
    oShape.AnchorType = com.sun.star.text.TextContentAnchorType.AT_PAGE               ' Lo ancoramos a la página
    Distanciaa=oShape.getPosition().Y                                                 ' Distancia al borde superior de la página
    oShape.AnchorType = com.sun.star.text.TextContentAnchorType.AS_CHARACTER          ' Lo ancoramos como carácter
    '-------------------------------------------------------------------
    ' 3º Contamos los párrafos que tiene el documento
    
    CantidadParrafos(doc, npars)                                                      ' Llamamos a la función de contar el número de párrafos
    DistanciaReferencia (doc, oShape,Distancia)                                       ' Llamamos a la función que mide
    '-------------------------------------------------------------------
    ' 4º Actuamos sobre cada párrafo dependiendo del número de páginas y localización de la forma auxiliar

    scalemax=0.05                                                                     ' Máxima modificación de la escala de reducción
    scale=0                                                                           ' Escala inicial de reducción 0

    oText = doc.getText()                                                             ' Tomamos el control del texto del documento
    oCursor = oText.createTextCursor()                                                ' Creamos un cursor de texto
    oCursor.gotoStart(False)                                                          ' Vamos al inicio del texto
    '-------------------------------------------------------------------
    ' 5º Caso primero, reducción del texto

    If Paginas<Paglim and (Distanciaa <= Minimo or Distanciaa>Maximo) or Paginas>=Paglim and (Distanciaa <= MedioAmpliado) then ' Según páginas y localización de forma auxiliar
    While scalemax >= scale                                                           ' Mientras la escala sea menor que la máxima
    scale=scale+scaleinc                                                              ' Se le suma la escala del momento más un 0,0005%
    Escala=1-scale                                                                    ' Parámetro que usaremos después
    ObjetoDibujo(Doc, Escala)                                                         ' Llamamos a la función del objeto de dibujo
    Tabla (Doc, Escala)                                                               ' Llamamos a la función de tabla
    Resize (doc, oShape,oCursor,Escala, npars)                                        ' Llamamos a la función que modifica el tamaño
    DistanciaReferencia (doc, oShape,Distancia)                                       ' Medimos la distancia 
    '---------------------------------------------------------------
    ' Control de distancia para salir de la macro
    
    If (Paginas<Paglim and (Distancia > Medio)) or (Paginas>=Paglim and (Distancia > (Maximo))) Then' Si las distancias superan los límites permitidos 
    oShape.Dispose                                                                    ' Eliminamos la forma auxiliar
    Recuperacion (Doc,Copia)
    Exit Sub                                                                          ' Nos echa de la macro
    End if                                                                            ' Acabamos la condición
    '----------------------------------------------------------------
    ' Control de número de páginas para salir de la macro
    
    If paginas2<=paginas-1 or paginas2>paginas  Then                                  ' Si las páginas superan los límites permitidos
    oShape.Dispose                                                                    ' Eliminamos la forma auxiliar
    Recuperacion (Doc,Copia)
    Exit Sub                                                                          ' Nos echa de la macro
    End if                                                                            ' Acabamos la condición
    '-----------------------------------------------------------------
    ' Si no hemos sido expulsados, seguimos el ciclo
    
    oCursor.gotoStart (false)                                                         ' Vamos al inicio del texto
    Wend                                                                              ' Vamos al siguiente ciclo de modificación
    End if                                                                            ' Acabamos con la condición para reducción
    '----------------------------------------------------------
    ' 8º Caso segundo, aumento de texto
    
    If  (Paginas<Paglim and (Distanciaa>Minimo)) and (Paginas<Paglim and (Distanciaa<=Medio)) or (Paginas>=Paglim and (Distancia > MedioAmpliado)) then ' Según páginas y localización de forma auxiliar
    While scalemax >= scale                                                           ' Mientras la escala sea menor que la máxima
    scale=scale+scaleinc                                                              ' Se le suma la escala del momento más el porcentaje fijado
    Escala=1+scale                                                                    ' Parámetro que usaremos después
    ObjetoDibujo(Doc, Escala)                                                         ' Llamamos a la función que actúa en las formas
    Tabla (Doc, Escala)
    Resize (doc, oShape,oCursor,Escala, npars)                                        ' Llamamos a la función que modifica el tamaño
    DistanciaReferencia (doc, oShape,Distancia)                                       ' Medimos la distancia 
    '---------------------------------------------------------------
    ' Control de distancia para salir de la macro
    
    If (Paginas<Paglim and (Distancia > Medio)) or (Paginas>=Paglim and (Distancia > (Maximo))) Then' Si las distancias superan los límites permitidos 
    oShape.Dispose                                                                    ' Eliminamos la forma auxiliar
    Recuperacion (Doc,Copia)                                                               ' Llamamos la función que recupera el documento
    Exit Sub                                                                          ' Nos echa de la macro
    End if                                                                            ' Acabamos la condición
    '----------------------------------------------------------------
    ' Control de número de páginas para salir de la macro
    
    If paginas2<=paginas-1 or paginas2>paginas  Then                                  ' Si las páginas superan los límites permitidos
    oShape.Dispose                                                                    ' Eliminamos la forma auxiliar
    Recuperacion (Doc,Copia)                                                                ' Llamamos la función que recupera el documento
    Exit Sub                                                                          ' Nos echa de la macro
    End if                                                                            ' Acabamos la condición
    '-----------------------------------------------------------------
    ' Si no hemos sido expulsados, seguimos el ciclo

    oCursor.gotoStart (false)                                                         ' Vamos al inicio del texto
    Wend                                                                              ' Vamos al siguiente ciclo de modificación
    End if                                                                            ' Acabamos con la condición de aumento
    oShape.Dispose                                                                    ' Eliminamos la forma auxiliar

End Sub
Function CantidadParrafos(doc, npars)
    
    npars=0                                                                           ' Ponemos la constante a 0
    oText = doc.getText()                                                             ' Tomamos el control del texto del documento
    oCursor = oText.createTextCursor()                                                ' Creamos un cursor de texto
    oCursor.goToEnd (False)                                                           ' Vamos al final del texto
    oEnum = doc.Text.createEnumeration()                                              ' Enumeración de elementos de texto
    Do While oEnum.hasMoreElements()                                                  ' Mientras hay más elementos de texto
    oPar = oEnum.nextElement()                                                        ' Siguiente elemento de texto
    If oPar.supportsService("com.sun.star.text.Paragraph") Then                       ' Si es un párrafo
    nPars = nPars + 1                                                                 ' añadimos un párrafo más
    End if                                                                            ' Acabamos la condición de ser párrafo
    Loop                                                                              ' Vamos al siguiente elemento de texto

End Function

Function DistanciaReferencia (Doc, oShape,Distancia)
 
    oText = doc.getText()                                                             ' Tomamos el control del texto del documento
    oCursor = oText.createTextCursor()                                                ' Creamos un cursor de texto
    oCursor.goToEnd (True)                                                            ' Vamos al final del texto
    oShape.AnchorType = com.sun.star.text.TextContentAnchorType.AS_CHARACTER          ' Lo ancoramos como carácter
    oShape.Surround = com.sun.star.text.WrapTextMode.THROUGHT                         ' NONE, THROUGHT, DYNAMIC, PARALLEL, LEFT, RIGHT
    oShape.AnchorType = com.sun.star.text.TextContentAnchorType.AT_PAGE               ' Lo ancoramos a la página
    Distancia=oShape.getPosition().Y                                                  ' Distancia al borde superior de la página
    oShape.AnchorType = com.sun.star.text.TextContentAnchorType.AS_CHARACTER          ' Lo ancoramos como carácter

End function


Function Resize (doc, oShape,oCursor,Escala, npars)

    oDispatcher = createUnoService("com.sun.star.frame.DispatchHelper")               ' Creamos un servicio de 'despachador'
    '----------------------------------------------
    ' 1º Hacemos el repaso párrafo a párrafo, parcheando si hay letras de distinto tamaño dentro del párrafo

    For i=0 to  nPars-1                                                               ' Ciclo para recorrer todos los párrafos

    oCursor.gotoStartOfParagraph (False)                                              ' Nos colocamos en el inicio del párrafo
    oCursor.gotoEndOfParagraph (True)                                                 ' Vamos al final del párrafo, seleccionándolo
    '----------------------------------------------------------
    ' 2º Parche si un párrafo tiene alguna letra con tamaño diferente de las demás

    if  Cint( oCursor.Charheight) <>0 Then                                            ' Si el párrafo tiene todos los caracteres iguales
    oCursor.CharHeight = oCursor.CharHeight*(Escala)                                  ' Modificamos el tamaño de letra según escala
    LineSpace = oCursor.paralinespacing                                               ' Toma el control del interlineado 
      If Escala>1 and LineSpace.Height<140 Then                                       ' Si hay que aumentar tamaño y el interlineado es inferior a 140 (no se aumentará por encima de 140)
        LineSpace.height = LineSpace.height*(Escala)                                  ' Interlineado se disminuye según la escala
        oCursor.paralinespacing = LineSpace                                           ' Se aplica el interlineado
      End if                                                                          ' Se acaba la condición de interlineado
      If Escala<1 and LineSpace.Height>110 Then                                       ' Si hay que disminuir tamaño y el interlineado es superior a 110 (no se reducirá por debajo de esta cifra)
        LineSpace.height = LineSpace.height*(Escala)                                  ' Interlineado se disminuye según la escala
        oCursor.paralinespacing = LineSpace                                           ' Se aplica el interlineado
      End if                                                                          ' Se acaba la condición de interlineado
    
    Else                                                                              ' Si el párrafo tiene caracteres de distintos tamaños
    LineSpace = oCursor.paralinespacing                                               ' Toma el control del interlineado 
      If Escala>1 and LineSpace.Height<140 Then                                       ' Si hay que aumentar tamaño y el interlineado es inferior a 140 (no se aumentará por encima de 140)
        LineSpace.height = LineSpace.height*(Escala)                                  ' Interlineado se disminuye según la escala
        oCursor.paralinespacing = LineSpace                                           ' Se aplica el interlineado
      End if                                                                          ' Se acaba la condición de interlineado
      If Escala<1 and LineSpace.Height>110 Then                                       ' Si hay que disminuir tamaño y el interlineado es superior a 110 (no se reducirá por debajo de esta cifra)
        LineSpace.height = LineSpace.height*(Escala)                                  ' Interlineado se disminuye según la escala
        oCursor.paralinespacing = LineSpace                                           ' Se aplica el interlineado
      End if                                                                          ' Se acaba la condición de interlineado


    oCursor.ParaTopMargin=oCursor.ParaTopMargin*(Escala)                              ' Disminuimos la parte alta del párrafo
    oCursor.ParaBottomMargin=oCursor.ParaBottomMargin*(Escala)                        ' Disminuimos la parte baja del párrafo
    oCursor.gotoStartOfParagraph (False)                                              ' Nos colocamos en el inicio del párrafo
    oCursor.gotoEndOfParagraph (True)                                                 ' Vamos al final del párrafo, seleccionándolo

     for a=0 to len (oCursor.String)                                                  ' Iniciamos ciclo recorriendo cada carácter del párrafo
      oCursor.gotoStartOfParagraph (False)                                            ' Vamos al inicio del párrafo
      oCursor.goRight(a,False)                                                        ' Nos movemos tantos lugares a la derecha como letras se cuentan en ese momento
      oCursor.goRight(1,True)                                                         ' Vamos al siguiente carácter
      oCursor.CharHeight = oCursor.CharHeight*(Escala)                                ' Disminuimos la altura de la letra
     next                                                                             ' Retomamos el ciclo de caracteres
    End if                                                                            ' Acabamos condición de tamaño de caracteres iguales o no
    oCursor.gotoNextParagraph(False)                                                  ' Vamos al siguiente párrafo
    '----------------------------------------------------------------------------
    ' Freno al avance en los párrafos
    
    if i=npars-1 Then                                                                 ' Si hemos alcanzado el último párrafo
    Exit for                                                                          ' Salimos del ciclo, y entra un nuevo ciclo de reducción recorriendo todos los párrafos
    End if                                                                            ' Acabamos la condición de estar en el último párrafo

    '-------------------------------------------------------------------------------
    '  Medimos distancia del final del texto al borde superior de la página y contamos las páginas
    
    DistanciaReferencia(Doc, oShape, Distancia)                                       ' Llamada a la función de medición
    oDispatcher.executeDispatch(doc.currentController.Frame, ".uno:Repaginate", "", 0, Array()) ' Repaginamos
    paginas2=doc.getCurrentController().getPropertyValue("PageCount")                 ' Número de páginas
    '----------------------------------------------------------------------------
    ' Controles de avance del cambio de tamaños
 
    If (Paginas<Paglim and (Distancia > Medio)) or (Paginas>=Paglim and (Distancia > Maximo)) Then Exit Function
    if paginas2<=paginas-1 or paginas2>paginas Then Exit For

    Next
    if paginas2>paginas Then                                                          ' Si nos pasamos de número de páginas (Hemos aumentado demasiado)
    Afinar (Doc, oShape,paginas,paginas2,npars,scale)                                 ' Llamamos a la función afinar, que reducirá el interlineado un 5%
    End if                                                                            ' Acabamos la condición
   
End  Function

Function Afinar (Doc, oShape,paginas,paginas2,npars,scale)
    
    Escala=0.95                                                                       ' Establecemos un nuevo valor para Escala
    DistanciaReferencia(Doc, oShape, Distancia)                                       ' Llamada a la función de medición
    oText = doc.getText()                                                             ' Tomamos el control del texto del documento
    oCursor = oText.createTextCursor()                                                ' Creamos un cursor de texto
    oCursor.gotoStart(False)                                                          ' Ponemos el cursor al inicio del texto
    For i=1 to nPars-1                                                                ' Ciclo para recorrer todos los párrafos
      oCursor.gotoStartOfParagraph (False)                                            ' Nos colocamos en el inicio del párrafo
      oCursor.gotoEndOfParagraph (True)                                               ' Vamos al final del párrafo, seleccionándolo
      LineSpace = oCursor.paralinespacing                                             ' Toma el control del interlineado 
      LineSpace.height = LineSpace.height*(Escala)                                    ' Interlineado se disminuye según la escala
      oCursor.paralinespacing = LineSpace                                             ' Se aplica el interlineado
      oCursor.gotoNextParagraph(True)                                                 ' Vamos al siguiente párrafo
      paginas3=doc.getCurrentController().getPropertyValue("PageCount")               ' Número de páginas
      DistanciaReferencia(Doc, oShape, Distancia)                                     ' Llamamos a la función de medición
      if paginas3=paginas Then Exit Function                                          ' Si hemos igualado las páginas, entonces salimos
    next                                                                              ' Procesamos el siguiente párrafo

End Function

Function ObjetoDibujo(Doc, Escala)

    oDrawPage = Doc.DrawPage                                                          ' Página de dibujo
    Dim objSize as New com.sun.star.awt.Size                                          ' Control del tamaño de la forma
    Dim Point As New com.sun.star.awt.Point	
    For i = 0 to oDrawPage.Count - 1                                                  ' Recorremos todas los elementos de dibujo del documento
    oShape = oDrawPage.getByIndex(i)                                                  ' Elemento de dibujo a inspeccionar en este momento
    if oShape.name <>"" and oShape.name <>"Auxiliar" and oShape.name <>"Imaxe13" and oShape.name <>"Imaxe14" and oShape.name <>"Imaxe15"Then                                                          ' Si la forma tiene nombre
    if not (oShape.supportsService("com.sun.star.text.TextGraphicObject"))Then
    oText= oShape.getText()                                                           ' Texto dentro de la forma
    oCurs = oText.createTextCursor ()                                                 ' Cursor de texto
    oCurs.gotoStart (false)                                                           ' Vamos al principio del texto
    oCurs.gotoEnd (True)                                                              ' Vamos al final del texto y lo seleccionamos

    oCurs.CharHeight =oCurs.CharHeight*Escala                                         ' Nuevo tamaño de letra
    LineSpace = oCurs.paralinespacing                                                 ' Toma el control del interlineado 
    LineSpace.height = LineSpace.height*(Escala)                                      ' Interlineado se modifica según la escala
    oCurs.paralinespacing = LineSpace                                                 ' Se aplica el interlineado

    Objsize.Width = oShape.Size.Width                                                 ' Nueva anchura de la forma
    Objsize.Height = oShape.Size.Height*(Escala)                                      ' Nueva altura de la forma
    oShape.setSize(Objsize)                                                           ' Se aplica el tamaño de la forma
    End if
    if oShape.supportsService("com.sun.star.text.TextGraphicObject")Then              ' Si es una imagen
    Objsize.Width = oShape.Size.Width*(Escala)                                        ' Nueva anchura de la forma
    Objsize.Height = oShape.Size.Height*(Escala)                                      ' Nueva altura de la forma
    oShape.setSize(Objsize)                                                           ' Se aplica el tamaño de la forma
    End if
    End if                                                                            ' Acabamos con la condición de que la forma no tenga nombre
    Next                                                                              ' Vamos a la siguiente forma
    
End Function

Function Recuperacion (Doc,Copia)
   
    Resultado= Msgbox ("Se vostede está conforme co resultado, prema no botón 'Si' e este cadro de diálogo pechará" & Chr(13) & "Se vostede non está conforme co resultado, prema no botón 'No', e aparecerá un cadro de diálogo para recuperar a versión orixinal", 48+3,"OOO")
    If Resultado= 7 Then                                                              ' Botón 'NO'  
    dim document   as object
    dim dispatcher as object
    document   = Doc.CurrentController.Frame
    dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
    dim args1(1) as new com.sun.star.beans.PropertyValue
    args1(0).Name = "VersionComment"
    args1(0).Value = ""
    dispatcher.executeDispatch(document, ".uno:VersionDialog", "", 0, args1())
    'dispatcher.executeDispatch(document, ".uno:Save", "", 0, args1())
   ' Doc.Dispose()
    End if
 

End Function

Global Copia

Function Tabla (Doc, Escala)                                                          ' Maneja tablas de texto simples y complejas, con todos los caracteres de la misma altura o no.

    NTexttable = Doc.Texttables().GetCount()                                          ' Contamos las tablas que hay
    For z=0 to NTexttable-1                                                           ' Ciclo que recorre las tablas 
    oTexttable = Doc.Texttables(z)                                                    ' Tabla que toca en ese momento del ciclo
    Filas= oTexttable.rows.count-1                                                    ' Filas que tiene la tabla  
    Columnas= oTexttable.Columns.count-1                                              ' Columnas de la tabla
    oCursor = oTexttable.createCursorByCellName("A1")                                 ' Cursor de tabla en la primera celda
    oCursor.goToEnd (True)                                                            ' Ponemos el cursor al final
    '-------------------------------------------------------
    ' Chequeamos si algún elemento de texto tiene una altura diferente dentro de toda la tabla
    
    if Cint(oCursor.charheight)=0 Then                                                ' Si algún elemento de texto tiene una altura diferente
    oCursor = oTexttable.createCursorByCellName("A1")                                 ' Creamos de nuevo el curosr en la primera celda
    Do                                                                                ' Iniciamos un ciclo que recorre cada celda
    oCursor.getRangeName                                                              ' Nombre de la celda
    oCell = oTextTable.getCellByName(oCursor.getRangeName)                            ' Nos ponemos en la celda que cumple las condiciones
    oText = oCell.Text                                                                ' Texto en el interior de la celda
    oCurs = oText.createTextCursor()                                                  ' Generamos un cursor de texto
    oCurs.gotoEND(True)                                                               ' Vamos hasta el final del texto, indicando que las acciones se aplican a todo el texto de la celda
    '-------------------------------------------------------
    ' Chequeamos si algún carácter tiene una altura diferente del resto de la celda (caso no frecuente)
    
    if Cint(oCurs.CharHeight)=0 Then                                                  ' Si alguna letra es de diferente tamaño que el resto de la celda
     for a=0 to (len (oCurs.String)-1)                                                ' Iniciamos ciclo recorriendo cada carácter de la celda
      oCurs.gotoStart (False)                                                         ' Vamos al inicio del texto
      oCurs.goRight(a,False)                                                          ' Nos movemos tantos lugares a la derecha como letras se cuentan en ese momento
      oCurs.goRight(1,True)                                                           ' Vamos al siguiente carácter
      oCurs.CharHeight = oCurs.CharHeight*(Escala)                                    ' Variamos la altura de la letra
     next                                                                             ' Retomamos el ciclo de caracteres
    Else                                                                              ' En caso de que todos los caracteres de la celda tengan la misma altura
    oCurs.CharHeight= oCurs.CharHeight*(Escala)                                       ' Variamos la altura de la letra
    LineSpace = oCurs.paralinespacing                                                 ' Toma el control del interlineado 
      If Escala>1 and LineSpace.Height<140 Then                                       ' Si hay que aumentar tamaño y el interlineado es inferior a 140 (no se aumentará por encima de 140)
        LineSpace.height = LineSpace.height*(Escala)                                  ' Interlineado se disminuye según la escala
        oCurs.paralinespacing = LineSpace                                             ' Se aplica el interlineado
      End if                                                                          ' Se acaba la condición de interlineado
      If Escala<1 and LineSpace.Height>110 Then                                       ' Si hay que disminuir tamaño y el interlineado es superior a 110 (no se reducirá por debajo de esta cifra)
        LineSpace.height = LineSpace.height*(Escala)                                  ' Interlineado se disminuye según la escala
        oCurs.paralinespacing = LineSpace                                             ' Se aplica el interlineado
      End if                                                                          ' Se acaba la condición de interlineado

    End if                                                                            ' Acabamos la condición de que algún elemento de toda la tabla tenga algún carácter de distinta altura
    Loop While oCursor.goRight(1,False)                                               ' Reiniciamos el ciclo hasta la última celda
    Else                                                                              ' Si todos los caracteres de la tabla son iguales
    oCursor.CharHeight= oCursor.CharHeight*(Escala)                                       ' Modificamos la altura de los caracteres
    LineSpace = oCursor.paralinespacing                                                 ' Toma el control del interlineado 
      If Escala>1 and LineSpace.Height<140 Then                                       ' Si hay que aumentar tamaño y el interlineado es inferior a 140 (no se aumentará por encima de 140)
        LineSpace.height = LineSpace.height*(Escala)                                  ' Interlineado se disminuye según la escala
        oCursor.paralinespacing = LineSpace                                             ' Se aplica el interlineado
      End if                                                                          ' Se acaba la condición de interlineado
      If Escala<1 and LineSpace.Height>110 Then                                       ' Si hay que disminuir tamaño y el interlineado es superior a 110 (no se reducirá por debajo de esta cifra)
        LineSpace.height = LineSpace.height*(Escala)                                  ' Interlineado se disminuye según la escala
        oCursor.paralinespacing = LineSpace                                             ' Se aplica el interlineado
      End if                                                                          ' Se acaba la condición de interlineado

    End if                                                                            ' Acabamos la condición de la altura de los caractéres de toda la tabla

    For i=0 To Filas
    oRow = oTexttable.rows(i)
    oRow.height=oRow.Height*(Escala)
    Next
    next z                                                                            ' Acaba el ciclo de las tablas
      
End Function

Function HacerVersion (Doc)

    dim document   as object
    dim dispatcher as object
    document   = Doc.CurrentController.Frame
    dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
    dim args1(0) as new com.sun.star.beans.PropertyValue
    args1(0).Name = "VersionComment"
    args1(0).Value = ""
    dispatcher.executeDispatch(document, ".uno:Save", "", 0, args1())
 
End Function

Function RecuperarVersion(Doc)



    dim document   as object
    dim dispatcher as object
    document   = Doc.CurrentController.Frame
    dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
    dim args1(1) as new com.sun.star.beans.PropertyValue
    args1(0).Name = "VersionComment"
    args1(0).Value = ""
    args1(1).Name = "Flags"
    args1(1).Value = 10

    dispatcher.executeDispatch(document, ".uno:VersionDialog", "", 0, args1())

    'dispatcher.executeDispatch(document, ".uno:VersionVisible", "", 0, args1())

End Function
Como ves, un poco largo..., pero en general funciona bien, excepto con imágenes o marcos, que necesitan algún arreglillo y esto de la recuperación del texto original.

Gracias por leerme, a pesar de tener tanto rollo! :?
Adjuntos
Modificación tamaño texto.odt
(43.47 KiB) Descargado 196 veces
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: ".uno:VersionDialog"

Mensaje por mauricio »

Longi escribió:Al 'poder' tener resultados inesperados o no deseados, quisiera tener una copia de seguridad del documento inicial para volver a ella si el resultado no es el deseado.
Si conocen git es ideal para estos casos, se puede tomar una "instantánea" del documento, modificar y si algo falla regresar a esta o cualquier otra versión del mismo. Desde hace tiempo estoy queriendo meter eso en easy-macro.

Por otra parte, para el guardado de tus versiones, creo, un simple storeAsURL debería de funcionar:
https://wiki.openoffice.org/wiki/ES/Man ... documentos

Saludos
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: ".uno:VersionDialog"

Mensaje por Longi »

Gracias por el apunte!
Entre las muchas pruebas hechas antes de pedir ayuda, estuvo esa, precisamente, pero el problema es que me deja el documento original en su localización original y lo que queda en pantalla y se procesa es lo que yo quería que fuese la copia de seguridad (en mi caso lo puse en la carpeta temporal).
Tengo la opción de cerrar uno y abrir el otro, pero es un continuo ir y venir de pantallas que no queda como que muy bien, por eso fue lo de intentar lo de las versiones.

Sobre lo de git yo no lo conozco, pero no puedo incorporar nuevos programas en el trabajo, mientras que los 'desarrollos' hechos sobre Open o Libre no tenemos problemas para aplicarlos.

Bueno, lo dicho. Gracias!
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: ".uno:VersionDialog"

Mensaje por mauricio »

Entonces, creo, lo tuyo es abrir tu archivo a procesar como una "plantilla", de este modo te queda el archivo original intacto.

Saludos

P.D. Incorporando git dentro de easy-macro, es un desarrollo hecho sobre AOO/LibO
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: ".uno:VersionDialog"

Mensaje por mauricio »

He leído el documento que anexaste en tu tema. ¿Como determinan cuando el documento queda correcto?.

Tengo la impresión de que estableciendo correctamente los estilos de los documentos, modificando estos últimos (con macros si es necesario), obtendrías un resultado similar.

Saludos
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Avatar de Usuario
fornelasa
Mensajes: 3268
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: ".uno:VersionDialog"

Mensaje por fornelasa »

En Writer, soy un usuario normal; solo para no dejar y hablando de Calc

El mismo archivo versión tiene tres versiones.
El archivo mostrar llama a esas tres versiones.
Cambia por tu ruta correcta.

Saludos, Federico.
Adjuntos
version.ods
Archivo con versiones
(30.89 KiB) Descargado 268 veces
Mostrar.ods
Archivo que muestra esas versiones
(10.79 KiB) Descargado 211 veces
lo 6.2.0 | aoo 4.1.6 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: ".uno:VersionDialog"

Mensaje por Longi »

Gracias Federico!
Mi problema es mucho más grave que todo esto: No tengo conocimientos suficientes de lo más básico, así que de vez en cuando hago preguntas sin demasiado sentido o que quien sabe no se imagina que sea algo tan básico:
¡No sé cual es la 'ruta correcta' ya que no sé dónde se guardan las versiones!. Por ello no soy capaz de acceder a ellas, aunque conseguí generarlas.
Agradecería que me indicases esto, para poder tener claros los pasos a seguir, aunque sea para cualquier otro proyecto.
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: ".uno:VersionDialog"

Mensaje por Longi »

Gracias Mauricio!

El problema que tengo con la plantilla es que no puedo (o no sé) abrir un documento como plantilla cuando ya está abierto.
Siempre que lo intento me da un error, y supongo que es porque ya tengo abierto el documento....
Seguro que es mucho más sencillo que todo lo que estoy montando.

En cuanto a tu pregunta de:
He leído el documento que anexaste en tu tema. ¿Como determinan cuando el documento queda correcto?.
me sorprende que sea la única pregunta que haces. ¿Todo lo demás estaba claro?. Al menos teóricamente es un proceder aceptable?
En cuanto a tu pregunta, pues lo lógico: cuando sale el emergente no ha dado tiempo de testar si el documento está bien o no, por lo que no tiene mucha operatividad (quizá eran mejores unos botones en el documento no imprimibles). No se me ocurrió mejor cosa, aunque tiene pinta de chapuza integral.
Y como siempre, se admiten soluciones alternativas, que seguro que serán mejores.


Gracias y un saludo!
Última edición por Longi el Dom Oct 08, 2017 2:57 pm, editado 1 vez en total.
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: ".uno:VersionDialog"

Mensaje por Longi »

Como soy un genio con las búsquedas, no encontré nada que se me adaptase, hasta que, como es costumbre, buscando otra cosa, encontré una macro de Zizi64 en el foro de Inglés, donde hace un backup de un documento que se tiene en pantalla. Vamos, justo lo que intentaba hacer!, aunque quizá no me expresé correctamente, que es lo habitual.
El código guarda la copia en Backups de la carpeta de usuario, pero ya intentaré modificarlo para dejarlo en temporal y poder eliminar según qué condiciones.

Código: Seleccionar todo

Sub SaveAndTimeStampBackup()

Dim sDocURL as string, sBackupURL as string, sTimeStamp as string
Dim oDoc as object

   If (Not GlobalScope.BasicLibraries.isLibraryLoaded("Tools")) Then
      GlobalScope.BasicLibraries.LoadLibrary("Tools")
   End If
   sTimeStamp = "_" & Format(Year(Now), "0000") & Format(Month(Now), "00") & Format(Day(Now), "00") & "_" & _
                       Format(Hour(Now), "00") & Format(Minute(Now), "00") & Format(Second(Now), "00")
   oDoc = Thiscomponent   
   If oDoc.hasLocation() then
      sDocURL = oDoc.getURL()

      sBackupURL = CreateUnoService("com.sun.star.util.PathSettings").Backup & "/" & _
      GetFileNameWithoutExtension(sDocURL, "/") & _
      sTimeStamp() & "." & _
      GetFileNameExtension(sDocURL, "/")   
   
      oDoc.store() ' Save
      oDoc.storeToURL(sBackupURL, array())  ' Backup
   Else
      MsgBox("This document have not URL. Can not be archived." & Chr(10) & "Use the normal 'save' procedure.",16,"Warning:")
   End if
End sub
De todos modos, si hay alternativas (Tema de las versiones en el que estaba trabajando Federico, por ejemplo), me gustaría conocerlas, para así tener un abanico más amplio de soluciones a este o a cualquier otro tipo de problema.

Aún no lo pondré como resuelto, por si al hacer pruebas me da problemas o por si se cuelga una respuesta mejor.
Si esto funciona, y no hay otro método propuesto, lo daré por cerrado en unos días.

Gracias y un saludo!
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
Avatar de Usuario
fornelasa
Mensajes: 3268
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: ".uno:VersionDialog"

Mensaje por fornelasa »

¡No sé cual es la 'ruta correcta' ya que no sé dónde se guardan las versiones!. Por ello no soy capaz de acceder a ellas, aunque conseguí generarlas.
Agradecería que me indicases esto, para poder tener claros los pasos a seguir, aunque sea para cualquier otro proyecto.
Las versiones de un archivo se guardan en la misma ruta del archivo y se guardan en el mismo archivo.
Si te das cuenta el archivo version que he enviado solo tiene una ruta de guardado o URL, las versiones que tiene dicho archivo estan guardadas en el mismo archivo y por lo tanto en la misma ruta, es una especie de backup pero en el mismo archivo, es decir, el archivo version tiene 3 backups (versiones) por asì decirlo.

Saludos.
lo 6.2.0 | aoo 4.1.6 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: ".uno:VersionDialog"

Mensaje por Longi »

Pues si!
La verdad es que soy bastante torpe....
Con tu ayuda he conseguido hilar prácticamente del todo el asunto. (La macro de Zizi64 funciona muy bien, pero me supone andar gestionando muchas cosas en carpeta temporal, mientras que de esta otra manera solo lo uso en caso de que el documento con el que trabajamos aún no esté guardado)
Voy a trastear un poco más y después ya cuelgo la macro definitiva tal y como la he hecho yo, a no ser que alguien aporte algo más, que seguro que es interesante.

Gracias Federico, gracias Mauricio!, generalmente me salvais la vida! :super:
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
arivas_2005
Mensajes: 162
Registrado: Mié Nov 16, 2011 6:01 pm

Re: ".uno:VersionDialog"

Mensaje por arivas_2005 »

saludos fornelasa
veo con curiosidad el fenomeno de las versiones en el mismo documento.
Una pregunta: se puede averiguar previamente cuantas versiones tiene un documento determinado.
Para el caso del ejemplo debo entender que tiene 3, pero un documento de uso frecuente, debe tener mas. O un documento que llega a mi computadora...
Libreoffice 4.7
Puppy slacko 6 y windows 7
Avatar de Usuario
fornelasa
Mensajes: 3268
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: ".uno:VersionDialog"

Mensaje por fornelasa »

¡uf! buena pregunta, por código no tengo idea.
Por vista, Menú Archivo <> Versiones (opción habilitada si el archivo tiene versiones)

Saludos, Federico.
lo 6.2.0 | aoo 4.1.6 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
Responder