Eclipse RCP - как прослушать выделение из редактора в фокусе - PullRequest
3 голосов
/ 16 июля 2011

Я создал простое приложение Eclipse RCP, в котором я могу открывать несколько экземпляров редактора в зависимости от действий пользователя. У меня есть отдельное представление (ViewPart), где я слушаю изменения выбора в редакторе. Проблема в том, что представление уведомляется только о выборках из последнего открытого редактора, другие редакторы, которые были открыты ранее, больше не предоставляют события / или, возможно, представление слушает только последний открытый редактор и ничего больше. Это происходит, даже если ранее открытые редакторы фокусируются.

Другими словами, только самый новый редактор в области редактора предоставляет события выбора. Я хочу, чтобы при нажатии на вкладках другого редактора я хотел видеть изменения в своем представлении, когда я щелкаю один из ранее открытых редакторов. .

На мой взгляд, я использую:

IWorkbench workbench = PlatformUI.getWorkbench();
        workbench.getActiveWorkbenchWindow().getActivePage().addSelectionListener(DocumentsEditor.ID,(ISelectionListener)this);

где DocumentEditor - один из редакторов, открытых в области редактора приложения.

1 Ответ

9 голосов
/ 16 июля 2011

Из JavaDoc для ISelectionService.addSelectionListener(String partId, ISelectionListener listener) (акцент мой):

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

Когда часть создается, слушателю передается первоначальный выбор части. Когда часть удаляется, слушателю передается пустой выбор, но только если слушатель реализует INullSelectionListener.

Примечание: это не будет правильно отслеживать части редактора, так как каждый редактор не имеет уникального идентификатора детали.

Так что не используйте этот метод, если вы хотите отслеживать выбор редактора. Вместо этого используйте ISelectionService.addSelectionListener(ISelectionListener listener) и проверьте заданную часть в ISelectionListener.selectionChanged(IWorkbenchPart part, ISelection selection), используя instanceof ...

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

По этой причине я обычно использую следующий код в своих представлениях и редакторах:

ISelectionService ss = getSite().getWorkbenchWindow().getSelectionService();
ss.addPostSelectionListener(listener);

Таким образом, использованный слушатель выйдет из правильного окна.

...