/*
* 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.common;
import org.deidentifier.arx.Data;
import org.deidentifier.arx.DataDefinition;
import org.deidentifier.arx.DataHandle;
import org.deidentifier.arx.DataHandleSubset;
import org.deidentifier.arx.RowSet;
import org.deidentifier.arx.gui.Controller;
import org.deidentifier.arx.gui.model.ModelEvent;
import org.deidentifier.arx.gui.model.ModelEvent.ModelPart;
import org.deidentifier.arx.gui.resources.Resources;
import org.eclipse.nebula.widgets.nattable.selection.event.CellSelectionEvent;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
/**
* A view on a <code>Data</code> object.
*
* @author Fabian Prasser
*/
public class ViewDataInput extends ViewData {
/**
*
* Creates a new (non-editable) data view.
*
* @param parent
* @param controller
*/
public ViewDataInput(final Composite parent,
final Controller controller,
final String helpid) {
this (parent, controller, helpid, false);
}
/**
*
* Creates a new data view.
*
* @param parent
* @param controller
* @param editable
*/
public ViewDataInput(final Composite parent,
final Controller controller,
final String helpid,
final boolean editable) {
super(parent, controller, helpid, Resources.getMessage("AnalyzeView.1")); //$NON-NLS-1$
// Register
controller.addListener(ModelPart.RESEARCH_SUBSET, this);
controller.addListener(ModelPart.RESULT, this);
controller.addListener(ModelPart.ATTRIBUTE_TYPE, this);
controller.addListener(ModelPart.ATTRIBUTE_VALUE, this);
// Make editable
if (editable) {
final Menu menu = new Menu(parent.getShell());
MenuItem item1 = new MenuItem(menu, SWT.NONE);
item1.setText(Resources.getMessage("ViewDataInput.0")); //$NON-NLS-1$
item1.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(final SelectionEvent arg0) {
controller.actionMenuEditFindReplace();
}
});
table.addMouseListener(new MouseAdapter() {
@Override
public void mouseUp(MouseEvent arg0) {
if (model != null && model.getSelectedAttribute() != null &&
model.getInputConfig() != null &&
model.getInputConfig().getInput() != null &&
model.getInputConfig().getInput().getHandle() != null) {
menu.setEnabled(true);
} else {
menu.setEnabled(false);
}
if (arg0.button == 3 && menu.isEnabled()) {
Point display = table.toDisplay(arg0.x, arg0.y);
menu.setLocation(display.x, display.y);
menu.setVisible(true);
}
}
});
}
}
@Override
public void update(final ModelEvent event) {
super.update(event);
if (event.part == ModelPart.INPUT) {
// No result avail
if (event.data == null) {
reset();
return;
}
// Obtain data definition
DataDefinition definition = getDefinition();
// Check
if (definition == null) {
reset();
return;
}
// Update the table
DataHandle handle = getHandle();
// Check
if (handle == null) {
reset();
return;
}
// Use input subset
table.setResearchSubset(model.getInputConfig().getResearchSubset());
table.setGroups(null);
table.setData(handle);
// Update the attribute types
table.getHeaderImages().clear();
for (int i = 0; i < handle.getNumColumns(); i++) {
updateHeaderImage(i, definition.getAttributeType(handle.getAttributeName(i)));
}
// Redraw
table.setEnabled(true);
table.redraw();
this.enableSorting();
} else if (event.part == ModelPart.RESEARCH_SUBSET) {
// Update research subset
table.setResearchSubset((RowSet)event.data);
table.redraw();
} else if (event.part == ModelPart.ATTRIBUTE_VALUE) {
table.redraw();
} else if (event.part == ModelPart.SELECTED_VIEW_CONFIG || event.part == ModelPart.RESULT) {
// Update the table
DataHandle handle = getHandle();
// Check
if (handle == null) {
reset();
return;
}
table.setData(handle);
table.setGroups(null);
table.setResearchSubset(model.getInputConfig().getResearchSubset());
table.redraw();
} else if (event.part == ModelPart.ATTRIBUTE_TYPE) {
if (model != null){
DataHandle handle = getHandle();
if (handle != null) {
final String attr = (String) event.data;
// Obtain data definition
DataDefinition definition = getDefinition();
// Update the attribute types
final int index = handle.getColumnIndexOf(attr);
updateHeaderImage(index, definition.getAttributeType(attr));
// Redraw
table.setEnabled(true);
table.redraw();
}
}
}
}
@Override
protected void actionCellSelected(CellSelectionEvent arg1) {
super.actionCellSelected(arg1);
if (model == null) return;
int column = arg1.getColumnPosition();
int row = arg1.getRowPosition();
if (column == 0 && row >= 0) {
// Remap row index if showing the subset
if (table.getData() instanceof DataHandleSubset) {
int[] subset = ((DataHandleSubset) table.getData()).getSubset();
row = subset[row];
}
// Perform change
RowSet subset = model.getInputConfig().getResearchSubset();
if (subset.contains(row)) {
subset.remove(row);
} else {
subset.add(row);
}
// Fire event
model.setSubsetManual();
controller.update(new ModelEvent(this, ModelPart.RESEARCH_SUBSET, subset));
}
}
@Override
protected void actionSort(){
controller.actionDataSort(true);
}
@Override
protected DataDefinition getDefinition() {
if (model == null) return null;
else return model.getInputDefinition();
}
@Override
protected DataHandle getHandle() {
if (model != null){
Data data = model.getInputConfig().getInput();
if (data == null) {
return null;
}
DataHandle handle = data.getHandle();
if (model.getViewConfig().isSubset() &&
model.getOutputConfig() != null &&
model.getOutputConfig().getConfig() != null) {
handle = handle.getView();
}
return handle;
} else {
return null;
}
}
}