Я предлагаю добавить слушателя фокуса к каждому из деревьев и вызвать partSite.setSelectionProvider()
с в настоящее время сфокусированным деревом. Например:
treeViewer1.getTree().addListener(SWT.FocusIn, event -> site.setSelectionProvider(treeViewer1));
treeViewer2.getTree().addListener(SWT.FocusIn, event -> site.setSelectionProvider(treeViewer2));
Я оставлю его как упражнение для чтения, чтобы удалить дублирование слушателя.
В качестве альтернативы вы можете создать провайдер выбора proxy, который прослушивает изменения выбора в обоих зрителях деревьев и распространяет самый последний выбор. Что-то вдоль этих линий:
public class ProxySelectionProvider implements ISelectionProvider {
private ISelection selection;
private final Collection<ISelectionChangedListener> listeners;
public ProxySelectionProvider(StructuredViewer... viewers) {
listeners = new ArrayList<>();
selection = StructuredSelection.EMPTY;
for(StructuredViewer viewer : viewers) {
ISelectionChangedListener selectionListener = this::selectionChanged;
viewer.addSelectionChangedListener(selectionListener);
viewer.getControl().addDisposeListener(event -> viewer.removeSelectionChangedListener(selectionListener));
}
}
@Override
public void addSelectionChangedListener(ISelectionChangedListener listener) {
listeners.add(listener);
}
@Override
public void removeSelectionChangedListener(ISelectionChangedListener listener) {
listeners.remove(listener);
}
@Override
public ISelection getSelection() {
return selection;
}
@Override
public void setSelection(ISelection selection) {
this.selection = selection;
}
private void selectionChanged(SelectionChangedEvent event) {
selection = event.getSelection();
notifyListeners();
}
private void notifyListeners() {
SelectionChangedEvent event = new SelectionChangedEvent(this, selection);
new ArrayList<>(listeners).forEach(listener -> listener.selectionChanged(event));
}
}
Используйте поставщик выбора, как это:
ISelectionProvider selectionProvider = new ProxySelectionProvider(treeViewer1, treeViewer2);
IWorkbenchPartSite partSite = workbenchWindow.getActivePage().getActivePart().getSite();
partSite.setSelectionProvider(selectionProvider);
Я вижу, что вы новичок в SO. Если вы чувствуете, что ответ решил проблему, отметьте ее как «принятую», нажав зеленую галочку. Это помогает сосредоточиться на старых постах, у которых до сих пор нет ответов. –