blob: 7a157de4fe9239134106e957c089ce7b7d93dd1c [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
* Lukas Ladenberger - ProR GUI
******************************************************************************/
package org.eclipse.rmf.reqif10.pror.editor.propertiesview;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import org.agilemore.agilegrid.AgileGrid;
import org.agilemore.agilegrid.Cell;
import org.agilemore.agilegrid.SWTX;
import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.edit.command.RemoveCommand;
import org.eclipse.emf.edit.command.SetCommand;
import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.rmf.reqif10.AttributeDefinition;
import org.eclipse.rmf.reqif10.AttributeValue;
import org.eclipse.rmf.reqif10.ReqIF10Package;
import org.eclipse.rmf.reqif10.SpecElementWithAttributes;
import org.eclipse.rmf.reqif10.common.util.ReqIF10Util;
import org.eclipse.rmf.reqif10.pror.editor.propertiesview.ProrPropertyContentProvider.Descriptor;
import org.eclipse.rmf.reqif10.pror.editor.propertiesview.ProrPropertyContentProvider.PropertyRow;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MenuAdapter;
import org.eclipse.swt.events.MenuEvent;
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.Cursor;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
/**
* This control wraps an actual AgileGrid that displays the properties of the
* current selection. It is instantiated twice, once for all and once for those
* properties relevant to users (via showAllProps).
*
* @author Lukas Ladenberger
* @author Michael Jastram
*
*/
public class ProrPropertyControl extends AgileGrid implements
PropertyChangeListener {
protected ProrPropertyContentProvider contentProvider;
private Object object;
private AttributeValue removeValue;
private AdapterFactory adapterFactory;
public ProrPropertyControl(Composite parent, AdapterFactory adapterFactory,
boolean showAllProps) {
super(parent, SWT.V_SCROLL | SWT.H_SCROLL | SWTX.FILL_WITH_LASTCOL
| SWT.MULTI | SWT.DOUBLE_BUFFERED);
this.adapterFactory = adapterFactory;
setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE));
this.contentProvider = new ProrPropertyContentProvider(adapterFactory,
showAllProps);
super.setContentProvider(this.contentProvider);
setCellRendererProvider(new ProrPropertyCellRendererProvider(this,
adapterFactory, contentProvider));
setLayoutAdvisor(new ProrPropertyLayoutAdvisor(this));
setCellEditorProvider(new ProrPropertyCellEditorProvider(this,
adapterFactory, this.contentProvider));
setRowResizeCursor(new Cursor(this.getDisplay(), SWT.CURSOR_ARROW));
// listen to property changes in content
// Fix of 378041
contentProvider.addPropertyChangeListener(this);
configurePopupMenu(parent);
}
public void setContentProvider(ProrPropertyContentProvider prorPropertyContentProvider){
this.contentProvider = prorPropertyContentProvider;
super.setContentProvider(this.contentProvider);
setCellRendererProvider(new ProrPropertyCellRendererProvider(this,
adapterFactory, contentProvider));
setLayoutAdvisor(new ProrPropertyLayoutAdvisor(this));
setCellEditorProvider(new ProrPropertyCellEditorProvider(this,
adapterFactory, this.contentProvider));
// listen to property changes in content
// Fix of 378041
contentProvider.addPropertyChangeListener(this);
}
/**
* Sets up a context menu that allows the value to be removed from
* {@link SpecElementWithAttributes}.
*
* @param parent
*/
private void configurePopupMenu(Composite parent) {
// Required to set the selection properly, before a context menu pops
// up.
addMouseListener(new MouseAdapter() {
public void mouseDown(MouseEvent e) {
Cell[] cells = new Cell[] { getCell(e.x, e.y) };
ProrPropertyControl.this.clearSelection();
ProrPropertyControl.this.selectCells(cells);
}
});
// The actual menu.
Menu menu = new Menu(parent);
final MenuItem item = new MenuItem(menu, SWT.NONE);
item.setText("Remove Value");
item.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
removeValue();
}
});
// Prepares the menu, before it is shown.
menu.addMenuListener(new MenuAdapter() {
public void menuShown(MenuEvent e) {
item.setEnabled(false);
removeValue = null;
Cell[] selection = ProrPropertyControl.this.getCellSelection();
if (selection.length == 1) {
PropertyRow row = contentProvider
.getRowContent(selection[0].row);
if (row instanceof Descriptor) {
Descriptor descriptor = (Descriptor) row;
if (descriptor.isRMFSpecific()) {
AttributeValue av = descriptor.getAttributeValue();
if (av != null && av.eContainer() != null) {
removeValue = av;
item.setEnabled(true);
}
}
}
}
}
});
setMenu(menu);
}
private void removeValue() {
EditingDomain editingDomain = AdapterFactoryEditingDomain
.getEditingDomainFor(removeValue);
if (editingDomain != null) {
Command cmd = null;
if (removeValue.eContainer() instanceof SpecElementWithAttributes) {
cmd = RemoveCommand
.create(editingDomain,
removeValue.eContainer(),
ReqIF10Package.Literals.SPEC_ELEMENT_WITH_ATTRIBUTES__VALUES,
removeValue);
} else if (removeValue.eContainer() instanceof AttributeDefinition) {
AttributeDefinition ad = (AttributeDefinition) removeValue
.eContainer();
cmd = SetCommand.create(editingDomain, ad,
ReqIF10Util.getDefaultValueFeature(ad), null);
System.out.println(cmd.canExecute());
}
if (cmd != null) {
editingDomain.getCommandStack().execute(cmd);
redrawCells(ProrPropertyControl.this.getCellSelection());
} else {
System.err.println("Don't know parent: "
+ removeValue.eContainer());
}
}
}
public void setSelection(ISelection selection) {
if (selection instanceof IStructuredSelection) {
IStructuredSelection sel = (IStructuredSelection) selection;
if (sel.size() == 1) {
Object obj = sel.getFirstElement();
contentProvider.setContent(obj);
object = obj;
redraw();
return;
}
}
contentProvider.setContent(null);
redraw();
}
// Fix of 378041
// listen to property changes in content
// reload Content and redraw on change event
public void propertyChange(PropertyChangeEvent event) {
if (isDisposed()) return;
if (event.getPropertyName().equals("")) {
contentProvider.setContent(object);
redraw();
}
}
}