Confus au sujet de IAdaptable avec IActionFilters
-
20-09-2019 - |
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?
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