/*
* 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) 2001 - 2013 Object Refinery Ltd, Pentaho Corporation and Contributors.. All rights reserved.
*/
package org.pentaho.reporting.engine.classic.core;
import org.pentaho.reporting.engine.classic.core.filter.types.bands.CrosstabRowGroupType;
import org.pentaho.reporting.engine.classic.core.sorting.SortConstraint;
import java.util.Collections;
import java.util.List;
/**
* Can have either a row- or a column body.
*
* @author Thomas Morgner
*/
public class CrosstabRowGroup extends Group {
private CrosstabTitleHeader titleHeader;
private CrosstabHeader header;
private CrosstabSummaryHeader summaryHeader;
public CrosstabRowGroup() {
init();
}
private void init() {
setElementType( new CrosstabRowGroupType() );
titleHeader = new CrosstabTitleHeader();
header = new CrosstabHeader();
summaryHeader = new CrosstabSummaryHeader();
registerAsChild( titleHeader );
registerAsChild( header );
registerAsChild( summaryHeader );
}
public CrosstabRowGroup( final GroupBody body ) {
super( body );
validateBody( body );
init();
}
public CrosstabRowGroup( final CrosstabCellBody body ) {
super( body );
init();
}
public CrosstabRowGroup( final CrosstabColumnGroupBody body ) {
super( body );
init();
}
public CrosstabTitleHeader getTitleHeader() {
return titleHeader;
}
public void setTitleHeader( final CrosstabTitleHeader titleHeader ) {
if ( titleHeader == null ) {
throw new NullPointerException( "titleHeader must not be null" );
}
validateLooping( titleHeader );
if ( unregisterParent( titleHeader ) ) {
return;
}
final Element element = this.titleHeader;
this.titleHeader.setParent( null );
this.titleHeader = titleHeader;
this.titleHeader.setParent( this );
notifyNodeChildRemoved( element );
notifyNodeChildAdded( this.titleHeader );
}
public CrosstabHeader getHeader() {
return header;
}
public void setHeader( final CrosstabHeader titleFooter ) {
if ( titleFooter == null ) {
throw new NullPointerException( "titleFooter must not be null" );
}
validateLooping( titleFooter );
if ( unregisterParent( titleFooter ) ) {
return;
}
final Element element = this.header;
this.header.setParent( null );
this.header = titleFooter;
this.header.setParent( this );
notifyNodeChildRemoved( element );
notifyNodeChildAdded( this.header );
}
public CrosstabSummaryHeader getSummaryHeader() {
return summaryHeader;
}
public void setSummaryHeader( final CrosstabSummaryHeader summaryHeader ) {
if ( summaryHeader == null ) {
throw new NullPointerException( "summaryHeader must not be null" );
}
validateLooping( summaryHeader );
if ( unregisterParent( summaryHeader ) ) {
return;
}
final Element element = this.summaryHeader;
this.summaryHeader.setParent( null );
this.summaryHeader = summaryHeader;
this.summaryHeader.setParent( this );
notifyNodeChildRemoved( element );
notifyNodeChildAdded( this.summaryHeader );
}
public String getField() {
final Object o = getAttribute( AttributeNames.Core.NAMESPACE, AttributeNames.Core.FIELD );
if ( o == null ) {
return null;
}
return o.toString();
}
public void setField( final String field ) {
setAttribute( AttributeNames.Core.NAMESPACE, AttributeNames.Core.FIELD, field );
notifyNodePropertiesChanged();
}
protected GroupBody createDefaultBody() {
return new CrosstabColumnGroupBody();
}
public void setBody( final GroupBody body ) {
validateBody( body );
super.setBody( body );
}
private void validateBody( final GroupBody body ) {
if ( body instanceof CrosstabRowGroupBody == false && body instanceof CrosstabColumnGroupBody == false ) {
throw new IllegalArgumentException( body + " must be either row-group- or column-group-body" );
}
}
public boolean isGroupChange( final DataRow dataRow ) {
final String field = getField();
if ( field == null ) {
return false;
}
if ( dataRow.isChanged( field ) ) {
return true;
}
return false;
}
public CrosstabRowGroup clone() {
final CrosstabRowGroup element = (CrosstabRowGroup) super.clone();
element.summaryHeader = (CrosstabSummaryHeader) summaryHeader.clone();
element.titleHeader = (CrosstabTitleHeader) titleHeader.clone();
element.header = (CrosstabHeader) header.clone();
element.registerAsChild( element.titleHeader );
element.registerAsChild( element.header );
element.registerAsChild( element.summaryHeader );
return element;
}
public CrosstabRowGroup derive( final boolean preserveElementInstanceIds ) {
final CrosstabRowGroup element = (CrosstabRowGroup) super.derive( preserveElementInstanceIds );
element.summaryHeader = (CrosstabSummaryHeader) summaryHeader.derive( preserveElementInstanceIds );
element.titleHeader = (CrosstabTitleHeader) titleHeader.derive( preserveElementInstanceIds );
element.header = (CrosstabHeader) header.derive( preserveElementInstanceIds );
element.registerAsChild( element.titleHeader );
element.registerAsChild( element.header );
element.registerAsChild( element.summaryHeader );
return element;
}
public int getElementCount() {
return 4;
}
public Element getElement( final int index ) {
switch ( index ) {
case 0:
return getTitleHeader();
case 1:
return getHeader();
case 2:
return getSummaryHeader();
case 3:
return getBody();
default:
throw new IndexOutOfBoundsException();
}
}
public void setElementAt( final int index, final Element element ) {
switch ( index ) {
case 0:
setTitleHeader( (CrosstabTitleHeader) element );
break;
case 1:
setHeader( (CrosstabHeader) element );
break;
case 2:
setSummaryHeader( (CrosstabSummaryHeader) element );
break;
case 3:
setBody( (GroupBody) element );
break;
default:
throw new IndexOutOfBoundsException();
}
}
protected void removeElement( final Element element ) {
if ( element == null ) {
throw new NullPointerException();
}
if ( titleHeader == element ) {
this.titleHeader.setParent( null );
this.titleHeader = new CrosstabTitleHeader();
this.titleHeader.setParent( this );
notifyNodeChildRemoved( element );
notifyNodeChildAdded( this.titleHeader );
} else if ( summaryHeader == element ) {
this.summaryHeader.setParent( null );
this.summaryHeader = new CrosstabSummaryHeader();
this.summaryHeader.setParent( this );
notifyNodeChildRemoved( element );
notifyNodeChildAdded( this.summaryHeader );
} else if ( header == element ) {
this.header.setParent( null );
this.header = new CrosstabHeader();
this.header.setParent( this );
notifyNodeChildRemoved( element );
notifyNodeChildAdded( this.header );
} else {
super.removeElement( element );
}
}
public boolean isPrintSummary() {
final Object attribute = getAttribute( AttributeNames.Crosstab.NAMESPACE, AttributeNames.Crosstab.PRINT_SUMMARY );
if ( attribute == null ) {
return true;
}
return Boolean.TRUE.equals( attribute );
}
public void setPrintSummary( final boolean printSummary ) {
setAttribute( AttributeNames.Crosstab.NAMESPACE, AttributeNames.Crosstab.PRINT_SUMMARY, printSummary );
}
public List<SortConstraint> getSortingConstraint() {
return mapFields( Collections.singletonList( getField() ) );
}
}