我的选择监听器似乎没有正确注册

My selection listener doesn't seem to be registering properly

我正在创建一个具有多个视图的 Eclipse RCP 应用程序。我的观点之一是多页编辑器视图。这些页面中的每一个都有一个 master/details 块。我需要将所有这些 TableViewer 注册为我要收听的其他视图的选择提供程序。

在网上进行大量研究后,我发现 this article 关于在单一视图中选择多个提供程序。我按照说明为多个查看器创建了这个选择提供程序。

class MyMultipleSelectionProvider implements ISelectionProvider {

private final ListenerList selectionListeners = new ListenerList();

private ISelectionProvider delegate;

private final ISelectionChangedListener selectionListener = new ISelectionChangedListener() {
    @Override
    public void selectionChanged(final SelectionChangedEvent event) {
        if (event.getSelectionProvider() == AdaptabilityProfileSelectionProvider.this.delegate) {
            fireSelectionChanged( event.getSelection() );
        }
    }
};

/**
 * Sets a new selection provider to delegate to. Selection listeners
 * registered with the previous delegate are removed before. 
 * 
 * @param newDelegate new selection provider
 */
public void setSelectionProviderDelegate(final ISelectionProvider newDelegate) {
    if (this.delegate == newDelegate) {
        return;
    }
    if (this.delegate != null) {
        this.delegate.removeSelectionChangedListener(this.selectionListener);
    }
    this.delegate = newDelegate;
    if (newDelegate != null) {
        newDelegate.addSelectionChangedListener(this.selectionListener);
        fireSelectionChanged(newDelegate.getSelection());
    }
}


@Override
public void addSelectionChangedListener(final ISelectionChangedListener listener) {
    this.selectionListeners.add(listener);
}

@Override
public ISelection getSelection() {
    return this.delegate == null ? null : this.delegate.getSelection();
}

@Override
public void removeSelectionChangedListener(final ISelectionChangedListener listener) {
    this.selectionListeners.remove(listener);
}

@Override
public void setSelection(final ISelection selection) {
    if (this.delegate != null) {
        this.delegate.setSelection(selection);
    }
}
protected void fireSelectionChanged(final ISelection selection) {
    fireSelectionChanged(this.selectionListeners, selection);
}

private void fireSelectionChanged(final ListenerList list, final ISelection selection) {
    final SelectionChangedEvent event = new SelectionChangedEvent(this.delegate, selection);

    final Object[] listeners = list.getListeners();
    for (int i = 0; i < listeners.length; i++) {
        final ISelectionChangedListener listener = (ISelectionChangedListener) listeners[i];
        listener.selectionChanged(event);
    }
}
}

我为编辑的所有观众添加了一个 focusListener,这样他们就成为了代表:

    tree.addFocusListener(new FocusAdapter() {
        @Override
        public void focusGained(final FocusEvent e) {
            editor.getSelectionProvider().setSelectionProviderDelegate(MyEditorPage.this.treeViewer);
        }
    });

并且我将其注册为我的编辑的选择提供者:

site.setSelectionProvider( this.selectionProvider  );

然后,在我认为需要听取选择的情况下,我为这个编辑器注册了一个选择监听器:

getSite().getPage().addSelectionListener(MyEditor.ID, this.selectionListener);

当我 运行 应用程序时,我看到正在更改委托并且正在触发选择事件。但是,侦听器列表是空的。

我从不直接调用 addSelectionChangeListener()。我的印象是,这就是选择服务的目的。我错了吗?我应该打电话给它吗?如果是这样,什么时候?如果不是,应该由谁来添加侦听器,为什么没有添加?

如果您的代码基于 FormEditor(或 MultiPageEditorPart),则选择提供程序在 init 方法的末尾设置为 MultiPageSelectionProvider。这可能会覆盖您的 site.setSelectionProvider 呼叫。

使用:

@Override
public void init(IEditorSite site, IEditorInput input)
        throws PartInitException {
    super.init(site, input);

    site.setSelectionProvider(this.selectionProvider);
}

应确保使用的是您的提供商。