/* EventThreadInit.java

	Purpose:
		
	Description:
		
	History:
		Thu Jul 28 19:17:40     2005, Created by tomyeh

Copyright (C) 2005 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.event;

import org.zkoss.zk.ui.Component;

/**
 * Used to initialize the event processing thread.
 *
 * <p>How this interface is used.
 * <ol>
 * <li>First, you specify a class that implements this interface
 * in WEB-INF/zk.xml as a listener.
 * </li>
 * <li>Then, even time the engine (in the main thread) is about to process
 * an event, it creates a new instance of the specified class, invokes
 * {@link #prepare}, and then pass it to the thread processing thread.
 * <li>After the thread processing thread is resumed, it invokes {@link #init}
 * to do the initialization.</li>
 * </ol>
 *
 * <p>In other words, {@link #prepare} is called in the servlet thread, while
 * {@link #init} is called in the event processing thread.
 * Therefore, the typical use is retrieving thread-relevant info in
 * {@link #prepare}, and then 
 * apply them in the event processing thread when {@link #init} is called.
 *
 * @author tomyeh
 */
public interface EventThreadInit {
	/** Prepares the initialization at the servlet thread.
	 *
	 * <p>It is invoked in the servlet thread (and before {@link #init}).
	 * Thus, you can NOT manipulate the desktop in this method.
	 *
	 * <p>If this method throws an exception, it will abort the execution
	 * and shows an error message to the end user.
	 * Note: {@link EventThreadCleanup#cleanup} won't be called if an
	 * exception is thrown in this method, since it executes in
	 * the main thread.
	 *
	 * <p>In addition to throwing an exception, you can prevent an event
	 * from processing by returning false in {@link #init}.
	 * The event is ignored 'silently' then.
	 */
	public void prepare(Component comp, Event event) throws Exception;

	/** Initialize the event processing thread before processing the event.
	 *
	 * <p>The simplest form is
	 * <code>void init(Component c, Event e) {return true;}</code>
	 *
	 * <p>Unlike {@link #prepare}, it is invoked in the event processing
	 * thread (and after {@link #prepare}).
	 * Thus, you can manipulate the desktop in this method such as
	 * creating a component.
	 *
	 * <p>If you want to prevent an event from processing, you can return
	 * false in this method.
	 * For example, you might create a highlighted window and return false
	 * to prevent the user from accessing, if the system is too busy.
	 *
	 * <p>If the use of the event thread is disabled
	 * ({@link org.zkoss.zk.ui.util.Configuration#isEventThreadEnabled}
	 * returns false), this method is also invoked in the Servlet thread.
	 *
	 * <p>If this method throws an exception, it will abort the execution
	 * and shows an error message to the end user (unless it is cleaned
	 * up by {@link org.zkoss.zk.ui.event.EventThreadCleanup#cleanup}).
	 *
	 * @return if it is initialized successfully.
	 * If false is returned, the event is ignored, i.e., no event
	 * handler/listener will be invoked.
	 */
	public boolean init(Component comp, Event event) throws Exception;
}
