【问题标题】:Eclipse Nature-specific Project PropertiesEclipse 自然特定的项目属性
【发布时间】:2017-02-16 04:27:34
【问题描述】:

我正在开发一个具有自定义项目性质的 Eclipse 插件。自然本身运作良好。我需要实现一个特定于项目的属性页面,该页面允许用户自定义特定于该性质的设置;到目前为止,我一直没有成功,并会感谢任何帮助。我设想这类似于 Java 的特性允许设置特定于项目的编译器选项、格式化程序设置等。

项目设置存储在项目本身中至关重要,类似于 Java 设置存储在 (project root)/.settings/org.eclipse.jdt.*.prefs 中的方式。这些需要在该项目的源代码控制中,以便整个团队都遵守相同的标准。

这是我目前在 plugin.xml 中的内容:

  <extension point="org.eclipse.ui.propertyPages">
    <page id="test.MyOverlayPage"
          name="%Key.PropertyPage"
          class="test.MyOverlayPage">
      <enabledWhen>
        <instanceof value="org.eclipse.core.resources.IProject"/>
      </enabledWhen>
    </page>
  </extension>

这显然不会像 Java 设置那样从本质上限制属性页,但目前这不会出现在任何项目中,更不用说具有自定义性质的项目了。

我发现以下问题没有解决我的具体问题:

Create our own property page for project explorer eclipse plugin

Eclipse: Storing info in .project file

我还发现这个 Eclipse 帮助页面严重缺乏详细信息,我无法根据它来完成这项工作:

http://help.eclipse.org/indigo/index.jsp?topic=%2Forg.eclipse.platform.doc.isv%2Fguide%2FresInt_properties.htm

【问题讨论】:

    标签: eclipse eclipse-plugin


    【解决方案1】:

    Java 属性页使用这个:

    <enabledWhen>
        <adapt type="org.eclipse.core.resources.IProject">
            <test property="org.eclipse.core.resources.projectNature" 
                  value="org.eclipse.jdt.core.javanature"/>
        </adapt>         
    </enabledWhen>
    

    这使用adapt 而不是instanceof,因为视图中的 UI 对象通常不是项目(或其他资源)的实例。相反,他们使用IAdapterManager 将 UI 类转换(适应)为工作区模型类。

    test 元素添加了对项目性质的测试,这里是 Java 性质 ID,但您可以替换您的性质 ID。

    要在项目.settings 中保存首选项,请使用类似:

    IProject project =  ... get project from selection or something
    
    IScopeContext context = new ProjectScope(project);
    
    Preferences projectPreferences = context.getNode("your nature id");
    
    projectPreferences.put(key, value);
    
    projectPreferences.flush();
    

    【讨论】:

    • 谢谢,效果很好。看起来我比我想象的更接近。
    【解决方案2】:

    如果您的页面是 org.eclipse.ui.dialogs.PropertyPage 的扩展,您可以通过以下方式获取项目:

    private IProject getProject() {
       final IAdaptable adaptable = getElement();
       return adaptable == null ? null : (IProject) adaptable.getAdapter(IProject.class);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-20
      • 2017-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多