/* Composer.java Purpose: Description: History: Thu Oct 25 18:24:27 2007, Created by tomyeh Copyright (C) 2007 Potix Corporation. All Rights Reserved. {{IS_RIGHT This program is distributed under LGPL Version 2.1 in the hope that it will be useful, but WITHOUT ANY WARRANTY. }}IS_RIGHT */ package org.zkoss.zk.ui.util; import org.zkoss.zk.ui.Component; /** * Represents a composer to initialize a component (or a component of tree) * when ZK loader is composing a component. * It is the controller in the MVC pattern, while the component is the view. * * <p>To initialize a component, you can implement this interface * and then specify the class or an instance of it with the apply attribute * as follows. * *<pre><code><window apply="my.MyComposer"/> *<window apply="${a_composer}"/></code></pre> * * <p>Then, ZK loader will * <ol> * <li>Invoke {@link ComposerExt#doBeforeCompose}, if the composer * also implements {@link ComposerExt}.</li> * <li>Create the component (by use of * {@link org.zkoss.zk.ui.sys.UiFactory#newComponent}, which creates * and initializes the component accordingly). * <li>Invokes {@link ComposerExt#doBeforeComposeChildren}, if * {@link ComposerExt} is also implemented.</li> * <li>Composes all children, if any, of this component defined in * the ZUML page.</li> * <li>Invokes {@link #doAfterCompose} after all children are, if any, * composed.</li> * <li>Posts the onCreate event if necessary.</li> * </ol> * * <p>To intercept the lifecycle of the creation of a page, * implement {@link Initiator} and specify the class with the init directive. * * <p>Note: {@link org.zkoss.zk.ui.ext.AfterCompose} has to be implemented * as part of a component, while {@link Composer} is a controller used * to initialize a component (that might or might not implement * {@link org.zkoss.zk.ui.ext.AfterCompose}). * * <P>Alternatives: in most cases, you don't implement {@link Composer} directly. * Rather, you can extend from one of the following skeletons. * <dl> * <dt>{@link org.zkoss.zk.ui.select.SelectorComposer}</dt> * <dd>It supports the autowiring based on Java annotation and a CSS3-based selector. * If you don't know which one to use, use {@link org.zkoss.zk.ui.select.SelectorComposer}.</dd> * <dt>{@link GenericForwardComposer}</dt> * <dd>It supports the autowiring based on naming convention. * You don't need to specify annotations explicitly, but it is error-prone if * it is used properly.</dd> * </dl> * * @author tomyeh * @since 3.0.0 * @see org.zkoss.zk.ui.ext.AfterCompose * @see ComposerExt * @see FullComposer * @see Initiator */ public interface Composer<T extends Component> { /** Invokes after ZK loader creates this component, * initializes it and composes all its children, if any. * @param comp the component has been composed */ public void doAfterCompose(T comp) throws Exception; }