blob: 127848f54973bc1496f682cdc60f38e8859ab767 [file] [log] [blame]
/*=============================================================================#
# 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()) );
// }
}