package org.deidentifier.arx.gui.view.impl.common.datatable;
/*******************************************************************************
* Copyright (c) 2012, 2015 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
* Fabian Prasser - Image scaling
******************************************************************************/
import static org.eclipse.nebula.widgets.nattable.util.ObjectUtils.isNotNull;
import org.eclipse.nebula.widgets.nattable.config.IConfigRegistry;
import org.eclipse.nebula.widgets.nattable.layer.cell.ILayerCell;
import org.eclipse.nebula.widgets.nattable.painter.cell.CellPainterWrapper;
import org.eclipse.nebula.widgets.nattable.painter.cell.ICellPainter;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Pattern;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Display;
/**
* Paints the cell background using an image. Image is repeated to cover the
* background. Similar to HTML table painting.
*
* @author Fabian Prasser
*/
public class DataTableBackgroundImagePainter extends CellPainterWrapper {
/** Color */
public final Color separatorColor;
/** Image */
private Image bgImage;
/** Image */
private Image scaledBgImage;
/**
* @param interiorPainter
* used for painting the cell contents
* @param bgImage
* to be used for painting the background
*/
public DataTableBackgroundImagePainter(ICellPainter interiorPainter, Image bgImage) {
this(interiorPainter, bgImage, null);
}
/**
* @param interiorPainter
* used for painting the cell contents
* @param bgImage
* to be used for painting the background
* @param separatorColor
* to be used for drawing left and right borders for the cell.
* Set to null if the borders are not required.
*/
public DataTableBackgroundImagePainter(ICellPainter interiorPainter, Image bgImage, Color separatorColor) {
super(interiorPainter);
this.bgImage = bgImage;
this.scaledBgImage = bgImage;
this.separatorColor = separatorColor;
}
/**
* @param bgImage
* to be used for painting the background
* @since 1.4
*/
public DataTableBackgroundImagePainter(Image bgImage) {
this(null, bgImage, null);
}
/**
* @param bgImage
* to be used for painting the background
* @param separatorColor
* to be used for drawing left and right borders for the cell.
* Set to null if the borders are not required.
* @since 1.4
*/
public DataTableBackgroundImagePainter(Image bgImage, Color separatorColor) {
this(null, bgImage, separatorColor);
}
@Override
public int getPreferredHeight(ILayerCell cell, GC gc, IConfigRegistry configRegistry) {
return super.getPreferredHeight(cell, gc, configRegistry) + 4;
}
@Override
public int getPreferredWidth(ILayerCell cell, GC gc, IConfigRegistry configRegistry) {
return super.getPreferredWidth(cell, gc, configRegistry) + 4;
}
@Override
public void paintCell(ILayerCell cell, GC gc, Rectangle rectangle, IConfigRegistry configRegistry) {
if (this.bgImage != null) {
// Save GC settings
Color originalBackground = gc.getBackground();
Color originalForeground = gc.getForeground();
// Ugly hack
Pattern pattern = new Pattern(Display.getCurrent(), getImage(rectangle.height));
gc.setBackgroundPattern(pattern);
gc.fillRectangle(rectangle);
gc.setBackgroundPattern(null);
pattern.dispose();
if (isNotNull(this.separatorColor)) {
gc.setForeground(this.separatorColor);
gc.drawLine(
rectangle.x - 1,
rectangle.y,
rectangle.x - 1,
rectangle.y + rectangle.height);
gc.drawLine(
rectangle.x - 1 + rectangle.width,
rectangle.y,
rectangle.x - 1 + rectangle.width,
rectangle.y + rectangle.height);
}
// Restore original GC settings
gc.setBackground(originalBackground);
gc.setForeground(originalForeground);
}
// Draw interior
Rectangle interiorBounds = new Rectangle(
rectangle.x + 2,
rectangle.y + 2,
rectangle.width - 4,
rectangle.height - 4);
super.paintCell(cell, gc, interiorBounds, configRegistry);
}
/**
* Returns a potentially scaled version of the background image
* @param height
*/
private Image getImage(int height) {
if (this.scaledBgImage.getBounds().height != height) {
int width = this.bgImage.getBounds().width;
this.scaledBgImage = new Image(this.bgImage.getDevice(), this.bgImage.getImageData()
.scaledTo(width,
height));
}
return this.scaledBgImage;
}
}