您的位置:首页 > 其它

RCP 视图间通信:SWT Canvas向JFace ViewPart发送消息

2013-08-02 17:58 113 查看
问题:如何在一个SWT Canvas控件里面发送事件消息给JFace ViewPart 控件。

实现的功能:在Canva内点击鼠标时,能将点击位置发送给ViewPart控件,供其处理后显示。

解决方案:

使用一个ViewPart作为Canvas的父控件,:

public class CanvasViewPart extends ViewPart implements ISelectionProvider {
private Canvas canvas;

private ListenerList selectionChangeListeners = new ListenerList();

@Override
public void createPartControl(Composite parent) {
parent.setLayout(new FillLayout(SWT.HORIZONTAL));
canvas = new Canvas(parent, SWT.NONE);

canvas.addMouseListener(new MouseListener() {

@Override
public void mouseUp(MouseEvent e) {
}

@Override
public void mouseDown(MouseEvent e) {
}

@Override
public void mouseDoubleClick(MouseEvent e) {
System.out.println("Double click!");

setSelection(new Point2D(e.x, e.y));
}
});

// 注册此事件提供者。
this.getSite().setSelectionProvider(this);
}


然后就可以利用RCP的Selection Provider-Selection Listener机制在ViewPart之间通信了。

Step 1、首先,为CanvasViewPart中实现ISelectionProvider接口:

@Override
public void addSelectionChangedListener(ISelectionChangedListener listener) {
selectionChangeListeners.add(listener);
}

@Override
public ISelection getSelection() {
// TODO Auto-generated method stub
return null;
}

@Override
public void removeSelectionChangedListener(
ISelectionChangedListener listener) {
selectionChangeListeners.remove(listener);
}

@Override
public void setSelection(ISelection selection) {
final SelectionChangedEvent event = new SelectionChangedEvent(
CanvasViewPart.this, selection);

Object[] listeners = selectionChangeListeners.getListeners();
for (int i = 0; i < listeners.length; ++i) {
final ISelectionChangedListener object = (ISelectionChangedListener) listeners[i];

SafeRunnable.run(new SafeRunnable() {
public void run() {
object.selectionChanged(event);
}
});
}
}


Step 2、然后为通信目标视图View实现ISelectionListener接口。

@Override
public void selectionChanged(IWorkbenchPart part, ISelection selection) {
System.out.println("In View");

viewer.setInput(new String[] { ((Point2D) selection).toString() });
}


代码解析:

事件源Canvas控件的父控件CanvasViewPart实现了事件提供者接口ISelectionProvider,并将自身注册到RCP的事件传递机制中:

this.getSite().setSelectionProvider(this);


RCP的事件传递机制会通过ISelectionProvider接口方法

addSelectionChangedListener(ISelectionChangedListener listener)


将所有已注册到RCP事件传递机制的监听者实例通知给CanvasViewPart,这些实例均包含ISelectionChangedListener接口,在需要传递事件给其他监听者时,可以使用其ISelectionChangedListener接口方法selectionChanged(event)。

事件目的地View实现了事件监听者接口ISelectionListener,当事件到达时,其将调用ISelectionListener接口的selectionChanged方法处理。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: