Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDirk Fauth2022-11-11 08:06:56 +0000
committerDirk Fauth2022-11-11 08:06:56 +0000
commit2c568e2f9cb0ad50bcc58a2b18de8e8dbc2c4f3d (patch)
treead4609de7e3c183f31699383652ccadb71ebe06d
parentc3c1efcd6cc6d30fd8a12e1ea7490878447d221d (diff)
downloadorg.eclipse.nebula.widgets.nattable-2c568e2f9cb0ad50bcc58a2b18de8e8dbc2c4f3d.tar.gz
org.eclipse.nebula.widgets.nattable-2c568e2f9cb0ad50bcc58a2b18de8e8dbc2c4f3d.tar.xz
org.eclipse.nebula.widgets.nattable-2c568e2f9cb0ad50bcc58a2b18de8e8dbc2c4f3d.zip
Bug 581023 - Not possible to simply clear filter of "Excel-like" filters
Add a check to avoid possible regressions with the latest ComboBoxFilterRowConfiguration and a hack in the MixedFilterRowExample to make it work. Added TODOs to get it really fixed in a feature release as the real fix needs an API change. Signed-off-by: Dirk Fauth <dirk.fauth@googlemail.com> Change-Id: I9156a6bcf13ee39cc0c23c94aaa6f5eeeff541df
-rw-r--r--org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/filterrow/combobox/ComboBoxFilterRowConfiguration.java8
-rw-r--r--org.eclipse.nebula.widgets.nattable.examples/src/org/eclipse/nebula/widgets/nattable/examples/_600_GlazedLists/_603_Filter/_6037_MixedFilterRowExample.java102
2 files changed, 74 insertions, 36 deletions
diff --git a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/filterrow/combobox/ComboBoxFilterRowConfiguration.java b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/filterrow/combobox/ComboBoxFilterRowConfiguration.java
index 931ff9e5..9ce7426c 100644
--- a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/filterrow/combobox/ComboBoxFilterRowConfiguration.java
+++ b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/filterrow/combobox/ComboBoxFilterRowConfiguration.java
@@ -148,8 +148,10 @@ public class ComboBoxFilterRowConfiguration extends AbstractRegistryConfiguratio
@Override
public void configureUiBindings(UiBindingRegistry uiBindingRegistry) {
- uiBindingRegistry.registerFirstSingleClickBinding(
- new ClearFilterIconMouseEventMatcher(this.filterRowPainter),
- new ClearFilterAction());
+ if (this.filterRowPainter != null) {
+ uiBindingRegistry.registerFirstSingleClickBinding(
+ new ClearFilterIconMouseEventMatcher(this.filterRowPainter),
+ new ClearFilterAction());
+ }
}
}
diff --git a/org.eclipse.nebula.widgets.nattable.examples/src/org/eclipse/nebula/widgets/nattable/examples/_600_GlazedLists/_603_Filter/_6037_MixedFilterRowExample.java b/org.eclipse.nebula.widgets.nattable.examples/src/org/eclipse/nebula/widgets/nattable/examples/_600_GlazedLists/_603_Filter/_6037_MixedFilterRowExample.java
index 6c5293e0..a2f15d03 100644
--- a/org.eclipse.nebula.widgets.nattable.examples/src/org/eclipse/nebula/widgets/nattable/examples/_600_GlazedLists/_603_Filter/_6037_MixedFilterRowExample.java
+++ b/org.eclipse.nebula.widgets.nattable.examples/src/org/eclipse/nebula/widgets/nattable/examples/_600_GlazedLists/_603_Filter/_6037_MixedFilterRowExample.java
@@ -48,8 +48,8 @@ import org.eclipse.nebula.widgets.nattable.dataset.person.Person.Gender;
import org.eclipse.nebula.widgets.nattable.dataset.person.PersonService;
import org.eclipse.nebula.widgets.nattable.dataset.person.PersonWithAddress;
import org.eclipse.nebula.widgets.nattable.edit.EditConfigAttributes;
+import org.eclipse.nebula.widgets.nattable.edit.EditConstants;
import org.eclipse.nebula.widgets.nattable.edit.editor.ComboBoxCellEditor;
-import org.eclipse.nebula.widgets.nattable.edit.editor.ICellEditor;
import org.eclipse.nebula.widgets.nattable.edit.editor.IComboBoxDataProvider;
import org.eclipse.nebula.widgets.nattable.edit.editor.TextCellEditor;
import org.eclipse.nebula.widgets.nattable.examples.AbstractNatExample;
@@ -65,11 +65,13 @@ import org.eclipse.nebula.widgets.nattable.filterrow.FilterRowRegularExpressionC
import org.eclipse.nebula.widgets.nattable.filterrow.FilterRowTextCellEditor;
import org.eclipse.nebula.widgets.nattable.filterrow.IFilterStrategy;
import org.eclipse.nebula.widgets.nattable.filterrow.TextMatchingMode;
+import org.eclipse.nebula.widgets.nattable.filterrow.action.ClearFilterAction;
import org.eclipse.nebula.widgets.nattable.filterrow.combobox.ComboBoxFilterIconPainter;
import org.eclipse.nebula.widgets.nattable.filterrow.combobox.ComboBoxFilterRowConfiguration;
import org.eclipse.nebula.widgets.nattable.filterrow.combobox.FilterRowComboBoxCellEditor;
import org.eclipse.nebula.widgets.nattable.filterrow.combobox.FilterRowComboBoxDataProvider;
import org.eclipse.nebula.widgets.nattable.filterrow.config.FilterRowConfigAttributes;
+import org.eclipse.nebula.widgets.nattable.filterrow.event.ClearFilterIconMouseEventMatcher;
import org.eclipse.nebula.widgets.nattable.freeze.CompositeFreezeLayer;
import org.eclipse.nebula.widgets.nattable.freeze.FreezeLayer;
import org.eclipse.nebula.widgets.nattable.grid.GridRegion;
@@ -89,6 +91,7 @@ import org.eclipse.nebula.widgets.nattable.layer.LabelStack;
import org.eclipse.nebula.widgets.nattable.layer.cell.ColumnLabelAccumulator;
import org.eclipse.nebula.widgets.nattable.layer.cell.IConfigLabelAccumulator;
import org.eclipse.nebula.widgets.nattable.layer.cell.ILayerCell;
+import org.eclipse.nebula.widgets.nattable.painter.cell.ICellPainter;
import org.eclipse.nebula.widgets.nattable.painter.cell.decorator.PaddingDecorator;
import org.eclipse.nebula.widgets.nattable.persistence.command.DisplayPersistenceDialogCommandHandler;
import org.eclipse.nebula.widgets.nattable.selection.SelectionLayer;
@@ -110,6 +113,7 @@ import org.eclipse.nebula.widgets.nattable.ui.menu.PopupMenuBuilder;
import org.eclipse.nebula.widgets.nattable.util.GUIHelper;
import org.eclipse.nebula.widgets.nattable.viewport.ViewportLayer;
import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridLayout;
@@ -257,7 +261,39 @@ public class _6037_MixedFilterRowExample extends AbstractNatExample {
filterRowHeaderLayer.addConfiguration(
new ComboBoxFilterRowConfiguration(
filterEditor,
- new ComboBoxFilterIconPainter(comboBoxDataProvider)));
+ new ComboBoxFilterIconPainter(comboBoxDataProvider)) {
+
+ @Override
+ public void configureUiBindings(UiBindingRegistry uiBindingRegistry) {
+ // TODO 2.1 move this hack to the
+ // ComboBoxFilterRowConfiguration
+ // TODO 2.1 create dedicated matcher
+ // ComboBoxClearFilterIconMouseEventMatcher
+ ICellPainter filterRowPainter = configRegistry.getConfigAttribute(
+ CellConfigAttributes.CELL_PAINTER,
+ DisplayMode.NORMAL,
+ GridRegion.FILTER_ROW);
+ uiBindingRegistry.registerFirstSingleClickBinding(
+ new ClearFilterIconMouseEventMatcher((FilterRowPainter) filterRowPainter) {
+ @SuppressWarnings("rawtypes")
+ @Override
+ public boolean matches(NatTable natTable, MouseEvent event, LabelStack regionLabels) {
+ boolean matches = super.matches(natTable, event, regionLabels);
+ if (matches) {
+ ILayerCell cell = natTable.getCellByPosition(
+ natTable.getColumnPositionByX(event.x),
+ natTable.getRowPositionByY(event.y));
+ Object cellData = cell.getDataValue();
+ matches = (!EditConstants.SELECT_ALL_ITEMS_VALUE.equals(cellData)
+ && !(cellData instanceof Collection
+ && ((Collection) cellData).size() == comboBoxDataProvider.getValues(cell.getColumnIndex(), 0).size()));
+ }
+ return matches;
+ }
+ },
+ new ClearFilterAction());
+ };
+ });
// add the specialized configuration to the
// ComboBoxFilterRowHeaderComposite
@@ -556,6 +592,7 @@ public class _6037_MixedFilterRowExample extends AbstractNatExample {
}
}
+ // TODO 2.1 move this class to the GlazedLists extension
/**
* Specialized {@link ComboBoxGlazedListsFilterStrategy} that can be used to
* exclude items from filtering. This means you can register a
@@ -789,7 +826,7 @@ public class _6037_MixedFilterRowExample extends AbstractNatExample {
// filter row the label is set automatically to the value of
// FilterRowDataLayer.FILTER_ROW_COLUMN_LABEL_PREFIX + column
// position
- ICellEditor comboBoxCellEditor = new ComboBoxCellEditor(Arrays.asList(
+ ComboBoxCellEditor comboBoxCellEditor = new ComboBoxCellEditor(Arrays.asList(
CustomFilterRowRegularExpressionConverter.EMPTY_REGEX,
CustomFilterRowRegularExpressionConverter.NOT_EMPTY_REGEX,
Gender.FEMALE.toString(),
@@ -892,33 +929,34 @@ public class _6037_MixedFilterRowExample extends AbstractNatExample {
@Override
public Object displayToCanonicalValue(ILayerCell cell, IConfigRegistry configRegistry, Object displayValue) {
if (displayValue != null) {
- switch (displayValue.toString()) {
- case EMPTY_LITERAL:
- this.configRegistry.registerConfigAttribute(
- FilterRowConfigAttributes.TEXT_MATCHING_MODE,
- TextMatchingMode.REGULAR_EXPRESSION,
- DisplayMode.NORMAL,
- FilterRowDataLayer.FILTER_ROW_COLUMN_LABEL_PREFIX + cell.getColumnIndex());
- return EMPTY_REGEX;
- case NOT_EMPTY_LITERAL:
+ // first convert the wildcards
+ displayValue = super.displayToCanonicalValue(displayValue);
+
+ if (displayValue.toString().contains(EMPTY_LITERAL)
+ || displayValue.toString().contains(NOT_EMPTY_LITERAL)) {
+
+ this.configRegistry.registerConfigAttribute(
+ FilterRowConfigAttributes.TEXT_MATCHING_MODE,
+ TextMatchingMode.REGULAR_EXPRESSION,
+ DisplayMode.NORMAL,
+ FilterRowDataLayer.FILTER_ROW_COLUMN_LABEL_PREFIX + cell.getColumnIndex());
+ } else {
+
+ if (!_6037_MixedFilterRowExample.this.regexFilterActive) {
+ // only switch to CONTAINS if RegEx filtering is not
+ // activated
this.configRegistry.registerConfigAttribute(
FilterRowConfigAttributes.TEXT_MATCHING_MODE,
- TextMatchingMode.REGULAR_EXPRESSION,
+ TextMatchingMode.CONTAINS,
DisplayMode.NORMAL,
FilterRowDataLayer.FILTER_ROW_COLUMN_LABEL_PREFIX + cell.getColumnIndex());
- return NOT_EMPTY_REGEX;
- default:
- if (!_6037_MixedFilterRowExample.this.regexFilterActive) {
- // only switch to CONTAINS if RegEx filtering is not
- // activated
- this.configRegistry.registerConfigAttribute(
- FilterRowConfigAttributes.TEXT_MATCHING_MODE,
- TextMatchingMode.CONTAINS,
- DisplayMode.NORMAL,
- FilterRowDataLayer.FILTER_ROW_COLUMN_LABEL_PREFIX + cell.getColumnIndex());
- }
- return super.displayToCanonicalValue(displayValue);
+ }
}
+
+ displayValue = displayValue.toString().replace(EMPTY_LITERAL, EMPTY_REGEX);
+ displayValue = displayValue.toString().replace(NOT_EMPTY_LITERAL, NOT_EMPTY_REGEX);
+
+ return displayValue;
}
return displayValue;
}
@@ -926,14 +964,12 @@ public class _6037_MixedFilterRowExample extends AbstractNatExample {
@Override
public Object canonicalToDisplayValue(ILayerCell cell, IConfigRegistry configRegistry, Object canonicalValue) {
if (canonicalValue != null) {
- switch (canonicalValue.toString()) {
- case EMPTY_REGEX:
- return EMPTY_LITERAL;
- case NOT_EMPTY_REGEX:
- return NOT_EMPTY_LITERAL;
- default:
- return super.canonicalToDisplayValue(canonicalValue);
- }
+ canonicalValue = super.canonicalToDisplayValue(canonicalValue);
+
+ canonicalValue = canonicalValue.toString().replace(EMPTY_REGEX, EMPTY_LITERAL);
+ canonicalValue = canonicalValue.toString().replace(NOT_EMPTY_REGEX, NOT_EMPTY_LITERAL);
+
+ return canonicalValue;
}
return canonicalValue;
}

Back to the top