IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Eclipse Platform Discussion :

Mettre un renommage de fichier en tant que IUndoableOperation


Sujet :

Eclipse Platform

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2008
    Messages
    1 190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 190
    Par défaut Mettre un renommage de fichier en tant que IUndoableOperation
    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.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    iFile.move(new Path(pathDest), IFile.FORCE, new  NullProgressMonitor());
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2008
    Messages
    1 190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 190
    Par défaut
    En regardant dans le code source pour trouver comment étaient exécuté certaines commandes, j'ai vu une manière de lancer l'exécution de celles-ci.

    J'ai donc remplacé dans mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    editingDomain.getCommandStack().execute(command.toEMFCommand());
     
    par 
     
    IUndoableOperation operation = command.reduce();
     
    try {
          IStatus status =  getActionManager().getOperationHistory()
                  .execute(operation, new NullProgressMonitor(), null);
     
          if (!status.isOK()) {
            /* log status error */
          }
          } catch (ExecutionException e) {
    }
    Mais sans succès... Je ne sais vraiment plus comment arriver à faire ce rename de fichier en tant que 'IUndoableOperation'!

Discussions similaires

  1. Définir le contenu d'un fichier en tant que variable
    Par yoyo-tns dans le forum Shell et commandes GNU
    Réponses: 9
    Dernier message: 04/12/2012, 09h34
  2. ouvrir à un fichier en tant que flux
    Par sluke dans le forum Général Python
    Réponses: 5
    Dernier message: 07/11/2011, 21h48
  3. [Batch] Robocopy mettre un fichier en tant que source
    Par jepasderemy dans le forum Scripts/Batch
    Réponses: 0
    Dernier message: 02/11/2009, 15h24
  4. Charger un fichier en tant que ressource
    Par delph1983 dans le forum Entrée/Sortie
    Réponses: 20
    Dernier message: 05/05/2006, 15h39
  5. sauvegarde de fichiers en tant que blob
    Par ha_mido dans le forum Administration
    Réponses: 3
    Dernier message: 21/11/2005, 17h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo