org.eclipse.tcf.te.ui.trees.TreeViewerDecoratingLabelProvider.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.tcf.te.ui.trees.TreeViewerDecoratingLabelProvider.java

Source

/*******************************************************************************
 * Copyright (c) 2011, 2013 Wind River Systems, Inc. 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.tcf.te.ui.trees;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.viewers.DecoratingLabelProvider;
import org.eclipse.jface.viewers.ILabelDecorator;
import org.eclipse.jface.viewers.ITableColorProvider;
import org.eclipse.jface.viewers.ITableFontProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelDecorator;
import org.eclipse.jface.viewers.TreePath;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
import org.eclipse.tcf.te.core.interfaces.IFilterable;
import org.eclipse.tcf.te.ui.utils.TreeViewerUtil;

/**
 * A subclass of DecoratingLabelProvider provides an FS Tree Viewer
 * with a label provider which combines a nested label provider and an optional
 * decorator. The decorator decorates the label text, image
 * provided by the nested label provider.
 *
 */
public class TreeViewerDecoratingLabelProvider extends DecoratingLabelProvider
        implements ITableLabelProvider, ITableColorProvider, ITableFontProvider {

    //The label provider for the execution context viewer.
    private TreeViewerLabelProvider fProvider;
    //The label decorator decorating the above label provider.
    private ILabelDecorator fDecorator;
    //Tree viewer that this label provider serves.
    private TreeViewer viewer;
    // The content provider of this viewer.
    private ITreeContentProvider contentProvider;

    /**
     * Create a decorating label provider instance with an label provider and a label decorator.
     *
     * @param provider The label provider to be decorated.
     * @param decorator The label decorator.
     */
    public TreeViewerDecoratingLabelProvider(TreeViewer viewer, TreeViewerLabelProvider provider,
            ILabelDecorator decorator) {
        super(provider, decorator);
        fProvider = provider;
        fDecorator = decorator;
        this.viewer = viewer;
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int)
     */
    @Override
    public Image getColumnImage(Object element, int columnIndex) {
        Image image = fProvider.getColumnImage(element, columnIndex);
        if (columnIndex == 0) {
            if (fDecorator != null) {
                if (fDecorator instanceof LabelDecorator) {
                    LabelDecorator ld2 = (LabelDecorator) fDecorator;
                    Image decorated = ld2.decorateImage(image, element, getDecorationContext());
                    if (decorated != null) {
                        image = decorated;
                    }
                } else {
                    Image decorated = fDecorator.decorateImage(image, element);
                    if (decorated != null) {
                        image = decorated;
                    }
                }
            }
            IFilterable decorator = adaptFilterable(element);
            TreePath path = getTreePath(element);
            if (image != null && decorator != null && path != null && TreeViewerUtil.isFiltering(viewer, path)) {
                image = TreeViewerUtil.getDecoratedImage(image, viewer, path);
            }
        }
        return image;
    }

    /**
     * Get the tree path whose leaf is the element.
     *
     * @param element The leaf element.
     * @return The tree path.
     */
    private TreePath getTreePath(Object element) {
        List<Object> elements = new ArrayList<Object>();
        while (element != null) {
            elements.add(0, element);
            element = getParent(element);
        }
        if (elements.isEmpty())
            return TreePath.EMPTY;
        return new TreePath(elements.toArray());
    }

    /**
     * get the parent path.
     *
     * @param element The element whose parent is being retrieved.
     * @return The parent element.
     */
    private Object getParent(Object element) {
        if (this.contentProvider == null) {
            contentProvider = (ITreeContentProvider) viewer.getContentProvider();
        }
        return contentProvider.getParent(element);
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, int)
     */
    @Override
    public String getColumnText(Object element, int columnIndex) {
        String text = fProvider.getColumnText(element, columnIndex);
        if (columnIndex == 0) {
            if (fDecorator != null) {
                if (fDecorator instanceof LabelDecorator) {
                    LabelDecorator ld2 = (LabelDecorator) fDecorator;
                    String decorated = ld2.decorateText(text, element, getDecorationContext());
                    if (decorated != null) {
                        text = decorated;
                    }
                } else {
                    String decorated = fDecorator.decorateText(text, element);
                    if (decorated != null) {
                        text = decorated;
                    }
                }
            }
            IFilterable decorator = adaptFilterable(element);
            TreePath path = getTreePath(element);
            if (decorator != null && path != null && TreeViewerUtil.isFiltering(viewer, path)) {
                text = TreeViewerUtil.getDecoratedText(text, viewer, path);
            }
        }
        return text;
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.viewers.DecoratingLabelProvider#getImage(java.lang.Object)
     */
    @Override
    public Image getImage(Object element) {
        Image image = super.getImage(element);
        IFilterable decorator = adaptFilterable(element);
        TreePath path = getTreePath(element);
        if (image != null && decorator != null && path != null && TreeViewerUtil.isFiltering(viewer, path)) {
            image = TreeViewerUtil.getDecoratedImage(image, viewer, path);
        }
        return image;
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.viewers.DecoratingLabelProvider#getText(java.lang.Object)
     */
    @Override
    public String getText(Object element) {
        String text = super.getText(element);
        IFilterable decorator = adaptFilterable(element);
        TreePath path = getTreePath(element);
        if (text != null && decorator != null && path != null && TreeViewerUtil.isFiltering(viewer, path)) {
            text = TreeViewerUtil.getDecoratedText(text, viewer, path);
        }
        return text;
    }

    /**
     * Get an adapter of IFilteringLabelProvider from the specified element.
     *
     * @param element The element to get the adapter from.
     * @return The element's adapter or null if does not adapt to IFilteringLabelProvider.
     */
    private IFilterable adaptFilterable(Object element) {
        IFilterable decorator = null;
        if (element instanceof IFilterable) {
            decorator = (IFilterable) element;
        }
        if (decorator == null && element instanceof IAdaptable) {
            decorator = (IFilterable) ((IAdaptable) element).getAdapter(IFilterable.class);
        }
        if (decorator == null) {
            decorator = (IFilterable) Platform.getAdapterManager().getAdapter(element, IFilterable.class);
        }
        return decorator;
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.viewers.ITableFontProvider#getFont(java.lang.Object, int)
     */
    @Override
    public Font getFont(Object element, int columnIndex) {
        return fProvider.getFont(element, columnIndex);
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.viewers.ITableColorProvider#getForeground(java.lang.Object, int)
     */
    @Override
    public Color getForeground(Object element, int columnIndex) {
        return fProvider.getForeground(element, columnIndex);
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.viewers.ITableColorProvider#getBackground(java.lang.Object, int)
     */
    @Override
    public Color getBackground(Object element, int columnIndex) {
        return fProvider.getBackground(element, columnIndex);
    }
}