Précédent   Forum du club des développeurs et IT Pro > Environnements de développement > Eclipse > Eclipse Platform
Eclipse Platform Développement de plugins Eclipse et d'applications Eclipse RCP (Rich Client Platform). Avant de poster -> Tutoriels sur le développement de plugins Eclipse
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 21/08/2012, 11h14   #1
niikkko
Invité de passage
 
Inscription : août 2012
Messages : 10
Détails du profil
Informations forums :
Inscription : août 2012
Messages : 10
Points : 2
Points : 2
Par défaut Ajout d'un deuxième adapter à une AdapterFactory

Bonjour

Je suis (toujours) novice sur Eclipse (Indigo).
Je viens de découvrir AdapterFactory.
J'ai utilisé ce dernier pour alimenter la PropertyPage de ma Perspective.
Maintenant, je souhaiterias ajouter un 2eme "écouteur" (ie un 2eme adapter) pour alimenter une autre vue contenant un treeviewer.
Pour cela, j'ai déclarativement rajouter un adapter dans ma AdapterFactory.
Mais la classe passée à getAdapter de ma Factory est toujours IPropertySource. Je ne vois jamais la classe de mon second adapter.

J'ai surement loupé quelque chose, mais quoi ?

Avez-vous une idée ?

Merci d'avance
niikkko est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/08/2012, 11h45   #2
Gueritarish
Modérateur
 
Avatar de Gueritarish
 
Homme Marc
Développeur Java
Inscription : mai 2007
Messages : 1 564
Détails du profil
Informations personnelles :
Nom : Homme Marc
Âge : 28
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 564
Points : 3 574
Points : 3 574
Salut,

J'ai pas vraiment tout compris à ton histoire
Je ne sais pas si tu l'as déjà fait, mais je te conseille la lecture de cet article sur les adapters.
De ce que j'ai compris, tu souhaites avoir une factory qui te permet d'adapter 2 types de classes. Pour moi, il te faut créer une extension org.eclipse.runtime.adapters avec 2 extensions factory:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<extension
         point="org.eclipse.core.runtime.adapters">
      <factory
            adaptableType="my.test.class.Type1"
            class="my.test.class.AdapterFactory">
         <adapter
               type="my.test.class.AdapterType1">
         </adapter>
      </factory>
      <factory
            adaptableType="my.test.class.Type2"
            class="my.test.class.AdapterFactory">
         <adapter
               type="my.test.class.AdapterType2">
         </adapter>
      </factory>
   </extension>
Après, tu peux modifier ta factory pour qu'elle puisse gérer les 2 types d'objet adaptables.

Voilà, à+
Gueritarish
__________________
Pas de questions technique par MP, les forums sont là pour ça.

Le 5 et 6 juin à Toulouse, la première EclipseCon France !
Gueritarish est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/08/2012, 11h54   #3
sam9722
Membre du Club
 
Inscription : juillet 2012
Messages : 32
Détails du profil
Informations forums :
Inscription : juillet 2012
Messages : 32
Points : 52
Points : 52
Bonjour,

A ce que j'ai compris tu as un seul objet métier et tu veux qu'il s'affiche dans deux vues différentes :
- La vue propriétés
- Ta nouvelle vue

Pour faire ça tu utilises un AdapaterFactory qui répond à deux classes :
- IPropertySource.class pour les propriétés
- TaClasse.class pour ta nouvelle vue


Si c'est bien ce que tu veux faire, as tu bien retourné dans ton AdapterFactory dans la méthode getAdapterList :
Code :
return new Class[] {IPropertySource.class, TaClasse.class};

après c'est à ta nouvelle vue d'appeler tonObjetMetier.getAdapter(TaClasse.class) afin de se remplir.
sam9722 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 21/08/2012, 14h05   #4
niikkko
Invité de passage
 
Inscription : août 2012
Messages : 10
Détails du profil
Informations forums :
Inscription : août 2012
Messages : 10
Points : 2
Points : 2
Citation:
Envoyé par sam9722 Voir le message
Bonjour,

A ce que j'ai compris tu as un seul objet métier et tu veux qu'il s'affiche dans deux vues différentes :
- La vue propriétés
- Ta nouvelle vue

Pour faire ça tu utilises un AdapaterFactory qui répond à deux classes :
- IPropertySource.class pour les propriétés
- TaClasse.class pour ta nouvelle vue


Si c'est bien ce que tu veux faire, as tu bien retourné dans ton AdapterFactory dans la méthode getAdapterList :
Code :
return new Class[] {IPropertySource.class, TaClasse.class};

après c'est à ta nouvelle vue d'appeler tonObjetMetier.getAdapter(TaClasse.class) afin de se remplir.
Merci à vous deux pour vos réponses.

sam9722, tu as bien compris mon besoin.

Cela étant dit, mon AdapterFactory renvoie bien les 2 classes:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
public class SqlTreeItemPlanAdapterFactory implements IAdapterFactory {
	private static final Class[] TYPES = { Adapter3.class,  IPropertySource.class };
 
	public Object getAdapter(Object adaptableObject,  Class adapterType) {
		if (adapterType == IPropertySource.class) {
			if (adaptableObject instanceof SqlTreeItemPlan) {
				return new SqlTreeItemPlanPropertySourceAdapter((SqlTreeItemPlan) adaptableObject ) ;
			}
		}
		if (adapterType == Adapter3.class ) {
			if (adaptableObject instanceof SqlTreeItemPlan) {
				return new SqlTreeItemPlanAdapter3Adapter((SqlTreeItemPlan) adaptableObject ) ;
			}
		}
		return null;
	}
 
	@Override
	public Class[] getAdapterList() {
		return TYPES;
	}
Par contre, je ne cerne pas très bien ta remarque sur l'appel de tonObjetMetier.getAdapter(TaClasse.class) dans ma nouvelle vue.
Pourrais-tu détailler s'il te plait?

Les exemples avec IPropertySource sont légions sur le web. Ceux avec des adapters "custom" beaucoup moins

Merci d'avance.
niikkko est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/08/2012, 14h27   #5
sam9722
Membre du Club
 
Inscription : juillet 2012
Messages : 32
Détails du profil
Informations forums :
Inscription : juillet 2012
Messages : 32
Points : 52
Points : 52
sqlTreeItemPlan est ton objet métier à adapter, il doit implémenter l'interface IAdaptable avec quelque chose de cette forme :
Code :
1
2
3
4
@Override
public Object getAdapter(Class adapter) {
	return Platform.getAdapterManager().getAdapter(this, adapter);
}
Ta vue se construit à partir de l'objet sqlTreeItemPlanAdapter3Adapter afin d'afficher son contenu.
Pour obtenir cet objet dans ta vue tu appeles la méthode :
Code :
SqlTreeItemPlanAdapter3Adapter o = (SqlTreeItemPlanAdapter3Adapter) sqlTreeItemPlan.getAdapter(Adapter3.class);
ou alors (si SqlTreeItemPlan n'implémente pas IAdaptable) :
Code :
SqlTreeItemPlanAdapter3Adapter  o = (SqlTreeItemPlanAdapter3Adapter)Platform.getAdapterManager().getAdapter(sqlTreeItemPlan, Adapter3.class);

Si ce n'est pas ce que tu fais peux tu expliquer comment fonctionne ta vue?
sam9722 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 21/08/2012, 14h38   #6
Gueritarish
Modérateur
 
Avatar de Gueritarish
 
Homme Marc
Développeur Java
Inscription : mai 2007
Messages : 1 564
Détails du profil
Informations personnelles :
Nom : Homme Marc
Âge : 28
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 564
Points : 3 574
Points : 3 574
Effectivement, ta factory doit ressembler à ça.
Après, dans ta classe adaptable, ta méthode getAdapter(Class adapter) doit être:
Code :
1
2
3
public Object getAdapter(Class adapter) {
	return Platform.getAdapterManager().getAdapter(this, adapter);
}
C'est pourquoi il te faut bien enregistrer ta factory dans ton plugin.xml pour chaque type adaptable.

Voilà, à+
Gueritarish
__________________
Pas de questions technique par MP, les forums sont là pour ça.

Le 5 et 6 juin à Toulouse, la première EclipseCon France !
Gueritarish est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/08/2012, 14h53   #7
sam9722
Membre du Club
 
Inscription : juillet 2012
Messages : 32
Détails du profil
Informations forums :
Inscription : juillet 2012
Messages : 32
Points : 52
Points : 52
Citation:
Envoyé par Gueritarish Voir le message
Salut,
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<extension
         point="org.eclipse.core.runtime.adapters">
      <factory
            adaptableType="my.test.class.Type1"
            class="my.test.class.AdapterFactory">
         <adapter
               type="my.test.class.AdapterType1">
         </adapter>
      </factory>
      <factory
            adaptableType="my.test.class.Type2"
            class="my.test.class.AdapterFactory">
         <adapter
               type="my.test.class.AdapterType2">
         </adapter>
      </factory>
   </extension>
Ah oui il faut bien sur le déclarer, mais d'après la structure je dirais plutôt que le xml devrait ressembler à ça :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
   <extension
         point="org.eclipse.core.runtime.adapters">
      <factory
            adaptableType="my.test.class.SqlTreeItemPlan"
            class="my.test.class.SqlTreeItemPlanAdapterFactory ">
         <adapter
               type="org.eclipse.ui.views.properties.IPropertySource">
         </adapter>
         <adapter
               type="my.test.class.Adapter3">
         </adapter>
      </factory>
   </extension>
sam9722 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/08/2012, 15h39   #8
niikkko
Invité de passage
 
Inscription : août 2012
Messages : 10
Détails du profil
Informations forums :
Inscription : août 2012
Messages : 10
Points : 2
Points : 2
oui mon plugin.xml ressemble à cela :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
<extension
      point="org.eclipse.core.runtime.adapters">
   <factory
         adaptableType="awrgraph.SqlTreeItemPlan"
         class="awrgraph.Adapters.SqlTreeItemPlanAdapterFactory">
      <adapter
            type="org.eclipse.ui.views.properties.IPropertySource">
      </adapter>
      <adapter
            type="awrgraph.Adapter3">
      </adapter>
   </factory>
</extension>
Mais je ne comprends pas pourquoi je ne passe jamais dans :
Code :
1
2
3
if (adapterType == Adapter3.class ) {
...
}
de mon AdapterFactory.

Je commence à saturer pour aujourd'hui...

a+
niikkko est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/08/2012, 15h48   #9
sam9722
Membre du Club
 
Inscription : juillet 2012
Messages : 32
Détails du profil
Informations forums :
Inscription : juillet 2012
Messages : 32
Points : 52
Points : 52
A priori c'est parce que tu ne l'appeles pas, tu devrais avoir ce code là dans ta vue :
Code :
SqlTreeItemPlanAdapter3Adapter o = (SqlTreeItemPlanAdapter3Adapter) sqlTreeItemPlan.getAdapter(Adapter3.class);
Tu peux donner le code de ta vue, la partie où tu appelles l'adpater?
sam9722 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/08/2012, 16h12   #10
niikkko
Invité de passage
 
Inscription : août 2012
Messages : 10
Détails du profil
Informations forums :
Inscription : août 2012
Messages : 10
Points : 2
Points : 2
pour l'instant, la vue ne fait que çà:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
	public void createPartControl(Composite parent) {
		parent.setLayout(new FillLayout(SWT.HORIZONTAL));
		{
			TreeViewer treeViewer = new TreeViewer(parent, SWT.BORDER);
			Tree tree = treeViewer.getTree();
		}
 
		createActions();
		initializeToolBar();
		initializeMenu();
 
		SqlTreeItemPlanAdapter3Adapter lAdapter = null;
		lAdapter = (SqlTreeItemPlanAdapter3Adapter) Platform.getAdapterManager().getAdapter(SqlTreeItemPlan.getInstance(), Adapter3.class);
	}
J'ai essayé le bout de code proposé, sans résultat.

a+
niikkko est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/08/2012, 16h48   #11
sam9722
Membre du Club
 
Inscription : juillet 2012
Messages : 32
Détails du profil
Informations forums :
Inscription : juillet 2012
Messages : 32
Points : 52
Points : 52
lorsque l'execution arrive sur l'instruction
Code :
Platform.getAdapterManager().getAdapter(SqlTreeItemPlan.getInstance(), Adapter3.class);
ta factory doit être appelée avec Adapter3.class .

Si ce n'est pas le cas c'est parce que ta factory n'a pas pu être trouvée :
- tu n'executes pas eclipse mais un programme java (la définition de la factory n'est donc pas chargée)
- ta factory n'a pas de constructuteur public sans paramètre
- tu n'as pas définit le bon package dans ton plugin pour ta factory
- tu as une autre factory qui répond
- SqlTreeItemPlan.getInstance() est null
- awrgraph.SqlTreeItemPlan est dans un autre package que SqlTreeItemPlan.getInstance()
- awrgraph.Adapter3 est dans un autre package que Adapter3.class
sam9722 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 21/08/2012, 16h56   #12
Gueritarish
Modérateur
 
Avatar de Gueritarish
 
Homme Marc
Développeur Java
Inscription : mai 2007
Messages : 1 564
Détails du profil
Informations personnelles :
Nom : Homme Marc
Âge : 28
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 564
Points : 3 574
Points : 3 574
Citation:
Envoyé par sam9722 Voir le message
lorsque l'execution arrive sur l'instruction
Code :
Platform.getAdapterManager().getAdapter(SqlTreeItemPlan.getInstance(), Adapter3.class);
Je te conseille de rentrer en débug dans cette méthode. Tu pourras vérifier les étapes effectuées par la plateforme.
Selon moi, tout est bon.
Après, dans un autre registre, je tenais à dire qu'il vaut mieux utiliser la forme Platform.getAdapterManager().getAdapter() plutôt que monObjectMetier.getAdapter(). La première utilisation à le mérite d'enlever le couplage entre la classe métier et la classe IAdaptable.

Voilà, à+
Gueritarish
__________________
Pas de questions technique par MP, les forums sont là pour ça.

Le 5 et 6 juin à Toulouse, la première EclipseCon France !
Gueritarish est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/08/2012, 13h25   #13
niikkko
Invité de passage
 
Inscription : août 2012
Messages : 10
Détails du profil
Informations forums :
Inscription : août 2012
Messages : 10
Points : 2
Points : 2
hello

Grâce à vos posts, j'ai pu avancer sur le sujet, avec succès :

Le pb venait bien de SqlTreeItemPlan.getInstance().

J'ai rajouté dans le createPartControl de ma nouvelle vue :
Code :
getSite().getPage().addSelectionListener((ISelectionListener) this);
et dans le selectionChanged:
Code :
lAdapter = (SqlTreeItemPlanAdapter3Adapter) Platform.getAdapterManager().getAdapter(((TreeSelection)selection).getFirstElement(), Adapter3.class);
Avec ces modifs, une selection d'un treeitem de ma première vue ( vue source) alimente désormais la propertysheet et ma nouvelle vue.

Je me rends compte de plus en plus de ma méconnaissance des frameworks dans Eclipse.

A part develoopez , auriez-vous des références (web ou bouquin, français ou anglais) pour un débutant comme moi ?

Encore merci pour votre aide.
niikkko est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2012, 08h56   #14
Gueritarish
Modérateur
 
Avatar de Gueritarish
 
Homme Marc
Développeur Java
Inscription : mai 2007
Messages : 1 564
Détails du profil
Informations personnelles :
Nom : Homme Marc
Âge : 28
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 564
Points : 3 574
Points : 3 574
Salut,

Sur le sujet, je peux te citer eclipsetotale (site francophone), planet eclipse (blog anglophone qui recense pas mal d'articles), le site de Prakash G.R. Eclipse Tips ou encore le site de Lars Vogel qui est une mine d'informations

Voilà, à+
Gueritarish
__________________
Pas de questions technique par MP, les forums sont là pour ça.

Le 5 et 6 juin à Toulouse, la première EclipseCon France !
Gueritarish est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2012, 09h46   #15
sam9722
Membre du Club
 
Inscription : juillet 2012
Messages : 32
Détails du profil
Informations forums :
Inscription : juillet 2012
Messages : 32
Points : 52
Points : 52
Citation:
Envoyé par Gueritarish Voir le message
le site de Lars Vogel
Oui excellent site, j'ajouterai les FAQ officielles qui sont très complètes :
eclipse : http://wiki.eclipse.org/The_Official_Eclipse_FAQs
rcp : http://wiki.eclipse.org/RCP_FAQ

je te conseille de survoler les questions pour avoir un apperçu de ce qui existe dans eclipse et des problèmes que tu pourras renconter, ça te fera sûrement gagner beaucoup de temps au final.
sam9722 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 16h15.


 
 
 
 
Partenaires

Hébergement Web