/* * 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.define; import org.deidentifier.arx.gui.Controller; import org.deidentifier.arx.gui.model.Model; import org.deidentifier.arx.gui.model.ModelEvent; import org.deidentifier.arx.gui.model.ModelEvent.ModelPart; import org.deidentifier.arx.gui.resources.Resources; import org.deidentifier.arx.gui.view.SWTUtil; import org.deidentifier.arx.gui.view.def.IView; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.layout.GridLayoutFactory; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Scale; /** * This view displays general settings regarding data transformation. * * @author Fabian Prasser */ public class ViewTransformationSettings implements IView { /** Static settings. */ private static final int LABEL_WIDTH = 50; /** Static settings. */ private static final int LABEL_HEIGHT = 20; /** Controller. */ private final Controller controller; /** Model. */ private Model model; /** View */ private Scale sliderOutliers; /** View. */ private Label labelOutliers; /** View. */ private Button buttonPracticalMonotonicity; /** View. */ private Composite root; /** View. */ private Button precomputedVariant; /** View. */ private Scale precomputationThreshold; /** View. */ private Label labelThreshold; /** * Creates a new instance. * * @param parent * @param controller */ public ViewTransformationSettings(final Composite parent, final Controller controller) { this.controller = controller; this.controller.addListener(ModelPart.MODEL, this); this.controller.addListener(ModelPart.METRIC, this); this.controller.addListener(ModelPart.INPUT, this); this.root = build(parent); } @Override public void dispose() { controller.removeListener(this); } @Override public void reset() { precomputedVariant.setSelection(false); precomputationThreshold.setSelection(0); sliderOutliers.setSelection(0); labelOutliers.setText("0%"); //$NON-NLS-1 labelThreshold.setText("0%"); //$NON-NLS-1 buttonPracticalMonotonicity.setSelection(false); SWTUtil.disable(root); } @Override public void update(final ModelEvent event) { if (event.part == ModelPart.MODEL) { model = (Model) event.data; updateControls(); } else if (event.part == ModelPart.INPUT || event.part == ModelPart.METRIC) { updateControls(); } } /** * Builds this view * * @param parent * @return */ private Composite build(final Composite parent) { // Create input group Composite group = new Composite(parent, SWT.NONE); group.setLayout(SWTUtil.createGridLayout(4, false)); // Create outliers slider final Label sLabel = new Label(group, SWT.PUSH); sLabel.setText(Resources.getMessage("CriterionDefinitionView.11")); //$NON-NLS-1$ Composite outliersBase = new Composite(group, SWT.NONE); GridData baseData = SWTUtil.createFillHorizontallyGridData(); baseData.horizontalSpan = 3; outliersBase.setLayoutData(baseData); outliersBase.setLayout(GridLayoutFactory.swtDefaults().numColumns(2).create()); labelOutliers = new Label(outliersBase, SWT.BORDER | SWT.CENTER); GridData d2 = new GridData(); d2.minimumWidth = LABEL_WIDTH; d2.widthHint = LABEL_WIDTH; d2.heightHint = LABEL_HEIGHT; labelOutliers.setLayoutData(d2); labelOutliers.setText("0%"); //$NON-NLS-1$ sliderOutliers = new Scale(outliersBase, SWT.HORIZONTAL); sliderOutliers.setLayoutData(SWTUtil.createFillHorizontallyGridData()); sliderOutliers.setMaximum(SWTUtil.SLIDER_MAX); sliderOutliers.setMinimum(0); sliderOutliers.setSelection(0); sliderOutliers.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(final SelectionEvent arg0) { model.getInputConfig() .setAllowedOutliers(SWTUtil.sliderToDouble(0d, 1d, sliderOutliers.getSelection())); labelOutliers.setText(SWTUtil.getPrettyString(model.getInputConfig().getAllowedOutliers()*100d)+"%"); if (model.getInputConfig().getAllowedOutliers() != 0) { buttonPracticalMonotonicity.setEnabled(true); } else { buttonPracticalMonotonicity.setSelection(false); buttonPracticalMonotonicity.setEnabled(false); model.getInputConfig().setPracticalMonotonicity(false); } } }); // Build approximate button final Label m2Label = new Label(group, SWT.PUSH); m2Label.setText(Resources.getMessage("CriterionDefinitionView.31")); //$NON-NLS-1$ d2 = new GridData(); d2.heightHint = LABEL_HEIGHT; d2.minimumHeight = LABEL_HEIGHT; m2Label.setLayoutData(d2); final GridData d82 = SWTUtil.createFillHorizontallyGridData(); d82.horizontalSpan = 3; buttonPracticalMonotonicity = new Button(group, SWT.CHECK); buttonPracticalMonotonicity.setText(Resources.getMessage("CriterionDefinitionView.53")); //$NON-NLS-1$ buttonPracticalMonotonicity.setSelection(false); buttonPracticalMonotonicity.setEnabled(false); buttonPracticalMonotonicity.setLayoutData(d82); buttonPracticalMonotonicity.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(final SelectionEvent arg0) { model.getInputConfig() .setPracticalMonotonicity(buttonPracticalMonotonicity.getSelection()); } }); // Create slider for precomputation threshold final Label sLabel2 = new Label(group, SWT.PUSH); sLabel2.setText(Resources.getMessage("CriterionDefinitionView.71")); //$NON-NLS-1$ precomputedVariant = new Button(group, SWT.CHECK); precomputedVariant.setText(Resources.getMessage("CriterionDefinitionView.70")); //$NON-NLS-1$ precomputedVariant.setSelection(false); precomputedVariant.setEnabled(false); precomputedVariant.setLayoutData(GridDataFactory.swtDefaults().span(1, 1).create()); precomputedVariant.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(final SelectionEvent arg0) { model.getMetricConfiguration().setPrecomputed(precomputedVariant.getSelection()); if (precomputedVariant.getSelection()) { precomputationThreshold.setSelection(SWTUtil.doubleToSlider(0d, 1d, model.getMetricConfiguration().getPrecomputationThreshold())); precomputationThreshold.setEnabled(true); labelThreshold.setText(SWTUtil.getPrettyString((model.getMetricConfiguration().getPrecomputationThreshold()*100d))+"%"); } else { precomputationThreshold.setEnabled(false); } controller.update(new ModelEvent(this, ModelPart.METRIC, model.getMetricDescription())); } }); labelThreshold = new Label(group, SWT.BORDER | SWT.CENTER); GridData d24 = new GridData(); d24.minimumWidth = LABEL_WIDTH; d24.widthHint = LABEL_WIDTH; d24.heightHint = LABEL_HEIGHT; labelThreshold.setLayoutData(d24); labelThreshold.setText("0%"); //$NON-NLS-1$ precomputationThreshold = new Scale(group, SWT.HORIZONTAL); precomputationThreshold.setLayoutData(SWTUtil.createFillHorizontallyGridData()); precomputationThreshold.setMaximum(SWTUtil.SLIDER_MAX); precomputationThreshold.setMinimum(0); precomputationThreshold.setSelection(0); precomputationThreshold.setEnabled(false); precomputationThreshold.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(final SelectionEvent arg0) { model.getMetricConfiguration().setPrecomputationThreshold(SWTUtil.sliderToDouble(0d, 1d, precomputationThreshold.getSelection())); labelThreshold.setText(SWTUtil.getPrettyString(model.getMetricConfiguration().getPrecomputationThreshold()*100d)+"%"); } }); return group; } /** * This method updates the controls */ private void updateControls(){ // Disable root.setRedraw(false); // Metric-related stuff double threshold = model.getMetricConfiguration().getPrecomputationThreshold(); boolean supported = model.getMetricDescription().isPrecomputationSupported(); boolean precomputed = model.getMetricConfiguration().isPrecomputed(); this.precomputedVariant.setSelection(precomputed); this.precomputedVariant.setEnabled(supported); this.precomputationThreshold.setSelection(SWTUtil.doubleToSlider(0d, 1d, threshold)); this.precomputationThreshold.setEnabled(supported); this.labelThreshold.setText(SWTUtil.getPrettyString(threshold*100d)+"%"); // Other stuff sliderOutliers.setSelection(SWTUtil.doubleToSlider(0d, 0.999d, model.getInputConfig().getAllowedOutliers())); labelOutliers.setText(SWTUtil.getPrettyString(model.getInputConfig().getAllowedOutliers()*100d)+"%"); buttonPracticalMonotonicity.setSelection(model.getInputConfig().isPracticalMonotonicity()); // Enable root.setRedraw(true); SWTUtil.enable(root); } }