Bonjour!
Je développe une application RCP, possédant déjà un certain nombre de fonctionnalité notamment le système d'undo/redo, accessible sur une tool bar.
Ce système est fonctionnel. Mon problème est que je souhaite mettre en place le renommage d'un fichier accessible dans le navigator.
J'ai donc mis une entrée contextuelle, lié a un handler qui après une fenêtre de saisie effectue le renommage du fichier. Si j'arrive bien a renommer, en revanche impossible d'avoir un undo disponible après. C'est a dire que l'action undo n'est pas disponible et reste grisé.
Voici un bout du code du handler, la partie ou j'effectue le renommage.
iFile est la sélection courante (org.eclipse.core.resources.IFile), AbstractCommonTransactionalCommmand est une classe perso étendant AbstractTransactionalCommand qui étend elle-même IUndoableOperation. Le but est d'englober le renommage dans une commande afin de pouvoir spécifier le redo et le undo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| IEditorPart diagramEditor = HandlerUtil.getActiveEditorChecked(executionEvent);
TransactionalEditingDomain editingDomain = ((DiagramEditor) diagramEditor).getEditingDomain();
DocumentProvider documentProvider = DiagramEditorPlugin.getInstance().getDocumentProvider();
Diagram diagram = DiagramUtils.getDiagramFromFile(iFile, documentProvider);
final Diagram diagram = (Diagram) diagram.getElement();
AbstractCommonTransactionalCommmand command = new AbstractCommonTransactionalCommmand(editingDomain, "Rename", null) {
protected CommandResult doExecuteWithResult(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
iFile.move(new Path(pathDest), IFile.FORCE, new NullProgressMonitor());
return CommandResult.newOKCommandResult();
}
@Override
public boolean canUndo() {
return true;
}
};
editingDomain.getCommandStack().execute(command.toEMFCommand()); |
Deux choses à dire du code: il fonctionne, mon fichier est bien renommé.
Cependant, si je clique sur le diagramme correspondant au fichier dans l'éditeur, cela me génère une exception (ne provoquant visuellement aucun effet de bord):
1 2 3 4 5 6
| java.lang.NullPointerException
at org.eclipse.emf.transaction.impl.TransactionImpl.start(TransactionImpl.java:257)
at org.eclipse.emf.transaction.impl.TransactionalEditingDomainImpl.startTransaction(TransactionalEditingDomainImpl.java:424)
at org.eclipse.emf.transaction.impl.TransactionalEditingDomainImpl.runExclusive(TransactionalEditingDomainImpl.java:321)
at org.eclipse.gmf.runtime.diagram.ui.properties.sections.AbstractModelerPropertySection.executeAsReadAction(AbstractModelerPropertySection.java:283)
at fr.properties.PersoAbstractNotationPropertiesSection.refresh(PersoAbstractNotationPropertiesSection.java:112) |
Le NullPointerException vient de getChangeRecorder() dans le code:
getInternalDomain().getChangeRecorder().setValidateEditSupport((ValidateEditSupport) validateEdit);
D'après ce que j'en comprends le recorder du TransactionalEditingDomain est null, d’où probablement l'absence du undo.
Seulement je ne comprends pas pourquoi ce recorder est null...
Si dans mon code du handler je change
iFile.move(new Path(pathDest), IFile.FORCE, new NullProgressMonitor());
par
editingDomain.getCommandStack().execute(SetCommand.create(editingDomain, diagram, Package.eINSTANCE.getDiagramElement_Name(), newName));
cela marche parfaitement (un simple changement de valeur d'une variable dans mon diagramme) et le undo est disponible derrière.
Quelqu'un aurait donc une solution pour avoir une commande correcte pour renommer ?
Ou alors m'expliquer en quoi je me plante lourdement dans ma manipulation ?
Merci d'avance pour votre aide.
Partager