/*******************************************************************************
* 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.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider;
import org.eclipse.jface.viewers.StyledCellLabelProvider;
import org.eclipse.jface.viewers.StyledString;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.nebula.widgets.xviewer.core.model.XViewerColumn;
import org.eclipse.nebula.widgets.xviewer.util.internal.XViewerLog;
import org.eclipse.swt.custom.StyleRange;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
/**
* @author Donald G. Dunne
*/
public abstract class XViewerStyledTextLabelProvider extends StyledCellLabelProvider implements 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();
}
@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) {
Object obj = ((IXViewerValueColumn) xViewerColumn).getBackingData(element, xViewerColumn, columnIndex);
if (obj != null) {
return obj;
}
}
} catch (Exception ex) {
return XViewerCells.getCellExceptionString(ex);
}
return null;
}
/**
* Creates a {@link XViewerStyledTextLabelProvider} that delegates the requests for the styled labels and the images
* to a {@link IStyledLabelProvider}.
*
* @param labelProvider the label provider that provides the styled labels and the images
*/
public XViewerStyledTextLabelProvider(XViewer viewer) {
this.viewer = viewer;
}
@Override
public void update(ViewerCell cell) {
Object element = cell.getElement();
StyledString styledString = getStyledText(element, cell.getColumnIndex());
String newText = styledString.toString();
StyleRange[] oldStyleRanges = cell.getStyleRanges();
StyleRange[] newStyleRanges = isOwnerDrawEnabled() ? styledString.getStyleRanges() : null;
if (!Arrays.equals(oldStyleRanges, newStyleRanges)) {
cell.setStyleRanges(newStyleRanges);
// if (cell.getText().equals(newText)) {
// // make sure there will be a refresh from a change
// cell.setText(""); //$NON-NLS-1$
// }
}
cell.setText(newText);
cell.setImage(getColumnImage(element, cell.getColumnIndex()));
cell.setFont(getFont(element, cell.getColumnIndex()));
cell.setForeground(getForeground(element, cell.getColumnIndex()));
cell.setBackground(getBackground(element, cell.getColumnIndex()));
// no super call required. changes on item will trigger the refresh.
}
@Override
public int getColumnGradient(Object element, XViewerColumn xCol, int columnIndex) throws Exception {
return 0;
}
private Font getFont(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 XViewerValueColumn) {
return ((XViewerValueColumn) xViewerColumn).getFont(element, xViewerColumn, columnIndex);
} else {
return getFont(element, xViewerColumn, columnIndex);
}
} catch (Exception ex) {
// do nothing
}
return null;
}
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 XViewerValueColumn) {
Image image = ((XViewerValueColumn) 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;
}
StyledString getStyledText(Object element, int columnIndex) {
try {
XViewerColumn xViewerColumn = getTreeColumnOffIndex(columnIndex);
// If not shown, don't process any further
if (!xViewerColumn.isShow()) {
return new StyledString("");
}
if (xViewerColumn instanceof XViewerValueColumn) {
return ((XViewerValueColumn) xViewerColumn).getStyledText(element, xViewerColumn, columnIndex);
}
return getStyledText(element, xViewerColumn, columnIndex);
} catch (Exception ex) {
return new StyledString(XViewerCells.getCellExceptionString(ex));
}
}
private Color getBackground(Object element, int columnIndex) {
try {
XViewerColumn xViewerColumn = getTreeColumnOffIndex(columnIndex);
if (viewer.isSearch()) {
StyledString text = getStyledText(element, columnIndex);
if (viewer.searchMatch(text.getString())) {
return viewer.getSearchMatchColor();
}
}
// If not shown, don't process any further
if (!xViewerColumn.isShow()) {
return null;
}
if (xViewerColumn instanceof XViewerValueColumn) {
return ((XViewerValueColumn) xViewerColumn).getBackground(element, xViewerColumn, columnIndex);
} else {
return getBackground(element, xViewerColumn, columnIndex);
}
} catch (Exception ex) {
// do nothing
}
return null;
}
private 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 XViewerValueColumn) {
return ((XViewerValueColumn) xViewerColumn).getForeground(element, xViewerColumn, columnIndex);
} else {
return getForeground(element, xViewerColumn, columnIndex);
}
} catch (Exception ex) {
// do nothing
}
return null;
}
@Override
public String getColumnText(Object element, XViewerColumn xCol, int column) throws Exception {
return getStyledText(element, xCol, column).getString();
}
@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 "";
}
// 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);
}
}
public abstract Image getColumnImage(Object element, XViewerColumn xCol, int column) throws Exception;
public abstract StyledString getStyledText(Object element, XViewerColumn xCol, int column) throws Exception;
public abstract Color getBackground(Object element, XViewerColumn viewerColumn, int columnIndex) throws Exception;
public abstract Color getForeground(Object element, XViewerColumn viewerColumn, int columnIndex) throws Exception;
public abstract Font getFont(Object element, XViewerColumn viewerColumn, int columnIndex) throws Exception;
}