/*******************************************************************************
* Copyright (c) 2004, 2007 Boeing.
* 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:
* Boeing - initial API and implementation
*******************************************************************************/
package org.eclipse.nebula.widgets.xviewer;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import org.eclipse.jface.viewers.ITableColorProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.nebula.widgets.xviewer.core.model.XViewerColumn;
import org.eclipse.nebula.widgets.xviewer.util.internal.XViewerLog;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
/**
* @author Donald G. Dunne
*/
public abstract class XViewerLabelProvider implements ITableLabelProvider, ITableColorProvider, IXViewerLabelProvider {
private final XViewer viewer;
// Store index of columnIndex to XViewerColumns to speed up label providing
private final Map<Integer, XViewerColumn> indexToXViewerColumnMap = new HashMap<Integer, XViewerColumn>();
@Override
public XViewerColumn getTreeColumnOffIndex(int columnIndex) {
if (!indexToXViewerColumnMap.containsKey(columnIndex)) {
XViewerColumn xViewerColumn = viewer.getXTreeColumn(columnIndex);
if (xViewerColumn != null) {
indexToXViewerColumnMap.put(columnIndex, xViewerColumn);
}
}
return indexToXViewerColumnMap.get(columnIndex);
}
// When columns get re-ordered, need to clear out this cache so indexing can be re-computed
@Override
public void clearXViewerColumnIndexCache() {
indexToXViewerColumnMap.clear();
}
public XViewerLabelProvider(final XViewer viewer) {
super();
this.viewer = viewer;
}
@Override
public Image getColumnImage(Object element, int columnIndex) {
try {
XViewerColumn xViewerColumn = getTreeColumnOffIndex(columnIndex);
// If not shown, don't process any further
if (!xViewerColumn.isShow()) {
return null;
}
if (xViewerColumn instanceof IXViewerValueColumn) {
Image image = ((IXViewerValueColumn) xViewerColumn).getColumnImage(element, xViewerColumn, columnIndex);
if (image != null) {
return image;
}
}
return getColumnImage(element, xViewerColumn, columnIndex);
} catch (Exception ex) {
XViewerLog.log(Activator.class, Level.SEVERE, ex);
}
return null;
}
@Override
public String getColumnText(Object element, int columnIndex) {
try {
XViewerColumn xViewerColumn = getTreeColumnOffIndex(columnIndex);
// If not shown, don't process any further
if (!xViewerColumn.isShow()) {
return "";
}
// Check if Pre Computed column
if (xViewerColumn instanceof IXViewerPreComputedColumn) {
IXViewerPreComputedColumn preComputedColumn = (IXViewerPreComputedColumn) xViewerColumn;
Long key = preComputedColumn.getKey(element);
String cachedValue = xViewerColumn.getPreComputedValue(key);
String result = ((IXViewerPreComputedColumn) xViewerColumn).getText(element, key, cachedValue);
if (result == null) {
// Give a single chance to populate a potentially new element, else store empty string to ensure good performance
preComputedColumn.populateCachedValues(Collections.singleton(element),
xViewerColumn.getPreComputedValueMap());
result = xViewerColumn.getPreComputedValue(key);
if (result == null) {
xViewerColumn.getPreComputedValueMap().put(key, "");
}
}
return result;
}
// First check value column's methods
if (xViewerColumn instanceof IXViewerValueColumn) {
String str = ((IXViewerValueColumn) xViewerColumn).getColumnText(element, xViewerColumn, columnIndex);
if (str != null) {
return str;
}
return "";
}
// Return label provider's value
return getColumnText(element, xViewerColumn, columnIndex);
} catch (Exception ex) {
return XViewerCells.getCellExceptionString(ex);
}
}
@Override
public Color getBackground(Object element, int columnIndex) {
try {
if (viewer.isSearch()) {
String text = getColumnText(element, columnIndex);
if (viewer.searchMatch(text)) {
return viewer.getSearchMatchColor();
}
}
XViewerColumn xViewerColumn = getTreeColumnOffIndex(columnIndex);
// If not shown, don't process any further
if (!xViewerColumn.isShow()) {
return null;
}
if (xViewerColumn instanceof IXViewerValueColumn) {
Color color = ((IXViewerValueColumn) xViewerColumn).getBackground(element, xViewerColumn, columnIndex);
if (color != null) {
return color;
}
}
return getBackground(element, xViewerColumn, columnIndex);
} catch (Exception ex) {
// do nothing
}
return null;
}
@Override
public Color getForeground(Object element, int columnIndex) {
try {
XViewerColumn xViewerColumn = getTreeColumnOffIndex(columnIndex);
// If not shown, don't process any further
if (!xViewerColumn.isShow()) {
return null;
}
if (xViewerColumn instanceof IXViewerValueColumn) {
Color color = ((IXViewerValueColumn) xViewerColumn).getForeground(element, xViewerColumn, columnIndex);
if (color != null) {
return color;
}
}
return getForeground(element, xViewerColumn, columnIndex);
} catch (Exception ex) {
// do nothing
}
return null;
}
public Color getBackground(Object element, XViewerColumn xCol, int columnIndex) {
return null;
}
public Color getForeground(Object element, XViewerColumn xCol, int columnIndex) {
return null;
}
public abstract Image getColumnImage(Object element, XViewerColumn xCol, int columnIndex) throws Exception;
@Override
public abstract String getColumnText(Object element, XViewerColumn xCol, int columnIndex) throws Exception;
/**
* Returns the backing data object for operations like sorting
*/
@Override
public Object getBackingData(Object element, XViewerColumn xViewerColumn, int columnIndex) throws Exception {
try {
// If not shown, don't process any further
if (!xViewerColumn.isShow()) {
return "";
}
// First check value column's methods
if (xViewerColumn instanceof IXViewerValueColumn) {
return ((IXViewerValueColumn) xViewerColumn).getBackingData(element, xViewerColumn, columnIndex);
}
} catch (Exception ex) {
return XViewerCells.getCellExceptionString(ex);
}
return null;
}
/**
* Return value between 0..100 and cell will show bar graph shading that portion of the cell
*/
@Override
public int getColumnGradient(Object element, XViewerColumn xCol, int columnIndex) throws Exception {
return 0;
}
}