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 :

Editor et gestion du isDirty


Sujet :

Eclipse Platform

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2012
    Messages
    10
    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 : Août 2012
    Messages : 10
    Points : 7
    Points
    7
    Par défaut Editor et gestion du isDirty
    Bonjour à tous,

    Je dispose d'un POJO que je voudrais pouvoir exploiter avec un Editor.
    Un binding est effectué entre tous les champs affichés à l'écran et les attributs de mon POJO.

    Je cherche à afficher la petite étoile qui permet de voir que mon POJO a été modifié.
    J'ai donc défini la méthode isDirty() sur mon EditorPart qui compare le hashCode du POJO et le hashCode référence du POJO récupéré dans l'init de l'EditorPart.

    Mon problème se situe là :
    - isDirty() est bien appelé quand je veux fermer l'Editor, me permettant d'enregistrer le POJO
    - mais je souhaiterais qu'il soit appelé automatiquement dès que l'on modifie un champ (un attribut de mon POJO), pour afficher la petite étoile qui va bien

    Du coup je pense que je n'ai pas saisi correctement le fonctionnement du isDirty()...
    Si vous avez une idée, merci d'avance pour votre aide.

  2. #2
    Membre expert
    Avatar de Gueritarish
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 800
    Points : 3 919
    Points
    3 919
    Par défaut
    Salut,

    Pour que la plateforme soit informé qu'il y a eu un changement au niveau de l'état de ton éditeur, il faut que tu la tiennes au courant. Pour cela, il te suffit d'appeler la méthode firePropertyChange(PROP_DIRTY); lorsqu'une modification intervient dans ton éditeur. Et le tour est joué. Si tu implémentes un mécanisme d'undo/redo, pense à mettre à jour cet état (quand toutes les modifications ont été défaites par exemple).

    Voilà, à+
    Gueritarish
    Pas de questions technique par MP, les forums sont là pour ça.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2012
    Messages
    10
    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 : Août 2012
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Merci pour ta réponse Gueritarish !

    J'ai mis en place ce que tu proposes et ça marche parfaitement .
    Le seul hic c'est que je ne vois pas comment faire dans le cas de données bindées (via le DataBindingContext). Faut-il que ce soient les POJOs qui tiennent au courant la plateforme de leur changement, ou bien y a t-il moyen de passer par le dataBindingContext ?

    J'ai lu une discussion autour de ce point ici même, mais la mise en place des solutions proposées me paraissent un peu lourdes... mais en même temps le undo/redo semble être aussi pris en charge automatiquement.

    Si tu as (ou d'autres personnes) déjà réalisé ce genre de chose ou si tu as un peu d'aide à m'apporter, merci !

  4. #4
    Membre expert
    Avatar de Gueritarish
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 800
    Points : 3 919
    Points
    3 919
    Par défaut
    Un article de Lars Vogel t'indique la façon de faire. Il te suffit d'ajouter un listener au bindings de ton contexte:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    IChangeListener listener = new IChangeListener() {
      @Override
      public void handleChange(ChangeEvent event) {
          // Les changements seront indiqués ici.
        }
    };
    IObservableList bindings = context.getValidationStatusProviders();
    for (Object o : bindings) {
      Binding b = (Binding) o;
      b.getTarget().addChangeListener(listener);
    }
    Voilà, à+
    Gueritarish
    Pas de questions technique par MP, les forums sont là pour ça.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2012
    Messages
    10
    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 : Août 2012
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Merci, j'ai mis en place cette mécanique et ça fonctionne parfaitement, même le undo (limité à une action mais ça me suffit).

    Mais j'ai encore une question :
    Mon éditeur possède un bouton qui entraine une modification de mon modèle.
    J'aimerais du coup que suite au clic sur le bouton les informations affichées à l'écran reflètent les nouvelles données du modèle.
    Je pensais que le fait de mettre en place le binding et le listener global sur tous les bindings devait suffire... mais à priori non.

    Faut-il que ce soit mon bouton qui déclenche un rafraichissement?
    J'ai essayé via le firePropertyChange(PROP_INPUT), mais sans succès.

    Je pense que mon problème vient des UpdateValueStrategy mises en place sur mes binding. J'ai généré le binding à partir de l'onglet bindings du WindowBuilder, et toutes mes UpdateValueStrategy sont à null.

    Si quelqu'un peut me confirmer que ça vient de là ou bien que je me trompe complètement ?

    Merci d'avance.

  6. #6
    Membre du Club
    Inscrit en
    Juillet 2012
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Juillet 2012
    Messages : 32
    Points : 58
    Points
    58
    Par défaut
    J'ai géré ça de cette façon :

    dans l'init de ton editeur tu ajoutes un listener sur les opérations qui va déclencher le rafraichissement de ton éditeur et positionner la valeur de dirty :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    final IUndoContext undoContext = (IUndoContext) getAdapter(IUndoContext.class);
    IOperationHistoryListener operationListener = new IOperationHistoryListener() {
    	@Override
    	public void historyNotification(OperationHistoryEvent event) {
    		if (OperationHelper.isPostEvent(event) && event.getOperation().hasContext(undoContext)) {
    			updateEditor();
    			setDirty(true);
    		}
    	}
    };
    OperationHistoryFactory.getOperationHistory().addOperationHistoryListener(operationListener );
    On déclenche les listeners sur le dirty :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    protected void setDirty(boolean value) {
    	mDirty = value;
    	firePropertyChange(PROP_DIRTY);
    }
    Toute modification à ton modèle doit passer par des IUndoableOperation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    IUndoableOperation editOperation = new AbstractOperation(/* faire les modifications au modèle ici*/);
    editOperation.addContext(undoContext);
    OperationHistoryFactory.getOperationHistory().execute(editOperation, monitor, info);

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2012
    Messages
    10
    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 : Août 2012
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    En fait c'est bon j'ai trouvé comment actualiser mes champs suite au clic : je fais appel à la méthode updateTargets() sur mon contexte de binding dans le selectionListener de mon bouton.

    Mais il me reste quand même un problème :
    cette mécanique n'a pas l'air de fonctionner sur les labels...

    J'ai fait un binding entre un attribut de mon modèle et un label, mais lors de l'updateTarget ce dernier n'est pas pris en compte.

    Une solution consisterait à faire des champs inaccessibles avec une cosmétique comme un label, mais je ne sais pas si c'est une bonne idée, il y a sûrement un autre moyen de faire !

    Merci d'avance pour vos idées et conseils !

Discussions similaires

  1. Réponses: 3
    Dernier message: 09/07/2009, 09h30
  2. Réponses: 2
    Dernier message: 31/08/2002, 21h37
  3. Réponses: 4
    Dernier message: 04/07/2002, 12h31
  4. c: gestion des exceptions
    Par vince_lille dans le forum C
    Réponses: 7
    Dernier message: 05/06/2002, 14h11
  5. gestion d'un joystick ...
    Par Anonymous dans le forum DirectX
    Réponses: 1
    Dernier message: 23/05/2002, 12h53

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