/*!
* 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 org.pentaho.reporting.designer.core.editor.ReportDocumentContext;
import org.pentaho.reporting.engine.classic.core.AbstractReportDefinition;
import org.pentaho.reporting.engine.classic.core.AttributeNames;
import org.pentaho.reporting.engine.classic.core.ReportElement;
import org.pentaho.reporting.engine.classic.core.Section;
import org.pentaho.reporting.engine.classic.core.designtime.AttributeChange;
import org.pentaho.reporting.engine.classic.core.designtime.StyleChange;
import org.pentaho.reporting.engine.classic.core.event.ReportModelEvent;
import org.pentaho.reporting.engine.classic.core.event.ReportModelListener;
import org.pentaho.reporting.engine.classic.core.style.BandStyleKeys;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreePath;
public class LayoutReportTree extends AbstractReportTree {
private class ReportUpdateHandler implements ReportModelListener {
private ReportUpdateHandler() {
}
public void nodeChanged( final ReportModelEvent event ) {
final ReportStructureTreeModel model = getStructureModel();
if ( model == null ) {
return;
}
try {
if ( event.isNodeStructureChanged() || event.isNodeAddedEvent() || event.isNodeDeleteEvent() ) {
model.fireTreeDataChanged( event.getSource() );
} else if ( event.getType() == ReportModelEvent.NODE_PROPERTIES_CHANGED ) {
final Object eventParameter = event.getParameter();
if ( eventParameter instanceof AttributeChange ) {
final AttributeChange attributeChange = (AttributeChange) eventParameter;
if ( AttributeNames.Core.NAMESPACE.equals( attributeChange.getNamespace() ) ) {
if ( AttributeNames.Core.NAME.equals( attributeChange.getName() ) ||
AttributeNames.Core.FIELD.equals( attributeChange.getName() ) ||
AttributeNames.Core.VALUE.equals( attributeChange.getName() ) ||
AttributeNames.Core.RESOURCE_IDENTIFIER.equals( attributeChange.getName() ) ) {
invalidateLayoutCache();
}
}
return;
}
final Object element = event.getElement();
if ( element instanceof ReportElement ) {
if ( element instanceof Section && eventParameter instanceof StyleChange ) {
final StyleChange change = (StyleChange) eventParameter;
if ( BandStyleKeys.LAYOUT.equals( change.getStyleKey() ) ) {
invalidateLayoutCache();
model.fireTreeStructureChanged( element );
return;
}
}
model.fireTreeNodeChanged( event.getElement() );
} else {
model.fireTreeNodeChanged( event.getReport() );
}
}
} finally {
restoreState();
}
}
}
private ReportDocumentContext renderContext;
private ReportUpdateHandler updateHandler;
public LayoutReportTree() {
updateHandler = new ReportUpdateHandler();
setCellRenderer( new StructureTreeCellRenderer() );
setDragEnabled( false );
setEditable( false );
}
protected TreePath getPathForNode( final Object node ) {
if ( getStructureModel() == null ) {
return null;
}
return TreeSelectionHelper.getPathForNode( getStructureModel(), node );
}
public ReportDocumentContext getRenderContext() {
return renderContext;
}
public void setRenderContext( final ReportDocumentContext renderContext ) {
if ( this.renderContext != null ) {
this.renderContext.getSelectionModel().removeReportSelectionListener( getSelectionHandler() );
this.renderContext.getReportDefinition().removeReportModelListener( updateHandler );
}
this.renderContext = renderContext;
if ( this.renderContext != null ) {
this.renderContext.getSelectionModel().addReportSelectionListener( getSelectionHandler() );
this.renderContext.getReportDefinition().addReportModelListener( updateHandler );
}
updateFromRenderContext();
restoreState();
}
protected void updateFromRenderContext() {
try {
setUpdateFromExternalSource( true );
if ( this.renderContext == null ) {
setModel( EMPTY_MODEL );
return;
}
final AbstractReportDefinition report = this.renderContext.getReportDefinition();
setModel( new ReportStructureTreeModel( report ) );
} finally {
setUpdateFromExternalSource( false );
}
}
private ReportStructureTreeModel getStructureModel() {
final TreeModel model = getModel();
if ( model instanceof ReportStructureTreeModel ) {
return (ReportStructureTreeModel) model;
}
return null;
}
}