
org.eclipse.nebula.widgets.grid.internal.DefaultColumnHeaderRenderer Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of nebula-grid Show documentation
Show all versions of nebula-grid Show documentation
Fork of Eclipse Nebula grid widget
The newest version!
/*******************************************************************************
* Copyright (c) 2006 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* [email protected] - initial API and implementation
* [email protected] - wordwrapping in bug 222280
* [email protected] - wordwrapping in bug 222280
* Marty Jones - custom header/footer font in bug 293743
*******************************************************************************/
package org.eclipse.nebula.widgets.grid.internal;
import org.eclipse.nebula.widgets.grid.GridColumn;
import org.eclipse.nebula.widgets.grid.GridHeaderRenderer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.graphics.TextLayout;
import org.eclipse.swt.widgets.Display;
/**
* The column header renderer.
*
* @author [email protected]
* @since 2.0.0
*/
public class DefaultColumnHeaderRenderer extends GridHeaderRenderer
{
int leftMargin = 6;
int rightMargin = 6;
int topMargin = 3;
int bottomMargin = 3;
int arrowMargin = 6;
int imageSpacing = 3;
private SortArrowRenderer arrowRenderer = new SortArrowRenderer();
private TextLayout textLayout;
/**
* {@inheritDoc}
*/
public Point computeSize(GC gc, int wHint, int hHint, Object value)
{
GridColumn column = (GridColumn)value;
gc.setFont(column.getHeaderFont());
int x = leftMargin;
int y = topMargin + gc.getFontMetrics().getHeight() + bottomMargin;
if (column.getImage() != null)
{
x += column.getImage().getBounds().width + imageSpacing;
y = Math.max(y, topMargin + column.getImage().getBounds().height + bottomMargin);
}
if (!isWordWrap())
{
x += gc.stringExtent(column.getText()).x + rightMargin;
}
else
{
int plainTextWidth;
if (wHint == SWT.DEFAULT)
plainTextWidth = getBounds().width - x - rightMargin;
else
plainTextWidth = wHint - x - rightMargin;
getTextLayout(gc, column);
textLayout.setText(column.getText());
textLayout.setWidth(plainTextWidth < 1 ? 1 : plainTextWidth);
textLayout.setAlignment(getHorizontalAlignment());
x += plainTextWidth + rightMargin;
int textHeight = topMargin;
textHeight += textLayout.getBounds().height;
textHeight += bottomMargin;
y = Math.max(y, textHeight);
}
y += computeControlSize(column).y;
return new Point(x, y);
}
/**
* {@inheritDoc}
*/
public void paint(GC gc, Object value)
{
GridColumn column = (GridColumn)value;
// set the font to be used to display the text.
gc.setFont(column.getHeaderFont());
boolean flat = (column.getParent().getCellSelectionEnabled() && !column.getMoveable());
boolean drawSelected = ((isMouseDown() && isHover()));
gc.setBackground(getDisplay().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
if (flat && isSelected())
{
gc.setBackground(column.getParent().getCellHeaderSelectionBackground());
}
gc.fillRectangle(getBounds().x, getBounds().y, getBounds().width,
getBounds().height);
int pushedDrawingOffset = 0;
if (drawSelected)
{
pushedDrawingOffset = 1;
}
int x = leftMargin;
if (column.getImage() != null)
{
int y = bottomMargin;
if( column.getHeaderControl() == null ) {
y = getBounds().y + pushedDrawingOffset + getBounds().height - bottomMargin - column.getImage().getBounds().height;
}
gc.drawImage(column.getImage(), getBounds().x + x + pushedDrawingOffset, y);
x += column.getImage().getBounds().width + imageSpacing;
}
int width = getBounds().width - x;
if (column.getSort() == SWT.NONE)
{
width -= rightMargin;
}
else
{
width -= arrowMargin + arrowRenderer.getSize().x + arrowMargin;
}
gc.setForeground(getDisplay().getSystemColor(SWT.COLOR_WIDGET_FOREGROUND));
int y = bottomMargin;
if( column.getHeaderControl() == null ) {
y = getBounds().y + getBounds().height - bottomMargin
- gc.getFontMetrics().getHeight();
} else {
y = getBounds().y + getBounds().height - bottomMargin - gc.getFontMetrics().getHeight() - computeControlSize(column).y;
}
String text = column.getText();
if (!isWordWrap())
{
text = TextUtils.getShortStr(gc, text, width,truncationStyle);
}
if (column.getAlignment() == SWT.RIGHT)
{
int len = gc.stringExtent(text).x;
if (len < width)
{
x += width - len;
}
}
else if (column.getAlignment() == SWT.CENTER)
{
int len = gc.stringExtent(text).x;
if (len < width)
{
x += (width - len) / 2;
}
}
if (!isWordWrap()) {
gc.drawString(text, getBounds().x + x + pushedDrawingOffset,
y + pushedDrawingOffset,true);
}
else
{
getTextLayout(gc, column);
textLayout.setWidth(width < 1 ? 1 : width);
textLayout.setText(text);
textLayout.setAlignment(getHorizontalAlignment());
y -= textLayout.getBounds().height;
// remove the first line shift
y+=gc.getFontMetrics().getHeight();
if (column.getParent().isAutoHeight())
{
column.getParent().recalculateHeader();
}
textLayout.draw(gc, getBounds().x + x + pushedDrawingOffset, y + pushedDrawingOffset);
}
if (column.getSort() != SWT.NONE)
{
if( column.getHeaderControl() == null ) {
y = getBounds().y
+ ((getBounds().height - arrowRenderer.getBounds().height) / 2)
+ 1;
} else {
y = getBounds().y
+ ((getBounds().height - computeControlSize(column).y - arrowRenderer.getBounds().height) / 2)
+ 1;
}
arrowRenderer.setSelected(column.getSort() == SWT.DOWN);
if (drawSelected)
{
arrowRenderer
.setLocation(
getBounds().x + getBounds().width - arrowMargin
- arrowRenderer.getBounds().width + 1,y
);
}
else
{
if( column.getHeaderControl() == null ) {
y = getBounds().y
+ ((getBounds().height - arrowRenderer.getBounds().height) / 2);
} else {
y = getBounds().y
+ ((getBounds().height - computeControlSize(column).y - arrowRenderer.getBounds().height) / 2);
}
arrowRenderer
.setLocation(
getBounds().x + getBounds().width - arrowMargin
- arrowRenderer.getBounds().width,y);
}
arrowRenderer.paint(gc, null);
}
if (!flat)
{
if (drawSelected)
{
gc.setForeground(getDisplay().getSystemColor(SWT.COLOR_WIDGET_NORMAL_SHADOW));
}
else
{
gc.setForeground(getDisplay().getSystemColor(SWT.COLOR_WIDGET_HIGHLIGHT_SHADOW));
}
gc.drawLine(getBounds().x, getBounds().y, getBounds().x + getBounds().width - 1,
getBounds().y);
gc.drawLine(getBounds().x, getBounds().y, getBounds().x, getBounds().y + getBounds().height
- 1);
if (!drawSelected)
{
gc.setForeground(getDisplay().getSystemColor(SWT.COLOR_WIDGET_LIGHT_SHADOW));
gc.drawLine(getBounds().x + 1, getBounds().y + 1,
getBounds().x + getBounds().width - 2, getBounds().y + 1);
gc.drawLine(getBounds().x + 1, getBounds().y + 1, getBounds().x + 1,
getBounds().y + getBounds().height - 2);
}
if (drawSelected)
{
gc.setForeground(getDisplay().getSystemColor(SWT.COLOR_WIDGET_NORMAL_SHADOW));
}
else
{
gc.setForeground(getDisplay().getSystemColor(SWT.COLOR_WIDGET_DARK_SHADOW));
}
gc.drawLine(getBounds().x + getBounds().width - 1, getBounds().y, getBounds().x
+ getBounds().width - 1,
getBounds().y + getBounds().height - 1);
gc.drawLine(getBounds().x, getBounds().y + getBounds().height - 1, getBounds().x
+ getBounds().width - 1,
getBounds().y + getBounds().height - 1);
if (!drawSelected)
{
gc.setForeground(getDisplay().getSystemColor(SWT.COLOR_WIDGET_NORMAL_SHADOW));
gc.drawLine(getBounds().x + getBounds().width - 2, getBounds().y + 1,
getBounds().x + getBounds().width - 2, getBounds().y + getBounds().height
- 2);
gc.drawLine(getBounds().x + 1, getBounds().y + getBounds().height - 2,
getBounds().x + getBounds().width - 2, getBounds().y + getBounds().height
- 2);
}
}
else
{
gc.setForeground(getDisplay().getSystemColor(SWT.COLOR_WIDGET_DARK_SHADOW));
gc.drawLine(getBounds().x + getBounds().width - 1, getBounds().y, getBounds().x
+ getBounds().width - 1,
getBounds().y + getBounds().height - 1);
gc.drawLine(getBounds().x, getBounds().y + getBounds().height - 1, getBounds().x
+ getBounds().width - 1,
getBounds().y + getBounds().height - 1);
}
}
/**
* {@inheritDoc}
*/
public void setDisplay(Display display)
{
super.setDisplay(display);
arrowRenderer.setDisplay(display);
}
/**
* {@inheritDoc}
*/
public boolean notify(int event, Point point, Object value)
{
return false;
}
/**
* {@inheritDoc}
*/
public Rectangle getTextBounds(Object value, boolean preferred)
{
GridColumn column = (GridColumn)value;
int x = leftMargin;
if (column.getImage() != null)
{
x += column.getImage().getBounds().width + imageSpacing;
}
GC gc = new GC(column.getParent());
gc.setFont(column.getParent().getFont());
int y = getBounds().height - bottomMargin - gc.getFontMetrics().getHeight();
Rectangle bounds = new Rectangle(x,y,0,0);
Point p = gc.stringExtent(column.getText());
bounds.height = p.y;
if (preferred)
{
bounds.width = p.x;
}
else
{
int width = getBounds().width - x;
if (column.getSort() == SWT.NONE)
{
width -= rightMargin;
}
else
{
width -= arrowMargin + arrowRenderer.getSize().x + arrowMargin;
}
bounds.width = width;
}
gc.dispose();
return bounds;
}
/**
* @see org.eclipse.nebula.widgets.grid.GridHeaderRenderer#getControlBounds(java.lang.Object, boolean)
*/
protected Rectangle getControlBounds(Object value, boolean preferred) {
Rectangle bounds = getBounds();
GridColumn column = (GridColumn) value;
Point controlSize = computeControlSize(column);
int y = getBounds().y + getBounds().height - bottomMargin - controlSize.y;
return new Rectangle(bounds.x+3,y,bounds.width-6,controlSize.y);
}
private Point computeControlSize(GridColumn column) {
if( column.getHeaderControl() != null ) {
return column.getHeaderControl().computeSize(SWT.DEFAULT, SWT.DEFAULT);
}
return new Point(0,0);
}
private void getTextLayout(GC gc, GridColumn column)
{
if (textLayout == null)
{
textLayout = new TextLayout(gc.getDevice());
textLayout.setFont(gc.getFont());
column.getParent().addDisposeListener(new DisposeListener()
{
public void widgetDisposed(DisposeEvent e)
{
textLayout.dispose();
}
});
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy