blob: 1c3d36fd789f9299204cafea455a232bc27c7110 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2010 IBM Corporation and others.
* 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.draw2d;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Insets;
/**
* Provides support for a border with a label describing the contents of which
* it is surrounding.
*/
public abstract class AbstractLabeledBorder extends AbstractBorder implements
LabeledBorder {
private Dimension textExtents;
private String label;
private Insets insets;
private Color textColor = ColorConstants.black;
private Font font;
/**
* Constructs a default AbstractLabeledBorder with the name of this class
* set as its label.
*
* @since 2.0
*/
public AbstractLabeledBorder() {
String className = getClass().getName();
setLabel(className.substring(className.lastIndexOf('.') + 1,
className.length()));
}
/**
* Constructs a border with the label set to the String passed in as input.
*
* @param s
* Label to be set on the border
* @since 2.0
*/
public AbstractLabeledBorder(String s) {
setLabel(s);
}
/**
* Calculates insets based on the current font and other attributes. This
* value will be cached until {@link #invalidate()} is called.
*
* @param figure
* The figure to which the border is being applied
* @return The Insets
*/
protected abstract Insets calculateInsets(IFigure figure);
/**
* Returns the font that this border will use. If no Font has been
* specified, the font associated with the input Figure will be used.
*
* @param f
* Figure used to get a default font
* @return The font for this border
*/
protected Font getFont(IFigure f) {
if (font == null)
return f.getFont();
return font;
}
/**
* Returns the insets, or space associated for this border. Returns any
* previously set value if present, else calculates it from the Figure
* provided in as input.
*
* @param fig
* Figure used to calculate insets
* @return The insets
*/
public Insets getInsets(IFigure fig) {
if (insets == null)
insets = calculateInsets(fig);
return insets;
}
/**
* @see org.eclipse.draw2d.LabeledBorder#getLabel()
*/
public String getLabel() {
return label;
}
/**
* @see org.eclipse.draw2d.Border#getPreferredSize(IFigure)
*/
public Dimension getPreferredSize(IFigure fig) {
return new Dimension(getTextExtents(fig));
}
/**
* Returns the text Color of this AbstractLabeledBorder's label.
*
* @return The text color
* @since 2.0
*/
public Color getTextColor() {
return textColor;
}
/**
* Calculates and returns the size required by this border's label.
*
* @param f
* IFigure on which the calculations are to be made
* @return Dimensions required by the text of this border's label
* @since 2.0
*/
protected Dimension getTextExtents(IFigure f) {
if (textExtents == null)
textExtents = FigureUtilities.getTextExtents(label, getFont(f));
return textExtents;
}
/**
* Resets the internal values and state so that they can be recalculated.
* Called whenever a state change has occurred that effects the insets or
* text extents of this border.
*/
protected void invalidate() {
insets = null;
textExtents = null;
}
/**
* Sets the Font of this border to the input value, and invalidates the
* border forcing an update of internal parameters of insets and text
* extents.
*
* @param font
* The font
*/
public void setFont(Font font) {
this.font = font;
invalidate();
}
/**
* @see org.eclipse.draw2d.LabeledBorder#setLabel(String)
*/
public void setLabel(String s) {
label = ((s == null) ? "" : s); //$NON-NLS-1$
invalidate();
}
/**
* Sets the color for this border's text.
*
* @param color
* Color to be set for this border's text
* @since 2.0
*/
public void setTextColor(Color color) {
textColor = color;
}
}