/*
* Ext GWT - Ext for GWT
* Copyright(c) 2007-2009, Ext JS, LLC.
* licensing@extjs.com
*
* http://extjs.com/license
*/
package com.extjs.gxt.ui.client.mvc;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import com.extjs.gxt.ui.client.event.EventType;
/**
* <code>Controllers</code> process and respond to application events.
*/
public abstract class Controller {
protected Controller parent;
protected List<Controller> children;
protected boolean initialized;
private Set<EventType> supportedEvents;
/**
* Add a child controller.
*
* @param controller the controller to added
*/
public void addChild(Controller controller) {
if (children == null) children = new ArrayList<Controller>();
children.add(controller);
controller.parent = this;
}
/**
* Determines if the controller can handle the particular event. Default
* implementation checks against registered event types then queries all child
* controllers.
*
* @param event the event
* @return <code>true</code> if event can be handled, <code>false</code>
* otherwise
*/
public boolean canHandle(AppEvent event) {
if (supportedEvents != null && supportedEvents.contains(event.getType()))
return true;
if (children != null) {
for (Controller c : children) {
if (c.canHandle(event)) return true;
}
}
return false;
}
/**
* Forwards an event to any child controllers who can handle the event.
*
* @param event the event to forward
*/
public void forwardToChild(AppEvent event) {
if (children != null) {
for (Controller c : children) {
if (!c.initialized) {
c.initialize();
c.initialized = true;
}
if (c.canHandle(event)) {
c.handleEvent(event);
}
}
}
}
/**
* Forward an event to a view. Ensures the view is initialized before
* forwarding the event.
*
* @param view the view to forward the event
* @param event the event to be forwarded
*/
public void forwardToView(View view, AppEvent event) {
if (!view.initialized) {
view.initialize();
view.initialized = true;
}
view.handleEvent(event);
}
/**
* Forward an event to a view. Ensures the view is initialized before
* forwarding the event.
*
* @param view the view to forward the event
* @param type the event type
* @param data the event data
*/
public void forwardToView(View view, EventType type, Object data) {
AppEvent e = new AppEvent(type, data);
forwardToView(view, e);
}
/**
* Processes the event.
*
* @param event the current event
*/
public abstract void handleEvent(AppEvent event);
/**
* Called once prior to handleEvent being called.
*/
protected void initialize() {
}
/**
* Registers the event type.
*
* @param types the event types
*/
protected void registerEventTypes(EventType... types) {
if (supportedEvents == null) {
supportedEvents = new HashSet<EventType>();
}
if (types != null) {
for (EventType type : types) {
supportedEvents.add(type);
}
}
}
}