/******************************************************************************* * Copyright (c) 2011, 2012 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.views.internal; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.Platform; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.StyledCellLabelProvider; import org.eclipse.jface.viewers.StyledString; import org.eclipse.jface.viewers.TreePath; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.ViewerCell; import org.eclipse.jface.viewers.StyledString.Styler; import org.eclipse.swt.graphics.Image; import org.eclipse.tcf.te.core.interfaces.IFilterable; import org.eclipse.tcf.te.ui.utils.TreeViewerUtil; import org.eclipse.ui.internal.navigator.NavigatorDecoratingLabelProvider; /** * An wrapping decorating label provider to replace the default navigator decorating label provider * in order to provide the filtering decoration. */ @SuppressWarnings("restriction") public class ViewViewerDecoratingLabelProvider extends NavigatorDecoratingLabelProvider { // The navigator's tree viewer to be decorated. private TreeViewer viewer; private TreePath path; /** * Create an instance with the tree viewer and a common label provider. * * @param viewer The navigator's tree viewer. * @param commonLabelProvider The navigator's common label provider. */ public ViewViewerDecoratingLabelProvider(TreeViewer viewer, ILabelProvider commonLabelProvider) { super(commonLabelProvider); this.viewer = viewer; } /* * (non-Javadoc) * @see org.eclipse.jface.viewers.DecoratingStyledCellLabelProvider#update(org.eclipse.jface.viewers.ViewerCell) */ @Override public void update(ViewerCell cell) { path = cell.getViewerRow().getTreePath(); super.update(cell); path = null; } /** * Returns the element label with no decoration applied. * * @param element The element. * @return The label. */ public String getTextNoDecoration(Object element) { IStyledLabelProvider provider = getStyledStringProvider(); StyledString styledString = provider.getStyledText(element); String text = styledString != null ? styledString.toString() : super.getText(element); return text; } /* * (non-Javadoc) * @see org.eclipse.ui.internal.navigator.NavigatorDecoratingLabelProvider#getText(java.lang.Object) */ @Override public String getText(Object element) { StyledString styledString = super.getStyledText(element); String text = styledString != null ? styledString.toString() : super.getText(element); IFilterable decorator = adaptFilterable(element); if (text != null && decorator != null && path != null && TreeViewerUtil.isFiltering(viewer, path)) { return TreeViewerUtil.getDecoratedText(text, viewer, path); } return text; } /* * (non-Javadoc) * @see org.eclipse.jface.viewers.DecoratingStyledCellLabelProvider#getImage(java.lang.Object) */ @Override public Image getImage(Object element) { Image image = super.getImage(element); IFilterable decorator = adaptFilterable(element); if (image != null && decorator != null && path != null && TreeViewerUtil.isFiltering(viewer, path)) { return TreeViewerUtil.getDecoratedImage(image, viewer, path); } return image; } /* * (non-Javadoc) * @see org.eclipse.jface.viewers.DecoratingStyledCellLabelProvider#getStyledText(java.lang.Object) */ @Override protected StyledString getStyledText(Object element) { StyledString styledString = super.getStyledText(element); IFilterable decorator = adaptFilterable(element); String text = styledString.getString(); if (text != null && decorator != null && path != null && TreeViewerUtil.isFiltering(viewer, path)) { String decorated = TreeViewerUtil.getDecoratedText(text, viewer, path); Styler style = getDecorationStyle(element); return StyledCellLabelProvider.styleDecoratedString(decorated, style, styledString); } return styledString; } /** * 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.ui.internal.navigator.NavigatorDecoratingLabelProvider#getColumnImage(java.lang.Object, int) */ @Override public Image getColumnImage(Object element, int columnIndex) { Image image = super.getColumnImage(element, columnIndex); if (columnIndex == 0) { IFilterable decorator = adaptFilterable(element); if (image != null && decorator != null && path != null && TreeViewerUtil.isFiltering(viewer, path)) { return TreeViewerUtil.getDecoratedImage(image, viewer, path); } } return image; } /* * (non-Javadoc) * @see org.eclipse.ui.internal.navigator.NavigatorDecoratingLabelProvider#getColumnText(java.lang.Object, int) */ @Override public String getColumnText(Object element, int columnIndex) { String text = super.getColumnText(element, columnIndex); if (columnIndex == 0) { IFilterable decorator = adaptFilterable(element); if (text != null && decorator != null && path != null && TreeViewerUtil.isFiltering(viewer, path)) { return TreeViewerUtil.getDecoratedText(text, viewer, path); } } return text; } }