我的选择监听器似乎没有正确注册
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);
}
应确保使用的是您的提供商。
我正在创建一个具有多个视图的 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);
}
应确保使用的是您的提供商。