/*
* ARX: Powerful Data Anonymization
* Copyright 2012 - 2017 Fabian Prasser, Florian Kohlmayer and contributors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.deidentifier.arx.gui.view.impl.wizard;
import org.deidentifier.arx.DataType.DataTypeWithRatioScale;
import org.deidentifier.arx.aggregates.AggregateFunction;
import org.deidentifier.arx.gui.resources.Resources;
import org.deidentifier.arx.gui.view.SWTUtil;
import org.deidentifier.arx.gui.view.impl.menu.EditorString;
import org.deidentifier.arx.gui.view.impl.wizard.HierarchyWizard.HierarchyWizardView;
import org.deidentifier.arx.gui.view.impl.wizard.HierarchyWizardEditorFunction.IHierarchyFunctionEditorParent;
import org.deidentifier.arx.gui.view.impl.wizard.HierarchyWizardModelGrouping.HierarchyWizardGroupingInterval;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
/**
* An editor for intervals.
*
* @author Fabian Prasser
* @param <T>
*/
public class HierarchyWizardEditorInterval<T> implements HierarchyWizardView, IHierarchyFunctionEditorParent<T>{
/** Var. */
private HierarchyWizardGroupingInterval<T> interval = null;
/** Var. */
private final HierarchyWizardModelGrouping<T> model;
/** Var. */
private final EditorString editorMin;
/** Var. */
private final EditorString editorMax;
/** Var. */
private final DataTypeWithRatioScale<T> type;
/** Var. */
private final HierarchyWizardEditorFunction<T> editorFunction;
/**
* Creates a new instance.
*
* @param parent
* @param model
*/
@SuppressWarnings("unchecked")
public HierarchyWizardEditorInterval(final Composite parent,
final HierarchyWizardModelGrouping<T> model) {
this.model = model;
this.model.register(this);
this.type = (DataTypeWithRatioScale<T>)model.getDataType();
Composite composite = new Composite(parent, SWT.NONE);
composite.setLayoutData(SWTUtil.createFillHorizontallyGridData());
composite.setLayout(SWTUtil.createGridLayout(2, true));
this.editorFunction = new HierarchyWizardEditorFunction<T>(this, model, composite, false);
createLabel(composite, Resources.getMessage("HierarchyWizardEditorInterval.0")); //$NON-NLS-1$
editorMin = new EditorString(composite) {
@Override
public boolean accepts(final String s) {
if (interval==null) return false;
if (!type.isValid(s)) return false;
T value = type.parse(s);
if (type.compare(value, interval.max) > 0) return false;
else return true;
}
@Override
public String getValue() {
if (interval==null) return ""; //$NON-NLS-1$
else return type.format(interval.min);
}
@Override
public void setValue(final String s) {
if (interval!=null){
if (interval.min != type.parse(s)){
interval.min = type.parse(s);
model.update(HierarchyWizardEditorInterval.this);
}
}
}
};
createLabel(composite, Resources.getMessage("HierarchyWizardEditorInterval.2")); //$NON-NLS-1$
editorMax = new EditorString(composite) {
@Override
public boolean accepts(final String s) {
if (interval==null) return false;
if (!type.isValid(s)) return false;
T value = type.parse(s);
if (type.compare(value, interval.min) < 0) return false;
else return true;
}
@Override
public String getValue() {
if (interval==null) return ""; //$NON-NLS-1$
else return type.format(interval.max);
}
@Override
public void setValue(final String s) {
if (interval!=null){
if (interval.max != type.parse(s)){
interval.max = type.parse(s);
model.update(HierarchyWizardEditorInterval.this);
}
}
}
};
}
@Override
public void setFunction(AggregateFunction<T> function) {
if (this.interval == null) return;
if (editorFunction.isDefaultFunction(function)) {
this.interval.function = model.getDefaultFunction();
} else {
this.interval.function = function;
}
model.update(this);
}
@SuppressWarnings("unchecked")
@Override
public void update() {
if (model.getSelectedElement() instanceof HierarchyWizardGroupingInterval){
this.interval = (HierarchyWizardGroupingInterval<T>)model.getSelectedElement();
this.editorFunction.setFunction(this.interval.function);
this.editorMin.update();
this.editorMax.update();
if (model.isFirst(this.interval)){
SWTUtil.enable(editorMin.getControl());
} else {
SWTUtil.disable(editorMin.getControl());
}
if (model.isLast(this.interval)){
SWTUtil.enable(editorMax.getControl());
} else {
SWTUtil.disable(editorMax.getControl());
}
this.editorFunction.update();
} else {
this.interval = null;
this.editorFunction.setFunction(null);
SWTUtil.disable(editorMin.getControl());
SWTUtil.disable(editorMax.getControl());
SWTUtil.disable(this.editorFunction.getControl1());
SWTUtil.disable(this.editorFunction.getControl2());
}
}
/**
* Creates a label.
*
* @param composite
* @param string
* @return
*/
private Label createLabel(Composite composite, String string) {
Label label = new Label(composite, SWT.NONE);
label.setText(string);
GridData data = SWTUtil.createFillVerticallyGridData();
data.verticalAlignment = SWT.CENTER;
label.setLayoutData(data);
return label;
}
}