/**
* 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.
*/
/*
* Created on 23/07/2005
*/
package com.python.pydev.analysis.ui;
import org.eclipse.core.resources.IMarker;
import org.eclipse.jface.preference.BooleanFieldEditor;
import org.eclipse.jface.preference.FieldEditorPreferencePage;
import org.eclipse.jface.preference.FileFieldEditor;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.RadioGroupFieldEditor;
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.swt.widgets.Text;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.python.pydev.debug.ui.launching.PythonRunnerConfig;
import org.python.pydev.utils.LabelFieldEditor;
import org.python.pydev.utils.LinkFieldEditor;
import com.python.pydev.analysis.AnalysisPlugin;
import com.python.pydev.analysis.AnalysisPreferenceInitializer;
import com.python.pydev.analysis.IAnalysisPreferences;
public class AnalysisPreferencesPage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage {
public static final String USE_PEP8_CONSOLE = "USE_PEP8_CONSOLE";
public static final String PEP8_FILE_LOCATION = "PEP8_FILE_LOCATION";
public static final String PEP8_COMMAND_LINE = "PEP8_IGNORE_WARNINGS";
public AnalysisPreferencesPage() {
super(FLAT);
setDescription("PyDev Analysis");
setPreferenceStore(null);
}
@Override
protected IPreferenceStore doGetPreferenceStore() {
return AnalysisPlugin.getDefault().getPreferenceStore();
}
@Override
public void createFieldEditors() {
Composite p = getFieldEditorParent();
addField(new LabelFieldEditor(
"Analysis_pref_note",
"NOTE: Any file with the comment below will not be analyzed.\n\n#@PydevCodeAnalysisIgnore\n\nOptions:\n\n",
p));
TabFolder tabFolder = new TabFolder(p, SWT.NONE);
tabFolder.setLayoutData(new GridData(GridData.FILL_BOTH));
p = createTab(tabFolder, "Options");
String[][] whenAnalyze = new String[][] {
{ "Only on save", String.valueOf(IAnalysisPreferences.ANALYZE_ON_SAVE) },
{ "On any successful parse", String.valueOf(IAnalysisPreferences.ANALYZE_ON_SUCCESFUL_PARSE) } };
addField(new BooleanFieldEditor(AnalysisPreferenceInitializer.DO_CODE_ANALYSIS, "Do code analysis?",
BooleanFieldEditor.DEFAULT, p));
addField(new RadioGroupFieldEditor(AnalysisPreferenceInitializer.WHEN_ANALYZE, "When do we analyze?", 2,
whenAnalyze, p, true));
String[][] values = new String[][] { { "Error", String.valueOf(IMarker.SEVERITY_ERROR) },
{ "Warning", String.valueOf(IMarker.SEVERITY_WARNING) },
{ "Ignore", String.valueOf(IMarker.SEVERITY_INFO) } };
p = createTab(tabFolder, "Unused");
addField(new RadioGroupFieldEditor(AnalysisPreferenceInitializer.SEVERITY_UNUSED_IMPORT, "Unused import", 3,
values, p, true));
addField(new RadioGroupFieldEditor(AnalysisPreferenceInitializer.SEVERITY_UNUSED_WILD_IMPORT,
"Unused wild import", 3, 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",
3, values, p, true));
addField(new RadioGroupFieldEditor(AnalysisPreferenceInitializer.SEVERITY_UNUSED_VARIABLE, "Unused variable",
3, 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", 3, values, p, true));
addField(new RadioGroupFieldEditor(AnalysisPreferenceInitializer.SEVERITY_UNDEFINED_IMPORT_VARIABLE,
"Undefined variable from import", 3, values, p, true));
p = createTab(tabFolder, "Imports");
addField(new RadioGroupFieldEditor(AnalysisPreferenceInitializer.SEVERITY_REIMPORT, "Import redefinition", 3,
values, p, true));
addField(new RadioGroupFieldEditor(AnalysisPreferenceInitializer.SEVERITY_UNRESOLVED_IMPORT,
"Import not found", 3, values, p, true));
p = createTab(tabFolder, "Others");
addField(new RadioGroupFieldEditor(AnalysisPreferenceInitializer.SEVERITY_DUPLICATED_SIGNATURE,
"Duplicated signature", 3, values, p, true));
addField(new RadioGroupFieldEditor(AnalysisPreferenceInitializer.SEVERITY_NO_SELF,
"'self' not specified in class method", 3, values, p, true));
addField(new RadioGroupFieldEditor(AnalysisPreferenceInitializer.SEVERITY_NO_EFFECT_STMT,
"Statement has no effect", 3, values, p, true));
addField(new RadioGroupFieldEditor(AnalysisPreferenceInitializer.SEVERITY_INDENTATION_PROBLEM,
"Indentation problems and mixing of tabs/spaces", 3, values, p, true));
addField(new RadioGroupFieldEditor(AnalysisPreferenceInitializer.SEVERITY_ASSIGNMENT_TO_BUILT_IN_SYMBOL,
"Redefinition of builtin symbols", 3, values, p, true));
//TODO: Add ARGUMENTS_MISMATCH again later on
//addField(new RadioGroupFieldEditor(AnalysisPreferenceInitializer.SEVERITY_ARGUMENTS_MISMATCH, "Arguments mismatch", 3,values,p, true));
p = createTab(tabFolder, "pep8.py");
String[][] pep8values = new String[][] { { "Error", String.valueOf(IMarker.SEVERITY_ERROR) },
{ "Warning", String.valueOf(IMarker.SEVERITY_WARNING) },
{ "Don't run", String.valueOf(IMarker.SEVERITY_INFO) } };
addField(new RadioGroupFieldEditor(AnalysisPreferenceInitializer.SEVERITY_PEP8, "Pep8", 3, pep8values, p, true) {
protected void doFillIntoGrid(Composite parent, int numColumns) {
super.doFillIntoGrid(parent, 3);
adjustForNumColumns(3);
}
});
addField(new BooleanFieldEditor(USE_PEP8_CONSOLE, "Redirect pep8 output to console?", p) {
protected void doFillIntoGrid(Composite parent, int numColumns) {
super.doFillIntoGrid(parent, 3);
adjustForNumColumns(3);
}
});
addField(new LinkFieldEditor(PEP8_COMMAND_LINE,
"Additional command line arguments (i.e.: --ignore=E5,W391). See <a>pep8 docs</a> for details.", p,
new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
Program.launch("http://pypi.python.org/pypi/pep8");
}
public void widgetDefaultSelected(SelectionEvent e) {
}
}) {
protected void doFillIntoGrid(Composite parent, int numColumns) {
numColumns = 3;
Link linkControl = getLinkControl(parent);
Object layoutData = linkControl.getLayoutData();
if (layoutData == null) {
layoutData = new GridData();
linkControl.setLayoutData(layoutData);
}
((GridData) layoutData).horizontalSpan = numColumns;
adjustForNumColumns(3);
}
});
addField(new StringFieldEditor(PEP8_COMMAND_LINE, "Arguments: ", p) {
protected void doFillIntoGrid(Composite parent, int numColumns) {
super.doFillIntoGrid(parent, 3);
adjustForNumColumns(3);
}
});
addField(new FileFieldEditor(PEP8_FILE_LOCATION, "Location of pep8.py", true, p) {
@Override
protected void doFillIntoGrid(Composite parent, int numColumns) {
super.doFillIntoGrid(parent, numColumns);
Text textField = getTextControl();
GridData gd = (GridData) textField.getLayoutData();
gd.grabExcessHorizontalSpace = true;
gd.horizontalAlignment = SWT.FILL;
gd.widthHint = 50;
}
@Override
public int getNumberOfControls() {
return 3;
}
});
}
/**
* @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;
}
public void init(IWorkbench workbench) {
}
public static String getPep8Location() {
return AnalysisPlugin.getDefault().getPreferenceStore().getString(PEP8_FILE_LOCATION);
}
public static String[] getPep8CommandLine() {
return PythonRunnerConfig.parseStringIntoList(AnalysisPlugin.getDefault().getPreferenceStore()
.getString(PEP8_COMMAND_LINE));
}
public static boolean useConsole() {
return AnalysisPlugin.getDefault().getPreferenceStore().getBoolean(USE_PEP8_CONSOLE);
}
}