| /*=============================================================================# |
| # Copyright (c) 2012, 2019 Stephan Wahlbrink and others. |
| # |
| # This program and the accompanying materials are made available under the |
| # terms of the Eclipse Public License 2.0 which is available at |
| # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0 |
| # which is available at https://www.apache.org/licenses/LICENSE-2.0. |
| # |
| # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 |
| # |
| # Contributors: |
| # Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation |
| #=============================================================================*/ |
| |
| package org.eclipse.statet.internal.r.ui.datafilter; |
| |
| import org.eclipse.core.databinding.observable.IObservable; |
| import org.eclipse.core.databinding.observable.set.IObservableSet; |
| import org.eclipse.core.databinding.observable.set.ISetChangeListener; |
| import org.eclipse.core.databinding.observable.set.SetChangeEvent; |
| import org.eclipse.core.databinding.observable.value.IObservableValue; |
| import org.eclipse.core.databinding.observable.value.IValueChangeListener; |
| import org.eclipse.core.databinding.observable.value.ValueChangeEvent; |
| |
| import org.eclipse.statet.jcommons.status.ProgressMonitor; |
| import org.eclipse.statet.jcommons.status.StatusException; |
| |
| import org.eclipse.statet.r.ui.dataeditor.RDataTableColumn; |
| import org.eclipse.statet.rj.data.UnexpectedRDataException; |
| import org.eclipse.statet.rj.data.impl.RCharacter32Store; |
| import org.eclipse.statet.rj.ts.core.RToolService; |
| |
| |
| public abstract class VariableFilter { |
| |
| |
| protected final static RCharacter32Store NO_VALUES= new RCharacter32Store(); |
| |
| private class BindingListener implements IValueChangeListener<Object>, ISetChangeListener<Object> { |
| |
| @Override |
| public void handleSetChange(final SetChangeEvent<?> event) { |
| updateFilter(1); |
| } |
| |
| @Override |
| public void handleValueChange(final ValueChangeEvent<?> event) { |
| updateFilter(1); |
| } |
| |
| } |
| |
| |
| private final FilterSet filterSet; |
| |
| private final RDataTableColumn column; |
| |
| private IFilterListener listener; |
| |
| private String errorMessage; |
| |
| volatile boolean updateScheduled; |
| |
| private String filterRExpression; |
| |
| private final BindingListener valueListener= new BindingListener(); |
| |
| |
| protected VariableFilter(final FilterSet set, final RDataTableColumn column) { |
| this.filterSet= set; |
| this.column= column; |
| } |
| |
| |
| public abstract FilterType getType(); |
| |
| public FilterSet getSet() { |
| return this.filterSet; |
| } |
| |
| public RDataTableColumn getColumn() { |
| return this.column; |
| } |
| |
| public void load(final VariableFilter filter) { |
| } |
| |
| public void reset() { |
| } |
| |
| protected void scheduleUpdate() { |
| this.updateScheduled= true; |
| this.filterSet.scheduleUpdate(false); |
| } |
| |
| protected void registerObservable(final IObservable observable) { |
| if (observable instanceof IObservableValue) { |
| ((IObservableValue<?>) observable).addValueChangeListener(this.valueListener); |
| } |
| if (observable instanceof IObservableSet) { |
| ((IObservableSet<?>) observable).addSetChangeListener(this.valueListener); |
| } |
| } |
| |
| protected void updateFilter(final int flag) { |
| String rExpression= createFilter(getColumn().getRExpression()); |
| if (rExpression != null && rExpression.isEmpty()) { |
| rExpression= null; |
| } |
| if ((this.filterRExpression != null) ? this.filterRExpression.equals(rExpression) : null == rExpression) { |
| return; |
| } |
| this.filterRExpression= rExpression; |
| this.filterSet.updateFilter((flag & 1) == 1); |
| } |
| |
| protected abstract String createFilter(String varExpression); |
| |
| protected void runInRealm(final Runnable runnable) { |
| this.filterSet.runInRealm(runnable); |
| } |
| |
| |
| public void setListener(final IFilterListener listener) { |
| this.listener= listener; |
| } |
| |
| protected abstract void update(RToolService r, ProgressMonitor m) throws StatusException, UnexpectedRDataException; |
| |
| protected void notifyListeners() { |
| if (this.listener != null) { |
| this.listener.filterChanged(); |
| } |
| } |
| |
| protected void setError(final String message) { |
| this.errorMessage= message; |
| } |
| |
| public String getError() { |
| return this.errorMessage; |
| } |
| |
| public String getFilterRExpression() { |
| return this.filterRExpression; |
| } |
| |
| public String getFilterRExpression(final String mainExpression, final int nameFlags) { |
| final String varExpression= mainExpression |
| + getColumn().getElementName().getDisplayName(nameFlags).substring(1); |
| return createFilter(varExpression); |
| } |
| |
| |
| // @Override |
| // public int hashCode() { |
| // return this.column.getName().hashCode(); |
| // } |
| // |
| // @Override |
| // public boolean equals(Object obj) { |
| // return (obj instanceof VariableFilter |
| // && this.column.getName().equals(((VariableFilter) obj).this.column.getName()) ); |
| // } |
| |
| } |