/**
* <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.course.nodes.cl.ui;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import org.olat.core.CoreSpringFactory;
import org.olat.core.commons.modules.bc.FolderConfig;
import org.olat.core.gui.UserRequest;
import org.olat.core.gui.components.form.flexible.FormItem;
import org.olat.core.gui.components.form.flexible.FormItemContainer;
import org.olat.core.gui.components.form.flexible.elements.FileElement;
import org.olat.core.gui.components.form.flexible.elements.FormLink;
import org.olat.core.gui.components.form.flexible.elements.MultipleSelectionElement;
import org.olat.core.gui.components.form.flexible.elements.RichTextElement;
import org.olat.core.gui.components.form.flexible.elements.SingleSelection;
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.FormEvent;
import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer;
import org.olat.core.gui.components.link.Link;
import org.olat.core.gui.control.Controller;
import org.olat.core.gui.control.Event;
import org.olat.core.gui.control.WindowControl;
import org.olat.core.id.OLATResourceable;
import org.olat.core.logging.activity.CourseLoggingAction;
import org.olat.core.logging.activity.ILoggingAction;
import org.olat.core.logging.activity.StringResourceableType;
import org.olat.core.logging.activity.ThreadLocalUserActivityLogger;
import org.olat.core.util.StringHelper;
import org.olat.core.util.vfs.LocalFolderImpl;
import org.olat.core.util.vfs.VFSContainer;
import org.olat.core.util.vfs.VFSItem;
import org.olat.core.util.vfs.VFSLeaf;
import org.olat.core.util.vfs.VFSManager;
import org.olat.core.util.vfs.VFSMediaResource;
import org.olat.course.CourseFactory;
import org.olat.course.ICourse;
import org.olat.course.nodes.CheckListCourseNode;
import org.olat.course.nodes.cl.CheckboxManager;
import org.olat.course.nodes.cl.model.Checkbox;
import org.olat.course.run.environment.CourseEnvironment;
import org.olat.util.logging.activity.LoggingResourceable;
/**
*
* Initial date: 06.02.2014<br>
* @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
*
*/
public class CheckboxEditController extends FormBasicController {
private FormLink deleteLink, deleteFileLink, downloadFileLink;
private TextElement titleEl, pointsEl;
private SingleSelection releaseEl, labelEl;
private MultipleSelectionElement awardPointEl;
private RichTextElement descriptionEl;
private FileElement fileEl;
private FormLayoutContainer deleteFileCont;
private Boolean deleteFile;
private final Checkbox checkbox;
private final boolean withScore;
private final boolean newCheckbox;
private final OLATResourceable courseOres;
private final CheckListCourseNode courseNode;
private final CheckboxManager checkboxManager;
public CheckboxEditController(UserRequest ureq, WindowControl wControl,
OLATResourceable courseOres,
Checkbox checkbox, boolean newCheckbox, boolean withScore) {
this(ureq, wControl, courseOres, null, checkbox, newCheckbox, withScore);
}
public CheckboxEditController(UserRequest ureq, WindowControl wControl,
OLATResourceable courseOres, CheckListCourseNode courseNode,
Checkbox checkbox, boolean newCheckbox, boolean withScore) {
super(ureq, wControl);
this.checkbox = checkbox;
this.withScore = withScore;
this.courseOres = courseOres;
this.courseNode = courseNode;
this.newCheckbox = newCheckbox;
checkboxManager = CoreSpringFactory.getImpl(CheckboxManager.class);
initForm(ureq);
}
@Override
protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
String title = checkbox.getTitle();
titleEl = uifactory.addTextElement("checkbox.title", "checkbox.title", 255, title, formLayout);
String[] releaseKeys = new String[] {
CheckboxReleaseEnum.userAndCoach.name(), CheckboxReleaseEnum.coachOnly.name()
};
String[] releaseValues = new String[] {
translate("release.userAndCoach"), translate("release.coachOnly")
};
releaseEl = uifactory.addDropdownSingleselect("release", formLayout, releaseKeys, releaseValues, null);
if(checkbox.getRelease() != null) {
releaseEl.select(checkbox.getRelease().name(), true);
}
String[] labelKeys = new String[CheckboxLabelEnum.values().length];
String[] labelValues = new String[CheckboxLabelEnum.values().length];
for(int i=CheckboxLabelEnum.values().length; i-->0; ){
labelKeys[i] = CheckboxLabelEnum.values()[i].name();
labelValues[i] = translate(CheckboxLabelEnum.values()[i].i18nKey());
}
labelEl = uifactory.addDropdownSingleselect("label", formLayout, labelKeys, labelValues, null);
if(checkbox.getLabel() != null) {
labelEl.select(checkbox.getLabel().name(), true);
}
String[] onKeys = new String[] { "on" };
String[] onValues = new String[] { translate("award.point.on") };
awardPointEl = uifactory.addCheckboxesHorizontal("points", formLayout, onKeys, onValues);
awardPointEl.setVisible(withScore);
awardPointEl.addActionListener(FormEvent.ONCHANGE);
if(checkbox.getPoints() != null) {
awardPointEl.select(onKeys[0], true);
}
String points = checkbox.getPoints() == null ? null : Float.toString(checkbox.getPoints().floatValue());
pointsEl = uifactory.addTextElement("numofpoints", null, 10, points, formLayout);
pointsEl.setVisible(withScore && awardPointEl.isAtLeastSelected(1));
pointsEl.setDisplaySize(5);
String desc = checkbox.getDescription();
descriptionEl = uifactory.addRichTextElementForStringDataMinimalistic("description", "description", desc, 5, -1, formLayout,
getWindowControl());
fileEl = uifactory.addFileElement(getWindowControl(), "file", formLayout);
fileEl.addActionListener(FormEvent.ONCHANGE);
String template = velocity_root + "/delete_file.html";
deleteFileCont = FormLayoutContainer.createCustomFormLayout("delete", getTranslator(), template);
formLayout.add(deleteFileCont);
downloadFileLink = uifactory.addFormLink("download", checkbox.getFilename(), null, deleteFileCont, Link.NONTRANSLATED);
deleteFileLink = uifactory.addFormLink("deleteFile", "delete", null, deleteFileCont, Link.BUTTON);
deleteFileCont.setVisible(StringHelper.containsNonWhitespace(checkbox.getFilename()));
FormLayoutContainer buttonsCont = FormLayoutContainer.createButtonLayout("buttons", getTranslator());
formLayout.add(buttonsCont);
uifactory.addFormSubmitButton("save", buttonsCont);
deleteLink = uifactory.addFormLink("delete", buttonsCont, Link.BUTTON);
uifactory.addFormCancelButton("cancel", buttonsCont, ureq, getWindowControl());
}
@Override
protected void doDispose() {
//
}
public boolean isNewCheckbox() {
return newCheckbox;
}
public Checkbox getCheckbox() {
return checkbox;
}
@Override
protected boolean validateFormLogic(UserRequest ureq) {
boolean allOk = true;
pointsEl.clearError();
if(awardPointEl.isAtLeastSelected(1)) {
try {
Float.parseFloat(pointsEl.getValue());
} catch (NumberFormatException e) {
pointsEl.setErrorKey("form.error.wrongFloat", null);
allOk &= false;
}
}
return allOk & super.validateFormLogic(ureq);
}
@Override
protected void formOK(UserRequest ureq) {
checkbox.setTitle(titleEl.getValue());
String releaseKey = releaseEl.getSelectedKey();
checkbox.setRelease(CheckboxReleaseEnum.valueOf(releaseKey));
String labelKey = labelEl.getSelectedKey();
checkbox.setLabel(CheckboxLabelEnum.valueOf(labelKey));
if(awardPointEl.isAtLeastSelected(1)) {
Float points = null;
try {
points = new Float(Float.parseFloat(pointsEl.getValue()));
} catch (NumberFormatException e) {
//check in validation
}
checkbox.setPoints(points);
} else {
checkbox.setPoints(null);
}
checkbox.setDescription(descriptionEl.getValue());
if(Boolean.TRUE.equals(deleteFile)) {
checkbox.setFilename(null);
VFSContainer container = getFileContainer();
for (VFSItem chd:container.getItems()) {
chd.delete();
}
}
File uploadedFile = fileEl.getUploadFile();
if(uploadedFile != null) {
String filename = fileEl.getUploadFileName();
checkbox.setFilename(filename);
try {
VFSContainer container = getFileContainer();
VFSLeaf leaf = container.createChildLeaf(filename);
InputStream inStream = new FileInputStream(uploadedFile);
VFSManager.copyContent(inStream, leaf);
} catch (FileNotFoundException e) {
logError("", e);
}
}
if(courseNode != null) {
ILoggingAction action = newCheckbox ? CourseLoggingAction.CHECKLIST_CHECKBOX_CREATED : CourseLoggingAction.CHECKLIST_CHECKBOX_UPDATED;
ThreadLocalUserActivityLogger.log(action, getClass(), LoggingResourceable.wrap(courseNode),
LoggingResourceable.wrapNonOlatResource(StringResourceableType.checkbox, checkbox.getCheckboxId(), checkbox.getTitle()));
}
fireEvent(ureq, Event.CHANGED_EVENT);
}
@Override
protected void formCancelled(UserRequest ureq) {
fireEvent(ureq, Event.CANCELLED_EVENT);
}
@Override
protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) {
if(deleteLink == source) {
fireEvent(ureq, new Event("delete"));
if(courseNode != null) {
ThreadLocalUserActivityLogger.log(CourseLoggingAction.CHECKLIST_CHECKBOX_DELETED, getClass(), LoggingResourceable.wrap(courseNode),
LoggingResourceable.wrapNonOlatResource(StringResourceableType.checkbox, checkbox.getCheckboxId(), checkbox.getTitle()));
}
} else if(downloadFileLink == source) {
doDownloadFile(ureq);
} else if(deleteFileLink == source) {
deleteFile();
} else if(awardPointEl == source) {
pointsEl.setVisible(withScore && awardPointEl.isAtLeastSelected(1));
} else if(fileEl == source) {
String filename = fileEl.getUploadFileName();
downloadFileLink.setI18nKey(filename);
downloadFileLink.setEnabled(false);
}
super.formInnerEvent(ureq, source, event);
}
private void deleteFile() {
deleteFile = Boolean.TRUE;
deleteFileCont.setVisible(false);
String filename = fileEl.getUploadFileName();
if(filename != null && filename.equals(downloadFileLink.getI18nKey())) {
fileEl.reset();
}
}
private void doDownloadFile(UserRequest ureq) {
VFSContainer container = getFileContainer();
VFSItem item = container.resolve(checkbox.getFilename());
if(item instanceof VFSLeaf) {
VFSMediaResource rsrc = new VFSMediaResource((VFSLeaf)item);
rsrc.setDownloadable(true);
ureq.getDispatchResult().setResultingMediaResource(rsrc);
}
}
private VFSContainer getFileContainer() {
VFSContainer container;
if(courseNode == null) {
File tmp = new File(FolderConfig.getCanonicalTmpDir(), checkbox.getCheckboxId());
container = new LocalFolderImpl(tmp);
} else {
ICourse course = CourseFactory.loadCourse(courseOres);
CourseEnvironment courseEnv = course.getCourseEnvironment();
container = checkboxManager.getFileContainer(courseEnv, courseNode);
}
return container;
}
}