From 844fdc4afa1912adb22ab1be5d5c8d5cb8715d29 Mon Sep 17 00:00:00 2001 From: Csaba Sulyok Date: Sun, 17 Feb 2013 19:44:03 +0100 Subject: [PATCH] Add preference page and popup item to set custom XML ruleset file. --- plugin/plugin.xml | 27 +++++++++++ .../codenarc/eclipse/RuleSetProvider.groovy | 28 +++++++++++ .../codenarc/eclipse/SelectionUtils.groovy | 12 ++++- .../codenarc/eclipse/jobs/CheckCodeJob.groovy | 2 +- .../eclipse/jobs/SetConfigFileJob.groovy | 48 +++++++++++++++++++ .../popup/actions/SetConfigFileAction.groovy | 32 +++++++++++++ .../CodeNarcPreferenceConstants.groovy | 14 ++++++ .../CodeNarcPreferenceInitializer.groovy | 21 ++++++++ .../preferences/CodeNarcPreferencePage.groovy | 9 ++++ 9 files changed, 190 insertions(+), 3 deletions(-) create mode 100644 plugin/src/org/codenarc/eclipse/jobs/SetConfigFileJob.groovy create mode 100644 plugin/src/org/codenarc/eclipse/popup/actions/SetConfigFileAction.groovy create mode 100644 plugin/src/org/codenarc/eclipse/preferences/CodeNarcPreferenceConstants.groovy create mode 100644 plugin/src/org/codenarc/eclipse/preferences/CodeNarcPreferenceInitializer.groovy create mode 100644 plugin/src/org/codenarc/eclipse/preferences/CodeNarcPreferencePage.groovy diff --git a/plugin/plugin.xml b/plugin/plugin.xml index a56f98d..f2f628b 100644 --- a/plugin/plugin.xml +++ b/plugin/plugin.xml @@ -2,6 +2,20 @@ + + + + + + + + + + + + + overallRuleSet.addRule(rule) + } + overallRuleSet + } + static RuleSet createRuleSetFromFiles(List paths) { def invalidFiles = [] def overallRuleSet = new CompositeRuleSet() diff --git a/plugin/src/org/codenarc/eclipse/SelectionUtils.groovy b/plugin/src/org/codenarc/eclipse/SelectionUtils.groovy index a8c87ec..3adc7c5 100644 --- a/plugin/src/org/codenarc/eclipse/SelectionUtils.groovy +++ b/plugin/src/org/codenarc/eclipse/SelectionUtils.groovy @@ -8,6 +8,7 @@ import org.eclipse.jface.viewers.IStructuredSelection class SelectionUtils { private static final GROOVY_FILE_EXTENSION = 'groovy' + private static final XML_FILE_EXTENSION = 'xml' private static final GRAILS_LINKED_RESOURCES_NAME = '.link_to_grails_plugins' static List getGroovyFiles(IStructuredSelection selection) { @@ -17,7 +18,14 @@ class SelectionUtils { files } - private static void addFileResources(resources, files) { + static IFile getSingleGroovyFile(IStructuredSelection selection) { + def files = [] + addFileResources(selection.toList(), files, XML_FILE_EXTENSION) + assert files.size() == 1 + files[0] + } + + private static void addFileResources(resources, files, expectedExtension = GROOVY_FILE_EXTENSION) { for (IResource resource in resources) { if (!resource.isAccessible() || resource.name == GRAILS_LINKED_RESOURCES_NAME) { continue @@ -25,7 +33,7 @@ class SelectionUtils { if (resource instanceof IFile) { IFile file = resource - if (file.type == IResource.FILE && file.fileExtension == GROOVY_FILE_EXTENSION) { + if (file.type == IResource.FILE && file.fileExtension == expectedExtension) { files << file } } else if (resource instanceof IContainer) { diff --git a/plugin/src/org/codenarc/eclipse/jobs/CheckCodeJob.groovy b/plugin/src/org/codenarc/eclipse/jobs/CheckCodeJob.groovy index 9d14889..158f16a 100644 --- a/plugin/src/org/codenarc/eclipse/jobs/CheckCodeJob.groovy +++ b/plugin/src/org/codenarc/eclipse/jobs/CheckCodeJob.groovy @@ -51,7 +51,7 @@ class CheckCodeJob extends Job { private RuleSet createRuleSet() { monitor.beginTask('Loading rulesets', 10) - def ruleSet = RuleSetProvider.createDefaultRuleSet() + def ruleSet = RuleSetProvider.createRuleSet() monitor.worked(10) ruleSet diff --git a/plugin/src/org/codenarc/eclipse/jobs/SetConfigFileJob.groovy b/plugin/src/org/codenarc/eclipse/jobs/SetConfigFileJob.groovy new file mode 100644 index 0000000..4c23351 --- /dev/null +++ b/plugin/src/org/codenarc/eclipse/jobs/SetConfigFileJob.groovy @@ -0,0 +1,48 @@ +package org.codenarc.eclipse.jobs + +import org.codenarc.eclipse.Activator +import org.codenarc.eclipse.SelectionUtils +import org.codenarc.eclipse.preferences.CodeNarcPreferenceConstants +import org.eclipse.core.resources.IFile +import org.eclipse.core.runtime.IProgressMonitor +import org.eclipse.core.runtime.IStatus +import org.eclipse.core.runtime.Status +import org.eclipse.core.runtime.jobs.Job +import org.eclipse.jface.preference.IPreferenceStore +import org.eclipse.jface.viewers.IStructuredSelection + +/** + * Job to set a preference in current plugin's store. + * If this value is set, the value's file will be used to retrieve a custom ruleset which + * this plugin will use. + * + * @author Csaba Sulyok + */ +class SetConfigFileJob extends Job { + + private IProgressMonitor monitor + private IStructuredSelection selection + + SetConfigFileJob(IStructuredSelection selection) { + super('Use this file as CodeNarc config') + this.selection = selection + } + + IStatus run(IProgressMonitor monitor) { + this.monitor = monitor + + monitor.beginTask('Setting current CodeNarc config file', 1) + changeConfigFile(SelectionUtils.getSingleGroovyFile(selection)) + monitor.worked(1) + monitor.done() + + monitor.isCanceled() ? Status.CANCEL_STATUS : Status.OK_STATUS + } + + private void changeConfigFile(IFile file) { + String path = file.getRawLocation().makeAbsolute().toFile().absolutePath + IPreferenceStore store = Activator.getDefault().getPreferenceStore() + store.setValue(CodeNarcPreferenceConstants.P_USE_CUSTOM_CONFIG, true) + store.setValue(CodeNarcPreferenceConstants.P_CONFIG_PATH, path) + } +} diff --git a/plugin/src/org/codenarc/eclipse/popup/actions/SetConfigFileAction.groovy b/plugin/src/org/codenarc/eclipse/popup/actions/SetConfigFileAction.groovy new file mode 100644 index 0000000..4517edd --- /dev/null +++ b/plugin/src/org/codenarc/eclipse/popup/actions/SetConfigFileAction.groovy @@ -0,0 +1,32 @@ +package org.codenarc.eclipse.popup.actions + +import org.codenarc.eclipse.jobs.SetConfigFileJob +import org.eclipse.core.runtime.jobs.Job +import org.eclipse.jface.action.IAction +import org.eclipse.jface.viewers.ISelection +import org.eclipse.jface.viewers.IStructuredSelection +import org.eclipse.ui.IObjectActionDelegate +import org.eclipse.ui.IWorkbenchPart + +class SetConfigFileAction implements IObjectActionDelegate { + + private IStructuredSelection selection + + @Override + void run(IAction action) { + def job = new SetConfigFileJob(selection) + job.priority = Job.INTERACTIVE + job.schedule() + } + + @Override + void selectionChanged(IAction action, ISelection selection) { + if (selection instanceof IStructuredSelection) { + this.selection = selection + } + } + + @Override + void setActivePart(IAction action, IWorkbenchPart targetPart) { + } +} diff --git a/plugin/src/org/codenarc/eclipse/preferences/CodeNarcPreferenceConstants.groovy b/plugin/src/org/codenarc/eclipse/preferences/CodeNarcPreferenceConstants.groovy new file mode 100644 index 0000000..1bbf2c6 --- /dev/null +++ b/plugin/src/org/codenarc/eclipse/preferences/CodeNarcPreferenceConstants.groovy @@ -0,0 +1,14 @@ +package org.codenarc.eclipse.preferences + +class CodeNarcPreferenceConstants { + + public static final String P_CONFIG_PATH = 'org.codenarc.eclipse.configFilePath' + public static final String CONFIG_PATH_LABEL = '&CodeNarc XML ruleset config file:' + public static final String CONFIG_PATH_DEFAULT = 'D:/codenarc.xml' + + public static final String P_USE_CUSTOM_CONFIG = 'org.codenarc.eclipse.useCustomConfig' + public static final String USE_CUSTOM_CONFIG_LABEL = '&Use custom CodeNarc XML ruleset config file:' + public static final boolean USE_CUSTOM_CONFIG_DEFAULT = false + + public static final String PREFERENCE_PAGE_DESCRIPTION = 'CodeNarc preference page' +} diff --git a/plugin/src/org/codenarc/eclipse/preferences/CodeNarcPreferenceInitializer.groovy b/plugin/src/org/codenarc/eclipse/preferences/CodeNarcPreferenceInitializer.groovy new file mode 100644 index 0000000..4401ffd --- /dev/null +++ b/plugin/src/org/codenarc/eclipse/preferences/CodeNarcPreferenceInitializer.groovy @@ -0,0 +1,21 @@ +package org.codenarc.eclipse.preferences + +import static org.codenarc.eclipse.preferences.CodeNarcPreferenceConstants.* + +import org.codenarc.eclipse.Activator +import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer +import org.eclipse.jface.preference.IPreferenceStore + +class CodeNarcPreferenceInitializer extends AbstractPreferenceInitializer { + + CodeNarcPreferenceInitializer() { + super() + } + + @Override + void initializeDefaultPreferences() { + IPreferenceStore store = Activator.default.preferenceStore + store.setDefault(P_CONFIG_PATH, CONFIG_PATH_DEFAULT) + store.setDefault(P_USE_CUSTOM_CONFIG, USE_CUSTOM_CONFIG_DEFAULT) + } +} diff --git a/plugin/src/org/codenarc/eclipse/preferences/CodeNarcPreferencePage.groovy b/plugin/src/org/codenarc/eclipse/preferences/CodeNarcPreferencePage.groovy new file mode 100644 index 0000000..bf886b9 --- /dev/null +++ b/plugin/src/org/codenarc/eclipse/preferences/CodeNarcPreferencePage.groovy @@ -0,0 +1,9 @@ +package org.codenarc.eclipse.preferences import static org.codenarc.eclipse.preferences.CodeNarcPreferenceConstants.* import org.codenarc.eclipse.Activator import org.eclipse.core.resources.ResourcesPlugin import org.eclipse.jface.preference.BooleanFieldEditor import org.eclipse.jface.preference.FieldEditorPreferencePage import org.eclipse.jface.preference.FileFieldEditor import org.eclipse.swt.events.SelectionEvent import org.eclipse.swt.events.SelectionListener import org.eclipse.swt.widgets.Composite import org.eclipse.ui.IWorkbench import org.eclipse.ui.IWorkbenchPreferencePage /** * Eclipse preference page for CodeNarc plugin. * You can enable a custom configuration file to use with CodeNarc here. * It will save the properties in current preference store. * * @author Csaba Sulyok */ +class CodeNarcPreferencePage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage { private BooleanFieldEditor useCustomConfigField + private FileFieldEditor configFileField private Composite parent + CodeNarcPreferencePage() { + super(1) } @Override + void createFieldEditors() { parent = getFieldEditorParent() useCustomConfigField = new BooleanFieldEditor(P_USE_CUSTOM_CONFIG, USE_CUSTOM_CONFIG_LABEL, fieldEditorParent) addField(useCustomConfigField) configFileField = new FileFieldEditor(P_CONFIG_PATH, CONFIG_PATH_LABEL, parent) configFileField.fileExtensions = [ '*.xml' ] as String[] configFileField.filterPath = ResourcesPlugin.workspace.root.location.toFile() configFileField.setEnabled(preferenceStore.getBoolean(P_USE_CUSTOM_CONFIG), parent) addField(configFileField) useCustomConfigField.getChangeControl(parent).addSelectionListener(new SelectionListener() { void widgetDefaultSelected(SelectionEvent e) { widgetSelected(e) } void widgetSelected(SelectionEvent e) { configFileField.setEnabled(useCustomConfigField.booleanValue, parent) } }) } @Override + void init(final IWorkbench workbench) { + preferenceStore = Activator.default.preferenceStore + description = PREFERENCE_PAGE_DESCRIPTION } }