/*******************************************************************************
* Copyright (c) 2012 Original authors 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:
* Original authors and others - initial API and implementation
******************************************************************************/
package org.eclipse.nebula.widgets.nattable.painter.cell;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eclipse.nebula.widgets.nattable.config.CellConfigAttributes;
import org.eclipse.nebula.widgets.nattable.config.IConfigRegistry;
import org.eclipse.nebula.widgets.nattable.data.convert.IDisplayConverter;
import org.eclipse.nebula.widgets.nattable.layer.IUniqueIndexLayer;
import org.eclipse.nebula.widgets.nattable.layer.LayerUtil;
import org.eclipse.nebula.widgets.nattable.layer.cell.ILayerCell;
import org.eclipse.nebula.widgets.nattable.util.GUIHelper;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Rectangle;
public class ColumnHeaderCheckBoxPainter extends ImagePainter {
private static final Log log = LogFactory.getLog(ColumnHeaderCheckBoxPainter.class);
private final Image checkedImg;
private final Image semicheckedImg;
private final Image uncheckedImg;
private final IUniqueIndexLayer columnDataLayer;
public ColumnHeaderCheckBoxPainter(IUniqueIndexLayer columnDataLayer) {
this(
columnDataLayer,
GUIHelper.getImage("checked"), //$NON-NLS-1$
GUIHelper.getImage("semichecked"), //$NON-NLS-1$
GUIHelper.getImage("unchecked") //$NON-NLS-1$
);
}
public ColumnHeaderCheckBoxPainter(IUniqueIndexLayer columnLayer,
Image checkedImg, Image semicheckedImage, Image uncheckedImg) {
this.columnDataLayer = columnLayer;
this.checkedImg = checkedImg;
this.semicheckedImg = semicheckedImage;
this.uncheckedImg = uncheckedImg;
}
public int getPreferredWidth(boolean checked) {
return getImage(checked).getBounds().width;
}
public int getPreferredHeight(boolean checked) {
return getImage(checked).getBounds().height;
}
public void paintIconImage(GC gc, Rectangle rectangle, int yOffset, boolean checked) {
Image checkBoxImage = getImage(checked);
// Center image
int x = rectangle.x + (rectangle.width / 2) - (checkBoxImage.getBounds().width / 2);
gc.drawImage(checkBoxImage, x, rectangle.y + yOffset);
}
public Image getImage(boolean checked) {
return checked ? this.checkedImg : this.uncheckedImg;
}
@Override
protected Image getImage(ILayerCell cell, IConfigRegistry configRegistry) {
int columnPosition = LayerUtil.convertColumnPosition(
cell.getLayer(), cell.getColumnPosition(), this.columnDataLayer);
int checkedCellsCount = getCheckedCellsCount(columnPosition, configRegistry);
Image result = null;
if (checkedCellsCount > 0) {
if (checkedCellsCount == this.columnDataLayer.getRowCount()) {
result = this.checkedImg;
} else {
result = this.semicheckedImg;
}
} else {
result = this.uncheckedImg;
}
return result;
}
public int getCheckedCellsCount(int columnPosition, IConfigRegistry configRegistry) {
int checkedCellsCount = 0;
for (int rowPosition = 0; rowPosition < this.columnDataLayer.getRowCount(); rowPosition++) {
ILayerCell columnCell = this.columnDataLayer.getCellByPosition(columnPosition, rowPosition);
if (isChecked(columnCell, configRegistry)) {
checkedCellsCount++;
}
}
return checkedCellsCount;
}
protected boolean isChecked(ILayerCell cell, IConfigRegistry configRegistry) {
return convertDataType(cell, configRegistry).booleanValue();
}
protected Boolean convertDataType(ILayerCell cell, IConfigRegistry configRegistry) {
if (cell.getDataValue() instanceof Boolean) {
return (Boolean) cell.getDataValue();
}
IDisplayConverter displayConverter = configRegistry.getConfigAttribute(
CellConfigAttributes.DISPLAY_CONVERTER,
cell.getDisplayMode(),
cell.getConfigLabels().getLabels());
Boolean convertedValue = null;
if (displayConverter != null) {
try {
convertedValue =
(Boolean) displayConverter.canonicalToDisplayValue(
cell, configRegistry, cell.getDataValue());
} catch (Exception e) {
log.debug(e);
}
}
if (convertedValue == null) {
convertedValue = Boolean.FALSE;
}
return convertedValue;
}
}