我有一个EMF树查看器和一个TableView,它从特定类的Tree Viewer中获取所有对象。我想要做的是将TableView行选择与树查看器中的相应对象同步,同时打开其属性视图。
我尝试将注册表设置为ISelectionProvider,然后将getViewSite().setSelectionProvider(registry);
设置为使用包装器作为IPropertySheetPage。
主要的问题是我的TableView选择现在很奇怪(当我点击时,选择只是行周围的蓝色边框,而在第二次单击时选择是正常的)我想这是因为TableView也会监听到我的选择提供商。有没有办法绕过那个?我目前正在使用JavaFX TableView。
奇怪的选择:
第二次点击选择:
在createPartControl中:
view.getSelectionModel().selectedItemProperty().addListener((obs, oldSelection, newSelection) -> {
List<Object> eoList = new ArrayList<Object>();
for (SimpleRow row : view.getSelectionModel().getSelectedItems()) {
if (null != row.getEObject())
eoList.add(row.getEObject());
}
;
MinimalPlugin.getDefault().getRegistry().setSelection(new StructuredSelection(eoList));
});
getViewSite().setSelectionProvider(MinimalPlugin.getDefault().getRegistry());
在getAdapter:
@Override
public Object getAdapter(Class adapter) {
if (adapter == IPropertySheetPage.class) {
if (null == propertyPage)
propertyPage = new PropertySheetWrapper();
return propertyPage;
}
return super.getAdapter(adapter);
}
EMF树查看器选择侦听器:
IWorkbench wb = PlatformUI.getWorkbench();
IWorkbenchWindow win = wb.getActiveWorkbenchWindow();
win.getActivePage().addSelectionListener(new ISelectionListener() {
@Override
public void selectionChanged(IWorkbenchPart part, ISelection selection) {
if (selection instanceof StructuredSelection) {
StructuredSelection sel = (StructuredSelection) selection;
if (sel.getFirstElement() instanceof EObject) {
// Get property sheet page from editor
if (part instanceof IEditorPart) {
editorPart = (IEditorPart) part;
IPropertySheetPage newPropertyPage = editorPart.getAdapter(IPropertySheetPage.class);
if (null != newPropertyPage && newPropertyPage instanceof ExtendedPropertySheetPage) {
propertyPage.setPropertySheetPage((ExtendedPropertySheetPage) newPropertyPage);
}
}
EObject object = (EObject) sel.getFirstElement();
EObject root = EcoreUtil.getRootContainer(object);
populateFromRoot(root);
}
}
}
});
populateFromRoot()方法只是使用找到的对象重绘TableView。