diff options
| author | Dirk Fauth | 2022-11-11 08:06:56 +0000 |
|---|---|---|
| committer | Dirk Fauth | 2022-11-11 08:06:56 +0000 |
| commit | 2c568e2f9cb0ad50bcc58a2b18de8e8dbc2c4f3d (patch) | |
| tree | ad4609de7e3c183f31699383652ccadb71ebe06d | |
| parent | c3c1efcd6cc6d30fd8a12e1ea7490878447d221d (diff) | |
| download | org.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
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; } |
