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 :

[Débutant] TreeViewer & JFace DataBinding


Sujet :

Eclipse Platform

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de pingoui
    Homme Profil pro
    Activité professionnelle sans liens avec le developpement
    Inscrit en
    Juillet 2004
    Messages
    584
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Activité professionnelle sans liens avec le developpement
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 584
    Par défaut [Débutant] TreeViewer & JFace DataBinding
    Bonjour,

    J'essaie d'utiliser le pattern MVC pour mon appli mais je commence sérieusement à me perdre.

    Mon appli RCP est composée d'une View avec un TreeViewer.
    Mon treeViewer est composé de plusieurs noeuds.

    Continent
    ------------> Pays
    -------------------> Région
    ----------------------------->Ville

    Mes objets du domain, sont des POJO

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    package org.pegase.domain;
     
    /**
     * La zone continent contenant les différents pays
     */
     
    @Entity
    @Table(name = "T_CONTINENT")
    public class Continent implements Serializable {
     
        private static final long serialVersionUID = 1L;
     
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name = "continent_id")
        private long zoneId;// Identifiant du continent
     
        @Version
        private int version;
     
        @Column(name = "continent_name")
        private String continentName;// Nom du continent
     
        @OneToMany(mappedBy = "zone", cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH  })
        private Set<Pays> countries = new HashSet<Pays>();
     
        public Continent() {
        }
     
        public Continent(String continentName) {
            super();
            this.continentName = continentName;
        }
     
    /***************** GETTER ET SETTER***************/
     
     
        public void addPays(Pays pays) {
            // le pays est ajouté dans la collection des pays du continent
            countries.add(pays);
            // le poste change de continent
            countries.setContinent(this);
        }
     
        public void deletePays(Pays pays) {
            // le pays est supprimé dans la collection des pays du continent
            countries.remove(pays);
        }
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    package org.pegase.domain;
     
    /**
     * Le pays contenant les différente régions
     */
    @Entity
    @Table(name = "T_PAYS")
    public class Pays implements Serializable{
        private static final long serialVersionUID = 1L;
     
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name = "pays_id")
        private long paysId;// Identifiant du pays
     
        @Version
        private int version;
     
        @Column(name = "pays_name")
        private String paysName;// Nom du pays
     
        @ManyToOne(fetch=FetchType.LAZY)
        @JoinColumn(name = "continent_id", nullable = false)
        private Continent continent;//le continent parent du pays
     
     
        @OneToMany(mappedBy = "pays", cascade = {  CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH })
        private Set<Region> regions = new HashSet<Region>();//La collection de région
     
     
        public Pays() {
        }
     
        public Pays(String paysName) {
            super();
            this.paysName = paysName;
        }
     
     
         */
        public void addRegion(Region region) {
            // la région est ajoutée dans la collection des régions du pays
            regions.add(region);
            // la région change de pays
            region.setPays(this);
        }
     
        public void deleteRegion(Region region) {
            // la région est supprimée dans la collection des régions du pays
            regions.remove(région);
        }           
    }
    J'utilise des bundles OSGI et Spring DM pour séparer mes différentes couches (ui,service,domain,dao).
    J'utilise JPA et EclipseLink pour la persistance et je fais aussi du lazy loadindg avec springweawer.

    Avec tout ça, je ne sais comment faire pour que mon treeViewer écoute mes objets du domain.

    La vue
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    package org.pegase.ui.views;
     
    /**
     * Vue contenant l'explorateur des continents
     */
    public class ContinentExplorerTreeView extends ViewPart {
     
        private UIController uiController;
        private TreeViewer treeViewer;
     
        @Override
        public void createPartControl(Composite parent) {
            //Enregistrement de la vue dans le controlleur
            uiController.getUi().setContinentExplorerTreeView(this);
            //création de l'arbre
            this.treeViewer = new TreeViewer(parent, SWT.FULL_SELECTION | SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
            this.treeViewer.setContentProvider(new ContinentExplorerTreeContentProvider());
            //Application du rendu
            this.treeViewer.setLabelProvider(new ZoneExplorerTreeLabelProvider());
            //Application du provider de selection
            getSite().setSelectionProvider(treeViewer);
            //Insertion des données dans le TreeViewer
            try {
                treeViewer.setInput(uiController.getServices().getContienentService().findAllContinent());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
     
        @Override
        public void setFocus() {
            treeViewer.getControl().setFocus();// Passage du focus à l'arbre
        }
     
     
        public UIController getUiController() {
            return uiController;
        }
     
        public void setUiController(UIController uiController) {
            this.uiController = uiController;
        }
     
        public TreeViewer getViewer() {
            return this.treeViewer;
        }
    }
    Le Provider
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    public class ZoneExplorerTreeContentProvider implements ITreeContentProvider, PropertyChangeListener {
     
        @Override
        public Object[] getChildren(Object parentElement) {
            // si le parent est un continent, l'enfant est un pays
            if (parentElement instanceof Continent) {
                return ((Continent)parentElement).getPays().toArray();
            // si le parent est un pays, l'enfant est une région
            } else if (parentElement instanceof Pays) {
                return ((Pays)parentElement).getRegions().toArray();
            } else if (parentElement instanceof Region) {
                return ((Region)parentElement).getVilles().toArray();
            } else {
                return null;
            }
        }
     
        @Override
        public Object getParent(Object element) {
            // si l'enfant est un pays, le parent est le continent
            if (element instanceof Pays) {
                return ((Pays)element).getContinent();
            // si l'enfant est une Region, le parent est un pays
            } else if(element instanceof Region){
                return ((Region)element).getPays();
            // si l'enfant est une ville, le parent est une région
            } else if(element instanceof Ville){
                return ((Ville)element).getRegion();
            } else{
                return null;
            }
        }
     
        @Override
        public boolean hasChildren(Object element) {
            return !(element instanceof Ville);
        }
     
        @Override
        @SuppressWarnings("unchecked")
        public Object[] getElements(Object inputElement) {
            return (( List<Continent>)inputElement ).toArray();
        }
     
        @Override
        public void dispose() {        
        }
     
        @Override
        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {    
        }
        @Override
        public void propertyChange(PropertyChangeEvent evt) {        
        }
    Service pour les continents et les pays
    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
     
    package org.pegase.services.impl;
     
    @Transactional(readOnly=true)
    public class ContinentServiceImpl implements IContinentService {
     
        private IContinentDao continentDao;
     
        @Transactional(readOnly=false)
        public void addContinent(Continent continent) {
            continentDao.addZone(zone);
        }
     
        public List<Contienent> findAllContinent() {
            return continentDao.findAllContinent();
        }
     
    /*****/
     
    }
    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
    24
    25
     
    package org.pegase.services.impl;
     
    @Transactional(readOnly=true)
    public class PaysServiceImpl implements IPaysService {
     
        private IPaysDao paysDao;
     
        @Transactional(readOnly=false)
        public void addPays(Pays pays) {
                    // on enregistre le pays
            paysDao.addStation(pays);
                    //Ajout du pays au continent
                    Continent conti = pays.getContinent();
                    conti.addPays(pays);
        }
     
        public List<Pays> findAllPays() {
            return paysDao.findAllPays();
        }
     
     
    /*****Autres méthodes******/
     
    }
    Je souhaites écouter les changements sur un objet du domain pour que la vue se rafraichisse.

    1) Comment ajouter les listeners aux objets ? Dans le Content Provider ?
    2) N'est t'il pas plus propre d'utiliser le DataBinding de JFace que des listeners ?
    3)Si oui, je suis un peu perdu sur son fonctionnement. Je ne sais comment l'utiliser Et encore moins dans un TreeViewer.

    Le peu de documentation et mon faible niveau d'anglais ne m'aide pas à sortir du brouillard.

    D'avance, merci de vos éclaircissement et conseils.

  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 : 41
    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
    Par défaut
    Salut,

    Alors, tu peux jeter un oeil sur le billet sur les bindings implémenté par Azerr sur son blog.
    Sinon, une idée intéressante est l'implémentation du design pattern Observable/Observer (c'est l'idée derrière le data bindings de JFace).
    Tu as un classe Observable et des Observers qui vont être informé des changements que la classe Observable va subir.

    Voilà pour les idées à+
    Gueritarish

  3. #3
    Membre éclairé Avatar de pingoui
    Homme Profil pro
    Activité professionnelle sans liens avec le developpement
    Inscrit en
    Juillet 2004
    Messages
    584
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Activité professionnelle sans liens avec le developpement
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 584
    Par défaut
    Salut Gueritarish,

    Oui j'ai regardé le blog d'Azerr mais je ne sais comment l'utiliser dans mon treeViewer

    Pour écouter mes changements de mes POJO, je voulais utiliser PropertyChangeListener.

    Vaut'il mieux utiliser Observer/Observable que PropertyChangeListener ?

    Par contre, je ne sais comment ma vue s'enregistre auprès des mes objets en tant que listener. Sachant que les données affichés dans mon arbre proviennent d'une BdD.

    Vu que j'ai beaucoup de données dans la base le DataBinding n'est pas plus approprié ?

    Merci beaucoup

  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 : 41
    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
    Par défaut
    Salut,

    Alors quand tu parles de PropertyChangeListener, j'imagine que tu parles de la classe du package java.beans. Et que tu fais surement référence à cet article sur PojoBindable.
    Je dois avouer que je n'ai jamais testé.
    Sinon, pour ce qui est du pattern Observable/Observers, comme implémentation, j'aurais plus vu:
    -> ton Controller hérite de Observable, comme ça à chaque demande de changement de modèle, si elle s'est bien terminée, tu notifies les Observers.
    -> ta vue implémente Observer, comme ça à chaque fois qu'elle reçoit une notification de l'Observable, elle se met à jour.

    Pour ce qui est du retour d'expérience sur DataBinding et PropertyChangeListener, t'es plutôt mal tombé avec moi

    Voilà, à+
    Gueritarish

  5. #5
    Membre éclairé Avatar de pingoui
    Homme Profil pro
    Activité professionnelle sans liens avec le developpement
    Inscrit en
    Juillet 2004
    Messages
    584
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Activité professionnelle sans liens avec le developpement
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 584
    Par défaut
    Oui je parle bien de la classe java.beans.PropertyChangeListener

    Je n'avais pas envisagé de mettre un listener sur un controller et je n'avais pas encore vue ce type de conception mais je trouve ce concept intéressant....

    Pour ce qui est du retour d'expérience sur DataBinding et PropertyChangeListener, t'es plutôt mal tombé avec moi
    Pas de soucis.... j'aurai peu être la chance d'avoir des éclaircissements par d'autres membres.

    Merci pour ton aide
    Pingoui

  6. #6
    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 : 41
    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
    Par défaut
    Hum... après, c'est un avis personnel
    Si ça trouve tout le monde me jetterait des pierres et me traiterait d'hérétique pour oser faire ça

    Mais bon, si on devait toujours suivre ce que fait tout le monde... Y aurait jamais d'innovation
    Attention, je dis pas que ma façon de faire est une innovation

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Article] JFace Databinding sous Eclipse avec SWT
    Par alain.bernard dans le forum Eclipse Platform
    Réponses: 3
    Dernier message: 25/01/2014, 15h18
  2. JFace DataBinding & référence à un bean
    Par pingoui dans le forum SWT/JFace
    Réponses: 11
    Dernier message: 07/12/2010, 10h06

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