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.