Sounds like a reasonable suggestion - I would love to be able to
replace/extend small chunks of code, not having to rewrite/copy the
renderer-code fully, so this suggestion might go into this direction.

regards,

Martin

On 4/11/08, Andrew Robinson <[EMAIL PROTECTED]> wrote:
> Okay, I have yet another approach that I thought of while walking my
> dogs that is much more JSF-ish and goes along with Christi's email on
> sub-renderers.
>
> Instead creating a whole bloody wrapper API framework that would make
> the API hard to change, what about breaking the renderers down even
> more into subclasses.
>
> Take the tr:panelPopup for example again. It has:
> Outer container
> Trigger
> Popup
>   Title bar
>   Close button
>   Body
>
> So lets say this is how the renderer could be built:
> First, create a bunch of renderer types:
> org.apache.myfaces.trinidad.Popup
> org.apache.myfaces.trinidad.Popup.Trigger
> org.apache.myfaces.trinidad.Popup.PopupShell
> org.apache.myfaces.trinidad.Popup.TitleBar
> org.apache.myfaces.trinidad.Popup.ButtonArea
> org.apache.myfaces.trinidad.Popup.Body
>
> Then register a default renderer for each of these types.
>
> Then the PanelPopupRenderer would in encodeAll:
>
> render outer DIV (ppr stuff)
> call a render utils method to get the renderer for the trigger and encode it
> call a render utils method to get the renderer for the popup shell and
> encode it
>
> in the popup shell renderer:
> encode the outer HTML
> call a render utils method to get the renderer for the title bar and encode
> it
> call a render utils method to get the renderer for the popup body and encode
> it
>
> in the title bar renderer:
> encode the outer HTML
> encode the title
> call a render utils method to get the renderer for the button area and
> encode it
>
> in the body renderer:
> encode the outer HTML
> encode the children components
>
> This way there are many renderers to one component. The renderers
> would be registered in the faces-config.xml just like any ordinary
> renderers. Since the FacesBean allows renderers to encode any
> component that has certain property keys, this is ideal.
>
> Take for example the close button on the popup, we could have a faces
> bean alias wrapper. What I mean by this is something like this:
>
> public class PopupTitleBarRenderer extends XhtmlRenderer {
>   protected void encodeAll(FacesContext context, RenderingContext rc,
>     UIComponent component, FacesBean bean) throws IOException {
>     FacesBean wrapped = new AliasedFacesBean(bean);
>     wrapped.map("text", "title");
> ...
>
> This way a command button renderer could be used to render the close
> button using the title from the dialog as the text of the button.
>
> Using this way, the only exposed API are the sub-renderer types that
> can be defined in the faces config. New types can be added and old
> ones removed without breaking Java interfaces or abstract class APIs
> (although it would have to be controlled to not break custom code too
> badly).
>
> -Andrew
>


-- 

http://www.irian.at

Your JSF powerhouse -
JSF Consulting, Development and
Courses in English and German

Professional Support for Apache MyFaces

Reply via email to