/*******************************************************************************
* Copyright (c) 2014 Mirko Paturzo (Exeura srl).
* 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:
* Mirko Paturzo - initial API and implementation
*******************************************************************************/
package org.eclipse.nebula.widgets.grid;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
/**
* This implementation of {@link DataVisualizer} is the default for Grid when no
* custom implementation has been provided.
*
* This class is used to provide general visualization values for various
* aspects of the GridItem like background, font and text. Your own subclass of
* this class could be used in combination with the JFace LabelProvider if you
* use the GridViewer. This implementation is preferable in the case where there
* are more rows than columns.
*
* @author Mirko Paturzo <mirko.paturzo@exeura.eu>
*
*/
public class GridItemDataVisualizer implements DataVisualizer {
/**
* Create {@link GridItemDataVisualizer} with default value
*
* @param defaultBackground
* @param defaultForeground
* @param defaultFont
*/
public GridItemDataVisualizer(Color defaultBackground, Color defaultForeground, Font defaultFont) {
this.defaultBackground = defaultBackground;
this.defaultForeground = defaultForeground;
this.defaultFont = defaultFont;
}
private final Map<GridItem, List<Color>> backgrounds = new HashMap<GridItem, List<Color>>();
private final Map<GridItem, List<Color>> foregrounds = new HashMap<GridItem, List<Color>>();
private final Map<GridItem, List<Boolean>> checkables = new HashMap<GridItem, List<Boolean>>();
private final Map<GridItem, List<Boolean>> checkeds = new HashMap<GridItem, List<Boolean>>();
private final Map<GridItem, List<Boolean>> grayeds = new HashMap<GridItem, List<Boolean>>();
private final Map<GridItem, List<Integer>> columnSpans = new HashMap<GridItem, List<Integer>>();
private final Map<GridItem, List<Integer>> rowSpans = new HashMap<GridItem, List<Integer>>();
private final Map<GridItem, List<Font>> fonts = new HashMap<GridItem, List<Font>>();
private final Map<GridItem, List<Image>> images = new HashMap<GridItem, List<Image>>();
private final Map<GridItem, List<String>> texts = new HashMap<GridItem, List<String>>();
private final Map<GridItem, List<String>> toolTipTexts = new HashMap<GridItem, List<String>>();
private Color defaultBackground;
private Color defaultForeground;
private Font defaultFont;
/**
* @see org.eclipse.nebula.widgets.grid.DataVisualizer#getDefaultBackground()
*/
@Override
public Color getDefaultBackground() {
return defaultBackground;
}
/**
* @see org.eclipse.nebula.widgets.grid.DataVisualizer#getDefaultForeground()
*/
@Override
public Color getDefaultForeground() {
return defaultForeground;
}
/**
* @see org.eclipse.nebula.widgets.grid.DataVisualizer#getDefaultFont()
*/
@Override
public Font getDefaultFont() {
return defaultFont;
}
/**
* @see org.eclipse.nebula.widgets.grid.DataVisualizer#getBackground(org.eclipse.nebula.widgets.grid.GridItem, int)
*/
@Override
public Color getBackground(GridItem gridItem, int column) {
return getValueOrDefault(backgrounds, gridItem, column, defaultBackground);
}
/**
* get value or default
*
* @param map
* @param gridItem
* @param column
* @param defaultValue
* @return T
*/
protected <T> T getValueOrDefault(Map<GridItem, List<T>> map, GridItem gridItem, int column, T defaultValue) {
if (column < 0)
return defaultValue;
List<T> list = map.get(gridItem);
if (list == null || column >= list.size())
return defaultValue;
T t = list.get(column);
if (t == null)
return defaultValue;
return t;
}
/**
* @see org.eclipse.nebula.widgets.grid.DataVisualizer#getChecked(org.eclipse.nebula.widgets.grid.GridItem, int)
*/
@Override
public boolean getChecked(GridItem gridItem, int column) {
return getValueOrDefault(checkeds, gridItem, column, Boolean.FALSE);
}
/**
* @see org.eclipse.nebula.widgets.grid.DataVisualizer#getColumnSpan(org.eclipse.nebula.widgets.grid.GridItem, int)
*/
@Override
public int getColumnSpan(GridItem gridItem, int column) {
return getValueOrDefault(columnSpans, gridItem, column, 0);
}
/**
* @see org.eclipse.nebula.widgets.grid.DataVisualizer#getRowSpan(org.eclipse.nebula.widgets.grid.GridItem, int)
*/
@Override
public int getRowSpan(GridItem gridItem, int column) {
return getValueOrDefault(rowSpans, gridItem, column, 0);
}
/**
* @see org.eclipse.nebula.widgets.grid.DataVisualizer#getFont(org.eclipse.nebula.widgets.grid.GridItem, int)
*/
@Override
public Font getFont(GridItem gridItem, int column) {
return getValueOrDefault(fonts, gridItem, column, defaultFont);
}
/**
* @see org.eclipse.nebula.widgets.grid.DataVisualizer#getForeground(org.eclipse.nebula.widgets.grid.GridItem, int)
*/
@Override
public Color getForeground(GridItem gridItem, int column) {
return getValueOrDefault(foregrounds, gridItem, column, defaultForeground);
}
/**
* @see org.eclipse.nebula.widgets.grid.DataVisualizer#getGrayed(org.eclipse.nebula.widgets.grid.GridItem, int)
*/
@Override
public boolean getGrayed(GridItem gridItem, int column) {
return getValueOrDefault(grayeds, gridItem, column, Boolean.FALSE);
}
/**
* @see org.eclipse.nebula.widgets.grid.DataVisualizer#getImage(org.eclipse.nebula.widgets.grid.GridItem, int)
*/
@Override
public Image getImage(GridItem gridItem, int column) {
return getValueOrDefault(images, gridItem, column, null);
}
/**
* @see org.eclipse.nebula.widgets.grid.DataVisualizer#getText(org.eclipse.nebula.widgets.grid.GridItem, int)
*/
@Override
public String getText(GridItem gridItem, int column) {
return getValueOrDefault(texts, gridItem, column, "");
}
/**
* @see org.eclipse.nebula.widgets.grid.DataVisualizer#setBackground(org.eclipse.nebula.widgets.grid.GridItem, int, org.eclipse.swt.graphics.Color)
*/
@Override
public void setBackground(GridItem gridItem, int column, Color color) {
put(backgrounds, gridItem, column, color);
}
/**
* put value on maps
*
* @param map
* @param gridItem
* @param column
* @param value
*/
protected <T> void put(Map<GridItem, List<T>> map, GridItem gridItem, int column, T value) {
List<T> list = map.get(gridItem);
if (list == null) {
list = new ArrayList<T>();
map.put(gridItem, list);
}
while (column > list.size()) {
list.add(null);
}
if (list.size() > column) {
list.remove(column);
}
list.add(column, value);
}
/**
* @see org.eclipse.nebula.widgets.grid.DataVisualizer#setChecked(org.eclipse.nebula.widgets.grid.GridItem, int, boolean)
*/
@Override
public void setChecked(GridItem gridItem, int column, boolean checked) {
put(checkeds, gridItem, column, checked);
}
/**
* @see org.eclipse.nebula.widgets.grid.DataVisualizer#setColumnSpan(org.eclipse.nebula.widgets.grid.GridItem, int, int)
*/
@Override
public void setColumnSpan(GridItem gridItem, int column, int span) {
put(columnSpans, gridItem, column, span);
}
/**
* @see org.eclipse.nebula.widgets.grid.DataVisualizer#setRowSpan(org.eclipse.nebula.widgets.grid.GridItem, int, int)
*/
@Override
public void setRowSpan(GridItem gridItem, int column, int span) {
put(rowSpans, gridItem, column, span);
}
/**
* @see org.eclipse.nebula.widgets.grid.DataVisualizer#setFont(org.eclipse.nebula.widgets.grid.GridItem, int, org.eclipse.swt.graphics.Font)
*/
@Override
public void setFont(GridItem gridItem, int column, Font font) {
put(fonts, gridItem, column, font);
}
/**
* @see org.eclipse.nebula.widgets.grid.DataVisualizer#setForeground(org.eclipse.nebula.widgets.grid.GridItem, int, org.eclipse.swt.graphics.Color)
*/
@Override
public void setForeground(GridItem gridItem, int column, Color foreground) {
put(foregrounds, gridItem, column, foreground);
}
/**
* @see org.eclipse.nebula.widgets.grid.DataVisualizer#setGrayed(org.eclipse.nebula.widgets.grid.GridItem, int, boolean)
*/
@Override
public void setGrayed(GridItem gridItem, int column, boolean grayed) {
put(grayeds, gridItem, column, grayed);
}
/**
* @see org.eclipse.nebula.widgets.grid.DataVisualizer#setImage(org.eclipse.nebula.widgets.grid.GridItem, int, org.eclipse.swt.graphics.Image)
*/
@Override
public void setImage(GridItem gridItem, int column, Image image) {
put(images, gridItem, column, image);
}
/**
* @see org.eclipse.nebula.widgets.grid.DataVisualizer#setText(org.eclipse.nebula.widgets.grid.GridItem, int, java.lang.String)
*/
@Override
public void setText(GridItem gridItem, int column, String text) {
put(texts, gridItem, column, text);
}
/**
* @see org.eclipse.nebula.widgets.grid.DataVisualizer#getCheckable(org.eclipse.nebula.widgets.grid.GridItem, int)
*/
@Override
public boolean getCheckable(GridItem gridItem, int column) {
return getValueOrDefault(checkables, gridItem, column, Boolean.TRUE);
}
/**
* @see org.eclipse.nebula.widgets.grid.DataVisualizer#setCheckable(org.eclipse.nebula.widgets.grid.GridItem, int, boolean)
*/
@Override
public void setCheckable(GridItem gridItem, int column, boolean checked) {
put(this.checkables, gridItem, column, checked);
}
/**
* @see org.eclipse.nebula.widgets.grid.DataVisualizer#getToolTipText(org.eclipse.nebula.widgets.grid.GridItem, int)
*/
@Override
public String getToolTipText(GridItem gridItem, int column) {
return getValueOrDefault(toolTipTexts, gridItem, column, "");
}
/**
* @see org.eclipse.nebula.widgets.grid.DataVisualizer#setToolTipText(org.eclipse.nebula.widgets.grid.GridItem, int, java.lang.String)
*/
@Override
public void setToolTipText(GridItem gridItem, int column, String tooltip) {
put(toolTipTexts, gridItem, column, tooltip);
}
/**
* In this implementation is too much expensive... Empty is Much better
*
* @see org.eclipse.nebula.widgets.grid.DataVisualizer#clearRow(GridItem)
*/
@Override
public void clearRow(GridItem gridItem) {
texts.remove(gridItem);
toolTipTexts.remove(gridItem);
foregrounds.remove(gridItem);
backgrounds.remove(gridItem);
images.remove(gridItem);
fonts.remove(gridItem);
rowSpans.remove(gridItem);
columnSpans.remove(gridItem);
grayeds.remove(gridItem);
checkables.remove(gridItem);
checkeds.remove(gridItem);
}
/**
* Remove in revertIndex
*
* @param map
* @param column
*/
protected <T> void removeInvertIndex(Map<GridItem, List<T>> map, int column) {
for (List<T> list : map.values()) {
if (column >= 0 && column < list.size()) {
list.remove(column);
}
}
}
/**
* @see org.eclipse.nebula.widgets.grid.DataVisualizer#clearColumn(int)
*/
@Override
public void clearColumn(int column) {
removeInvertIndex(texts, column);
removeInvertIndex(toolTipTexts, column);
removeInvertIndex(foregrounds, column);
removeInvertIndex(backgrounds, column);
removeInvertIndex(images, column);
removeInvertIndex(fonts, column);
removeInvertIndex(rowSpans, column);
removeInvertIndex(columnSpans, column);
removeInvertIndex(grayeds, column);
removeInvertIndex(checkables, column);
removeInvertIndex(checkeds, column);
}
/**
* @see org.eclipse.nebula.widgets.grid.DataVisualizer#addColumn(int)
*/
@Override
public void addColumn(int column) {
addColumnToMap(texts, column);
addColumnToMap(toolTipTexts, column);
addColumnToMap(foregrounds, column);
addColumnToMap(backgrounds, column);
addColumnToMap(images, column);
addColumnToMap(fonts, column);
addColumnToMap(rowSpans, column);
addColumnToMap(columnSpans, column);
addColumnToMap(grayeds, column);
addColumnToMap(checkables, column);
addColumnToMap(checkeds, column);
}
private <T> void addColumnToMap(Map<GridItem, List<T>> map, int column) {
Collection<List<T>> collections = map.values();
if (collections != null) {
for (List<T> list : collections) {
if (!list.isEmpty()) {
for (int i = list.size(); i < column; i++) {
list.add(i, null);
}
list.add(column, null);
}
}
}
}
/**
* @see org.eclipse.nebula.widgets.grid.DataVisualizer#setDefaultBackground(org.eclipse.swt.graphics.Color)
*/
@Override
public void setDefaultBackground(Color defaultBackground) {
this.defaultBackground = defaultBackground;
}
/**
* @see org.eclipse.nebula.widgets.grid.DataVisualizer#setDefaultForeground(org.eclipse.swt.graphics.Color)
*/
@Override
public void setDefaultForeground(Color defaultForeground) {
this.defaultForeground = defaultForeground;
}
/**
* @see org.eclipse.nebula.widgets.grid.DataVisualizer#setDefaultFont(org.eclipse.swt.graphics.Font)
*/
@Override
public void setDefaultFont(Font defaultFont) {
this.defaultFont = defaultFont;
}
/**
* @see org.eclipse.nebula.widgets.grid.DataVisualizer#clearAll()
*/
@Override
public void clearAll() {
texts.clear();
toolTipTexts.clear();
foregrounds.clear();
backgrounds.clear();
images.clear();
fonts.clear();
rowSpans.clear();
columnSpans.clear();
grayeds.clear();
checkables.clear();
checkeds.clear();
}
}