EditPart的选中状态:
在EditPart里面可以通过setSelected(int value)的方式,设置对EditPart的选中状态。一共有三种选中状态:SELECTED_NONE = 0; SELECTED = 1; SELECTED_PRIMARY = 2;
当你仅仅设置了这个状态的时候,编辑器界面是会有改变的,它会让你感觉选中了EditPart。但是这个时候你看大纲视图,你看属性视图,你会发现都没有做相应的变化。而且你这个时候,你对你选中的对象做拖拽操作的时候,是无效果的。
由此可见,EditPart的setSelected方法只是一个描述选中状态类型的操作,它并没有帮你执行,鼠标选中当前节点的操作。
如果你想用代码的方式选中编辑器上的某个节点,可以获取它或者它的父EditPartViewer对象,然后把它的EditPart传入进去。代码如下:
getParent().getViewer().select(getParent());
在EditPartViewer里面有一个SelectionManager的对象,对选中的节点进行管理。
/**
* @see EditPartViewer#setSelectionManager(SelectionManager)
*/
public void setSelectionManager(SelectionManager model) {
Assert.isNotNull(model);
if (selectionModel != null)
selectionModel.internalUninstall();
selectionModel = model;
model.internalInitialize(this, selection, new Runnable() {
public void run() {
fireSelectionChanged();
}
});
if (getControl() != null)
model.internalHookControl(getControl());
}
/**
* Fires selection changed to the registered listeners at the time called.
*/
protected void fireSelectionChanged() {
Object listeners[] = selectionListeners.toArray();
SelectionChangedEvent event = new SelectionChangedEvent(this,
getSelection());
for (int i = 0; i < listeners.length; i++)
((ISelectionChangedListener) listeners[i]).selectionChanged(event);
}
上面这段是来自AbstractEditPartViewer类里面对选中这一个操作的处理。最基本的原理还是自己构造一个事件,让后触发选中。
另外在DefaultEditDomain里面也有很多触发事件的方法,类似鼠标可键盘的都有,虽然传入的事件基类跟SelectionChangedEvent不一样,但是基本原理相似。我自己没试,所以也不知道效果如何。