尽管使用forcePluginActivation,属性测试人员仍无法加载。用于弹出菜单启用

时间:2013-07-03 22:13:30

标签: popup eclipse-plugin popupmenu

我负责重构公司Eclipse插件中的弹出菜单,以使用新命令/处理程序/菜单扩展点方案。当某些菜单项应该启用或不启用时,我们有一些业务逻辑,这是通过它们应用于操作的SelectionListener的onSelectionChanged方法处理的。我现在尝试使用自定义PropertyTester控制启用,但似乎我的自定义PropertyTesters没有被加载。我已经关注了Eclipse的doc以及我在网上找到的任何教程,并且由于某种原因它只是不想工作。即使我只是将“test”方法设置为返回true,它也不起作用,因为测试器从未被加载(我抛出一些断点并且它们永远不会被击中)。我已经尝试在xml的测试中设置“forcePluginActivation ='true'”标志,但这也无法解决问题。这是一些代码,公司名称由“company”替换,产品由“product”替换......

COMMAND 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>

HANDLER 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>

MENU 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>

PROPERTY TESTER 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>

PROPERTY TESTER 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代码,我尝试了当前的实现以及注释掉的内容。我已经尝试了很多不同的变体,我在教程中看到这些变体对其他人有用但不是我。消息永远不会打印到控制台,如果我在构造函数或测试方法中设置断点,它们永远不会被命中。如果有其他信息有用,请告诉我。

5 个答案:

答案 0 :(得分: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标记

我希望这会有所帮助

答案 1 :(得分:1)

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

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

我实现了一个SourceProvider,使变量的值与不同的项目状态相对应。然后我使用,并检查它是哪个可能的值。最后,当插件加载时,我将SelectionChangedListener挂钩到PackageExplorer的查看器,这样每当选择发生更改时,都会重新评估逻辑,并在需要时更改该变量。虽然这不是我想要做的理想方式,但它有效,而且不会弃用。我简直无法浪费更多时间让房产测试人员上班......

希望这有助于某人!

答案 2 :(得分: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>

答案 3 :(得分:0)

我碰巧发现自己处于完全相同的情况:一切都严格按照细节进行配置(所以我确信并且除了一件事之外我是真的),仍然不会叫我的房产测试员。什么都没发生,没有记录。所以我开始调试Eclipse 3.7运行时环境的深渊,经过三个小时的耐心挖掘后发现了一个有点令人惊讶的错误:

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

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

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

org.eclipse.core.expressions

将其作为必需的插件包含后,它全部无缝地工作,调用属性测试器并正确显示上下文菜单。

在尝试让您的房产测试人员工作时,请考虑您的插件的依赖关系。

希望这有帮助。

答案 4 :(得分:0)

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

How to enable and disable menu items upon condition with using SourceProvider (eclipse rcp Indigo 3.7)