[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:
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:
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. :oops:
La vue
Code:
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:
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:
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:
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 :oops: Et encore moins dans un TreeViewer.
Le peu de documentation et mon faible niveau d'anglais ne m'aide pas à sortir du brouillard.:oops::?
D'avance, merci de vos éclaircissement et conseils.