org.richfaces.service.FocusManagerImpl Maven / Gradle / Ivy
package org.richfaces.service;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import org.ajax4jsf.javascript.JSLiteral;
import org.richfaces.application.ServiceTracker;
import org.richfaces.focus.FocusManager;
import org.richfaces.javascript.JavaScriptService;
import org.richfaces.log.Logger;
import org.richfaces.log.RichfacesLogger;
import org.richfaces.renderkit.util.RendererUtils;
public class FocusManagerImpl implements FocusManager {
private static final String SCRIPT = "$(document.getElementById('%s')).focus();";
private static final Logger LOG = RichfacesLogger.APPLICATION.getLogger();
@Override
public void focus(String componentId) {
FacesContext context = FacesContext.getCurrentInstance();
if (context == null) {
throw new IllegalStateException(FocusManager.class.getSimpleName()
+ " can't be used without FacesContext available");
}
if (componentId == null) {
setContextAttribute(context, null);
} else {
UIComponent currentComponent = UIComponent.getCurrentComponent(context);
if (currentComponent == null) {
currentComponent = context.getViewRoot();
}
currentComponent.findComponent(componentId);
UIComponent component = RendererUtils.getInstance().findComponentFor(currentComponent, componentId);
if (component == null) {
String message = FocusManager.class.getSimpleName() + ": Component with ID '" + componentId + "' was not found";
LOG.warn(message);
context.addMessage(null, new FacesMessage(message));
} else {
String clientId = component.getClientId(context);
setContextAttribute(context, clientId);
JavaScriptService javaScriptService = ServiceTracker.getService(context, JavaScriptService.class);
javaScriptService.addPageReadyScript(context, new JSLiteral(String.format(SCRIPT, clientId)));
}
}
}
private void setContextAttribute(FacesContext context, String clientId) {
context.getAttributes().put(FocusManager.FOCUS_CONTEXT_ATTRIBUTE, clientId);
}
}