Laurent Kempé
Rédaction, Publication et Présentation de contenu crée en XML à l'aide de Word 2003, Partie 5
Réagir à l'insertion d'un tag XML dans un document Word 2003 afin de pouvoir faciliter la vie du rédacteur
Par Laurent Kempé publié le 01/10/2004 à 15:32, lu 10869 fois, 1 pages
Introduction
Dans le précédent article nous avons vu comment il est possible de faire une transformation XSLT du document et une prévisualisation de rendu comme elle serait faite sur le site, tout cela en mode déconnecté sur la machine de l'auteur.

Aujourd'hui je vous propose d'enrichir l'expérience utilisateur en lui facilitant la vie lorsqu'il s'agit d'insérer des données sous la forme de fichier de type images.

Le but est de fournir à l'utilisateur une interface graphique lui permettant de choisir le fichier image sur le disque.
Analyse du problème
Lorsque nous avons définit le schéma XML dans la Partie 1, nous avons simplifié le schéma afin que l'exemple reste simple. Imaginons maintenant que nous voulions offrir à l'auteur la possibilité d'ajouter du contenu sous forme de graphique. Nous ajoutons pour cela un tag img à notre schéma qui peut être ajouté dans les éléments de type section.

Le but recherché n'est pas d'insérer l'image sous sa forme bitmap mais plutôt une référence sur le fichier afin d'avoir un résultat semblable à celui-ci:
<img>MonImage.jpg</img>
Afin de pouvoir ouvrir notre boite de dialogue de choix du fichier il faut que Word nous indique quand l'utilisateur à insérer un tag de type img.
En utilisant l'explorateur de classes de Visual Studio .NET 2003, nous identifions un événement du nom de XMLAfterInsert :



Il nous faut donc crée un handler d'événement afin de pouvoir traiter cet événement dans notre application. Nous trouvons plus d'informations en regardant la description complète de l'événement de l'explorateur de classes de Visual Studio .NET 2003 :



Il nous faut donc crée une méthode qui va réagir à l'événement. C'est ce que nous allons voir dans le paragraphe suivant.
Evénements
Nous ajoutons à notre programme la propriété suivante :
private DocumentEvents2_XMLAfterInsertEventHandler xmlafterinsertEvent;
Puis nous ajoutons une méthode qui va être appelée lorsque l'événement est levé :
protected void ThisDocument_XMLAfterInsert(XMLNode node, bool b)
{
}
Il nous faut enfin lier la méthode à l'événement et pour cela nous ajoutons le code suivant à la méthode crée par le wizard, _Startup :
/// <summary>
/// Required procedure. Do not modify.
/// </summary>
/// <param name="application">Application object.</param>
/// <param name="document">Document object.</param>
public void _Startup(object application, object document)
{
    this.thisApplication = application as Application;
    this.thisDocument = document as Document;

    xmlafterinsertEvent = new DocumentEvents2_XMLAfterInsertEventHandler(ThisDocument_XMLAfterInsert);
    ((DocumentEvents2_Event) thisDocument).XMLAfterInsert += xmlafterinsertEvent;

    ...
Ajouter un point d'arrêt sur la méthode ThisDocument_XMLAfterInsert que vous venez d'ajouter et lancer le projet avec F5. Votre document Word 2003 s'ouvre, maintenant ajouter un tag XML définit par votre schéma XML. Une fois que vous relâcher le bouton de la souris vous vous retrouver dans le débuggeur au point d'arrêt que vous aviez ajouté.

Nous somme donc capable de réagir à l'événement d'insertion d'un tag XML dans le document. Le souci c'est que nous ne voulons pas réagir à toutes les insertions mais seulement quand l'auteur ajoute un tag img. Il nous faut donc filtrer les événements.
Filtrer
En regardant de plus prêt la signature de la méthode ThisDocument_XMLAfterInsert on se rend compte que nous recevons comme paramètre : XMLNode node. La propriété BaseName de la classe XMLNode représente le nom du tag sous forme de string qui vient d'être inséré, c'est exactement ce qu'il nous faut afin de filtrer les événements. Nous modifions donc notre méthode comme suit :
protected void ThisDocument_XMLAfterInsert(XMLNode node, bool b)
{
    if (node.BaseName == "img")
    {
        ...
    }
}
        
Fichier
La suite est toute simple, il nous faut ouvrir un dialogue de requête de fichier afin que l'auteur puisse choisir un fichier de type image et que le nom du fichier soit insérer dans le tag xml img.

Pour cela Word 2003 met à notre disposition la classe FileDialog. Nous la paramettrons avec toutes les options que fournis Word 2003 afin que nous ne puissions choisir qu'un fichier de type image, c'est-à-dire avec une des extensions "*.jpg, *.png, *.gif".
protected void ThisDocument_XMLAfterInsert(XMLNode node, bool b)
{
    IDictionary settings = ((IDictionary) AssemblySettings.GetConfig("FileExtensions"));

    if (node.BaseName == "img")
    {
        FileDialog filedlg = ThisApplication.get_FileDialog(MsoFileDialogType.msoFileDialogFilePicker);
        filedlg.InitialView = MsoFileDialogView.msoFileDialogViewPreview;
        filedlg.AllowMultiSelect = false;
        filedlg.Title = "Choose an image file";
        filedlg.ButtonName = "OK";

        filedlg.Filters.Clear();
        filedlg.Filters.Add("Images Files", (string) settings["image"], oMissing); //"*.jpg, *.png, *.gif"

        int ret = filedlg.Show();

        if (ret == -1)
            node.Text = Path.GetFileName(filedlg.SelectedItems.Item(1));

    }
}
Si l'utilisateur à sélectionné un fichier nous récupérons le nom du fichier que nous affectons à la propriété Text de la classe XMLNode que nous recevons en paramètre. Ainsi le nom du fichier sera insérer entre le tag de début et de fin du tag img.



Remarque : Il est a noter que nous utilisons la propriété filedlg.InitialView à laquelle nous affectons la valeur MsoFileDialogView.msoFileDialogViewPreview afin d'avoir une prévisualisation de l'image dans le dialogue de sélection de fichier, ce qui est très pratique.

Conclusion
Nous avons vu dans cette partie de notre série d'articles comment enrichir l'expérience de l'auteur lors de l'écriture de son article. Pour cela nous avons ajouté une fonctionnalité lui permettant d'insérer une référence sur une image à l'aide d'un dialogue de sélection de fichier lorsqu'il insère dans le document un tag XML spécial.

Une fois de plus cette solution de rédaction de contenu à l'aide de Word 2003 et du XML est d'une grande flexibilité.Nous verrons « normalement » dans le prochain article de la série comment les auteurs me font parvenir leurs articles sous forme de zip directement depuis Word 2003.
 
» Démarrer une discussion