Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 7 sur 7
  1. #1
    Invité de passage
    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 : 2
    Points
    2

    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
    Modérateur
    Avatar de Gueritarish
    Homme Profil pro Marc
    Développeur Java
    Inscrit en
    mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Nom : Homme Marc
    Âge : 30
    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 514
    Points
    3 514

    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
    Invité de passage
    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 : 2
    Points
    2

    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
    Modérateur
    Avatar de Gueritarish
    Homme Profil pro Marc
    Développeur Java
    Inscrit en
    mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Nom : Homme Marc
    Âge : 30
    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 514
    Points
    3 514

    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 :
    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
    Invité de passage
    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 : 2
    Points
    2

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

    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 :
    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 :
    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 :
    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
    Invité de passage
    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 : 2
    Points
    2

    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 !

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •