diff options
Diffstat (limited to 'plugins/org.eclipse.emf.cdo.releng.projectconfig.edit/src/org/eclipse/emf/cdo/releng/projectconfig/provider/ProjectItemProvider.java')
-rw-r--r-- | plugins/org.eclipse.emf.cdo.releng.projectconfig.edit/src/org/eclipse/emf/cdo/releng/projectconfig/provider/ProjectItemProvider.java | 766 |
1 files changed, 766 insertions, 0 deletions
diff --git a/plugins/org.eclipse.emf.cdo.releng.projectconfig.edit/src/org/eclipse/emf/cdo/releng/projectconfig/provider/ProjectItemProvider.java b/plugins/org.eclipse.emf.cdo.releng.projectconfig.edit/src/org/eclipse/emf/cdo/releng/projectconfig/provider/ProjectItemProvider.java new file mode 100644 index 0000000000..80fa34b245 --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.releng.projectconfig.edit/src/org/eclipse/emf/cdo/releng/projectconfig/provider/ProjectItemProvider.java @@ -0,0 +1,766 @@ +/** + */ +package org.eclipse.emf.cdo.releng.projectconfig.provider; + +import org.eclipse.emf.cdo.releng.predicates.AndPredicate; +import org.eclipse.emf.cdo.releng.predicates.NaturePredicate; +import org.eclipse.emf.cdo.releng.predicates.PredicatesFactory; +import org.eclipse.emf.cdo.releng.predicates.RepositoryPredicate; +import org.eclipse.emf.cdo.releng.preferences.PreferenceNode; +import org.eclipse.emf.cdo.releng.projectconfig.PreferenceFilter; +import org.eclipse.emf.cdo.releng.projectconfig.PreferenceProfile; +import org.eclipse.emf.cdo.releng.projectconfig.Project; +import org.eclipse.emf.cdo.releng.projectconfig.ProjectConfigFactory; +import org.eclipse.emf.cdo.releng.projectconfig.ProjectConfigPackage; +import org.eclipse.emf.cdo.releng.projectconfig.util.ProjectConfigUtil; + +import org.eclipse.emf.common.CommonPlugin; +import org.eclipse.emf.common.command.Command; +import org.eclipse.emf.common.command.IdentityCommand; +import org.eclipse.emf.common.command.UnexecutableCommand; +import org.eclipse.emf.common.notify.AdapterFactory; +import org.eclipse.emf.common.notify.Notification; +import org.eclipse.emf.common.util.ECollections; +import org.eclipse.emf.common.util.EList; +import org.eclipse.emf.common.util.ResourceLocator; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.EStructuralFeature; +import org.eclipse.emf.edit.EMFEditPlugin; +import org.eclipse.emf.edit.command.AddCommand; +import org.eclipse.emf.edit.command.CommandParameter; +import org.eclipse.emf.edit.command.CreateChildCommand; +import org.eclipse.emf.edit.command.DragAndDropCommand; +import org.eclipse.emf.edit.command.DragAndDropCommand.Detail; +import org.eclipse.emf.edit.command.DragAndDropFeedback; +import org.eclipse.emf.edit.command.RemoveCommand; +import org.eclipse.emf.edit.domain.EditingDomain; +import org.eclipse.emf.edit.provider.ComposeableAdapterFactory; +import org.eclipse.emf.edit.provider.ComposedImage; +import org.eclipse.emf.edit.provider.DelegatingWrapperItemProvider; +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.IViewerNotification; +import org.eclipse.emf.edit.provider.IWrapperItemProvider; +import org.eclipse.emf.edit.provider.ItemPropertyDescriptor; +import org.eclipse.emf.edit.provider.ItemProvider; +import org.eclipse.emf.edit.provider.ItemProviderAdapter; +import org.eclipse.emf.edit.provider.ViewerNotification; + +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.CoreException; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * This is the item provider adapter for a {@link org.eclipse.emf.cdo.releng.projectconfig.Project} object. + * <!-- begin-user-doc --> + * <!-- end-user-doc --> + * @generated + */ +public class ProjectItemProvider extends ItemProviderAdapter implements IEditingDomainItemProvider, + IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource +{ + + private static final Class<?> IWORKBENCH_ADAPTER_CLASS; + + private static final Method GET_IMAGE_DESCRIPTOR_METHOD; + + static + { + Class<?> workbenchAdapterClass = null; + Method method = null; + + try + { + workbenchAdapterClass = CommonPlugin.loadClass("org.eclipse.ui.ide", "org.eclipse.ui.model.IWorkbenchAdapter"); + method = workbenchAdapterClass.getMethod("getImageDescriptor", Object.class); + } + catch (Throwable throwable) + { + // Ignore + } + + IWORKBENCH_ADAPTER_CLASS = workbenchAdapterClass; + GET_IMAGE_DESCRIPTOR_METHOD = method; + + } + + /** + * This constructs an instance from a factory and a notifier. + * <!-- begin-user-doc --> + * <!-- end-user-doc --> + * @generated + */ + public ProjectItemProvider(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); + + addPreferenceNodePropertyDescriptor(object); + addPreferenceProfileReferencesPropertyDescriptor(object); + } + return itemPropertyDescriptors; + } + + /** + * This adds a property descriptor for the Preference Node feature. + * <!-- begin-user-doc --> + * <!-- end-user-doc --> + * @generated + */ + protected void addPreferenceNodePropertyDescriptor(Object object) + { + itemPropertyDescriptors.add(createItemPropertyDescriptor( + ((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(), getResourceLocator(), + getString("_UI_Project_preferenceNode_feature"), + getString("_UI_PropertyDescriptor_description", "_UI_Project_preferenceNode_feature", "_UI_Project_type"), + ProjectConfigPackage.Literals.PROJECT__PREFERENCE_NODE, true, false, true, null, null, null)); + } + + /** + * This adds a property descriptor for the Preference Profile References feature. + * <!-- begin-user-doc --> + * <!-- end-user-doc --> + * @generated NOT + */ + protected void addPreferenceProfileReferencesPropertyDescriptor(Object object) + { + itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory)adapterFactory) + .getRootAdapterFactory(), getResourceLocator(), getString("_UI_Project_preferenceProfileReferences_feature"), + getString("_UI_PropertyDescriptor_description", "_UI_Project_preferenceProfileReferences_feature", + "_UI_Project_type"), ProjectConfigPackage.Literals.PROJECT__PREFERENCE_PROFILE_REFERENCES, true, false, + true, null, null, null) + { + IItemLabelProvider labelProvider = new IItemLabelProvider() + { + public String getText(Object object) + { + String result = itemDelegator.getText(object); + if (object instanceof PreferenceProfile) + { + PreferenceProfile preferenceProfile = (PreferenceProfile)object; + Project project = preferenceProfile.getProject(); + if (project != null) + { + PreferenceNode preferenceNode = project.getPreferenceNode(); + if (preferenceNode != null) + { + String name = preferenceNode.getName(); + if (name != null) + { + result += " - " + name; + } + } + } + } + return result; + } + + public Object getImage(Object object) + { + return itemDelegator.getImage(object); + } + }; + + @Override + public IItemLabelProvider getLabelProvider(Object object) + { + return labelProvider; + } + + }); + } + + /** + * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an + * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or + * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}. + * <!-- begin-user-doc --> + * <!-- end-user-doc --> + * @generated + */ + @Override + public Collection<? extends EStructuralFeature> getChildrenFeatures(Object object) + { + if (childrenFeatures == null) + { + super.getChildrenFeatures(object); + childrenFeatures.add(ProjectConfigPackage.Literals.PROJECT__PREFERENCE_PROFILES); + } + return childrenFeatures; + } + + /** + * <!-- begin-user-doc --> + * <!-- end-user-doc --> + * @generated + */ + @Override + protected EStructuralFeature getChildFeature(Object object, Object child) + { + // Check the type of the specified child object and return the proper feature to use for + // adding (see {@link AddCommand}) it as a child. + + return super.getChildFeature(object, child); + } + + /** + * This returns Project.gif. + * <!-- begin-user-doc --> + * <!-- end-user-doc --> + * @generated NOT + */ + @Override + public Object getImage(Object object) + { + Project project = (Project)object; + PreferenceNode preferenceNode = project.getPreferenceNode(); + if (preferenceNode != null) + { + String name = preferenceNode.getName(); + if (name != null) + { + IProject iProject = ResourcesPlugin.getWorkspace().getRoot().getProject(name); + try + { + Object adapter = iProject.getAdapter(IWORKBENCH_ADAPTER_CLASS); + if (adapter != null) + { + return GET_IMAGE_DESCRIPTOR_METHOD.invoke(adapter, iProject); + } + } + catch (Throwable throwable) + { + // Ignore + } + } + } + + return overlayImage(object, getResourceLocator().getImage("full/obj16/Project")); + } + + /** + * <!-- begin-user-doc --> + * <!-- end-user-doc --> + * @generated + */ + @Override + protected boolean shouldComposeCreationImage() + { + return true; + } + + /** + * This returns the label text for the adapted class. + * <!-- begin-user-doc --> + * <!-- end-user-doc --> + * @generated NOT + */ + @Override + public String getText(Object object) + { + Project project = (Project)object; + PreferenceNode preferenceNode = project.getPreferenceNode(); + String label = "<invalid>"; + if (preferenceNode != null) + { + String name = preferenceNode.getName(); + if (name != null) + { + label = name; + } + } + return label; + } + + /** + * 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(Project.class)) + { + case ProjectConfigPackage.PROJECT__PREFERENCE_PROFILES: + fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false)); + return; + } + super.notifyChanged(notification); + } + + /** + * 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 NOT + */ + public void notifyChangedFoo(Notification notification) + { + updateChildren(notification); + + switch (notification.getFeatureID(Project.class)) + { + case ProjectConfigPackage.PROJECT__PREFERENCE_PROFILE_REFERENCES: + case ProjectConfigPackage.PROJECT__PREFERENCE_PROFILES: + fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, true)); + return; + } + super.notifyChanged(notification); + } + + private class References extends ItemProvider implements IEditingDomainItemProvider + { + Project project; + + public References(AdapterFactory adapterFactory, String text, Object image, Project project) + { + super(adapterFactory, text, image, project); + this.project = project; + } + + Map<PreferenceProfile, IWrapperItemProvider> wrappers = new HashMap<PreferenceProfile, IWrapperItemProvider>(); + + public void update() + { + /* + * for (Object child : getChildren()) { ((IDisposable)child).dispose(); } + */ + List<Object> children = new ArrayList<Object>(); + EList<PreferenceProfile> referentProjects = project.getPreferenceProfileReferences(); + for (int i = 0, size = referentProjects.size(); i < size; ++i) + { + PreferenceProfile project = referentProjects.get(i); + IWrapperItemProvider wrapper = wrap(i, project); + children.add(wrapper); + } + ECollections.setEList(getChildren(), children); + } + + private IWrapperItemProvider wrap(int i, PreferenceProfile preferenceProfile) + { + IWrapperItemProvider wrapper = wrappers.get(preferenceProfile); + if (wrapper == null) + { + wrapper = new DelegatingWrapperItemProvider(preferenceProfile, project, + ProjectConfigPackage.Literals.PROJECT__PREFERENCE_PROFILE_REFERENCES, i, adapterFactory) + { + @Override + public Object getParent(Object object) + { + return References.this; + } + + @Override + public String getText(Object object) + { + String result = super.getText(object); + PreferenceProfile preferenceProfile = (PreferenceProfile)value; + Project project = preferenceProfile.getProject(); + if (project != null) + { + PreferenceNode preferenceNode = project.getPreferenceNode(); + if (preferenceNode != null) + { + String name = preferenceNode.getName(); + if (name != null) + { + result += " - " + name; + } + } + } + return result; + } + + @Override + public Object getImage(Object object) + { + Object image = super.getImage(object); + List<Object> images = new ArrayList<Object>(2); + images.add(image); + images.add(EMFEditPlugin.INSTANCE.getImage("full/ovr16/ControlledObject")); + return image = new ComposedImage(images); + } + + @Override + public boolean hasChildren(Object object) + { + return false; + } + + @Override + public Collection<?> getChildren(Object object) + { + return Collections.emptyList(); + } + + @Override + public void notifyChanged(Notification notification) + { + if (notification instanceof IViewerNotification && ((IViewerNotification)notification).isLabelUpdate()) + { + super.notifyChanged(notification); + } + } + }; + wrappers.put(preferenceProfile, wrapper); + } + else + { + wrapper.setIndex(i); + } + return wrapper; + } + + @Override + public Command createCommand(Object object, EditingDomain editingDomain, Class<? extends Command> commandClass, + CommandParameter commandParameter) + { + final Collection<?> originalCollection = commandParameter.getCollection(); + commandParameter = unwrapCommandValues(commandParameter, commandClass); + Collection<?> collection = commandParameter.getCollection(); + if (commandClass == RemoveCommand.class) + { + if (project.getPreferenceProfileReferences().containsAll(collection)) + { + return new RemoveCommand(editingDomain, project, + ProjectConfigPackage.Literals.PROJECT__PREFERENCE_PROFILE_REFERENCES, collection) + { + @Override + public void doExecute() + { + super.doExecute(); + update(); + affectedObjects = Collections.singleton(References.this); + } + + @Override + public void doUndo() + { + super.doUndo(); + update(); + affectedObjects = Collections.singleton(References.this); + } + + @Override + public void doRedo() + { + super.doRedo(); + update(); + affectedObjects = Collections.singleton(References.this); + } + }; + } + } + else if (commandClass == AddCommand.class && collection != null) + { + final Collection<Object> wrappers = new ArrayList<Object>(); + for (Object value : collection) + { + if (value instanceof PreferenceProfile) + { + wrappers.add(wrap(-1, (PreferenceProfile)value)); + } + else + { + return UnexecutableCommand.INSTANCE; + } + } + return new AddCommand(editingDomain, project, + ProjectConfigPackage.Literals.PROJECT__PREFERENCE_PROFILE_REFERENCES, collection) + { + @Override + public void doExecute() + { + super.doExecute(); + update(); + affectedObjects = wrappers; + } + + @Override + public void doUndo() + { + super.doUndo(); + update(); + affectedObjects = Collections.singleton(References.this); + } + + @Override + public void doRedo() + { + super.doRedo(); + update(); + affectedObjects = wrappers; + } + }; + } + else if (commandClass == DragAndDropCommand.class) + { + DragAndDropCommand.Detail detail = (DragAndDropCommand.Detail)commandParameter.getFeature(); + return new DragAndDropCommand(editingDomain, this, detail.location, detail.operations, detail.operation, + commandParameter.getCollection()) + { + @Override + protected boolean prepareDropLinkOn() + { + dragCommand = IdentityCommand.INSTANCE; + dropCommand = AddCommand.create(domain, References.this, + ProjectConfigPackage.Literals.PROJECT__PREFERENCE_PROFILE_REFERENCES, originalCollection); + return dropCommand.canExecute(); + } + }; + } + return super.createCommand(object, editingDomain, commandClass, commandParameter); + } + } + + /* + * @Override public Command createCommand(Object object, EditingDomain domain, Class<? extends Command> commandClass, + * CommandParameter commandParameter) { Collection<?> collection = commandParameter.getCollection(); if (collection != + * null) { for (Object value : collection) { if (value instanceof PreferenceProfile) { return + * referents.createCommand(referents, domain, commandClass, commandParameter); } } } return + * super.createCommand(object, domain, commandClass, commandParameter); } + */ + + private References references; + + @Override + public Collection<?> getChildren(Object object) + { + Collection<Object> result = new ArrayList<Object>(super.getChildren(object)); + Project project = (Project)object; + if (references == null) + { + references = new References(adapterFactory, "References", getResourceLocator().getImage( + "full/obj16/OutgoingLinks"), project); + } + references.update(); + result.add(references); + return result; + } + + @Override + protected Command createDragAndDropCommand(EditingDomain domain, Object owner, float location, int operations, + int operation, Collection<?> collection) + { + if (operation == DragAndDropFeedback.DROP_LINK) + { + return references.createCommand(references, domain, DragAndDropCommand.class, new CommandParameter(references, + new Detail(location, operations, operation), collection)); + } + return super.createDragAndDropCommand(domain, owner, location, operations, operation, collection); + } + + private static final Set<String> IGNORE_NAME_COMPONENTS = new HashSet<String>(Arrays.asList(new String[] { "org", + "eclipse", "com" })); + + private static final Map<String, String> ACRYONYMS = new HashMap<String, String>(); + static + { + ACRYONYMS.put("jdt", "JDT"); + ACRYONYMS.put("pde", "PDE"); + ACRYONYMS.put("ui", "UI"); + ACRYONYMS.put("api", "API"); + ACRYONYMS.put("ltk", "LTK"); + ACRYONYMS.put("gmf", "GMF"); + } + + @Override + protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object) + { + Project project = (Project)object; + Collection<PreferenceNode> unmanagedPreferenceNodes = ProjectConfigUtil.getUnmanagedPreferenceNodes(project); + + for (PreferenceNode preferenceNode : unmanagedPreferenceNodes) + { + String preferenceNodeName = preferenceNode.getName(); + String[] nameComponents = preferenceNodeName.split("\\."); + int start = 0; + while (start < nameComponents.length) + { + if (!IGNORE_NAME_COMPONENTS.contains(nameComponents[start])) + { + break; + } + ++start; + } + + StringBuilder builder = new StringBuilder(); + for (int i = start; i < nameComponents.length; ++i) + { + if (builder.length() > 0) + { + builder.append(' '); + } + String nameComponent = nameComponents[i]; + String acronym = ACRYONYMS.get(nameComponent); + if (acronym != null) + { + builder.append(acronym); + } + else + { + int length = nameComponent.length(); + if (length >= 1) + { + builder.append(Character.toUpperCase(nameComponent.charAt(0))); + builder.append(nameComponent, 1, length); + } + } + } + + PreferenceProfile preferenceProfile = ProjectConfigFactory.eINSTANCE.createPreferenceProfile(); + if (builder.length() > 0) + { + preferenceProfile.setName(builder.toString()); + } + + PreferenceFilter preferenceFilter = ProjectConfigFactory.eINSTANCE.createPreferenceFilter(); + preferenceFilter.setPreferenceNode(preferenceNode); + preferenceProfile.getPreferenceFilters().add(preferenceFilter); + + AndPredicate andPredicate = PredicatesFactory.eINSTANCE.createAndPredicate(); + preferenceProfile.getPredicates().add(andPredicate); + + RepositoryPredicate repositoryPredicate = PredicatesFactory.eINSTANCE.createRepositoryPredicate(); + IProject iProject = ProjectConfigUtil.getProject(project); + repositoryPredicate.setProject(iProject); + andPredicate.getOperands().add(repositoryPredicate); + + try + { + String[] natureIds = iProject.getDescription().getNatureIds(); + int bestMatchLength = 0; + String bestNatureId = null; + for (String natureId : natureIds) + { + String[] natureComponents = natureId.split("\\."); + int index = 0; + while (index < natureComponents.length && index < nameComponents.length) + { + if (!nameComponents[index].equals(natureComponents[index])) + { + break; + } + ++index; + } + + if (bestMatchLength < index) + { + bestMatchLength = index; + bestNatureId = natureId; + } + } + + if (bestMatchLength >= 3) + { + NaturePredicate naturePredicate = PredicatesFactory.eINSTANCE.createNaturePredicate(); + naturePredicate.setNature(bestNatureId); + andPredicate.getOperands().add(naturePredicate); + } + } + catch (CoreException ex) + { + // Ignore + } + + newChildDescriptors.add(createChildParameter(ProjectConfigPackage.Literals.PROJECT__PREFERENCE_PROFILES, + preferenceProfile)); + } + + collectNewChildDescriptorsGen(newChildDescriptors, object); + } + + /** + * 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 + */ + protected void collectNewChildDescriptorsGen(Collection<Object> newChildDescriptors, Object object) + { + super.collectNewChildDescriptors(newChildDescriptors, object); + + newChildDescriptors.add(createChildParameter(ProjectConfigPackage.Literals.PROJECT__PREFERENCE_PROFILES, + ProjectConfigFactory.eINSTANCE.createPreferenceProfile())); + } + + @Override + public String getCreateChildText(Object owner, Object feature, Object child, Collection<?> selection) + { + String text = super.getCreateChildText(owner, feature, child, selection); + if (child instanceof PreferenceProfile) + { + PreferenceProfile preferenceProfile = (PreferenceProfile)child; + EList<PreferenceFilter> preferenceFilters = preferenceProfile.getPreferenceFilters(); + if (!preferenceFilters.isEmpty()) + { + PreferenceFilter preferenceFilter = preferenceFilters.get(0); + PreferenceNode preferenceNode = preferenceFilter.getPreferenceNode(); + if (preferenceNode != null) + { + String name = preferenceNode.getName(); + if (name != null) + { + text += " for " + name; + } + } + } + } + return text; + } + + @Override + protected Command createCreateChildCommand(EditingDomain domain, EObject owner, EStructuralFeature feature, + Object value, int index, Collection<?> collection) + { + return new CreateChildCommand(domain, owner, feature, value, index, collection, this); + } + + /** + * Return the resource locator for this item provider's resources. + * <!-- begin-user-doc --> + * <!-- end-user-doc --> + * @generated + */ + @Override + public ResourceLocator getResourceLocator() + { + return ProjectConfigEditPlugin.INSTANCE; + } + +} |