/*
* Copyright 2011-2012 Blazebit
*/
package com.blazebit.blazefaces.behavior.ajax;
import com.blazebit.blazefaces.apt.JsfBehaviorRenderer;
import com.blazebit.blazefaces.util.AjaxRequestBuilder;
import com.blazebit.blazefaces.util.RendererUtils;
import javax.faces.component.ActionSource;
import javax.faces.component.EditableValueHolder;
import javax.faces.component.UIComponent;
import javax.faces.component.UIParameter;
import javax.faces.component.behavior.ClientBehavior;
import javax.faces.component.behavior.ClientBehaviorContext;
import javax.faces.context.FacesContext;
import javax.faces.event.AjaxBehaviorEvent;
import javax.faces.event.PhaseId;
import javax.faces.render.ClientBehaviorRenderer;
import com.blazebit.blazefaces.util.ComponentUtils;
/**
*
* @author Christian Beikov
*/
@JsfBehaviorRenderer
public class AjaxBehaviorRenderer extends ClientBehaviorRenderer {
@Override
public void decode(FacesContext context, UIComponent component, ClientBehavior behavior) {
AjaxBehavior ajaxBehavior = (AjaxBehavior) behavior;
if (!ajaxBehavior.isDisabled()) {
AjaxBehaviorEvent event = new AjaxBehaviorEvent(component, behavior);
PhaseId phaseId = isImmediate(component, ajaxBehavior) ? PhaseId.APPLY_REQUEST_VALUES : PhaseId.INVOKE_APPLICATION;
event.setPhaseId(phaseId);
component.queueEvent(event);
}
}
@Override
public String getScript(ClientBehaviorContext behaviorContext, ClientBehavior behavior) {
AjaxBehavior ajaxBehavior = (AjaxBehavior) behavior;
if(ajaxBehavior.isDisabled()) {
return null;
}
FacesContext context = behaviorContext.getFacesContext();
UIComponent component = behaviorContext.getComponent();
String source = behaviorContext.getSourceId();
String process = ajaxBehavior.getProcess();
if(process == null) {
process = "@this";
}
AjaxRequestBuilder builder = new AjaxRequestBuilder();
String request = builder.source(context, component, source)
.event(behaviorContext.getEventName())
.process(context, component, process)
.update(context, component, ajaxBehavior.getUpdate())
.async(ajaxBehavior.isAsync())
.global(ajaxBehavior.isGlobal())
.partialSubmit(ajaxBehavior.isPartialSubmit(), ajaxBehavior.isPartialSubmitSet())
.onstart(ajaxBehavior.getOnstart())
.onerror(ajaxBehavior.getOnerror())
.onsuccess(ajaxBehavior.getOnsuccess())
.oncomplete(ajaxBehavior.getOncomplete())
.params(component)
.preventDefault()
.buildBehavior();
return request.toString();
// return RendererUtils.getEventHandlerScript(context, source, behaviorContext.getEventName(), request.toString());
}
private boolean isImmediate(UIComponent component, AjaxBehavior ajaxBehavior) {
boolean immediate = false;
if (ajaxBehavior.isImmediateSet()) {
immediate = ajaxBehavior.isImmediate();
} else if (component instanceof EditableValueHolder) {
immediate = ((EditableValueHolder) component).isImmediate();
} else if (component instanceof ActionSource) {
immediate = ((ActionSource) component).isImmediate();
}
return immediate;
}
}