Как ограничить видимость всплывающего меню только определенным типом проекта? - PullRequest
2 голосов
/ 13 августа 2011

Я использую menuContributions + popup, чтобы показать контекстное меню в моем plugin.xml.Мне нужно ограничить его видимость только

  1. определенным типом проекта (например, Dynamic Web Project) (меню должно появиться при щелчке правой кнопкой мыши только по родительской папке проекта) и
  2. определенной папкой(например, веб-контент) и его подпапок в структуре папок проекта.

Мне удалось в некоторой степени выполнить условие 1) с помощью

<menuContribution locationURI="popup:common.new.menu?after=additions">
            <command
                label="Web Wiz"
                commandId="commandId"
                icon="icons/sample.gif">
               <visibleWhen>
                  <with  variable="selection">
                            <iterate ifEmpty="false"
                        operator="or">
                     <instanceof
                           value="org.eclipse.core.resources.IProject"/>
                  </iterate>
                  </with>
               </visibleWhen>
            </command>
        </menuContribution>

, но оно появляетсядля всех видов проектов ... Мне нужно ограничить его только Динамический веб-проект , так что я должен добавить, чтобы удовлетворить это требование в plugin.xml?

Ответы [ 3 ]

4 голосов
/ 13 августа 2011
  1. Добавьте propertyTester, который будет проверять тип вашего проекта.
  2. Используйте этот тестер в visibleWhen

Вы можете прочитать о property-tester в справке по eclipse, илив самом расширении справки:)

РЕДАКТИРОВАТЬ - Проверьте это тоже - http://wiki.eclipse.org/Command_Core_Expressions#Property_Testers (особенно ResourcePropertyTester, который может предоставить вам встроенную реализацию, которую вы можете использовать)

3 голосов
/ 28 июня 2013
<menuContribution locationURI="popup:common.new.menu?after=additions">
  <command
            label="Web Wiz"
            commandId="commandId"
            icon="icons/sample.gif">
    <visibleWhen>
      <with variable="selection">
        <iterate operator="and" ifEmpty="false">
           <test 
                  property="org.eclipse.core.resources.projectNature" 
                  value="your-project-nature" />
        </iterate>
     </with>
    </visibleWhen>
</command>
<menuContribution>
2 голосов
/ 14 августа 2011

Для второго условия:

<test   forcePluginActivation="true"
            property="testWizard.propertyTester.checkFolder"
             value="org.eclipse.wst.jsdt.core.jsNature"
     </test> 

является ссылкой на тестер свойств, который можно определить как


<extension
        point="org.eclipse.core.expressions.propertyTesters">
     <propertyTester          
        class="testwizard.wizards.MyPropTester"
           id="MyPropTesterFolder"
           namespace="testWizard.propertyTester"
           properties="checkFolder"
           type="org.eclipse.core.resources.IFolder">
     </propertyTester>

тогда тип папки и ее подпапок можно проверить, как показано ниже в

package testwizard.wizards;

import org.eclipse.core.expressions.PropertyTester;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.runtime.CoreException;

public class MyPropTester extends PropertyTester{

    @Override
    public boolean test(Object receiver, String property, Object[] args,
            Object expectedValue) {

        IFolder folder=(IFolder)receiver;
        String folderPath=folder.getProjectRelativePath().toString();
        String arr[]=folderPath.split("/");     
        try {
            if(folder.getProject().hasNature(expectedValue.toString()))
            {
                if(arr[0].equals("XYZ"))
                {
                    return true;
                }
            }
        } catch (CoreException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return false;
    }

}
...