| |||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Objectorg.eclipse.emf.edit.provider.ItemProvider
This item provider implementation is a convenient reusable base that can be used for an item provider that isn't an adapter for an EMF object. This default implemention is highly functional and is plastic enough for a wide variety of uses (as will be illustrated in the examples to come). The plasticity is the reason for providing a huge number of constructors.
The children list is implemented using ItemProvider.ItemProviderNotifyingArrayList. As a result, any modification of the collection (using the stanandard List interface) will automatically fire the correct call to each INotifyChangedListener in the changeNotifier. Furthermore, IUpdateableItemParent.setParent is called to update parent for the objects that are added to or removed from the list, but optionally, i.e., only if the interface is implemented---the adapterFactory is used if it isn't null.
There is also a text and an image, which can be set via setText and setImage to cause appropriate domain event notifications to be fired. The set methods use the stateless adapter signature for uniformity and to support IUpdateableItemText.setText(Object, String).
This class is useful as a convenient wrapper object to act as the input to a view, e.g.,
viewer.setInput(new ItemProvider(text, image, collection));lets you take a mixed collection of model objects and item providers, and show it as the elements of a structured view, i.e., as the visible roots of the view. Although a structured viewer
viewer.setInput(new ItemProvider(Collections.singleton(object)));will leave the pane title blank and show the object as the root of the structured view.
One could use more of these item providers to build up a scaffolding within views. Consider the following block of code which has access to a collection of INotifyChangedListeners.
// final Collection listeners = ...; // final StructuredContentViewer contentViewer = ...; // // These create the items and build up the structure. // final ItemProvider child11 = new ItemProvider(listeners, "Child 1"); final ItemProvider child12 = new ItemProvider(listeners, "Child 2"); final ItemProvider parent1 = new ItemProvider(listeners, "Parent 1", Arrays.asList(new Object [] {child11, child12})); final ItemProvider child21 = new ItemProvider(listeners, "Child 1"); final ItemProvider child22 = new ItemProvider(listeners, "Child 2"); final ItemProvider parent2 = new ItemProvider(listeners, "Parent 2", Arrays.asList(new Object [] {child21, child22})); final ItemProvider grandParent = new ItemProvider(listeners, "Grand Parent", Arrays.asList(new Object [] {parent1, parent2})); // Set the items into the visible roots of the structured content viewer. // contentViewer.setInput(new ItemProvider("Pane Tile", Collections.singleton(grandParent))); // Create some delayed actions that modify the item structure. // if (contentViewer.isControlOkToUse()) { contentViewer.getControl().getDisplay().asyncExec (new Runnable() { public void run() { // Use standard list modification that has the effect of producing a domain event notification. // parent1.getChildren().removeAll(Arrays.asList(new Object [] {child11, child12})); contentViewer.getControl().getDisplay().asyncExec (new Runnable() { public void run() { // This also as the effect of producing a correct a domain event notification. // parent2.setText("Parent 2!"); } }); } }); }The structure will be displayed within the contentViewer and will then change a little bit later; the flickering should be noticeable if the viewer is set to auto expand.
Another common pattern of usage will be to inject scaffolding within an EMF structure. In the following example, a new factory is defined to replace the adapters for Company and Department so as to inject an item that acts as the child of the Company and the parent of each Department. (Normally, this would not be done with all these inner classes.)
ItemProviderAdapterFactory myItemProviderAdapterFactory = new ItemProviderAdapterFactory() { public Adapter createCompanyAdapter() { // This returns a new instance each time. // The instance stores an injected child that in turn will have this original object's children as its children. // return new CompanyItemProvider(this) { // Keep track of the new child added below company. // ItemProvider injectedChild; public Collection getChildren(final Object object) { // Create one on demand. // if (injectedChild == null) { injectedChild = (new ItemProvider("Injected Child") { public Collection getChildren(Object o) { // Return the department of the company. // Note that we ignore o in favour of object. // return ((Company)object).getDepartment(); } public boolean hasChildren(Object o) { // You have to make sure you override this method to match the above. // return !((Company)object).getDepartment().isEmpty(); } }); } return Collections.singleton(injectedChild); } public boolean hasChildren(Object object) { // You have to make sure you override this method to match the above. // return true; } public void notifyChanged(Notification msg) { // If the departments are affected... // Company company = (Company)msg.getNotifier(); if (msg.getStructuralFeature() == company.ePackageCompany().getCompany_Deparment()) { // If there's a child around to care... // if (injectedChild != null) { // Fire the domain event as if it came from the child. // // EATM TODO fireNotifyChanged(injectedChild, msg.getEventType(), msg.getStructuralFeature(), msg.getOldValue(), msg.getNewValue(), msg.getPostition()); } } else { // Behave as normal. // super.notifyChanged(msg); } } }; } public Adapter createDepartmentAdapter() { // This is still stateless. // if (departmentItemProvider == null) { departmentItemProvider = new DepartmentItemProvider(this) { public Object getParent(Object object) { // Use the stateful adapter of the containing parent to determine the injected item. // Company company = ((Department)object).getCompany(); ITreeItemContentProvider companyAdapter = (ITreeItemContentProvider)this.adapterFactory.adapt(company, ITreeItemContentProvider.class); if (companyAdapter != null) { // Get the first child of the company's adapter. // return companyAdapter.getChildren(company).iterator().next(); } else { return null; } } }; } // Return the single factory instance. // return departmentItemProvider; } };
Nested Class Summary | |
class | ItemProvider.ItemProviderNotification
This class implements a Notification for an ItemProvider. |
class | ItemProvider.ItemProviderNotifyingArrayList
This class overrides the "notify" methods to fire INotifyChangedListener calls and it overrides the "inverse basic" methods to maintain referential integrity by calling IUpdateableItemParent.setParent. |
Field Summary | |
protected AdapterFactory | adapterFactory
This is the optional adapter factory that is used to get adapters for parent or child objects. |
protected IChangeNotifier | changeNotifier
This is the optional collection used for changes to the text, parent, or children. |
protected ItemProvider.ItemProviderNotifyingArrayList | children
This is the children returned by getChildren(Object). |
protected Object | image
This is the image returned by getImage(Object). |
protected Object | parent
This is the parent returned by getParent(Object). |
protected String | text
This is the text returned by getText(Object). |
Constructor Summary | |
ItemProvider()
This creates an instance with an empty text that yields no children. | |
ItemProvider(AdapterFactory adapterFactory)
This creates an instance with the given adapter factory and an empty text that yields no children. | |
ItemProvider(AdapterFactory adapterFactory,
Collection children)
This creates an instance with the given adapter factory that yields the given children. | |
ItemProvider(AdapterFactory adapterFactory,
String text)
This creates an instance with the given adapter factor and text that yields no children. | |
ItemProvider(AdapterFactory adapterFactory,
String text,
Collection children)
This creates an instance with the given adapter factory and text that yields the given children. | |
ItemProvider(AdapterFactory adapterFactory,
String text,
Object image)
This creates an instance with the given adapter factory, text, and image that yields no children. | |
ItemProvider(AdapterFactory adapterFactory,
String text,
Object image,
Collection children)
This creates an instance with the given adapter factory, text and image that yields the given children. | |
ItemProvider(AdapterFactory adapterFactory,
String text,
Object image,
Object parent)
This creates an instance with the given adapter factory, text, image, and parent that yields no children. | |
ItemProvider(AdapterFactory adapterFactory,
String text,
Object image,
Object parent,
Collection children)
This creates an instance with the given adapter factory, notifier, text, image, and parent that yields the given children. | |
ItemProvider(Collection children)
This creates an instance with an empty text that yields the given children. | |
ItemProvider(String text)
This creates an instance with the given text that yields the no children. | |
ItemProvider(String text,
Collection children)
This creates an instance with the given text that yields the given children. | |
ItemProvider(String text,
Object image)
This creates an instance with the given text and image that yields the no children. | |
ItemProvider(String text,
Object image,
Collection children)
This creates an instance with the given text and image that yields the given children. | |
ItemProvider(String text,
Object image,
Object parent)
This creates an instance with the given text, image, and parent that yields no children. | |
ItemProvider(String text,
Object image,
Object parent,
Collection children)
This creates an instance with the given text, image, and parent that yields the given children. |
Method Summary | |
void | addListener(INotifyChangedListener listener)
This adds another listener. |
Command | createCommand(Object object,
EditingDomain editingDomain,
Class commandClass,
CommandParameter commandParameter)
This implements IEditingDomainItemProvider.createCommand(), returning the unexecutable command. |
void | dispose()
This is called to dispose the object. |
void | fireNotifyChanged(Notification notification)
This calls notifyChanged for each listener. |
AdapterFactory | getAdapterFactory()
This yields the optional adapter factory. |
EList | getChildren()
This returns getChildren(this). |
Collection | getChildren(Object object)
This implements ITreeItemContentProvider.getChildren return children. |
EList | getElements()
This returns getChildren(). |
Collection | getElements(Object object)
This implements IStructuredItemContentProvider.getElements by returning getChildren(Object). |
Object | getImage()
This delegates to getImage(this). |
Object | getImage(Object object)
This implements IItemLabelProvider.getImage by returning image. |
Collection | getNewChildDescriptors(Object object,
EditingDomain editingDomain,
Object sibling)
This implements IEditingDomainItemProvider.getNewChildDescriptors, returning an empty list. |
Object | getParent()
This returns getParent(this). |
Object | getParent(Object object)
This implements ITreeItemContentProvider.getParent by returning parent. |
String | getText()
This delegates to getText(this). |
String | getText(Object object)
This implements IItemLabelProvider.getText by returning text. |
String | getUpdateableText(Object object)
This implements IUpdateableItemText.getUpdateableText, although the class doesn't declare that it implements this interface. |
boolean | hasChildren()
This returns hasChildren(this). |
boolean | hasChildren(Object object)
This implements ITreeItemContentProvider.hasChildren by simply testing whether children is empty. |
void | removeListener(INotifyChangedListener listener)
This removes a listener. |
void | setAdapterFactory(AdapterFactory adapterFactory)
This sets the optional adapter factory. |
void | setImage(Object image)
This delegates to setImage(this, image). |
void | setImage(Object object,
Object image)
This allows image to be set. |
void | setParent(Object parent)
This calls setParent(this, parent). |
void | setParent(Object object,
Object parent)
This implements IUpdateableItemParent.setParent by delegating to setParent(Object). |
void | setText(Object object,
String text)
This implements IUpdateableItemText.setText, although the class doesn't declare that it implements this interface. |
void | setText(String text)
This delegates to setText(this, text). |
String | toString()
This returns the super result with the text appended to it. |
Methods inherited from class java.lang.Object |
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait |
Field Detail |
protected String text
protected Object image
protected Object parent
protected ItemProvider.ItemProviderNotifyingArrayList children
protected AdapterFactory adapterFactory
protected IChangeNotifier changeNotifier
Constructor Detail |
public ItemProvider()
public ItemProvider(Collection children)
public ItemProvider(String text)
public ItemProvider(String text, Collection children)
public ItemProvider(String text, Object image)
public ItemProvider(String text, Object image, Collection children)
public ItemProvider(String text, Object image, Object parent)
public ItemProvider(String text, Object image, Object parent, Collection children)
public ItemProvider(AdapterFactory adapterFactory)
public ItemProvider(AdapterFactory adapterFactory, String text)
public ItemProvider(AdapterFactory adapterFactory, String text, Object image)
public ItemProvider(AdapterFactory adapterFactory, String text, Object image, Object parent)
public ItemProvider(AdapterFactory adapterFactory, Collection children)
public ItemProvider(AdapterFactory adapterFactory, String text, Collection children)
public ItemProvider(AdapterFactory adapterFactory, String text, Object image, Collection children)
public ItemProvider(AdapterFactory adapterFactory, String text, Object image, Object parent, Collection children)
Method Detail |
public AdapterFactory getAdapterFactory()
public void setAdapterFactory(AdapterFactory adapterFactory)
public void addListener(INotifyChangedListener listener)
public void removeListener(INotifyChangedListener listener)
public void fireNotifyChanged(Notification notification)
public Collection getElements(Object object)
public EList getElements()
public Collection getChildren(Object object)
public EList getChildren()
public boolean hasChildren(Object object)
public boolean hasChildren()
public Object getParent(Object object)
public Object getParent()
public void setParent(Object object, Object parent)
public void setParent(Object parent)
public Object getImage(Object object)
public Object getImage()
public void setImage(Object object, Object image)
public void setImage(Object image)
public String getText(Object object)
public String getText()
public String getUpdateableText(Object object)
public void setText(Object object, String text)
public void setText(String text)
public String toString()
public void dispose()
public Collection getNewChildDescriptors(Object object, EditingDomain editingDomain, Object sibling)
public Command createCommand(Object object, EditingDomain editingDomain, Class commandClass, CommandParameter commandParameter)
|
Copyright 2001-2004 IBM Corporation and others. All Rights Reserved. | ||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |