eclipse - 如何在 Eclipse 插件开发中处理自定义编辑器的属性表?

标签 eclipse plugins

我必须在属性表中绑定(bind)我的编辑器小部件对象。这样我就可以从属性 View 中获取小部件的属性。 请帮助我解决这个问题,如果可能的话,请给我提供一些代码片段。

最佳答案

Getting started with Properties 中有一个很好的例子

Using the Properties view is simple enough.
Since it shows properties for the selected object, the first step to using it is to make sure that the workbench selection service knows about the object selected in your view. There’s an entire Eclipse Corner article written on the subject of the selection service

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());
}

Once you have your view contributing to the workbench selection, you need to make sure that the objects that your view is selecting contribute properties

(摘录)

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")
        };
    }

I indicated earlier that this solution is “not necessarily [the] most correct”. This is because, for this to work, my domain object needs to know about the very view-centric (and Eclipse-centric) notion of being a property source; in short, there is a tight-coupling between the model and view and this not a good thing™.

使用适配器是更好的方法,如described in this article :
人应该实现IAdaptable

<小时/>

另请参阅最近关于 how to create a custom property view 的文章

http://3.bp.blogspot.com/_hsp14iFkRLs/Sg28gW12WnI/AAAAAAAADk4/Y_bxy5lHIvI/s320/PinActionRemoved.png

how to hack the Properties View to listen only to a specific view.

The isImportant() method is the one which decides whether to create an IPage for the specific IWorkbenchPart or not.
The idea is to override that method and return false for all the workbenchPart that we are not interested in. Lets create the view first:

<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;
 }
}

In this case, I'm making the view only to respond to Project Explorer and ignore other views

http://2.bp.blogspot.com/_hsp14iFkRLs/Sg28Nwe3QSI/AAAAAAAADko/DqnVd7obB1Y/s320/CustomPropertiesProjectExplore.png

<小时/>

根据this thread ,同样的原则应该适用于编辑器而不是 View 。

The property sheet listens to the workbench page selection provider.
The selection provider depends on what viewer/editor is active.
Each editor/viewer provides their own selection provider to use when that editor/viewer is active.
This way the property sheet doesn't care who is active, it just listens to the selection provider.
That way depending upon the view, a different set of properties are displayed.
For example, the Navigator view provides IResource selections, so the property sheet then displays IResource properties when the Navigator is active.

工作台选择机制如 this article 所示。

The ISelectionListener is a simple interface with just one method.
A typical implementation looks like this:

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
        }
    }
};

Depending on your requirements your listener implementation probably needs to deal with the following issues as shown in the code snippet above:

  • In case we also provide selections (e.g. a view or editor) we should exclude our own selection events from processing. This avoids unexpected results when the user selects elements within our part (1).
  • Check whether we can handle this kind of selection (2).
  • Get the selected content from the selection and process it (3).

http://www.eclipse.org/articles/Article-WorkbenchSelections/images/diagram1.gif

关于eclipse - 如何在 Eclipse 插件开发中处理自定义编辑器的属性表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1761219/

相关文章:

java - 在 Eclipse 中方便地将一个类 move 到不同的包中,而不需要 svn

eclipse - 如何组合eclipse的所有包?

java - 为什么我必须添加Lombok插件,为什么添加依赖还不够

c# - 插件架构 .net maf 或 mef

eclipse - Eclipse JVM配置

java - Git 管理环境特定配置

python - Eclipse、PyDev 和 Python 配置错误

java - 如何在 Eclipse 中为 Guava 的 ArrayListMultiMap 类创建 JUnit 测试用例?

javascript - Web Push系统-如何订阅用户?

eclipse - 在新的 Eclipse 编辑器中实现 "Mark Occurrences"