/******************************************************************************* | |
* 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; | |
} | |
} |