FR/Documentation/Utilitaires C++

From Apache OpenOffice Wiki
< FR‎ | Documentation
Revision as of 09:39, 9 July 2008 by SergeMoutou (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

Jouer avec la fenêtre du toolkit

Explications de Danny Brewer

Il y a deux choses différentes ici. En réalité il y en a trois.

1. Les dialogues 2. AWT 3. Les formes

Les formes sont d'un plus haut niveau que les deux autres.

  • Sur les deux premiers, les dialogues utilisent le UnoDialogControl et ses modèles. Vous pouvez aussi créer des fenêtres AWT avec les commandes.
  • Les fenêtres AWT peuvent être modales ou non, et ne sont pas attachées à d'autres fenêtres.
  • Les fenêtres AWT ne sont pas comme les dialogues.

Généralement, les dialogues sont réalisés de façon modale en appelant la méthode execute() du dialogue. J'ai réussi à réaliser des boites de dialogue non modales.

Les fenêtres MessageBox

Le code initial est en gros le même que le précédent (examples/DevelopersGuide/ProfUNO/CppBinding/). Nous examinons aussi l'exemple de “<OpenOffice.org1.1_SDK>/examples/DevelopersGuide/Components/Addons/ProtocolHandlerAddon_cpp” où nous trouvons une fenêtre MessageBox. Le code correspondant est donné ici :

//Listing 1
// C++
// N'oubliez pas d'ajouter : #include <com/sun/star/awt/WindowDescriptor.hpp>
// N'oubliez pas d'ajouter "com.sun.star.awt.WindowDescriptor \" in the makefile
// N'oubliez pas d'ajouter : #include <com/sun/star/awt/WindowAttribute.hpp>
// N'oubliez pas d'ajouter "com.sun.star.awt.WindowAttribute \" in the makefile
// N'oubliez pas d'ajouter : #include <com/sun/star/awt/XWindowPeer.hpp>
// N'oubliez pas d'ajouter "com.sun.star.awt.XWindowPeer \" in the makefile
// N'oubliez pas d'ajouter : #include <com/sun/star/awt/XMessageBox.hpp>
// N'oubliez pas d'ajouter "com.sun.star.awt.XMessageBox \" in the makefile
 
/**
  * Show a message box with the UNO based toolkit
  */
static void ShowMessageBox( const Reference< XToolkit >& rToolkit, const Reference< XFrame >& rFrame, const OUString& aTitle, const OUString& aMsgText )
{
    if ( rFrame.is() && rToolkit.is() )
    {
        // describe window properties.
        WindowDescriptor                aDescriptor;
        aDescriptor.Type              = WindowClass_MODALTOP;
        aDescriptor.WindowServiceName = OUString( RTL_CONSTASCII_USTRINGPARAM( "infobox" ));
        aDescriptor.ParentIndex       = -1;
        aDescriptor.Parent            = Reference< XWindowPeer >
												( rFrame->getContainerWindow(), UNO_QUERY );
        aDescriptor.Bounds            = Rectangle(0,0,300,200);
        aDescriptor.WindowAttributes  = WindowAttribute::BORDER | WindowAttribute::MOVEABLE 
												| WindowAttribute::CLOSEABLE;
 
        Reference< XWindowPeer > xPeer = rToolkit->createWindow( aDescriptor );
        if ( xPeer.is() )
        {
            Reference< XMessageBox > xMsgBox( xPeer, UNO_QUERY );
            if ( xMsgBox.is() )
            {
                xMsgBox->setCaptionText( aTitle );
                xMsgBox->setMessageText( aMsgText );
                xMsgBox->execute();
            }
        }
    }
}

pour comprendre le WindowAttribute::BORDER et les autres constantes, jetons un oeil au fichier IDL “WindowAttribute.idl” décrivant les attributs de fenêtres :

//Listing 2
// IDL
module com {  module sun {  module star {  module awt {
constants WindowAttribute
{
	const long SHOW = 1; 
	const long FULLSIZE = 2; 
	const long OPTIMUMSIZE = 4; 
	const long MINSIZE = 8; 
	const long BORDER = 16; 
	const long SIZEABLE = 32; 
	const long MOVEABLE = 64; 
	const long CLOSEABLE = 128; 
	const long SYSTEMDEPENDENT = 256;  
};
}; }; }; };

Nous donnons maintenant le listing d'un programme principal complet pour nous apprendre à utiliser cette procédure :

//Listing 3
//C++
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" );
    	}
 
// Don't forget to add : #include <com/sun/star/awt/XToolkit.hpp>
// Don't forget to add "com.sun.star.awt.XToolkit \" in the makefile
// Query the XTollkit Interface
	Reference< XToolkit >rToolkit = Reference< XToolkit >
										( rOfficeServiceManager->createInstance(
                                        OUString( RTL_CONSTASCII_USTRINGPARAM(
                                            "com.sun.star.awt.Toolkit" ))), UNO_QUERY );
 
	if (rToolkit.is()) {
	  printf ("OK...\n");
	} else printf("Toolkit Error\n");
 
	Reference< XDesktop > rDesktop(Desktop,UNO_QUERY);
	Reference< XFrame > rFrame=rDesktop->getCurrentFrame();
	if (rFrame.is()) printf("rFrame ... OK\n"); else printf("rFrame Error\n");
 
	ShowMessageBox( rToolkit, rFrame,OUString::createFromAscii("Hello") ,
				OUString::createFromAscii("Your First Message\n OK ?")  );
 
    return 0;
}

Nous pouvons tirer trois choses importantes de ce code :

  • la manière que nous pouvons utiliser un tel fichier IDL (donné au-dessus) avec C++: ce n'est pas la première fois que nous rencontrons ce genre de fichier IDL,
  • la manière dont on peut accéder à une interface à travers un service avec createInstance et UNO_QUERY simultanément (voir comment nous obtenons rToolkit)
  • nous voyons aussi comment nous obtenons une fenêtre.

La boîte de dialogue d'obtention d'un fichier : « file picker dialog »

Nous voulons fournir une boîte de dialogue pour chercher un fichier par exploration et qui rende le nom du fichier choisi. Nous commençons par partir d'un exemple du livre de Bernard Marcelly. Quand nous travaillons avec la boîte de dialogue d'obtention d'un fichier, nous devons nous intéresser à trois fichiers IDL. Voici le premier :

//Listing 4 Le fichier XexecutableDialog.idl
// IDL
module com { module sun { module star { module ui { module dialogs {
interface XFilePicker: com::sun::star::ui::dialogs::XExecutableDialog
{
	void setMultiSelectionMode( [in] boolean bMode );
	void setDefaultName( [in] string aName );
	void setDisplayDirectory( [in] string aDirectory )
		raises( ::com::sun::star::lang::IllegalArgumentException );
	string getDisplayDirectory();
	sequence< string > getFiles();
};
}; }; }; }; };

Le début de ce fichier indique que nous nous inquiétons avec l'XExecutableDialog aussi :

//Listing 5 Le fichier XexecutableDialog.idl
// IDL
module com { module sun { module star { module ui { module dialogs {
interface XExecutableDialog: com::sun::star::uno::XInterface
{
	void setTitle( [in] string aTitle );
	short execute();
};
}; }; }; }; };

et ce qui est plus difficile à voir et qui nous intéresses est un fichier définissant deux constantes :

//Listing 6 Le fichier ExecutableDialogResult
// IDL
module com { module sun { module star { module ui { module dialogs {
constants ExecutableDialogResults
{
	const short CANCEL = 0;
	const short OK     = 1;
};
}; }; }; }; };

La façon de faire peut être expliquée comme suit. Vous devez en premier obtenir une Interface XFilePicker. Après nous utilisons un setDisplayDirectory pour un exemple, ensuite nous exécutons la boîte du dialogue et finalement nous obtenons le premier des dossiers choisis. Voici le code correspondant :

//Listing 7
// LINUX C++ (Only the file path is LINUX-like)
// based on Bernard Marcelly's  Example (Book p512)
// Don't forget #include <osl/file.hxx>
	OUString sDocUrl;
	osl::FileBase::getFileURLFromSystemPath(
				OUString::createFromAscii("/home/smoutou/"),sDocUrl);
 
// N'oubliez pas d'ajouter : using namespace com::sun::star::ui::dialogs;
// N'oubliez pas d'ajouter : #include <com/sun/star/ui/dialogs/XFilePicker.hpp>
// N'oubliez pas d'ajouter "com.sun.star.ui.dialogs/XFilePicker \" in the makefile
// Query the XFilePicker interface
 
	Reference< XFilePicker > rFilePicker = Reference< XFilePicker >
					( rOfficeServiceManager->createInstance(
                          OUString( RTL_CONSTASCII_USTRINGPARAM(
                          "com.sun.star.ui.dialogs.FilePicker" ))), UNO_QUERY );
 
	rFilePicker->setDisplayDirectory( sDocUrl);
	short result=rFilePicker->execute();
 
// N'oubliez pas d'ajouter : #include <com/sun/star/ui/dialogs/ExecutableDialogResults.hpp>
// N'oubliez pas d'ajouter "com.sun.star.ui.dialogs/ExecutableDialogResults \" in the makefile
	if (result == ExecutableDialogResults::OK)
	  ShowMessageBox( rToolkit, rFrame,OUString::createFromAscii("Result") ,
			rFilePicker->getFiles()[0]  );

C'est possible de modifier le filtre nommé avec le XFilterManager. Voici le fichier IDL correspondant :

//Listing 8 Le fichier XfilterManager.idl
// IDL
module com { module sun { module star { module ui { module dialogs {
interface XFilterManager: com::sun::star::uno::XInterface
{
	void appendFilter( [in] string aTitle, [in] string aFilter )
		raises( ::com::sun::star::lang::IllegalArgumentException );
	void setCurrentFilter( [in] string aTitle )
		raises( ::com::sun::star::lang::IllegalArgumentException );
	string getCurrentFilter( );
};
}; }; }; }; };

Et maintenant voici un exemple en C++ qui utilise cette interface :

// Listing 9
// LINUX C++
// N'oubliez pas #include <osl/file.hxx>
	OUString sDocUrl;
	osl::FileBase::getFileURLFromSystemPath(
						OUString::createFromAscii("/home/smoutou/"),sDocUrl);
// N'oubliez pas d'ajouter : using namespace com::sun::star::ui::dialogs;
// N'oubliez pas d'ajouter : #include <com/sun/star/ui/dialogs/XFilePicker.hpp>
// N'oubliez pas d'ajouter "com.sun.star.ui.dialogs/XFilePicker \" in the makefile
//	Reference< XFilePicker > rFilePicker(rDesktop,UNO_QUERY);
	Reference< XFilePicker > rFilePicker = Reference< XFilePicker >
					( rOfficeServiceManager->createInstance(
                                 OUString( RTL_CONSTASCII_USTRINGPARAM(
                                 "com.sun.star.ui.dialogs.FilePicker" ))), UNO_QUERY );
 
	rFilePicker->setDisplayDirectory( sDocUrl);
 
// N'oubliez pas d'ajouter : #include <com/sun/star/ui/dialogs/XFilterManager.hpp>
// N'oubliez pas d'ajouter "com.sun.star.ui.dialogs/XFilterManager \" in the makefile
	Reference< XFilterManager > rFilterManager (rFilePicker, UNO_QUERY);
	rFilterManager->appendFilter(OUString::createFromAscii("Texts"),
					OUString::createFromAscii("*.txt"));
	rFilterManager->appendFilter(OUString::createFromAscii("Docs OpenOffice"),
					OUString::createFromAscii("*.sxw;*.sxc"));
	rFilterManager->setCurrentFilter(OUString::createFromAscii("Docs OpenOffice"));
	short result=rFilePicker->execute();
 
// N'oubliez pas d'ajouter : #include <com/sun/star/ui/dialogs/ExecutableDialogResults.hpp>
// N'oubliez pas d'ajouter "com.sun.star.ui.dialogs/ExecutableDialogResults \" in the makefile
	if (result == ExecutableDialogResults::OK)
	  ShowMessageBox( rToolkit, rFrame,OUString::createFromAscii("Result") ,
			rFilePicker->getFiles()[0]  );

Il est temps de montrer comment faire une sauvegarde avec une boîte de Dialogue.

Boîte de dialogue d'enregistrement

Nous partons encore d'un exemple de Bernard Marcelly. Notre problème est de traduire ces lignes OOoBasic : Listing 125 REM ***** BASIC ***** FP=CreateUnoService("com.sun.star.ui.dialogs.FilePicker") Dim FPtype(0) As Integer FPtype(0)=com.sun.star.ui.dialogs.TemplateDescription.FILESAVE_SIMPLE With FP .initialize(FPtype()) .... End With en particulier celles du début. Nous cherchons d'abord les constantes qui permettent de transformer la boîte de dialogue précédente. Elles sont définies dans le fichier TemplateDescription.idl  : Listing 126Le fichier TemplateDescription.idl // IDL module com { module sun { module star { module ui { module dialogs { constants TemplateDescription { const short FILEOPEN_SIMPLE = 0; const short FILESAVE_SIMPLE = 1; const short FILESAVE_AUTOEXTENSION_PASSWORD = 2; const short FILESAVE_AUTOEXTENSION_PASSWORD_FILTEROPTIONS = 3; const short FILESAVE_AUTOEXTENSION_SELECTION = 4; const short FILESAVE_AUTOEXTENSION_TEMPLATE = 5; const short FILEOPEN_LINK_PREVIEW_IMAGE_TEMPLATE = 6; const short FILEOPEN_PLAY = 7; const short FILEOPEN_READONLY_VERSION = 8; const short FILEOPEN_LINK_PREVIEW = 9; const short FILESAVE_AUTOEXTENSION = 10; }; }; }; }; }; };

Pour initialiser nous cherchons dans le fichier FilePicker.idl : Listing 127Description du service FilePicker module com { module sun { module star { module ui { module dialogs { interface XFilePicker; interface XFilePickerNotifier; interface XFilePickerControlAccess; interface XFilterManager; interface XFilePreview; interface XFilterGroupManager;

service FilePicker { [optional, property] string HelpURL; interface XFilePicker; interface XFilePickerNotifier; interface XFilterManager; [optional] interface XFilePreview; [optional] interface XFilePickerControlAccess; [optional] interface XFilterGroupManager; [optional] interface com::sun::star::lang::XInitialization; [optional] interface com::sun::star::util::XCancellable; interface com::sun::star::lang::XComponent; interface com::sun::star::lang::XServiceInfo; interface com::sun::star::lang::XTypeProvider; }; }; }; }; }; }; où vous voyez une interface XInitialization. Nous donnons ensuite le fichier XInitialization.idl : Listing 128 module com { module sun { module star { module lang { interface XInitialization: com::sun::star::uno::XInterface { void initialize( [in] sequence<any> aArguments ) raises( com::sun::star::uno::Exception );

}; }; }; }; }; C'est bon, nous l'avons. Nous voyons que nous devons passer une séquence à la procédure d'initialisation. Il est temps d'écrire le code correspondant. Listing 129 // LINUX C++ // inspired by Bernard Marcelly's Example p515 // N'oubliez pas #include <osl/file.hxx> OUString sDocUrl; osl::FileBase::getFileURLFromSystemPath( OUString::createFromAscii("/home/smoutou/"),sDocUrl); // N'oubliez pas d'ajouter : using namespace com::sun::star::ui::dialogs; // N'oubliez pas d'ajouter : #include <com/sun/star/ui/dialogs/XFilePicker.hpp> // N'oubliez pas d'ajouter "com.sun.star.ui.dialogs/XFilePicker \" in the makefile // Reference< XFilePicker > rFilePicker(rDesktop,UNO_QUERY); Reference< XFilePicker > rFilePicker = Reference< XFilePicker > ( rOfficeServiceManager->createInstance(

                              OUString( RTL_CONSTASCII_USTRINGPARAM(
                              "com.sun.star.ui.dialogs.FilePicker" ))), UNO_QUERY );

rFilePicker->setDisplayDirectory( sDocUrl);

// N'oubliez pas d'ajouter : #include <com/sun/star/ui/dialogs/XFilterManager.hpp> // N'oubliez pas d'ajouter "com.sun.star.ui.dialogs.XFilterManager \" in the makefile Reference< XFilterManager > rFilterManager (rFilePicker, UNO_QUERY);

// N'oubliez pas d'ajouter : #include <com/sun/star/lang/XInitialization.hpp> // N'oubliez pas d'ajouter "com.sun.star.lang.XInitialization \" in the makefile Reference< XInitialization > rInitialize (rFilePicker, UNO_QUERY); Sequence < Any > info(1);

// N'oubliez pas d'ajouter : #include <com/sun/star/ui/dialogs/TemplateDescription.hpp> // N'oubliez pas d'ajouter "com.sun.star.ui.dialogs.TemplateDescription \" in the makefile info[0] <<= (short) TemplateDescription::FILESAVE_SIMPLE; rInitialize-> initialize(info);

rFilterManager->appendFilter(OUString::createFromAscii("Texts"), OUString::createFromAscii("*.txt")); rFilterManager->appendFilter(OUString::createFromAscii("Docs OpenOffice"), OUString::createFromAscii("*.sxw;*.sxc")); rFilterManager->setCurrentFilter(OUString::createFromAscii("Docs OpenOffice")); short result=rFilePicker->execute();

// N'oubliez pas d'ajouter : #include <com/sun/star/ui/dialogs/ExecutableDialogResults.hpp> // N'oubliez pas d'ajouter "com.sun.star.ui.dialogs/ExecutableDialogResults \" in the makefile if (result == ExecutableDialogResults::OK) ShowMessageBox( rToolkit, rFrame,OUString::createFromAscii("Result") , rFilePicker->getFiles()[0] ); Nous sommes intéressés maintenant par la généralisation de tout ceci à une boîte de dialogue générale.

Personal tools