package org.jboss.seam.ui.util; import javax.faces.component.EditableValueHolder; import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; public class Decoration { public static boolean hasMessage(UIComponent component, FacesContext context) { // If the component isn't to be rendered, then ignore if ( !component.isRendered() ) return false; if ( component instanceof EditableValueHolder ) { // If the component has failed validation, then it's invalid if ( ! ( (EditableValueHolder) component ).isValid() ) return true; // If the component has a faces message attached, return true. // TODO enhance this to only consider ERROR and WARN messages probably if ( context.getMessages( component.getClientId(context) ).hasNext() ) return true; //TODO: put this outside the if??? } for ( Object child: component.getChildren() ) { if (child instanceof UIComponent) { boolean message = hasMessage( (UIComponent) child, context ); if (message) return true; } } return false; } public static boolean hasRequired(UIComponent component, FacesContext context) { if ( !component.isRendered() ) return false; if ( component instanceof EditableValueHolder ) { if ( ( (EditableValueHolder) component ).isRequired() ) return true; } for (Object child: component.getChildren()) { if (child instanceof UIComponent) { boolean required = hasRequired( (UIComponent) child, context ); if (required) return true; } } return false; } /** * A depth-first search for an EditableValueHolder */ public static UIComponent getEditableValueHolder(UIComponent component) { for (Object child: component.getChildren()) { if (child instanceof EditableValueHolder) { UIComponent evh =(UIComponent) child; if ( evh.isRendered() ) { return evh; } } else if (child instanceof UIComponent) { UIComponent evh = getEditableValueHolder( (UIComponent) child ); if (evh!=null) return evh; } } return null; } public static UIComponent getDecoration(String name, UIComponent component) { UIComponent dec = component.getFacet(name); if (dec!=null) return dec; if ( component.getParent()==null ) return null; return getDecoration( name, component.getParent() ); } }