/******************************************************************************* * 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.dhtml.treenodekit; import java.io.IOException; import org.eclipse.rwt.internal.lifecycle.HtmlResponseWriter; import org.eclipse.rwt.internal.util.HTML; import com.w4t.*; import com.w4t.dhtml.TreeNode; import com.w4t.dhtml.TreeNodeShift; import com.w4t.dhtml.renderinfo.TreeNodeInfo; import com.w4t.internal.adaptable.IRenderInfoAdapter; import com.w4t.types.WebColor; import com.w4t.util.DefaultColorScheme; /** <p>the superclass of all Renderers that render org.eclipse.rap.dhtml.TreeNode.</p> */ public abstract class TreeNodeRenderer extends Renderer { public static final String TREE_NODE_TOGGLE_STATE_INFO = "treeNodeToggleStateInfo"; private static final String BG_COLOR_BUFFER = "bgColorBuffer"; private static final String COLOR_BUFFER = "colorBuffer"; private static final String VERTICAL_ALIGN_BUFFER = "verticalAlignBuffer"; private static final String LAST_CHILD_BUFFER = "lastChildBuffer"; public void readData( final WebComponent component ) { TreeNode treeNode = ( TreeNode )component; String uniqueID = component.getUniqueID(); if( W4TContext.getBrowser().isScriptEnabled() ) { String fieldName = TreeNodeRendererUtil.getStateInfoId( uniqueID ); String value = ReadDataUtil.findValue( fieldName ); boolean oldExpandedState = treeNode.isExpanded(); if( value != null ) { treeNode.setExpansion( value ); if( oldExpandedState != treeNode.isExpanded() ) { TreeNodeRendererUtil.overrideAjaxHashCode( treeNode ); } } } else { String collapsedName = NoscriptUtil.addCollapsedPrefix( uniqueID ); collapsedName = NoscriptUtil.addSuffix( collapsedName ); String expandedName = NoscriptUtil.addExpandedPrefix( uniqueID ); expandedName = NoscriptUtil.addSuffix( expandedName ); if( ReadDataUtil.findValue( collapsedName ) != null ) { treeNode.setExpanded( false ); } else if( ReadDataUtil.findValue( expandedName ) != null ) { treeNode.setExpanded( true ); } } } void setBgColorBuffer( final TreeNode treeNode, final WebColor bgColorBuffer ) { IRenderInfoAdapter adapter = getRenderInfoAdapter( treeNode ); adapter.addRenderState( BG_COLOR_BUFFER, bgColorBuffer ); } WebColor getBgColorBuffer( final TreeNode treeNode ) { IRenderInfoAdapter adapter = getRenderInfoAdapter( treeNode ); return ( WebColor )adapter.getRenderState( BG_COLOR_BUFFER ); } void setColorBuffer( final TreeNode treeNode, final WebColor colorBuffer ) { IRenderInfoAdapter adapter = getRenderInfoAdapter( treeNode ); adapter.addRenderState( COLOR_BUFFER, colorBuffer ); } WebColor getColorBuffer( final TreeNode treeNode ) { IRenderInfoAdapter adapter = getRenderInfoAdapter( treeNode ); return ( WebColor )adapter.getRenderState( COLOR_BUFFER ); } void setVerticalAlignBuffer( final TreeNode treeNode, final String verticalAlignBuffer ) { IRenderInfoAdapter adapter = getRenderInfoAdapter( treeNode ); adapter.addRenderState( VERTICAL_ALIGN_BUFFER, verticalAlignBuffer ); } String getVerticalAlignBuffer( final TreeNode treeNode ) { IRenderInfoAdapter adapter = getRenderInfoAdapter( treeNode ); return ( String )adapter.getRenderState( VERTICAL_ALIGN_BUFFER ); } void setLastChildBuffer( final TreeNode treeNode, final boolean lastChildBuffer ) { IRenderInfoAdapter adapter = getRenderInfoAdapter( treeNode ); Boolean value = Boolean.valueOf( lastChildBuffer ); adapter.addRenderState( LAST_CHILD_BUFFER, value ); } boolean isLastChildBuffer( final TreeNode treeNode ) { IRenderInfoAdapter adapter = getRenderInfoAdapter( treeNode ); Object renderState = adapter.getRenderState( LAST_CHILD_BUFFER ); boolean result = false; if( renderState != null ) { result = ( ( Boolean )renderState ).booleanValue(); } return result; } static IRenderInfoAdapter getRenderInfoAdapter( final TreeNode treeNode ) { Class clazz = IRenderInfoAdapter.class; return ( IRenderInfoAdapter )treeNode.getAdapter( clazz ); } static boolean hasChildren( final TreeNode treeNode ) { TreeNodeInfo info = TreeNodeRendererUtil.getInfo( treeNode ); return info.getNodeCount() > 0 || info.getLeafCount() > 0; } void addShiftImages( final TreeNode treeNode ) { if( hasChildren( treeNode ) ) { if( isLastChildBuffer( treeNode ) ) { addEmptyImage( treeNode ); } else { addLineImage( treeNode ); } } } static Style getStyle( final TreeNode treeNode ) { return treeNode.getStyle(); } void createUniversalAttributes( final TreeNode treeNode ) throws IOException { HtmlResponseWriter out = getResponseWriter(); String style = getStyle( treeNode ).toString(); if( !"".equals( style ) ) { out.writeAttribute( HTML.CLASS, out.registerCssClass( style ), null ); } out.writeAttribute( HTML.TITLE, getTitle( treeNode ), null ); } static String getLabel( final TreeNode treeNode ) { return RenderUtil.resolve( treeNode.getLabel() ); } static String getTitle( final TreeNode treeNode ) { return RenderUtil.resolve( treeNode.getTitle() ); } static String getCollapsedIcon( final TreeNode treeNode ) { return getShift( treeNode ).getCollapsedIcon( treeNode.getImageSetName() ); } String getExpandedWithChildrenIcon( final TreeNode treeNode ) { TreeNodeShift shift = getShift( treeNode ); return shift.getExpandedWithChildrenIcon( treeNode.getImageSetName() ); } String getExpandedWithoutChildrenIcon( final TreeNode treeNode ) { String name = treeNode.getImageSetName(); return getShift( treeNode ).getExpandedWithoutChildrenIcon( name ); } String getMinusLast( final TreeNode treeNode ) { return getShift( treeNode ).getMinusLast( treeNode.getImageSetName() ); } String getMinusInner( final TreeNode treeNode ) { return getShift( treeNode ).getMinusInner( treeNode.getImageSetName() ); } String getLast( final TreeNode treeNode ) { return getShift( treeNode ).getLast( treeNode.getImageSetName() ); } String getInner( final TreeNode treeNode ) { return getShift( treeNode ).getInner( treeNode.getImageSetName() ); } String getPlusLast( final TreeNode treeNode ) { return getShift( treeNode ).getPlusLast( treeNode.getImageSetName() ); } String getPlusInner( final TreeNode treeNode ) { return getShift( treeNode ).getPlusInner( treeNode.getImageSetName() ); } void addEmptyImage( final TreeNode treeNode ) { getShift( treeNode ).addEmptyImage( treeNode.getImageSetName() ); } void addLineImage( final TreeNode treeNode ) { getShift( treeNode ).addLineImage( treeNode.getImageSetName() ); } void fillBuffers( final TreeNode treeNode ) { setLastChildBuffer( treeNode, getShift( treeNode ).isLastChild() ); // check if the current item is marked setBgColorBuffer( treeNode, getStyle( treeNode ).getBgColor() ); setColorBuffer( treeNode, getStyle( treeNode ).getColor() ); setVerticalAlignBuffer( treeNode, getStyle( treeNode ).getVerticalAlign() ); getStyle( treeNode ).setVerticalAlign( getVerticalAlign() ); if( TreeNodeRendererUtil.getInfo( treeNode ).isMarked() ) { getStyle( treeNode ).setColor( treeNode.getMarkedColor() ); getStyle( treeNode ).setBgColor( treeNode.getMarkedBgColor() ); } if( !treeNode.isEnabled() ) { String color = DefaultColorScheme.get( DefaultColorScheme.ITEM_DISABLED_FONT ); getStyle( treeNode ).setColor( new WebColor( color ) ); } } abstract String getVerticalAlign(); void restoreFromBuffers( final TreeNode treeNode ) { boolean lastChildBuffer = isLastChildBuffer( treeNode ); TreeNodeRendererUtil.getInfo( treeNode ).getTreeNodeShift().setLastChild( lastChildBuffer ); getStyle( treeNode ).setColor( getColorBuffer( treeNode ) ); getStyle( treeNode ).setBgColor( getBgColorBuffer( treeNode ) ); getStyle( treeNode ).setVerticalAlign( getVerticalAlignBuffer( treeNode ) ); } void createCollapsedNode( final TreeNode treeNode ) throws IOException { if( hasChildren( treeNode ) ) { if( isLastChildBuffer( treeNode ) ) { createImageTag( treeNode, getPlusLast( treeNode ) ); } else { createImageTag( treeNode, getPlusInner( treeNode ) ); } } else { if( isLastChildBuffer( treeNode ) ) { createImageTag( treeNode, getLast( treeNode ) ); } else { createImageTag( treeNode, getInner( treeNode ) ); } } } void createExpandedNode( final TreeNode treeNode ) throws IOException { if( hasChildren( treeNode ) ) { if( isLastChildBuffer( treeNode ) ) { createImageTag( treeNode, getMinusLast( treeNode ) ); } else { createImageTag( treeNode, getMinusInner( treeNode ) ); } } else { // should not happen if( isLastChildBuffer( treeNode ) ) { createImageTag( treeNode, getLast( treeNode ) ); } else { createImageTag( treeNode, getInner( treeNode ) ); } } } abstract void createImageTag( TreeNode treeNode, String img ) throws IOException; static TreeNodeShift getShift( final TreeNode treeNode ) { return TreeNodeRendererUtil.getInfo( treeNode ).getTreeNodeShift(); } void createBranchOpen( final TreeNode treeNode ) throws IOException { String exp = treeNode.isExpanded() ? "block" : "none" ; StringBuffer buffer = new StringBuffer(); buffer.append( "display:" ); buffer.append( exp ); buffer.append( ";font-size: 0px;" ); HtmlResponseWriter out = getResponseWriter(); out.startElement( HTML.DIV, null ); createDivID( treeNode ); out.writeAttribute( HTML.STYLE, buffer, null ); out.closeElementIfStarted(); } void createBranchClose() throws IOException { HtmlResponseWriter out = getResponseWriter(); out.endElement( HTML.DIV ); } void createDivID( final TreeNode treeNode ) throws IOException { HtmlResponseWriter out = getResponseWriter(); StringBuffer buffer = new StringBuffer(); buffer.append( HTML.DIV ); buffer.append( treeNode.getUniqueID() ); out.writeAttribute( HTML.ID, buffer, null ); } }