/*******************************************************************************
* Copyright (c) 2008, 2012 Stepan Rutz.
* 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:
* Stepan Rutz - initial implementation
*******************************************************************************/
package org.eclipse.nebula.widgets.geomap.internal.geomapbrowser;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Composite;
/**
* An owner-drawn title label type of swt-control.
*
* @author stepan.rutz
* @version $Revision$
*/
public class TitleControl extends Canvas {
private static final int TOP_SPACE = 0;
private Font font;
private Color gradient1Color;
private Color gradient2Color;
private Color bottomLineColor;
private Color writingColor;
private Image image;
private String text = "";
private Point size = new Point(1, 1);
public TitleControl(Composite parent, Image image) {
super(parent, SWT.DOUBLE_BUFFERED);
addPaintListener(new PaintListener() {
public void paintControl(PaintEvent e) {
onPaint(e);
}
});
addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
onDispose(e);
}
});
font = new Font(getDisplay(), "Tahoma", 10, SWT.BOLD);
gradient1Color = new Color(getDisplay(), 255, 255, 255);
gradient2Color = new Color(getDisplay(), 205, 224, 244);
bottomLineColor = new Color(getDisplay(), 200, 195, 216);
writingColor = new Color(getDisplay(), 60, 60, 60);
this.image = image;
measureSize("M");
}
private void measureSize(String s) {
GC gc = new GC(this);
try {
gc.setFont(font);
size = gc.stringExtent(s);
if (image != null) {
size.y = Math.max(image.getBounds().height + 1, size.y);
} else {
size.y += 16;
}
size.y += TOP_SPACE;
} finally {
gc.dispose();
}
}
private void onDispose(DisposeEvent e) {
font.dispose();
gradient1Color.dispose();
gradient2Color.dispose();
bottomLineColor.dispose();
writingColor.dispose();
if (image != null)
image.dispose();
}
private void onPaint(PaintEvent e) {
GC gc = e.gc;
Point s = getSize();
int w = s.x;
int h = s.y;
gc.setForeground(gradient1Color);
gc.setBackground(gradient2Color);
gc.fillGradientRectangle(0, 0, w, h - 1, true);
Rectangle imgsize = new Rectangle(0, 0, 0, 0);
if (image != null) {
imgsize = image.getBounds();
gc.drawImage(image, 12, 0);
}
gc.setForeground(bottomLineColor);
gc.drawLine(0, h - 1, w, h - 1);
gc.setFont(font);
gc.setForeground(writingColor);
Point textSize = gc.stringExtent(text);
int ty = (h - textSize.y) / 2;
gc.drawString(text, 22 + imgsize.width, TOP_SPACE + ty, true);
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
measureSize(text);
redraw();
}
@Override
public Point computeSize(int wHint, int hHint, boolean changed) {
return new Point(size.x, size.y);
}
}