2010-02-14 4 views
0

Je suis confus au sujet de IAdaptable et des classes liées. Quelle classe est l'adaptateur, l'adaptee, le type adaptable?Confus au sujet de IAdaptable avec IActionFilters

[Contexte]

J'ai un menu contextuel pour les entrées d'un spectateur de table/arbre. Certaines actions dans le menu contextuel ne doivent pas être visibles en fonction de l'état de l'objet respectif dans la visionneuse (c'est-à-dire la valeur d'attribut d'une ligne dans la visionneuse de table).

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 contourner cela en utilisant le mécanisme IAdaptable. La lecture de la documentation Eclipse m'a laissé perplexe avec les termes (adaptateur, adaptateur, type adaptable) et je ne comprends toujours pas comment résoudre mon problème.

La classe d'objets (désignée par dans la configuration ci-dessus) doit rester intacte.

Mon approche était 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; 
    } 
} 

Quel est le problème à ce sujet? Où ai-je manqué quelque chose?

Répondre

Questions connexes