/*******************************************************************************
* 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);
}
}