/** * Copyright (c) 2005-2012 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.ui.filetypes; import java.util.List; import org.eclipse.jface.preference.FieldEditorPreferencePage; import org.eclipse.jface.preference.StringFieldEditor; import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPreferencePage; import org.python.pydev.plugin.PydevPlugin; import org.python.pydev.plugin.preferences.PydevPrefs; import org.python.pydev.shared_core.SharedCorePlugin; import org.python.pydev.shared_core.string.StringUtils; import org.python.pydev.shared_core.string.WrapAndCaseUtils; import org.python.pydev.utils.LabelFieldEditorWith2Cols; /** * Preferences regarding the python file types available. * * Also provides a better access to them and caches to make that access efficient. * * @author Fabio */ public class FileTypesPreferencesPage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage { public FileTypesPreferencesPage() { super(FLAT); setPreferenceStore(PydevPlugin.getDefault().getPreferenceStore()); setDescription("File Types Preferences"); } public static final String VALID_SOURCE_FILES = "VALID_SOURCE_FILES"; public final static String DEFAULT_VALID_SOURCE_FILES = "py, pyw, pyx, pxd, pxi"; public static final String FIRST_CHOICE_PYTHON_SOURCE_FILE = "FIRST_CHOICE_PYTHON_SOURCE_FILE"; public final static String DEFAULT_FIRST_CHOICE_PYTHON_SOURCE_FILE = "py"; @Override protected void createFieldEditors() { final Composite p = getFieldEditorParent(); addField(new LabelFieldEditorWith2Cols("Label_Info_File_Preferences1", WrapAndCaseUtils.wrap( "These setting are used to know which files should be considered valid internally, and are " + "not used in the file association of those files to the pydev editor.\n\n", 80), p) { @Override public String getLabelTextCol1() { return "Note:\n\n"; } }); addField(new LabelFieldEditorWith2Cols( "Label_Info_File_Preferences2", WrapAndCaseUtils .wrap("After changing those settings, a manual reconfiguration of the interpreter and a manual rebuild " + "of the projects may be needed to update the inner caches that may be affected by those changes.\n\n", 80), p) { @Override public String getLabelTextCol1() { return "Important:\n\n"; } }); addField(new StringFieldEditor(VALID_SOURCE_FILES, "Valid source files (comma-separated):", StringFieldEditor.UNLIMITED, p)); addField(new StringFieldEditor(FIRST_CHOICE_PYTHON_SOURCE_FILE, "Default python extension:", StringFieldEditor.UNLIMITED, p)); } @Override public void init(IWorkbench workbench) { // pass } /** * Helper to keep things cached as needed (so that we don't have to get it from the cache all the time. * * @author Fabio */ private static class PreferencesCacheHelper implements IPropertyChangeListener { private static PreferencesCacheHelper singleton; static synchronized PreferencesCacheHelper get() { if (singleton == null) { singleton = new PreferencesCacheHelper(); } return singleton; } public PreferencesCacheHelper() { PydevPrefs.getPreferences().addPropertyChangeListener(this); } @Override public void propertyChange(PropertyChangeEvent event) { this.wildcaldValidSourceFiles = null; this.dottedValidSourceFiles = null; this.pythondValidSourceFiles = null; this.pythonValidInitFiles = null; } //return new String[] { "*.py", "*.pyw" }; private String[] wildcaldValidSourceFiles; public String[] getCacheWildcardValidSourceFiles() { String[] ret = wildcaldValidSourceFiles; if (ret == null) { String[] validSourceFiles = this.getCacheValidSourceFiles(); String[] s = new String[validSourceFiles.length]; for (int i = 0; i < validSourceFiles.length; i++) { s[i] = "*." + validSourceFiles[i]; } wildcaldValidSourceFiles = s; ret = s; } return ret; } //return new String[] { ".py", ".pyw" }; private String[] dottedValidSourceFiles; public String[] getCacheDottedValidSourceFiles() { String[] ret = dottedValidSourceFiles; if (ret == null) { String[] validSourceFiles = this.getCacheValidSourceFiles(); String[] s = new String[validSourceFiles.length]; for (int i = 0; i < validSourceFiles.length; i++) { s[i] = "." + validSourceFiles[i]; } dottedValidSourceFiles = s; ret = s; } return ret; } //return new String[] { "py", "pyw" }; private String[] pythondValidSourceFiles; /** * __init__.py, __init__.pyw, etc... */ private String[] pythonValidInitFiles; public String[] getCacheValidInitFiles() { String[] ret = pythonValidInitFiles; if (ret == null) { String[] cacheValidSourceFiles = getCacheValidSourceFiles(); ret = new String[cacheValidSourceFiles.length]; for (int i = 0; i < ret.length; i++) { ret[i] = "__init__." + cacheValidSourceFiles[i]; } pythonValidInitFiles = ret; } return ret; } public String[] getCacheValidSourceFiles() { String[] ret = pythondValidSourceFiles; if (ret == null) { String validStr = PydevPrefs.getPreferences().getString(FileTypesPreferencesPage.VALID_SOURCE_FILES); final List<String> temp = StringUtils.splitAndRemoveEmptyTrimmed(validStr, ','); String[] s = temp.toArray(new String[temp.size()]); for (int i = 0; i < s.length; i++) { s[i] = s[i].trim(); } pythondValidSourceFiles = s; ret = s; } return ret; } } // public interface with the hardcoded settings -------------------------------------------------------------------- /** * @return true if the given filename should be considered a zip file. */ public static boolean isValidZipFile(String fileName) { return fileName.endsWith(".jar") || fileName.endsWith(".zip") || fileName.endsWith(".egg"); } /** * @param path the path we want to analyze * @return if the path passed belongs to a valid python compiled extension */ public static boolean isValidDll(String path) { if (path.endsWith(".pyd") || path.endsWith(".so") || path.endsWith(".dll") || path.endsWith(".a")) { return true; } return false; } /** * @param extension extension we want to analyze * @return if the extension passed belongs to a valid python compiled extension */ public static boolean isValidDllExtension(String extension) { if (extension.equals("pyd") || extension.equals("so") || extension.equals("dll") || extension.equals("a")) { return true; } return false; } public final static String getDefaultDottedPythonExtension() { return "." + PydevPrefs.getPreferences().getString(FIRST_CHOICE_PYTHON_SOURCE_FILE); } public static String[] getWildcardJythonValidZipFiles() { return new String[] { "*.jar", "*.zip" }; } public static String[] getWildcardPythonValidZipFiles() { return new String[] { "*.egg", "*.zip" }; } // items that are customizable -- things gotten from the cache ----------------------------------------------------- public static String[] getWildcardValidSourceFiles() { if (SharedCorePlugin.inTestMode()) { return new String[] { "*.py", "*.pyw", "*.pyx", "*.pxd", "*.pxi" }; } return PreferencesCacheHelper.get().getCacheWildcardValidSourceFiles(); } public final static String[] getDottedValidSourceFiles() { if (SharedCorePlugin.inTestMode()) { return new String[] { ".py", ".pyw", ".pyx", ".pxd", ".pxi" }; } return PreferencesCacheHelper.get().getCacheDottedValidSourceFiles(); } public final static String[] getValidSourceFiles() { if (SharedCorePlugin.inTestMode()) { return new String[] { "py", "pyw", "pyx", "pxd", "pxi" }; } return PreferencesCacheHelper.get().getCacheValidSourceFiles(); } public final static String[] getValidInitFiles() { if (SharedCorePlugin.inTestMode()) { return new String[] { "__init__.py", "__init__.pyw", "__init__.pyx", "__init__.pxd", "__init__.pxi" }; } return PreferencesCacheHelper.get().getCacheValidInitFiles(); } public static boolean isCythonFile(String name) { return name != null && (name.endsWith(".pyx") || name.endsWith(".pxd") || name.endsWith(".pxi")); } }