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); }J'utilise des bundles OSGI et Spring DM pour séparer mes différentes couches (ui,service,domain,dao).
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 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
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 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; } }
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
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) { }
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(); } /*****/ }Je souhaites écouter les changements sur un objet du domain pour que la vue se rafraichisse.
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******/ }
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.
Partager