Как взаимодействовать между представлениями в Eclipse RCP?

В Eclipse RCP я создаю представления для Перспективы, используя IPageLayout.addView(...)

Но таким образом у меня нет ссылки на представление. Поэтому я не знаю, как я могу показать ViewA для обновления ViewB.

Какой лучший шаблон для использования здесь?

Ответ 1

Помимо того, что VonC упомянул выше, вы также можете использовать ISourceProviderListener, если необходимые изменения не будут вызваны выбором.

  • Имейте ViewB реализует ISourceProviderListener
  • Создайте реализацию ISourceProvider и зарегистрируйте ее в сервисах
  • У вас ViewA получить ISourceProvider и обновить его, чтобы вызвать изменения в ViewB

Прочитайте документацию по этим интерфейсам вместе с IServiceLocator и ISourceProviderService, чтобы лучше понять, как все это происходит.

Вы также можете увидеть этот учебник Lars Vogel, в котором есть пример того, как использовать ISourceProvider

Ответ 2

У вас есть парадигма коммуникации, представленная в статье IBM

  • Чтобы создать представление, способное прослушивать изменения выбора, представление должно реализовать интерфейс ISelectionListener и должно зарегистрироваться на странице рабочего места
  • Использование интерфейса IAdaptable: класс, реализующий IAdaptable, имеет возможность динамически возвращать определенные типы адаптеров, которые затем могут использоваться для получения дополнительной информации.
  • парадигма слушателя изменений свойств

Что касается первого подхода, детали статьи:

Более разумный способ использования пользовательских интерфейсов состоит в том, чтобы регистрировать пользовательские представления в качестве слушателей для определенных частей представления. Как вы можете видеть в приведенном ниже примере, идентификатор вида части представления источника упоминается как параметр во время регистрации прослушивателя выбора.

  getSite().getPage().addSelectionListener("SampleViewId",(ISelectionListener)this);

Этот подход устранит избыточные обратные вызовы для представления потребителя, которые в противном случае возникли бы, если бы это представление было зарегистрировано как неспецифический слушатель.

В фрагменте кода в листинге 2 показан метод createPartControl() представления, который создает JFace TableViewer и добавляет его в качестве поставщика выбора на сайт workbench. Этот код разрешает любые изменения выбора пользовательского интерфейса в TableViewer для распространения на страницу и, наконец, на заинтересованные представления потребителей.

Листинг 2. Настройка поставщика выбора

public void createPartControl(Composite parent) {
    // Set up a JFace Viewer
    viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
    viewer.setContentProvider(new ViewContentProvider());
    viewer.setLabelProvider(new ViewLabelProvider());
    viewer.setSorter(new NameSorter());
    viewer.setInput(getViewSite());

    // ADD the JFace Viewer as a Selection Provider to the View site.
    getSite().setSelectionProvider(viewer);

}

Аналогичный подход вы найдете в RCP-учебнике для eclipse3.5 (обновление 4 февраля 2010 г.)

Ответ 3

Существуют разные способы просмотра и подключения плагинов: eventbroker, прослушиватель и т.д.

Реализация EvenBroker (e4): Используйте eventbroker для отправки сообщения (строки) между представлениями и плагинами.

Сторона отправителя:

@Inject
private IEventBroker eventBroker; 
private static final String STATUS ="status";
eventBroker.send(STATUS, "status test message..");

Сторона приемника:

@Inject
private IEventBroker eventBroker; 
private static final String STATUS ="status";
@Inject @Optional
public void  getEvent(@UIEventTopic(STATUS) String message) {
    ... //call method 
}