/** * <a href="http://www.openolat.org"> * OpenOLAT - Online Learning and Training</a><br> * <p> * Licensed under the Apache License, Version 2.0 (the "License"); <br> * you may not use this file except in compliance with the License.<br> * You may obtain a copy of the License at the * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> * <p> * Unless required by applicable law or agreed to in writing,<br> * software distributed under the License is distributed on an "AS IS" BASIS, <br> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> * See the License for the specific language governing permissions and <br> * limitations under the License. * <p> * Initial code contributed and copyrighted by<br> * frentix GmbH, http://www.frentix.com * <p> */ package org.olat.ims.qti21.ui.editor; import java.io.File; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.form.flexible.FormItemContainer; import org.olat.core.gui.components.form.flexible.elements.RichTextElement; import org.olat.core.gui.components.form.flexible.elements.TextElement; import org.olat.core.gui.components.form.flexible.impl.FormBasicController; import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer; import org.olat.core.gui.components.form.flexible.impl.elements.FormSubmit; import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.WindowControl; import org.olat.core.util.StringHelper; import org.olat.core.util.filter.FilterFactory; import org.olat.core.util.vfs.VFSContainer; import org.olat.ims.qti21.model.xml.AssessmentTestBuilder; import org.olat.ims.qti21.model.xml.TestFeedbackBuilder; import org.olat.ims.qti21.ui.editor.events.AssessmentTestEvent; /** * * Initial date: 09.12.2015<br> * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com * */ public class AssessmentTestFeedbackEditorController extends FormBasicController { private FormSubmit saveButton; private TextElement feedbackPassedTitleEl, feedbackFailedTitleEl; private RichTextElement feedbackPassedTextEl, feedbackFailedTextEl; private final File testFile; private final File rootDirectory; private final VFSContainer rootContainer; private final boolean restrictedEdit; private final AssessmentTestBuilder testBuilder; public AssessmentTestFeedbackEditorController(UserRequest ureq, WindowControl wControl, AssessmentTestBuilder testBuilder, File rootDirectory, VFSContainer rootContainer, File testFile, boolean restrictedEdit) { super(ureq, wControl); this.testFile = testFile; this.rootDirectory = rootDirectory; this.rootContainer = rootContainer; this.testBuilder = testBuilder; this.restrictedEdit = restrictedEdit; initForm(ureq); } @Override protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { setFormContextHelp("Test editor QTI 2.1 in detail#details_testeditor_feedback"); String relativePath = rootDirectory.toPath().relativize(testFile.toPath().getParent()).toString(); VFSContainer itemContainer = (VFSContainer)rootContainer.resolve(relativePath); //correct feedback TestFeedbackBuilder passedFeedback = testBuilder.getPassedFeedback(); String passedTitle = passedFeedback == null ? "" : passedFeedback.getTitle(); feedbackPassedTitleEl = uifactory.addTextElement("correctTitle", "form.test.correct.title", -1, passedTitle, formLayout); feedbackPassedTitleEl.setUserObject(passedFeedback); feedbackPassedTitleEl.setEnabled(!restrictedEdit); String passedText = passedFeedback == null ? "" : passedFeedback.getText(); feedbackPassedTextEl = uifactory.addRichTextElementForQTI21("correctText", "form.test.correct.text", passedText, 8, -1, itemContainer, formLayout, ureq.getUserSession(), getWindowControl()); feedbackPassedTextEl.setEnabled(!restrictedEdit); feedbackPassedTextEl.getEditorConfiguration().setFileBrowserUploadRelPath("media"); //incorrect feedback TestFeedbackBuilder failedFeedback = testBuilder.getFailedFeedback(); String failedTitle = failedFeedback == null ? "" : failedFeedback.getTitle(); feedbackFailedTitleEl = uifactory.addTextElement("incorrectTitle", "form.test.incorrect.title", -1, failedTitle, formLayout); feedbackFailedTitleEl.setUserObject(failedFeedback); feedbackFailedTitleEl.setEnabled(!restrictedEdit); String fialedText = failedFeedback == null ? "" : failedFeedback.getText(); feedbackFailedTextEl = uifactory.addRichTextElementForQTI21("incorrectText", "form.test.incorrect.text", fialedText, 8, -1, itemContainer, formLayout, ureq.getUserSession(), getWindowControl()); feedbackFailedTextEl.setEnabled(!restrictedEdit); feedbackFailedTextEl.getEditorConfiguration().setFileBrowserUploadRelPath("media"); // Submit Button FormLayoutContainer buttonsContainer = FormLayoutContainer.createButtonLayout("buttons", getTranslator()); buttonsContainer.setRootForm(mainForm); formLayout.add(buttonsContainer); saveButton = uifactory.addFormSubmitButton("submit", buttonsContainer); sync();//check the cut value } public void sync() { boolean hasCutValue = testBuilder.getCutValue() != null; saveButton.setVisible(hasCutValue); feedbackPassedTitleEl.setVisible(hasCutValue); feedbackPassedTextEl.setVisible(hasCutValue); feedbackFailedTitleEl.setVisible(hasCutValue); feedbackFailedTextEl.setVisible(hasCutValue); if(hasCutValue) { setFormWarning(null); } else { setFormWarning("warning.feedback.cutvalue"); } } @Override protected void formOK(UserRequest ureq) { String passedTitle = feedbackPassedTitleEl.getValue(); String passedText = feedbackPassedTextEl.getRawValue(); if(StringHelper.containsNonWhitespace(FilterFactory.getHtmlTagsFilter().filter(passedText))) { TestFeedbackBuilder passedBuilder = testBuilder.getPassedFeedback(); if(passedBuilder == null) { passedBuilder = testBuilder.createPassedFeedback(); } passedBuilder.setTitle(passedTitle); passedBuilder.setText(passedText); } String failedTitle = feedbackFailedTitleEl.getValue(); String failedText = feedbackFailedTextEl.getRawValue(); if(StringHelper.containsNonWhitespace(FilterFactory.getHtmlTagsFilter().filter(failedText))) { TestFeedbackBuilder failedBuilder = testBuilder.getFailedFeedback(); if(failedBuilder == null) { failedBuilder = testBuilder.createFailedFeedback(); } failedBuilder.setTitle(failedTitle); failedBuilder.setText(failedText); } fireEvent(ureq, AssessmentTestEvent.ASSESSMENT_TEST_CHANGED_EVENT); } @Override protected void doDispose() { // } }