/*******************************************************************************
* 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.decorator;
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.nebula.widgets.nattable.util.GUIHelper;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Rectangle;
/**
* Decorator for rendering the cell with beveled borders (button look). It is
* possible to render the beveled borders to look like the cell is uplifted or
* sunk. The default is to render it uplifted.
*/
public class BeveledBorderDecorator extends CellPainterWrapper {
/**
* Flag to determine whether the cell borders should be painted uplift or
* sunk.
*/
private boolean uplift = true;
/**
*
* @param interiorPainter
* The painter which should be wrapped by this decorator.
*/
public BeveledBorderDecorator(ICellPainter interiorPainter) {
super(interiorPainter);
}
/**
*
* @param interiorPainter
* The painter which should be wrapped by this decorator.
* @param uplift
* Flag to determine whether the cell borders should be painted
* uplift or sunk. By default this flag is set to
* <code>true</code>. Set it to <code>false</code> if the cell
* should be rendered sunk.
*/
public BeveledBorderDecorator(ICellPainter interiorPainter, boolean uplift) {
super(interiorPainter);
this.uplift = uplift;
}
@Override
public int getPreferredWidth(ILayerCell cell, GC gc,
IConfigRegistry configRegistry) {
return super.getPreferredWidth(cell, gc, configRegistry) + 4;
}
@Override
public int getPreferredHeight(ILayerCell cell, GC gc,
IConfigRegistry configRegistry) {
return super.getPreferredHeight(cell, gc, configRegistry) + 4;
}
@Override
public Rectangle getWrappedPainterBounds(ILayerCell cell, GC gc,
Rectangle bounds, IConfigRegistry configRegistry) {
return new Rectangle(bounds.x + 2, bounds.y + 2, bounds.width - 4,
bounds.height - 4);
}
@Override
public void paintCell(ILayerCell cell, GC gc, Rectangle adjustedCellBounds,
IConfigRegistry configRegistry) {
Rectangle interiorBounds = getWrappedPainterBounds(cell, gc,
adjustedCellBounds, configRegistry);
super.paintCell(cell, gc, interiorBounds, configRegistry);
// Save GC settings
Color originalForeground = gc.getForeground();
// TODO: Need to look at the border style
// Up
gc.setForeground(this.uplift ? GUIHelper.COLOR_WIDGET_LIGHT_SHADOW
: GUIHelper.COLOR_WIDGET_DARK_SHADOW);
gc.drawLine(adjustedCellBounds.x, adjustedCellBounds.y,
adjustedCellBounds.x + adjustedCellBounds.width - 1,
adjustedCellBounds.y);
gc.drawLine(adjustedCellBounds.x, adjustedCellBounds.y,
adjustedCellBounds.x, adjustedCellBounds.y
+ adjustedCellBounds.height - 1);
gc.setForeground(this.uplift ? GUIHelper.COLOR_WIDGET_HIGHLIGHT_SHADOW
: GUIHelper.COLOR_WIDGET_NORMAL_SHADOW);
gc.drawLine(adjustedCellBounds.x + 1, adjustedCellBounds.y + 1,
adjustedCellBounds.x + adjustedCellBounds.width - 1,
adjustedCellBounds.y + 1);
gc.drawLine(adjustedCellBounds.x + 1, adjustedCellBounds.y + 1,
adjustedCellBounds.x + 1, adjustedCellBounds.y
+ adjustedCellBounds.height - 1);
// Down
gc.setForeground(this.uplift ? GUIHelper.COLOR_WIDGET_DARK_SHADOW
: GUIHelper.COLOR_WIDGET_LIGHT_SHADOW);
gc.drawLine(adjustedCellBounds.x, adjustedCellBounds.y
+ adjustedCellBounds.height - 1, adjustedCellBounds.x
+ adjustedCellBounds.width - 1, adjustedCellBounds.y
+ adjustedCellBounds.height - 1);
gc.drawLine(adjustedCellBounds.x + adjustedCellBounds.width - 1,
adjustedCellBounds.y, adjustedCellBounds.x
+ adjustedCellBounds.width - 1, adjustedCellBounds.y
+ adjustedCellBounds.height - 1);
gc.setForeground(this.uplift ? GUIHelper.COLOR_WIDGET_NORMAL_SHADOW
: GUIHelper.COLOR_WIDGET_HIGHLIGHT_SHADOW);
gc.drawLine(adjustedCellBounds.x, adjustedCellBounds.y
+ adjustedCellBounds.height - 2, adjustedCellBounds.x
+ adjustedCellBounds.width - 1, adjustedCellBounds.y
+ adjustedCellBounds.height - 2);
gc.drawLine(adjustedCellBounds.x + adjustedCellBounds.width - 2,
adjustedCellBounds.y, adjustedCellBounds.x
+ adjustedCellBounds.width - 2, adjustedCellBounds.y
+ adjustedCellBounds.height - 2);
// Restore GC settings
gc.setForeground(originalForeground);
}
}