/** * Copyright (c) 2005-2013 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. */ /* * Created on 23/07/2005 */ package com.python.pydev.analysis.ui; import org.eclipse.core.resources.IMarker; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.jface.preference.BooleanFieldEditor; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.preference.StringFieldEditor; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.program.Program; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Link; import org.eclipse.swt.widgets.TabFolder; import org.eclipse.swt.widgets.TabItem; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPreferencePage; import org.python.pydev.debug.ui.launching.PythonRunnerConfig; import org.python.pydev.shared_ui.field_editors.LabelFieldEditor; import org.python.pydev.shared_ui.field_editors.LinkFieldEditor; import org.python.pydev.shared_ui.field_editors.RadioGroupFieldEditor; import org.python.pydev.shared_ui.field_editors.ScopedFieldEditorPreferencePage; import org.python.pydev.shared_ui.field_editors.ScopedPreferencesFieldEditor; import com.python.pydev.analysis.AnalysisPlugin; import com.python.pydev.analysis.AnalysisPreferenceInitializer; import com.python.pydev.analysis.PyAnalysisScopedPreferences; public class AnalysisPreferencesPage extends ScopedFieldEditorPreferencePage implements IWorkbenchPreferencePage { public static final String USE_PEP8_CONSOLE = "USE_PEP8_CONSOLE"; public static final boolean DEFAULT_USE_PEP8_CONSOLE = false; public static final String PEP8_COMMAND_LINE = "PEP8_IGNORE_WARNINGS"; public static final String PEP8_USE_SYSTEM = "PEP8_USE_SYSTEM"; public static final boolean DEFAULT_PEP8_USE_SYSTEM = false; //Disabled because we're running in a thread now. public static final boolean SHOW_IN_PEP8_FEATURE_ENABLED = false; public AnalysisPreferencesPage() { super(FLAT); setDescription("PyDev Analysis"); setPreferenceStore(null); } @Override protected IPreferenceStore doGetPreferenceStore() { return AnalysisPlugin.getDefault().getPreferenceStore(); } @Override public void createFieldEditors() { final Composite initialParent = getFieldEditorParent(); Composite p = initialParent; addField(new LabelFieldEditor( "Analysis_pref_note", "NOTE: Any file with the comment below will not be analyzed.\n\n#@PydevCodeAnalysisIgnore\n\n", p)); BooleanFieldEditor field = new BooleanFieldEditor(AnalysisPreferenceInitializer.DO_CODE_ANALYSIS, "Do code analysis?", BooleanFieldEditor.DEFAULT, p); addField(field); TabFolder tabFolder = new TabFolder(p, SWT.NONE); tabFolder.setLayoutData(new GridData(GridData.FILL_BOTH)); String[][] values = new String[][] { { "Error", String.valueOf(IMarker.SEVERITY_ERROR) }, { "Warning", String.valueOf(IMarker.SEVERITY_WARNING) }, { "Info", String.valueOf(IMarker.SEVERITY_INFO) }, { "Ignore", String.valueOf(-1) } }; p = createTab(tabFolder, "Unused"); addField(new RadioGroupFieldEditor(AnalysisPreferenceInitializer.SEVERITY_UNUSED_IMPORT, "Unused import", 4, values, p, true)); addField(new RadioGroupFieldEditor(AnalysisPreferenceInitializer.SEVERITY_UNUSED_WILD_IMPORT, "Unused wild import", 4, values, p, true)); addField(new StringFieldEditor(AnalysisPreferenceInitializer.NAMES_TO_IGNORE_UNUSED_IMPORT, "Don't report unused imports in modules named: (comma separated)", p)); addField(new RadioGroupFieldEditor(AnalysisPreferenceInitializer.SEVERITY_UNUSED_PARAMETER, "Unused parameter", 4, values, p, true)); addField(new RadioGroupFieldEditor(AnalysisPreferenceInitializer.SEVERITY_UNUSED_VARIABLE, "Unused variable", 4, values, p, true)); addField(new StringFieldEditor(AnalysisPreferenceInitializer.NAMES_TO_IGNORE_UNUSED_VARIABLE, "Don't report unused variable if name starts with: (comma separated)", p) { @Override public int getNumberOfControls() { return 1; } }); p = createTab(tabFolder, "Undefined"); addField(new StringFieldEditor(AnalysisPreferenceInitializer.NAMES_TO_CONSIDER_GLOBALS, "Consider the following names as globals: (comma separated)", p)); addField(new RadioGroupFieldEditor(AnalysisPreferenceInitializer.SEVERITY_UNDEFINED_VARIABLE, "Undefined variable", 4, values, p, true)); addField(new RadioGroupFieldEditor(AnalysisPreferenceInitializer.SEVERITY_UNDEFINED_IMPORT_VARIABLE, "Undefined variable from import", 4, values, p, true)); p = createTab(tabFolder, "Imports"); addField(new RadioGroupFieldEditor(AnalysisPreferenceInitializer.SEVERITY_REIMPORT, "Import redefinition", 4, values, p, true)); addField(new RadioGroupFieldEditor(AnalysisPreferenceInitializer.SEVERITY_UNRESOLVED_IMPORT, "Import not found", 4, values, p, true)); p = createTab(tabFolder, "Others"); addField(new RadioGroupFieldEditor(AnalysisPreferenceInitializer.SEVERITY_DUPLICATED_SIGNATURE, "Duplicated signature", 4, values, p, true)); addField(new RadioGroupFieldEditor(AnalysisPreferenceInitializer.SEVERITY_NO_SELF, "'self' not specified in class method", 4, values, p, true)); addField(new RadioGroupFieldEditor(AnalysisPreferenceInitializer.SEVERITY_NO_EFFECT_STMT, "Statement has no effect", 4, values, p, true)); addField(new RadioGroupFieldEditor(AnalysisPreferenceInitializer.SEVERITY_INDENTATION_PROBLEM, "Indentation problems and mixing of tabs/spaces", 4, values, p, true)); addField(new RadioGroupFieldEditor(AnalysisPreferenceInitializer.SEVERITY_ASSIGNMENT_TO_BUILT_IN_SYMBOL, "Redefinition of builtin symbols", 4, values, p, true)); //TODO: Add ARGUMENTS_MISMATCH again later on //addField(new RadioGroupFieldEditor(AnalysisPreferenceInitializer.SEVERITY_ARGUMENTS_MISMATCH, "Arguments mismatch", 4,values,p, true)); p = createTab(tabFolder, "pycodestyle.py (pep8)"); String[][] pep8values = new String[][] { { "Error", String.valueOf(IMarker.SEVERITY_ERROR) }, { "Warning", String.valueOf(IMarker.SEVERITY_WARNING) }, { "Info", String.valueOf(IMarker.SEVERITY_INFO) }, { "Don't run", String.valueOf(-1) } }; addField( new RadioGroupFieldEditor(AnalysisPreferenceInitializer.SEVERITY_PEP8, "Pep8", 4, pep8values, p, true) { @Override protected void doFillIntoGrid(Composite parent, int numColumns) { super.doFillIntoGrid(parent, 4); adjustForNumColumns(4); } }); if (SHOW_IN_PEP8_FEATURE_ENABLED) { addField(new BooleanFieldEditor(USE_PEP8_CONSOLE, "Redirect pycodestyle output to console?", p) { @Override protected void doFillIntoGrid(Composite parent, int numColumns) { super.doFillIntoGrid(parent, 4); adjustForNumColumns(4); } }); } addField(new BooleanFieldEditor(PEP8_USE_SYSTEM, "Use system interpreter (may be faster than internal Jython)", p) { @Override protected void doFillIntoGrid(Composite parent, int numColumns) { super.doFillIntoGrid(parent, 4); adjustForNumColumns(4); } }); addField(new LinkFieldEditor(PEP8_COMMAND_LINE, "Additional command line arguments (i.e.: --ignore=E5,W391). See <a>pycodestyle docs</a> for details.", p, new SelectionListener() { @Override public void widgetSelected(SelectionEvent e) { Program.launch("https://pycodestyle.readthedocs.io/"); } @Override public void widgetDefaultSelected(SelectionEvent e) { } }) { @Override protected void doFillIntoGrid(Composite parent, int numColumns) { numColumns = 4; Link linkControl = getLinkControl(parent); Object layoutData = linkControl.getLayoutData(); if (layoutData == null) { layoutData = new GridData(); linkControl.setLayoutData(layoutData); } ((GridData) layoutData).horizontalSpan = numColumns; adjustForNumColumns(4); } }); addField(new StringFieldEditor(PEP8_COMMAND_LINE, "Arguments: ", p) { @Override protected void doFillIntoGrid(Composite parent, int numColumns) { super.doFillIntoGrid(parent, 4); adjustForNumColumns(4); } }); addField(new ScopedPreferencesFieldEditor(initialParent, PyAnalysisScopedPreferences.ANALYSIS_SCOPE, this)); } /** * @param tabFolder * @return */ private Composite createTab(TabFolder tabFolder, String tabText) { TabItem item1 = new TabItem(tabFolder, SWT.NULL); item1.setText(tabText); Composite p1 = new Composite(tabFolder, SWT.NONE); p1.setLayoutData(new GridData(GridData.FILL_BOTH)); item1.setControl(p1); return p1; } @Override public void init(IWorkbench workbench) { } public static String[] getPep8CommandLine(IAdaptable projectAdaptable) { return PythonRunnerConfig.parseStringIntoList(getPep8CommandLineAsStr(projectAdaptable)); } public static String getPep8CommandLineAsStr(IAdaptable projectAdaptable) { return PyAnalysisScopedPreferences.getString(PEP8_COMMAND_LINE, projectAdaptable); } public static boolean useConsole(IAdaptable projectAdaptable) { if (SHOW_IN_PEP8_FEATURE_ENABLED) { return PyAnalysisScopedPreferences.getBoolean(USE_PEP8_CONSOLE, projectAdaptable); } return false; } public static boolean useSystemInterpreter(IAdaptable projectAdaptable) { return PyAnalysisScopedPreferences.getBoolean(PEP8_USE_SYSTEM, projectAdaptable); } }