/* * 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.aggregates.HierarchyBuilderRedactionBased.Order; import org.deidentifier.arx.gui.Controller; import org.deidentifier.arx.gui.resources.Resources; import org.deidentifier.arx.gui.view.SWTUtil; import org.eclipse.jface.fieldassist.ControlDecoration; import org.eclipse.jface.fieldassist.FieldDecorationRegistry; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; /** * A page for configuring the redaction-based builder. * * @author Fabian Prasser * @param <T> */ public class HierarchyWizardPageRedaction<T> extends HierarchyWizardPageBuilder<T> { /** Var. */ private final HierarchyWizardModelRedaction<T> model; /** Var. */ private Button buttonLeftAlign; /** Var. */ private Button buttonRightAlign; /** Var. */ private Button buttonLeftRedact; /** Var. */ private Button buttonRightRedact; /** Var. */ private Combo comboPaddingChar; /** Var. */ private Combo comboRedactionChar; /** Var. */ private Text textDomainSize; /** Var. */ private Text textAlphabetSize; /** Var. */ private Text textMaximalLength; /** * Creates a new instance. * * @param controller * @param wizard * @param model * @param finalPage */ public HierarchyWizardPageRedaction(Controller controller, final HierarchyWizard<T> wizard, final HierarchyWizardModel<T> model, final HierarchyWizardPageFinal<T> finalPage) { super(wizard, model.getRedactionModel(), finalPage); this.model = model.getRedactionModel(); setTitle(Resources.getMessage("HierarchyWizardPageRedaction.0")); //$NON-NLS-1$ setDescription(Resources.getMessage("HierarchyWizardPageRedaction.1")); //$NON-NLS-1$ setPageComplete(true); } @Override public void createControl(final Composite parent) { Composite composite = new Composite(parent, SWT.NONE); composite.setLayout(SWTUtil.createGridLayout(1, false)); Group group1 = new Group(composite, SWT.SHADOW_ETCHED_IN); group1.setText(Resources.getMessage("HierarchyWizardPageRedaction.2")); //$NON-NLS-1$ group1.setLayout(SWTUtil.createGridLayout(1, false)); group1.setLayoutData(SWTUtil.createFillHorizontallyGridData()); buttonLeftAlign = new Button(group1, SWT.RADIO); buttonLeftAlign.setText(Resources.getMessage("HierarchyWizardPageRedaction.3")); //$NON-NLS-1$ buttonRightAlign = new Button(group1, SWT.RADIO); buttonRightAlign.setText(Resources.getMessage("HierarchyWizardPageRedaction.4")); //$NON-NLS-1$ Group group2 = new Group(composite, SWT.SHADOW_ETCHED_IN); group2.setText(Resources.getMessage("HierarchyWizardPageRedaction.5")); //$NON-NLS-1$ group2.setLayout(SWTUtil.createGridLayout(1, false)); group2.setLayoutData(SWTUtil.createFillHorizontallyGridData()); buttonLeftRedact = new Button(group2, SWT.RADIO); buttonLeftRedact.setText(Resources.getMessage("HierarchyWizardPageRedaction.6")); //$NON-NLS-1$ buttonRightRedact = new Button(group2, SWT.RADIO); buttonRightRedact.setText(Resources.getMessage("HierarchyWizardPageRedaction.7")); //$NON-NLS-1$ Group group3 = new Group(composite, SWT.SHADOW_ETCHED_IN); group3.setText(Resources.getMessage("HierarchyWizardPageRedaction.8")); //$NON-NLS-1$ group3.setLayout(SWTUtil.createGridLayout(2, false)); group3.setLayoutData(SWTUtil.createFillHorizontallyGridData()); Label label1 = new Label(group3, SWT.NONE); label1.setText(Resources.getMessage("HierarchyWizardPageRedaction.9")); //$NON-NLS-1$ comboPaddingChar = new Combo(group3, SWT.READ_ONLY); comboPaddingChar.setLayoutData(SWTUtil.createFillHorizontallyGridData()); Label label2 = new Label(group3, SWT.NONE); label2.setText(Resources.getMessage("HierarchyWizardPageRedaction.10")); //$NON-NLS-1$ comboRedactionChar = new Combo(group3, SWT.READ_ONLY); comboRedactionChar.setLayoutData(SWTUtil.createFillHorizontallyGridData()); createItems(comboPaddingChar, true); createItems(comboRedactionChar, false); Group group4 = new Group(composite, SWT.SHADOW_ETCHED_IN); group4.setText(Resources.getMessage("HierarchyWizardPageRedaction.11")); //$NON-NLS-1$ GridLayout layout = SWTUtil.createGridLayout(6, false); layout.horizontalSpacing = 10; group4.setLayout(layout); group4.setLayoutData(SWTUtil.createFillHorizontallyGridData()); Label label3 = new Label(group4, SWT.NONE); label3.setText(Resources.getMessage("HierarchyWizardPageRedaction.12")); //$NON-NLS-1$ textDomainSize = new Text(group4, SWT.BORDER); textDomainSize.setLayoutData(SWTUtil.createFillHorizontallyGridData()); decorate(textDomainSize); Label label4 = new Label(group4, SWT.NONE); label4.setText(Resources.getMessage("HierarchyWizardPageRedaction.13")); //$NON-NLS-1$ textAlphabetSize = new Text(group4, SWT.BORDER); textAlphabetSize.setLayoutData(SWTUtil.createFillHorizontallyGridData()); decorate(textAlphabetSize); Label label5 = new Label(group4, SWT.NONE); label5.setText(Resources.getMessage("HierarchyWizardPageRedaction.14")); //$NON-NLS-1$ textMaximalLength = new Text(group4, SWT.BORDER); textMaximalLength.setLayoutData(SWTUtil.createFillHorizontallyGridData()); decorate(textMaximalLength); buttonLeftAlign.addSelectionListener(new SelectionAdapter(){ @Override public void widgetSelected(SelectionEvent arg0) { if (buttonLeftAlign.getSelection()) { model.setAlignmentOrder(Order.LEFT_TO_RIGHT); } } }); buttonRightAlign.addSelectionListener(new SelectionAdapter(){ @Override public void widgetSelected(SelectionEvent arg0) { if (buttonRightAlign.getSelection()) { model.setAlignmentOrder(Order.RIGHT_TO_LEFT); } } }); buttonLeftRedact.addSelectionListener(new SelectionAdapter(){ @Override public void widgetSelected(SelectionEvent arg0) { if (buttonLeftRedact.getSelection()) { model.setRedactionOrder(Order.LEFT_TO_RIGHT); } } }); buttonRightRedact.addSelectionListener(new SelectionAdapter(){ @Override public void widgetSelected(SelectionEvent arg0) { if (buttonRightRedact.getSelection()) { model.setRedactionOrder(Order.RIGHT_TO_LEFT); } } }); comboPaddingChar.addSelectionListener(new SelectionAdapter(){ @Override public void widgetSelected(SelectionEvent arg0) { int index = comboPaddingChar.getSelectionIndex(); if (index>=0){ model.setPaddingCharacter(comboPaddingChar.getItem(index).toCharArray()[1]); } } }); comboRedactionChar.addSelectionListener(new SelectionAdapter(){ @Override public void widgetSelected(SelectionEvent arg0) { int index = comboRedactionChar.getSelectionIndex(); if (index>=0){ model.setRedactionCharacter(comboRedactionChar.getItem(index).toCharArray()[1]); } } }); updatePage(); setControl(composite); } @Override public boolean isPageComplete() { String alphabet = textAlphabetSize.getText(); String domain = textDomainSize.getText(); String length = textMaximalLength.getText(); if (alphabet.length() == 0 && domain.length() == 0 && length.length() == 0) { return true; } if (alphabet.length() != 0 && domain.length() != 0 && length.length() != 0) { return isValidNumber(alphabet) && isValidNumber(domain) && isValidNumber(length); } if (alphabet.length() != 0 && length.length() != 0) { return isValidNumber(alphabet) && isValidNumber(length); } if (domain.length() != 0 && length.length() != 0) { return isValidNumber(domain) && isValidNumber(length); } return false; } @Override public void setVisible(boolean value){ super.setVisible(value); model.setVisible(value); } @Override public void updatePage() { textMaximalLength.setText(model.getMaxValueLength() == null ? "" : String.valueOf(model.getMaxValueLength())); //$NON-NLS-1$ textAlphabetSize.setText(model.getAlphabetSize() == null ? "" : String.valueOf(model.getAlphabetSize())); //$NON-NLS-1$ textDomainSize.setText(model.getDomainSize() == null ? "" : String.valueOf(model.getDomainSize())); //$NON-NLS-1$ buttonLeftAlign.setSelection(model.getAlignmentOrder() == Order.LEFT_TO_RIGHT); buttonRightAlign.setSelection(model.getAlignmentOrder() == Order.RIGHT_TO_LEFT); buttonLeftRedact.setSelection(model.getRedactionOrder() == Order.LEFT_TO_RIGHT); buttonRightRedact.setSelection(model.getRedactionOrder() == Order.RIGHT_TO_LEFT); comboPaddingChar.select(indexOf(comboPaddingChar, model.getPaddingCharacter())); comboRedactionChar.select(indexOf(comboRedactionChar, model.getRedactionCharacter())); } /** * Creates combo items. * * @param combo * @param padding */ private void createItems(Combo combo, boolean padding){ if (padding) { combo.add("( )"); //$NON-NLS-1$ combo.add("(0)"); //$NON-NLS-1$ } combo.add("(*)"); //$NON-NLS-1$ combo.add("(x)"); //$NON-NLS-1$ combo.add("(#)"); //$NON-NLS-1$ combo.add("(-)"); //$NON-NLS-1$ } /** * Decorates a text field for domain properties. * * @param text */ private void decorate(final Text text) { final ControlDecoration decoration = new ControlDecoration(text, SWT.RIGHT); text.addModifyListener(new ModifyListener(){ @Override public void modifyText(ModifyEvent arg0) { if (!isValidNumber(text.getText())) { decoration.setDescriptionText(Resources.getMessage("HierarchyWizardPageRedaction.23")); //$NON-NLS-1$ Image image = FieldDecorationRegistry.getDefault() .getFieldDecoration(FieldDecorationRegistry.DEC_ERROR) .getImage(); decoration.setImage(image); decoration.show(); } else { decoration.hide(); if (text == textAlphabetSize) { model.setAlphabetSize(text.getText().length() == 0 ? null : Integer.valueOf(text.getText())); } else if (text == textDomainSize) { model.setDomainSize(text.getText().length() == 0 ? null : Integer.valueOf(text.getText())); } else if (text == textMaximalLength) { model.setMaxValueLength(text.getText().length() == 0 ? null : Integer.valueOf(text.getText())); } } setPageComplete(isPageComplete()); } }); } /** * Returns the index of the item, or adds it to the combo. * * @param combo * @param value * @return */ private int indexOf(Combo combo, char value){ for (int i=0; i < combo.getItems().length; i++) { if (combo.getItem(i).toCharArray()[1]==value) { return i; } } combo.add("("+String.valueOf(value)+")"); //$NON-NLS-1$ //$NON-NLS-2$ return combo.getItemCount()-1; } /** * Returns whether a valid number has been entered. * * @param text * @return */ private boolean isValidNumber(String text) { if (text.length() == 0) { return true; } else { try { int value = Integer.parseInt(text); return value > 0d; } catch (Exception e){ return false; } } } }