/** * Copyright (c) 2005-2011 by Appcelerator, Inc. All Rights Reserved. * Licensed under the terms of the Eclipse Public License (EPL). * Please see the license.txt included with this distribution for details. * Any modifications to this file must keep this entire header intact. */ package org.python.pydev.navigator.elements; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.core.expressions.PropertyTester; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExtension; import org.eclipse.ui.IActionFilter; import org.python.pydev.core.ExtensionHelper; import org.python.pydev.core.log.Log; /** * This class was created to forward the action filter checks to the property testers available in the * customizations plugin (needed to test the app_engine property in the action filter -- to be consistent * with the Eclipse 3.2 way of adding popup menus). * * If we do drop support for eclipse 3.2, this class should probably be removed. */ public class PythonSourceFolderActionFilter implements IActionFilter { private static Map<String, List<PropertyTester>> propertyTesters = new HashMap<String, List<PropertyTester>>(); private final IActionFilter platformActionFilter; public PythonSourceFolderActionFilter(IActionFilter platformActionFilter) { this.platformActionFilter = platformActionFilter; } /** * Adds a way to check for the app_engine (currently hardcoded) property from this plugin. */ public boolean testAttribute(Object target, String name, String value) { //For now let's leave it checking only app_engine, but this could grow if needed. if ("app_engine".equals(name)) { List<PropertyTester> propertyTesters = getPropertyTestersFromPydevCustomizations(name); for (PropertyTester tester : propertyTesters) { if (tester.test(target, name, null, value)) { return true; } } } //If we didn't find what we were looking for, use the platform action filter if (this.platformActionFilter != null) { return this.platformActionFilter.testAttribute(target, name, value); } //if the platform didn't provide it, just return false. return false; } /** * Cache them after the 1st request for a given name. * * Gets the property testers in org.python.pydev.customizations that match the passed name. */ private static synchronized List<PropertyTester> getPropertyTestersFromPydevCustomizations(String name) { List<PropertyTester> propertyTester = propertyTesters.get(name); if (propertyTester == null) { IExtension[] extensions = ExtensionHelper.getExtensions("org.eclipse.core.expressions.propertyTesters"); // For each extension ... propertyTester = new ArrayList<PropertyTester>(); propertyTesters.put(name, propertyTester); for (int i = 0; i < extensions.length; i++) { IExtension extension = extensions[i]; IConfigurationElement[] elements = extension.getConfigurationElements(); // For each member of the extension ... for (int j = 0; j < elements.length; j++) { IConfigurationElement element = elements[j]; //Any property tester that's declared in "org.python.pydev.customizations" //is considered to be an object that provides the objectState for an IActionFilter. if ("org.python.pydev.customizations".equals(element.getAttribute("namespace"))) { String attribute = element.getAttribute("properties"); if (name.equals(attribute)) {//i.e.: app_engine (and future references) try { PropertyTester executableExtension = (PropertyTester) element .createExecutableExtension("class"); propertyTester.add(executableExtension); } catch (Exception e) { Log.log(e); } } } } } } return propertyTester; } }