février
2009
Dans ce billet nous allons transformer l’éditor simple ShapesEditor (qui contient un page avec une UI SWT) org.eclipse.ui.part.EditorPart du billet précédant en un editor multi pages org.eclipse.ui.part.MultiPageEditorPart pour avoir 2 pages :
- Une page Source qui affiche le source XML dans un éditeur SSE org.eclipse.wst.sse.ui.StructuredTextEditor.
- Une page Overview qui affiche l’interface SWT du billet précédant.
Le code sera beaucoup plus simple que le billet précédant car nous n’aurons plus besoin de gérer l’état dirty, la sauvegarde… du DOM-SSE dans l’editor ShapesEditor. En effet la page Source utilise StructuredTextEditor qui gère en interne un modèle SSE. Toutes la gestion du DOM-SSE sera donc déléguée à cette page source.
Vous pouvez télécharger le projet org.eclipse.wst.xml.examples.shapes_1.0.0.zip présenté dans ce billet.
Voici une copie d’écran de la page Source de l’éditeur ShapesEditor :
Voici une copie d’écran de la page Overview de l’éditeur ShapesEditor :
StructuredTextEditor
Nous partirons des sources de Shapes DOM-SSE du billet précédant pour expliquer les sources de ce projet. La première chose est d’ajouter la dépendance org.eclipse.wst.sse.ui au projet, car la page source utilise une instance de org.eclipse.wst.sse.ui.StructuredTextEditor.
StructuredTextEditor hérite de la classe org.eclipse.ui.editors.text.TextEditor. Elle est capable de construire un document structuré (comme un DOM) à partir du contenu de l’éditeur. L’éditeur XML de WST utilise cette classe. StructuredTextEditor utilise en interne un modèle SSE et gère toutes les problématiques de chargement du modèle SSE (expliquées dans les billets précédants), de l’état dirty du modèle SSE, de la sauvegarde….
ShapesEditor
La classe ShapesEditor doit être modifiée pour gérer les 2 pages Source et Overview.
MultiPageEditorPart
La classe ShapesEditor doit étendre org.eclipse.ui.part.MultiPageEditorPart pour gérer les 2 pages. La méthode ShapesEditor#createPartControl(Composite parent) doit être supprimée et remplacée par la méthode ShapesEditor#createPages() que MultiPageEditorPart demande d’implémenter :
createPage0();
createPage1(getContainer());
}
La méthode createPage0 permet de créer la page Source en instançiant StructuredTextEditor comme suit :
try {
sourcePage =new StructuredTextEditor();
sourcePage.setEditorPart(this);
int index = addPage(sourcePage, getEditorInput());
setPageText(index, "Source");
} catch (PartInitException e) {
ErrorDialog.openError(getSite().getShell(),
"Error creating nested text editor", null, e.getStatus());
}
}
La méthode createPage1 permet de créer la page Overview constitué des widgets SWT.
Il faut supprimer la variable model et la remplacer par sourcePage, car le modèle SSE est géré par l’instance StructuredTextEditor et plus par ShapesEditor :
private StructuredTextEditor sourcePage;
ShapesEdior#getDOMModel()
La méthode ShapesEdior#getDOMModel() doit être modifiée pour récupérer le modèle DOM-SSE à partir de l’instance StructuredTextEditor comme suit :
IDOMModel model = (IDOMModel)sourcePage.getModel();
if (!isInitialized) {
model.addModelStateListener(listener);
this.isInitialized = true;
}
return model;
}
La variable isInitialized, permet de definir si le listener a deja été ajouté ou non.
REMARQUE : la méthode StructuredTextEditor#getModel() est marquée comme deprecated. D’après la JavaDoc, il ne faut pas utiliser cette méthode mais utiliser les méthodes IModelManager#getExistingModelFor*(IDocument document).
Le listener était utilisé jusqu’à maintenant pour synchroniser l’UI avec le DOM (lorsque le DOM change) et pour gérer l’état dirty du modèle SSE. Dans notre cas, l’état dirty n’a plus besoin d’être géré (voir explication ci dessus). Le listener a le code suivant :
...
public void modelChanged(IStructuredModel model) {
// Update UI From DOM Model which have changed
updateUIFromDOMModel();
}
...}
Gestion dirty
La méthode IModelStateListener#modelDirtyStateChanged(IStructuredModel model, boolean isDirty) qui appelait la méthode firePropertyChange(IEditorPart.PROP_DIRTY); n’a plus besoin d’être implémenté, car l’état dirty de l’éditor est géré par l’instance sourcePage (StructuredTextEditor).
La méthode ShapesEditor#isDirty() doit être supprimé aussi.
Le code de dispose :
...
if (model.isDirty()) {
model.releaseFromEdit();
...
}
doit être supprimé, car le cas ou l’utilisateur quitte l’éditeur sans sauvegarder le DOM est géré par l’instance sourcePage (StructuredTextEditor) .
Gestion sauvegarde
Le code doSave et doSaveAs est délégué à l’instance sourcePage (StructuredTextEditor) comme suit :
sourcePage.doSave(monitor);
}
public void doSaveAs(doSaveAs) {
sourcePage.doSaveAs();
}
public boolean isSaveAsAllowed() {
return sourcePage.isSaveAsAllowed();
}
3 Commentaires + Ajouter un commentaire
Articles récents
- Conception d’un client Eclipse RCP et serveur OSGI avec Spring DM [step5]
- Conception d’un client Eclipse RCP et serveur OSGI avec Spring DM [step4]
- Conception d’un client Eclipse RCP et serveur OSGI avec Spring DM [step3]
- Conception d’un client Eclipse RCP et serveur OSGI avec Spring DM [step2]
- Conception d’un client Eclipse RCP et serveur OSGI avec Spring DM [step1]
Commentaires récents
- Conception d’un Editeur Eclipse de workflow XML [step 0] dans
- Conception d’un Editeur Eclipse de workflow XML [step 19] dans
- Conception d’un Editeur Eclipse de workflow XML [step 7] dans
- Conception d’un Editeur Eclipse de workflow XML [step 7] dans
- Conception d’un Editeur Eclipse de workflow XML [step 7] dans
http://www.developpez.net/forums/d806632/environnements-developpement/eclipse/eclipse-platform/structuredtexteditor-indentation/#post4635094
Bonjour philagui,
> Tres bon article, qui m’a rendu d’enormes services ! Merci beaucoup !
Merci ca fait plaisir que ca t’ai servi.
Concernant l’indentation, je ne pourrais pas t’aider sur ce sujet, il va falloir fouiller dans l’API de DOM SSE.
Peut etre devrais tu poster ta question sur DVP. Si jamais tu le fais, serait-il possible de mettre le lien de ton post à la suite de mon message.
Merci et bon courage.
Angelo
Tres bon article, qui m’a rendu d’enormes services ! Merci beaucoup !
J’ai une petite question toutefois, que je n’arrive pas à résoudre: comment faire en sorte que la page source soit formatée (indentée) correctement ? Car lorsque j’ajoute un élément XML au DOM en passant par l’interface, l’élément est bien ajouté dans la source, mais pas indenté correctement (il faut que je passe par Source > Format pour indenter le document correctement)…
Si quelqu’un a une réponse la dessus, je suis preneur.
Merci beaucoup.