From bce7573e82231f55e9e09d861fbc37e542595ad3 Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Fri, 30 Jan 2015 00:50:45 +0100 Subject: [PATCH] moving ValidationConfigurable to community so that validation configuration UI is available even if javaee plugins are disabled --- .../options/ExcludeFromValidationAction.java | 55 ++++++ .../options/ValidationConfigurable.form | 76 ++++++++ .../options/ValidationConfigurable.java | 171 ++++++++++++++++++ resources/src/idea/RichPlatformActions.xml | 1 + resources/src/idea/RichPlatformPlugin.xml | 2 + 5 files changed, 305 insertions(+) create mode 100644 java/compiler/impl/src/com/intellij/compiler/options/ExcludeFromValidationAction.java create mode 100644 java/compiler/impl/src/com/intellij/compiler/options/ValidationConfigurable.form create mode 100644 java/compiler/impl/src/com/intellij/compiler/options/ValidationConfigurable.java diff --git a/java/compiler/impl/src/com/intellij/compiler/options/ExcludeFromValidationAction.java b/java/compiler/impl/src/com/intellij/compiler/options/ExcludeFromValidationAction.java new file mode 100644 index 000000000000..d54cee136f98 --- /dev/null +++ b/java/compiler/impl/src/com/intellij/compiler/options/ExcludeFromValidationAction.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2000-2006 JetBrains s.r.o. All Rights Reserved. + */ + +package com.intellij.compiler.options; + +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.actionSystem.CommonDataKeys; +import com.intellij.openapi.compiler.CompilerBundle; +import com.intellij.openapi.compiler.options.ExcludeEntryDescription; +import com.intellij.openapi.compiler.options.ExcludesConfiguration; +import com.intellij.openapi.fileEditor.OpenFileDescriptor; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Pair; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.pom.Navigatable; +import org.jetbrains.annotations.Nullable; + +/** + * @author nik + */ +public class ExcludeFromValidationAction extends AnAction { + + public ExcludeFromValidationAction() { + super(CompilerBundle.message("action.name.exclude.from.validation")); + } + + public void actionPerformed(AnActionEvent e) { + Project project = e.getData(CommonDataKeys.PROJECT); + final Pair pair = getExcludedConfigurationAndFile(e, project); + if (pair == null) return; + final ExcludeEntryDescription description = new ExcludeEntryDescription(pair.getSecond(), false, true, project); + pair.getFirst().addExcludeEntryDescription(description); + } + + @Nullable + private static Pair getExcludedConfigurationAndFile(final AnActionEvent event, Project project) { + Navigatable navigatable = event.getData(CommonDataKeys.NAVIGATABLE); + if (project != null && navigatable instanceof OpenFileDescriptor) { + final VirtualFile file = ((OpenFileDescriptor)navigatable).getFile(); + final ExcludesConfiguration configuration = ValidationConfiguration.getExcludedEntriesConfiguration(project); + return Pair.create(configuration, file); + } + return null; + } + + + public void update(AnActionEvent e) { + Project project = e.getData(CommonDataKeys.PROJECT); + final boolean applicable = getExcludedConfigurationAndFile(e, project) != null; + e.getPresentation().setVisible(applicable); + e.getPresentation().setEnabled(applicable); + } +} diff --git a/java/compiler/impl/src/com/intellij/compiler/options/ValidationConfigurable.form b/java/compiler/impl/src/com/intellij/compiler/options/ValidationConfigurable.form new file mode 100644 index 000000000000..6f0e3a1d60c2 --- /dev/null +++ b/java/compiler/impl/src/com/intellij/compiler/options/ValidationConfigurable.form @@ -0,0 +1,76 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/java/compiler/impl/src/com/intellij/compiler/options/ValidationConfigurable.java b/java/compiler/impl/src/com/intellij/compiler/options/ValidationConfigurable.java new file mode 100644 index 000000000000..dd9d762fbcb4 --- /dev/null +++ b/java/compiler/impl/src/com/intellij/compiler/options/ValidationConfigurable.java @@ -0,0 +1,171 @@ +package com.intellij.compiler.options; + +import com.intellij.ide.util.ElementsChooser; +import com.intellij.openapi.compiler.Compiler; +import com.intellij.openapi.compiler.CompilerBundle; +import com.intellij.openapi.compiler.CompilerManager; +import com.intellij.openapi.compiler.Validator; +import com.intellij.openapi.compiler.generic.GenericCompiler; +import com.intellij.openapi.compiler.options.ExcludedEntriesConfigurable; +import com.intellij.openapi.compiler.options.ExcludesConfiguration; +import com.intellij.openapi.fileChooser.FileChooserDescriptor; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.module.ModuleManager; +import com.intellij.openapi.options.Configurable; +import com.intellij.openapi.options.ConfigurationException; +import com.intellij.openapi.options.SearchableConfigurable; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.ModuleRootManager; +import com.intellij.openapi.roots.ProjectFileIndex; +import com.intellij.openapi.roots.ProjectRootManager; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.uiDesigner.core.GridConstraints; +import com.intellij.util.NullableFunction; +import com.intellij.util.containers.ContainerUtil; +import gnu.trove.THashSet; +import gnu.trove.TObjectHashingStrategy; +import org.jetbrains.annotations.NotNull; + +import javax.swing.*; +import java.util.*; + +/** + * @author Dmitry Avdeev + */ +public class ValidationConfigurable implements SearchableConfigurable, Configurable.NoScroll { + + private JPanel myPanel; + private JCheckBox myValidateBox; + private ElementsChooser myValidators; + private JPanel myExcludedEntriesPanel; + private final Project myProject; + private final ValidationConfiguration myConfiguration; + private final ExcludedEntriesConfigurable myExcludedConfigurable; + + public ValidationConfigurable(final Project project) { + myProject = project; + myConfiguration = ValidationConfiguration.getInstance(myProject); + myExcludedConfigurable = createExcludedConfigurable(project); + + myValidators.getEmptyText().setText(CompilerBundle.message("no.validators")); + } + + private static ExcludedEntriesConfigurable createExcludedConfigurable(final Project project) { + final ExcludesConfiguration configuration = ValidationConfiguration.getExcludedEntriesConfiguration(project); + final ProjectFileIndex index = ProjectRootManager.getInstance(project).getFileIndex(); + final FileChooserDescriptor descriptor = new FileChooserDescriptor(true, true, false, false, false, true) { + public boolean isFileVisible(VirtualFile file, boolean showHiddenFiles) { + return super.isFileVisible(file, showHiddenFiles) && (project.isDefault() || !index.isExcluded(file)); + } + }; + + List allContentRoots = new ArrayList(); + for (final Module module: ModuleManager.getInstance(project).getModules()) { + final VirtualFile[] moduleContentRoots = ModuleRootManager.getInstance(module).getContentRoots(); + Collections.addAll(allContentRoots, moduleContentRoots); + } + descriptor.setRoots(allContentRoots); + return new ExcludedEntriesConfigurable(project, descriptor, configuration); + } + + @NotNull + public String getId() { + return "project.validation"; + } + + public Runnable enableSearch(final String option) { + return null; + } + + public String getDisplayName() { + return CompilerBundle.message("validation.display.name"); + } + + public String getHelpTopic() { + return "reference.projectsettings.compiler.validation"; + } + + public JComponent createComponent() { + final GridConstraints constraints = new GridConstraints(); + constraints.setFill(GridConstraints.FILL_BOTH); + myExcludedEntriesPanel.add(myExcludedConfigurable.createComponent(), constraints); + return myPanel; + } + + public boolean isModified() { + List selectedElements = myValidators.getMarkedElements(); + List markedValidators = getMarkedValidators(); + if (markedValidators.size() != selectedElements.size()) { + return true; + } + Set set = new THashSet(selectedElements, new TObjectHashingStrategy() { + public int computeHashCode(Compiler object) { + return object.getDescription().hashCode(); + } + + public boolean equals(Compiler o1, Compiler o2) { + return o1.getDescription().equals(o2.getDescription()); + } + }); + return myConfiguration.VALIDATE_ON_BUILD != myValidateBox.isSelected() || + set.retainAll(markedValidators) || + myExcludedConfigurable.isModified(); + } + + public void apply() throws ConfigurationException { + myConfiguration.VALIDATE_ON_BUILD = myValidateBox.isSelected(); + for (int i = 0; i < myValidators.getElementCount(); i++) { + final Compiler validator = myValidators.getElementAt(i); + myConfiguration.setSelected(validator, myValidators.isElementMarked(validator)); + } + myExcludedConfigurable.apply(); + } + + public void reset() { + myValidateBox.setSelected(myConfiguration.VALIDATE_ON_BUILD); + final List validators = getValidators(); + Collections.sort(validators, new Comparator() { + public int compare(final Compiler o1, final Compiler o2) { + return o1.getDescription().compareTo(o2.getDescription()); + } + }); + myValidators.setElements(validators, false); + myValidators.markElements(getMarkedValidators()); + myExcludedConfigurable.reset(); + } + + private List getMarkedValidators() { + final List validators = getValidators(); + return ContainerUtil.mapNotNull(validators, new NullableFunction() { + public Compiler fun(final Compiler validator) { + return myConfiguration.isSelected(validator) ? validator : null; + } + }); + } + + private List getValidators() { + final CompilerManager compilerManager = CompilerManager.getInstance(myProject); + final List validators = new ArrayList(); + validators.addAll(Arrays.asList(compilerManager.getCompilers(Validator.class))); + for (GenericCompiler compiler : compilerManager.getCompilers(GenericCompiler.class)) { + if (compiler.getOrderPlace() == GenericCompiler.CompileOrderPlace.VALIDATING) { + validators.add(compiler); + } + } + return validators; + } + + public void disposeUIResources() { + myExcludedConfigurable.disposeUIResources(); + } + + private void createUIComponents() { + myValidators = new ElementsChooser(true) { + @Override + protected String getItemText(@NotNull final Compiler validator) { + final String description = validator.getDescription(); + return description.replace(" Validator", "").replace(" validator", ""); + } + }; + } +} diff --git a/resources/src/idea/RichPlatformActions.xml b/resources/src/idea/RichPlatformActions.xml index 3fbf288f9d53..aadc899c4c8c 100644 --- a/resources/src/idea/RichPlatformActions.xml +++ b/resources/src/idea/RichPlatformActions.xml @@ -110,6 +110,7 @@ + diff --git a/resources/src/idea/RichPlatformPlugin.xml b/resources/src/idea/RichPlatformPlugin.xml index 818e0b509cdb..438bcbb51bff 100644 --- a/resources/src/idea/RichPlatformPlugin.xml +++ b/resources/src/idea/RichPlatformPlugin.xml @@ -245,6 +245,8 @@ key="java.compiler.description" bundle="messages.CompilerBundle"/> +