/*!
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* This program 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.
*
* Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved.
*/
package org.pentaho.reporting.designer.core.editor.structuretree;
import java.awt.Component;
import java.awt.Image;
import java.beans.BeanInfo;
import java.util.Locale;
import javax.swing.ImageIcon;
import javax.swing.JTree;
import javax.swing.tree.DefaultTreeCellRenderer;
import org.pentaho.reporting.designer.core.Messages;
import org.pentaho.reporting.designer.core.settings.WorkspaceSettings;
import org.pentaho.reporting.designer.core.util.IconLoader;
import org.pentaho.reporting.engine.classic.core.AttributeNames;
import org.pentaho.reporting.engine.classic.core.CompoundDataFactory;
import org.pentaho.reporting.engine.classic.core.DataFactory;
import org.pentaho.reporting.engine.classic.core.Element;
import org.pentaho.reporting.engine.classic.core.MetaAttributeNames;
import org.pentaho.reporting.engine.classic.core.ParameterMapping;
import org.pentaho.reporting.engine.classic.core.ReportEnvironmentDataRow;
import org.pentaho.reporting.engine.classic.core.function.Expression;
import org.pentaho.reporting.engine.classic.core.metadata.DataFactoryMetaData;
import org.pentaho.reporting.engine.classic.core.metadata.DataFactoryRegistry;
import org.pentaho.reporting.engine.classic.core.metadata.ElementMetaData;
import org.pentaho.reporting.engine.classic.core.metadata.ExpressionMetaData;
import org.pentaho.reporting.engine.classic.core.metadata.ExpressionRegistry;
import org.pentaho.reporting.engine.classic.core.parameters.ParameterDefinitionEntry;
import org.pentaho.reporting.engine.classic.core.wizard.ContextAwareDataSchemaModel;
import org.pentaho.reporting.engine.classic.core.wizard.DataAttributes;
import org.pentaho.reporting.libraries.base.util.ObjectUtilities;
import org.pentaho.reporting.libraries.base.util.StringUtils;
/**
* Todo: Document me!
*
* @author Thomas Morgner
*/
public class StructureTreeCellRenderer extends DefaultTreeCellRenderer
{
public StructureTreeCellRenderer()
{
}
private String formatElement(final Element element)
{
final ElementMetaData data = element.getMetaData();
final String displayName = data.getDisplayName(Locale.getDefault());
if (WorkspaceSettings.getInstance().isElementsDisplayNames())
{
final String name = element.getName();
if (StringUtils.isEmpty(name))
{
return (displayName);
}
else
{
return Messages.getString("StructureTreeCellRenderer.NamedElementMessage", displayName, name);
}
}
else // values ..
{
final Object field = element.getAttribute(AttributeNames.Core.NAMESPACE, AttributeNames.Core.FIELD);
if (field != null)
{
return Messages.getString("StructureTreeCellRenderer.NamedElementMessage", displayName, field);
}
final Object value = element.getAttribute(AttributeNames.Core.NAMESPACE, AttributeNames.Core.VALUE);
if (value != null)
{
return Messages.getString("StructureTreeCellRenderer.NamedElementMessage", displayName, value);
}
final Object translationKey =
element.getAttribute(AttributeNames.Core.NAMESPACE, AttributeNames.Core.RESOURCE_IDENTIFIER);
if (translationKey != null)
{
return Messages.getString("StructureTreeCellRenderer.NamedElementMessage", displayName, translationKey);
}
final Object fields = element.getAttribute(AttributeNames.Core.NAMESPACE, AttributeNames.Core.GROUP_FIELDS);
if (fields instanceof String[])
{
final String[] fieldsArray = (String[]) fields;
final StringBuilder b = new StringBuilder();
for (int i = 0; i < fieldsArray.length; i++)
{
final String f = fieldsArray[i];
if (i != 0)
{
b.append(", ");
}
b.append(f);
}
return Messages.getString("StructureTreeCellRenderer.NamedElementMessage", displayName, b.toString());
}
return displayName;
}
}
/**
* Configures the renderer based on the passed in components. The value is set
* from messaging the tree with <code>convertValueToText</code>, which
* ultimately invokes <code>toString</code> on <code>value</code>. The
* foreground color is set based on the selection and the icon is set based on
* on leaf and expanded.
*/
public Component getTreeCellRendererComponent(final JTree tree,
final Object value,
final boolean sel,
final boolean expanded,
final boolean leaf,
final int row,
final boolean hasFocus)
{
super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus);
setToolTipText(null);
if (value instanceof Element)
{
final Element vr = (Element) value;
final ElementMetaData data = vr.getMetaData();
setText(formatElement(vr));
final Image icon = data.getIcon(Locale.getDefault(), BeanInfo.ICON_COLOR_32x32);
if (icon != null)
{
setIcon(new ImageIcon(icon));
}
setToolTipText(data.getDescription(Locale.getDefault()));
}
else if (value instanceof CompoundDataFactory)
{
setText(Messages.getString("StructureTreeCellRenderer.DataSets"));
setIcon(IconLoader.getInstance().getDataSetsIcon());
}
else if (value instanceof ReportEnvironmentDataRow)
{
setText(Messages.getString("StructureTreeCellRenderer.Environment"));
setIcon(IconLoader.getInstance().getPropertiesDataSetIcon());
}
else if (value instanceof ReportFunctionNode)
{
setText(Messages.getString("StructureTreeCellRenderer.Functions"));
setIcon(IconLoader.getInstance().getFunctionsIcon());
}
else if (value instanceof ReportParametersNode || value instanceof SubReportParametersNode)
{
setText(Messages.getString("StructureTreeCellRenderer.Parameters"));
setIcon(IconLoader.getInstance().getParameterIcon());
}
else if (value instanceof SubReportParametersNode.ExportParametersNode)
{
setText(Messages.getString("StructureTreeCellRenderer.ExportParameters"));
setIcon(IconLoader.getInstance().getParameterIcon());
}
else if (value instanceof SubReportParametersNode.ImportParametersNode)
{
setText(Messages.getString("StructureTreeCellRenderer.ImportParameters"));
setIcon(IconLoader.getInstance().getParameterIcon());
}
else if (value instanceof ParameterMapping)
{
final ParameterMapping mapping = (ParameterMapping) value;
setText(Messages.getString("StructureTreeCellRenderer.ParameterMappingMessage", mapping.getAlias(), mapping.getName()));
setIcon(IconLoader.getInstance().getParameterIcon());
}
else if (value instanceof ReportFieldNode)
{
final ReportFieldNode fieldNode = (ReportFieldNode) value;
final ContextAwareDataSchemaModel model = fieldNode.getDataSchemaModel();
final DataAttributes attributes = model.getDataSchema().getAttributes(fieldNode.getFieldName());
setToolTipText(fieldNode.getFieldClass().getSimpleName());
if (attributes == null)
{
setText(fieldNode.toString());
}
else
{
final String displayName = (String) attributes.getMetaAttribute
(MetaAttributeNames.Formatting.NAMESPACE, MetaAttributeNames.Formatting.LABEL,
String.class, model.getDataAttributeContext());
setText(formatFieldType(displayName, fieldNode.getFieldName(), fieldNode.getFieldClass()));
}
}
else if (value instanceof ReportQueryNode)
{
final ReportQueryNode queryNode = (ReportQueryNode) value;
setText(queryNode.getQueryName());
setToolTipText(queryNode.getDataFactory().getClass().getSimpleName());
}
else if (value instanceof Expression)
{
final Expression expression = (Expression) value;
if (ExpressionRegistry.getInstance().isExpressionRegistered(expression.getClass().getName()) == false)
{
setText(expression.getClass().getName());
}
else
{
final ExpressionMetaData expressionMetaData =
ExpressionRegistry.getInstance().getExpressionMetaData(expression.getClass().getName());
if (expression.getName() == null)
{
setText(expressionMetaData.getDisplayName(Locale.getDefault()));
}
else
{
setText(Messages.getString("StructureTreeCellRenderer.NamedExpressionMessage",
expressionMetaData.getDisplayName(Locale.getDefault()), expression.getName()));
}
}
}
else if (value instanceof ParameterDefinitionEntry)
{
final ParameterDefinitionEntry params = (ParameterDefinitionEntry) value;
setText(params.getName());
}
else if (value instanceof DataFactory)
{
final DataFactory dfac = (DataFactory) value;
final DataFactoryMetaData data = dfac.getMetaData();
final Image image = data.getIcon(Locale.getDefault(), BeanInfo.ICON_COLOR_32x32);
if (image != null)
{
setIcon(new ImageIcon(image));
}
final String connectionName = data.getDisplayConnectionName(dfac);
if (connectionName != null)
{
setText(Messages.getString("StructureTreeCellRenderer.NamedDataFactoryMessage",
data.getDisplayName(Locale.getDefault()), connectionName));
}
else
{
setText(data.getDisplayName(Locale.getDefault()));
}
}
else if (value instanceof ParentDataFactoryNode)
{
setText(Messages.getString("StructureTreeCellRenderer.InheritedDataFactories"));
}
else if (value instanceof InheritedDataFactoryWrapper)
{
final InheritedDataFactoryWrapper wrapper = (InheritedDataFactoryWrapper) value;
final DataFactory dfac = wrapper.getDataFactory();
if (DataFactoryRegistry.getInstance().isRegistered(dfac.getClass().getName()) == false)
{
setText(dfac.getClass().getSimpleName());
}
else
{
final DataFactoryMetaData data = dfac.getMetaData();
final Image image = data.getIcon(Locale.getDefault(), BeanInfo.ICON_COLOR_32x32);
if (image != null)
{
setIcon(new ImageIcon(image));
}
final String connectionName = data.getDisplayConnectionName(dfac);
if (connectionName != null)
{
setText(Messages.getString("StructureTreeCellRenderer.NamedDataFactoryMessage",
data.getDisplayName(Locale.getDefault()), connectionName));
}
else
{
setText(data.getDisplayName(Locale.getDefault()));
}
}
}
return this;
}
private String formatFieldType(final String displayName,
final String fieldName,
final Class fieldClass)
{
if (displayName == null || ObjectUtilities.equal(displayName, fieldName))
{
if (fieldClass == null)
{
return fieldName;
}
return Messages.getString("StructureTreeCellRenderer.TypedElementMessage", fieldName, fieldClass.getSimpleName());
}
if (fieldClass == null)
{
return Messages.getString("StructureTreeCellRenderer.TypedElementMessage", displayName, fieldName);
}
return Messages.getString("StructureTreeCellRenderer.TypedElementMessage",
displayName, fieldName, fieldClass.getSimpleName());
}
}