Question

Je suis tromper sur IAdaptable et les classes connexes. Quelle classe est l'adaptateur, le adaptee, le type adaptable?

[Contexte]

J'ai un menu contextuel pour les entrées d'un spectateur de table / arbre. Certaines actions dans le menu contextuel ne doit pas être visible en fonction de l'état de l'objet respectif dans la visionneuse (à savoir une valeur d'attribut d'une ligne dans l'afficheur de tableau).

Je peux y parvenir avec une config comme ça dans plugin.xml:

<extension
         point="org.eclipse.ui.popupMenus">
      <objectContribution
            adaptable="false"
            id="<some_id>"
            objectClass="<object_class_of_viewer_entry>">
            <visibility>
               <objectState name="buildable" value="true"/>
             </visibility>
         <action
               class="<my_action_class>"

Cependant, cela ne fonctionne que si la classe d'objet implémente org.eclipse.ui.IActionFilter.

[Problème]

Ma classe d'objet ne peut pas mettre en œuvre IActionFilter, je ne veux pas changer son interface. Par conséquent, je dois travailler autour de ce en utilisant le mécanisme IAdaptable.

La lecture de la documentation Eclipse m'a laissé perplexe tout avec des termes (adaptateur, le ADAPTEE, le type adaptable) et je suis encore confus sur la façon d'aller sur mon problème.

La classe d'objet (appelé par la configuration ci-dessus) doit rester intacte.

Mon approche est la suivante.

<extension
         point="org.eclipse.core.runtime.adapters">
      <factory
            adaptableType="<object_class_of_viewer_entry>"
            class="MyFactory">
         <adapter
               type="org.eclipse.ui.IActionFilter">
         </adapter>
      </factory>
   </extension>

myFactory est comme ceci:

public class MyFactory implements IAdapterFactory {
  private static final Class[] types = {
    <object_class_of_viewer_entry>.class,
  };

  @Override
  public Object getAdapter(Object adaptableObject, Class adapterType) {
    return new <class_that_implements_IActionFilter>((<object_class_of_viewer_entry>) adaptableObject);
  }

  @Override
  public Class[] getAdapterList() {
    return types;
  }
}

Qu'est-ce qui ne va pas à ce sujet? Où ai-je raté quelque chose?

Était-ce utile?

La solution

Il s'avère que tout, bien, presque tout était correct. J'avais simplement mélangé interface et la mise en œuvre de object_class_of_viewer_entry dans le plugin.xml.

Deux articles qui ont aidé à: http://www.eclipsezone.com/articles / what-is-iadaptable / et http://wiki.eclipse.org/FAQ_How_do_I_use_IAdaptable_and_IAdapterFactory% 3F

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top