/*
* 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 org.deidentifier.arx.gui.resources.Resources;
import org.deidentifier.arx.gui.view.SWTUtil;
import org.deidentifier.arx.gui.view.def.IDialog;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.ShellAdapter;
import org.eclipse.swt.events.ShellEvent;
import org.eclipse.swt.events.ShellListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
/**
* This class implements a dialog for selecting multiple elements
*
* @author Fabian Prasser
*/
public class DialogMultiSelection extends TitleAreaDialog implements IDialog {
/** Widget. */
private Button ok = null;
/** Elements*/
private List<String> elements = new ArrayList<String>();
/** Selected elements*/
private List<String> selected = new ArrayList<String>();
/** Constant*/
private final String title;
/** Constant*/
private final String message;
/**
* Creates a new instance.
*
* @param parent
*/
public DialogMultiSelection(final Shell parent,
final String title,
final String message,
final List<String> elements,
final List<String> selected) {
super(parent);
this.title = title;
this.message = message;
this.elements = new ArrayList<String>(elements);
this.selected = new ArrayList<String>(selected);
}
@Override
public void create() {
super.create();
setTitle(title); //$NON-NLS-1$
setMessage(message, IMessageProvider.NONE); //$NON-NLS-1$
}
/**
* Returns the resulting project.
*
* @return
*/
public List<String> getSelectedItems() {
return this.selected;
}
@Override
protected void configureShell(Shell newShell) {
super.configureShell(newShell);
}
@Override
protected void createButtonsForButtonBar(final Composite parent) {
final GridData gridData = new GridData();
gridData.verticalAlignment = GridData.FILL;
gridData.horizontalSpan = 2;
gridData.verticalSpan = 2;
gridData.grabExcessHorizontalSpace = true;
gridData.grabExcessVerticalSpace = false;
gridData.horizontalAlignment = SWT.LEFT;
parent.setLayoutData(gridData);
parent.getParent().setLayoutData(gridData);
// Create OK Button
ok = createButton(parent,
Window.OK,
Resources.getMessage("ProjectDialog.3"), true); //$NON-NLS-1$
ok.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(final SelectionEvent e) {
setReturnCode(Window.OK);
close();
}
});
// Create Cancel Button
parent.setLayoutData(SWTUtil.createFillGridData());
final Button cancel = createButton(parent,
Window.CANCEL,
Resources.getMessage("ProjectDialog.4"), false); //$NON-NLS-1$
cancel.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(final SelectionEvent e) {
setReturnCode(Window.CANCEL);
close();
}
});
}
@Override
protected Control createDialogArea(final Composite parent) {
parent.setLayout(SWTUtil.createGridLayout(1));
final Table table = new Table(parent, SWT.CHECK | SWT.BORDER | SWT.V_SCROLL);
for (String element : this.elements) {
TableItem item = new TableItem(table, SWT.NONE);
item.setText(element);
item.setChecked(this.selected.contains(element));
}
table.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
if (event.detail == SWT.CHECK) {
TableItem item = event.item instanceof TableItem ? (TableItem) event.item : null;
if (item != null) {
if (item.getChecked() && !selected.contains(item.getText())) {
selected.add(item.getText());
} else {
selected.remove(item.getText());
}
}
}
}
});
table.setLayoutData(SWTUtil.createFillGridData());
return parent;
}
@Override
protected ShellListener getShellListener() {
return new ShellAdapter() {
@Override
public void shellClosed(final ShellEvent event) {
setReturnCode(Window.CANCEL);
}
};
}
}