/*******************************************************************************
 * Copyright (c) 2008, 2011 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
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.debug.internal.ui.viewers.model.provisional;

import org.eclipse.debug.internal.ui.viewers.model.InternalVirtualTreeModelViewer;
import org.eclipse.jface.viewers.TreePath;
import org.eclipse.jface.viewers.ViewerLabel;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IMemento;

/**
 * A virtual tree model viewer.  This viewer does not have a user
 * interface.  Instead, clients configure and access the viewer's data through
 * its public methods.
 * <p>
 * Style flags supported by this viewer are:
 * <ul>
 * <li>SWT.VIRTUAL - Indicates that the viewer should be in lazy mode:
 * retrieving only elements that are requested.</li>
 * <li>SWT.POP_UP - Indicates that the viewer should ignore requests from the
 * model to select, expand, or collapse tree elements.</li>
 * </ul>
 * </p>
 * @since 3.5
 * @noextend This class is not intended to be sub-classed by clients.
 */
public class VirtualTreeModelViewer extends InternalVirtualTreeModelViewer {


    /**
     * Creates a virtual tree model viewer.
     * @param display Display used by the viewer to call the data providers
     * on the UI thread.
     * @param style Stlye flags.
     * @param context Viewer's presentation context.
     */
    public VirtualTreeModelViewer(Display display, int style, IPresentationContext context) {
        super(display, style, context, null);
    }

    /**
     * Creates a virtual tree model viewer.
     * @param display Display used by the viewer to call the data providers
     * on the UI thread.
     * @param style style flags.
     * @param context Viewer's presentation context.
     * @param validator Optional validator that is used to determine which items should be
     * considered visible when SWT.VIRTUAL style is used.  If <code>null</code> then the
     * standard validator is used that updates only the selected items.
     *
     * @since 3.8
     */
    public VirtualTreeModelViewer(Display display, int style, IPresentationContext context, IVirtualItemValidator validator) {
        super(display, style, context, validator);
    }

    /**
     * Returns this viewer's presentation context.
     *
     * @return presentation context
     */
    @Override
	public IPresentationContext getPresentationContext() {
        return super.getPresentationContext();
    }

    /**
     * Registers the given listener for model delta notification.
     *
     * @param listener model delta listener
     */
    @Override
	public void addModelChangedListener(IModelChangedListener listener) {
        super.addModelChangedListener(listener);
    }

    /**
     * Unregisters the given listener from model delta notification.
     *
     * @param listener model delta listener
     */
    @Override
	public void removeModelChangedListener(IModelChangedListener listener) {
        super.removeModelChangedListener(listener);
    }

    /**
     * Registers the specified listener for view update notifications.
     *
     * @param listener listener
     */
    @Override
	public void addViewerUpdateListener(IViewerUpdateListener listener) {
        super.addViewerUpdateListener(listener);
    }

    /**
     * Removes the specified listener from update notifications.
     *
     * @param listener listener
     */
    @Override
	public void removeViewerUpdateListener(IViewerUpdateListener listener) {
        super.removeViewerUpdateListener(listener);
    }

    /**
     * Returns whether columns can be toggled on/off for this viewer's current
     * input element.
     *
     * @return whether columns can be toggled on/off
     */
    @Override
	public boolean canToggleColumns() {
        return super.canToggleColumns();
    }

    /**
     * Returns the current column presentation for this viewer, or <code>null</code>
     * if none.
     *
     * @return column presentation or <code>null</code>
     */
    @Override
	public IColumnPresentation getColumnPresentation() {
        return super.getColumnPresentation();
    }

    /**
     * Returns identifiers of the visible columns in this viewer, or <code>null</code>
     * if there are currently no columns.
     *
     * @return visible columns identifiers or <code>null</code>
     */
    @Override
	public String[] getVisibleColumns() {
        return super.getVisibleColumns();
    }

    /**
     * Initializes viewer state from the memento
     *
     * @param memento the {@link IMemento} to read from
     */
    @Override
	public void initState(IMemento memento) {
        super.initState(memento);
    }

    /**
     * Save viewer state into the given memento.
     *
     * @param memento the {@link IMemento} to save to
     */
    @Override
	public void saveState(IMemento memento) {
        super.saveState(memento);
    }

    /**
     * @return Returns true if columns are being displayed currently.
     */
    @Override
	public boolean isShowColumns() {
        return super.isShowColumns();
    }

    /**
     * Toggles columns on/off for the current column presentation, if any.
     *
     * @param show whether to show columns if the current input supports
     *  columns
     */
    @Override
	public void setShowColumns(boolean show) {
        super.setShowColumns(show);
    }

    /**
     * Sets the visible columns for this viewer. Id's correspond to
     * column identifiers from a column presentation. Use <code>null</code>
     * or an empty collection to display default columns for the current
     * column presentation. Only affects the current column presentation.
     *
     * @param ids column identifiers or <code>null</code>
     */
    @Override
	public void setVisibleColumns(String[] ids) {
        super.setVisibleColumns(ids);
    }

    @Override
	public void updateViewer(IModelDelta delta) {
        super.updateViewer(delta);
    }

    @Override
	public ViewerLabel getElementLabel(TreePath path, String columnId) {
        return super.getElementLabel(path, columnId);
    }

    @Override
	public VirtualItem[] findItems(Object elementOrTreePath) {
        return super.findItems(elementOrTreePath);
    }

    @Override
	public VirtualItem findItem(TreePath path) {
        return super.findItem(path);
    }



}
