/*
* 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.ARXPopulationModel.Region;
import org.deidentifier.arx.DataHandle;
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.dialogs.IInputValidator;
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.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
/**
* This view displays the population settings
*
* @author Fabian Prasser
*/
public class ViewPopulationModel implements IView {
/** Controller */
private final Controller controller;
/** View */
private final Composite root;
/** View */
private Combo combo;
/** View */
private Text text;
/** View */
private Text text2;
/** Model */
private Model model;
/**
* Creates a new instance.
*
* @param parent
* @param controller
* @param layoutCriteria
*/
public ViewPopulationModel(final Composite parent,
final Controller controller) {
controller.addListener(ModelPart.INPUT, this);
controller.addListener(ModelPart.POPULATION_MODEL, this);
controller.addListener(ModelPart.MODEL, this);
this.controller = controller;
// Create group
root = new Composite(parent, SWT.NONE);
root.setLayout(GridLayoutFactory.swtDefaults().numColumns(3).create());
create(root);
reset();
}
@Override
public void dispose() {
controller.removeListener(this);
}
@Override
public void reset() {
text.setText(""); //$NON-NLS-1$
text2.setText(""); //$NON-NLS-1$
SWTUtil.disable(root);
}
@Override
public void update(final ModelEvent event) {
if (event.part == ModelPart.MODEL) {
this.model = (Model) event.data;
update();
} else if (event.part == ModelPart.INPUT || event.part == ModelPart.POPULATION_MODEL) {
update();
}
}
/**
* Creates the required controls.
*
* @param parent
*/
private void create(final Composite parent) {
// Region
Label lbl1 = new Label(parent, SWT.NONE);
lbl1.setText(Resources.getMessage("ViewPopulationModel.3")); //$NON-NLS-1$
combo = new Combo(parent, SWT.SINGLE | SWT.READ_ONLY);
for (Region region : Region.values()) {
combo.add(region.getName());
}
combo.setEnabled(false);
combo.setLayoutData(SWTUtil.createFillHorizontallyGridData(true, 2));
combo.addSelectionListener(new SelectionAdapter(){
public void widgetSelected(SelectionEvent arg0) {
if (model.getInputConfig() != null && model.getInputConfig().getInput() != null && combo.getSelectionIndex() != -1) {
Region selected = null;
String sselected = combo.getItem(combo.getSelectionIndex());
for (Region region : Region.values()) {
if (region.getName().equals(sselected)) {
selected = region;
break;
}
}
if (selected != null) {
model.getRiskModel().setRegion(selected);
updateLabels();
controller.update(new ModelEvent(ViewPopulationModel.this, ModelPart.POPULATION_MODEL, model.getRiskModel()));
}
}
}
});
// Sampling fraction
Label lbl2 = new Label(parent, SWT.NONE);
lbl2.setText(Resources.getMessage("ViewPopulationModel.4")); //$NON-NLS-1$
text = new Text(parent, SWT.BORDER | SWT.SINGLE);
text.setText("0"); //$NON-NLS-1$
text.setToolTipText("0"); //$NON-NLS-1$
text.setLayoutData(SWTUtil.createFillHorizontallyGridData());
text.setEditable(false);
// Button for updating
Button btn1 = new Button(parent, SWT.PUSH);
btn1.setText(Resources.getMessage("ViewPopulationModel.0")); //$NON-NLS-1$
btn1.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent arg0) {
String _value = controller.actionShowInputDialog(parent.getShell(),
Resources.getMessage("ViewPopulationModel.1"), //$NON-NLS-1$
Resources.getMessage("ViewPopulationModel.2"), //$NON-NLS-1$
text.getToolTipText(),
new IInputValidator(){
@Override
public String isValid(String arg0) {
double value = 0d;
try {
value = Double.valueOf(arg0);
} catch (Exception e) {
return Resources.getMessage("ViewPopulationModel.5"); //$NON-NLS-1$
}
if (value > 0d && value <= 1d) {
return null;
} else {
return Resources.getMessage("ViewPopulationModel.7"); //$NON-NLS-1$
}
}});
if (_value != null) {
DataHandle handle = model.getInputConfig().getInput().getHandle();
long populationSize = (long)Math.round((double)handle.getNumRows() / Double.valueOf(_value));
if (populationSize == model.getRiskModel().getPopulationSize()) {
return;
}
model.getRiskModel().setPopulationSize(populationSize);
for (int i=0; i<combo.getItemCount(); i++) {
if (combo.getItem(i).equals(Region.NONE.getName())) {
combo.select(i);
break;
}
}
updateLabels();
controller.update(new ModelEvent(ViewPopulationModel.this, ModelPart.POPULATION_MODEL, model.getRiskModel()));
}
}
});
Label lbl3 = new Label(parent, SWT.NONE);
lbl3.setText(Resources.getMessage("ViewPopulationModel.6")); //$NON-NLS-1$
text2 = new Text(parent, SWT.BORDER | SWT.SINGLE);
text2.setText("0"); //$NON-NLS-1$
text2.setToolTipText("0"); //$NON-NLS-1$
text2.setLayoutData(SWTUtil.createFillHorizontallyGridData());
text2.setEditable(false);
// Button for updating
Button btn2 = new Button(parent, SWT.PUSH);
btn2.setText(Resources.getMessage("ViewPopulationModel.8")); //$NON-NLS-1$
btn2.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent arg0) {
if (model == null || model.getInputConfig() == null || model.getInputConfig().getInput() == null) {
return;
}
final DataHandle handle = model.getInputConfig().getInput().getHandle();
String _value = controller.actionShowInputDialog(parent.getShell(),
Resources.getMessage("ViewPopulationModel.9"), //$NON-NLS-1$
Resources.getMessage("ViewPopulationModel.10") + handle.getNumRows(), //$NON-NLS-1$
text2.getToolTipText(),
new IInputValidator(){
@Override
public String isValid(String arg0) {
int value = 0;
try {
value = Integer.valueOf(arg0);
} catch (Exception e) {
return Resources.getMessage("ViewPopulationModel.11"); //$NON-NLS-1$
}
if (value >= handle.getNumRows()) {
return null;
} else {
return Resources.getMessage("ViewPopulationModel.12"); //$NON-NLS-1$
}
}});
if (_value != null) {
long value = Long.valueOf(_value);
model.getRiskModel().setPopulationSize(value);
for (int i=0; i<combo.getItemCount(); i++) {
if (combo.getItem(i).equals(Region.NONE.getName())) {
combo.select(i);
break;
}
}
updateLabels();
controller.update(new ModelEvent(ViewPopulationModel.this, ModelPart.POPULATION_MODEL, model.getRiskModel()));
}
}
});
}
/**
* Updates the view.
*
* @param node
*/
private void update() {
// Check
if (model == null || model.getInputConfig() == null ||
model.getInputConfig().getInput() == null) {
return;
}
root.setRedraw(false);
for (int i=0; i<combo.getItemCount(); i++) {
if (combo.getItem(i).equals(model.getRiskModel().getRegion().getName())) {
combo.select(i);
break;
}
}
updateLabels();
root.setRedraw(true);
SWTUtil.enable(root);
}
/**
* Updates both labels
*/
private void updateLabels() {
if (model == null || model.getInputConfig() == null || model.getInputConfig().getInput() == null) {
return;
}
DataHandle handle = model.getInputConfig().getInput().getHandle();
long sampleSize = handle.getNumRows();
long populationSize = (long)model.getRiskModel().getPopulationSize();
double fraction = (double)sampleSize / (double)populationSize;
text.setText(SWTUtil.getPrettyString(fraction));
text.setToolTipText(String.valueOf(fraction));
text2.setText(SWTUtil.getPrettyString(populationSize));
text2.setToolTipText(String.valueOf(populationSize));
}
}