Я запутался в IAdaptable и связанных с ним классах. К какому классу относится адаптер, адаптируемый, адаптируемый тип?
[Контекст]
У меня есть контекстное меню для записей просмотра таблицы / дерева. Некоторые действия в контекстном меню не должны отображаться в зависимости от состояния соответствующего объекта в средстве просмотра (то есть значения атрибута строки в средстве просмотра таблицы).
Я могу добиться этого с помощью конфига, подобного этому, в 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>"
Однако это работает, только если класс объекта реализует org.eclipse.ui.IActionFilter.
[Проблема]
Мой объектный класс не может реализовать IActionFilter, я не хочу менять его интерфейс. Следовательно, мне нужно обойти это, используя механизм IAdaptable.
Чтение документации по Eclipse оставило меня в недоумении от терминов (адаптер, адаптивный, адаптируемый тип), и я все еще не понимаю, как решить мою проблему.
Класс объекта (на который ссылается вышеупомянутая конфигурация) должен оставаться нетронутым.
Мой подход был следующим.
<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 выглядит так:
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;
}
}
Что в этом плохого? Где я что-то упустил?