/*
* 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.menu;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import org.deidentifier.arx.ARXLogisticRegressionConfiguration.PriorFunction;
import org.deidentifier.arx.ARXSolverConfiguration;
import org.deidentifier.arx.AttributeType;
import org.deidentifier.arx.gui.Controller;
import org.deidentifier.arx.gui.model.Model;
import org.deidentifier.arx.gui.model.ModelRisk.RiskModelForAttributes;
import org.deidentifier.arx.gui.resources.Resources;
import org.deidentifier.arx.gui.view.def.IDialog;
import org.deidentifier.arx.io.CSVSyntax;
import org.eclipse.swt.widgets.Shell;
import de.linearbits.preferences.PreferenceBoolean;
import de.linearbits.preferences.PreferenceCharacter;
import de.linearbits.preferences.PreferenceDouble;
import de.linearbits.preferences.PreferenceInteger;
import de.linearbits.preferences.PreferenceSelection;
import de.linearbits.preferences.PreferenceString;
import de.linearbits.preferences.PreferenceText;
import de.linearbits.preferences.PreferencesDialog;
/**
* This class implements a dialog for editing project properties.
*
* @author Fabian Prasser
*/
public class DialogProperties implements IDialog {
/** Controller */
private final Controller controller;
/** Window */
private final PreferencesDialog dialog;
/** Model */
private final Model model;
/**
* Creates a new instance.
*
* @param parent
* @param model
*/
public DialogProperties(final Shell parent, final Model model, final Controller controller) {
// Init
this.controller = controller;
this.model = model;
// Create dialog
this.dialog = new PreferencesDialog(parent, Resources.getMessage("DialogProperties.0"), Resources.getMessage("DialogProperties.1")); //$NON-NLS-1$ //$NON-NLS-2$
this.createTabProject(this.dialog);
this.createTabInternals(this.dialog);
this.createTabTransformation(this.dialog);
this.createTabSearch(this.dialog);
this.createTabUtility(this.dialog);
this.createTabRisk(this.dialog);
}
/**
* Opens the dialog
*/
public void open() {
this.dialog.open();
}
/**
* Create a tab
* @param window
*/
private void createTabInternals(PreferencesDialog window) {
window.addCategory(Resources.getMessage("PropertyDialog.16"), //$NON-NLS-1$
controller.getResources().getManagedImage("settings-internals.png")); //$NON-NLS-1$
window.addGroup(Resources.getMessage("DialogProperties.2")); //$NON-NLS-1$
window.addPreference(new PreferenceInteger(Resources.getMessage("PropertyDialog.17"), 0, 1000000, 200) { //$NON-NLS-1$
protected Integer getValue() { return model.getHistorySize(); }
protected void setValue(Object t) { model.setHistorySize((Integer)t); }});
window.addPreference(new PreferenceDouble(Resources.getMessage("PropertyDialog.19"), 0d, 1d, 0.2d) { //$NON-NLS-1$
protected Double getValue() { return model.getSnapshotSizeDataset(); }
protected void setValue(Object t) { model.setSnapshotSizeDataset((Double)t); }});
window.addPreference(new PreferenceDouble(Resources.getMessage("PropertyDialog.21"), 0d, 1d, 0.8d) { //$NON-NLS-1$
protected Double getValue() { return model.getSnapshotSizeSnapshot(); }
protected void setValue(Object t) { model.setSnapshotSizeSnapshot((Double)t); }});
window.addPreference(new PreferenceInteger(Resources.getMessage("PropertyDialog.28"), 0, Integer.MAX_VALUE, 5000000) { //$NON-NLS-1$
protected Integer getValue() { return model.getMaximalSizeForComplexOperations(); }
protected void setValue(Object t) { model.setMaximalSizeForComplexOperations((Integer)t); }});
window.addPreference(new PreferenceBoolean(Resources.getMessage("PropertyDialog.29"), false) { //$NON-NLS-1$
protected Boolean getValue() { return model.isDebugEnabled(); }
protected void setValue(Object t) { model.setDebugEnabled((Boolean)t); }});
window.addGroup(Resources.getMessage("DialogProperties.3")); //$NON-NLS-1$
window.addPreference(new PreferenceInteger(Resources.getMessage("PropertyDialog.23"), 0, 10000, 100) { //$NON-NLS-1$
protected Integer getValue() { return model.getInitialNodesInViewer(); }
protected void setValue(Object t) { model.setInitialNodesInViewer((Integer)t); }});
window.addPreference(new PreferenceInteger(Resources.getMessage("PropertyDialog.25"), 0, 10000, 700) { //$NON-NLS-1$
protected Integer getValue() { return model.getMaxNodesInViewer(); }
protected void setValue(Object t) { model.setMaxNodesInViewer((Integer)t); }});
}
/**
* Create a tab
* @param window
*/
private void createTabProject(PreferencesDialog window) {
window.addCategory(Resources.getMessage("PropertyDialog.3"), //$NON-NLS-1$
controller.getResources().getManagedImage("settings-project.png")); //$NON-NLS-1$
window.addGroup(Resources.getMessage("DialogProperties.5")); //$NON-NLS-1$
window.addPreference(new PreferenceString(Resources.getMessage("PropertyDialog.4")) { //$NON-NLS-1$
protected String getValue() { return model.getName(); }
protected void setValue(Object t) { model.setName((String)t); }});
window.addPreference(new PreferenceText(Resources.getMessage("PropertyDialog.7")) { //$NON-NLS-1$
protected String getValue() { return model.getDescription(); }
protected void setValue(Object t) { model.setDescription((String)t); }});
window.addPreference(new PreferenceSelection(Resources.getMessage("PropertyDialog.33"), getLocales()) { //$NON-NLS-1$
protected String getValue() { return model.getLocale().getLanguage().toUpperCase(); }
protected void setValue(Object t) { model.setLocale(((String)t).equals("Default") ? Locale.getDefault() : new Locale(((String)t).toLowerCase())); }}); //$NON-NLS-1$
window.addGroup(Resources.getMessage("DialogProperties.6")); //$NON-NLS-1$
window.addPreference(new PreferenceCharacter(Resources.getMessage("PropertyDialog.35"), ';') { //$NON-NLS-1$
protected String getValue() { return String.valueOf(model.getCSVSyntax().getDelimiter()); }
protected void setValue(Object t) { model.getCSVSyntax().setDelimiter(((String)t).charAt(0)); }});
window.addPreference(new PreferenceCharacter(Resources.getMessage("PropertyDialog.36"), '"') { //$NON-NLS-1$
protected String getValue() { return String.valueOf(model.getCSVSyntax().getQuote()); }
protected void setValue(Object t) { model.getCSVSyntax().setQuote(((String)t).charAt(0)); }});
window.addPreference(new PreferenceCharacter(Resources.getMessage("PropertyDialog.37"), '"') { //$NON-NLS-1$
protected String getValue() { return String.valueOf(model.getCSVSyntax().getEscape()); }
protected void setValue(Object t) { model.getCSVSyntax().setEscape(((String)t).charAt(0)); }});
window.addPreference(new PreferenceSelection(Resources.getMessage("PropertyDialog.38"), CSVSyntax.getAvailableLinebreaks()) { //$NON-NLS-1$
protected String getValue() { return CSVSyntax.getLabelForLinebreak(model.getCSVSyntax().getLinebreak()); }
protected void setValue(Object t) { model.getCSVSyntax().setLinebreak(CSVSyntax.getLinebreakForLabel((String)t)); }}); //$NON-NLS-1$
}
/**
* Create a tab
* @param window
*/
private void createTabRisk(PreferencesDialog window) {
window.addCategory(Resources.getMessage("PropertyDialog.40"), //$NON-NLS-1$
controller.getResources().getManagedImage("settings-risk.png")); //$NON-NLS-1$
window.addGroup(Resources.getMessage("DialogProperties.7")); //$NON-NLS-1$
window.addPreference(new PreferenceInteger(Resources.getMessage("PropertyDialog.43"), 1, 10, 10) { //$NON-NLS-1$
protected Integer getValue() { return model.getRiskModel().getMaxQiSize(); }
protected void setValue(Object t) { model.getRiskModel().setMaxQiSize((Integer)t); }});
window.addPreference(new PreferenceSelection(Resources.getMessage("PropertyDialog.45"), getRiskModelsForAnalyses()) { //$NON-NLS-1$
protected String getValue() { return model.getRiskModel().getRiskModelForAttributes().name(); }
protected void setValue(Object arg0) { model.getRiskModel().setRiskModelForAttributes(RiskModelForAttributes.valueOf((String)arg0)); }
});
window.addGroup(Resources.getMessage("DialogProperties.8")); //$NON-NLS-1$
window.addPreference(new PreferenceDouble(Resources.getMessage("PropertyDialog.50"), 1.0e-12, 1d, ARXSolverConfiguration.getDefaultAccuracy()) { //$NON-NLS-1$
protected Double getValue() { return model.getRiskModel().getSolverConfiguration().getAccuracy(); }
protected void setValue(Object t) { model.getRiskModel().getSolverConfiguration().accuracy((Double)t); }});
window.addPreference(new PreferenceInteger(Resources.getMessage("PropertyDialog.51"), 1, 100000, ARXSolverConfiguration.getDefaultIterationsPerTry()) { //$NON-NLS-1$
protected Integer getValue() { return model.getRiskModel().getSolverConfiguration().getIterationsPerTry(); }
protected void setValue(Object t) { model.getRiskModel().getSolverConfiguration().iterationsPerTry((Integer)t); }});
window.addPreference(new PreferenceInteger(Resources.getMessage("PropertyDialog.52"), 1, 1000000, ARXSolverConfiguration.getDefaultIterationsTotal()) { //$NON-NLS-1$
protected Integer getValue() { return model.getRiskModel().getSolverConfiguration().getIterationsTotal(); }
protected void setValue(Object t) { model.getRiskModel().getSolverConfiguration().iterationsTotal((Integer)t); }});
window.addPreference(new PreferenceInteger(Resources.getMessage("PropertyDialog.53"), 1, 100000, ARXSolverConfiguration.getDefaultTimePerTry()) { //$NON-NLS-1$
protected Integer getValue() { return model.getRiskModel().getSolverConfiguration().getTimePerTry(); }
protected void setValue(Object t) { model.getRiskModel().getSolverConfiguration().timePerTry((Integer)t); }});
window.addPreference(new PreferenceInteger(Resources.getMessage("PropertyDialog.54"), 1, 1000000, ARXSolverConfiguration.getDefaultTimeTotal()) { //$NON-NLS-1$
protected Integer getValue() { return model.getRiskModel().getSolverConfiguration().getTimeTotal(); }
protected void setValue(Object t) { model.getRiskModel().getSolverConfiguration().timeTotal((Integer)t); }});
window.addPreference(new PreferenceBoolean(Resources.getMessage("PropertyDialog.56"), ARXSolverConfiguration.getDefaultDeterministic()) { //$NON-NLS-1$
protected Boolean getValue() { return model.getRiskModel().getSolverConfiguration().isDeterministic(); }
protected void setValue(Object t) { model.getRiskModel().getSolverConfiguration().setDeterministic((Boolean)t); }});
}
/**
* Create a tab
* @param window
*/
private void createTabSearch(PreferencesDialog window) {
window.addCategory(Resources.getMessage("PropertyDialog.130"), //$NON-NLS-1$
controller.getResources().getManagedImage("settings-search.png")); //$NON-NLS-1$
window.addGroup(Resources.getMessage("DialogProperties.9")); //$NON-NLS-1$
window.addPreference(new PreferenceInteger(Resources.getMessage("PropertyDialog.131"), 0, Integer.MAX_VALUE, 100000) { //$NON-NLS-1$
protected Integer getValue() { return model.getInputConfig().getHeuristicSearchThreshold(); }
protected void setValue(Object t) { model.getInputConfig().setHeuristicSearchThreshold((Integer)t); }});
window.addPreference(new PreferenceBoolean(Resources.getMessage("PropertyDialog.132"), false) { //$NON-NLS-1$
protected Boolean getValue() { return model.getInputConfig().isHeuristicSearchEnabled(); }
protected void setValue(Object t) { model.getInputConfig().setHeuristicSearchEnabled((Boolean)t); }});
window.addPreference(new PreferenceInteger(Resources.getMessage("PropertyDialog.133"), 0, Integer.MAX_VALUE, 30000) { //$NON-NLS-1$
protected Integer getValue() { return model.getInputConfig().getHeuristicSearchTimeLimit(); }
protected void setValue(Object t) { model.getInputConfig().setHeuristicSearchTimeLimit((Integer)t); }});
window.addGroup(Resources.getMessage("DialogProperties.10")); //$NON-NLS-1$
window.addPreference(new PreferenceBoolean(Resources.getMessage("PropertyDialog.44")) { //$NON-NLS-1$
protected Boolean getValue() { return model.getInputConfig().isHeuristicForSampleBasedCriteria(); }
protected void setValue(Object t) { model.getInputConfig().setHeuristicForSampleBasedCriteria((Boolean)t); }});
}
/**
* Create a tab
* @param window
*/
private void createTabTransformation(PreferencesDialog window) {
window.addCategory(Resources.getMessage("PropertyDialog.10"), //$NON-NLS-1$
controller.getResources().getManagedImage("settings-transformation.png")); //$NON-NLS-1$
window.addGroup(Resources.getMessage("DialogProperties.11")); //$NON-NLS-1$
window.addPreference(new PreferenceBoolean(Resources.getMessage("PropertyDialog.11"), true) { //$NON-NLS-1$
protected Boolean getValue() { return model.getInputConfig().isSuppressionAlwaysEnabled(); }
protected void setValue(Object t) { model.getInputConfig().setSuppressionAlwaysEnabled((Boolean)t); }});
window.addPreference(new PreferenceBoolean(Resources.getMessage("PropertyDialog.31"), false) { //$NON-NLS-1$
protected Boolean getValue() { return model.getInputConfig().isAttributeTypeSuppressed(AttributeType.SENSITIVE_ATTRIBUTE); }
protected void setValue(Object t) { model.getInputConfig().setAttributeTypeSuppressed(AttributeType.SENSITIVE_ATTRIBUTE, (Boolean)t); }});
window.addPreference(new PreferenceBoolean(Resources.getMessage("PropertyDialog.32"), false) { //$NON-NLS-1$
protected Boolean getValue() { return model.getInputConfig().isAttributeTypeSuppressed(AttributeType.INSENSITIVE_ATTRIBUTE); }
protected void setValue(Object t) { model.getInputConfig().setAttributeTypeSuppressed(AttributeType.INSENSITIVE_ATTRIBUTE, (Boolean)t); }});
}
/**
* Create a tab
* @param window
*/
private void createTabUtility(PreferencesDialog window) {
window.addCategory(Resources.getMessage("PropertyDialog.60"), //$NON-NLS-1$
controller.getResources().getManagedImage("settings-utility.png")); //$NON-NLS-1$
window.addGroup(Resources.getMessage("DialogProperties.12")); //$NON-NLS-1$
window.addPreference(new PreferenceBoolean(Resources.getMessage("PropertyDialog.61")) { //$NON-NLS-1$
protected Boolean getValue() { return model.getUseListwiseDeletion(); }
protected void setValue(Object t) { model.setUseListwiseDeletion((Boolean)t); }});
window.addGroup(Resources.getMessage("DialogProperties.13")); //$NON-NLS-1$
window.addPreference(new PreferenceBoolean(Resources.getMessage("PropertyDialog.62")) { //$NON-NLS-1$
protected Boolean getValue() { return model.getUseFunctionalHierarchies(); }
protected void setValue(Object t) { model.setUseFunctionalHierarchies((Boolean)t); }});
window.addGroup(Resources.getMessage("DialogProperties.14")); //$NON-NLS-1$
window.addPreference(new PreferenceInteger(Resources.getMessage("DialogProperties.15"), 1000, Integer.MAX_VALUE, 100000) { //$NON-NLS-1$
protected Integer getValue() { return model.getClassificationModel().getMaxRecords(); }
protected void setValue(Object t) { model.getClassificationModel().setMaxRecords((Integer)t); }});
window.addPreference(new PreferenceBoolean(Resources.getMessage("DialogProperties.17")) { //$NON-NLS-1$
protected Boolean getValue() { return model.getClassificationModel().isDeterministic(); }
protected void setValue(Object t) { model.getClassificationModel().setDeterministic((Boolean)t); }});
window.addPreference(new PreferenceInteger(Resources.getMessage("DialogProperties.18"), 2, 100, 10) { //$NON-NLS-1$
protected Integer getValue() { return model.getClassificationModel().getNumberOfFolds(); }
protected void setValue(Object t) { model.getClassificationModel().setNumberOfFolds((Integer)t); }});
window.addPreference(new PreferenceInteger(Resources.getMessage("DialogProperties.19"), 10, Integer.MAX_VALUE, 1000) { //$NON-NLS-1$
protected Integer getValue() { return model.getClassificationModel().getVectorLength(); }
protected void setValue(Object t) { model.getClassificationModel().setVectorLength((Integer)t); }});
window.addPreference(new PreferenceSelection(Resources.getMessage("DialogProperties.20"), getPriorFunctions()) { //$NON-NLS-1$
protected String getValue() { return model.getClassificationModel().getPriorFunction().name(); }
protected void setValue(Object arg0) { model.getClassificationModel().setPriorFunction(PriorFunction.valueOf((String)arg0)); }
});
}
/**
* Returns a list of available locales
* @return
*/
private String[] getLocales() {
List<String> languages = new ArrayList<String>();
languages.add(Resources.getMessage("DialogProperties.4")); //$NON-NLS-1$
for (String lang : Locale.getISOLanguages()) {
languages.add(lang.toUpperCase());
}
return languages.toArray(new String[]{});
}
/**
* Creates a list of prior functions
* @return
*/
private String[] getPriorFunctions() {
List<String> result = new ArrayList<String>();
for (PriorFunction function : PriorFunction.values()) {
result.add(function.name());
}
return result.toArray(new String[result.size()]);
}
/**
* Creates a list of models
* @return
*/
private String[] getRiskModelsForAnalyses() {
List<String> result = new ArrayList<String>();
for (RiskModelForAttributes model : RiskModelForAttributes.values()) {
result.add(model.name());
}
return result.toArray(new String[result.size()]);
}
}