package pt.ist.renderers; import pt.ist.renderers.components.HtmlComponent; import pt.ist.renderers.components.HtmlText; import pt.ist.renderers.layouts.Layout; import pt.ist.renderers.utils.RenderUtils; /** * This renderer allows you to handle cases were you don't have an enum value to * differentiate between object types and you want to present the type of the * object. *
* For example, suppose you have the objects Graphic
,
* Rectangle
, Square
, and Circle
.
* Rectangle and Circle are subclasses of Graphic and Square is a subclass of
* Rectangle. If you want to present the type of each object then you have to
* make a choice based on each object's type (assuming they don't have a
* suitable method to return that text).
*
* In this cases, this renderer can be used to present each object's class and
* create a label from it. The default label format is
* label.<class name>
*
* @author cfgi
*/
public class ClassAsLabelRenderer extends OutputRenderer {
private String bundle;
private String labelFormat;
private boolean escape = true;
public String getBundle() {
return this.bundle;
}
/**
* The bundle were to look for the label.
*
* @property
*/
public void setBundle(String bundle) {
this.bundle = bundle;
}
public String getLabelFormat() {
return this.labelFormat;
}
/**
* The format of the label. This property allows you to alter the default
* format of the label. You can use a format like the one supported by
* {@link pt.ist.renderers.FormatRenderer} and it will be
* applied to the class object.
*
* For example a format of
* "label.${superclass.simpleName}.${simpleName}"
would produce
* the label "label.Rectangle.Square"
when applied to the class
* of a Square
object.
*
* @property
*/
public void setLabelFormat(String labelFormat) {
this.labelFormat = labelFormat;
}
@Override
protected Layout getLayout(Object object, Class type) {
return new Layout() {
@Override
public HtmlComponent createComponent(Object object, Class type) {
if (type == null) {
return new HtmlText();
}
String labelName = getLabelName((Class>) object);
final String label = RenderUtils.getResourceString(getBundle(), labelName);
return new HtmlText(label, isEscape());
}
protected String getLabelName(Class targetClass) {
if (getLabelFormat() == null) {
return "label." + targetClass.getName();
} else {
return RenderUtils.getFormattedProperties(getLabelFormat(), targetClass);
}
}
protected String getLabelName(final String className) {
return getLabelFormat() == null ? "label." + className : getFormattedProperties(className);
}
protected String getFormattedProperties(final Object object) {
return RenderUtils.getFormattedProperties(getLabelFormat(), object);
}
};
}
public boolean isEscape() {
return escape;
}
public void setEscape(boolean escape) {
this.escape = escape;
}
}