/*******************************************************************************
* Copyright (c) 2002-2006 Innoopract Informationssysteme GmbH.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Innoopract Informationssysteme GmbH - initial API and implementation
******************************************************************************/
package com.w4t.webflowlayoutkit;
import java.io.IOException;
import org.eclipse.rwt.Adaptable;
import org.eclipse.rwt.internal.lifecycle.HtmlResponseWriter;
import org.eclipse.rwt.internal.util.HTML;
import com.w4t.*;
import com.w4t.developer.AreaSelector;
import com.w4t.developer.PanelCreator;
import com.w4t.internal.adaptable.IRenderInfoAdapter;
import com.w4t.renderinfo.FlowLayoutRenderInfo;
import com.w4t.weblayoutkit.LayoutRenderer;
/** <p>the superclass for all renderers that render org.eclipse.rap.WebFlowLayout.</p>
*
* @author Leif Frenzel
*/
public abstract class WebFlowLayoutRenderer extends LayoutRenderer {
private static final String BORDER_SIZE = "borderSize";
private static final String AREA_SELECOR = "arealSelector";
private static final String USE_CELL_ALIGNMENTS = "useCellAlignments";
void setUseSurroundCellAlignments( final WebContainer parent,
final boolean useSurroundCellAlignments )
{
IRenderInfoAdapter adapter = getRenderInfoAdapter( parent );
adapter.addRenderState( USE_CELL_ALIGNMENTS,
Boolean.valueOf( useSurroundCellAlignments ) );
}
boolean isUseSurroundCellAlignments( final WebContainer parent ) {
IRenderInfoAdapter adapter = getRenderInfoAdapter( parent );
Object renderState = adapter.getRenderState( USE_CELL_ALIGNMENTS );
boolean result = false;
if( renderState != null ) {
result = ( ( Boolean )renderState ).booleanValue();
}
return result;
}
void setAreaSelector( final WebContainer parent,
final AreaSelector areaSelector )
{
IRenderInfoAdapter adapter = getRenderInfoAdapter( parent );
adapter.addRenderState( AREA_SELECOR, areaSelector );
}
AreaSelector getAreaSelector( final WebContainer parent ) {
IRenderInfoAdapter adapter = getRenderInfoAdapter( parent );
return ( AreaSelector )adapter.getRenderState( AREA_SELECOR );
}
void setBorderSize( final WebContainer parent, final String borderSize ) {
IRenderInfoAdapter adapter = getRenderInfoAdapter( parent );
adapter.addRenderState( BORDER_SIZE, borderSize );
}
String getBorderSize( final WebContainer parent ) {
IRenderInfoAdapter adapter = getRenderInfoAdapter( parent );
return ( String )adapter.getRenderState( BORDER_SIZE );
}
IRenderInfoAdapter getRenderInfoAdapter( final WebContainer parent ) {
Adaptable adaptable = getLayout( parent );
Class clazz = IRenderInfoAdapter.class;
return ( IRenderInfoAdapter )adaptable.getAdapter( clazz );
}
public void render( final WebComponent component ) throws IOException {
WebContainer parent = ( WebContainer )component;
getRenderInfoAdapter( parent ).clearRenderState();
if( isDesignTime( parent ) || needTable( parent ) ) {
checkBorderSizeInDesignTime( parent );
try {
prepare( parent );
buildTable( parent );
} finally {
postPare( parent );
}
} else {
renderWithoutTable( parent );
}
}
void renderWithoutTable( final WebContainer parent )
throws IOException
{
for( int i = 0; i < parent.getWebComponentCount(); i++ ) {
LifeCycleHelper.render( parent.get( i ) );
}
}
private boolean needTable( final WebContainer parent ) {
WebTableCell cell = getCell( parent );
WebFlowLayout layout = getLayout( parent );
return RenderUtil.hasUniversalAttributes( cell )
|| cell.isNowrap()
|| !cell.getAlign().equals( "" )
|| !cell.getBackground().equals( "" )
|| !cell.getBgColor().toString().equals( "" )
|| !cell.getHeight().toString().equals( "" )
|| !cell.getPadding().equals( "" )
|| !cell.getSpacing().equals( "" )
|| !cell.getVAlign().equals( "" )
|| !cell.getWidth().equals( "" )
|| !layout.getAlign().equals( "" )
|| !layout.getBgColor().toString().equals( "" )
|| ( !layout.getBorder().equals( "0" )
&& !isDesignTime( parent ) )
|| !layout.getCellpadding().equals( "0" )
|| !layout.getCellspacing().equals( "0" )
|| !layout.getHeight().equals( "" )
|| !layout.getWidth().equals( "100%" )
|| RenderUtil.hasUniversalAttributes( parent );
}
private void prepare( final WebContainer parent ) {
if( parent.isDesignTime() ) {
AreaSelector areaSelector = new AreaSelector();
setAreaSelector( parent, areaSelector );
}
addComponentsToCell( parent );
if( parent.isDesignTime() ) {
addDesignSpecifics( parent );
}
}
private void buildTable( final WebContainer parent ) throws IOException {
HtmlResponseWriter out = getResponseWriter();
out.startElement( HTML.TABLE, null );
RenderUtil.writeUniversalAttributes( parent );
RenderUtil.writeTableAttributes( getLayout( parent ) );
out.writeAttribute( HTML.ID, parent.getUniqueID(), null );
getLayout( parent ).getTableRow().render();
out.endElement( HTML.TABLE );
}
private void postPare( final WebContainer parent ) {
if( parent.isDesignTime() ) {
removeDesignSpecifics( parent );
}
removeAllComponentsFromCell( parent );
restoreBorderSize( parent );
}
private void checkBorderSizeInDesignTime( final WebContainer parent ) {
bufferBorderSize( parent );
boolean useBorderSize_1 = false;
if( isDesignTime( parent ) ) {
useBorderSize_1 = true;
try {
if( Integer.parseInt( getLayout( parent ).getBorder() ) > 1 ) {
useBorderSize_1 = false;
}
} catch( Exception e ) {
}
}
if( useBorderSize_1 ) {
getLayout( parent ).setBorder( "1" );
}
}
WebFlowLayout getLayout( final WebContainer parent ) {
return ( WebFlowLayout )parent.getWebLayout();
}
FlowLayoutRenderInfo getInfo( final WebContainer parent ) {
Adaptable adaptable = getLayout( parent );
IRenderInfoAdapter adapter
= ( IRenderInfoAdapter )adaptable.getAdapter( IRenderInfoAdapter.class );
return ( FlowLayoutRenderInfo )adapter.getInfo();
}
// helping methods
//////////////////
private WebTableCell getCell( final WebContainer parent ) {
return ( WebTableCell )getLayout( parent ).getArea();
}
private void addComponentsToCell( final WebContainer parent ) {
for( int i = 0; i < parent.getWebComponentCount(); i++ ) {
getCell( parent ).addContentElement( parent.get( i ) );
}
}
private void removeAllComponentsFromCell( final WebContainer parent ) {
for( int i = 0; i < parent.getWebComponentCount(); i++ ) {
getCell( parent ).removeContentElement( parent.get( i ) );
}
}
private boolean isDesignTime( final WebContainer parent ) {
return parent.isDesignTime();
}
private boolean isDesignSpecific( final WebContainer parent ) {
return isDesignTime( parent )
&& !( parent instanceof PanelCreator );
}
private void addDesignSpecifics( final WebContainer parent ) {
if( isDesignSpecific( parent ) ) {
if( !needTable( parent ) && parent.getParent() != null ) {
WebContainer container = parent.getParent();
Object constraint = container.getConstraint( parent );
Area area = container.getWebLayout().getArea( constraint );
if( area != null ) {
getCell( parent ).setAlign( area.getAlign() );
getCell( parent ).setVAlign( area.getVAlign() );
setUseSurroundCellAlignments( parent, true );
}
}
AreaSelector areaSelector = getAreaSelector( parent );
getCell( parent ).addContentElement( areaSelector );
areaSelector.setContainer( parent );
areaSelector.setRegion( getCell( parent ) );
parent.add( areaSelector );
}
}
private void removeDesignSpecifics( final WebContainer parent ) {
if( isDesignSpecific( parent ) ) {
AreaSelector areaSelector = getAreaSelector( parent );
getCell( parent ).removeContentElement( areaSelector );
parent.remove( areaSelector );
if( isUseSurroundCellAlignments( parent ) ) {
getCell( parent ).setAlign( "" );
getCell( parent ).setVAlign( "" );
setUseSurroundCellAlignments( parent, false );
}
}
}
private void bufferBorderSize( final WebContainer parent ) {
setBorderSize( parent, getLayout( parent ).getBorder() );
}
private void restoreBorderSize( final WebContainer parent ) {
getLayout( parent ).setBorder( getBorderSize( parent ) );
}
}