Запутался в IAdaptable с IActionFilters - PullRequest
0 голосов
/ 14 февраля 2010

Я запутался в 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;
  }
}

Что в этом плохого? Где я что-то упустил?

1 Ответ

0 голосов
/ 14 февраля 2010

Оказывается все, ну почти все, было правильно. Я просто перепутал интерфейс и реализацию object_class_of_viewer_entry в plugin.xml.

Две статьи, которые помогли: http://www.eclipsezone.com/articles/what-is-iadaptable/ и http://wiki.eclipse.org/FAQ_How_do_I_use_IAdaptable_and_IAdapterFactory%3F

...