2011-05-20 69 views
0

我有两个意见:一个是TreeViewer,另一个是SWT小部件。我希望使用小部件在视图中执行活动,以使视图中的变化与TreeViewer一致。例如,在阅读有关该主题的各种资源时,他们都讨论了允许JFace查看者发布选择并接收通知,但他们没有谈到能够从Text小部件中触发这些选择。RCP SelectionService

我可以这样做吗,假设这个代码的视图是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()方法不会被调用。

我的猜测是我在生产者方面做了一些错误,因为消费者方面似乎非常简单。任何指针?

谢谢!

Jon

回答

3

您是否告诉Workbench您的选择提供者?在制片方,在你的createPartControl(),你需要:

getSite().setSelectionProvider(this); 
1

由于a design decision是整个SWT应用,事件通常不响应的方案变动发送(而不是用户操作)。但是,您可以做这样的事情:

// (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); 

知道,这种方法会导致一个很好的机会搬起石头砸自己的脚(从我自己的经验)。