package com.twasyl.slideshowfx.content.extension.quiz; import com.twasyl.slideshowfx.content.extension.AbstractContentExtension; import com.twasyl.slideshowfx.content.extension.ResourceType; import com.twasyl.slideshowfx.content.extension.quiz.controllers.QuizContentExtensionController; import com.twasyl.slideshowfx.markup.IMarkup; import com.twasyl.slideshowfx.server.beans.quiz.Quiz; import de.jensd.fx.glyphs.fontawesome.FontAwesomeIcon; import javafx.fxml.FXMLLoader; import javafx.scene.layout.Pane; import java.io.IOException; import java.util.Base64; import java.util.logging.Level; import java.util.logging.Logger; import static com.twasyl.slideshowfx.global.configuration.GlobalConfiguration.getDefaultCharset; /** * The {@link QuizContentExtension} extends the {@link AbstractContentExtension}. It allows to build a content containing * quiz to insert inside a SlideshowFX presentation. * This extension uses FontAwesome * This extension supports HTML markup language. * * @author Thierry Wasylczenko * @version 1.0 * @since SlideshowFX 1.0 */ public class QuizContentExtension extends AbstractContentExtension { private static final Logger LOGGER = Logger.getLogger(QuizContentExtension.class.getName()); private QuizContentExtensionController controller; public QuizContentExtension() { super("QUIZ", QuizContentExtension.class.getResource("/com/twasyl/slideshowfx/content/extension/quiz/resources/quiz.zip"), FontAwesomeIcon.QUESTION, "Insert a quiz", "Insert a quiz"); final String baseURL = "quiz/"; // Add URL this.putResource(ResourceType.CSS_FILE, baseURL.concat("font-awesome-4.6.3/css/font-awesome.min.css")); } @Override public Pane getUI() { FXMLLoader loader = new FXMLLoader(getClass().getClassLoader().getResource("/com/twasyl/slideshowfx/content/extension/quiz/fxml/QuizContentExtension.fxml")); Pane root = null; try { loader.setClassLoader(getClass().getClassLoader()); root = loader.load(); this.controller = loader.getController(); } catch (IOException e) { LOGGER.log(Level.SEVERE, "Can not load UI for QuizContentExtension", e); } return root; } @Override public String buildContentString(IMarkup markup) { return this.buildDefaultContentString(); } @Override public String buildDefaultContentString() { final Quiz quiz = controller.getQuiz(); final StringBuilder builder = new StringBuilder("<div id=\"quiz-").append(quiz.getId()).append("\" class=\"slideshowfx-quiz\" style=\"width: 100%\">\n"); builder.append("\t<span id=\"").append(System.currentTimeMillis()).append("\" style=\"display: block; width: 100%; background-color: #ECECEC; border-radius: 10px 10px 0 0\">\n") .append("\t\t<span id=\"quiz-action-button-").append(quiz.getId()).append("\" onclick=\"javascript:quiz(this, '") .append(Base64.getEncoder().encodeToString(quiz.toJSONString().getBytes(getDefaultCharset()))).append("');\">") .append("<i class=\"fa fa-play fa-fw\" title=\"Start the quiz\"></i></span>\n\t\t ") .append(quiz.getQuestion().getText()).append("\n\t</span>\n"); builder.append("\t<ul>"); quiz.getAnswers().forEach(answer -> { builder.append("\n\t\t<li>").append(answer.getText()).append("</li>"); }); builder.append("\n\t</ul>\n</div>"); return builder.toString(); } }