/*******************************************************************************
* 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.nebula.widgets.geomap.GeoMap;
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.Point;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Composite;
/**
* A simple custom-drawn swt control that renders a header (eg some
* type of prominent label.
*
* <p>This file is part of the showcase for the {@link GeoMap} but does
* not include any core functionality that is typically embedded. Users who
* only want to embed the swt-map as a widget don't typically use this class.
* </p>
*
* @author stepan.rutz
* @version $Revision$
*/
public class HeaderControl extends Canvas {
private static final int TOP_SPACE = 6;
private Font font;
private Color foreground;
private String text = "";
private Point size = new Point(1, 1);
public HeaderControl(Composite parent) {
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);
foreground = new Color(getDisplay(), 87, 166, 212);
measureString("M");
}
private void measureString(String s) {
GC gc = new GC(this);
try {
gc.setFont(font);
size = gc.stringExtent(s);
size.y += TOP_SPACE;
} finally {
gc.dispose();
}
}
private void onDispose(DisposeEvent e) {
font.dispose();
foreground.dispose();
}
private void onPaint(PaintEvent e) {
GC gc = e.gc;
gc.setFont(font);
gc.setForeground(foreground);
gc.drawString(text, 0, TOP_SPACE, true);
Point size = getSize();
int w = size.x;
int h = size.y;
gc.drawLine(0, h - 1, w, h - 1);
}
public String getText() {
return text;
}
/**
* Sets the texts and recomputes the size of the receiver. Finally a
* redraw is scheduled.
* @param text
*/
public void setText(String text) {
this.text = text;
measureString(text);
redraw();
}
@Override
public Point computeSize(int wHint, int hHint, boolean changed) {
return new Point(size.x, size.y);
}
}