blob: cda07f54fddf4d1c570cf1c38bc1fc283f3aa4cf [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
* Kay M??nch - vertical alignment of the spec objects id
******************************************************************************/
package org.eclipse.rmf.reqif10.pror.presentation.id.provider;
import java.util.Collection;
import java.util.List;
import org.agilemore.agilegrid.AgileGrid;
import org.agilemore.agilegrid.CellEditor;
import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.common.command.CompoundCommand;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.Notifier;
import org.eclipse.emf.common.notify.impl.AdapterImpl;
import org.eclipse.emf.common.util.ResourceLocator;
import org.eclipse.emf.ecore.util.EContentAdapter;
import org.eclipse.emf.edit.command.AddCommand;
import org.eclipse.emf.edit.command.SetCommand;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
import org.eclipse.emf.edit.provider.IItemLabelProvider;
import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
import org.eclipse.emf.edit.provider.IItemPropertySource;
import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
import org.eclipse.emf.edit.provider.ViewerNotification;
import org.eclipse.rmf.reqif10.AttributeDefinition;
import org.eclipse.rmf.reqif10.AttributeDefinitionString;
import org.eclipse.rmf.reqif10.AttributeValue;
import org.eclipse.rmf.reqif10.AttributeValueString;
import org.eclipse.rmf.reqif10.DatatypeDefinition;
import org.eclipse.rmf.reqif10.ReqIF10Package;
import org.eclipse.rmf.reqif10.SpecElementWithAttributes;
import org.eclipse.rmf.reqif10.SpecType;
import org.eclipse.rmf.reqif10.common.util.ReqIF10Util;
import org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage;
import org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfiguration;
import org.eclipse.rmf.reqif10.pror.configuration.provider.ProrPresentationConfigurationItemProvider;
import org.eclipse.rmf.reqif10.pror.editor.presentation.service.IProrCellRenderer;
import org.eclipse.rmf.reqif10.pror.editor.presentation.service.PresentationEditorInterface;
import org.eclipse.rmf.reqif10.pror.presentation.id.IdConfiguration;
import org.eclipse.rmf.reqif10.pror.presentation.id.IdPackage;
import org.eclipse.rmf.reqif10.pror.presentation.ui.IdLabelCellRenderer;
/**
* This is the item provider adapter for a {@link org.eclipse.rmf.reqif10.pror.presentation.id.IdConfiguration} object.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated NOT
*/
public class IdConfigurationItemProvider
extends ProrPresentationConfigurationItemProvider
implements
IEditingDomainItemProvider, IStructuredItemContentProvider,
ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource,
PresentationEditorInterface {
/**
* This constructs an instance from a factory and a notifier.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public IdConfigurationItemProvider(AdapterFactory adapterFactory) {
super(adapterFactory);
}
/**
* This returns the property descriptors for the adapted class.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object) {
if (itemPropertyDescriptors == null) {
super.getPropertyDescriptors(object);
addPrefixPropertyDescriptor(object);
addCountPropertyDescriptor(object);
addVerticalAlignPropertyDescriptor(object);
}
return itemPropertyDescriptors;
}
/**
* This adds a property descriptor for the Prefix feature.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
protected void addPrefixPropertyDescriptor(Object object) {
itemPropertyDescriptors.add
(createItemPropertyDescriptor
(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
getResourceLocator(),
getString("_UI_IdConfiguration_prefix_feature"),
getString("_UI_PropertyDescriptor_description", "_UI_IdConfiguration_prefix_feature", "_UI_IdConfiguration_type"),
IdPackage.Literals.ID_CONFIGURATION__PREFIX,
true,
false,
false,
ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
null,
null));
}
/**
* This adds a property descriptor for the Count feature.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
protected void addCountPropertyDescriptor(Object object) {
itemPropertyDescriptors.add
(createItemPropertyDescriptor
(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
getResourceLocator(),
getString("_UI_IdConfiguration_count_feature"),
getString("_UI_PropertyDescriptor_description", "_UI_IdConfiguration_count_feature", "_UI_IdConfiguration_type"),
IdPackage.Literals.ID_CONFIGURATION__COUNT,
true,
false,
false,
ItemPropertyDescriptor.INTEGRAL_VALUE_IMAGE,
null,
null));
}
/**
* This adds a property descriptor for the Vertical Align feature.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
protected void addVerticalAlignPropertyDescriptor(Object object) {
itemPropertyDescriptors.add
(createItemPropertyDescriptor
(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
getResourceLocator(),
getString("_UI_IdConfiguration_verticalAlign_feature"),
getString("_UI_PropertyDescriptor_description", "_UI_IdConfiguration_verticalAlign_feature", "_UI_IdConfiguration_type"),
IdPackage.Literals.ID_CONFIGURATION__VERTICAL_ALIGN,
true,
false,
false,
ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
null,
null));
}
/**
* This returns IdConfiguration.gif.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated NOT
*/
@Override
public Object getImage(Object object) {
return super.getImage(object);
}
/**
* This returns the label text for the adapted class.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated NOT
*/
@Override
public String getText(Object object) {
IdConfiguration idConfiguration = (IdConfiguration)object;
if (idConfiguration.getDatatype() == null)
return getString("_UI_IdConfiguration_type_not_set");
return getString("_UI_IdConfiguration_type", new Object[] {
idConfiguration.getDatatype().getLongName(),
idConfiguration.getCount() });
}
/**
* This handles model notifications by calling {@link #updateChildren} to update any cached
* children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public void notifyChanged(Notification notification) {
updateChildren(notification);
switch (notification.getFeatureID(IdConfiguration.class)) {
case IdPackage.ID_CONFIGURATION__PREFIX:
case IdPackage.ID_CONFIGURATION__COUNT:
case IdPackage.ID_CONFIGURATION__VERTICAL_ALIGN:
fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
return;
}
super.notifyChanged(notification);
}
/**
* This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
* that can be created under this object.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object) {
super.collectNewChildDescriptors(newChildDescriptors, object);
}
/**
* Return the resource locator for this item provider's resources.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public ResourceLocator getResourceLocator() {
return IDEditPlugin.INSTANCE;
}
// Listener to be attached to the ReqIF
private EContentAdapter contentAdapter;
/**
* We do two things:
* <ul>
* <li>Register an adapter with the model to set IDs as needed
* <li>Register an adapter with the config element to react to config value
* changes.
* <ul>
*/
public void registerPresentationConfiguration(
final ProrPresentationConfiguration config,
final EditingDomain editingDomain) {
registerModelListener((IdConfiguration) config, editingDomain);
config.eAdapters().add(new AdapterImpl() {
public void notifyChanged(Notification notification) {
if (notification.getFeature() == ConfigurationPackage.Literals.PROR_PRESENTATION_CONFIGURATION__DATATYPE) {
unregisterModelListener(config);
registerModelListener((IdConfiguration) config,
editingDomain);
}
}
});
}
public void unregisterPresentationConfiguration(
ProrPresentationConfiguration config) {
unregisterModelListener(config);
}
private void registerModelListener(final IdConfiguration config,
final EditingDomain editingDomain) {
if (contentAdapter != null) {
throw new IllegalStateException(
"Cannot register IDConfigAdapter without unregistering first!");
}
contentAdapter = new EContentAdapter() {
/**
* Action has to be taken when the SpecType changes
*/
@Override
public void notifyChanged(Notification notification) {
super.notifyChanged(notification);
if (notification.getNotifier() instanceof SpecElementWithAttributes) {
updateSpecElementIfNecessary(config,
(SpecElementWithAttributes) notification
.getNotifier(), editingDomain);
}
}
@Override
public void setTarget(final Notifier target) {
super.setTarget(target);
if (target instanceof SpecElementWithAttributes) {
updateSpecElementIfNecessary(config,
(SpecElementWithAttributes) target, editingDomain);
}
}
};
ReqIF10Util.getReqIF(config).getCoreContent().eAdapters()
.add(contentAdapter);
}
protected void updateSpecElementIfNecessary(IdConfiguration config,
SpecElementWithAttributes target, EditingDomain editingDomain) {
if (config.getDatatype() == null) {
return;
}
SpecElementWithAttributes specElement = (SpecElementWithAttributes) target;
// 1. Find out whether there is a matching AttributeDefinition
SpecType type = ReqIF10Util.getSpecType(specElement);
if (type == null)
return;
AttributeDefinitionString attrDef = null;
for (AttributeDefinition ad : type.getSpecAttributes()) {
DatatypeDefinition dd = ReqIF10Util.getDatatypeDefinition(ad);
if (config.getDatatype().equals(dd)) {
attrDef = (AttributeDefinitionString) ad;
break;
}
}
// 2. No: Nothing to do, otherwise find Find out whether
// there is already a value
if (attrDef == null)
return;
AttributeValueString value = (AttributeValueString) ReqIF10Util
.getAttributeValue(specElement, attrDef);
// 3. Yes: Nothing to do, otherwise proceed
if (value != null)
return;
value = (AttributeValueString) ReqIF10Util
.createAttributeValue(attrDef);
int newCount = config.getCount() + 1;
value.setTheValue(config.getPrefix() + newCount);
String label = "Assigning ID " + config.getPrefix() + newCount;
CompoundCommand cmd = new CompoundCommand(label);
cmd.append(SetCommand.create(editingDomain, config,
IdPackage.Literals.ID_CONFIGURATION__COUNT, newCount));
cmd.append(AddCommand.create(editingDomain, specElement,
ReqIF10Package.Literals.SPEC_ELEMENT_WITH_ATTRIBUTES__VALUES,
value));
editingDomain.getCommandStack().execute(cmd);
}
private void unregisterModelListener(ProrPresentationConfiguration config) {
if (contentAdapter != null) {
ReqIF10Util.getReqIF(config).getCoreContent().eAdapters()
.remove(contentAdapter);
contentAdapter = null;
}
}
public Command handleDragAndDrop(Collection<?> source, Object target,
EditingDomain editingDomain, int operation) {
// No drag and drop support
return null;
}
public String getLabel(AttributeValue av) {
// No custom label
return null;
}
/**
* Don't allow editing.
*/
public boolean canEdit() {
return false;
}
IProrCellRenderer renderer = null;
/**
* Use special renderer.
*/
public IProrCellRenderer getCellRenderer(AttributeValue av) {
if (renderer == null) {
renderer = new IdLabelCellRenderer();
}
return renderer;
}
/**
* No special {@link CellEditor}.
*/
public CellEditor getCellEditor(AgileGrid agileGrid,
EditingDomain editingDomain, AttributeValue av,
SpecElementWithAttributes parent, Object affectedObject) {
return null;
}
/**
* Not suggested as default.
*/
public Class<? extends DatatypeDefinition> suggestAsDefault() {
return null;
}
}