Projet GenDiapo Rédacteurs FLAMENT Alexandre QUAY-THEVENON Christophe Responsable DAVID Jean-Pierre le 23/08/2001 Réalisation d’un Plugin Version II.1.0 Statut Final Disponibilité Livrable Site : http://gendiapo.sourceforge.net/ SOMMAIRE Historique __________________________________ 4 1. Introduction ______________________________ 5 2. Plugin DTD _______________________________ 6 2.1. Présentation __________________________________6 2.2. Description ___________________________________8 2.2.1. Actions possibles __________________________________ 8 2.2.2. Détail des classes _________________________________ 10 2.2.2.1. Classe org.gendiapo.editor.GenericGenDiapoEditor ___________ 10 2.2.2.2. Classe org.gendiapo.editor.GenericGenDiapoEditPanel ________ 11 2.2.2.3. Classe javax.swing.text.ViewFactory ______________________ 12 2.3. Construction & Intégration ______________________15 2.3.1. Paramètres d’un plugin DTD _________________________ 16 2.3.1.1. Dtd-plugin ___________________________________________ 16 2.3.1.2. Name _______________________________________________ 16 2.3.1.3. LongName ___________________________________________ 16 2.3.1.4. Version _____________________________________________ 16 2.3.1.5. Author ______________________________________________ 16 2.3.1.6. Url _________________________________________________ 17 2.3.1.7. Dtd ________________________________________________ 17 2.3.1.8. Editor_______________________________________________ 17 2.3.1.9. Icon ________________________________________________ 18 2.3.2. Utilisation du squelette _____________________________ 18 3. Plugin Action _____________________________ 22 3.1. Présentation _________________________________22 3.2. Description __________________________________22 3.2.1. Actions possibles _________________________________ 22 3.2.2. Détail des classes _________________________________ 22 3.2.2.1. Interface org.merlotxml.merlot.plugin.Action ________________ 22 3.2.2.2. Classe org.merlotxml.util.xml.XpathUtil ____________________ 23 3.2.2.3. Classe org.gendiapo.publisher.Publisher ___________________ 24 3.3. Construction & Intégration ______________________24 3.3.1. Paramètres d’un plugin Action _______________________ 25 3.3.1.1. Action ______________________________________________ 25 3.3.2. Utilisation du squelette _____________________________ 26 Glossaire __________________________________ 28 Annexe ____________________________________ 29 DTD des Plugins __________________________________29 DTD du Plugin DTD ______________________________________ 29 DTD du Plugin Action_____________________________________ 30 URL utiles _______________________________________30 Ant __________________________________________________ 30 DOM (Document Object Model) - Package org.w3c.dom ________ 30 Package javax.swing.text _________________________________ 31 Merlot Plugin development guide ___________________________ 31 Historique Version Date Publication II.0.1 16/08/2001 Version initiale II.0.2 21/08/2001 Mise en place du squelette Ajout de liens vers la documentation II.1.0 23/08/2001 Correction d’après les remarques de Cécile Guilloux Projet GenDiapo Causes Changement 4 / 31 CLIPS / SYNERGIE3R 1. Introduction Le but de ce document est de décrire les différents éléments à mettre en place pour créer un plugin : ce dernier correspond à un ensemble de classes Java permettant de mettre en place un nouveau traitement dans GenDiapo. Son but principal est de faire évoluer l’outil auteur GenDiapo en lui ajoutant de nouveaux traitements. En effet, l’outil auteur GenDiapo étant le plus générique possible avec des traitements par défaut, les plugins permettront de modifier ces derniers. Un plugin peut être de deux types bien distincts : Plugin DTD : ce plugin va permettre d’adapter l’outil auteur de GenDiapo à une DTD bien précise, adaptation concernant les différents aspects visuels de l’outil auteur Plugin Action : ce plugin va permettre d’ajouter un traitement bien précis à l’outil auteur Pour ces deux types de plugins, nous donnerons une brève présentation de leurs buts, puis des explications sur les différentes classes permettant de les construire et enfin la manière de les intégrer dans l’outil auteur GenDiapo. REMARQUE Projet GenDiapo Même si les différents types de plugin ne sont pas particulièrement compliqués à réaliser, certaines parties (comme la modification de la vue stylée) requièrent un niveau assez bon en Java 5 / 31 CLIPS / SYNERGIE3R 2. Plugin DTD Les différents paragraphes suivants vont nous permettre de détailler les différents éléments à implémenter pour vous aider à réaliser un plugin DTD. 2.1. Présentation Ce type de plugin permet de personnaliser l’outil auteur GenDiapo pour un type de DTD bien précis : Il permettra de configurer l’affichage des attributs, du contenu ou des icônes associées pour chaque balise présente dans la DTD. Les deux grandes actions possibles pour le plugin DTD sont : Un filtrage : ce plugin propose des méthodes permettant de rendre invisible (uniquement dans l’outil auteur) des nœuds ou des attributs Une gestion des vues : ce plugin permet de gérer l’affichage des différents nœuds de l’arbre XML dans l’outil auteur : Les attributs de chaque nœud peuvent être présents soit dans la vue stylée soit dans le panneau des attributs L’affichage de chaque attribut peut être modifié dans la vue stylée ou dans le panneau des attributs (le contenu PCData est toujours visible dans la vue stylée) L’affichage des différents champs dans la vue stylée peut être également personnalisé par ce type de plugin Avec l’aide de l’image suivante de GenDiapo, nous allons décrire les différentes parties configurables par un plugin DTD : Projet GenDiapo 6 / 31 CLIPS / SYNERGIE3R Vue stylée Panneau des attributs Arbre L’outil auteur est divisé en 3 parties bien distinctes et nous allons donner les différents éléments modifiables pour chaque partie : L’arbre XML : dans cet arbre, le plugin permet de filtrer les nœuds affichés et également de définir les attributs qui vont être affichés dans la vue des attributs. La vue stylée : cette vue affiche, pour chaque nœud de l’arbre, son contenu avec le contenu des attributs autorisés. L’affichage des éléments dans cette vue pourra être configurable par l’intermédiaire du plugin. Le panneau des attributs : cette vue affiche, pour chaque nœud, l’ensemble des attributs (sauf ceux filtrés) répartis dans un onglet. Le plugin permet de Projet GenDiapo 7 / 31 CLIPS / SYNERGIE3R personnaliser l’onglet (nombre de panneaux, nom des panneaux) ainsi que la répartition des attributs dans l’onglet. Après avoir vu toutes les configurations possibles avec le plugin DTD, nous allons décrire les différentes interfaces et méthodes à implémenter. 2.2. Description Tout d’abord, nous allons donner un tableau donnant la liste des différentes classes et méthodes à implémenter en fonction du type d’actions désirées : Ensuite, pour chacune, une brève description de son but et de ses différents paramètres sera donnée. 2.2.1. Projet GenDiapo Actions possibles 8 / 31 CLIPS / SYNERGIE3R Classe Méthodes (Description des méthodes) Filtrage Attribut Gestion des Vues Nœud Vue des Attributs Vue Stylée Global GenericGenDiapoEditor Définir affichage attributs Rendre un nœud invisible suppressFromView suppressTag Editer le panel d’attributs getEditPanel Sauver les attributs savePanel Donner les vues du PCDATA getViewFactory Synchroniser les différentes vues syncView Ajouter des éléments a menu getMenuItems GenericGenDiapoEditPanel Créer onglet attributs initOnglet Donner référence onglet pour l’attribut getTab Ajouter élément dans onglet createTab Edition attribut getEditComponent ViewFactory Créer la représentation d’un élément de la vue stylée Projet GenDiapo create 9 / 31 CLIPS / SYNERGIE3R Nous allons détailler un peu plus longuement les différentes classes et méthodes énoncées ci-dessus. 2.2.2. Détail des classes Parmi les différentes classes présentées ci-dessus, la classe GenericGenDiapoEditor est à surcharger dans tous les cas. Pour les autres classes, le fait de surcharger est en fonction de la configuration désirée : GenericGenDiapoEditPanel si l’on souhaite changer l’aspect du panneau des attributs ViewFactory si l’on souhaite changer l’affichage par défaut de la vue stylée 2.2.2.1. Classe org.gendiapo.editor.GenericGenDiapoEditor Cette classe contient l’ensemble des méthodes relatives à l’affichage des différents éléments (arbre, vue stylée et attributs) dans l’outil auteur. Elle implémente l’interface org.gendiapo.GenDiapoEditor de GenDiapo et étend la classe org.merlotxml.merlot.GenericDOMEditor de Merlot. Les différentes méthodes à implémenter ou surcharger sont les suivantes : boolean suppressFromView (MerlotDOMNode node, String attribute) Cette méthode renvoie vrai si l’attribut (de nom attribute) de node ne doit pas être affiché dans la vue stylée. Par défaut, cette méthode renvoie vrai, permettant ainsi d’avoir tous les attributs dans les onglets. boolean suppressTag (String nodeName) Cette méthode renvoie vrai si le nœud de nom nodeName ne doit pas être visible dans l’arbre XML. Par défaut cette méthode renvoie faux, ce qui permet de pouvoir ajouter dans l’arbre XML toutes les balises présentes dans la DTD. JPanel getEditPanel (MerlotDOMNode node) Cette méthode renvoie l’éditeur associé au nœud contenant les attributs du nœud. Cet éditeur sera une instance de la classe GenericGenDiapoEditPanel et les attributs pourront être édités de la façon désirée avec les méthodes de cette classe. ViewFactory getViewFactory() Cette méthode renvoie une instance de ViewFactory (package javax.swing.text) pour la vue stylée. Projet GenDiapo 10 / 31 CLIPS / SYNERGIE3R void syncView (MerlotDOMNode node, JEditorPane text) Cette méthode synchronise le nœud node avec son contenu dans la vue stylée text (placement du curseur et des scrolls). Par défaut le curseur est placé sur le premier élément visible du nœud. JMenuItem[] getMenuItems(MerlotDOMNode node) Cette méthode permet de renvoyer un ensemble d’éléments de menus qui seront ajoutés au pop up menu correspondant au nœud node. Ces éléments seront ajoutés en supplément de ceux déjà présents. 2.2.2.2. Classe org.gendiapo.editor.GenericGenDiapoEditPanel Cette classe contient les méthodes concernant l’édition des attributs dans un onglet. La surcharge de ces méthodes permettra de créer plusieurs éléments dans l’onglet et de répartir les attributs dans ces derniers. Par défaut, tous les attributs sont placés dans un onglet nommé < attributs >. Elle implémente l’interface org.gendiapo.GenDiapoEditPanel de GenDiapo et étend la classe org.merlotxml.merlot.GenericDOMEditPanel de Merlot. Les différentes méthodes à surcharger sont les suivantes : JScrollPane createTab (String id) Cette méthode renvoie un JScrollPane, de référence id, qui va être ajouté à l’onglet des attributs. Cette méthode est rarement surchargée. JTabbedPane initOnglet () Cette méthode renvoie l’onglet qui va contenir les attributs avec les différents JScrollPane. Par défaut, l’onglet ne contient qu’un seul JScrollPane nommé « Attributs ». L’exemple suivant créé deux onglets nommés « General » et « Prix » : private static final String IDGeneral = "General"; private static final String IDPrix = "Prix"; private static final String IDAutre = "Autre"; public JTabbedPane initOnglet() { //init onglet JTabbedPane ong = new JTabbedPane(); // ajoute deux onglets ong.addTab("Général", createTab(IDGeneral)); ong.addTab("Prix", createTab(IDPrix)); ong.addTab("Autre", createTab(IDAutre)); return ong; } Projet GenDiapo 11 / 31 CLIPS / SYNERGIE3R String getTab (DTDAttribute a) Cette méthode renvoie une chaîne correspondant à l’identifiant du JScrollPane dans lequel l’attribut doit être ajouté. L’exemple suivant met : l’attribut « nom » dans l’onglet « General » l’attribut « unitee » et « pardix » dans l’onglet « Prix » les autres attributs dans l’onglet « Autre » public String getTab(DTDAttribute a) { if (a.getName().equals("nom")) { return IDGeneral; } else if (a.getName().equals("unitee") || (a.getName().equals("pardix")) { return IDPrix; } return IDAutre; } JComponent getEditComponent (DTDAttribute attr) Cette méthode renvoie le composant associé au type d’attribut donné en paramètre. Par exemple, si l’attribut est de type IDREF, le composant renvoyé sera un combo box contenant les IDREF du document. void save() throws PropertyVetoException Cette méthode enregistre les attributs à partir des données saisies par l’utilisateur. Si vous avez créez vos propres composants avec la méthode getEditComponent, cette méthode doit être surchargée. La sauvegarde proprement dite n’est pas faite dans cette méthode public save() thows PropertyVetoException { Hashmap attributs = new Hashmap() ; // Lisez la valeur de vos composants // Et Stockez les valeurs dans attributs save(attributs) } 2.2.2.3. Classe javax.swing.text.ViewFactory La vue stylée utilise le package javax.swing.text de Java. Avant de commencer les différentes explications, la visite des urls suivantes est conseillée : http://java.sun.com/j2se/1.3/docs/api/javax/swing/text/package-summary.html http://java.sun.com/j2se/1.3/docs/api/javax/swing/text/Document.html http://java.sun.com/j2se/1.3/docs/api/javax/swing/text/View.html Projet GenDiapo 12 / 31 CLIPS / SYNERGIE3R Ce package permet de stocker la vue stylée dans un document (javax.swing.text.document) composé d’une part de son texte et d’autre part de sa structure. Cette dernière est organisée avec différents éléments qui, en plus de leurs propriétés, font référence à leur point de départ et leur point de fin dans le contenu du document. Les différents éléments dans GenDiapo sont donc les suivants : Le cadre pour un nœud Le cadre pour un attribut Le cadre pour le PCData Le texte décomposé en Paragraphe Une ligne visuelle d’un paragraphe Voici un exemple de la répartition de ces éléments dans la vue styléé : Une ligne visuelle Un paragraphe Cadre pour le PCData Cadre pour un nœud Pour chacun de ces éléments, une classe View permet de donner la représentation visuelle. La classe ViewFactory permet de créer les View à travers la méthode View create(Element elem). Une instance peut être donnée par la méthode getViewFactory de GenericGenDiapoEditor. Projet GenDiapo 13 / 31 CLIPS / SYNERGIE3R Nous allons maintenant voir comment architecturer le plugin afin de créer nos propres représentations visuelles d’un document. En premier lieu, l’éditeur fournit, par défaut, une visualisation pour chaque type d’éléments grâce à sa propre ViewFactory. Les cas d’utilisations possibles sont donc : Utiliser complètement l’affichage par défaut : il suffit que la méthode getViewFactory de GenericGenDiapoEditor renvoie null. Créer partiellement ou totalement ses propres visualisations : les actions à effectuer sont : Renvoyer une instance de sa propre ViewFactory par getViewFactory de GenericGenDiapoEditor Renvoyer null pour les éléments conservant l’affichage par défaut Renvoyer sa propre View pour les éléments affichés différemment Nous allons détailler les View par défaut de GenDiapo : A chaque type d’éléments, cités plus hauts, correspond une classe Le cadre pour un nœud Le cadre pour un attribut Le cadre pour le PCData Un paragraphe Une ligne visuelle Projet GenDiapo org.gendiapo.editor.document.AbstractNodeView étend BoxView variables d’instances protected org.w3c.dom.Node xmlNode; protected Shape shape; méthodes public void paint(Graphics g, Shape a) public void paintSelected(Graphics g, Color c) org.gendiapo.editor.document.AbstractAttrView étend BoxView méthodes protected org.w3c.dom.Node xmlNode protected org.merlotxml.util.xml.DTDAttribute merlotDef org.gendiapo.editor.document.AbstractPCDataView étend BoxView variables d’instances org.w3c.dom.Node xmlNode; javax.swing.text.ParagraphView javax.swing.text.LabelView org.gendiapo.editor.document.ConstantView méthodes public static Font getAttributeFont() public static Font getNodeFont(int size) 14 / 31 CLIPS / SYNERGIE3R De manière générale, nous avons : protected org.w3c.dom.Node xmlNode Représentant le nœud associé à la View protected Shape shape Donnant la forme de la vue, utilisée par paintSelected protected org.merlotxml.util.xml.DTDAttribute merlotDef Donnant l’attribut représentant la View public void paint(Graphics g, Shape a) Permettant de dessiner la vue public void paintSelected(Graphics g, Color c) Permettant de dessiner le fait que la View est sélectionnée. L’ordre d’appel entre paint et paintSelected n’est pas déterminé. Cette méthode doit utilisée shape pour obtenir la forme de la sélection Les méthodes surchargées sont généralement : paint(Graphics g, Shape allocation) paintSelected(Graphics g, Color c) Le constructeur La classe ConstantView permet de donner les fontes associées aux attributs et au nœud, respectivement getAttributeFont() et getNodeFont(int size). 2.3. Construction & Intégration Après avoir vu comment créer les différentes méthodes et classes du plugin DTD, la dernière étape consiste en la construction du plugin sous la forme d’un jar et de son intégration dans GenDiapo. Pour créer ce jar, l’arborescence suivante doit être utilisée : plugin.xml : ce fichier contient les informations sur le plugin (cf le paragraphe sur les paramètres d’un plugin DTD classes/ : ce répertoire contient l’ensemble des classes java compilées dtd/ : ce répertoire contient les dtd associées au plugin META-INF/MANIFEST.MF : Le fichier MANIFEST.MF (méta information pour le fichier jar) est vide Projet GenDiapo 15 / 31 CLIPS / SYNERGIE3R L’intégration du plugin dans GenDiapo se fait en plaçant le jar dans le répertoire [directory]/plugins, [directory] étant le répertoire ou se situe le fichier jar de GenDiapo. 2.3.1. Paramètres d’un plugin DTD Voici la liste des éléments à définir dans le fichier « plugin.xml » pour pouvoir mettre en place un plugin associée à une DTD. 2.3.1.1. Dtd-plugin C’est l'élément supérieur dans un fichier « plugin.xml » pour un plugin DTD. Il n'a aucun attribut et tous les éléments suivants sont des fils de cet élément sauf indication contraire. Quand un fichier de ressource est indiqué (le fichier de DTD, par exemple), vous devez indiquer un chemin relatif. Le répertoire de base de ce chemin sera le répertoire racine du plugin. Ainsi, par exemple, l'entrée suivante : <file>dtd/gendiapo.dtd <file> serait trouvé dans [merlot-directory]/plugins/vxml/dtd/gendiapo.dtd pendant le développement, et comme entrée dans [merlot-directory]/plugins/gendiapo.jar une fois le plugin déployé. 2.3.1.2. Name Cet élément vous permet d'indiquer un nom court pour votre plugin. Ceci apparaîtra comme élément de menu sous l’élément de menu « Help, about plugins » <name>GenDiapo</name> 2.3.1.3. LongName Cet élément vous permet d'indiquer un long nom pour votre plugin. <longname>Gendiapo XML plugin pour Merlot</longname> 2.3.1.4. Version L'élément de version vous permet d'indiquer un numéro de version pour votre plugin. <version>1.0 </version> 2.3.1.5. Author Cet élément permet de décrire l'auteur du plugin. <author>Equipe GenDiapo</author> Projet GenDiapo 16 / 31 CLIPS / SYNERGIE3R 2.3.1.6. Url Cet élément vous permet d'indiquer une URL où les utilisateurs peuvent en découvrir plus au sujet de votre plugin. REMARQUE L’url doit obligatoirement commencer par la chaîne « http:// » <url>http://gendiapo.free.fr</url> 2.3.1.7. Dtd Cet élément vous permet d'indiquer la DTD associée à votre plugin. Il contient plusieurs sous éléments. File : Chemin du fichier réel de DTD. <file>dtd/gendiapo.dtd</file> Doctype : Type de document utilisé avec ce plugin. GenDiapo utilisera ceci comme élément de racine du document XML. <doctype>gendiapo</doctype> publicID : Identification publique incluse dans la déclaration de doctype. <publicID>-//GenDiapoXMLForum//GenDiapo XML1.0//EN</publicID> systemID : Système identification inclus dans la déclaration de doctype. <systemID>http://www.voicexml.org/dtd/vxml1.0.dtd</systemID> 2.3.1.8. Editor Cet élément définit une classe individuelle d'éditeur et les éléments édités. Elle a deux sous éléments. Class : Nom complet de la classe d'org.merlotxml.merlot.MerlotDOMEditor. implémentant l'interface <class>org.merlotxml.merlot.plugins.vxml.AudioEditor</class> REMARQUE Les attributs personnalisés doivent mettre en application l’interface MerlotDOMEditor. Vous pouvez également étendre GenericDOMEditor et/ou GenericDOMEditPanel si vous ne voulez pas appliquer toutes les méthodes définies par cette interface. Element : Elément pour lequel que cet éditeur sera employé. Des éléments multiples peuvent être indiqués pour un éditeur simple. <element>paragraph</element> Projet GenDiapo 17 / 31 CLIPS / SYNERGIE3R 2.3.1.9. Icon Cet élément définit une icône personnalisée devant apparaître pour un ou plusieurs éléments. L'attribut source indique le chemin de l’image (typiquement un GIF 32x32). L'attribut smallSource indique le chemin de la petite version de l'image (typiquement un GIF 16x16). Element : Elément pour lequel les images seront utilisées. Des éléments multiples peuvent être indiqués pour une image simple. <icon source="icons/para.gif" smallSource="icons/para_s.gif"> <element>paragraph</element> </icon> Ce fichier sera placé à un endroit très précis dans le répertoire du plugin et contiendra les informations suivantes 2.3.2. Utilisation du squelette Pour faciliter la mise en place de ce plugin, nous vous donnons avec ce manuel un squelette de répertoires et de classes Java (disponible sur le site cité à la première page). Ce squelette est en fait un exemple du plugin pour une DTD simple. Les tâches répétitives de compilation, mise sous forme de jar et intégration dans l’éditeur, sont automatisées grâce au fichier build.xml. Pour pouvoir utiliser ce fichier, l’utilitaire < ant > est requis (téléchargement sur http://jakarta.apache.org/ant/). Une fois installé, les différents objectifs possibles avec cet utilitaire sont les suivants : Objectifs all install Description Objectifs par défaut si rien précisé (équivalent à « install ») Crée le jar si besoin et l’intègre dans l’éditeur install-nojar Compile si besoin le plugin et l’install sous forme non compressé dans le répertoire plugins de GenDiapo jar Compile si besoin le plugin et crée le jar à partir du répertoire build compile Compile les classes java dans build et copie le fichier plugin.xml, ainsi que les gif, jpg, xml et xsl clean Efface tous les fichiers pouvant être recrés, c’est à dire le jar et le répertoire build. Projet GenDiapo 18 / 31 CLIPS / SYNERGIE3R Pour pouvoir appliquer un de ces objectifs, il faut saisir la ligne de commande suivante : ant « nom objectif ». Exemple : ant install Compile le plugin, puis créer le jar, et le copie dans le répertoire de l’éditeur. Cette commande est équivalente à < ant > REMARQUE Projet GenDiapo L’intégration du plugin dans l’éditeur correspond à la copie du fichier jar généré dans le répertoire de l’éditeur 19 / 31 CLIPS / SYNERGIE3R L’arborescence du squelette est la suivante (le texte en italique indique les modifications à effectuer pour créer votre propre plugin) : raçine build.xml build src plugin.xml dtd META-INF MANIFEST.MF classes org merlotxml merlot plugins dtd exampledtd ExampleDTD.java atttributes styledview PluginViewFactory.java Projet GenDiapo 20 / 31 CLIPS / SYNERGIE3R Le détail de chaque fichier et répertoire : build.xml Fichier permettant la compilation et l’intégration du plugin Les 3 lignes concernant pluginName, gendiapo.dir, gendiapo.jar sont à modifier build/ Répertoire contenant l’arborescence du plugin compilé, prêt à être mis sous forme de jar. Ce répertoire est créé et géré par ant src/ Répertoire contenant le source du plugin src/plugin.xml Information sur le plugin A modifier selon le chapitre précédent src/dtd DTD Incluez vos DTD src/META-INF/MANIFEST.MF Méta information (fichier vide) pour le JAR src/classes Source des classes pour le fichier JAR src/classes/org/merlotxml/merlot/plugins/dtd/exampledtd/ExampleDTD.java étend GenericGenDiapoEditor. Classe référencée par plugin.xml Ajouter autant de GenericGenDiapoEditor que nécessaire src/classes/org/merlotxml/merlot/plugins/dtd/exampledtd/attributes Répertoire contenant les classes associées aux panneaux des attributs. Ces classes héritent toutes de GenericGenDiapoEditPanel Ajouter autant de GenericGenDiapoEditPanel que nécessaire src/classes/org/merlotxml/merlot/plugins/dtd/exampledtd/styledview Répertoire contenant les classes associées à la vue stylée Créer autant de View que nécessaire dans ce répertoire. Elles seront créées par la ou les ViewFactory src/classes/org/merlotxml/merlot/plugins/dtd/exampledtd/styledview/PluginViewFactory.java ViewFactory associée à ExampleDTD Créér autant de ViewFactory dans ce répertoire. Une ViewFactory peut être référencée par plusieurs GenericGenDiapoEditor Projet GenDiapo 21 / 31 CLIPS / SYNERGIE3R 3. Plugin Action Les différentes parties ci-dessous vont vous permettre de réaliser un plugin Action pour l’outil auteur GenDiapo. 3.1. Présentation Le plugin Action vous permet d’ajouter des actions spécifiques à l’outil auteur GenDiapo, actions qui pourront être effectuées sur les documents en cours d’édition. Ces actions pourront être adaptables à tous les documents éditables avec l’outil auteur ou seulement destinés à un type de document (à un type de DTD). Par exemple, ce plugin pourra permettre la mise en place d’un nouveau traitement de publication (publication PDF) pour les documents GenDiapo. 3.2. Description Après avoir décrit les actions possibles avec ce plugin, nous donnerons une brève description des classes et méthodes à implémenter ou surcharger. 3.2.1. Actions possibles Une seule action est possible pour ce plugin : son lancement. 3.2.2. Détail des classes 3.2.2.1. Interface org.merlotxml.merlot.plugin.Action Pour mettre en place le plugin Action, il suffit de créer une classe qui implémente l’interface org.merlotxml.merlot.plugin.action.Action : public void init (Node config) Cette méthode est appelée lors du chargement du plugin. Le paramètre config correspond à la balise config dans le fichier de configuration (cf. le paragraphe 3.3.1). Les différentes valeurs peuvent être extraites soit en parcourant les Nodes avec les classes de org.w3c.dom (http://java.sun.com/xml/jaxp1.0.1/docs/api/org/w3c/dom/package-summary.html ), soit par la classes fournis par Merlot : org.merlotxml.util.xml.XPathUtil (cf. le paragraphe 3.2.2.3) public void performAction(Document doc) Projet GenDiapo 22 / 31 CLIPS / SYNERGIE3R Cette méthode sera déclenchée à chaque clic sur le menu associé au plugin. Le document est décrit pour la classe org.w3c.dom.Document (http://java.sun.com/xml/jaxp-1.0.1/docs/api/org/w3c/dom/packagesummary.html ). REMARQUE D’autres outils peuvent normalement utiliser directement ce document DOM, cependant il est conseillé de faire re-interprété votre document. En effet, il existe apparemment des incompatibilités entre les différents package utilisant le DOM. Pour ce faire, utiliser le code suivant : import org.xml.sax.InputSource; import org.w3c.dom.*; ... StringWriter strOut = new StringWriter(); DOMLiaisonFactory.getDOMLiaison().print(doc, strOut, "", false); new InputSource(new StringReader(strOut.toString())) 3.2.2.2. Classe org.merlotxml.util.xml.XpathUtil public static String parseVariable( Node contextNode, String xPathString ) Trouve le premier nom de variable contenu dans xPathString. Elle retourne null s’il n’y a aucune variable et le symbole $ n’est pas inclus. Par exemple pour xPathString "//myelement[attribute::id=$myvariable]", la valeur retournée est "myvariable". public static NodeList selectNodes(Node contextNode, String str) Retourne une liste de noeud correspondant aux critères donnés par le XPath str relatif au nœud contextNode. Elle retourne null si aucun nœud n’est trouvé. public static Node selectSingleNode(Node contextNode, String str) Retourne le premier élément de la liste renvoyée par selectNodes(contextNode, str). Il correspond au premier nœud correspondant au XPath relatif au nœud contextNode public static List getValueList(Node contextNode, String xpath) throws SAXException Renvoie une liste de String correspondant au chemin XPath xpath relatif au nœud contextNode public static String getValue(Node contextNode, String str) throws SAXException Renvoie la valeur textuelle du premier nœud correspondant au chemin XPath str relatif au nœud contextNode Projet GenDiapo 23 / 31 CLIPS / SYNERGIE3R 3.2.2.3. Classe org.gendiapo.publisher.Publisher public Publisher(String base, int steps) Constructeur de la classe. La chaîne de caractères base indique le chemin ou se situe les fichiers xsl. L’entier steps indique le nombre de transformation qui vont être appliqué. Son but est de pouvoir donner à l’utilisateur, l’état d’avancement du processus de publication. public void setParameter(String key, Object value) Définit un paramètre qui sera visible dans les fichiers xsl public Object getParameter(String key) Lit la valeur d’un paramètre. public boolean applyXslt(Source src, Source xsl, Result dest) Applique un fichier xslt xsl à la source src, et stocke le résultat dans dest. Source et Result sont des classes du package org.xml.sax public boolean applyXslt(InputStream streamSrc, String fileXsl, OutputStream streamDest) Applique au flux streamSrc le fichier xslt fileXsl et stocke le résultat dans le flux streamDest public boolean applyXslt(InputStream streamSrc, String fileXsl, String fileDest) Applique au flux streamSrc le fichier xslt fileXsl, et stock le résultat dans le fichier fileDest public boolean applyXslt(String fileSrc, String fileXsl, String fileDest) Applique au fichier fileSrc le fichier fileXsl et stocke le résultat dans le fichier fileDest. public void applyXslfo(InputStream streamSrc, String document) Transforme le xslfo donné par le flux streamSrc en fichier pdf dont le nom est document public void applyXslfo(String fileSrc, String document) throws FileNotFoundException Transforme le xslfo donné par le fichier fileSrc en fichier pdf dont le nom est document 3.3. Construction & Intégration Après avoir vu comment créer les différentes méthodes et classes du plugin Action, la dernière étape consiste en la construction du plugin sous la forme d’un jar et de son intégration dans GenDiapo. Projet GenDiapo 24 / 31 CLIPS / SYNERGIE3R L’arborescence utilisée pour créer ce type de jar est la même que celle utilisée pour le plugin DTD : plugin.xml classes/ META-INF/MANIFEST.MF L’intégration du plugin dans GenDiapo se fait en plaçant le jar dans le répertoire [directory]/plugins, [directory] étant le répertoire ou se situe le fichier jar de GenDiapo 3.3.1. Paramètres d’un plugin Action Un plugin Action vous permet de personnaliser des actions à l’aide d’un fichier « plugin.xml » qui contient les éléments suivants. REMARQUE Le nom, le nom long, la version, l'auteur, et les éléments de URL dans le fichier « plugin.xml » sont identiques à ceux du plugin DTD. 3.3.1.1. Action Cet élément indique une action simple. Un fichier « plugin.xml » peut contenir des actions multiples. Menu : Nom apparaissant dans le menu Plugins pour cette action. <menu>XSL GenDiapo</menu> Class : Nom complet de la classe d'org.merlotxml.merlot.plugin.action.Action. implémentant l'interface <class>org.merlotxml.merlot.plugins.action.xslt.Plugin</class> Icon : Chemin d’accès à un icône apparaissant dans le menu « Plugins » à côté du texte indiqué dans l'élément « menu » (typiquement un GIF 16x16). Tooltip : Message apparaissant au-dessus de l'élément de menu dans le menu Plugins. Config : Stockage des informations de configuration spécifiques à votre plugin. Les balises peuvent êtres comme vous le souhaitez. La structure pourra être lu depuis le plugin Projet GenDiapo 25 / 31 CLIPS / SYNERGIE3R 3.3.2. Utilisation du squelette Pour faciliter la mise en place de ce plugin, nous vous fournissons avec ce manuel un squelette de répertoires et de classes Java. Ce squelette est en fait un exemple simple. Pour mettre le plugin sous la forme d’un jar, l’utilitaire < ant > doit être utilisé : son fonctionnement est expliqué au paragraphe au 2.3.2. L’arborescence est la suivante (le texte en italique indique les modifications à effectuée pour créer votre propre plugin) : raçine build.xml build src plugin.xml META-INF MANIFEST.MF classes org merlotxml merlot plugins action Apply.java Projet GenDiapo 26 / 31 CLIPS / SYNERGIE3R Le détail de chaque fichier et répertoire: build.xml Fichier permettant la compilation et l’intégration du plugin Les 3 lignes concernant pluginName, gendiapo.dir, gendiapo.jar sont à modifier build/ Répertoire contenant l’arborescence du plugin compilé non compressée src/ Répertoire contenant le source du plugin src/plugin.xml Information sur le plugin A modifier selon le chapitre précédent src/META-INF/MANIFEST.MF Méta information (fichier vide) pour le JAR src/classes Source des classes pour le fichier JAR src/classes/org/merlotxml/merlot/plugins/action/Apply.java étend Action Classe referencé par plugin.xml Ajouter autant de Action que nécessaire Projet GenDiapo 27 / 31 CLIPS / SYNERGIE3R Glossaire Ant Logiciel permettant de faire les tâches répétitives sur le code d’un projet tel que la compilation, la génération de la documentation. L’ensemble des tâches (appelé target) sont décrites dans un fichier « build.xml » Arbre Partie visuelle, à gauche de l’éditeur, représentant le document sous forme d’arbre : Chaque nœud visuel étant un nœud du document XML DOM Document Object Model, normalisé par le W3C, est une interface permettant d’accéder (en écriture et lecture) au contenu de document XML. L’implémentation en java se situe dans le package org.w3c.dom Elément Portion du document de la vue stylée correspondant à un nœud XML, attribut XML, PCData, paragraphe de PCData ou ligne de paragraphe Panneau des attributs Partie visuelle, en bas à droite de l’éditeur, représentant les attributs non présents dans la vue stylée pour le nœud sélectionné Plugin Action Plugin permettant d’ajouter des actions spécifiques à l’outil auteur GenDiapo, actions pouvant être effectuées sur les documents en cours d’édition. Ces actions pourront être adaptables à tous les documents éditables avec l’outil auteur ou seulement destinés à un type de document (à un type de DTD). Plugin DTD Plugin permettant de personnaliser l’outil auteur GenDiapo pour un type de DTD bien précis. Deux types de fonctionnalités offertes : filtrage et modification d’affichage View Classe Java dont le but est la représentation d’ un élément à l’utilisateur Vue stylée Partie visuelle, en haut à droite de l’éditeur, représentant le document XML avec des éléments Projet GenDiapo 28 / 31 CLIPS / SYNERGIE3R Annexe DTD des Plugins Nous allons donner la DTD associée à chaque fichier « plugin.xml » en fonction du type de plugin. DTD du Plugin DTD <!ELEMENT dtd-plugin (name, longName?, version?, author?, url?, (dtd | editor | icon)*> <!ELEMENT name (#PCDATA)> <!ELEMENT longName (#PCDATA)> <!ELEMENT version (#PCDATA)> <!ELEMENT author (#PCDATA)> <!ELEMENT url (#PCDATA)> <!ELEMENT dtd (file, doctype, publicID, systemID)> <!ELEMENT file (#PCDATA)> <!ELEMENT doctype (#PCDATA)> <!ELEMENT publicID (#PCDATA)> <!ELEMENT systemID (#PCDATA)> <!ELEMENT editor (class, element*)> <!ELEMENT class (#PCDATA)> <!ELEMENT element (#PCDATA)> <!ELEMENT icon (element*)> <!ATTLIST icon source CDATA #REQUIRED smallSource CDATA #REQUIRED> Projet GenDiapo 29 / 31 CLIPS / SYNERGIE3R DTD du Plugin Action <!ELEMENT action-plugin (name, longName?, version?, author?, url?, action*)> <!ELEMENT name (#PCDATA)> <!ELEMENT longName (#PCDATA)> <!ELEMENT version (#PCDATA)> <!ELEMENT author (#PCDATA)> <!ELEMENT url (#PCDATA)> <!ELEMENT action (menu, class, icon?, tooltip?, config?)> <!ELEMENT menu (#PCDATA)> <!ELEMENT class (#PCDATA)> <!ELEMENT icon (#PCDATA)> <!ELEMENT tooltip (#PCDATA)> <!ELEMENT config (configitem*)> <!ELEMENT configitem (#PCDATA)> <!ATTLIST configitem name CDATA #REQUIRED> URL utiles Ant http://jakarta.apache.org/ant/ DOM (Document Object Model) - Package org.w3c.dom http://java.sun.com/xml/jaxp-1.0.1/docs/api/org/w3c/dom/packagesummary.html http://www.w3.org/DOM/ Projet GenDiapo 30 / 31 CLIPS / SYNERGIE3R Package javax.swing.text http://java.sun.com/j2se/1.3/docs/api/javax/swing/text/package-summary.html http://java.sun.com/j2se/1.3/docs/api/javax/swing/text/Document.html http://java.sun.com/j2se/1.3/docs/api/javax/swing/text/View.html Merlot Plugin development guide http://www.merlotxml.org/docs/plugins/plugin-dev-guide.html Projet GenDiapo 31 / 31 CLIPS / SYNERGIE3R