Salut angelo,
Oui j'ai regardé le DataBinding mais avec des exemples simples. Text lié avec une variable d'un POJO.
Par contre il y a très peu de tuto sur le net
@+
Version imprimable
Salut angelo,
Oui j'ai regardé le DataBinding mais avec des exemples simples. Text lié avec une variable d'un POJO.
Par contre il y a très peu de tuto sur le net
@+
Il faut dire que tu as quand même une section du wiki d'Eclipse qui est plutôt complet à mon sens à ce sujet...
Je sais pas si tu es tombé dessus pendant tes recherches mais ça pourra t'aider :D
Salut Gueritarish,
Oui, j'ai lu et relu le wiki ;)
D'ailleurs, il n'y a pas beaucoup d'explication sur les Observables dont celui qui m'intéresse le plus: IObservableList.
J'ai vu aussi que MasterDetails peut être une bonne approche pour mon TreeViewer mais j'ai du mal à le mettre en oeuvre :oops:
Desole pingoui,
Je suis pris par un tas de truc la, ca va m'etre difficile de regarder ton problem.
Bon courage!
Angelo
Pas de soucis ;)
Merci de m'avoir orienté et conseillé.
Bon courage et pond nous de bon tutoriels :D
Bonjour,
Après acharnement, j'ai enfin réussi à faire quelque chose qui me semble propre. :mrgreen:
Mon treeViewer
Le ContentProviderCode:
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110 public class View extends ViewPart{ public static final String ID = "WorldDataBinding.view"; private TreeViewer treeViewer; private World world; public void createPartControl(Composite parent) { this.treeViewer = new TreeViewer(parent, SWT.FULL_SELECTION | SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); ObservableListTreeContentProvider contentProvider = new ViewContentProvider(); treeViewer.setContentProvider(contentProvider); treeViewer.setLabelProvider(new ViewLabelProvider(contentProvider .getKnownElements())); getSite().setSelectionProvider(treeViewer); bindData(); treeViewer.setInput(world); } public void setFocus() { treeViewer.getTree().setFocus(); } private void bindData(){ // Le monde world = World.getInstance(); //Les continents Continent europe = new Continent("Continent Européen"); Continent amerique = new Continent("Continent Américain"); Continent afrique = new Continent("Continent Africain"); europe.setWorldParent(world); amerique.setWorldParent(world); afrique.setWorldParent(world); List<Continent> continents = new ArrayList<Continent>(); continents.add(europe); continents.add(amerique); continents.add(afrique); world.setContinents(continents); //Les pays d'europe Country france = new Country("France"); Country allemagne = new Country("Allemagne"); Country italie = new Country("Italie"); france.setContinentParent(europe); allemagne.setContinentParent(europe); italie.setContinentParent(europe); List<Country> europeCountries = new ArrayList<Country>(); europeCountries.add(france); europeCountries.add(allemagne); europeCountries.add(italie); europe.setCountries(europeCountries); //Les pays d'amérique Country usa = new Country("USA"); Country canada = new Country("Canada"); Country mexique = new Country("Mexique"); usa.setContinentParent(amerique); canada.setContinentParent(amerique); mexique.setContinentParent(amerique); List<Country> ameriqueCountries = new ArrayList<Country>(); ameriqueCountries.add(usa); ameriqueCountries.add(canada); ameriqueCountries.add(mexique); amerique.setCountries(ameriqueCountries); //Les régions de france Area nordPasDeCalais = new Area("Nord Pas de Calais"); Area rhoneAlpe = new Area("Rhone Alpe"); Area idF = new Area("Ile de France"); nordPasDeCalais.setCountryParent(france); rhoneAlpe.setCountryParent(france); idF.setCountryParent(france); List<Area> franceAreas = new ArrayList<Area>(); franceAreas.add(nordPasDeCalais); franceAreas.add(rhoneAlpe); franceAreas.add(idF); france.setAreas(franceAreas); //Les villes du Nord Pas de Calais Town calais = new Town("Calais"); Town lille = new Town("Lille"); calais.setAreaParent(nordPasDeCalais); lille.setAreaParent(nordPasDeCalais); List<Town> nordPasDeCalaisTowns = new ArrayList<Town>(); nordPasDeCalaisTowns.add(calais); nordPasDeCalaisTowns.add(lille); nordPasDeCalais.setTowns(nordPasDeCalaisTowns); //Les villes du Rhone Alpes Town grenoble = new Town("Grenoble"); Town lyon = new Town("Lyon"); grenoble.setAreaParent(rhoneAlpe); lyon.setAreaParent(rhoneAlpe); List<Town> rhoneAlpeTowns = new ArrayList<Town>(); rhoneAlpeTowns.add(grenoble); rhoneAlpeTowns.add(lyon); rhoneAlpe.setTowns(rhoneAlpeTowns); world.setContinents(continents); } }
Le label ProviderCode:
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
56
57
58
59
60
61
62
63
64
65
66 public class ViewContentProvider extends ObservableListTreeContentProvider { public ViewContentProvider() { super(getObservableListFactory(), getTreeStructureAdvisor()); } private static IObservableFactory getObservableListFactory() { return new IObservableFactory() { @Override public IObservable createObservable(Object target) { if (target instanceof IObservableList) { return (IObservable)target; } if (target instanceof World) { return BeanProperties.list("continents").observe(target); } if (target instanceof Continent){ return BeanProperties.list("countries").observe(target); } if (target instanceof Country){ return BeanProperties.list("areas").observe(target); } if (target instanceof Area) { return BeanProperties.list("towns").observe(target); } return null; } }; } private static TreeStructureAdvisor getTreeStructureAdvisor() { return new TreeStructureAdvisor() { @Override public Object getParent(Object element) { if (element instanceof Country) { return ((Country)element).getContinentParent(); } else if(element instanceof Area){ return ((Area)element).getCountryParent(); } else if(element instanceof Town){ return ((Town)element).getAreaParent(); } else { return null; } } @Override public Boolean hasChildren(Object element) { if (element instanceof Continent && ((Continent)element).getCountries().isEmpty()){ return true; } else if(element instanceof Country && ((Country)element).getAreas().isEmpty()){ return true; } else if (element instanceof Area && ((Area)element).getTowns().isEmpty()){ return true; } else if (element instanceof Town){ return false; } return super.hasChildren(element); } }; } }
Commande d'ajout de noeudCode:
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 public class ViewLabelProvider extends ObservableMapLabelProvider{ public ViewLabelProvider(IObservableSet knownElements) { super(Properties.observeEach(knownElements, BeanProperties.values(new String[] { "continentName", "countryName", "areaName", "townName" }))); } @Override public Image getImage(Object element) { return PlatformUI.getWorkbench().getSharedImages().getImage( ISharedImages.IMG_OBJ_ELEMENT); } @Override public String getText(Object element) { if (element instanceof Continent) { return ((Continent) element).getContinentName(); } if (element instanceof Country) { return ((Country) element).getCountryName(); } if (element instanceof Area) { return ((Area) element).getAreaName(); } if (element instanceof Town) { return ((Town) element).getTownName(); } return null; } @Override public void dispose() { super.dispose(); } }
Ci-joint le code complet. Les commentaires sont les bienvenusCode:
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 public class AddCommand extends AbstractHandler{ private IStructuredSelection selection; @Override public Object execute(ExecutionEvent event) throws ExecutionException { selection = null; selection = getSelection(); Object item = selection.getFirstElement(); if (selection != null && !selection.isEmpty()) { if (item instanceof Continent) { Country country = new Country("new country"); ((Continent) item).addCountry(country); } else if (item instanceof Country) { Area area = new Area("new area"); ((Country) item).addArea(area); } else if (item instanceof Area) { Town town = new Town("new town"); ((Area) item).addTown(town); } } else { Continent continent = new Continent("new continent"); World.getInstance().addContinent(continent); } return null; } protected IStructuredSelection getSelection() { if (selection == null) { return evaluateCurrentSelection(); } return selection; } private IStructuredSelection evaluateCurrentSelection() { IWorkbenchWindow window = PlatformUI.getWorkbench() .getActiveWorkbenchWindow(); if (window != null) { ISelection selection = window.getSelectionService().getSelection(); if (selection instanceof IStructuredSelection) { return (IStructuredSelection) selection; } } return StructuredSelection.EMPTY; } }
Merci pour votre aide
Pingoui
Salut pingoui,
Je viens de regarder ton mini projet. Je n'ai qu'une seule chose a dire : Merci!!!!!!!!! Ca marche nickel et tout explication est tres clair. Tu as du galerer mais je pense que tu as du beaucoup apprendre. Ca m'eriterait que tu fasses un blog sur JFace Databinding:)
Comme tu as pu voir il faut :
- que tes POJO heritent de AbstractModelObject
- coder tes firePropertyChange a la main.
Pojo- Bindable t'evite tout ca et te donne aussi la possibilite de gerer le declenchement firePropertyChange via des annotations (c'est util quand tu as une propriete1 qui depend d'une propriete2 et que tu changes la propriete2, ca doit aussi declencher firePropertyChange pour propriete1).
Si jamais tu te lances dans cette affaire, je veux bien avoir un retour d'experience.
Merci et bon courage.
Angelo
Effectivement, j'ai beaucoup appris.... Et il y vraiment peu de doc sur le net.
De la à faire, un blog.... je n'ai ni les compétence ni le recul pour le faire....
je veux bien en faire un par rapport à mon métier (Electrotechnique).... mais pas pour le moment dans le développement.(Passion)
Pas de soucis. Pour le moment, le dataBinding fonctionne dans un contexte Osgi avec Spring DM et JPA/EclipseLink. ( tu vois de quel tutoriel je me suis inspiré ;) )
A+ et bon courage pour les prochains billets