blob: fe57775f06dae82f7c2848c243a7569472785960 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2003, 2005 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 Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.ui.navigator;
import org.eclipse.jface.viewers.IContentProvider;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.ui.IMemento;
/**
*
* The INavigatorContentService manages extensions for extensible viewers. The
* service can locate the appropriate providers (for contents or labels) for an
* element and provide a ready-to-go {@link ITreeContentProvider} and
* {@link ILabelProvider} for viewers that wish to take advantage of the
* <b>org.eclipse.ui.navigator.navigatorContent</b> extensions defined for a
* particular <i>viewerId</i>.
*
* <p>
* Clients should create instances of the this class using the factory
* ({@link NavigatorContentServiceFactory}).
* </p>
*
* <p>
* Clients may contribute logical extensions using
* <b>org.eclipse.ui.navigator.navigatorContent</b>. Each extension has three
* states which determine whether the extension is used by the content service:
* <ul>
* <li><i>visible</i>: If a content extension id matches a <b>viewerContentBinding</b>
* for the <i>viewerId</i> of this content service, then the
* extension is 'visible'. Visible extensions may only be
* configured through <b>viewerContentBinding</b>s.
* </li>
* <li><i>active</i>: The active state may be set to a default using the
* <i>activeByDefault</i> attribute of <b>navigatorContent</b>.
* Users may toggle the 'active' state through the
* 'Available extensions' dialog. Clients may also
* configure the active extensions using
* {@link #activateExtensions(String[], boolean)} or
* {@link #deactivateExtensions(String[], boolean)}.
* </li>
* <li><i>enabled</i>: An extension is 'enabled' for an element if the extension
* contributed that element or if the element is described in the
* <i>triggerPoints</i> element of the <b>navigatorContent</b>
* extension. The findXXX() methods search for 'enabled'
* extensions.
* </li>
* </ul>
* </p>
* <p>
* A new instance of the content service should be created for each viewer.
* Clients should use {@link #createCommonContentProvider()} and
* {@link #createCommonLabelProvider()} for the viewer. Each content service tracks
* the viewer it is attached to. Clients may create the content service with a
* viewer using ({@link NavigatorContentServiceFactory#createContentService(String, org.eclipse.jface.viewers.StructuredViewer)}).
* Alternatively, when the content provider is created and set on a viewer,
* {@link IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, Object, Object)}
* will be called and the content provider will update the viewer used by its
* backing content service. Therefore, only each content service has exactly one
* content provider and one label provider.
* </p>
* <p>
* Extensions may also coordinate their behavior through a
* {@link IExtensionStateModel state model}. The state model
* holds properties and supports property change listeners.
* Actions can toggle the setting of properties and the
* corresponding content/label providers will respond to
* property change event. Each <b>navigatorContent</b> extension
* has its own contained state model keyed off of the content
* extension id.
* </p>
* <p>
* Clients may respond when content extensions are loaded by
* attaching a {@link INavigatorContentServiceListener} to
* the content service.
* </p>
* <p>
* Some extensions may provide content or label providers which
* implement {@link IMemento}. Clients must call {@link #restoreState(IMemento)}
* and {@link #saveState(IMemento)} at the appropriate times
* for these extensions to prepare themselves with the memento.
* </p>
* <p>
* <strong>EXPERIMENTAL</strong>. This class or interface has been added as
* part of a work in progress. There is a guarantee neither that this API will
* work nor that it will remain the same. Please do not use this API without
* consulting with the Platform/UI team.
* </p>
*
* <p>
* This interface is not intended to be implemented by clients.
* </p>
*
* @since 3.2
*
*/
public interface INavigatorContentService {
/**
* Create a Content Provider which will use an enhanced delegation model to
* locate extension content providers using this content service for each
* element in the tree.
*
* <p>
* The content provider returned will populate the root
* of the viewer in one of two ways.
* <p>
* In the first approach, the content provider will seek
* out content extensions which are bound using a
* <b>viewerContentBinding</b>. If any of the found
* <b>viewerContentBindings</b> declare the <i>isRoot</i>
* attribute on as true, then that set of extensions will
* be consulted for the root elements of the tree.
* The input of the viewer will be supplied to each
* of their {@link IStructuredContentProvider#getElements(Object)}
* methods and aggregate the results for the root of the viewer.
* </p>
* <p>
* In the second approach, if no <b>viewerContentBindings</b>
* declare <i>isRoot</i> as true, then all matching extensions
* are consulted based on their <b>triggerPoints</b> expression
* in the <b>navigatorContent</b> extension. Any matching extensions
* are then consulted via their {@link IStructuredContentProvider#getElements(Object)}
* methods and the results are aggregated into the root.
* </p>
* <p>
* After the root is populated, the children of each root element
* are determined by consulting the source extension and all
* extension which describe the element in their
* <b>triggerPoints</b> expression.
* </p>
* <p>
* If clients wish to use a viewer other than the CommonViewer, then
* they are responsible for creating the content provider, and setting it
* on their viewer.
* </p>
*
* @return An enhanced content provider that will use
* this content service to drive the viewer.
*/
ITreeContentProvider createCommonContentProvider();
/**
* Create a Label Provider which will use an enhanced delegation model
* to locate extension label providers using this content service for
* each element in the tree.
*
* <p>
* The label of each element is determined by consulting the source
* of the element. If the source chooses to return null, then
* other extensions which declare the element in their
* <b>triggerPoints</b> extension are consulted. The first
* non-null value is used (including the empty label).
* </p>
*
* <p>
* If clients wish to use a viewer other than the CommonViewer, then
* they are responsible for creating the label provider, and setting it
* on their viewer.
* </p>
* @return An enhanced label provider that will use
* this content service to drive labels in the viewer.
*/
ILabelProvider createCommonLabelProvider();
/**
* The state model stores properties associated with the
* extension. Each content extension has its own contained
* state model. Components of the extension (content provider,
* label provider, action providers, etc) may attach themselves
* as listeners to the model
* ({@link IExtensionStateModel#addPropertyChangeListener(org.eclipse.jface.util.IPropertyChangeListener)})
* and respond to changes to the values of the properties.
*
* @param anExtensionId The extension id defined by a <b>navigatorContent</b> extension.
* @return The state model for the given extension id.
*/
IExtensionStateModel findStateModel(String anExtensionId);
/**
* Return a set of content providers that could provide
* a parent for the given element. These content extensions
* are determined by consulting the <b>possibleChildren</b>
* expression in the <b>navigatorContent</b> extension.
*
* <p>
* Clients that wish to tap into the link with editor support
* must describe all of their possible children in their
* <b>possibleChildren</b> expressions.
* </p>
*
* @param anElement An element from the tree (generally from a setSelection() method).
* @return The set of content providers that may be able to provide a parent.
*/
ITreeContentProvider[] findParentContentProviders(Object anElement);
/**
* <p>
* Return all of the content providers that are relevant for the viewer. The
* viewer is determined by the ID used to create the INavigatorContentService
* ({@link #getViewerId() }). See {@link #createCommonContentProvider() }
* for more information about how content providers are located
* for the root of the viewer. The root content providers are calculated once. If
* a new element is supplied, a client must call {@link #update() } prior in
* order to reset the calculated root providers.
* </p>
*
* @param anElement An element from the tree (generally the input of the viewer)
* @return The set of content providers that can provide root elements for a viewer.
*/
ITreeContentProvider[] findRootContentProviders(Object anElement);
/**
* Return all of the content providers that are enabled for the given
* element. An 'enabled' content provider is either the (1) source
* of the element (the element was returned as a child of its
* parent by the content provider) or (2) a content extension
* which describes the element in its <b>triggerPoints</b> expression.
*
* @param anElement An element from the tree (generally the element expanded by the user)
* @return The set of content providers that can provide valid children for the element.
*/
ITreeContentProvider[] findRelevantContentProviders(Object anElement);
/**
*
* Return all of the label providers that are enabled for the given
* element. A label provider is 'enabled' if its corresponding content
* provider returned the element, or the element is described in the
* content extension's <b>triggerPoints</b> expression.
*
* @param anElement An element from the tree (any element contributed to the tree).
* @return The set of label providers that may be able to provide a valid (non-null) label.
*/
ILabelProvider[] findRelevantLabelProviders(Object anElement);
/**
* The viewer id is used to locate matching <b>viewerContentBindings</b>.
* In general, this would be the id of the view defined by a
* <b>org.eclipse.ui.views</b> extension. However, there is no
* formal requirement that this is the case.
*
* @return The viewerId used to create this content service.
*/
String getViewerId();
/**
* The viewer descriptor provides some basic information about
* the abstract viewer that uses this content service.
*
* @return The viewer descriptor for this content service.
* @see INavigatorViewerDescriptor
*/
INavigatorViewerDescriptor getViewerDescriptor();
/**
* @return The set of visible extension ids for this content service
*/
String[] getVisibleExtensionIds();
/**
* @return The set of 'visible' content descriptors for this content service
*/
INavigatorContentDescriptor[] getVisibleExtensions();
/**
* Activate the extensions specified by the extensionIds array. Clients
* may also choose to disable all other extensions. The set of descriptors
* returned is the set that were activated as a result of this call. In
* the case of this method, that means that a descriptor will be returned
* for each extensionId in the array, regardless of whether that extension
* is already enabled.
*
* @param extensionIds
* The list of extensions to activate
* @param toDeactivateAllOthers
* True will deactivate all other extensions; False will leave the
* other activations as-is
* @return A list of all INavigatorContentDescriptors that were enabled as a
* result of this call. This will be the set of INavigatorContentDescriptors
* that corresponds exactly to the set of given extensionIds.
*/
INavigatorContentDescriptor[] activateExtensions(String[] extensionIds,
boolean toDeactivateAllOthers);
/**
* Deactivate the extensions specified by the extensionIds. Clients may
* choose to activate all other extensions which are not explicitly
* disabled. If toActivateAllOthers is true, the array of returned
* descriptors will be the collection of all extensions not
* specified in the extensionIds array. If it is false, the array
* will be empty.
*
* @param extensionIds
* The list of extensions to activate
* @param toActivateAllOthers
* True will activate all other extensions; False will leave the
* other activations as-is
* @return A list of all INavigatorContentDescriptors that were enabled as a
* result of this call. If toActivateAllOthers is false, the result
* will be an empty array. Otherwise, it will be the set of all visible
* extensions minus those given in the 'extensionIds' parameter.
*/
INavigatorContentDescriptor[] deactivateExtensions(String[] extensionIds,
boolean toActivateAllOthers);
/**
*
* @param aMemento The memento for extensions to use when restoring previous settings.
*/
void restoreState(IMemento aMemento);
/**
*
* @param aMemento The memento for extensions to use when persisting previous settings.
*/
void saveState(IMemento aMemento);
/**
* Add a listener to be notified whenever an extension is loaded.
* @param aListener A listener to be attached.
*/
void addListener(INavigatorContentServiceListener aListener);
/**
* Remove a listener (by identity) from the set of listeners.
* @param aListener A listener to be detached.
*/
void removeListener(INavigatorContentServiceListener aListener);
/**
* The root content providers are calculated once in {@link #findRootContentProviders(Object) }
* and reset by this method. The attached viewer is also refreshed
* as a result of this method.
*
*/
void update();
/**
* Release any acquired resources and instantiated content extensions.
*
*/
void dispose();
}