2

我负责重构我公司的 Eclipse 插件中的弹出菜单,以使用新的命令/处理程序/菜单扩展点方案。我们有一些关于何时启用或不启用某些菜单项的业务逻辑,这是通过他们应用于操作的 SelectionListener 的 onSelectionChanged 方法来处理的。我现在正在尝试使用自定义 PropertyTester 来控制启用,但似乎我的自定义 PropertyTesters 没有被加载。我已经关注了 Eclipse 的文档以及我可以在网上找到的任何教程,但由于某种原因它只是不想工作。即使我简单地将“测试”方法设置为返回 true,它也不起作用,因为测试器甚至从未加载过(我在其中设置了一些断点并且它们从未被击中)。我试过设置“forcePluginActivation='true'” 标记在 xml 中的测试,但这也不能补救这种情况。这是一些代码,将公司名称替换​​为“公司”,将产品替换为“产品”...

命令 XML

  <extension
         point="org.eclipse.ui.commands">
      <command
            categoryId="com.company.product.android.core.category2"
            id="com.company.product.android.core.commands.convertToProduct"
            name="Convert to product Android Project"
            description="The resources, jars and native library to begin developing an product for Android project application will be added to the Android project">
      </command>
      <category
            id="com.company.product.android.core.category2"
            name="Product Tools">
      </category>
   </extension>

处理程序 XML

   <extension
         point="org.eclipse.ui.handlers">
      <handler
            class="com.company.product.android.core.commands.ConvertToProduct"
            commandId="com.company.product.android.core.commands.convertToProduct">
        <enabledWhen>
            <reference
                definitionId="com.company.product.android.core.expressions.productProject">
            </reference>
        </enabledWhen>
      </handler>
   </extension>

定义 XML

  <extension>
        point="org.eclipse.core.expressions.definitions">
    <definition
        id="com.company.product.android.core.expressions.androidProjectNature">
        <with variable="selection">
            <iterate ifEmpty="false">
                <test
                    property="org.eclipse.core.resources.projectNature"
                    value="com.android.ide.eclipse.adt.AndroidNature">
                </test>
            </iterate>
        </with>
    </definition>
    <definition
        id="com.company.product.android.core.expressions.productProject">
        <with variable="selection">
            <iterate ifEmpty="false">
                <test
                    property="com.company.product.android.expressions.productProjectProperty"
                    forcePluginActivation="true">
                </test>
            </iterate>
        </with>
    </definition>
  </extension>

菜单 XML

   <extension
         point="org.eclipse.ui.menus">
      <menuContribution
         locationURI="popup:org.eclipse.ui.navigator.ProjectExplorer#PopupMenu?after=additions">
        <menu
               icon="icons/wht_ws.gif"
               id="com.company.product.android.core.tools"
               label="Product Tools">
            <visibleWhen>
                <reference 
                    definitionId="com.company.product.android.core.expressions.androidProjectNature">
                </reference>
            </visibleWhen>              
            <command
                commandId="com.company.product.android.core.commands.convertToProduct"
                label="Convert to Product Android Project"
                tooltip="The resources, jars and native library to begin developing an product for Android project application will be added to the Android project.">
            </command>
         </menu>
      </menuContribution>
   </extension>

属性测试器 XML

  <extension
    point="org.eclipse.core.expressions.propertyTesters">
    <propertyTester
        class="com.company.product.android.core.expressions.ProductProjectTester"
        id="com.company.product.android.core.expressions.productProjectTester"
        namespace="com.company.product.android.core.expressions"
        properties="productProjectProperty"
        type="java.lang.Object">
    </propertyTester>
  </extension>

属性测试器 Java

package com.company.product.android.core.expressions;

import org.eclipse.core.expressions.PropertyTester;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.ui.ISelectionService;
import org.eclipse.ui.PlatformUI;

import com.company.product.android.core.ProjectUtils;

public class ProductProjectTester extends PropertyTester {

    public ProductProjectTester() {
        System.out.println("I AM PRODUCT PROJECT TESTER, AND I HAVE BEEN CREATED");
    }

    @Override
    public boolean test(Object receiver, String property, Object[] args,
            Object expectedValue) {
        //IJavaProject project = null;
        //ISelectionService selectionService = 
        //    PlatformUI.getWorkbench().getActiveWorkbenchWindow().getSelectionService();
        //ISelection selection = selectionService.getSelection();
        //boolean enabled = ProjectUtils.isSingleProjectSelected(selection);
        System.out.println("I entered the test method");
        boolean enabled = false;

        System.out.println("The receiver is a " + receiver.getClass().toString());
        IJavaProject project = (IJavaProject)receiver;

        //if (enabled && selection instanceof StructuredSelection) {
            //project = ProjectUtils.getJavaProject();
            if (project != null) {
                enabled = ProjectUtils.hasNeedVersion(project)
                        && (!ProjectUtils.isProductAndroidProject(project.getProject()));

            }
        //}

        return enabled;
    }

}

对于 java 代码,我尝试了当前的实现以及注释掉的内容。我尝试了很多不同的变体,我在教程中看到了这些变体,这些变体适用于其他人,但不适用于我。消息永远不会打印到控制台,如果我在构造函数或测试方法中设置断点,它们永远不会被命中。请让我知道其他信息是否有用...

4

5 回答 5

2

我为我的项目使用 PropertyTester,它工作正常

在您的 DEFINITIONS XML 中您没有正确引用您的 PropertyTester 定义:

<definition
    id="com.company.product.android.core.expressions.productProject">
    <with variable="selection">
        <iterate ifEmpty="false">
            <test
               property="com.company.product.android.**core**.expressions.productProjectProperty"
                forcePluginActivation="true">
            </test>
        </iterate>
    </with>
</definition>

然后在您的 MENU.XML 中您应该引用正确的定义(productProject 而不是 androidProjectNature)

    <menu
           icon="icons/wht_ws.gif"
           id="com.company.product.android.core.tools"
           label="Product Tools">

<visibleWhen>
     <with variable="activeMenuSelection">
          <iterate ifEmpty="false">
               <reference
                     definitionId="com.company.product.android.core.expressions.productProject"/>
          </iterate>
     </with>
</visibleWhen>    

        <command
            commandId="com.company.product.android.core.commands.convertToProduct"
            label="Convert to Product Android Project"
            tooltip="The resources, jars and native library to begin developing an product for Android project application will be added to the Android project.">
        </command>
     </menu>

最后,您不需要 HANDLER.XML 中的 EnableWhen 标记

我希望这有帮助

于 2013-11-12T10:07:48.417 回答
1

好吧,经过 2 天的斗争,我无法让它以这种方式工作。我遵循了至少 10 个关于如何让自定义属性测试器工作的不同教程,但无济于事。我什至使用启动扩展点来强制插件提前加载。每当项目浏览器选择更改时,使用 SelectionChangedListener 从评估服务器请求更新。似乎没有什么能让自定义属性测试器工作。它根本不会加载属性测试器......他们永远不会被任何东西调用,尽管一切都说它设置得很好,并且完美地反映了我遵循的所有教程。

最终,我厌倦了尝试完成这项工作,并寻找替代方案。我最终发现的是:http ://blog.eclipse-tips.com/2009/02/commands-part-5-authentication-in-rcp.html

我实现了一个 SourceProvider 来拥有一个变量,该变量的值对应于不同的项目状态。然后我使用 , 并检查它是哪些可能的值。最后,当插件加载时,我将一个 SelectionChangedListener 连接到 PackageExplorer 的查看器,以便任何时候发生选择更改,然后重新评估逻辑并在需要时更改该变量。虽然这不是我想要的理想方式,但它有效,并且没有被弃用。我简直不能再浪费时间让属性测试人员工作了……

希望这对某人有所帮助!

于 2013-07-05T23:14:35.453 回答
0

我有一个类似的问题,但不知道 forcePluginActivation 的存在。所以我强制使用插件激活

/**
 * Necessary to have working menu right from the start
 */
public class Startup implements IStartup {
    @Override
    public void earlyStartup() {
    // this is necessary to have working menu right from the start
}
}

和这个扩展:

<extension point="org.eclipse.ui.startup">
    <startup
        class="com.example.package.Startup">
    </startup>
</extension>
于 2013-07-25T15:51:17.700 回答
0

我碰巧发现自己处于完全相同的情况:一切都经过精心配置(所以我确信并且我是真的,除了缺少一件事),但它仍然不会调用我的属性测试器。什么也没发生,没有日志。于是我开始调试到 Eclipse 3.7 运行环境的深渊,经过三个小时的耐心挖掘,发现了一个有点令人惊讶的错误:

java.lang.NoClassDefFoundError: org/eclipse/core/expressions/PropertyTester

不幸的是,它在 org.eclipse.core.internal.expressions 框架内的 TypeExtension 类中被提出后不久再次被吞没,没有任何日志,也没有给开发人员任何机会在没有调试的情况下发现错误,甚至没有使用 Eclipse启用调试日志。

但错误的性质很简单:包含我的属性测试器的插件缺少对 Eclipse 插件的依赖

org.eclipse.core.expressions

在将它作为必需的插件包含在内之后,它一切都无缝地工作了,属性测试器被调用并且上下文菜单正确显示。

因此,在尝试使您的属性测试器工作时,还要考虑您的插件的依赖关系。

希望这可以帮助。

于 2014-09-04T12:30:13.173 回答
0

我无法让 PropertyTesters 也能正常工作。最终放弃了他们并转向了 SourceProviders。关于如何在这里实现它们的好文章:

如何在使用 SourceProvider 的情况下启用和禁用菜单项(eclipse rcp Indigo 3.7)

于 2015-10-10T00:32:56.263 回答