/*******************************************************************************
* Copyright (c) 2008-2009 SWTChart project. All rights reserved.
*
* This code is distributed under the terms of the Eclipse Public License v1.0
* which is available at http://www.eclipse.org/legal/epl-v10.html
*******************************************************************************/
package org.swtchart.internal;
import org.eclipse.swt.SWT;
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.Transform;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Display;
import org.swtchart.Chart;
import org.swtchart.Constants;
import org.swtchart.ITitle;
/**
* A base class for title.
*/
public class Title extends Canvas implements ITitle, PaintListener
{
/** the chart */
protected Chart chart;
/** the title text */
protected String text;
/** the visibility state of axis */
protected boolean isVisible;
/** the default font */
private Font defaultFont;
/** the default font size */
private static final int DEFAULT_FONT_SIZE = Constants.LARGE_FONT_SIZE;
/** the default color */
private static final int DEFAULT_FOREGROUND = SWT.COLOR_BLUE;
/** the default text */
private static final String DEFAULT_TEXT = "";
/**
* Constructor.
*
* @param parent
* the parent composite
* @param style
* the style
*/
public Title ( Chart parent, int style )
{
super ( parent, style );
this.chart = parent;
text = getDefaultText ();
isVisible = true;
defaultFont = new Font ( Display.getDefault (), "Tahoma", DEFAULT_FONT_SIZE, SWT.BOLD );
setFont ( defaultFont );
setForeground ( Display.getDefault ().getSystemColor ( DEFAULT_FOREGROUND ) );
addPaintListener ( this );
}
/*
* @see ITitle#setText(String)
*/
public void setText ( String text )
{
if ( text == null )
{
this.text = getDefaultText ();
}
else
{
this.text = text;
}
chart.updateLayout (); // text could be changed to blank
}
/**
* Gets the default title text.
*
* @return the default title text
*/
protected String getDefaultText ()
{
return DEFAULT_TEXT;
}
/*
* @see ITitle#getText()
*/
public String getText ()
{
return text;
}
/*
* @see Canvas#setFont(Font)
*/
@Override
public void setFont ( Font font )
{
if ( font == null )
{
super.setFont ( defaultFont );
}
else
{
super.setFont ( font );
}
chart.updateLayout ();
}
/*
* @see Control#setForeground(Color)
*/
@Override
public void setForeground ( Color color )
{
if ( color == null )
{
super.setForeground ( Display.getDefault ().getSystemColor ( DEFAULT_FOREGROUND ) );
}
else
{
super.setForeground ( color );
}
}
/*
* @see Control#setVisible(boolean)
*/
@Override
public void setVisible ( boolean isVisible )
{
if ( this.isVisible == isVisible )
{
return;
}
this.isVisible = isVisible;
chart.updateLayout ();
}
/*
* @see Control#isVisible()
*/
@Override
public boolean isVisible ()
{
return isVisible;
}
/**
* Gets the state indicating if showing title horizontally.
*
* @return the state indicating if showing title horizontally
*/
protected boolean isHorizontal ()
{
return true;
}
/**
* Updates the title layout data.
*/
public void updateLayoutData ()
{
int height;
int width;
if ( isVisible () && !text.trim ().equals ( "" ) )
{
Point p = Util.getExtentInGC ( getFont (), text );
width = p.x;
height = p.y;
}
else
{
width = 0;
height = 0;
}
if ( isHorizontal () )
{
setLayoutData ( new ChartLayoutData ( width, height ) );
}
else
{
setLayoutData ( new ChartLayoutData ( height, width ) );
}
}
/*
* @see Widget#dispose()
*/
@Override
public void dispose ()
{
super.dispose ();
if ( !defaultFont.isDisposed () )
{
defaultFont.dispose ();
}
}
/*
* @see PaintListener#paintControl(PaintEvent)
*/
public void paintControl ( PaintEvent e )
{
if ( text == null || text.equals ( "" ) || !isVisible )
{
return;
}
int width = getSize ().x;
int height = getSize ().y;
GC gc = e.gc;
gc.setForeground ( getForeground () );
gc.setFont ( getFont () );
if ( isHorizontal () )
{
int textWidth = gc.textExtent ( text ).x;
int x = (int) ( width / 2.0 - textWidth / 2.0 );
if ( x < 0 )
{
// this happens when window size is too small
x = 0;
}
gc.drawString ( text, x, 0, true );
}
else
{
// create image to draw text
int textWidth = gc.textExtent ( text ).x;
int textHeight = gc.textExtent ( text ).y;
Image image = new Image ( Display.getCurrent (), textWidth, textHeight );
GC tmpGc = new GC ( image );
tmpGc.setForeground ( getForeground () );
tmpGc.setBackground ( getBackground () );
tmpGc.setFont ( getFont () );
tmpGc.drawText ( text, 0, 0 );
// set transform to rotate
Transform transform = new Transform ( gc.getDevice () );
transform.translate ( 0, textWidth );
transform.rotate ( 270 );
gc.setTransform ( transform );
// draw the image on the rotated graphics context
int y = (int) ( height / 2d - textWidth / 2d );
if ( y < 0 )
{
y = 0;
}
gc.drawImage ( image, -y, 0 );
// dispose resources
tmpGc.dispose ();
transform.dispose ();
image.dispose ();
}
}
}