Page 1 sur 1

[Résolu]retourner une phrase

MessagePublié: 01 Juin 2006 17:14
par mimi31110
salut !

je manipule open office writer avec java, et je voudrais pouvoir retourner une phrase complète à 90°, et l'enregistrement d'une macro ne m'a pas aidé, il faut que je puisse le faire avec l'API UNO...

la phrase est repérée par une balise "[VERT]" et est toujours dans un tableau... si ça a une importance quelconque...

il me faut donc la sélectionner pour la retourner... mais je coince...

vous avez une petite idée ???

merci à tous

MessagePublié: 01 Juin 2006 17:41
par Dude
Tu crées un document avec un tableau d'une seule cellule et tu lances cette macro :

Code: Tout sélectionner   AgrandirRéduire
Sub rotationTexte()

otext = thisComponent.getText()
otable = thisComponent.getTextTables().getByIndex(0)
ocell = otable.getCellByName("A1")
cellcontent = ocell.getText()
cellcontent.setString("[VERT]")
cursor = cellcontent.createTextCursor()
cursor.goToStart(False)
cursor.goToEndOfWord(True)

cursor.setPropertyValue("CharRotation", 900)

End Sub

MessagePublié: 02 Juin 2006 13:56
par mimi31110
je dois le faire en java, c'est ça qui me pose problème.
je recherche les balise et retourne les phrases contenant ces balises...

MessagePublié: 02 Juin 2006 15:36
par bm92
mimi31110 a écrit:je dois le faire en java, c'est ça qui me pose problème.

Le Developer's Guide du SDK fournit beaucoup d'exemples en Java.
Avec Java il est indispensable de connaître l'API OpenOffice "dans le texte": Developer's Guide et IDL.
Bon courage.

MessagePublié: 06 Juin 2006 10:44
par mimi31110
Le Developer guide est presque devenu mon livre de chevet depuis quelques semaines !!!
mais je n'ai pas trouvé comment retourner une phrase dans writer.
l'API propose un attribut CharRotation dans propertyValue mais je ne parvient pas à le faire fonctionner... quelqu'un s'en ai déjà servi ???

MessagePublié: 06 Juin 2006 11:15
par chater
A tester :
Code: Tout sélectionner   AgrandirRéduire
// création objet curseur
XTextCursor oCurs = oTableText.createTextCursor();
// obtenir les propriétés
XPropertySet oCursP = (XPropertySet) UnoRuntime.queryInterface( XPropertySet.class, oCurs);

try {
   // obtenir propriété à changer
   short rotation = ((Short)oCursP.getPropertyValue("CharRotation")).shortValue();
   // ajuster la propriété
   rotation = 900;
   // rotation du texte à la nouvelle valeur
   oCursP.setPropertyValue("CharRotation", new Short(rotation));
} catch (Exception ex) { // exception }

MessagePublié: 06 Juin 2006 11:19
par mimi31110
merci, je teste immédiatement ... :D

MessagePublié: 06 Juin 2006 14:03
par mimi31110
ça fonctionne merci ...

mais je ne parvient pas exactement à faire ce que je veux :
je recherche un balise dans un document ouvert, et je voudrais retourner la phrase complète mais il n'y a que le texte de replacement qui est vertical.

comment sélectionner la phrase entière ???

voici mon code :

Code: Tout sélectionner   AgrandirRéduire
XTextDocument xTextDoc = (com.sun.star.text.XTextDocument)UnoRuntime.queryInterface(com.sun.star.text.XTextDocument.class, xWriterComponent);
         
         //***********************************************************
         // RECHERCHE LA BALISE [VERT] ET RETOURNE LE TEXTE ASSOCIE
         //***********************************************************
         
         // ajuster la propriété
           short rotation = 900;
           short noRotation = 0;
           // Create textdocument
           XTextCursor xTextCursor = null;
                       
            XText xText = (XText)xTextDoc.getText();
            xTextCursor = (XTextCursor) xText.createTextCursor();
           
            //recherche la balise [VERT]
            XSearchable xSearch = (XSearchable) UnoRuntime.queryInterface(XSearchable.class, xWriterComponent);
            XSearchDescriptor xSearchDesc = xSearch.createSearchDescriptor();
           
            xSearchDesc.setSearchString("[VERT]");
            Object result = xSearch.findFirst(xSearchDesc);
            while (result != null)
            {
               XPropertySet xCPS = (XPropertySet)UnoRuntime.queryInterface(XPropertySet.class, result);
                xCPS.setPropertyValue("CharRotation", new Short (rotation));
                result = xSearch.findNext(result, xSearchDesc);
            }
           
            //***************************************************************
            //RECHERCHE ET REMPLACE LA BALISE [VERT]
            //***************************************************************
            XReplaceable xReplaceable = (XReplaceable) UnoRuntime.queryInterface(XReplaceable.class, xWriterComponent);
            XReplaceDescriptor xRepDesc = xReplaceable.createReplaceDescriptor();
           // set a string to search for
           xRepDesc.setSearchString("[VERT]");
          
           // set the string to be inserted
           xRepDesc.setReplaceString("test");
          
           //         create an array of one property value for a CharWeight property
              PropertyValue[] aReplaceArgs = new PropertyValue[1];
              aReplaceArgs[0] = new PropertyValue();
              aReplaceArgs[0].Name = "CharWeight";
              aReplaceArgs[0].Value = new Float (com.sun.star.awt.FontWeight.BOLD);
              
           // set our sequence with one property value as ReplaceAttribute
              XPropertyReplace xPropRepl = (XPropertyReplace) UnoRuntime.queryInterface(XPropertyReplace.class, xRepDesc);
              xPropRepl.setReplaceAttributes(aReplaceArgs);
           // replace
              int nResult = xReplaceable.replaceAll(xRepDesc);

MessagePublié: 08 Juin 2006 09:29
par mimi31110
personne ne sait comment selectionner une phrase ??? :?

même un bout de code dans un autre contexte, je suis preneuse ...

MessagePublié: 09 Juin 2006 17:49
par chater
Pas trop le temps de chercher mais as-tu regardé ici :
http://api.openoffice.org/docs/common/r ... ursor.html

MessagePublié: 12 Juin 2006 11:18
par mimi31110
oui, en fait, lorsque je crée n'importe quel curseur dans la boucle
Code: Tout sélectionner   AgrandirRéduire
while (result != null)
le pointeur qui est censé définir le curseur est null... donc il me génère une erreur...
j'utilise createTextCursorByRange(result) mais ça marche pas

MessagePublié: 12 Juin 2006 15:31
par chater
Regarde l'annexe du bouquin de Marcelly, tu as un exemple :
http://www.editions-eyrolles.com/Chapit ... rcelly.pdf

MessagePublié: 12 Juin 2006 15:53
par mimi31110
voici ce que je fais dans la boucle :

Code: Tout sélectionner   AgrandirRéduire
while (result != null)
            {
               System.out.println("entrée dans la boucle...");
               XPropertySet xCPS = (XPropertySet)UnoRuntime.queryInterface(XPropertySet.class, result);
               System.out.println("property set...");
               XTextRange test = (XTextRange) result;
               XTextCursor xTextCursor = (XTextCursor) xText.createTextCursorByRange(test);
               xTextCursor.getText().insertString( xTextCursor, "Insertion de texte pour localiser le curseur...", true);
                xCPS.setPropertyValue("CharRotation", new Short (rotation));
                System.out.println("balise suivante...");
                result = xSearch.findNext(result, xSearchDesc);
            }


théoriquement, il devrait m'écrire "Insertion de texte pour localiser le curseur..." à l'endroit ou se trouve la balise puisque result représente la position de la balise trouvée (sous forme d'un Object)

mais voilà ce qu'il me génère :

Code: Tout sélectionner   AgrandirRéduire
entrée dans la boucle...
property set...
null
java.lang.ClassCastException
   at test.tests2.executeVert(tests2.java:94)
   at test.tests2.useWriter(tests2.java:53)
   at test.tests2.useDocuments(tests2.java:45)
   at test.tests2.main(tests2.java:30)


la ligne 94 étant :

Code: Tout sélectionner   AgrandirRéduire
XTextRange test = (XTextRange) result;


je ne comprends pas pourquoi il me renvoit un pointeur null dans la variable "test" alors que la variable "result" n'est pas nulle....

MessagePublié: 13 Juin 2006 09:25
par chater
Teste déjà l'exemple de la page 5.

MessagePublié: 13 Juin 2006 12:24
par mimi31110
l'exemple fonctionne, merci

mais j'ai trouvé une autre solution au problème :

je sais que si il existe une phrase à mettre à la verticale, elle est dans un tableau et dans la cellule A2 de ce tableau.
je récupère donc tous les tableaux de mon doc
je crée un curseur dans la cellule A2
si le texte de cette cellule se termine par la balise [VERT], je réécris cette phrase avec la propriété verticale
sinon, je passe au tableau suivant

voici le code :
Code: Tout sélectionner   AgrandirRéduire
//***********************************************************
      // RECHERCHE TOUS LES TABLEAUX DU DOCUMENT
      //  SI LA CELLULE A2 A SON TEXTE QUI DE TERMINE PAR "[VERT]"
      //   ALORS JE REECRIS LA PRHASE AVEC LA PROPRIETE VERTICALE
      //  SINON, JE NE FAIS RIEN
      //***********************************************************
      
   // ajuster la propriété
        short rotation = 900;
       
        XTextDocument xTextDoc = (XTextDocument)UnoRuntime.queryInterface(XTextDocument.class, xWriterComponent);
        XText xText = (XText)xTextDoc.getText();
       
        XTextTablesSupplier tab = (XTextTablesSupplier)UnoRuntime.queryInterface(XTextTablesSupplier.class, xWriterComponent);
        XNameAccess tables = tab.getTextTables();
        System.out.println(tables);
       
        // create instance of a text table
        XTextTable xTT = (XTextTable) UnoRuntime.queryInterface(XTextTable.class, xWriterComponent);;
       
        //récupération des nom de tous les tableaux présents dans le document
         String[] tableName = tables.getElementNames();
         //pour tous les tableaux du document ...
        for (int i = 0 ; i<tableName.length; i++)
        {
           System.out.println(tableName[i]);
           xTT = (XTextTable)UnoRuntime.queryInterface(XTextTable.class, tables.getByName(tableName[i]));
           XTextTableCursor xTTC = xTT.createCursorByCellName("A2");
           XText xCellA2Text = (XText)UnoRuntime.queryInterface(XText.class,xTT.getCellByName("A2"));
       
           //récupération de la phrase contenu dans la cellule A2
           String phraseA2 = xCellA2Text.getString();
           //si la phraseA2 se termine par la balise [VERT]...
           if (phraseA2.endsWith("[VERT]"))
           {
              //ajustement de la propriété verticale
              XPropertySet xTPS = (XPropertySet)UnoRuntime.queryInterface(XPropertySet.class, xTTC);
            xTPS.setPropertyValue("CharRotation", new Short(rotation));
              //réécriture de la phrase en vertical
              xCellA2Text.setString(phraseA2);
           }
        }


merci pour vos réponses