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 :
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 :

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....
La classe ShapesEditor doit être modifiée pour gérer les 2 pages Source et Overview.
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 :
protected void createPages() {
createPage0();
createPage1(getContainer());
}
La méthode createPage0 permet de créer la page Source en instançiant StructuredTextEditor comme suit :
void createPage0() {
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;
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 :
private IDOMModel getDOMModel() {
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 :
private IModelStateListener listener = new IModelStateListener() {
...
public void modelChanged(IStructuredModel model) {
// Update UI From DOM Model which have changed
updateUIFromDOMModel();
}
...}
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 :
public void 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) .
Le code doSave et doSaveAs est délégué à l'instance sourcePage (StructuredTextEditor) comme suit :
public void doSave(IProgressMonitor monitor) {
sourcePage.doSave(monitor);
}
public void doSaveAs(doSaveAs) {
sourcePage.doSaveAs();
}
public boolean isSaveAsAllowed() {
return sourcePage.isSaveAsAllowed();
}
Vous devez être identifié pour poster un commentaire.
| Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | ||
| 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 13 | 14 | 15 | 16 | 17 | 18 | 19 |
| 20 | 21 | 22 | 23 | 24 | 25 | 26 |
| 27 | 28 | 29 |
Copyright © 2000-2012 - www.developpez.com