/*******************************************************************************
* Copyright (c) 2013, 2015 Dirk Fauth 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:
* Dirk Fauth <dirk.fauth@gmail.com> - initial API and implementation
*******************************************************************************/
package org.eclipse.nebula.widgets.nattable.painter;
import org.eclipse.nebula.widgets.nattable.config.CellConfigAttributes;
import org.eclipse.nebula.widgets.nattable.config.IConfigRegistry;
import org.eclipse.nebula.widgets.nattable.layer.ILayer;
import org.eclipse.nebula.widgets.nattable.style.DisplayMode;
import org.eclipse.nebula.widgets.nattable.util.GUIHelper;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Rectangle;
/**
* IOverlayPainter that renders the left and the top border of a NatTable.
* <p>
* This is necessary because by default the left and the top borders are not
* rendered so it is possible to create composite stacks that do not create
* double sized borders (e.g. between row header and body). Mainly the issue
* results because of several offset calculations all over the NatTable
* rendering code.
* <p>
* For completeness this painter is also able to render the right and the bottom
* border to ensure that the border has the same color around the NatTable
* without changing the grid line color.
*/
public class NatTableBorderOverlayPainter implements IOverlayPainter2 {
/**
* The color that should be used to render the border around the NatTable.
*/
private final Color borderColor;
/**
* Flag to specify whether to render all border lines or only the left and
* the top border. By default only the left and the top border lines are
* rendered as the right and the bottom border lines are already rendered by
* existing painters.
*/
private final boolean renderAllBorderLines;
/**
* The IConfigRegistry that should be used to retrieve the color to use for
* rendering the border. If set to <code>null</code>, the configured color
* will be used.
*/
private final IConfigRegistry configRegistry;
/**
* Creates a NatTableBorderOverlayPainter that paints gray border lines to
* the top and to the left.
*/
public NatTableBorderOverlayPainter() {
this(GUIHelper.COLOR_GRAY);
}
/**
* Creates a NatTableBorderOverlayPainter that paints by default gray border
* lines to the top and to the left.
*
* @param configRegistry
* The IConfigRegistry to dynamically load the grid line color.
* If a configuration value is found, it will be used instead of
* the gray default color.
*/
public NatTableBorderOverlayPainter(IConfigRegistry configRegistry) {
this(GUIHelper.COLOR_GRAY, configRegistry);
}
/**
* Creates a NatTableBorderOverlayPainter that paints gray border lines.
*
* @param renderAllBorderLines
* <code>true</code> if all border lines should be rendered,
* <code>false</code> if only the left and the top border line
* need to be rendered.
*/
public NatTableBorderOverlayPainter(final boolean renderAllBorderLines) {
this(GUIHelper.COLOR_GRAY, renderAllBorderLines);
}
/**
* Creates a NatTableBorderOverlayPainter that paints gray border lines by
* default.
*
* @param renderAllBorderLines
* <code>true</code> if all border lines should be rendered,
* <code>false</code> if only the left and the top border line
* need to be rendered.
* @param configRegistry
* The IConfigRegistry to dynamically load the grid line color.
* If a configuration value is found, it will be used instead of
* the gray default color.
*/
public NatTableBorderOverlayPainter(final boolean renderAllBorderLines,
IConfigRegistry configRegistry) {
this(GUIHelper.COLOR_GRAY, renderAllBorderLines, configRegistry);
}
/**
* Creates a NatTableBorderOverlayPainter that paints border lines to the
* top and to the left.
*
* @param borderColor
* The color that should be used to render the border lines.
*/
public NatTableBorderOverlayPainter(final Color borderColor) {
this(borderColor, false);
}
/**
* Creates a NatTableBorderOverlayPainter that paints border lines to the
* top and to the left.
*
* @param borderColor
* The default color that should be used to render the border
* lines.
* @param configRegistry
* The IConfigRegistry to dynamically load the grid line color.
* If a configuration value is found, it will be used instead of
* the given default color.
*/
public NatTableBorderOverlayPainter(final Color borderColor,
IConfigRegistry configRegistry) {
this(borderColor, false, configRegistry);
}
/**
* Creates a NatTableBorderOverlayPainter that paints border lines.
*
* @param borderColor
* The color that should be used to render the border lines.
* @param renderAllBorderLines
* <code>true</code> if all border lines should be rendered,
* <code>false</code> if only the left and the top border line
* need to be rendered.
*/
public NatTableBorderOverlayPainter(final Color borderColor,
final boolean renderAllBorderLines) {
this(borderColor, renderAllBorderLines, null);
}
/**
* Creates a NatTableBorderOverlayPainter that paints border lines.
*
* @param borderColor
* The color that should be used to render the border lines.
* @param renderAllBorderLines
* <code>true</code> if all border lines should be rendered,
* <code>false</code> if only the left and the top border line
* need to be rendered.
*/
public NatTableBorderOverlayPainter(final Color borderColor,
final boolean renderAllBorderLines, IConfigRegistry configRegistry) {
this.borderColor = borderColor;
this.renderAllBorderLines = renderAllBorderLines;
this.configRegistry = configRegistry;
}
@Override
public void paintOverlay(GC gc, ILayer layer) {
paintOverlay(layer, gc, 0, 0, new Rectangle(0, 0, layer.getWidth(), layer.getHeight()));
}
/**
* @since 1.4
*/
@Override
public void paintOverlay(ILayer layer, GC gc, int xOffset, int yOffset, Rectangle rectangle) {
Color beforeColor = gc.getForeground();
gc.setForeground(getBorderColor());
int x = rectangle.x;
int y = rectangle.y;
int width = rectangle.x + Math.min(rectangle.width, layer.getWidth() - rectangle.x);
int height = rectangle.y + Math.min(rectangle.height, layer.getHeight() - rectangle.y);
if (rectangle.x == 0) {
gc.drawLine(x, y, x, height - 1);
}
if (rectangle.y == 0) {
gc.drawLine(x, y, width - 1, y);
}
if (this.renderAllBorderLines) {
if (width >= layer.getWidth()) {
gc.drawLine(width - 1, y, width - 1, height - 1);
}
if (height >= layer.getHeight()) {
gc.drawLine(x, height - 1, width - 1, height - 1);
}
}
gc.setForeground(beforeColor);
}
/**
* Checks if a IConfigRegistry is set to this NatTableBorderOverlayPainter
* and will try to extract the configuration value for
* {@link CellConfigAttributes#GRID_LINE_COLOR}. If there is no
* IConfigRegistry set or there is no value for the attribute in the set
* IConfigRegistry, the Color set as member will be used.
*
* @return The Color that will be used to render the grid lines.
*
* @since 1.4
*/
public Color getBorderColor() {
if (this.configRegistry != null) {
Color bColor = this.configRegistry.getConfigAttribute(
CellConfigAttributes.GRID_LINE_COLOR, DisplayMode.NORMAL);
if (bColor != null)
return bColor;
}
return this.borderColor;
}
}