/*******************************************************************************
* Copyright (c) 2006, 2009 Wind River Systems 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:
* Wind River Systems - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.dsf.ui.viewmodel;
import java.util.concurrent.Executor;
import org.eclipse.cdt.dsf.concurrent.ConfinedToDsfExecutor;
import org.eclipse.cdt.dsf.concurrent.ThreadSafe;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenCountUpdate;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenUpdate;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IColumnPresentationFactory;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementContentProvider;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IHasChildrenUpdate;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxyFactory;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerInputProvider;
/**
* The view model provider handles the layout of a given model within a
* single viewer. The View Model Adapter delegates calls for view content to
* this object for a view that this provider handles.
*
* <p/>
* A given view model provider is typically configured with a number of
* {@link IVMNode} objects which are organized in a parent-child hierarchy.
* The node hierarchy has a root node which is retrieved using {@link #getRootVMNode()}.
*
* <p/>
* Note on concurency: The view model provider is single-threaded and it has to be
* accessed only using the <code>Executor</code> returned by {@link #getExecutor()}.
* The thread of this executor should be the display thread used by the viewer
* corresponding to the view model provider. Currently the flexible hierarchy
* interfaces that this interface extends do not guarantee that their methods
* will be called on the display thread, although from their use we are making
* this assumption (bug 213629). {@link IElementContentProvider} is an
* exception to this, it is called by the TreeModelViewer on a background
* thread, however it is not expected that the viewer will be calling the
* IVMProvider directly. Rather, it is expected that the viewer will call
* {@link IVMAdapter} which implements <code>IElementContentProvider</code>,
* and <code>IVMAdapter</code> implementation is expected to switch to
* provider's thread before delegating the call to it.
*
* @since 1.0
*/
@ConfinedToDsfExecutor("#getExecutor()")
public interface IVMProvider
extends IElementContentProvider, IModelProxyFactory, IColumnPresentationFactory, IViewerInputProvider
{
/**
* Returns the presentation context of the viewer that this provider
* is configured for.
*/
public IPresentationContext getPresentationContext();
/**
* Returns the VM Adapter associated with the provider.
*/
public IVMAdapter getVMAdapter();
/**
* Returns the executor that needs to be used to access this provider.
*/
@ThreadSafe
public Executor getExecutor();
/**
* Returns the root node that is configured in this provider.
* It may return null, if a root node is not yet configured.
*/
public IRootVMNode getRootVMNode();
/**
* Returns an array of nodes which are configured as child nodes of the given node.
*/
public IVMNode[] getChildVMNodes(IVMNode node);
/**
* Retrieves the list of all nodes configured for this provider.
*/
public IVMNode[] getAllVMNodes();
/**
* Calls the given view model node to perform the given updates. This
* method is different than calling the IVMNode update method directly in that
* it allows the provider to do additional processing on the update such as caching.
*/
public void updateNode(final IVMNode node, IHasChildrenUpdate[] updates);
/**
* Calls the given view model node to perform the given updates. This
* method is different than calling the IVMNode update method directly in that
* it allows the provider to do additional processing on the update such as caching.
*/
public void updateNode(final IVMNode node, IChildrenCountUpdate updates);
/**
* Calls the given view model node to perform the given updates. This
* method is different than calling the IVMNode update method directly in that
* it allows the provider to do additional processing on the update such as caching.
*/
public void updateNode(IVMNode node, IChildrenUpdate updates);
/**
* Cleans up the resources associated with this provider.
*/
public void dispose();
}