Oui, en fait, ma tactique repose sur une hypothèse : c'est que si tu appelles fireUndoableEditUpdate(new MonUndoableEvent()) juste après la coloration, il sera reçu par le UndoManager exactement après l'évènement de coloration.
Si ça ne marche pas, tu peux synchroniser les appels à fireUndoableEditEvent, mais c'est un peu barbare.
Mais concernant les séquences, je ne vois pas en quoi ça pose problème :
- tu crées une classe CustomUndoableEdit implémentant UndoableEdit et qui ne fait strictement rien (retourne null, etc)
- juste après la coloration d'un mot clé, tu appelles à partir de ton document :
fireUndoableEditEvent(new UndoableEditEvent(this, new CustomUndoableEdit()))
- tu utilises ton propre UndoManager qui fait :
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 30 31
| public class CustomUndoManager extends UndoManager {
@Override
public void undo() {
if(editToBeUndone() instanceof CustomUndoableEdit) {
super.undo(); // undo sur l'évènement maison, ne fait rien
super.undo(); // undo la coloration syntaxique
super.undo(); // undo la saisie de texte qui a provoqué la coloration
} else // évènement normal
super.undo();
}
@Override
public void redo() {
int redoIndex = edits.indexOf(editToBeRedone());
if(redoIndex + 2 < edits.size() && edits.get(redoIndex + 2) instanceof CustomUndoableEdit) {
super.redo(); // redo la saisie de texte
super.redo(); // redo la coloration
super.redo(); // redo le CUE, ne fait rien
} else // évènement normal
super.redo();
}
@Override
public void addEdit(UndoableEdit e) {
if(e instanceof CustomUndoableEdit)
setLimit(getLimit() + 1);
super.addEdit(e);
}
} |
Ton CustomUndoableEdit doit même pouvoir être un singleton, je crois.
Et comme d'hab, si je suis totalement à côté de la plaque, merci de m'en informer 
[EDIT] ajout des else dans undo() et redo().
Partager