/** * <copyright> * * Copyright (c) 2002, 2009 IBM Corporation and others. * 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: * IBM - Initial API and implementation * * </copyright> * * $Id: ItemProviderDecorator.java,v 1.5 2008/01/15 17:15:41 emerks Exp $ */ package net.enilink.komma.edit.provider; import java.util.Collection; import java.util.List; import net.enilink.komma.common.adapter.IAdapterFactory; import net.enilink.komma.common.command.ICommand; import net.enilink.komma.common.notify.INotification; import net.enilink.komma.common.notify.INotificationBroadcaster; import net.enilink.komma.common.notify.INotificationListener; import net.enilink.komma.common.notify.INotifier; import net.enilink.komma.common.notify.NotificationFilter; import net.enilink.komma.common.notify.NotificationSupport; import net.enilink.komma.common.util.ICollector; import net.enilink.komma.edit.command.CommandParameter; import net.enilink.komma.edit.domain.IEditingDomain; /** * This implementation provides a convenient reusable base for item providers * that will be used as decorators of other item providers. Default * implementations for the following interfaces are provided: * {@link IEditingDomainItemProvider}, {@link IItemLabelProvider}, * {@link IItemPropertySource}, {@link IStructuredItemContentProvider}, * {@link IItemFontProvider}, {@link IItemColorProvider}, * {@link ITableItemFontProvider}, {@link ITableItemColorProvider}, * {@link ITableItemLabelProvider}, and {@link ITreeItemContentProvider}, and * {@link IUpdateableItemText#getUpdateableText}. */ public class ItemProviderDecorator implements INotificationListener<INotification>, IItemProviderDecorator, INotificationBroadcaster<INotification>, IDisposable { /** * This keeps track of the adapter factory that created this adaptor. It is * also used as the key/type for this adapter. */ protected IAdapterFactory adapterFactory; /** * This is used to implement {@link IChangeNotifier}. */ protected NotificationSupport<INotification> changeNotifier; /** * This keeps track of the item provider being decorated. */ protected INotifier<INotification> decoratedItemProvider; /** * An instance is created from an adapter factory. The factory is used as a * key so that we always know which factory created this adapter. */ public ItemProviderDecorator(IAdapterFactory adapterFactory) { this.adapterFactory = adapterFactory; } public void addListener(INotificationListener<INotification> listener) { if (changeNotifier == null) { changeNotifier = new NotificationSupport<INotification>(); } changeNotifier.addListener(listener); } /** * This implements {@link IEditingDomainItemProvider#createCommand * IEditingDomainItemProvider.createCommand} by delegating to * <code>(IEditingDomainItemProvider)</code>{@link #decoratedItemProvider}. */ public ICommand createCommand(Object object, IEditingDomain domain, Class<? extends ICommand> commandClass, CommandParameter commandParameter) { return ((IEditingDomainItemProvider) decoratedItemProvider) .createCommand(object, domain, commandClass, commandParameter); /* * // For convenience of overrides, this class delegates to the various * createXyzCommand methods first. if (commandClass == SetCommand.class) * { return createSetCommand(domain, commandParameter.getOwner(), * commandParameter.getFeature(), commandParameter.getValue()); } else * if (commandClass == CopyCommand.class) { return * createCopyCommand(domain, commandParameter.getOwner(), * (CopyCommand.Helper)commandParameter.getValue()); } else if * (commandClass == CreateCopyCommand.class) { return * createCreateCopyCommand(domain, commandParameter.getOwner(), * (CopyCommand.Helper)commandParameter.getValue()); } else if * (commandClass == InitializeCopyCommand.class) { return * createInitializeCopyCommand(domain, commandParameter.getOwner(), * (CopyCommand.Helper)commandParameter.getValue()); } else if * (commandClass == RemoveCommand.class) { return * createRemoveCommand(domain, commandParameter.getOwner(), * commandParameter.getFeature(), commandParameter.getCollection()); } * else if (commandClass == AddCommand.class) { return createAddCommand * (domain, commandParameter.getOwner(), commandParameter.getFeature(), * commandParameter.getCollection(), commandParameter.getIndex()); } * else if (commandClass == MoveCommand.class) { return * createMoveCommand (domain, commandParameter.getOwner(), * commandParameter.getFeature(), commandParameter.getValue(), * commandParameter.getIndex()); } else if (commandClass == * ReplaceCommand.class) { return createReplaceCommand (domain, * commandParameter.getOwner(), commandParameter.getFeature(), * commandParameter.getValue(), commandParameter.getCollection()); } * else if (commandClass == DragAndDropCommand.class) { * DragAndDropCommand.Detail detail = * (DragAndDropCommand.Detail)commandParameter.getFeature(); return * createDragAndDropCommand (domain, commandParameter.getOwner(), * detail.location, detail.operations, detail.operation, * commandParameter.getCollection()); } else { return * ((IEditingDomainItemProvider * )decoratedItemProvider).createCommand(object, domain, commandClass, * commandParameter); } */ } public void dispose() { if (decoratedItemProvider != null) { decoratedItemProvider.removeListener(this); } } /** * This provides access to the factory. */ public IAdapterFactory getAdapterFactory() { return adapterFactory; } /** * This implements {@link IItemColorProvider#getBackground * IItemColorProvider.getBackground} by delegating to * <code>(IItemColorProvider)</code>{@link #decoratedItemProvider}. */ public Object getBackground(Object object) { return ((IItemColorProvider) decoratedItemProvider) .getBackground(object); } /** * This implements {@link ITableItemColorProvider#getBackground * ITableItemColorProvider.getBackground} by delegating to * <code>(ITableItemColorProvider)</code>{@link #decoratedItemProvider}. */ public Object getBackground(Object object, int columnIndex) { return ((ITableItemColorProvider) decoratedItemProvider).getBackground( object, columnIndex); } /** * This implements {@link ITreeItemContentProvider#getChildren * ITreeItemContentProvider.getChildren} by delegating to * <code>(ITreeItemContentProvider)</code>{@link #decoratedItemProvider}. */ public Collection<?> getChildren(Object object) { return ((ITreeItemContentProvider) decoratedItemProvider) .getChildren(object); } /** * This implements {@link ITableItemLabelProvider#getColumnImage * ITableItemLabelProvider.getColumnImage} by delegating to * <code>(ITableItemLabelProvider)</code>{@link #decoratedItemProvider}. */ public Object getColumnImage(Object object, int columnIndex) { return ((ITableItemLabelProvider) decoratedItemProvider) .getColumnImage(object, columnIndex); } /** * This implements {@link ITableItemLabelProvider#getColumnText * ITableItemLabelProvider.getColumnText} by delegating to * <code>(ITableItemLabelProvider)</code>{@link #decoratedItemProvider}. */ public String getColumnText(Object object, int columnIndex) { return ((ITableItemLabelProvider) decoratedItemProvider).getColumnText( object, columnIndex); } /** * This returns the item provider that this decorates. */ public INotifier<INotification> getDecoratedItemProvider() { return decoratedItemProvider; } /** * This implements {@link IItemPropertySource#getEditableValue * IItemPropertySource.getEditableValue} by delegating to * <code>(IItemPropertySource)</code>{@link #decoratedItemProvider}. */ public Object getEditableValue(Object object) { return ((IItemPropertySource) decoratedItemProvider) .getEditableValue(object); } /** * This implements {@link IStructuredItemContentProvider#getElements * IStructuredItemContentProvider.getElements} by delegating to * <code>(IStructuredItemContentProvider)</code> * {@link #decoratedItemProvider}. */ public Collection<?> getElements(Object object) { return ((IStructuredItemContentProvider) decoratedItemProvider) .getElements(object); } public NotificationFilter<INotification> getFilter() { return null; } /** * This implements {@link IItemFontProvider#getFont * IItemFontProvider.getFont} by delegating to * <code>(IItemFontProvider)</code>{@link #decoratedItemProvider}. */ public Object getFont(Object object) { return ((IItemFontProvider) decoratedItemProvider).getFont(object); } /** * This implements {@link ITableItemFontProvider#getFont * ITableItemFontProvider.getFont} by delegating to * <code>(IItemFontProvider)</code>{@link #decoratedItemProvider}. */ public Object getFont(Object object, int columnIndex) { return ((ITableItemFontProvider) decoratedItemProvider).getFont(object, columnIndex); } /** * This implements {@link IItemColorProvider#getForeground * IItemColorProvider.getForeground} by delegating to * <code>(IItemColorProvider)</code>{@link #decoratedItemProvider}. */ public Object getForeground(Object object) { return ((IItemColorProvider) decoratedItemProvider) .getForeground(object); } /** * This implements {@link ITableItemColorProvider#getForeground * ITableItemColorProvider.getForeground} by delegating to * <code>(ITableItemColorProvider)</code>{@link #decoratedItemProvider}. */ public Object getForeground(Object object, int columnIndex) { return ((ITableItemColorProvider) decoratedItemProvider).getForeground( object, columnIndex); } /** * This implements {@link IItemLabelProvider#getImage * IItemLabelProvider.getImage} by delegating to * <code>(IItemLabelProvider)</code>{@link #decoratedItemProvider}. */ public Object getImage(Object object) { return ((IItemLabelProvider) decoratedItemProvider).getImage(object); } /** * This implements {@link IEditingDomainItemProvider#getNewChildDescriptors * IEditingDomainItemProvider.getNewChildDescriptors} by delegating to * <code>(IEditingDomainItemProvider)</code>{@link #decoratedItemProvider}. */ public void getNewChildDescriptors(Object object, IEditingDomain editingDomain, Object sibling, ICollector<Object> descriptors) { ((IEditingDomainItemProvider) decoratedItemProvider) .getNewChildDescriptors(object, editingDomain, sibling, descriptors); } /** * This implements {@link ITreeItemContentProvider#getParent * ITreeItemContentProvider.getParent} by delegating to * <code>(ITreeItemContentProvider)</code>{@link #decoratedItemProvider}. */ public Object getParent(Object object) { return ((ITreeItemContentProvider) decoratedItemProvider) .getParent(object); } /** * This implements {@link IItemPropertySource#getPropertyDescriptors * IItemPropertySource.getPropertyDescriptors} by delegating to * <code>(IItemPropertySource)</code>{@link #decoratedItemProvider}. */ public IItemPropertyDescriptor getPropertyDescriptor(Object object, Object propertyId) { return ((IItemPropertySource) decoratedItemProvider) .getPropertyDescriptor(object, propertyId); } /** * This implements {@link IItemPropertySource#getPropertyDescriptors * IItemPropertySource.getPropertyDescriptors} by delegating to * <code>(IItemPropertySource)</code>{@link #decoratedItemProvider}. */ public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object) { return ((IItemPropertySource) decoratedItemProvider) .getPropertyDescriptors(object); } /** * This implements {@link IItemLabelProvider#getText * IItemLabelProvider.getText} by delegating to * <code>(IItemLabelProvider)</code>{@link #decoratedItemProvider}. */ public String getText(Object object) { return ((IItemLabelProvider) decoratedItemProvider).getText(object); } /** * This implements {@link IUpdateableItemText#getUpdateableText * IUpdateableItemText.getUpdateableText} by delegating to * <code>(IUpdateableItemText)</code>{@link #decoratedItemProvider}. */ public String getUpdateableText(Object object) { return ((IUpdateableItemText) decoratedItemProvider) .getUpdateableText(object); } /** * This implements {@link ITreeItemContentProvider#hasChildren * ITreeItemContentProvider.hasChildren} by delegating to * <code>(ITreeItemContentProvider)</code>{@link #decoratedItemProvider}. */ public boolean hasChildren(Object object) { return ((ITreeItemContentProvider) decoratedItemProvider) .hasChildren(object); } /** * This returns true, only if this adapter was created by the given factory; * the adapter factory is used as the type key. */ public boolean isAdapterForType(Object type) { return type == adapterFactory; } @SuppressWarnings("unchecked") public void fireNotifications( Collection<? extends INotification> notifications) { if (adapterFactory instanceof INotificationBroadcaster<?>) { INotificationBroadcaster<INotification> adapterFactoryChangeNotifier = (INotificationBroadcaster<INotification>) adapterFactory; adapterFactoryChangeNotifier.fireNotifications(notifications); } if (changeNotifier != null) { changeNotifier.fireNotifications(notifications); } } /* * protected Command createSetCommand(EditingDomain domain, Object owner, * Object feature, Object value) { return * ((IEditingDomainItemProvider)decoratedItemProvider).createCommand (owner, * domain, SetCommand.class, new CommandParameter(owner, feature, value)); } * * protected Command createCopyCommand(EditingDomain domain, Object owner, * CopyCommand.Helper helper) { return * ((IEditingDomainItemProvider)decoratedItemProvider).createCommand (owner, * domain, CopyCommand.class, new CommandParameter(owner, null, helper)); } * * protected Command createCreateCopyCommand(EditingDomain domain, Object * owner, CopyCommand.Helper helper) { return * ((IEditingDomainItemProvider)decoratedItemProvider).createCommand (owner, * domain, CreateCopyCommand.class, new CommandParameter(owner, null, * helper)); } * * protected Command createInitializeCopyCommand(EditingDomain domain, * Object owner, CopyCommand.Helper helper) { return * ((IEditingDomainItemProvider)decoratedItemProvider).createCommand (owner, * domain, InitializeCopyCommand.class, new CommandParameter(owner, null, * helper)); } * * protected Command createRemoveCommand(EditingDomain domain, Object owner, * Object feature, Collection collection) { return * ((IEditingDomainItemProvider)decoratedItemProvider).createCommand (owner, * domain, RemoveCommand.class, new CommandParameter(owner, feature, * collection)); } * * protected Command createReplaceCommand(EditingDomain domain, Object * owner, Object feature, Object value, Collection collection) { return * ((IEditingDomainItemProvider)decoratedItemProvider).createCommand (owner, * domain, ReplaceCommand.class, new CommandParameter(owner, feature, value, * collection)); } * * protected Command createAddCommand(EditingDomain domain, Object owner, * Object feature, Collection collection, int index) { return * ((IEditingDomainItemProvider)decoratedItemProvider).createCommand (owner, * domain, ReplaceCommand.class, new CommandParameter(owner, feature, * collection, index)); } * * protected Command createMoveCommand(EditingDomain domain, Object owner, * Object feature, Object value, int index) { return * ((IEditingDomainItemProvider)decoratedItemProvider).createCommand (owner, * domain, ReplaceCommand.class, new CommandParameter(owner, feature, value, * index)); } * * protected Command createDragAndDropCommand (EditingDomain domain, Object * owner, float location, int operations, int operation, Collection * collection) { DragAndDropCommand.Detail detail = new * DragAndDropCommand.Detail(location, operations, operation); return * ((IEditingDomainItemProvider)decoratedItemProvider).createCommand (owner, * domain, DragAndDropCommand.class, new CommandParameter(owner, detail, * collection)); } */ public void notifyChanged(Collection<? extends INotification> notifications) { fireNotifications(notifications); } public void removeListener(INotificationListener<INotification> listener) { if (changeNotifier != null) { changeNotifier.removeListener(listener); } } /** * This sets the item provider that this decorates; it also hooks up the * {@link org.eclipse.emf.edit.provider.INotifyChangedListener}. */ public void setDecoratedItemProvider( INotifier<INotification> decoratedItemProvider) { if (this.decoratedItemProvider != null) { this.decoratedItemProvider.removeListener(this); } this.decoratedItemProvider = decoratedItemProvider; if (decoratedItemProvider != null) { decoratedItemProvider.addListener(this); } } @Override public String toString() { return getClass().getName() + '@' + Integer.toHexString(hashCode()); } }