/**
* 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 Oct 26, 2004
*
* @author Fabio Zadrozny
*/
package org.python.pydev.builder.pylint;
import java.io.File;
import org.eclipse.core.resources.IMarker;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.preference.BooleanFieldEditor;
import org.eclipse.jface.preference.FieldEditor;
import org.eclipse.jface.preference.FieldEditorPreferencePage;
import org.eclipse.jface.preference.FileFieldEditor;
import org.eclipse.jface.preference.IntegerFieldEditor;
import org.eclipse.jface.preference.RadioGroupFieldEditor;
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.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.python.pydev.core.log.Log;
import org.python.pydev.plugin.PydevPlugin;
import org.python.pydev.plugin.preferences.PydevPrefs;
import org.python.pydev.utils.CustomizableFieldEditor;
import org.python.pydev.utils.LabelFieldEditor;
/**
* @author Fabio Zadrozny
*/
public class PyLintPrefPage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage {
public static final String PYLINT_FILE_LOCATION = "PYLINT_FILE_LOCATION";
public static final String USE_PYLINT = "USE_PYLINT";
public static final boolean DEFAULT_USE_PYLINT = false;
public static final int SEVERITY_IGNORE = -1;
public static final int COLS = 4;
public static final String[][] LABEL_AND_VALUE = new String[][] {
{ "Error", String.valueOf(IMarker.SEVERITY_ERROR) },
{ "Warning", String.valueOf(IMarker.SEVERITY_WARNING) }, { "Info", String.valueOf(IMarker.SEVERITY_INFO) },
{ "Ignore", String.valueOf(SEVERITY_IGNORE) }, };
// errors
public static final String SEVERITY_ERRORS = "SEVERITY_ERRORS";
public static final int DEFAULT_SEVERITY_ERRORS = IMarker.SEVERITY_ERROR;
//warnings
public static final String SEVERITY_WARNINGS = "SEVERITY_WARNINGS";
public static final int DEFAULT_SEVERITY_WARNINGS = IMarker.SEVERITY_WARNING;
//fatal
public static final String SEVERITY_FATAL = "SEVERITY_FATAL";
public static final int DEFAULT_SEVERITY_FATAL = IMarker.SEVERITY_ERROR;
//coding std
public static final String SEVERITY_CODING_STANDARD = "SEVERITY_CODING_STANDARD";
public static final int DEFAULT_SEVERITY_CODING_STANDARD = SEVERITY_IGNORE;
//refactor
public static final String SEVERITY_REFACTOR = "SEVERITY_REFACTOR";
public static final int DEFAULT_SEVERITY_REFACTOR = SEVERITY_IGNORE;
//console
public static final String USE_CONSOLE = "USE_CONSOLE";
public static final boolean DEFAULT_USE_CONSOLE = true;
//args
public static final String PYLINT_ARGS = "PYLINT_ARGS";
public static final String DEFAULT_PYLINT_ARGS = "";
//delta
public static final String MAX_PYLINT_DELTA = "MAX_PYLINT_DELTA";
public static final int DEFAULT_MAX_PYLINT_DELTA = 4;
public PyLintPrefPage() {
super(FLAT);
setPreferenceStore(PydevPlugin.getDefault().getPreferenceStore());
setDescription("PyLint");
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.preference.FieldEditorPreferencePage#createFieldEditors()
*/
protected void createFieldEditors() {
final Composite p = getFieldEditorParent();
addField(new BooleanFieldEditor(USE_PYLINT, "Use pylint?", p));
addField(new BooleanFieldEditor(USE_CONSOLE, "Redirect PyLint output to console?", p));
addField(new IntegerFieldEditor(MAX_PYLINT_DELTA, "Max simultaneous processes for PyLint?", p));
FileFieldEditor fileField = new FileFieldEditor(PYLINT_FILE_LOCATION, "Location of pylint (lint.py):", true, p);
addField(fileField);
addField(new RadioGroupFieldEditor(SEVERITY_FATAL, "FATAL Severity", COLS, LABEL_AND_VALUE, p, true));
addField(new RadioGroupFieldEditor(SEVERITY_ERRORS, "ERRORS Severity", COLS, LABEL_AND_VALUE, p, true));
addField(new RadioGroupFieldEditor(SEVERITY_WARNINGS, "WARNINGS Severity", COLS, LABEL_AND_VALUE, p, true));
addField(new RadioGroupFieldEditor(SEVERITY_CODING_STANDARD, "CONVENTIONS Severity", COLS, LABEL_AND_VALUE, p,
true));
addField(new RadioGroupFieldEditor(SEVERITY_REFACTOR, "REFACTOR Severity", COLS, LABEL_AND_VALUE, p, true));
CustomizableFieldEditor stringFieldEditor = new CustomizableFieldEditor(PYLINT_ARGS,
"Arguments to pass to pylint (customize its output).\n"
+ "The --include-ids=y is always included and does not appear here..", p);
addField(stringFieldEditor);
String w = "";
Button button = new Button(p, SWT.NONE);
button.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
final String w = "\n\nTo ignore some warning on a line in a file, you can put the comment: \n" +
"#IGNORE:ID, so that the id is the warning that you want to ignore. \n" +
"E.g.: if you have the code:\n\n" +
"from foo import * #IGNORE:W0401\n\n" +
"The wildcard import will be ignored.\n\n" +
"NOTE:for warnings to appear in the problems view, you have\n" +
"to set your filter to accept the org.python.pydev.pylintproblem type!\n\n" +
"NOTE2: Make sure that your file is a valid module in the PYTHONPATH, because\n" +
"pylint doesn't analyze the file itself, but the module itself (you should\n" +
"be able to import it from python without giving the file path).";
MessageDialog.openInformation(p.getShell(), "Help", w);
}
public void widgetDefaultSelected(SelectionEvent e) {
}
});
button.setText("Click for help (ignoring errors and troubleshooting)");
GridData d = new GridData();
d.horizontalAlignment = GridData.FILL;
d.grabExcessHorizontalSpace = true;
button.setLayoutData(d);
FieldEditor fe = new LabelFieldEditor("Help", w, p);
addField(fe);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
*/
public void init(IWorkbench workbench) {
}
/**
* @return
*/
public static String getPyLintLocation() {
return PydevPrefs.getPreferences().getString(PYLINT_FILE_LOCATION);
}
private static boolean communicatedOnce = false;
/**
* should we use py lint?
*
* @return
*/
public static boolean usePyLint() {
boolean b = PydevPrefs.getPreferences().getBoolean(USE_PYLINT);
if (!isPyLintConfigured(PyLintPrefPage.getPyLintLocation())) {
if (b && !communicatedOnce) {
communicatedOnce = true;
Log.log("Unable to use pylint because it is not properly configured.");
}
return false;
}
return b;
}
/**
* Checks if location of pylint is properly configured.
*/
public static boolean isPyLintConfigured(String pylintLocation) {
File pylint = new File(pylintLocation);
if (!pylint.exists() && pylint.isFile()) {
return false;
}
return true;
}
public static boolean useErrors() {
return eSeverity() != SEVERITY_IGNORE;
}
public static boolean useWarnings() {
return wSeverity() != SEVERITY_IGNORE;
}
public static boolean useFatal() {
return fSeverity() != SEVERITY_IGNORE;
}
public static boolean useCodingStandard() {
return cSeverity() != SEVERITY_IGNORE;
}
public static boolean useRefactorTips() {
return rSeverity() != SEVERITY_IGNORE;
}
public static boolean useConsole() {
return PydevPrefs.getPreferences().getBoolean(USE_CONSOLE);
}
public static String getPyLintArgs() {
return PydevPrefs.getPreferences().getString(PYLINT_ARGS);
}
public static int getMaxPyLintDelta() {
return PydevPrefs.getPreferences().getInt(MAX_PYLINT_DELTA);
}
public static int wSeverity() {
return PydevPrefs.getPreferences().getInt(SEVERITY_WARNINGS);
}
public static int eSeverity() {
return PydevPrefs.getPreferences().getInt(SEVERITY_ERRORS);
}
public static int fSeverity() {
return PydevPrefs.getPreferences().getInt(SEVERITY_FATAL);
}
public static int cSeverity() {
return PydevPrefs.getPreferences().getInt(SEVERITY_CODING_STANDARD);
}
public static int rSeverity() {
return PydevPrefs.getPreferences().getInt(SEVERITY_REFACTOR);
}
}