Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 27 additions & 0 deletions plugin/plugin.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,20 @@
<?eclipse version="3.4"?>
<plugin>

<extension
point="org.eclipse.ui.preferencePages">
<page
class="org.codenarc.eclipse.preferences.CodeNarcPreferencePage"
id="org.codenarc.eclipse.preferences.CodeNarcPreferencePage"
name="CodeNarc">
</page>
</extension>
<extension
point="org.eclipse.core.runtime.preferences">
<initializer
class="org.codenarc.eclipse.preferences.CodeNarcPreferenceInitializer">
</initializer>
</extension>
<extension
point="org.eclipse.ui.popupMenus">
<objectContribution
Expand All @@ -26,6 +40,19 @@
menubarPath="groovyfile/codenarc">
</action>
</objectContribution>
<objectContribution
adaptable="true"
id="org.codenarc.eclipse.contribution.file"
nameFilter="*.xml"
objectClass="org.eclipse.core.resources.IFile">
<action
class="org.codenarc.eclipse.popup.actions.SetConfigFileAction"
enablesFor="1"
id="org.codenarc.eclipse.file.SetConfigFileAction"
label="Use this file as CodeNarc ruleset config"
menubarPath="groovyfile/codenarc">
</action>
</objectContribution>
<objectContribution
adaptable="true"
id="org.codenarc.eclipse.contribution.project"
Expand Down
28 changes: 28 additions & 0 deletions plugin/src/org/codenarc/eclipse/RuleSetProvider.groovy
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
package org.codenarc.eclipse

import org.codenarc.eclipse.preferences.CodeNarcPreferenceConstants
import org.codenarc.ruleset.CompositeRuleSet
import org.codenarc.ruleset.RuleSet
import org.codenarc.ruleset.RuleSetUtil
import org.codenarc.ruleset.XmlReaderRuleSet
import org.eclipse.core.runtime.ILog
import org.eclipse.core.runtime.IStatus
import org.eclipse.core.runtime.Status
import org.eclipse.jface.preference.IPreferenceStore

/**
* Provides all rulesets that are shipped with CodeNarc as a composite ruleset.
Expand Down Expand Up @@ -43,6 +46,31 @@ class RuleSetProvider {
createRuleSetFromFiles(paths)
}

static File retrieveRuleSetFileFromPreferences() {
IPreferenceStore store = Activator.getDefault().getPreferenceStore()
if (!store.getBoolean(CodeNarcPreferenceConstants.P_USE_CUSTOM_CONFIG)) {
return null
}
String path = store.getString(CodeNarcPreferenceConstants.P_CONFIG_PATH)
if (!path || !new File(path).exists()) {
return null
}
new File(path)
}

static RuleSet createRuleSet() {
File configFile = retrieveRuleSetFileFromPreferences()
if (!configFile) {
return createDefaultRuleSet()
}

CompositeRuleSet overallRuleSet = new CompositeRuleSet()
new XmlReaderRuleSet(new FileReader(configFile)).rules.each { rule ->
overallRuleSet.addRule(rule)
}
overallRuleSet
}

static RuleSet createRuleSetFromFiles(List paths) {
def invalidFiles = []
def overallRuleSet = new CompositeRuleSet()
Expand Down
12 changes: 10 additions & 2 deletions plugin/src/org/codenarc/eclipse/SelectionUtils.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -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<IFile> getGroovyFiles(IStructuredSelection selection) {
Expand All @@ -17,15 +18,22 @@ 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
}

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) {
Expand Down
2 changes: 1 addition & 1 deletion plugin/src/org/codenarc/eclipse/jobs/CheckCodeJob.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
48 changes: 48 additions & 0 deletions plugin/src/org/codenarc/eclipse/jobs/SetConfigFileJob.groovy
Original file line number Diff line number Diff line change
@@ -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 <a href="mailto:csaba.sulyok@gmail.com">Csaba Sulyok</a>
*/
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)
}
}
Original file line number Diff line number Diff line change
@@ -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) {
}
}
Original file line number Diff line number Diff line change
@@ -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'
}
Original file line number Diff line number Diff line change
@@ -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)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package org.codenarc.eclipse.preferencesimport static org.codenarc.eclipse.preferences.CodeNarcPreferenceConstants.*import org.codenarc.eclipse.Activatorimport org.eclipse.core.resources.ResourcesPluginimport org.eclipse.jface.preference.BooleanFieldEditorimport org.eclipse.jface.preference.FieldEditorPreferencePageimport org.eclipse.jface.preference.FileFieldEditorimport org.eclipse.swt.events.SelectionEventimport org.eclipse.swt.events.SelectionListenerimport org.eclipse.swt.widgets.Compositeimport org.eclipse.ui.IWorkbenchimport 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 <a href="mailto:csaba.sulyok@gmail.com">Csaba Sulyok</a> */
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 }}
Expand Down