studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones java eclipse eclipse-plugin

java - para - manual de programacion android pdf



Cómo verificar si el proyecto contiene un archivo específico para accesos directos de lanzamiento (1)

Básicamente, quiero habilitar mis LaunchShortcuts solo cuando el proyecto tiene una naturaleza específica y contiene un archivo específico . La naturaleza del proyecto no es un problema. Sin embargo, no puedo averiguar cómo verificar si el proyecto contiene un archivo específico. De lejos, tengo el siguiente código en el plugin.xml :

<contextualLaunch> <enablement> <with variable="selection"> <count value="1"/> <iterate> <adapt type="org.eclipse.core.resources.IResource"> <test property="org.eclipse.core.resources.projectNature" value="my.project.nature" /> </adapt> </iterate> </with> </enablement> </contextualLaunch>

¿Es posible verificar si un proyecto contiene un archivo específico?

ACTUALIZADO:

@ greg-449 me dio una gran pista en el comentario 1 a continuación sobre el uso de org.eclipse.core.expressions.propertyTesters personalizado. Entonces, ahora mi código se ve así:

. . . <extension point="org.eclipse.core.expressions.propertyTesters"> <propertyTester id="my.tester" type="org.eclipse.core.resources.IResource" namespace="my.namespace" properties="myProperty" class="my.MyTester"> </propertyTester> </extension> . . . <contextualLaunch> <enablement> <with variable="selection"> <count value="1"/> <iterate> <adapt type="org.eclipse.core.resources.IResource"> <and> <test property="org.eclipse.core.resources.projectNature" value="my.project.nature" /> <test property="my.namespace.myProperty" value="true"/> </and> </adapt> </iterate> </with> </enablement> </contextualLaunch>

Aquí está el código de MyTester :

public class MyTester extends PropertyTester { private static final String PROPERTY_NAME = "myProperty"; @Override public boolean test(Object receiver, String property, Object[] arg2, Object expectedValue) { if (property.equals(PROPERTY_NAME) && receiver instanceof IProject) { return FileUtil.containsSpecificFile((IProject) receiver); } return false; } }

Pero este enfoque no parece funcionar. Al depurar MyTester.test () nunca se llama. ¿Algunas ideas?


El truco se combina con el uso de forcePluginActivation . Esto define que el Plug-in que define el probador de propiedad debe estar activado. Si no está activado, la prueba de propiedad no se puede realizar. Por lo tanto, la versión final del código debe parecer poco. Me gusta esto:

<contextualLaunch> <enablement> <with variable="selection"> <count value="1"/> <iterate> <adapt type="org.eclipse.core.resources.IResource"> <and> <test property="org.eclipse.core.resources.projectNature" value="my.project.nature" /> <test property="my.namespace.myProperty" forcePluginActivation="true"/> </and> </adapt> </iterate> </with> </enablement> </contextualLaunch>

NOTA: Citando la documentación ,

forcePluginActivation - a flag indicating whether the plug-in contributing the property tester should be loaded if necessary. As such, this flag should be used judiciously, in order to avoid unnecessary plug-in activations. Most clients should avoid setting this flag to true. This flag is only honored if the evaluation context used to evaluate this expression allows plug-in activation. Otherwise the flag is ignored and no plug-in loading takes place.