如何独立于SelectionProvider进行视图选择?

时间:2016-09-14 11:56:17

标签: java javafx eclipse-rcp

我有一个EMF树查看器和一个TableView,它从特定类的Tree Viewer中获取所有对象。我想要做的是将TableView行选择与树查看器中的相应对象同步,同时打开其属性视图。

我尝试将注册表设置为ISelectionProvider,然后将getViewSite().setSelectionProvider(registry);设置为使用包装器作为IPropertySheetPage。

主要的问题是我的TableView选择现在很奇怪(当我点击时,选择只是行周围的蓝色边框,而在第二次单击时选择是正常的)我想这是因为TableView也会监听到我的选择提供商。有没有办法绕过那个?我目前正在使用JavaFX TableView。

奇怪的选择:

Weird Selection

第二次点击选择:

enter image description here

在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。

0 个答案:

没有答案