/*
* 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.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.def.IView;
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.Menu;
import org.eclipse.swt.widgets.MenuItem;
/**
* This class implements an a menu for the editor for generalization hierarchies.
*
* @author Fabian Prasser
* @author Florian Kohlmayer
* @author Ledian Xhani
* @author Ljubomir Dshevlekov
*
*/
public class ComponentHierarchyMenu implements IView {
/** Model */
private Model model;
/** Menu. */
private Menu menu;
/** Hierarchy. */
private ComponentHierarchy hierarchy;
/** Controller. */
private Controller controller;
/** Item. */
private MenuItem itemInsertRow;
/** Item. */
private MenuItem itemDeleteRow;
/** Item. */
private MenuItem itemInsertColumn;
/** Item. */
private MenuItem itemDeleteColumn;
/** Item. */
private MenuItem itemMoveRowUp;
/** Item. */
private MenuItem itemMoveRowDown;
/** Item. */
private MenuItem itemEditItem;
/** Item. */
private MenuItem itemRenameItem;
/** Item. */
private MenuItem itemClear;
/** Item. */
private MenuItem itemInitialize;
/** Item. */
private MenuItem itemTopBottomCoding;
/**
* Creates a new instance
*
* @param hierarchy
* @param controller
*/
public ComponentHierarchyMenu(ComponentHierarchy hierarchy,
Controller controller) {
// Init
this.hierarchy = hierarchy;
this.controller = controller;
this.controller.addListener(ModelPart.MODEL, this);
this.createMenu();
// Listen
this.hierarchy.addMouseListener(new MouseAdapter() {
@Override
public void mouseDown(final MouseEvent e) {
if (e.button == 3) {
onMouseDown(ComponentHierarchyMenu.this.hierarchy.getControl().toDisplay(e.x, e.y));
}
}
});
}
@Override
public void dispose() {
controller.removeListener(this);
}
@Override
public void reset() {
// Empty by design
}
@Override
public void update(ModelEvent event) {
if (event.part == ModelPart.MODEL) {
this.model = (Model) event.data;
}
}
/**
* Checks and asks users whether functional hierarchies should be removed
* @return
*/
private boolean check() {
if (model != null && model.getInputConfig() != null && model.getSelectedAttribute() != null) {
if (model.getInputConfig().getHierarchyBuilder(model.getSelectedAttribute()) != null) {
return controller.actionShowQuestionDialog(Resources.getMessage("HierarchyView.20"), //$NON-NLS-1$
Resources.getMessage("HierarchyView.21")); //$NON-NLS-1$
} else {
return true;
}
} else {
return false;
}
}
/**
* Creates all components required for making the table editable.
*/
private void createMenu() {
// Creates the editors menu
this.menu = new Menu(hierarchy.getControl());
// Insert row action
itemInsertRow = new MenuItem(menu, SWT.NONE);
itemInsertRow.setText(Resources.getMessage("HierarchyView.7")); //$NON-NLS-1$
itemInsertRow.addSelectionListener(new SelectionAdapter() {
@Override public void widgetSelected(final SelectionEvent e) {
if (check()) {
hierarchy.actionInsertRow();
}
}
});
// Delete row action
itemDeleteRow = new MenuItem(menu, SWT.NONE);
itemDeleteRow.setText(Resources.getMessage("HierarchyView.8")); //$NON-NLS-1$
itemDeleteRow.addSelectionListener(new SelectionAdapter() {
@Override public void widgetSelected(final SelectionEvent e) {
if (check()) {
hierarchy.actionDeleteRow();
}
}
});
// Separator
new MenuItem(menu, SWT.SEPARATOR);
// Insert column action
itemInsertColumn = new MenuItem(menu, SWT.NONE);
itemInsertColumn.setText(Resources.getMessage("HierarchyView.9")); //$NON-NLS-1$
itemInsertColumn.addSelectionListener(new SelectionAdapter() {
@Override public void widgetSelected(final SelectionEvent e) {
if (check()) {
hierarchy.actionInsertColumn();
}
}
});
// Delete column action
itemDeleteColumn = new MenuItem(menu, SWT.NONE);
itemDeleteColumn.setText(Resources.getMessage("HierarchyView.10")); //$NON-NLS-1$
itemDeleteColumn.addSelectionListener(new SelectionAdapter() {
@Override public void widgetSelected(final SelectionEvent e) {
if (check()) {
hierarchy.actionDeleteColumn();
}
}
});
// Separator
new MenuItem(menu, SWT.SEPARATOR);
// Move up
itemMoveRowUp = new MenuItem(menu, SWT.NONE);
itemMoveRowUp.setText(Resources.getMessage("HierarchyView.11")); //$NON-NLS-1$
itemMoveRowUp.addSelectionListener(new SelectionAdapter() {
@Override public void widgetSelected(final SelectionEvent e) {
if (check()) {
hierarchy.actionMoveRowUp();
}
}
});
// Move down
itemMoveRowDown = new MenuItem(menu, SWT.NONE);
itemMoveRowDown.setText(Resources.getMessage("HierarchyView.12")); //$NON-NLS-1$
itemMoveRowDown.addSelectionListener(new SelectionAdapter() {
@Override public void widgetSelected(final SelectionEvent e) {
if (check()) {
hierarchy.actionMoveRowDown();
}
}
});
// Separator
new MenuItem(menu, SWT.SEPARATOR);
// Edit item action
itemEditItem = new MenuItem(menu, SWT.NONE);
itemEditItem.setText(Resources.getMessage("HierarchyView.18")); //$NON-NLS-1$
itemEditItem.addSelectionListener(new SelectionAdapter() {
@Override public void widgetSelected(final SelectionEvent e) {
if (check()) {
String value = getUserValue();
if (value != null) {
hierarchy.actionEditItem(value);
}
}
}
});
// Rename item action
itemRenameItem = new MenuItem(menu, SWT.NONE);
itemRenameItem.setText(Resources.getMessage("HierarchyView.15")); //$NON-NLS-1$
itemRenameItem.addSelectionListener(new SelectionAdapter() {
@Override public void widgetSelected(final SelectionEvent e) {
if (check()) {
String value = getUserValue();
if (value != null) {
hierarchy.actionRenameItem(value);
}
}
}
});
// Separator
new MenuItem(menu, SWT.SEPARATOR);
// Action clear
itemClear = new MenuItem(menu, SWT.NONE);
itemClear.setText(Resources.getMessage("HierarchyView.16")); //$NON-NLS-1$
itemClear.addSelectionListener(new SelectionAdapter() {
@Override public void widgetSelected(final SelectionEvent e) {
if (check()) {
hierarchy.actionClear();
}
}
});
// Action intialize
itemInitialize = new MenuItem(menu, SWT.NONE);
itemInitialize.setText(Resources.getMessage("HierarchyView.19")); //$NON-NLS-1$
itemInitialize.addSelectionListener(new SelectionAdapter() {
@Override public void widgetSelected(final SelectionEvent e) {
if (check()) {
if (hierarchy.isRowSelected() || hierarchy.isColumnSelected() ||
hierarchy.isCellSelected() || model == null || model.getInputConfig() == null ||
model.getInputConfig().getInput() == null ||
model.getSelectedAttribute() == null) { return; }
controller.actionMenuEditInitializeHierarchy();
}
}
});
// Action top/bottom coding
itemTopBottomCoding = new MenuItem(menu, SWT.NONE);
itemTopBottomCoding.setText(Resources.getMessage("HierarchyView.22")); //$NON-NLS-1$
itemTopBottomCoding.addSelectionListener(new SelectionAdapter() {
@Override public void widgetSelected(final SelectionEvent e) {
if (check()) {
if (hierarchy.isRowSelected() || hierarchy.isColumnSelected() ||
hierarchy.isCellSelected() || model == null || model.getInputConfig() == null ||
model.getInputConfig().getInput() == null ||
model.getSelectedAttribute() == null) { return; }
controller.actionMenuEditCreateTopBottomCodingHierarchy();
}
}
});
}
/**
* Queries the user for a new value
* @return
*/
private String getUserValue() {
String current = hierarchy.getSelectedValue();
return controller.actionShowInputDialog(controller.getResources().getShell(),
Resources.getMessage("HierarchyView.13"), //$NON-NLS-1$
Resources.getMessage("HierarchyView.14"), current); //$NON-NLS-1$
}
/**
* Mouse down action.
*
* @param point
*/
private void onMouseDown(Point point) {
// Init
boolean cell = hierarchy.isCellSelected();
boolean row = hierarchy.isRowSelected();
boolean column = hierarchy.isColumnSelected();
// Update menu items
itemInsertRow.setEnabled(row || cell);
itemDeleteRow.setEnabled(row || cell);
itemMoveRowUp.setEnabled(row || cell);
itemMoveRowDown.setEnabled(row || cell);
// ---------
itemInsertColumn.setEnabled(column || cell);
itemDeleteColumn.setEnabled(column || cell);
// ---------
itemEditItem.setEnabled(cell);
itemRenameItem.setEnabled(cell);
// ---------
itemClear.setEnabled(cell || row || column);
itemInitialize.setEnabled(hierarchy.isEmpty());
itemTopBottomCoding.setEnabled(hierarchy.isEmpty());
// Show
this.menu.setLocation(point);
this.menu.setVisible(true);
}
}