/*
* uDig - User Friendly Desktop Internet GIS client http://udig.refractions.net (C) 2004,
* Refractions Research Inc. This library is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by the Free Software
* Foundation; version 2.1 of the License. This library is distributed in the hope that it will be
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
*/
package org.geotools.swt.styling.simple;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.FontDialog;
import org.eclipse.swt.widgets.Shell;
import org.geotools.swt.utils.Messages;
/**
* <p>
* A "button" with an icon/text that pops up the font window.
* </p>
*
* @author aalam
* @since 0.6.0
*
*
* @source $URL: http://svn.osgeo.org/geotools/trunk/modules/unsupported/swt/src/main/java/org/geotools/swt/styling/simple/FontEditor.java $
*/
public class FontEditor {
private Image fImage = null;
private RGB fColorValue;
private Color fColor[] = null;
private Font fFont[] = null;
private FontData[] fFontList = null;
private Button fButton;
private SelectionListener parentListener;
final FontDialog labelFontDialog;
public FontEditor( Composite parent ) {
this(parent, null);
}
public FontEditor( Composite parent, SelectionListener parentListener ) {
this.parentListener = parentListener;
fButton = new Button(parent, SWT.PUSH);
// fExtent= computeImageSize(parent);
// fImage= new Image(parent.getDisplay(), fExtent.x, fExtent.y);
// fImage = new Image(parent.getDisplay(), "elcl16/up_co.gif"); //$NON-NLS-1$
//
// GC gc= new GC(fImage);
// gc.setBackground(fButton.getBackground());
// gc.fillRectangle(0, 0, fExtent.x, fExtent.y);
// gc.dispose();
fFont = new Font[1];
fColor = new Color[1];
fButton.setText(Messages.getString("FontEditor_SetFont"));
labelFontDialog = new FontDialog(new Shell());
labelFontDialog.setText("Choose a Font"); //$NON-NLS-1$
fButton.setImage(fImage);
fButton.addSelectionListener(new SelectionAdapter(){
public void widgetSelected( SelectionEvent event ) {
labelFontDialog.setRGB(fColorValue);
labelFontDialog.setFontList(fFontList);
if (labelFontDialog.open() == null)
return;
if (fFont[0] != null)
fFont[0].dispose();
FontData[] list = labelFontDialog.getFontList();
if (list != null) {
fFont[0] = new Font(fButton.getDisplay(), list);
// set the text font here...
fFontList = list;
}
RGB rgb = labelFontDialog.getRGB();
if (rgb != null) {
if (fColor[0] != null)
fColor[0].dispose();
fColor[0] = new Color(fButton.getDisplay(), rgb);
// set the text foreground color here...
fColorValue = rgb;
updateColorImage();
}
notifyParent(event);
}
});
fButton.addDisposeListener(new DisposeListener(){
public void widgetDisposed( DisposeEvent event ) {
if (fImage != null) {
fImage.dispose();
fImage = null;
}
if (fColor != null) {
if (fColor[0] != null)
fColor[0].dispose();
fColor = null;
}
if (fFont != null) {
if (fFont[0] != null)
fFont[0].dispose();
fFont = null;
}
}
});
}
public void setListener( SelectionListener parentListener ) {
this.parentListener = parentListener;
}
public void clearListener() {
this.parentListener = null;
}
private void notifyParent( SelectionEvent event ) {
if (parentListener != null)
parentListener.widgetSelected(event);
}
public Color getColor() {
return fColor[0];
}
public java.awt.Color getAWTColor() {
Color tmpColor = getColor();
if (tmpColor == null)
return null;
return new java.awt.Color(tmpColor.getRed(), tmpColor.getGreen(), tmpColor.getBlue());
}
/**
* Returns the currently selected font object
*
* @return Font
*/
public Font getFont() {
return fFont[0];
}
public FontData[] getFontList() {
return fFontList;
}
public void setFontList( FontData[] list ) {
if (list != null) {
fFontList = list;
fFont[0] = new Font(fButton.getDisplay(), list);
labelFontDialog.setFontList(list);
}
}
public RGB getColorValue() {
return fColorValue;
}
public void setColorValue( RGB rgb ) {
fColorValue = rgb;
fColor[0] = new Color(fButton.getDisplay(), rgb);
labelFontDialog.setRGB(rgb);
updateColorImage();
}
public void setColorValue( java.awt.Color colour ) {
if (colour != null) {
setColorValue(new RGB(colour.getRed(), colour.getGreen(), colour.getBlue()));
}
}
public Button getButton() {
return fButton;
}
private void updateColorImage() {
/*
* Display display= fButton.getDisplay(); GC gc= new GC(fImage);
* gc.setForeground(display.getSystemColor(SWT.COLOR_BLACK)); gc.drawRectangle(0, 2,
* fExtent.x - 1, fExtent.y - 4); if (fColor != null) fColor.dispose(); fColor= new
* Color(display, fColorValue); gc.setBackground(fColor); gc.fillRectangle(1, 3, fExtent.x -
* 2, fExtent.y - 5); gc.dispose(); fButton.setImage(fImage);
*/
}
public void setEnabled( boolean enabled ) {
fButton.setEnabled(enabled);
}
}