FR/Documentation/OpenOffice Writer
Dans ce chapitre, nous utilisons encore le code initial décrit dans chapitre 3.3. Il consiste en un sous-programme “ooConnect ()” et un programme principal main(). Travailler avec ce code consiste à ajouter le nouveau code dans le programme principal. Nous donnons pour la troisième fois le programme principal :
//Listing 1 // C++ // adapted for OOoWriter int main( ) { //retrieve an instance of the remote service manager Reference< XMultiServiceFactory > rOfficeServiceManager; rOfficeServiceManager = ooConnect(); if( rOfficeServiceManager.is() ){ printf( "Connected sucessfully to the office\n" ); } //get the desktop service using createInstance returns an XInterface type Reference< XInterface > Desktop = rOfficeServiceManager->createInstance( OUString::createFromAscii( "com.sun.star.frame.Desktop" )); //query for the XComponentLoader interface Reference< XComponentLoader > rComponentLoader (Desktop, UNO_QUERY); if( rComponentLoader.is() ){ printf( "XComponentloader successfully instanciated\n" ); } //get an instance of the OOowriter document Reference< XComponent > xWriterComponent = rComponentLoader->loadComponentFromURL( OUString::createFromAscii("private:factory/swriter"), OUString::createFromAscii("_blank"), 0, Sequence < ::com::sun::star::beans::PropertyValue >()); // AJOUTER votre code ici return 0; }
Nous rappelons au lecteur que les exemples ci-dessous, prennent comme code de départ l'exemple “<OpenOffice.org1.1_SDK>/examples/DevelopersGuide/ProfUNO/CppBinding”. Notre code est mis dans “office_connect.cxx” et nous ajoutons ce que vous trouvez comme commentaires dans le code (directives d'inclusions et définitions des espaces de nommage) ainsi que dans le makefile (en général pour créer les fichiers hpp et hxx).
Créer, ouvrir un document writer
A faire
Traduire le code Java en C++
On commence avec un exemple trouvé dans un OOoForum sous le nom : Setting the page properties/margins directly from java Voici le code java :
//Listing 114 // Java // create new writer document and get text, then manipulate text XComponent xWriterComponent = newDocComponent("swriter"); XTextDocument xTextDocument = (XTextDocument)UnoRuntime.queryInterface(XTextDocument.class,xWriterComponent); // Access the text document's multi service factory, which we will need for most of the // following examples mxDocFactory = (XMultiServiceFactory) UnoRuntime.queryInterface (XMultiServiceFactory.class,xTextDocument); XText xText = xTextDocument.getText(); // create a text cursor from the cells XText interface XTextCursor xTextCursor = xText.createTextCursor(); // Get the property set of the cell's TextCursor XPropertySet xTextCursorProps = (XPropertySet)UnoRuntime.queryInterface (XPropertySet.class,xTextCursor); // Page Style name String pageStyleName= xTextCursorProps.getPropertyValue("PageStyleName").toString(); // Get the StyleFamiliesSupplier interface of the document XStyleFamiliesSupplier xSupplier = (XStyleFamiliesSupplier) UnoRuntime.queryInterface (XStyleFamiliesSupplier.class,xTextDocument); // Use the StyleFamiliesSupplier interface to get the XNameAccess interface of the // actual style families XNameAccess xFamilies = (XNameAccess)UnoRuntime.queryInterface(XNameAccess.class, xSupplier.getStyleFamilies()); // Access the 'PageStyles' Family XNameContainer xFamily = (XNameContainer) UnoRuntime.queryInterface (XNameContainer.class,xFamilies.getByName("PageStyles")); // Insert the newly created style into the PageStyles family XStyle xStyle= (XStyle) UnoRuntime.queryInterface(XStyle.class,xFamily.getByName (pageStyleName)); // Get the property set of the TextCursor XPropertySet xStyleProps = (XPropertySet)UnoRuntime.queryInterface (XPropertySet.class,xStyle); xStyleProps.setPropertyValue("LeftMargin",new Short((short)1200)); xStyleProps.setPropertyValue("RightMargin",new Short((short)1200)); xStyleProps.setPropertyValue("BottomMargin",new Short((short)1200));
En C++ cela donne :
//Listing 115 // C++ // create new writer document and get text, then manipulate text // N'oubliez pas d'ajouter : using namespace com::sun::star::text; // N'oubliez pas d'ajouter : #include <com/sun/star/text/XTextDocument.hpp> // N'oubliez pas d'ajouter "com.sun.star.text.XTextDocument \" in the makefile // N'oubliez pas d'ajouter : using namespace com::sun::star::beans; // N'oubliez pas d'ajouter : #include <com/sun/star/beans/XPropertySet.hpp> // N'oubliez pas d'ajouter "com.sun.star.beans.XPropertySet \" in the makefile // N'oubliez pas d'ajouter : using namespace com::sun::star::style; // N'oubliez pas d'ajouter : #include <com/sun/star/style/XStyleFamiliesSupplier.hpp> // N'oubliez pas d'ajouter "com.sun.star.style.XStyleFamiliesSupplier \" in the makefile // N'oubliez pas d'ajouter : using namespace com::sun::star::container; // N'oubliez pas d'ajouter : #include <com/sun/star/container/XNameContainer.hpp> // N'oubliez pas d'ajouter "com.sun.star.container.XNameContainer \" in the makefile // N'oubliez pas d'ajouter : #include <com/sun/star/style/XStyle.hpp> // N'oubliez pas d'ajouter "com.sun.star.style.XStyle \" in the makefile // the first line cannot be translated : already done in our main() // XComponent xWriterComponent = newDocComponent("swriter"); Reference < XTextDocument > xTextDocument (xWriterComponent,UNO_QUERY); // Access the text document's multi service factory, which we will need for most of the // following examples Reference< XMultiServiceFactory > mxDocFactory(xTextDocument,UNO_QUERY); Reference< XText > xText = xTextDocument->getText(); // create a text cursor from the cells XText interface Reference< XTextCursor > xTextCursor = xText->createTextCursor(); // Get the property set of the cell's TextCursor Reference< XPropertySet > xTextCursorProps(xTextCursor,UNO_QUERY); // Page Style name //*** I add a intermediate variable because of Any type returned by getPropertyValue Any pageStyleName2 = xTextCursorProps->getPropertyValue (OUString::createFromAscii("PageStyleName")); OUString pageStyleName; pageStyleName2 >>= pageStyleName ; // Get the StyleFamiliesSupplier interface of the document Reference< XStyleFamiliesSupplier > xSupplier(xTextDocument,UNO_QUERY); // Use the StyleFamiliesSupplier interface to get the XNameAccess interface of the // actual style families Reference< XNameAccess > xFamilies(xSupplier->getStyleFamilies(),UNO_QUERY); // Access the 'PageStyles' Family Reference< XNameContainer > xFamily(xFamilies->getByName (OUString::createFromAscii("PageStyles")),UNO_QUERY); // Insert the newly created style into the PageStyles family Reference< XStyle > xStyle(xFamily->getByName(pageStyleName),UNO_QUERY); // Get the property set of the TextCursor Reference< XPropertySet > xStyleProps(xStyle,UNO_QUERY); Any lm, rm, bm; lm<<=(short)1200; rm<<=(short)1200; bm<<=(short)1200; xStyleProps->setPropertyValue(OUString::createFromAscii("LeftMargin"),lm); xStyleProps->setPropertyValue(OUString::createFromAscii("RightMargin"),rm); xStyleProps->setPropertyValue(OUString::createFromAscii("BottomMargin"),bm);
Ma compétence sur le type "ANY" n'est pas assez complète, alors je ne trouve pas de moyen direct d'utiliser "Any" autre qu'en utilisant des variables intermédiaires. Voyez les trois dernières lignes par exemple.