【问题标题】:How to handle property sheet from customized editor in eclipse plugin development?如何在 Eclipse 插件开发中处理来自自定义编辑器的属性表?
【发布时间】:2010-12-18 04:30:25
【问题描述】:

我必须在属性表中绑定我的编辑器小部件对象。这样我就可以从属性视图中获取我的小部件的属性。 请帮我解决这个问题,如果可能的话,请给我一些代码 sn-ps。

【问题讨论】:

  • 刚刚完成了我关于Selection 机制的回答,它应该对EditorView 都有效。

标签: eclipse plugins


【解决方案1】:

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 创建 IPage。
我们的想法是覆盖该方法并为我们不感兴趣的所有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 属性。

工作台选择机制在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
        }
    }
};

根据您的要求,您的侦听器实现可能需要处理以下问题,如上面的代码 sn-p 所示:

  • 如果我们还提供选择(例如视图或编辑器),我们应该从处理中排除我们自己的选择事件。这样可以避免用户在我们的部件中选择元素时出现意外结果 (1)。
  • 检查我们是否可以处理这种选择 (2)。
  • 从所选内容中获取所选内容并对其进行处理 (3)。

【讨论】:

  • 感谢 Vonc。在这里,您提供了用于查看的代码 sn-ps。在我的情况下,我使用编辑器,例如:SampleEditor(我的编辑器)扩展了 EditorPart,我们如何为这个编辑器添加这个 SelectionProvider。你有任何编辑器部分的样本。
猜你喜欢
  • 2020-07-18
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
相关资源
最近更新 更多