package org.webcat.ui; import com.webobjects.appserver.WOActionResults; import com.webobjects.appserver.WOAssociation; import com.webobjects.appserver.WOComponent; import com.webobjects.appserver.WOContext; import com.webobjects.appserver.WODynamicElement; import com.webobjects.appserver.WOElement; import com.webobjects.appserver.WORequest; import com.webobjects.appserver.WOResponse; import com.webobjects.appserver._private.WOComponentReference; import com.webobjects.appserver._private.WODynamicGroup; import com.webobjects.foundation.NSDictionary; import com.webobjects.foundation._NSUtilities; //------------------------------------------------------------------------- /** * <p> * An experimental component that gives more control over how nested component * content is processed. * </p> * <h3>Page.wo</h3> * <pre> * [wo:TestContainer] * [wo:TestElement1]Element 1-1[/wo:TestElement1] * [wo:TestElement1]Element 1-2[/wo:TestElement1] * [wo:TestElement2]Element 2-1[/wo:TestElement2] * [wo:TestElement2]Element 2-2[/wo:TestElement2] * [/wo:TestContainer]</pre> * * <h3>TestContainer.wo</h3> * <pre> * [div] * [div style="background-color: red"] * [wo:WCChildElements componentName="TestElement2"/] * [/div] * [div style="background-color: green"] * [wo:WCChildElements componentName="TestElement1"/] * [/div] * [div style="background-color: blue"] * [wo:WCChildElements componentName="TestElement2"/] * [/div] * [/div]</pre> * would effectively produce: * <pre> * [div] * [div style="background-color: red"] * [wo:TestElement1]Element 1-1[/wo:TestElement1] * [wo:TestElement1]Element 1-2[/wo:TestElement1] * [/div] * [div style="background-color: green"] * [wo:TestElement2]Element 2-1[/wo:TestElement2] * [wo:TestElement2]Element 2-2[/wo:TestElement2] * [/div] * [div style="background-color: blue"] * [wo:TestElement1]Element 1-1[/wo:TestElement1] * [wo:TestElement1]Element 1-2[/wo:TestElement1] * [/div] * [/div]</pre> * with TestElement1 and TestElement2 being processed as normal. * * @author Tony Allevato * @author Last changed by $Author: aallowat $ * @version $Revision: 1.1 $, $Date: 2010/10/28 00:37:30 $ */ public class WCComponentContentSelector extends WODynamicElement { //~ Constructors .......................................................... // ---------------------------------------------------------- public WCComponentContentSelector(String aName, NSDictionary<String, WOAssociation> associations, WOElement template) { super(null, null, null); _componentName = associations.objectForKey("componentName"); } //~ Methods ............................................................... // ---------------------------------------------------------- protected String componentNameInContext(WOContext context) { return (String) _componentName.valueInComponent(context.component()); } // ---------------------------------------------------------- protected boolean shouldElementBeProcessed(WOElement element, WOContext context) { if (element instanceof WOComponentReference) { WOComponentReference ref = (WOComponentReference) element; String compName = componentNameInContext(context); Class<?> compClass = _NSUtilities.classWithName(compName); Class<?> refClass = _NSUtilities.classWithName(ref._name); if (compClass.equals(refClass)) { return true; } } return false; } // ---------------------------------------------------------- public void appendToResponse(WOResponse response, WOContext context) { WOComponent component = context.component(); WOElement contentElement = component._childTemplate(); if (contentElement != null && contentElement instanceof WODynamicGroup) { WODynamicGroup group = (WODynamicGroup) contentElement; for (WOElement child : group.childrenElements()) { if (shouldElementBeProcessed(child, context)) { context._setCurrentComponent(component.parent()); child.appendToResponse(response, context); context._setCurrentComponent(component); } } } } // ---------------------------------------------------------- public void takeValuesFromRequest(WORequest request, WOContext context) { WOComponent component = context.component(); WOElement contentElement = component._childTemplate(); if (contentElement != null && contentElement instanceof WODynamicGroup) { WODynamicGroup group = (WODynamicGroup) contentElement; for (WOElement child : group.childrenElements()) { if (shouldElementBeProcessed(child, context)) { context._setCurrentComponent(component.parent()); child.takeValuesFromRequest(request, context); context._setCurrentComponent(component); } } } } // ---------------------------------------------------------- public WOActionResults invokeAction(WORequest request, WOContext context) { WOActionResults result = null; WOComponent component = context.component(); WOElement contentElement = component._childTemplate(); if (contentElement != null && contentElement instanceof WODynamicGroup) { WODynamicGroup group = (WODynamicGroup) contentElement; for (WOElement child : group.childrenElements()) { if (shouldElementBeProcessed(child, context)) { context._setCurrentComponent(component.parent()); result = child.invokeAction(request, context); context._setCurrentComponent(component); } } } return result; } //~ Static/instance variables ............................................. protected WOAssociation _componentName; }