/**
* Copyright 2014-2017 Riccardo Massera (TheCoder4.Eu) and Stephan Rauh (http://www.beyondjava.net).
*
* This file is part of BootsFaces.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.bootsfaces.component.shake;
import java.io.IOException;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
import javax.faces.render.FacesRenderer;
import net.bootsfaces.component.ajax.AJAXRenderer;
import net.bootsfaces.component.tabView.TabView;
import net.bootsfaces.render.CoreRenderer;
/** This class generates the HTML code of <b:shake />. */
@FacesRenderer(componentFamily = "net.bootsfaces.component", rendererType = "net.bootsfaces.component.shake.Shake")
public class ShakeRenderer extends CoreRenderer {
/**
* Decode to be used to implement an AJAX version of TabView. This methods
* receives and processes input made by the user. More specifically, it
* ckecks whether the user has interacted with the current b:tabView. The
* default implementation simply stores the input value in the list of
* submitted values. If the validation checks are passed, the values in the
* <code>submittedValues</code> list are store in the backend bean.
*
* @param context
* the FacesContext.
* @param component
* the current b:tabView.
*/
@Override
public void decode(FacesContext context, UIComponent component) {
TabView tabView = (TabView) component;
decodeBehaviors(context, tabView);
String clientId = tabView.getClientId(context);
String activeIndexId = clientId.replace(":", "_") + "_activeIndex";
String activeIndexValue = (String) context.getExternalContext().getRequestParameterMap().get(activeIndexId);
new AJAXRenderer().decode(context, component);
if (null != activeIndexValue && activeIndexValue.length() > 0) {
try {
if (Integer.valueOf(activeIndexValue) != tabView.getActiveIndex()) {
tabView.setActiveIndex(Integer.valueOf(activeIndexValue));
}
} catch (NumberFormatException e) {
}
}
}
/**
* This methods generates the HTML code of the current b:shake.
* @param context the FacesContext.
* @param component the current b:shake.
* @throws IOException thrown if something goes wrong when writing the HTML code.
*/
@Override
public void encodeBegin(FacesContext context, UIComponent component) throws IOException {
if (!component.isRendered()) {
return;
}
Shake shake = (Shake) component;
ResponseWriter rw = context.getResponseWriter();
String clientId = shake.getClientId();
rw.startElement("script", shake);
rw.writeAttribute("id", clientId, null);
rw.write("\nvar myShakeEvent = new Shake({\n");
rw.write(" threshold: " + shake.getThreshold() + ",\n");
rw.write(" timeout: " + shake.getInterval() + "\n");
rw.write("});\n");
if (!shake.isDisabled()) {
// Start listening to device motion:
rw.write("myShakeEvent.start();\n");
}
// Register a shake event listener on window with your callback:
rw.write("window.addEventListener('shake', function(){\n");
String code = new AJAXRenderer().generateBootsFacesAJAXAndJavaScriptForAnMobileEvent(context, shake, rw, clientId, "shake");
rw.write(code + "\n");
rw.write("}, false);\n");
rw.endElement("script");
}
}