Jaxe, votre éditeur XML
Jaxe, votre éditeur XML

Documentation pour les développeurs
• Introduction
• Utilisation de Jaxe au sein d'une autre application
• Création de nouveaux éléments Jaxe
• Ajout d'une fonction

# Création de nouveaux éléments Jaxe

Auteur: Damien Guillaume

On appelle élément Jaxe une classe dérivée de la classe `jaxe.JaxeElement`, décrivant un affichage pour un élément XML donné. Les éléments Jaxe standard sont regroupés dans le package `jaxe.elements`. Ils correspondent à des types d'affichage des fichiers de configuration (par exemple, le type `string` correspond à l'élément Jaxe `jaxe.elements.JEString`).

La création d'un nouvel élément Jaxe se fait en créant une nouvelle classe dérivée de `jaxe.JaxeElement`. Il peut ensuite être utilisé dans un fichier de configuration avec le type `plugin`, en précisant la classe à utiliser. Par exemple:

    <AFFICHAGE_ELEMENT element="BOUBOULE" type="plugin">
      <PARAMETRE nom="classe" valeur="JEBooleen"/>
    </AFFICHAGE_ELEMENT>

Deux méthodes doivent impérativement être définies dans l'élément Jaxe: `init` et `nouvelElement`. Deux autres ne sont utiles que si on utilise des balises de début et de fin (comme expliqué plus loin): `insPosition` et (si l'élément a des attributs) `majAffichage`.

`init` est utilisé pour l'initialisation et l'insertion du composant Swing dans la zone de texte. On trouve en paramètres la position à laquelle l'élément doit être inséré, et le nœud DOM. A partir de ces paramètres, il faut insérer le composant avec la méthode `JaxeElement.insertComponent(Position pos, JComponent comp)`.

Les choses se compliquent si on veut utiliser un composant pour une balise de départ et un composant pour une balise de fin, en laissant Jaxe traiter récursivement les sous-éléments. Il faut alors récupérer la position dans le texte après l'insertion de la balise de départ (elle est retournée par `insertComponent`), ajouter les enfants avec `creerEnfants(Position)`, puis insérer la balise de fin avec un nouvel appel à `insertComponent` (avec l'objet `Position` passé en paramètre à `creerEnfants`. Il faut ensuite mettre à jour le style des caractères pour les balises et le texte des enfants, ce qui nécessite d'avoir conservé la position de départ avant le premier `insertComponent`. Voilà un exemple:

    int offsetdebut = pos.getOffset();
    Position newpos = insertComponent(pos, composantBaliseDebut);
    creerEnfants(newpos);
    insertComponent(newpos, composantBaliseFin);
    if (newpos.getOffset() - offsetdebut - 1 > 0) {
      SimpleAttributeSet style = attStyle(null);
      if (style != null)
        doc.setCharacterAttributes(offsetdebut, newpos.getOffset() - offsetdebut - 1, style, false);
    }

La méthode `nouvelElement` est appelée quand l'utilisateur insère un nouvel élément. Elle doit éventuellement demander des informations à l'utilisateur (comme par exemples les attributs), et renvoyer l'élément DOM correspondant. On peut se servir de `jaxe.DialogueAttributs` pour demander les attributs à l'utilisateur.

`insPosition` peut être appelée pour obtenir la position à laquelle sera placé le curseur après l'insertion d'un nouvel élément. Par défaut le curseur sera placé après l'élément, mais il peut être utile de le placer entre les balises de début et de fin quand celles-ci sont utilisées.

Enfin, `majAffichage` est appelée pour mettre à jour l'affichage quand les attributs ont été modifiés dans le panneau d'attributs.

## Exemple

Le fichier suivant est un élément Jaxe utilisable pour un booléen, qui utilise une case à cocher pour l'affichage: JEBooleen.java. Il peut être compilé et placé dans un fichier jar pour être utilisable comme nouveau plugin de Jaxe, comme ceux disponibles sur la page des plugins.