blob: a95c45d5d840343ba639db9ec52587f244bfb638 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2014 Formal Mind GmbH.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Michael Jastram - initial API and implementation
******************************************************************************/
package org.eclipse.rmf.reqif10.pror.editor.presentation;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.eclipse.rmf.reqif10.EnumValue;
import org.eclipse.rmf.reqif10.pror.editor.agilegrid.ProrEnumerationMultiValueCellEditor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
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.graphics.Rectangle;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PlatformUI;
/**
* This -Control represents a GUI element that allows the selection of
* {@link EnumValue}s. It offers a save and cancel button, and is designed to be
* shown in a {@link Shell}.
*
* It is written so that it can be used by AgileGrid (see
* {@link ProrEnumerationMultiValueCellEditor} or stand-alone (e.g. in a search
* interface).
*
* IMPORTANT: AgileGrid provides a proper shell, to be used with
* {@link #showEnumSelector(Shell)}. Outside AgileGrid, a Shell must be
* constructed BEFORE instantiating the control. You can use the static method
* {@link #createShell(Shell)} for this purpose.
*
* @author jastram
*/
public class EnumSelector extends Composite {
private ArrayList<EnumValue> itemList = new ArrayList<EnumValue>();
private int status = SWT.OK;
private Collection<EnumValue> originalSelection;
/**
* Createes the Control.
*/
public EnumSelector(List<EnumValue> items, Collection<EnumValue> selection,
Composite parent, int style) {
super(parent, style);
originalSelection = selection;
GridLayout layout = new GridLayout();
layout.marginHeight = 0;
layout.marginWidth = 0;
layout.horizontalSpacing = 0;
layout.verticalSpacing = 5;
setLayout(layout);
Table table = new Table(this, SWT.CHECK);
GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
gd.heightHint = 150;
table.setLayoutData(gd);
table.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (e.detail == SWT.CHECK && e.item instanceof TableItem) {
TableItem item = (TableItem) e.item;
if (item.getChecked()) {
itemList.add((EnumValue) item.getData());
} else {
itemList.remove((EnumValue) item.getData());
}
}
}
});
for (EnumValue enumValue : items) {
TableItem tableItem = new TableItem(table, SWT.NONE);
String enumId = enumValue.getLongName() == null ? enumValue
.getIdentifier() : enumValue.getLongName();
tableItem.setText(enumId);
tableItem.setData(enumValue);
if (selection.contains(enumValue)) {
tableItem.setChecked(true);
itemList.add(enumValue);
}
}
Composite buttonPanel = new Composite(this, SWT.NONE);
buttonPanel
.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
buttonPanel.setLayout(new FillLayout(SWT.HORIZONTAL));
Button cancel = new Button(buttonPanel, SWT.PUSH);
cancel.setImage(PlatformUI.getWorkbench().getSharedImages()
.getImage(ISharedImages.IMG_TOOL_DELETE));
cancel.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
status = SWT.CANCEL;
Display.getCurrent().getActiveShell().close();
}
});
Button ok = new Button(buttonPanel, SWT.PUSH);
ok.setImage(PlatformUI.getWorkbench().getSharedImages()
.getImage(ISharedImages.IMG_ETOOL_SAVE_EDIT));
ok.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
status = SWT.OK;
Display.getCurrent().getActiveShell().close();
}
});
}
/**
* Opens the control. Make sure to get the shell via
* {@link #createShell(Control)}, unless you use this via AgileGrid.
*/
public int showEnumSelector(Shell shell) {
shell.pack();
while (!shell.isDisposed()) {
if (!Display.getCurrent().readAndDispatch()) {
Display.getCurrent().sleep();
}
}
return status;
}
/**
* Returns the selected items. If the user cancelled, the original,
* unmodified selection will be returned.
*/
public Collection<EnumValue> getItems() {
return status == SWT.OK ? itemList : originalSelection;
}
/**
* Creates a shell that: is positioned below the parent; can be closed via
* ESC; is closed if the user clicks outside, or if the shell loses focus.
*
* Unless the user cancels explicitly (button), the new values will be
* accepted.
*/
public static Shell createShell(Control parent) {
final Shell shell = new Shell(parent.getShell(), SWT.RESIZE
| SWT.ON_TOP);
shell.setBackground(parent.getBackground());
shell.setLayout(new FillLayout());
shell.addKeyListener(new KeyAdapter() {
@Override
public void keyReleased(KeyEvent e) {
if (e.character == SWT.ESC) { // Escape
shell.close();
}
}
});
shell.addShellListener(new ShellAdapter() {
@Override
public void shellDeactivated(ShellEvent e) {
shell.close();
}
});
Display display = parent.getDisplay();
Rectangle clientRect = display.map(parent, null, new Rectangle(0, 0, 0,
0));
shell.setBounds(clientRect.x, clientRect.y + parent.getBounds().height,
0, 0);
shell.open();
shell.layout();
return shell;
}
}