package org.richfaces.component.focus; import java.text.MessageFormat; import javax.enterprise.context.RequestScoped; import javax.faces.application.FacesMessage; import javax.faces.context.FacesContext; import javax.faces.event.ComponentSystemEvent; import javax.faces.render.Renderer; import javax.inject.Named; import org.richfaces.application.ServiceTracker; import org.richfaces.component.AbstractFocus; import org.richfaces.focus.FocusManager; import org.richfaces.renderkit.FocusRendererBase; @Named @RequestScoped public class ComponentBean { public static final String NOT_RUN = "did not run"; public static final String PASSED = "passed"; private AbstractFocus component; private String createGlobalMessageAndCheckFocusResult = NOT_RUN; private String invalidateBothInputsAndCheckFocusResult = NOT_RUN; // used in ITFocusValidationAware#testGlobalMessageIsIgnored public void createGlobalMessageAndCheckFocus() { FacesContext context = FacesContext.getCurrentInstance(); AbstractFocus comp = getComponent(); FocusRendererBase renderer = getRenderer(); // form should be focused final String expectedFocusCandidates = "form"; String actualFocusCandidates = renderer.getFocusCandidatesAsString(context, comp); if (!expectedFocusCandidates.equals(actualFocusCandidates)) { createGlobalMessageAndCheckFocusResult = MessageFormat.format("Only form should be focused. Expected focus candidates <{0}>, but have: <{1}>.", expectedFocusCandidates, actualFocusCandidates); return; } // create global message context.addMessage(null, new FacesMessage("global message")); // form should be still focused actualFocusCandidates = renderer.getFocusCandidatesAsString(context, comp); if (!expectedFocusCandidates.equals(actualFocusCandidates)) { createGlobalMessageAndCheckFocusResult = MessageFormat.format("Only form should be focused. Expected focus candidates <{0}>, but have: <{1}>.", expectedFocusCandidates, actualFocusCandidates); return; } createGlobalMessageAndCheckFocusResult = PASSED; } @SuppressWarnings("unchecked") public <T extends AbstractFocus> T getComponent() { return (T) component; } public String getCreateGlobalMessageAndCheckFocusResult() { return createGlobalMessageAndCheckFocusResult; } public String getFocusCandidates() { FacesContext context = FacesContext.getCurrentInstance(); FocusRendererBase renderer = getRenderer(); return renderer.getFocusCandidatesAsString(context, component); } public String getInvalidateBothInputsAndCheckFocusResult() { return invalidateBothInputsAndCheckFocusResult; } @SuppressWarnings("unchecked") public <T extends Renderer> T getRenderer() { FacesContext context = FacesContext.getCurrentInstance(); String componentFamily = component.getFamily(); String rendererType = component.getRendererType(); return (T) context.getRenderKit().getRenderer(componentFamily, rendererType); } // used in ITFocusValidationAware#testValidateMultipleInputsDuringFormSubmission and ITFocusValidationAware#testValidateMultipleInputsDuringAjax public void invalidateBothInputsAndCheckFocus() { FacesContext facesContext = FacesContext.getCurrentInstance(); AbstractFocus comp = getComponent(); FocusRendererBase renderer = getRenderer(); // assert intial focus on form String expectedFocusCandidates = "form"; String actualFocusCandidates = renderer.getFocusCandidatesAsString(facesContext, comp); if (!expectedFocusCandidates.equals(actualFocusCandidates)) { invalidateBothInputsAndCheckFocusResult = MessageFormat.format("Only form should be focused. Expected focus candidates <{0}>, but have: <{1}>.", expectedFocusCandidates, actualFocusCandidates); return; } // invalidate first two inputs for (String invalidate : new String[] { "form:input1", "form:input2" }) { facesContext.addMessage(invalidate, new FacesMessage("invalidated " + invalidate)); } if (!facesContext.getClientIdsWithMessages().hasNext()) { invalidateBothInputsAndCheckFocusResult = "Messages should be generated."; return; } // assert focus on first input expectedFocusCandidates = "form:input1 form:input2"; actualFocusCandidates = renderer.getFocusCandidatesAsString(facesContext, comp); if (!expectedFocusCandidates.equals(actualFocusCandidates)) { invalidateBothInputsAndCheckFocusResult = MessageFormat.format("First input should be focused. Expected focus candidates <{0}>, but have: <{1}>.", expectedFocusCandidates, actualFocusCandidates); return; } invalidateBothInputsAndCheckFocusResult = PASSED; } public void setComponent(AbstractFocus component) { this.component = component; } public void setFocusToSecondInput(ComponentSystemEvent event) { FacesContext context = FacesContext.getCurrentInstance(); FocusManager focusManager = ServiceTracker.getService(context, FocusManager.class); focusManager.focus("input2"); } }