From a7bac2c14cea54e73a32e4a8a3e17ac557f3acd5 Mon Sep 17 00:00:00 2001 From: "Anna.Kozlova" Date: Mon, 7 Jan 2019 15:19:00 +0100 Subject: [PATCH] coverage: split settings so it's clear what enabled/disabled states are (IDEA-200520) --- .../ui/classFilter/ClassFilterEditor.java | 28 ++-------------- .../src/messages/ExecutionBundle.properties | 3 +- .../coverage/CoverageConfigurable.java | 33 ++++++++++++++----- 3 files changed, 29 insertions(+), 35 deletions(-) diff --git a/java/openapi/src/com/intellij/ui/classFilter/ClassFilterEditor.java b/java/openapi/src/com/intellij/ui/classFilter/ClassFilterEditor.java index d221ca607a82..b70fb0f7181f 100644 --- a/java/openapi/src/com/intellij/ui/classFilter/ClassFilterEditor.java +++ b/java/openapi/src/com/intellij/ui/classFilter/ClassFilterEditor.java @@ -49,14 +49,12 @@ import java.util.List; public class ClassFilterEditor extends JPanel implements ComponentWithEmptyText { private static final String IS_ACTIVE = "Is Active"; - private static final String INCLUDE_EXCLUDE = "Include/Exclude"; protected JBTable myTable = null; protected FilterTableModel myTableModel = null; protected final Project myProject; private final ClassFilter myChooserFilter; @Nullable private final String myPatternsHelpId; - private final boolean myExcludeAllowed; private String classDelimiter = "$"; public ClassFilterEditor(Project project) { @@ -68,13 +66,8 @@ public class ClassFilterEditor extends JPanel implements ComponentWithEmptyText } public ClassFilterEditor(Project project, ClassFilter classFilter, @Nullable String patternsHelpId) { - this(project, classFilter, patternsHelpId, false); - } - - public ClassFilterEditor(Project project, ClassFilter classFilter, @Nullable String patternsHelpId, boolean excludeAllowed) { super(new BorderLayout()); myPatternsHelpId = patternsHelpId; - myExcludeAllowed = excludeAllowed; myTable = new JBTable(); final ToolbarDecorator decorator = ToolbarDecorator.createDecorator(myTable) @@ -126,19 +119,8 @@ public class ClassFilterEditor extends JPanel implements ComponentWithEmptyText TableColumnModel columnModel = myTable.getColumnModel(); TableColumn column = columnModel.getColumn(FilterTableModel.CHECK_MARK); int preferredWidth; - if (!excludeAllowed) { - myTable.setTableHeader(null); - preferredWidth = 0; - } - else { - JTableHeader tableHeader = myTable.getTableHeader(); - final FontMetrics fontMetrics = tableHeader.getFontMetrics(tableHeader.getFont()); - preferredWidth = fontMetrics.stringWidth(IS_ACTIVE) + 20; - - TableColumn includeColumn = columnModel.getColumn(FilterTableModel.INCLUDE_MARK); - includeColumn.setCellRenderer(new EnabledCellRenderer(myTable.getDefaultRenderer(Boolean.class))); - TableUtil.setupCheckboxColumn(includeColumn, fontMetrics.stringWidth(INCLUDE_EXCLUDE) + 20); - } + myTable.setTableHeader(null); + preferredWidth = 0; TableUtil.setupCheckboxColumn(column, preferredWidth); column.setCellRenderer(new EnabledCellRenderer(myTable.getDefaultRenderer(Boolean.class))); columnModel.getColumn(FilterTableModel.FILTER).setCellRenderer(new FilterCellRenderer()); @@ -241,9 +223,6 @@ public class ClassFilterEditor extends JPanel implements ComponentWithEmptyText @Override public int getColumnCount() { - if (myExcludeAllowed) { - return 3; - } return 2; } @@ -252,9 +231,6 @@ public class ClassFilterEditor extends JPanel implements ComponentWithEmptyText if (column == FILTER) { return "Pattern"; } - if (column == INCLUDE_MARK) { - return INCLUDE_EXCLUDE; - } return IS_ACTIVE; } diff --git a/platform/platform-resources-en/src/messages/ExecutionBundle.properties b/platform/platform-resources-en/src/messages/ExecutionBundle.properties index e206dab4e515..2424a9c6eeea 100644 --- a/platform/platform-resources-en/src/messages/ExecutionBundle.properties +++ b/platform/platform-resources-en/src/messages/ExecutionBundle.properties @@ -310,7 +310,8 @@ run.configuration.unknown.description=Configuration which cannot be loaded due t #code coverage enable.coverage.with.emma=Record code &coverage information merge.coverage.data=&Merge gathered coverage with suite chosen below -record.coverage.filters.title=Packages and classes to record coverage data +record.coverage.filters.title=Packages and classes to include in coverage data +exclude.coverage.filters.title=Packages and classes to exclude from coverage data coverage.tab.title=Code Coverage show.swing.inspector=&Enable capturing form snapshots show.swing.inspector.disabled=&Enable capturing form snapshots (requires JRE 5.0 or higher) diff --git a/plugins/coverage/src/com/intellij/execution/configurations/coverage/CoverageConfigurable.java b/plugins/coverage/src/com/intellij/execution/configurations/coverage/CoverageConfigurable.java index 40981a1ae7be..3b35f203918a 100644 --- a/plugins/coverage/src/com/intellij/execution/configurations/coverage/CoverageConfigurable.java +++ b/plugins/coverage/src/com/intellij/execution/configurations/coverage/CoverageConfigurable.java @@ -11,7 +11,6 @@ import com.intellij.execution.configurations.ModuleBasedConfiguration; import com.intellij.execution.configurations.RunConfigurationBase; import com.intellij.execution.util.JreVersionDetector; import com.intellij.icons.AllIcons; -import com.intellij.ide.util.ClassFilter; import com.intellij.ide.util.PackageChooserDialog; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.options.ConfigurationException; @@ -22,11 +21,14 @@ import com.intellij.openapi.ui.VerticalFlowLayout; import com.intellij.openapi.wm.IdeFocusManager; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiPackage; -import com.intellij.ui.IdeBorderFactory; import com.intellij.ui.ListCellRendererWrapper; +import com.intellij.ui.TitledSeparator; +import com.intellij.ui.classFilter.ClassFilter; import com.intellij.ui.classFilter.ClassFilterEditor; import com.intellij.ui.components.JBPanel; +import com.intellij.util.ArrayUtil; import com.intellij.util.IconUtil; +import com.intellij.util.containers.ContainerUtil; import com.intellij.util.ui.JBUI; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; @@ -36,6 +38,7 @@ import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.util.Arrays; import java.util.List; /** @@ -54,6 +57,7 @@ public class CoverageConfigurable extends SettingsEditor { private final JreVersionDetector myVersionDetector = new JreVersionDetector(); Project myProject; private MyClassFilterEditor myClassFilterEditor; + private MyClassFilterEditor myExcludeClassFilterEditor; private JLabel myCoverageNotSupportedLabel; private JComboBox myCoverageRunnerCb; private JPanel myRunnerPanel; @@ -66,13 +70,13 @@ public class CoverageConfigurable extends SettingsEditor { private static class MyClassFilterEditor extends ClassFilterEditor { MyClassFilterEditor(Project project) { - super(project, new ClassFilter() { + super(project, new com.intellij.ide.util.ClassFilter() { @Override public boolean isAccepted(PsiClass aClass) { if (aClass.getContainingClass() != null) return false; return true; } - }, null, true); + }, null); } @Override @@ -147,7 +151,10 @@ public class CoverageConfigurable extends SettingsEditor { UIUtil.setEnabled(myRunnerPanel, isJre50, true); - myClassFilterEditor.setFilters(configuration.getCoveragePatterns()); + myClassFilterEditor.setFilters(Arrays.stream(configuration.getCoveragePatterns()) + .filter(classFilter -> classFilter.INCLUDE).toArray(ClassFilter[]::new)); + myExcludeClassFilterEditor.setFilters(Arrays.stream(configuration.getCoveragePatterns()) + .filter(classFilter -> !classFilter.INCLUDE).toArray(ClassFilter[]::new)); final boolean isCoverageByTestApplicable = runner != null && runner.isCoverageByTestApplicable(); myTracingRb.setEnabled(myTracingRb.isEnabled() && isCoverageByTestApplicable); mySamplingRb.setSelected(configuration.isSampling() || !isCoverageByTestApplicable); @@ -166,7 +173,13 @@ public class CoverageConfigurable extends SettingsEditor { @Override protected void applyEditorTo(@NotNull final RunConfigurationBase runConfiguration) throws ConfigurationException { final JavaCoverageEnabledConfiguration configuration = (JavaCoverageEnabledConfiguration)CoverageEnabledConfiguration.getOrCreate(runConfiguration); - configuration.setCoveragePatterns(myClassFilterEditor.getFilters()); + ClassFilter[] newCoveragePatterns = ArrayUtil.mergeArrays(myClassFilterEditor.getFilters(), myExcludeClassFilterEditor.getFilters()); + ClassFilter[] oldCoveragePatterns = configuration.getCoveragePatterns(); + //apply new order if something else was changed as well + if (newCoveragePatterns.length != oldCoveragePatterns.length || + !ContainerUtil.newHashSet(newCoveragePatterns).equals(ContainerUtil.newHashSet(oldCoveragePatterns))) { + configuration.setCoveragePatterns(newCoveragePatterns); + } configuration.setCoverageRunner(getSelectedRunner()); configuration.setTrackPerTestCoverage(myTrackPerTestCoverageCb.isSelected()); configuration.setSampling(mySamplingRb.isSelected()); @@ -243,12 +256,16 @@ public class CoverageConfigurable extends SettingsEditor { result.add(myRunnerPanel, gc); JPanel panel = new JPanel(new GridBagLayout()); - panel.setBorder(IdeBorderFactory.createTitledBorder(ExecutionBundle.message("record.coverage.filters.title"), false)); - myClassFilterEditor = new MyClassFilterEditor(myProject); final GridBagConstraints bagConstraints = new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 1, 1, GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH, JBUI.emptyInsets(), 0, 0); + panel.add(new TitledSeparator(ExecutionBundle.message("record.coverage.filters.title")), bagConstraints); + myClassFilterEditor = new MyClassFilterEditor(myProject); panel.add(myClassFilterEditor, bagConstraints); + + panel.add(new TitledSeparator(ExecutionBundle.message("exclude.coverage.filters.title")), bagConstraints); + myExcludeClassFilterEditor = new MyClassFilterEditor(myProject); + panel.add(myExcludeClassFilterEditor, bagConstraints); bagConstraints.weighty = 0; myTrackTestSourcesCb = new JCheckBox("Enable coverage in test folders");