/*
* 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.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.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
/**
* This view displays the montary amounts used for cost/benefit analyses
*
* @author Fabian Prasser
*/
public class ViewCostBenefitModel implements IView {
/**
* Helper interface
* @author Fabian Prasser
*
* @param <T>
*/
private interface Callback<T> {
abstract void call(T value);
}
/** Controller */
private final Controller controller;
/** View */
private final Composite root;
/** View */
private Text textPublisherBenefit;
/** View */
private Text textPublisherLoss;
/** View */
private Text textAdversaryGain;
/** View */
private Text textAdversaryCost;
/** Model */
private Model model;
/**
* Validator
*/
private final IInputValidator validator = 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) {
return null;
} else {
return Resources.getMessage("ViewPopulationModel.7"); //$NON-NLS-1$
}
}
};
/**
* Creates a new instance.
*
* @param parent
* @param controller
* @param layoutCriteria
*/
public ViewCostBenefitModel(final Composite parent,
final Controller controller) {
controller.addListener(ModelPart.MODEL, this);
this.controller = controller;
// Create group
root = new Composite(parent, SWT.NONE);
root.setLayout(GridLayoutFactory.swtDefaults().numColumns(6).create());
// Create text fields
textPublisherBenefit = createInputField(Resources.getMessage("ViewCostBenefitModel.1"), new Callback<Double>(){ //$NON-NLS-1$
@Override public void call(Double value){
model.getInputConfig().setPublisherBenefit(value);
controller.update(new ModelEvent(ViewCostBenefitModel.this, ModelPart.COST_BENEFIT_MODEL, value));
}
});
textPublisherLoss = createInputField(Resources.getMessage("ViewCostBenefitModel.2"), new Callback<Double>(){ //$NON-NLS-1$
@Override public void call(Double value){
model.getInputConfig().setPublisherLoss(value);
controller.update(new ModelEvent(ViewCostBenefitModel.this, ModelPart.COST_BENEFIT_MODEL, value));
}
});
textAdversaryGain = createInputField(Resources.getMessage("ViewCostBenefitModel.3"), new Callback<Double>(){ //$NON-NLS-1$
@Override public void call(Double value){
model.getInputConfig().setAdversaryGain(value);
controller.update(new ModelEvent(ViewCostBenefitModel.this, ModelPart.COST_BENEFIT_MODEL, value));
}
});
textAdversaryCost = createInputField(Resources.getMessage("ViewCostBenefitModel.4"), new Callback<Double>(){ //$NON-NLS-1$
@Override public void call(Double value){
model.getInputConfig().setAdversaryCost(value);
controller.update(new ModelEvent(ViewCostBenefitModel.this, ModelPart.COST_BENEFIT_MODEL, value));
}
});
this.reset();
}
@Override
public void dispose() {
if (!root.isDisposed()) {
root.dispose();
}
controller.removeListener(this);
}
@Override
public void reset() {
textPublisherBenefit.setText(""); //$NON-NLS-1$
textPublisherLoss.setText(""); //$NON-NLS-1$
textAdversaryGain.setText(""); //$NON-NLS-1$
textAdversaryCost.setText(""); //$NON-NLS-1$
textPublisherBenefit.setToolTipText(textPublisherBenefit.getText());
textPublisherLoss.setToolTipText(textPublisherLoss.getText());
textAdversaryGain.setToolTipText(textAdversaryGain.getText());
textAdversaryCost.setToolTipText(textAdversaryCost.getText());
SWTUtil.disable(root);
}
@Override
public void update(final ModelEvent event) {
if (event.part == ModelPart.MODEL) {
this.model = (Model) event.data;
update();
}
}
/**
* Creates an input field
* @param caption
* @param callback
* @return
*/
private Text createInputField(String caption, final Callback<Double> callback) {
// Label
Label label = new Label(root, SWT.NONE);
label.setText(caption);
// Text field
final Text text = new Text(root, SWT.BORDER | SWT.SINGLE);
text.setText("0"); //$NON-NLS-1$
text.setToolTipText("0"); //$NON-NLS-1$
text.setLayoutData(SWTUtil.createFillHorizontallyGridData());
text.setEditable(false);
// Button
Button btn1 = new Button(root, SWT.PUSH);
btn1.setText(Resources.getMessage("ViewCostBenefitModel.0")); //$NON-NLS-1$
btn1.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent arg0) {
String value = controller.actionShowInputDialog(root.getShell(),
Resources.getMessage("ViewCostBenefitModel.5"), //$NON-NLS-1$
Resources.getMessage("ViewCostBenefitModel.6"), //$NON-NLS-1$
text.getToolTipText(),
validator);
if (value != null) {
callback.call(Double.valueOf(value));
update();
}
}
});
// Return
return text;
}
/**
* Updates the view.
*
* @param node
*/
private void update() {
// Check
if (model == null || model.getInputConfig() == null) {
return;
}
// Disable
root.setRedraw(false);
// Pretty, may involve rounding
textPublisherBenefit.setText(SWTUtil.getPrettyString(model.getInputConfig().getPublisherBenefit()));
textPublisherLoss.setText(SWTUtil.getPrettyString(model.getInputConfig().getPublisherLoss()));
textAdversaryGain.setText(SWTUtil.getPrettyString(model.getInputConfig().getAdversaryGain()));
textAdversaryCost.setText(SWTUtil.getPrettyString(model.getInputConfig().getAdversaryCost()));
// Not pretty, but precise
textPublisherBenefit.setToolTipText(String.valueOf(model.getInputConfig().getPublisherBenefit()));
textPublisherLoss.setToolTipText(String.valueOf(model.getInputConfig().getPublisherLoss()));
textAdversaryGain.setToolTipText(String.valueOf(model.getInputConfig().getAdversaryGain()));
textAdversaryCost.setToolTipText(String.valueOf(model.getInputConfig().getAdversaryCost()));
// Enable
root.setRedraw(true);
SWTUtil.enable(root);
}
}