/*
* 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) 2006 - 2013 Pentaho Corporation.. All rights reserved.
*/
package org.pentaho.reporting.engine.classic.core.modules.output.table.html.helper;
import java.awt.Color;
import org.pentaho.reporting.engine.classic.core.AttributeNames;
import org.pentaho.reporting.engine.classic.core.ElementAlignment;
import org.pentaho.reporting.engine.classic.core.ReportAttributeMap;
import org.pentaho.reporting.engine.classic.core.layout.model.BorderEdge;
import org.pentaho.reporting.engine.classic.core.modules.output.table.base.CellBackground;
import org.pentaho.reporting.engine.classic.core.modules.output.table.base.SlimSheetLayout;
import org.pentaho.reporting.engine.classic.core.modules.output.table.html.HtmlPrinter;
import org.pentaho.reporting.engine.classic.core.modules.output.table.html.HtmlRowBackgroundStruct;
import org.pentaho.reporting.engine.classic.core.modules.output.table.html.HtmlTableModule;
import org.pentaho.reporting.engine.classic.core.modules.output.table.html.util.HtmlColors;
import org.pentaho.reporting.engine.classic.core.style.ElementStyleKeys;
import org.pentaho.reporting.engine.classic.core.style.StyleSheet;
import org.pentaho.reporting.engine.classic.core.util.geom.StrictGeomUtility;
import org.pentaho.reporting.libraries.base.config.Configuration;
import org.pentaho.reporting.libraries.xmlns.common.AttributeList;
@SuppressWarnings( "HardCodedStringLiteral" )
public class HtmlTagHelper {
public static final String XHTML_NAMESPACE = "http://www.w3.org/1999/xhtml";
private Configuration configuration;
private StyleBuilderFactory styleBuilderFactory;
private StyleBuilder styleBuilder;
private StyleManager styleManager;
public HtmlTagHelper( final Configuration configuration, final StyleBuilderFactory styleBuilderFactory ) {
this.configuration = configuration;
this.styleBuilderFactory = styleBuilderFactory;
this.styleBuilder = new DefaultStyleBuilder( styleBuilderFactory );
}
public StyleBuilder getStyleBuilder() {
return styleBuilder;
}
public StyleBuilderFactory getStyleBuilderFactory() {
return styleBuilderFactory;
}
public StyleManager getStyleManager() {
return styleManager;
}
public void setStyleManager( final StyleManager styleManager ) {
this.styleManager = styleManager;
}
public Configuration getConfiguration() {
return configuration;
}
public AttributeList createCellAttributes( final int colSpan, final int rowSpan,
final ReportAttributeMap<Object> content, final StyleSheet styleSheet, final CellBackground background,
final StyleBuilder styleBuilder ) {
final AttributeList attrList = new AttributeList();
if ( content != null ) {
// ignore for now ..
if ( rowSpan > 1 ) {
attrList.setAttribute( HtmlPrinter.XHTML_NAMESPACE, "rowspan", String.valueOf( rowSpan ) );
}
if ( colSpan > 1 ) {
attrList.setAttribute( HtmlPrinter.XHTML_NAMESPACE, "colspan", String.valueOf( colSpan ) );
}
final ElementAlignment verticalAlignment =
(ElementAlignment) styleSheet.getStyleProperty( ElementStyleKeys.VALIGNMENT );
attrList.setAttribute( HtmlPrinter.XHTML_NAMESPACE, "valign", translateVerticalAlignment( verticalAlignment ) );
}
if ( background != null && content != null ) {
final ReportAttributeMap<Object> attrs = new ReportAttributeMap<Object>( background.getAttributes() );
attrs.putAll( content );
applyHtmlAttributes( attrs, attrList );
} else if ( background != null ) {
final ReportAttributeMap attrs = background.getAttributes();
applyHtmlAttributes( attrs, attrList );
} else if ( content != null ) {
applyHtmlAttributes( content, attrList );
}
styleManager.updateStyle( styleBuilder, attrList );
return attrList;
}
/**
* Translates the JFreeReport horizontal element alignment into a HTML alignment constant.
*
* @param ea
* the element alignment
* @return the translated alignment name.
*/
private String translateVerticalAlignment( final ElementAlignment ea ) {
if ( ElementAlignment.BOTTOM.equals( ea ) ) {
return "bottom";
}
if ( ElementAlignment.MIDDLE.equals( ea ) ) {
return "middle";
}
return "top";
}
public AttributeList createRowAttributes( final double rowHeight, final HtmlRowBackgroundStruct struct ) {
final AttributeList attrList = new AttributeList();
StyleBuilder styleBuilder = getStyleBuilder();
StyleBuilderFactory styleBuilderFactory = getStyleBuilderFactory();
if ( isTableRowBorderDefinition() ) {
styleBuilder.clear();
if ( struct.isFailed() == false ) {
final Color commonBackgroundColor = struct.getColor();
final BorderEdge top = struct.getTopEdge();
final BorderEdge bottom = struct.getBottomEdge();
if ( commonBackgroundColor != null ) {
styleBuilder.append( DefaultStyleBuilder.CSSKeys.BACKGROUND_COLOR, HtmlColors
.getColorString( commonBackgroundColor ) );
}
if ( BorderEdge.EMPTY.equals( top ) == false ) {
styleBuilder.appendRaw( DefaultStyleBuilder.CSSKeys.BORDER_TOP, styleBuilder.printEdgeAsCSS( top ) );
}
if ( BorderEdge.EMPTY.equals( bottom ) == false ) {
styleBuilder.appendRaw( DefaultStyleBuilder.CSSKeys.BORDER_BOTTOM, styleBuilder.printEdgeAsCSS( bottom ) );
}
}
styleBuilder.append( DefaultStyleBuilder.CSSKeys.HEIGHT, styleBuilder.getPointConverter().format(
styleBuilderFactory.fixLengthForSafari( rowHeight ) ), "pt" );
styleManager.updateStyle( styleBuilder, attrList );
} else {
// equally expensive and makes text more readable (helps with debugging)
attrList.setAttribute( HtmlPrinter.XHTML_NAMESPACE, "style", "height: "
+ styleBuilder.getPointConverter().format( styleBuilderFactory.fixLengthForSafari( rowHeight ) ) + "pt" );
}
return attrList;
}
public AttributeList createSheetNameAttributes() {
final AttributeList tableAttrList = new AttributeList();
final String additionalStyleClass =
getConfiguration().getConfigProperty(
"org.pentaho.reporting.engine.classic.core.modules.output.table.html.SheetNameClass" );
if ( additionalStyleClass != null ) {
tableAttrList.setAttribute( HtmlPrinter.XHTML_NAMESPACE, "class", additionalStyleClass );
}
return tableAttrList;
}
protected boolean isProportionalColumnWidths() {
return "true".equals( getConfiguration().getConfigProperty( HtmlTableModule.PROPORTIONAL_COLUMN_WIDTHS, "false" ) );
}
public boolean isEmptyCellsUseCSS() {
return "true".equals( getConfiguration().getConfigProperty( HtmlTableModule.EMPTY_CELLS_USE_CSS, "false" ) );
}
public AttributeList createTableAttributes( final SlimSheetLayout sheetLayout, final ReportAttributeMap attr ) {
StyleBuilder styleBuilder = getStyleBuilder();
final int noc = sheetLayout.getColumnCount();
styleBuilder.clear();
if ( ( noc > 0 ) && ( isProportionalColumnWidths() == false ) ) {
final int width = (int) StrictGeomUtility.toExternalValue( sheetLayout.getCellWidth( 0, noc ) );
styleBuilder.append( DefaultStyleBuilder.CSSKeys.WIDTH, width + "pt" );
} else {
// Consume the complete width for proportional column widths
styleBuilder.append( DefaultStyleBuilder.CSSKeys.WIDTH, "100%" );
}
// style += "table-layout: fixed;";
if ( isTableRowBorderDefinition() ) {
styleBuilder.append( DefaultStyleBuilder.CSSKeys.BORDER_COLLAPSE, "collapse" );
}
if ( isEmptyCellsUseCSS() ) {
styleBuilder.append( DefaultStyleBuilder.CSSKeys.EMPTY_CELLS, "show" );
}
if ( isUseTableLayoutFixed() ) {
styleBuilder.append( DefaultStyleBuilder.CSSKeys.TABLE_LAYOUT, "fixed" );
}
final String additionalStyleClass =
getConfiguration().getConfigProperty(
"org.pentaho.reporting.engine.classic.core.modules.output.table.html.StyleClass" );
final AttributeList tableAttrList = new AttributeList();
if ( additionalStyleClass != null ) {
tableAttrList.setAttribute( HtmlPrinter.XHTML_NAMESPACE, "class", additionalStyleClass );
}
tableAttrList.setAttribute( HtmlPrinter.XHTML_NAMESPACE, "cellspacing", "0" );
tableAttrList.setAttribute( HtmlPrinter.XHTML_NAMESPACE, "cellpadding", "0" );
applyHtmlAttributes( attr, tableAttrList );
styleManager.updateStyle( styleBuilder, tableAttrList );
return tableAttrList;
}
public static void applyHtmlAttributes( final ReportAttributeMap attributes, final AttributeList attrList ) {
if ( attributes == null ) {
throw new NullPointerException( "Attributes must not be null" );
}
if ( attrList == null ) {
throw new NullPointerException();
}
final Object name = attributes.getAttribute( AttributeNames.Html.NAMESPACE, AttributeNames.Html.NAME );
if ( name != null ) {
attrList.setAttribute( XHTML_NAMESPACE, "name", String.valueOf( name ) );
}
final Object id = attributes.getAttribute( AttributeNames.Html.NAMESPACE, AttributeNames.Html.XML_ID );
if ( id != null ) {
attrList.setAttribute( XHTML_NAMESPACE, "id", String.valueOf( id ) );
}
final Object styleClass = attributes.getAttribute( AttributeNames.Html.NAMESPACE, AttributeNames.Html.STYLE_CLASS );
if ( styleClass != null ) {
final String styleClassAttr = attrList.getAttribute( XHTML_NAMESPACE, "class" );
if ( styleClassAttr == null ) {
attrList.setAttribute( XHTML_NAMESPACE, "class", String.valueOf( styleClass ) );
} else {
attrList.setAttribute( XHTML_NAMESPACE, "class", styleClassAttr + ' ' + String.valueOf( styleClass ) );
}
}
final Object onClick = attributes.getAttribute( AttributeNames.Html.NAMESPACE, AttributeNames.Html.ONCLICK );
if ( onClick != null ) {
attrList.setAttribute( XHTML_NAMESPACE, "onclick", String.valueOf( onClick ) );
}
final Object onDblClick = attributes.getAttribute( AttributeNames.Html.NAMESPACE, AttributeNames.Html.ONDBLCLICK );
if ( onDblClick != null ) {
attrList.setAttribute( XHTML_NAMESPACE, "ondblclick", String.valueOf( onDblClick ) );
}
final Object onKeyDown = attributes.getAttribute( AttributeNames.Html.NAMESPACE, AttributeNames.Html.ONKEYDOWN );
if ( onKeyDown != null ) {
attrList.setAttribute( XHTML_NAMESPACE, "onkeydown", String.valueOf( onKeyDown ) );
}
final Object onKeyPressed =
attributes.getAttribute( AttributeNames.Html.NAMESPACE, AttributeNames.Html.ONKEYPRESSED );
if ( onKeyPressed != null ) {
attrList.setAttribute( XHTML_NAMESPACE, "onkeypressed", String.valueOf( onKeyPressed ) );
}
final Object onKeyUp = attributes.getAttribute( AttributeNames.Html.NAMESPACE, AttributeNames.Html.ONKEYUP );
if ( onKeyUp != null ) {
attrList.setAttribute( XHTML_NAMESPACE, "onkeyup", String.valueOf( onKeyUp ) );
}
final Object onMouseDown = attributes.getAttribute( AttributeNames.Html.NAMESPACE, AttributeNames.Html.ONMOUSEDOWN );
if ( onMouseDown != null ) {
attrList.setAttribute( XHTML_NAMESPACE, "onmousedown", String.valueOf( onMouseDown ) );
}
final Object onMouseMove = attributes.getAttribute( AttributeNames.Html.NAMESPACE, AttributeNames.Html.ONMOUSEMOVE );
if ( onMouseMove != null ) {
attrList.setAttribute( XHTML_NAMESPACE, "onmousemove", String.valueOf( onMouseMove ) );
}
final Object onMouseOver = attributes.getAttribute( AttributeNames.Html.NAMESPACE, AttributeNames.Html.ONMOUSEOVER );
if ( onMouseOver != null ) {
attrList.setAttribute( XHTML_NAMESPACE, "onmouseover", String.valueOf( onMouseOver ) );
}
final Object onMouseUp = attributes.getAttribute( AttributeNames.Html.NAMESPACE, AttributeNames.Html.ONMOUSEUP );
if ( onMouseUp != null ) {
attrList.setAttribute( XHTML_NAMESPACE, "onmouseup", String.valueOf( onMouseUp ) );
}
final Object onMouseOut = attributes.getAttribute( AttributeNames.Html.NAMESPACE, AttributeNames.Html.ONMOUSEOUT );
if ( onMouseOut != null ) {
attrList.setAttribute( XHTML_NAMESPACE, "onmouseout", String.valueOf( onMouseOut ) );
}
final Object onMouseEnter =
attributes.getAttribute( AttributeNames.Html.NAMESPACE, AttributeNames.Html.ONMOUSEENTER );
if ( onMouseEnter != null ) {
attrList.setAttribute( XHTML_NAMESPACE, "onmouseenter", String.valueOf( onMouseEnter ) );
}
final Object title = attributes.getAttribute( AttributeNames.Html.NAMESPACE, AttributeNames.Html.TITLE );
if ( title != null ) {
attrList.setAttribute( XHTML_NAMESPACE, "title", String.valueOf( title ) );
}
}
private boolean isUseTableLayoutFixed() {
return "true".equals( getConfiguration().getConfigProperty( HtmlTableModule.USE_TABLE_LAYOUT_FIXED, "true" ) );
}
private boolean isTableRowBorderDefinition() {
return "true".equals( getConfiguration().getConfigProperty( HtmlTableModule.TABLE_ROW_BORDER_DEFINITION, "false" ) );
}
}