RCP SelectionService

时间:2011-05-20 15:07:00

标签: eclipse-rcp selection viewer

我有两个观点:一个有TreeViewer,另一个有SWT小部件。我希望视图中的活动与小部件一起使用TreeViewer在视图中进行更改。在阅读有关该主题的各种资源时,他们都谈到允许JFace观众发布选择并接收通知,但他们并没有谈到能够从文本小部件中触发这些选择,例如。

假设此代码所在的视图为ISelectionProvider,我可以执行此类操作吗?

Text someText = new Text( parent, SWT.BORDER ) ;
someText.addKeyListener( new KeyListener() {
  @Override
  public void keyPressed( KeyEvent e ) {}

  @Override
  public void keyReleased( KeyEvent e ) {
    ...
    ...
    CellInfo cellInfo = new CellInfo( /*text collected while typing*/);
    currentSelection = new StructuredSelection( cellInfo ) ; 
    setSelection( currentSelection ) ;

...
...

public void setSelection( ISelection selection ) {
  Object[] list = getListeners() ;//listeners.getListeners();  
  for (int i = 0; i < list.length; i++) {  
    ((ISelectionChangedListener) list[i])  
     .selectionChanged(new SelectionChangedEvent(this, selection));  
  } 
}

这似乎适用于选择方面,但另一方面我想要消费选择,没有任何反应。在该查看器中,我实现了ISelectionListener接口,并在createPartControl()方法的开头执行以下操作:

getSite().getPage().addSelectionListener(this);

selectionChanged()方法永远不会被调用。

我的猜测是我在生产者方面做错了,因为消费者方面似乎非常简单。有什么指针吗?

谢谢!

乔恩

2 个答案:

答案 0 :(得分:3)

您是否告诉Workbench您的选择提供商?在生产者方面,在你的createPartControl()中你需要:

getSite().setSelectionProvider(this);

答案 1 :(得分:1)

由于在整个SWT中应用了a design decision,因此通常不会发送事件以响应程序更改(与用户操作相反)。但是,您可以执行以下操作:

// (1) set a new selection for the view's viewer
myViewer.setSelection(ISelection, boolean);
// (2) setup event to be fired
// (2.1) create new org.eclipse.swt.widgets.Event
Event event = new Event();
// (2.2) set some fields in event
// e.g., event.widget = myViewer.getControl();
// (3) fire event via Viewer's Control (is Widget)
myViewer.getControl().notifyListeners(SWT.Selection, event);

但是要注意这种方法会让你有机会在脚下射击(根据我自己的经验)。