blob: 9f29b7dcdb82b91f8983c08ab9391b4e689ab5a0 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011, 2013 Formal Mind GmbH and University of Dusseldorf.
* 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.agilegrid;
import java.util.ArrayList;
import org.agilemore.agilegrid.AgileGrid;
import org.agilemore.agilegrid.editors.PopupCellEditor;
import org.eclipse.emf.common.command.CompoundCommand;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.edit.command.AddCommand;
import org.eclipse.emf.edit.command.SetCommand;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.rmf.reqif10.AttributeValueEnumeration;
import org.eclipse.rmf.reqif10.DatatypeDefinitionEnumeration;
import org.eclipse.rmf.reqif10.EnumValue;
import org.eclipse.rmf.reqif10.ReqIF10Package;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
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;
public class ProrEnumerationMultiValueCellEditor extends PopupCellEditor {
private ArrayList<EnumValue> itemList = new ArrayList<EnumValue>();
private final DatatypeDefinitionEnumeration dde;
/**
* The current contents.
*/
private AttributeValueEnumeration attributeValue;
private final EditingDomain editingDomain;
private Object parent;
private Object affectedObject;
public ProrEnumerationMultiValueCellEditor(AgileGrid agileGrid,
DatatypeDefinitionEnumeration dde,
Object parent, Object affectedObject, EditingDomain editingDomain,
AdapterFactory adapterFactory) {
super(agileGrid);
this.dde = dde;
this.editingDomain = editingDomain;
this.parent = parent;
this.affectedObject = affectedObject;
}
@Override
protected Control createContents(Composite parent) {
Composite composite = new Composite(parent, SWT.BORDER_SOLID);
GridLayout layout = new GridLayout();
layout.marginHeight = 0;
layout.marginWidth = 0;
layout.horizontalSpacing = 0;
layout.verticalSpacing = 5;
composite.setLayout(layout);
Table table = new Table(composite, 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 : dde.getSpecifiedValues()) {
TableItem tableItem = new TableItem(table, SWT.NONE);
String enumId = enumValue.getLongName() == null ? enumValue.getIdentifier() : enumValue.getLongName();
tableItem.setText(enumId);
tableItem.setData(enumValue);
if (attributeValue.getValues().contains(enumValue)) {
tableItem.setChecked(true);
itemList.add(enumValue);
}
}
Composite buttonPanel = new Composite(composite, 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) {
fireCancelEditor();
}
});
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) {
fireApplyEditorValue();
}
});
return composite;
}
@Override
protected Object doGetValue() {
if (itemList == null) {
return super.doGetValue();
}
CompoundCommand cmd = new CompoundCommand("Set Enumeration") {
public java.util.Collection<?> getAffectedObjects() {
ArrayList<? super Object> list = new ArrayList<Object>();
list.add(affectedObject);
return list;
};
};
if (attributeValue.eContainer() == null) {
cmd.append(AddCommand
.create(editingDomain,
parent,
ReqIF10Package.Literals.SPEC_ELEMENT_WITH_ATTRIBUTES__VALUES,
attributeValue));
}
cmd.append(SetCommand
.create(editingDomain,
attributeValue,
ReqIF10Package.Literals.ATTRIBUTE_VALUE_ENUMERATION__VALUES,
itemList));
editingDomain.getCommandStack().execute(cmd);
return attributeValue;
}
@Override
protected void doSetValue(Object value) {
if (value instanceof AttributeValueEnumeration) {
this.attributeValue = (AttributeValueEnumeration) value;
}
super.doSetValue(value);
}
@Override
protected void fireCancelEditor() {
itemList = null;
super.fireCancelEditor();
}
/**
* This method is overridden to add a read-and-dispatch loop after opening
* the popup. Otherwise, the panel will disappear immediately on Linux.
*/
@Override
protected void openPopupBox(Control parent) {
super.openPopupBox(parent);
// Workaround to prevent shell from closing right after opening on Linux.
Display display = Display.getCurrent();
Shell shell = display.getActiveShell();
shell.pack();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
}
}