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

Vic*_*tor 3 eclipse plugins

我必须在属性表中绑定我的编辑器小部件对象.所以我可以从属性视图中获取我的小部件的属性.请帮助我,如果可能的话,请提供一些代码片段.

Von*_*onC 10

您可以在" 属性入门"中找到一个很好的示例

使用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());
}
Run Code Online (Sandbox Code Playgroud)

一旦您的视图有助于工作台选择,您需要确保视图正在选择的对象提供属性

(提取)

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")
        };
    }
Run Code Online (Sandbox Code Playgroud)

我之前说过,这个解决方案"不一定是最正确的".这是因为,为了实现这一点,我的域对象需要了解作为属性源的以视图为中心(以及以Eclipse为中心)的概念; 简而言之,模型和视图之间存在紧密耦合,这不是一件好事.

使用适配器是一种更好的方法,如本文所述:
人员应该实现IAdaptable.


另请参阅最近有关如何创建自定义属性视图的文章

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

如何破解属性视图以仅侦听特定视图.

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>
Run Code Online (Sandbox Code Playgroud)

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;
 }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我只是为了响应Project Explorer而忽略其他视图

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


根据这个线程,相同的原则应该对编辑器而不是视图有效.

属性表监听工作台页面选择提供程序.
选择供应商要看是什么浏览器/编辑器被激活.
每个编辑器/浏览器提供了自己选择供应商时编辑器/浏览器被激活使用.
这样,属性表不关心谁是活动的,它只是监听选择提供者.
这种方式取决于视图,显示不同的属性集.
例如,Navigator视图提供IResource选择,因此属性表随后IResource在导航器处于活动状态时显示属性.

本文说明了Workbench Selection机制

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
        }
    }
};
Run Code Online (Sandbox Code Playgroud)

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

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

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