我必须在属性表中绑定我的编辑器小部件对象。所以我可以从属性视图中获取我的小部件的属性。 请帮助我,如果可能的话,请提供一些代码片段。
答案 0 :(得分:10)
你在Getting started with Properties
中有一个很好的例子使用“属性”视图非常简单 由于它显示了所选对象的属性,使用它的第一步是确保工作台选择服务知道您在视图中选择的对象。有一篇关于选择服务主题的完整Eclipse Corner文章
public void createPartControl(Composite parent) {
viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
viewer.setContentProvider(new ViewContentProvider());
viewer.setLabelProvider(new ViewLabelProvider());
getSite().setSelectionProvider(viewer);
viewer.setInput(getViewSite());
}
一旦您的视图有助于工作台选择,您需要确保视图正在选择的对象提供属性
(提取物)
public class Person implements IPropertySource {
private String name;
private Object street;
private Object city;
public Person(String name) {
this.name = name;
this.street = "";
this.city = "";
}
public Object getEditableValue() {
return this;
}
public IPropertyDescriptor[] getPropertyDescriptors() {
return new IPropertyDescriptor[] {
new TextPropertyDescriptor("name", "Name"),
new TextPropertyDescriptor("street", "Street"),
new TextPropertyDescriptor("city", "City")
};
}
我之前曾表示,这个解决方案“不一定是最正确的”。这是因为,为了实现这一点,我的域对象需要了解作为属性源的以视图为中心(以及以Eclipse为中心)的概念;简而言之,模型和视图之间存在紧密耦合,这不是一件好事。
使用适配器是一种更好的方法,如described in this article:
人应该实施IAdaptable
。
另见最近关于how to create a custom property view
的文章
如何破解“属性视图”以仅侦听特定视图。
isImportant()
方法是决定是否为特定IWorkbenchPart创建IP的方法。
我们的想法是覆盖该方法,并为我们不感兴趣的所有workbenchPart
返回false。让我们先创建视图:
<view
class="com.eclipse_tips.views.CustomPropertiesView"
icon="icons/sample.gif"
id="com.eclipse-tips.views.customePropertiesView"
name="My Properties View">
</view>
CustomPropertiesView
应扩展PropertySheet
并覆盖isImportant()
:
public class CustomPropertiesView extends PropertySheet {
@Override
protected boolean isImportant(IWorkbenchPart part) {
if (part.getSite().getId().equals(IPageLayout.ID_PROJECT_EXPLORER))
return true;
return false;
}
}
在这种情况下,我只是让视图响应Project Explorer并忽略其他视图
根据this thread,相同的原则应该对编辑器而不是视图有效。
属性表会侦听工作台页面选择提供程序 选择提供程序取决于哪个查看器/编辑器处于活动状态 每个编辑/查看器都提供自己的选择提供程序,以便在该编辑器/查看器处于活动状态时使用 这样,属性表不关心谁是活动的,它只是监听选择提供者 这种方式取决于视图,显示不同的属性集 例如,
Navigator
视图提供了IResource
选项,因此当导航器处于活动状态时,属性表会显示IResource
属性。
Workbench Selection机制在this article
中说明
ISelectionListener
是一个只有一种方法的简单界面 典型的实现如下所示:
private ISelectionListener mylistener = new ISelectionListener() {
public void selectionChanged(IWorkbenchPart sourcepart, ISelection selection) {
if (sourcepart != MyView.this && // 1
selection instanceof IStructuredSelection) { // 2
doSomething(((IStructuredSelection) selection).toList()); // 3
}
}
};
根据您的要求,您的侦听器实现可能需要处理以下问题,如上面的代码段所示:
- 如果我们还提供选择(例如视图或编辑器),我们应该从处理中排除我们自己的选择事件。当用户选择我们的部分(1)中的元素时,这可以避免意外结果。
- 检查我们是否可以处理这种选择(2)。
- 从选择中获取所选内容并进行处理(3)。