/******************************************************************************* * Copyright (c) 2008-2011 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 final 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 = DEFAULT_TEXT; 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(); } } }