IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Eclipse Platform Discussion :

Ajout d'un deuxième adapter à une AdapterFactory


Sujet :

Eclipse Platform

  1. #1
    Futur Membre du Club
    Inscrit en
    Août 2012
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Août 2012
    Messages : 10
    Points : 7
    Points
    7
    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

  2. #2
    Membre expert
    Avatar de Gueritarish
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    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 800
    Points : 3 919
    Points
    3 919
    Par défaut
    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 : 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
    <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.

  3. #3
    Membre du Club
    Inscrit en
    Juillet 2012
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Juillet 2012
    Messages : 32
    Points : 58
    Points
    58
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    return new Class[] {IPropertySource.class, TaClasse.class};

    après c'est à ta nouvelle vue d'appeler tonObjetMetier.getAdapter(TaClasse.class) afin de se remplir.

  4. #4
    Futur Membre du Club
    Inscrit en
    Août 2012
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Août 2012
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : 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
     
    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.

  5. #5
    Membre du Club
    Inscrit en
    Juillet 2012
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Juillet 2012
    Messages : 32
    Points : 58
    Points
    58
    Par défaut
    sqlTreeItemPlan est ton objet métier à adapter, il doit implémenter l'interface IAdaptable avec quelque chose de cette forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    SqlTreeItemPlanAdapter3Adapter o = (SqlTreeItemPlanAdapter3Adapter) sqlTreeItemPlan.getAdapter(Adapter3.class);
    ou alors (si SqlTreeItemPlan n'implémente pas IAdaptable) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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?

  6. #6
    Membre expert
    Avatar de Gueritarish
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    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 800
    Points : 3 919
    Points
    3 919
    Par défaut
    Effectivement, ta factory doit ressembler à ça.
    Après, dans ta classe adaptable, ta méthode getAdapter(Class adapter) doit être:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  7. #7
    Membre du Club
    Inscrit en
    Juillet 2012
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Juillet 2012
    Messages : 32
    Points : 58
    Points
    58
    Par défaut
    Citation Envoyé par Gueritarish Voir le message
    Salut,
    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
    <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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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>

  8. #8
    Futur Membre du Club
    Inscrit en
    Août 2012
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Août 2012
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    oui mon plugin.xml ressemble à cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (adapterType == Adapter3.class ) {
    ...
    }
    de mon AdapterFactory.

    Je commence à saturer pour aujourd'hui...

    a+

  9. #9
    Membre du Club
    Inscrit en
    Juillet 2012
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Juillet 2012
    Messages : 32
    Points : 58
    Points
    58
    Par défaut
    A priori c'est parce que tu ne l'appeles pas, tu devrais avoir ce code là dans ta vue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SqlTreeItemPlanAdapter3Adapter o = (SqlTreeItemPlanAdapter3Adapter) sqlTreeItemPlan.getAdapter(Adapter3.class);
    Tu peux donner le code de ta vue, la partie où tu appelles l'adpater?

  10. #10
    Futur Membre du Club
    Inscrit en
    Août 2012
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Août 2012
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    pour l'instant, la vue ne fait que çà:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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+

  11. #11
    Membre du Club
    Inscrit en
    Juillet 2012
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Juillet 2012
    Messages : 32
    Points : 58
    Points
    58
    Par défaut
    lorsque l'execution arrive sur l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  12. #12
    Membre expert
    Avatar de Gueritarish
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    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 800
    Points : 3 919
    Points
    3 919
    Par défaut
    Citation Envoyé par sam9722 Voir le message
    lorsque l'execution arrive sur l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  13. #13
    Futur Membre du Club
    Inscrit en
    Août 2012
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Août 2012
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    getSite().getPage().addSelectionListener((ISelectionListener) this);
    et dans le selectionChanged:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  14. #14
    Membre expert
    Avatar de Gueritarish
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    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 800
    Points : 3 919
    Points
    3 919
    Par défaut
    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.

  15. #15
    Membre du Club
    Inscrit en
    Juillet 2012
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Juillet 2012
    Messages : 32
    Points : 58
    Points
    58
    Par défaut
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 14/10/2005, 13h46
  2. AJOUT d'un ENREGISTREMENT dans UNE TABLE
    Par ramo dans le forum Bases de données
    Réponses: 2
    Dernier message: 01/08/2005, 16h24
  3. Pb d'Ajout un noeud fils dans une arborescence
    Par oramine dans le forum Oracle
    Réponses: 5
    Dernier message: 21/12/2004, 15h39
  4. Ajout dynamique d'un contrôle à une fenêtre
    Par Yacine95000 dans le forum MFC
    Réponses: 6
    Dernier message: 08/06/2004, 16h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo